Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop
This commit is contained in:
commit
b963b53140
|
|
@ -27,3 +27,13 @@ export default {
|
|||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.el-step__head.is-process>.is-text{
|
||||
color: #ffffff;
|
||||
background: #409EFF;
|
||||
border-color: #409EFF;
|
||||
}
|
||||
.el-step__title.is-process{
|
||||
color: #409EFF;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -30,6 +30,14 @@ export function getUserList(query) {
|
|||
})
|
||||
}
|
||||
|
||||
export function getOrganizationList(query) {
|
||||
return request({
|
||||
url: '/system/organization/',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
export function getUser(id) {
|
||||
return request({
|
||||
url: `/system/user/${id}/`,
|
||||
|
|
|
|||
|
|
@ -35,6 +35,14 @@ export function getWfStateList(id) {
|
|||
method: 'get'
|
||||
})
|
||||
}
|
||||
//工单流转step
|
||||
export function getWfFlowSteps(id) {
|
||||
return request({
|
||||
url: `/wf/ticket/${id}/flowsteps/`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
//流转状态创建
|
||||
export function createWfState(data) {
|
||||
return request({
|
||||
|
|
@ -43,6 +51,15 @@ export function createWfState(data) {
|
|||
data
|
||||
})
|
||||
}
|
||||
//处理工单
|
||||
export function ticketHandle(id,data) {
|
||||
return request({
|
||||
url: `/wf/ticket/${id}/handle/`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
//流转状态更新
|
||||
export function updateWfState(id, data) {
|
||||
return request({
|
||||
|
|
@ -121,7 +138,7 @@ export function deleteWfTransition(id, data) {
|
|||
data
|
||||
})
|
||||
}
|
||||
//工单详情
|
||||
//工单列表
|
||||
export function getTickets(query) {
|
||||
return request({
|
||||
url: `/wf/ticket/`,
|
||||
|
|
@ -129,3 +146,17 @@ export function getTickets(query) {
|
|||
params:query
|
||||
})
|
||||
}
|
||||
//工单详情
|
||||
export function getTicketDetail(id) {
|
||||
return request({
|
||||
url: `/wf/ticket/${id}/`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
//工单详情
|
||||
export function getTicketTransitions(id) {
|
||||
return request({
|
||||
url: `/wf/ticket/${id}/transitions/`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -276,7 +276,7 @@ export const asyncRoutes = [
|
|||
component: Layout,
|
||||
redirect: '/workflow/index',
|
||||
name: 'workflow',
|
||||
meta: { title: '工作流管理', icon: 'example', perms: ['workflow_set'] },
|
||||
meta: { title: '工作流', icon: 'example', perms: ['workflow_set'] },
|
||||
children: [
|
||||
{
|
||||
path: 'index',
|
||||
|
|
@ -284,25 +284,17 @@ export const asyncRoutes = [
|
|||
component: () => import('@/views/workflow/index'),
|
||||
meta: { title: '工作流配置', icon: 'example', perms: ['workflow_manage'] }
|
||||
},
|
||||
|
||||
{
|
||||
path: 'configuration',
|
||||
name: 'configuration',
|
||||
component: () => import('@/views/workflow/configuration'),
|
||||
meta: { title: '人员信息详情', icon: 'example', perms: ['configuration_manage'] },
|
||||
hidden: true
|
||||
},
|
||||
{
|
||||
path: 'ticket',
|
||||
name: 'ticket',
|
||||
component: () => import('@/views/workflow/ticket'),
|
||||
meta: { title: '工单列表', icon: 'example', perms: ['ticket_manage'] },
|
||||
hidden: true
|
||||
},{
|
||||
path: 'test',
|
||||
name: 'test',
|
||||
component: () => import('@/views/workflow/test'),
|
||||
meta: { title: '工单', icon: 'example', perms: ['test_manage'] },
|
||||
meta: { title: '工单管理', icon: 'example', perms: ['workflow_manage'] },
|
||||
},
|
||||
{
|
||||
path: 'configuration',
|
||||
name: 'configuration',
|
||||
component: () => import('@/views/workflow/configuration'),
|
||||
meta: { title: '人员信息详情', icon: 'example', perms: ['workflow_manage'] },
|
||||
hidden: true
|
||||
},
|
||||
]
|
||||
|
|
|
|||
|
|
@ -148,9 +148,10 @@ export default {
|
|||
hasJsonFlag:true, // json是否验证通过
|
||||
hasJsonFlag1:true, // json是否验证通过
|
||||
hasJsonFlag2:true, // json是否验证通过
|
||||
customfieldList: {
|
||||
count:0
|
||||
},
|
||||
// customfieldList: {
|
||||
// count:0
|
||||
// },
|
||||
customfieldList:[],
|
||||
options: [{
|
||||
value: 'string',
|
||||
label: '文本'
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@
|
|||
<el-form
|
||||
ref="Form"
|
||||
:model="wfstate"
|
||||
label-width="80px"
|
||||
label-width="100px"
|
||||
label-position="right"
|
||||
:rules="rule1"
|
||||
>
|
||||
|
|
@ -113,8 +113,7 @@
|
|||
<el-switch v-model="wfstate.enable_retreat"></el-switch>
|
||||
</el-form-item>
|
||||
<el-form-item label="参与者类型" prop="participant_type">
|
||||
|
||||
<el-select style="width: 100%" v-model="wfstate.participant_type" placeholder="请选择">
|
||||
<el-select style="width: 100%" v-model="wfstate.participant_type" placeholder="请选择" @change="typeChange">
|
||||
<el-option
|
||||
v-for="item in typeoptions"
|
||||
:key="item.value"
|
||||
|
|
@ -123,6 +122,24 @@
|
|||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="参与者" prop="participant" v-if="wfstate.participant_type==1">
|
||||
<el-select style="width: 100%" v-model="participant" placeholder="请选择参与者">
|
||||
<el-option v-for="item in staffs" :key="item.id" :label="item.name" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="参与者" prop="participant" v-if="wfstate.participant_type==2">
|
||||
<el-select style="width: 100%" v-model="participants" multiple placeholder="请选择参与者">
|
||||
<el-option v-for="item in staffs" :key="item.id" :label="item.name" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="部门" prop="participant" v-if="wfstate.participant_type==3">
|
||||
<el-select style="width: 100%" v-model="participant" placeholder="请选择部门">
|
||||
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div style="text-align: right">
|
||||
<el-button type="danger" @click="dialogVisible = false">取消</el-button>
|
||||
|
|
@ -133,6 +150,7 @@
|
|||
</template>
|
||||
<script>
|
||||
import { getWfStateList, createWfState,updateWfState,deleteWfState } from "@/api/workflow";
|
||||
import { getOrganizationList,getUserList } from "@/api/user";
|
||||
import checkPermission from "@/utils/permission";
|
||||
const defaultwfstate = {
|
||||
name: "",
|
||||
|
|
@ -143,12 +161,25 @@ export default {
|
|||
props: ["ID"],
|
||||
data() {
|
||||
return {
|
||||
wfstate: defaultwfstate,
|
||||
wfstate: {
|
||||
name:'',
|
||||
is_hidden:'',
|
||||
sort:'',
|
||||
type:'',
|
||||
enable_retreat:'',
|
||||
participant_type:'',
|
||||
participant:'',
|
||||
},
|
||||
participant:'',
|
||||
participants:[],
|
||||
is_hidden:false,
|
||||
enable_retreat:false,
|
||||
wfstateList: {
|
||||
staffs:[],
|
||||
departments:[],
|
||||
/*wfstateList: {
|
||||
count:0
|
||||
},
|
||||
},*/
|
||||
wfstateList:[],
|
||||
options_:{
|
||||
"0":'无处理',
|
||||
"1":'个人',
|
||||
|
|
@ -157,8 +188,8 @@ export default {
|
|||
"4":'角色',
|
||||
"5":'变量',
|
||||
"6":'普通类型',
|
||||
"5":'工单字段',
|
||||
"6":'父工单字段',
|
||||
"7":'工单字段',
|
||||
"8":'父工单字段',
|
||||
},
|
||||
options: [{
|
||||
value: 0,
|
||||
|
|
@ -216,6 +247,8 @@ export default {
|
|||
created() {
|
||||
|
||||
this.getList();
|
||||
this.getUser();
|
||||
this.getDepartment();
|
||||
},
|
||||
methods: {
|
||||
checkPermission,
|
||||
|
|
@ -230,9 +263,26 @@ export default {
|
|||
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
|
||||
getUser(){
|
||||
getUserList({}).then(res=>{
|
||||
if(res.data){
|
||||
this.staffs = res.data.results;
|
||||
}
|
||||
})
|
||||
},
|
||||
getDepartment(){
|
||||
getOrganizationList().then(res=>{
|
||||
if(res.data){
|
||||
this.departments = res.data;
|
||||
}
|
||||
})
|
||||
},
|
||||
//参与者类型变化
|
||||
typeChange(){
|
||||
this.participant = '';
|
||||
this.participants = [];
|
||||
},
|
||||
//打开新建
|
||||
handleCreate() {
|
||||
this.wfstate = Object.assign({}, defaultwfstate);
|
||||
this.dialogType = "new";
|
||||
|
|
@ -241,28 +291,31 @@ export default {
|
|||
this.$refs["Form"].clearValidate();
|
||||
});
|
||||
},
|
||||
|
||||
//打开编辑
|
||||
handleEdit(scope) {
|
||||
this.wfstate = Object.assign({}, scope.row); // copy obj
|
||||
this.participants = this.wfstate.participant;
|
||||
this.participant = this.wfstate.participant;
|
||||
this.dialogType = "edit";
|
||||
this.dialogVisible = true;
|
||||
this.$nextTick(() => {
|
||||
this.$refs["Form"].clearValidate();
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
|
||||
//编辑新建
|
||||
async confirm(form) {
|
||||
this.$refs[form].validate((valid) => {
|
||||
if (valid) {
|
||||
const isEdit = this.dialogType === "edit";
|
||||
// this.wfstate.participant = 1;
|
||||
this.wfstate.participant = this.participant!==''?this.participant:this.participants;
|
||||
if (isEdit) {
|
||||
updateWfState(this.wfstate.id, this.wfstate).then((res) => {
|
||||
if (res.code >= 200) {
|
||||
this.getList();
|
||||
this.dialogVisible = false;
|
||||
this.$message.success("成功");
|
||||
this.getList();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
|
@ -271,6 +324,7 @@ export default {
|
|||
if (res.code >= 200) {
|
||||
this.getList();
|
||||
this.dialogVisible = false;
|
||||
this.getList();
|
||||
this.$message.success("成功");
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,99 +1,307 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
<el-card style="margin-top: 10px">
|
||||
<el-table v-loading="listLoading" :data="tickets" border fit stripe highlight-current-row max-height="600">
|
||||
<el-table-column type="index" width="50" />
|
||||
<el-table-column label="工单标题">
|
||||
<template slot-scope="scope">{{ scope.row.title }}</template>
|
||||
<el-card style="margin-bottom: 10px">
|
||||
<div>
|
||||
<el-select v-model="pageForm.workflow" placeholder="工作流" clearable style="width: 200px" class="filter-item" @change="handleFilter">
|
||||
<el-option
|
||||
v-for="item in workflows"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
<el-button
|
||||
class="filter-item"
|
||||
type="primary"
|
||||
icon="el-icon-refresh-left"
|
||||
@click="resetFilter"
|
||||
>重置</el-button>
|
||||
<el-button
|
||||
class="filter-item"
|
||||
type="primary"
|
||||
icon="el-icon-search"
|
||||
@click="handleFilter"
|
||||
>搜索</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
|
||||
<el-tab-pane label="待处理" name="first">
|
||||
<el-table :data="tickets" border fit stripe style="width: 100%" >
|
||||
<el-table-column label="工单标题" min-width="100" prop="title">
|
||||
</el-table-column>
|
||||
<el-table-column label="当前状态">
|
||||
<template slot-scope="scope">{{ scope.row.act_state }}</template>
|
||||
<el-table-column label="当前状态" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.act_state===1">已提交</span>
|
||||
<span v-else-if="scope.row.act_state===4">已完成</span>
|
||||
<span v-else>审批中</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="180" label="创建时间">
|
||||
<template slot-scope="scope">{{ scope.row.create_time }}</template>
|
||||
<el-table-column label="类型" min-width="100">
|
||||
<template slot-scope="scope">{{ scope.row.workflow_.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作" width="220px">
|
||||
<el-table-column label="创建时间" min-width="100" prop="create_time">
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作">
|
||||
<template slot-scope="scope">
|
||||
<el-link v-if="stateSteps==scope.row.act_state" type="danger" @click="handlePicture(scope)">查看流程图</el-link>
|
||||
<el-link v-else type="danger" @click="handleDetail(scope)">处理</el-link>
|
||||
<!--<el-link type="danger" @click="handleDetail(scope)">处理</el-link>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
:page.sync="pageForm.page"
|
||||
:limit.sync="pageForm.page_size"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="已处理" name="second">
|
||||
<el-table :data="tickets" border fit stripe style="width: 100%" >
|
||||
<el-table-column label="工单标题" min-width="100" prop="title">
|
||||
</el-table-column>
|
||||
<el-table-column label="当前状态" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.act_state===1">已提交</span>
|
||||
<span v-else-if="scope.row.act_state===4">已完成</span>
|
||||
<span v-else>审批中</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型" min-width="100">
|
||||
<template slot-scope="scope">{{ scope.row.workflow_.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" min-width="100" prop="create_time">
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作">
|
||||
<template slot-scope="scope">
|
||||
<el-link v-if="stateSteps==scope.row.act_state" type="danger" @click="handlePicture(scope)">查看流程图</el-link>
|
||||
<el-link v-else type="danger" @click="handleDetail(scope)">处理</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
:total="total"
|
||||
:page.sync="pageForm.page"
|
||||
:limit.sync="pageForm.page_size"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="已发起" name="third">
|
||||
<!--<el-button type="primary" icon="el-icon-plus" @click="handleusedstepCreate"-->
|
||||
<!-->新增</el-button>-->
|
||||
<el-table :data="tickets" border fit stripe style="width: 100%" >
|
||||
<el-table-column label="工单标题" min-width="100" prop="title">
|
||||
</el-table-column>
|
||||
<el-table-column label="当前状态" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.act_state===1">已提交</span>
|
||||
<span v-else-if="scope.row.act_state===4">已完成</span>
|
||||
<span v-else>审批中</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型" min-width="100">
|
||||
<template slot-scope="scope">{{ scope.row.workflow_.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" min-width="100" prop="create_time">
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作">
|
||||
<template slot-scope="scope">
|
||||
<el-link type="danger" @click="handleDetail(scope)">处理</el-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
:total="total"
|
||||
:page.sync="pageForm.page"
|
||||
:limit.sync="pageForm.page_size"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="抄送我" name="fourth">
|
||||
<el-table :data="tickets" border fit stripe style="width: 100%" >
|
||||
<el-table-column label="工单标题" min-width="100" prop="title">
|
||||
</el-table-column>
|
||||
<el-table-column label="当前状态" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<span v-if="scope.row.act_state===1">已提交</span>
|
||||
<span v-else-if="scope.row.act_state===4">已完成</span>
|
||||
<span v-else>审批中</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型" min-width="100">
|
||||
<template slot-scope="scope">{{ scope.row.workflow_.name }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" min-width="100" prop="create_time">
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="操作">
|
||||
<template slot-scope="scope">
|
||||
<el-link v-if="stateSteps==scope.row.act_state" type="danger" @click="handlePicture(scope)">查看流程图</el-link>
|
||||
<el-link v-else type="danger" @click="handleDetail(scope)">处理</el-link>
|
||||
<!--<el-link type="danger" @click="handleDetail(scope)">处理</el-link>-->
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination
|
||||
:total="total"
|
||||
:page.sync="pageForm.page"
|
||||
:limit.sync="pageForm.page_size"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
<div class="svgMark" v-if="dialogVisible" @click="closeMark">
|
||||
<div class="svgWrapper">
|
||||
<div class="svgItem">工单流程图<i class="el-dialog__close el-icon el-icon-close" @click="closeMark"></i></div>
|
||||
<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>
|
||||
<svg height=600 id="svg">
|
||||
<g id="svgG"/>
|
||||
<rect/>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog :visible.sync="limitedStep"
|
||||
title="工单流程">
|
||||
<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" @click.native=stepclick(item.id)>
|
||||
</el-step>
|
||||
</el-steps>
|
||||
<el-row>
|
||||
<el-col :span="1" style="height: 1px;"></el-col>
|
||||
<el-col :span="11">
|
||||
<div class="listItem"><span>流水号:</span>{{ticketDetail.sn}}</div>
|
||||
<div class="listItem"><span>开始时间:</span>{{}}</div>
|
||||
<div class="listItem" v-if="ticketDetail.workflow_"><span>请假类型:</span>{{ticketDetail.workflow_.name}}</div>
|
||||
<div class="listItem"><span>创建人:</span>{{}}</div>
|
||||
<div class="listItem" v-if="ticketDetail.workflow_"><span>请假原因:</span>{{ticketDetail.workflow_.name}}</div>
|
||||
</el-col>
|
||||
<el-col :span="11">
|
||||
<div class="listItem"><span>标题:</span>{{ticketDetail.title}}</div>
|
||||
<div class="listItem"><span>结束时间:</span>{{}}</div>
|
||||
<div class="listItem"><span>创建时间:</span>{{ticketDetail.create_time}}</div>
|
||||
<div class="listItem" v-if="ticketDetail.ticket_data"><span>请假天数:</span>{{ticketDetail.ticket_data.days}}</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<div style="text-align: center">
|
||||
<el-button v-for="item in operationBtn" :key="item.id" class="filter-item" type="primary" @click="operationSubmit">{{item.name}}</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script src="https://d3js.org/d3.v4.min.js"></script>
|
||||
<script>
|
||||
import {getWfStateList,getTickets } from "@/api/workflow";
|
||||
import {getWorkflowList,getWfStateList,getTickets,ticketHandle,getWfFlowSteps,getTicketDetail,getTicketTransitions } from "@/api/workflow";
|
||||
import Pagination from "@/components/Pagination";
|
||||
import dagreD3 from 'dagre-d3'
|
||||
import * as d3 from 'd3'
|
||||
export default {
|
||||
name: "ticket",
|
||||
components: { Pagination },
|
||||
inject:['reload'],
|
||||
data(){
|
||||
return{
|
||||
step:4,
|
||||
total:0,
|
||||
actives:4,
|
||||
ticketId:0,
|
||||
pageForm:{
|
||||
page:1,
|
||||
page_size:20,
|
||||
workflow:0,
|
||||
workflow:'',
|
||||
},
|
||||
workflow:0,
|
||||
stateSteps:0,
|
||||
activeName:'first',
|
||||
keyword:'',
|
||||
workflow:'',
|
||||
tickets:[],
|
||||
workflows:[],
|
||||
ticketDetail:{},
|
||||
dialogVisible:false,
|
||||
listLoading:false,
|
||||
limitedStep:false,
|
||||
nodes: [],
|
||||
tooltip:null,
|
||||
edges: []
|
||||
edges: [],
|
||||
flowSteps:[],
|
||||
operationBtn:[],
|
||||
}
|
||||
},
|
||||
created(){
|
||||
mounted(){
|
||||
this.workflow = this.$route.params.workflow;
|
||||
|
||||
let workflow = localStorage.getItem('workflow');
|
||||
if(this.workflow){
|
||||
if(this.workflow){//有传参
|
||||
this.pageForm.workflow = parseInt(this.workflow);
|
||||
if(workflow){
|
||||
localStorage.removeItem('workflow');
|
||||
localStorage.setItem('workflow',this.$route.params.workflow)
|
||||
localStorage.setItem('workflow',this.pageForm.workflow)
|
||||
}else{
|
||||
localStorage.setItem('workflow',this.$route.params.workflow)
|
||||
localStorage.setItem('workflow',this.pageForm.workflow)
|
||||
}
|
||||
}else {//无传参
|
||||
if (workflow) {
|
||||
this.workflow = workflow;
|
||||
this.pageForm.workflow = workflow;
|
||||
} else {
|
||||
}
|
||||
}
|
||||
this.getList();
|
||||
this.getStates();
|
||||
this.getWorkFlow();
|
||||
},
|
||||
activated(){
|
||||
this.workflow = this.$route.params.workflow;
|
||||
let workflow = localStorage.getItem('workflow');
|
||||
if(this.workflow){//有传参
|
||||
this.pageForm.workflow = parseInt(this.workflow);
|
||||
if(workflow){
|
||||
localStorage.removeItem('workflow');
|
||||
localStorage.setItem('workflow',this.pageForm.workflow)
|
||||
}else{
|
||||
localStorage.setItem('workflow',this.pageForm.workflow)
|
||||
}
|
||||
}else{//无传参
|
||||
if(workflow){
|
||||
this.workflow =workflow ;
|
||||
this.pageForm.workflow =workflow ;
|
||||
}else{}
|
||||
}
|
||||
debugger;
|
||||
this.getList();
|
||||
this.getStates();
|
||||
},
|
||||
methods:{
|
||||
getList(){
|
||||
this.listLoading = true;
|
||||
getTickets( this.pageForm).then((res)=>{
|
||||
if(res.data.results){
|
||||
this.total = res.data.count;
|
||||
this.tickets = res.data.results;
|
||||
this.listLoading = false;
|
||||
}
|
||||
})
|
||||
},
|
||||
handleClick(tab, event) {
|
||||
console.log(tab, event);
|
||||
debugger;
|
||||
//page、pageSize、total、tickets都要发生变化
|
||||
let paneName = tab.paneName;
|
||||
this.activeName = paneName;
|
||||
if(paneName=='first'){
|
||||
|
||||
}else if(paneName=='second'){
|
||||
|
||||
}else if(paneName=='third'){
|
||||
|
||||
}else if(paneName=='fourth'){
|
||||
|
||||
}
|
||||
},
|
||||
getStates(){
|
||||
getWfStateList(this.workflow).then((response) => {
|
||||
if(this.pageForm.workflow!==''){
|
||||
getWfStateList(this.pageForm.workflow).then((response) => {
|
||||
if (response.data) {
|
||||
let nodes = [];
|
||||
let res = response.data;
|
||||
|
|
@ -106,10 +314,18 @@
|
|||
nodes.push(obj)
|
||||
}
|
||||
this.nodes = nodes;
|
||||
console.log(nodes)
|
||||
this.getEdges(nodes);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
getWorkFlow(){
|
||||
let listForm = {page:0};
|
||||
getWorkflowList(listForm).then((response) => {
|
||||
if (response.data) {
|
||||
this.workflows = response.data;
|
||||
}
|
||||
});
|
||||
},
|
||||
getEdges(nodes){
|
||||
let edge = [];
|
||||
|
|
@ -121,10 +337,40 @@
|
|||
edge.push(obj);
|
||||
}
|
||||
this.edges = edge;
|
||||
console.log(edge)
|
||||
},
|
||||
handleFilter(){},
|
||||
handlePicture(){
|
||||
handleFilter(){
|
||||
this.getList();
|
||||
this.getStates();
|
||||
},
|
||||
resetFilter(){
|
||||
this.pageForm.workflow = '',
|
||||
this.getList();
|
||||
},
|
||||
handlePicture(scope){
|
||||
let that = this;
|
||||
getWfFlowSteps( scope.row.id).then((res)=>{
|
||||
if(res.data){
|
||||
that.flowSteps = res.data;
|
||||
getTicketDetail( ticketId).then((res)=>{
|
||||
if(res.data){
|
||||
that.ticketDetail = res.data;
|
||||
let state = res.data.state;
|
||||
debugger;
|
||||
console.log(state)
|
||||
console.log(that.flowSteps)
|
||||
debugger;
|
||||
let dat = that.flowSteps.filter((item)=>{
|
||||
return item.id==state;
|
||||
})
|
||||
console.log(dat)
|
||||
console.log(that.flowSteps.indexOf(dat[0]))
|
||||
debugger;
|
||||
this.actives = that.flowSteps.indexOf(dat[0]);
|
||||
that.limitedStep = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
// this.$router.push({name:"test"})
|
||||
this.dialogVisible = true;
|
||||
//获取D3
|
||||
|
|
@ -137,7 +383,6 @@
|
|||
marginx: 50,
|
||||
marginy: 50,
|
||||
});
|
||||
console.log(g);
|
||||
// 添加节点
|
||||
this.nodes.forEach((item) => {
|
||||
g.setNode(item.id, {
|
||||
|
|
@ -181,11 +426,51 @@
|
|||
})
|
||||
|
||||
},
|
||||
handleDetail(scope){
|
||||
// this.limitedStep = true;
|
||||
let that = this;
|
||||
that.ticketId = scope.row.id;
|
||||
let ticketId = scope.row.id;
|
||||
getWfFlowSteps( scope.row.id).then((res)=>{
|
||||
if(res.data){
|
||||
that.flowSteps = res.data;
|
||||
getTicketDetail( ticketId).then((res)=>{
|
||||
if(res.data){
|
||||
that.ticketDetail = res.data;
|
||||
let state = res.data.state;
|
||||
debugger;
|
||||
console.log(state)
|
||||
console.log(that.flowSteps)
|
||||
debugger;
|
||||
let dat = that.flowSteps.filter((item)=>{
|
||||
return item.id==state;
|
||||
})
|
||||
console.log(dat)
|
||||
console.log(that.flowSteps.indexOf(dat[0]))
|
||||
debugger;
|
||||
this.actives = that.flowSteps.indexOf(dat[0]);
|
||||
that.limitedStep = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
getTicketTransitions(scope.row.id).then(res=>{
|
||||
this.operationBtn = res.data;
|
||||
})
|
||||
},
|
||||
operationSubmit(){
|
||||
let transition = {transition:this.operationBtn[0].id,ticket_data:this.ticketDetail.ticket_data};
|
||||
ticketHandle(this.ticketId,transition).then(res=>{
|
||||
if (res.data){
|
||||
this.limitedStep = false;
|
||||
}
|
||||
})
|
||||
},
|
||||
stepclick(){},
|
||||
closeMark(){
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -221,12 +506,10 @@
|
|||
svg {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.node rect {
|
||||
stroke: #606266;
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.edgePath path {
|
||||
stroke: #606266;
|
||||
fill: #333;
|
||||
|
|
@ -235,4 +518,14 @@
|
|||
.el-icon-close{
|
||||
cursor: pointer;
|
||||
}
|
||||
.listItem{
|
||||
margin-top: 15px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.listItem>span{
|
||||
width: 100px;
|
||||
text-align: right;
|
||||
margin-right: 10px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
</el-table-column>
|
||||
<el-table-column width="180" label="源状态">
|
||||
|
||||
<template slot-scope="scope">
|
||||
<template>
|
||||
<span v-for="item in stateoptions"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="条件表达式" prop="condition_expression">
|
||||
<el-input v-model="wftransition.condition_expression" placeholder="[]" />
|
||||
<el-input v-model="wftransition.condition_expression"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="属性类型" prop="attribute_type">
|
||||
|
||||
|
|
@ -139,9 +139,11 @@ export default {
|
|||
return {
|
||||
wftransition: defaultwftransition,
|
||||
condition_expression:false,
|
||||
wftransitionList: {
|
||||
/*wftransitionList: {
|
||||
count:0
|
||||
},
|
||||
},*/
|
||||
wftransitionList:[],
|
||||
lable:'',
|
||||
options_:[],
|
||||
options: [{
|
||||
value: 1,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project ver="10" name="daq" libEmbed="true" icon="" ui="win" output="数据采集.exe" CompanyName="中存大数据" FileDescription="daq" LegalCopyright="Copyright (C) 作者 2021" ProductName="daq" InternalName="daq" FileVersion="0.0.0.08" ProductVersion="0.0.0.08" publishDir="/dist/" dstrip="false">
|
||||
<project ver="10" name="daq" libEmbed="true" icon="" ui="win" output="数据采集.exe" CompanyName="中存大数据" FileDescription="daq" LegalCopyright="Copyright (C) 作者 2021" ProductName="daq" InternalName="daq" FileVersion="0.0.0.10" ProductVersion="0.0.0.10" publishDir="/dist/" dstrip="false">
|
||||
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
|
||||
<folder name="资源文件" path="res" embed="true" local="false" ignored="false"/>
|
||||
<folder name="窗体文件" path="dlg" comment="目录" embed="true" local="false" ignored="false">
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ if(!atom){
|
|||
mainForm.onMinimize = function(lParam){
|
||||
var tray = win.util.tray(mainForm) //创建托盘图标
|
||||
tray.tip = "数据采集";
|
||||
tray.pop("数据采集已最小化运行" )
|
||||
mainForm.show(false); //隐藏窗口
|
||||
return true;//阻击默认消息传递,取消最小化过程
|
||||
}
|
||||
|
|
@ -159,7 +160,7 @@ http.beginRequest( mainForm.serverUrl.text + "/api/em/daq/", "POST" );
|
|||
var res = web.json.parse(html)
|
||||
if(res['code']==200){
|
||||
import fsys
|
||||
var theDir = fsys.createDir(mainForm.backupPath.text+"\"+number, false)
|
||||
var theDir = fsys.createDir(mainForm.backupPath.text+"\\"+number, false)
|
||||
fsys.move(fullpath, theDir) //移动到备份文件库
|
||||
mainForm.listbox.add("采集成功!")
|
||||
}else{
|
||||
|
|
@ -195,7 +196,7 @@ mainForm.listview.onnotify = function(id,code,ptr){
|
|||
|
||||
mainForm.add.oncommand = function(id,event){
|
||||
|
||||
var frmChild = mainForm.loadForm("\dlg\add.aardio");
|
||||
var frmChild = mainForm.loadForm("\\dlg\\add.aardio");
|
||||
frmChild.doModal();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
# Generated by Django 3.2.6 on 2021-09-28 05:55
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mtm', '0016_auto_20210917_0900'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='recordform',
|
||||
name='material',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联物料'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='material',
|
||||
name='processes',
|
||||
field=models.JSONField(blank=True, default=list, null=True, verbose_name='工艺流程'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='recordform',
|
||||
name='step',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.step', verbose_name='关联子工序'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='recordform',
|
||||
name='type',
|
||||
field=models.IntegerField(choices=[(1, '生产记录'), (2, '检验记录')], default=1, verbose_name='表格类型'),
|
||||
),
|
||||
]
|
||||
|
|
@ -29,7 +29,7 @@ class Material(CommonAModel):
|
|||
specification = models.CharField('型号', max_length=100, null=True, blank=True)
|
||||
type = models.CharField('物料类型', choices= type_choices, max_length=20, default=1)
|
||||
sort_str = models.CharField('排序字符', max_length=100, null=True, blank=True)
|
||||
processes = models.JSONField('工艺流程', default=list, blank=True)
|
||||
processes = models.JSONField('工艺流程', default=list, blank=True, null=True)
|
||||
unit = models.CharField('基准计量单位', choices=unit_choices, default='块', max_length=10)
|
||||
|
||||
class Meta:
|
||||
|
|
@ -80,11 +80,12 @@ class RecordForm(CommonAModel):
|
|||
"""
|
||||
type_choices=(
|
||||
(1, '生产记录'),
|
||||
(2, '检验记录')
|
||||
)
|
||||
name = models.CharField('表格名称', max_length=100, unique=True)
|
||||
type = models.IntegerField('表格类型', choices=type_choices, default=1)
|
||||
step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE)
|
||||
|
||||
step = models.ForeignKey(Step, verbose_name='关联子工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||
class Meta:
|
||||
verbose_name = '记录表格'
|
||||
verbose_name_plural = verbose_name
|
||||
|
|
@ -194,3 +195,4 @@ class TechDoc(CommonAModel):
|
|||
class Meta:
|
||||
verbose_name = '技术文件'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
|
@ -147,7 +147,7 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet
|
|||
"""
|
||||
perms_map = {'*':'*'}
|
||||
queryset = RecordForm.objects.all()
|
||||
filterset_fields = ['step', 'type']
|
||||
filterset_fields = ['step', 'type', 'material']
|
||||
search_fields = ['name']
|
||||
|
||||
def get_serializer_class(self):
|
||||
|
|
|
|||
|
|
@ -79,3 +79,7 @@ class TicketFlowSerializer(serializers.ModelSerializer):
|
|||
fields = '__all__'
|
||||
|
||||
|
||||
class TicketHandleSerializer(serializers.Serializer):
|
||||
transition = serializers.IntegerField(label="流转id")
|
||||
ticket_data = serializers.JSONField(label="表单数据json")
|
||||
suggestion = serializers.CharField(label="处理意见", required = False)
|
||||
|
|
@ -167,7 +167,7 @@ class WfService(object):
|
|||
elif participant_type in [State.PARTICIPANT_TYPE_MULTI, State.PARTICIPANT_TYPE_DEPT, State.PARTICIPANT_TYPE_ROLE]:
|
||||
if user.id not in participant:
|
||||
return dict(permission=False, msg="非当前处理人")
|
||||
current_participant_count = len(participant.split(','))
|
||||
current_participant_count = len(participant)
|
||||
if current_participant_count >1 and state.distribute_type == State.STATE_DISTRIBUTE_TYPE_ACTIVE:
|
||||
return dict(permission=False, msg="需要先接单再处理")
|
||||
if ticket.in_add_node:
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ from django.core.exceptions import AppRegistryNotReady
|
|||
from rest_framework.response import Response
|
||||
from rest_framework import serializers
|
||||
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
|
||||
from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketFlowSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer
|
||||
from apps.wf.serializers import CustomFieldSerializer, StateSerializer, TicketCreateSerializer, TicketFlowSerializer, TicketHandleSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||
from rest_framework.decorators import action, api_view
|
||||
|
|
@ -99,6 +99,8 @@ class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin
|
|||
def get_serializer_class(self):
|
||||
if self.action == 'create':
|
||||
return TicketCreateSerializer
|
||||
elif self.action == 'handle':
|
||||
return TicketHandleSerializer
|
||||
return super().get_serializer_class()
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
|
|
|
|||
Loading…
Reference in New Issue