Compare commits

..

2 Commits

Author SHA1 Message Date
xy 6a6c6a60ba Merge branch 'master' into rollback
1 year ago
xy 0a1371bb9f rollback
2 years ago

@ -18,15 +18,6 @@ export function sign(params,isLoading = true) {
})
}
export function updateSign(params, isLoading = true) {
return request({
method: 'get',
url: '/api/oa/attendance/update-sign',
params,
isLoading
})
}
export function signIp(params,isLoading = true) {
return request({
method: 'get',

@ -96,14 +96,6 @@ export function flowList(type,params,isLoading = false) {
})
}
export function listGroup(params,isLoading) {
return request({
method: 'get',
url: '/api/oa/flow/list-groups',
params,
isLoading
})
}
// 统计
export function todoTotal() {
return request({
@ -218,6 +210,28 @@ export async function rollback(data,isLoading=true) {
isLoading
})
}
// 退回不清除记录
export async function rollbackSimple(data,isLoading=true) {
await MessageBox.confirm("确认退回?", "提示")
return request({
method: 'post',
url: '/api/oa/flow/rollback-simple',
data,
isLoading
})
}
// 退回后重新流转方式
export function rollbackJump(data) {
return request({
url: '/api/oa/flow/rollback-jump',
method: 'post',
data
})
}
export function flowLogs(params,isLoading=false) {
return request({
method: 'get',

@ -16,15 +16,6 @@ export function save (data) {
})
}
export function saveMyself (data) {
return request({
url: "/api/backend/user/myself-save",
method: "post",
data
})
}
export function destroy (data) {
return request({
url: "/api/backend/user/delete",

@ -1,95 +0,0 @@
import axios from "axios";
import { getToken } from "@/utils/auth";
import { Loading, Message } from "element-ui";
/*
* @params {string} url 请求拼接地址
* @params {string} method get|post
* @params {object} info 请求参数params或data
* @params {string} filename 文件名
*/
let loading;
export async function download(url, method = "get", info, filename, paramsSerializer) {
loading = Loading.service({
lock: true,
background: "rgba(0,0,0,0.4)",
text: "文件正在生成中...",
});
let options = {
baseURL: process.env.VUE_APP_BASE_API,
url,
method,
responseType: "blob",
timeout: 10000,
headers: {
Accept: "application/json",
"Content-Type": "application/json; charset=utf-8",
withCredentials: true,
Authorization: "Bearer " + getToken(),
},
paramsSerializer
};
if (method === "get") {
Object.defineProperty(options, "params", {
value: info,
enumerable: true,
writable: false,
});
}
if (method === "post") {
Object.defineProperty(options, "data", {
value: info,
enumerable: true,
writable: false,
});
}
try {
const response = await axios.request(options);
loading.close();
// 提取文件名
if (!filename) {
filename =
response.headers["content-disposition"]?.match(/filename=(.*)/)[1] ||
`${new Date().valueOf()}.xlsx`;
}
// 将二进制流转为blob
const blob = new Blob([response.data], {
type: "application/octet-stream",
});
if (typeof window.navigator.msSaveBlob !== "undefined") {
// 兼容IEwindow.navigator.msSaveBlob以本地方式保存文件
window.navigator.msSaveBlob(blob, decodeURI(filename));
} else {
// 创建新的URL并指向File对象或者Blob对象的地址
const blobURL = window.URL.createObjectURL(blob);
// 创建a标签用于跳转至下载链接
const tempLink = document.createElement("a");
tempLink.style.display = "none";
tempLink.href = blobURL;
tempLink.setAttribute("download", decodeURI(filename));
// 兼容某些浏览器不支持HTML5的download属性
if (typeof tempLink.download === "undefined") {
tempLink.setAttribute("target", "_blank");
}
// 挂载a标签
document.body.appendChild(tempLink);
tempLink.click();
document.body.removeChild(tempLink);
// 释放blob URL地址
window.URL.revokeObjectURL(blobURL);
}
} catch (err) {
console.error(err);
loading.close();
Message({
type: "error",
message: err,
});
}
}

@ -8,16 +8,6 @@ import { flowList } from "@/api/flow";
import MobilePicker from '@/components/MobilePicker/index.vue';
import MobileMultipleSelect from "@/components/MobileMultipleSelect/index.vue";
import { Message } from 'element-ui'
function isJSON(str) {
if (typeof str !== 'string') return false;
try {
const result = JSON.parse(str);
const type = Object.prototype.toString.call(result);
return type === '[object Object]' || type === '[object Array]';
} catch (e) {
return false;
}
}
/**
* @param {String} device 'desktop' | 'mobile'
* @param {Object} info field参数
@ -438,17 +428,12 @@ export default function formBuilder(
break;
case "relation-flow":
if (!this.flows[info.name]) {
let extraParam = {}
if (isJSON(info.stub)) {
extraParam = JSON.parse(info.stub)
}
flowList("all", {
page: 1,
page_size: 9999,
is_simple: 1,
custom_model_id: isJSON(info.stub) ? '' : info.stub,
custom_model_id: info.stub,
is_auth: 1,
...extraParam
}).then((res) => {
this.$set(this.flows, info.name, res.data.data);
});
@ -456,7 +441,6 @@ export default function formBuilder(
formItem = h(
"el-select",
{
ref: `relation-flow-${info.name}`,
props: {
value: target[info.name]
? target[info.name]
@ -500,42 +484,13 @@ export default function formBuilder(
h("div", {
}, [
h("span", {},option.title),
h("el-button", {
h("span", {
style: {
float: 'right'
},
props: {
type: 'primary',
size: 'mini',
icon: 'el-icon-search'
},
on: {
click: e => {
e.stopPropagation()
let target = this.$router.resolve({
path: "/flow/detail",
query: {
module_id: option.custom_model_id,
flow_id: option.id,
isSinglePage: 1,
},
});
this.modalRender = (h) =>
h("iframe", {
attrs: {
src: target.href,
},
style: {
border: "none",
width: "100%",
height: "100%",
},
});
this.isShowModal = true;
this.$refs[`relation-flow-${info.name}`]?.blur()
}
color: '#999',
float: 'right',
'font-size': '12px'
}
}, '查看')
},option.no)
])
])
)
@ -773,17 +728,12 @@ export default function formBuilder(
break;
case "relation-flow":
if (!this.flows[info.name]) {
let extraParam = {}
if (isJSON(info.stub)) {
extraParam = JSON.parse(info.stub)
}
flowList("all", {
page: 1,
page_size: 9999,
is_simple: 1,
custom_model_id: isJSON(info.stub) ? '' : info.stub,
custom_model_id: info.stub,
is_auth: 1,
...extraParam
}).then((res) => {
this.$set(this.flows, info.name, res.data.data);
});
@ -1406,17 +1356,12 @@ export default function formBuilder(
break;
case "relation-flow":
if (!this.flows[info.name]) {
let extraParam = {}
if (isJSON(info.stub)) {
extraParam = JSON.parse(info.stub)
}
flowList("all", {
page: 1,
page_size: 9999,
is_simple: 1,
custom_model_id: isJSON(info.stub) ? '' : info.stub,
custom_model_id: info.stub,
is_auth: 1,
...extraParam
}).then((res) => {
this.$set(this.flows, info.name, res.data.data);
});
@ -1725,17 +1670,12 @@ export default function formBuilder(
break;
case "relation-flow":
if (!this.flows[info.name]) {
let extraParam = {}
if (isJSON(info.stub)) {
extraParam = JSON.parse(info.stub)
}
flowList("all", {
page: 1,
page_size: 9999,
is_simple: 1,
custom_model_id: isJSON(info.stub) ? '' : info.stub,
custom_model_id: info.stub,
is_auth: 1,
...extraParam
}).then((res) => {
this.$set(this.flows, info.name, res.data.data);
});

@ -3,42 +3,14 @@
<card-container>
<vxe-toolbar print custom export>
<template #buttons>
<el-select v-model="select.user_id" size="small" style="width: 160px;">
<el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-date-picker
v-model="select.month"
type="month"
size="small"
value-format="yyyy-MM"
style="width: 160px;margin-left: 10px;">
style="width: 160px;">
</el-date-picker>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 10px;" @click="getList"></el-button>
<el-button icon="el-icon-plus" type="primary" size="small" style="margin-left: 10px;" @click="isShowAdd = true">补卡</el-button>
<el-popover
placement="bottom-start"
title="导入"
width="400"
trigger="click">
<template #reference>
<el-button style="margin-left: 10px;" type="primary" size="small" icon="el-icon-upload">导入</el-button>
</template>
<template #default>
<el-upload
ref="upload"
:action="action"
:on-success="uploadSuccess"
accept=".xls,.xlsx"
:headers="{
'Authorization': 'Bearer ' + getToken()
}"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
<el-button style="margin-left: 10px;" size="small" type="success" @click="uploadData"></el-button>
<div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div>
</el-upload>
</template>
</el-popover>
<el-button icon="el-icon-search" type="primary" plain size="small" style="margin-left: 6px;" @click="getList"></el-button>
</template>
</vxe-toolbar>
<vxe-table
@ -52,143 +24,33 @@
:min-height="400"
:export-config="{}"
:print-config="{}"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, autoClear: false, expandALl: true }"
align="center"
:column-config="{ resizable: true }"
:data="tableData"
>
<vxe-column type="seq" width="58" align="center" />
<vxe-column width="120" field="date" title="日期" align="center" />
<vxe-column field="attendance.sign_in_at" title="签到时间" width="200" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.attendance.sign_in_at" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" size="small"></el-date-picker>
</template>
</vxe-column>
<vxe-column field="attendance.sign_in_at_address" title="签到地址" width="140" :edit-render="{ name: 'input' }"></vxe-column>
<vxe-column field="attendance.sign_in_at_location" title="签到坐标" width="140" :edit-render="{ name: 'input' }"></vxe-column>
<vxe-column field="attendance.sign_out_at" title="签退时间" width="200" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.attendance.sign_out_at" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" size="small"></el-date-picker>
</template>
</vxe-column>
<vxe-column field="attendance.sign_out_at_address" title="签退地址" width="140" :edit-render="{ name: 'input' }"></vxe-column>
<vxe-column field="attendance.sign_out_at_location" title="签退坐标" width="140" :edit-render="{ name: 'input' }"></vxe-column>
<vxe-column field="attendance.status" title="类型" width="140" :edit-render="{ name: 'select', options: [{ label: '-',value: ''},{ label: '',value: 1},{ label: '',value: 2},{ label: '',value: 3}] }" />
<vxe-column fixed="right" field="operate" title="操作" min-width="160" header-align="center" align="left">
<template #default="{ row }">
<template v-if="isActiveStatus(row)">
<el-button size="small" type="primary" @click="saveRowEvent(row)"></el-button>
<el-button size="small" type="primary" plain @click="cancelRowEvent(row)"></el-button>
</template>
<template v-else>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
</template>
</template>
</vxe-column>
</vxe-table>
</card-container>
<AddSign :is-show.sync="isShowAdd" :users="users" @refresh="getList"></AddSign>
</div>
</template>
<script>
import { userListNoAuth } from "@/api/common";
import { index } from '@/api/attendance';
import AddSign from "./components/AddSign.vue";
import { deepCopy } from "@/utils";
import { updateSign } from "@/api/attendance";
import { getToken } from "@/utils/auth";
import { index } from '@/api/attendance'
export default {
components: {
AddSign
},
data() {
return {
action: `${process.env.VUE_APP_BASE_API}/api/oa/statistics/import-overtime`,
isShowAdd: false,
select: {
month: this.$moment().format('YYYY-MM'),
user_id: this.$store.state.user.adminId
month: this.$moment().format('YYYY-MM')
},
loading: false,
tableData: [],
users: []
}
},
methods: {
getToken,
uploadData() {
this.$refs.upload.submit();
},
uploadSuccess(response) {
console.log(response)
if (response.hasOwnProperty('errcode')) {
this.$message.error(response.errmsg)
} else {
this.$message.success(`已导入${response.total}`)
this.getList(true)
}
},
editRowEvent(row) {
if (!row.attendance.id) {
this.$message.warning("当前日期无打卡")
return
}
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)
}
},
cancelRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].clearEdit().then(() => {
//
this.$refs['table'].revertData(row)
})
}
},
async saveRowEvent(row) {
try {
await this.$confirm('确认保存?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await this.$refs['table'].clearEdit()
console.log(row)
this.loading = true
await updateSign({
user_id: this.select.user_id,
date: row.date,
sign_in_at: row.attendance.sign_in_at,
sign_out_at: row.attendance.sign_out_at,
status: row.attendance.status
})
await this.getList()
this.loading = false
} catch (err) {
this.loading = false
}
},
async getUsers () {
try {
const res = await userListNoAuth({
page: 1,
rows: 9999
})
this.users = res.data
} catch (err) {
}
},
async getList () {
this.loading = true
try {
const { attendances } = await index(this.select,false)
this.tableData = attendances
const res = await index(this.select,false)
console.log(res)
this.loading = false
} catch (err) {
console.error(err)
@ -196,17 +58,8 @@ export default {
}
}
},
computed: {
isActiveStatus() {
return function(row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
}
}
},
computed: {},
created() {
this.getUsers()
this.getList()
}
}

@ -77,31 +77,30 @@
<vxe-column
min-width="180"
header-align="center"
field="jiabanleixing"
title="加班类型"
field="title"
title="工作名称"
></vxe-column>
<vxe-column width="190" align="center" title="开始时间" field="kaishiriqi" />
<vxe-column width="190" align="center" title="结束时间" field="jieshushijian" />
<vxe-column min-width="140" align="center" title="原因说明" field="yuanyinshuoming" />
<!-- <vxe-column-->
<!-- width="80"-->
<!-- align="center"-->
<!-- field="status"-->
<!-- title="当前状态"-->
<!-- :formatter="({ cellValue }) => myStatus.get(cellValue)"-->
<!-- :export-method="-->
<!-- ({ row, column, options }) => myStatus.get(row['status'])-->
<!-- "-->
<!-- >-->
<!-- <template #default="{ row }">-->
<!-- <el-tag-->
<!-- size="mini"-->
<!-- :type="statusColor.get(row.status)"-->
<!-- effect="dark"-->
<!-- >{{ myStatus.get(row.status) }}</el-tag-->
<!-- >-->
<!-- </template>-->
<!-- </vxe-column>-->
<vxe-column
width="80"
align="center"
field="status"
title="当前状态"
:formatter="({ cellValue }) => myStatus.get(cellValue)"
:export-method="
({ row, column, options }) => myStatus.get(row['status'])
"
>
<template #default="{ row }">
<el-tag
size="mini"
:type="statusColor.get(row.status)"
effect="dark"
>{{ myStatus.get(row.status) }}</el-tag
>
</template>
</vxe-column>
<vxe-column
width="200"
align="center"

@ -1,130 +0,0 @@
<template>
<div>
<vxe-modal
:z-index="zIndex"
:value="isShow"
show-footer
title="补卡"
show-confirm-button
:width="defaultModalSize.sWidth"
:height="defaultModalSize.sHeight"
esc-closable
transfer
:fullscreen="$store.getters.device === 'mobile'"
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="用户" prop="user_id">
<el-select style="width: 100%;" v-model="form.user_id">
<el-option v-for="i in users" :key="i.id" :label="i.name" :value="i.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="日期" prop="date">
<el-date-picker style="width: 100%;" v-model="form.date" value-format="yyyy-MM-dd"></el-date-picker>
</el-form-item>
<el-form-item label="上班打卡时间" prop="sign_in_at">
<el-date-picker type="datetime" style="width: 100%;" v-model="form.sign_in_at" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
<el-form-item label="下班打卡时间" prop="sign_out_at">
<el-date-picker type="datetime" style="width: 100%;" v-model="form.sign_out_at" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
</el-form-item>
<el-form-item label="类型" prop="status">
<el-select style="width: 100%;" v-model="form.status">
<el-option label="正常" :value="1"></el-option>
<el-option label="补卡" :value="2"></el-option>
<el-option label="外勤" :value="3"></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { updateSign } from '@/api/attendance';
import {defaultModalSize} from "@/settings";
import {PopupManager} from "element-ui/lib/utils/popup";
export default {
props: {
isShow: {
type: Boolean,
default: false,
required: true
},
users: {
type: Array,
default: () => []
}
},
data() {
return {
zIndex: PopupManager.nextZIndex(),
defaultModalSize,
loading: false,
form: {
user_id: '',
date: '',
sign_in_at: '',
sign_out_at: '',
status: ''
},
rules: {
user_id: [
{ required: true, message: '请选择', trigger: 'change' }
],
date: [
{ required: true, message: '请选择', trigger: 'change' }
],
sign_in_at: [
{ required: true, message: '请选择', trigger: 'change' }
],
sign_out_at: [
{ required: true, message: '请选择', trigger: 'change' }
],
status: [
{ required: true, message: '请选择', trigger: 'change' }
],
}
}
},
computed: {},
methods: {
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await updateSign(this.form)
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow', false)
this.loading = false
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
},
watch: {
isShow(newVal) {
if(newVal) {
this.zIndex = PopupManager.nextZIndex()
}
}
},
}
</script>
<style scoped lang="scss">
</style>

@ -6,7 +6,7 @@
<el-date-picker v-model="select.month"
type="month" size="small" value-format="yyyy-MM"
placeholder="月份" format="yyyy-MM"/>
<el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment" v-model="select.department_id" placeholder="请选择">
<el-select style="width:250px;margin-left:6px" size="small" @change="changeDepartment" v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
@ -14,7 +14,7 @@
@click="getList">搜索</el-button>
</template>
</vxe-toolbar>
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading"
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;" :loading="loading"
:max-height="1400" :min-height="400"
:export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}"
:print-config="{}" :column-config="{ resizable: true }"
@ -25,38 +25,38 @@
:merge-cells="mergeCells"
>
<!-- :span-method="mergeCells" -->
<vxe-column minWidth="240" header-align="center" align="center" field="department_name" title="科室"></vxe-column>
<vxe-column minWidth="180" header-align="center" align="center" field="user.name" title="姓名"></vxe-column>
<vxe-column width="240" header-align="center" align="center" field="department_name" title="科室"></vxe-column>
<vxe-column width="180" header-align="center" align="center" field="user.name" title="姓名"></vxe-column>
<vxe-column width="180" header-align="center" align="center" field="over_off" title="结余调休时间">
<vxe-column header-align="center" align="center" field="over_off" title="结余调休时间">
<template #default="{ row }">
<div>
{{row.over_off=='0.00'?'0':row.over_off}}
</div>
</template>
</vxe-column>
<vxe-column width="180" header-align="center" align="center" field="overtime" title="本月加班时间">
<vxe-column header-align="center" align="center" field="overtime" title="本月加班时间">
<template #default="{ row }">
<div>
{{row.overtime=='0.00'?'0':row.overtime}}
</div>
</template>
</vxe-column>
<vxe-column width="180" header-align="center" align="center" field="time_off" title="本月调休时间">
<vxe-column header-align="center" align="center" field="time_off" title="本月调休时间">
<template #default="{ row }">
<div>
{{row.time_off=='0.00'?'0':row.time_off}}
</div>
</template>
</vxe-column>
<vxe-column width="180" header-align="center" align="center" field="expire" title="过期时间">
<vxe-column header-align="center" align="center" field="expire" title="过期时间">
<template #default="{ row }">
<div>
{{row.expire=='0.00'?'0':row.expire}}
</div>
</template>
</vxe-column>
<vxe-column width="180" header-align="center" align="center" field="has_time_off" title="剩余调休时间">
<vxe-column header-align="center" align="center" field="has_time_off" title="剩余调休时间">
<template #default="{ row }">
<div>
{{row.has_time_off=='0.00'?'0':row.has_time_off}}
@ -75,8 +75,7 @@
} from "@/api/chart"
import {
departmentListNoAuth
} from "@/api/common.js"
import store from "@/store/modules/user.js"
} from "@/api/common.js"
export default {
data() {
return {
@ -88,8 +87,6 @@
month: this.$moment().format('YYYY-MM'),
department_id: ''
},
my_department_id:"",
is_bgs:false, //
departments:[],
mergeCells:[],
exportName:'调休统计表',
@ -180,13 +177,6 @@
},
computed: {},
created() {
console.log("store",store)
this.my_department_id = store.state.department?store.state.department.id:''
this.dName = store.state.department?store.state.department.name:'全部科室'
if(this.my_department_id){
this.is_bgs = this.my_department_id==2?true:false
this.select.department_id = this.my_department_id
}
this.getDepartmentList()
this.getList()
},
@ -200,14 +190,5 @@
}
</script>
<style scoped lang="scss">
::v-deep .vxe-body--column {
border-left: 1px solid #333 !important;
border-bottom: 1px solid #333 !important;
}
::v-deep th.vxe-header--column{
border-left: 1px solid #333 !important;
border-bottom: 2px solid #333 !important;
}
<style scoped lang="scss">
</style>

@ -5,7 +5,7 @@
<template #buttons>
<el-date-picker v-model="select.month" type="month" size="small" value-format="yyyy-MM" placeholder="月份"
format="yyyy-MM" />
<el-select v-if="is_bgs" style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
<el-select style="width:250px;margin-left:6px" size="small" @change="changeDepartment"
v-model="select.department_id" placeholder="请选择">
<el-option v-for="item in departments" :key="item.id" :label="item.name" :value="item.id">
</el-option>
@ -14,7 +14,7 @@
@click="getList">搜索</el-button>
</template>
</vxe-toolbar>
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;border:1px solid #333" :loading="loading" :max-height="1400"
<vxe-table ref="table" stripe :border='true' style="margin-top: 10px;" :loading="loading" :max-height="1400"
:min-height="400" :export-config="{type: 'xlsx',filename:exportName,sheetName:exportName}" :print-config="{}"
:column-config="{ resizable: true }" :expand-config="{
visibleMethod: () => false,
@ -28,16 +28,16 @@
{{row.kaishiriqi?row.kaishiriqi.substring(0,11):''}}
</template>
</vxe-column>
<vxe-column minWidth="180" header-align="center" align="center" field="yuanyinshuoming" title="加班事由"></vxe-column>
<vxe-column width="180" :export-method="exportjbMethod" header-align="center" align="center" field="jiabanshijian"
<vxe-column header-align="center" align="center" field="yuanyinshuoming" title="加班事由"></vxe-column>
<vxe-column :export-method="exportjbMethod" header-align="center" align="center" field="jiabanshijian"
title="加班时间">
<template #default="{ row }">
{{row.kaishiriqi?row.kaishiriqi.substring(11,row.kaishiriqi.length):''}}-{{row.kaishiriqi?row.jieshushijian.substring(11,row.jieshushijian.length):''}}
</template>
</vxe-column>
<vxe-column width="180" header-align="center" align="center" field="jiabanshichang" title="加班时长(h)"></vxe-column>
<vxe-column header-align="center" align="center" field="jiabanshichang" title="加班时长(h)"></vxe-column>
<!-- <vxe-column header-align="center" align="center" field="day" title="day"></vxe-column> -->
<vxe-column width="180" header-align="center" align="center" field="allDay" title="本月累计(h)"></vxe-column>
<vxe-column header-align="center" align="center" field="allDay" title="本月累计(d)"></vxe-column>
@ -52,8 +52,11 @@
} from "@/api/chart"
import {
departmentListNoAuth
} from "@/api/common.js"
import store from "@/store/modules/user.js"
} from "@/api/common.js"
import * as XLSX from "xlsx";
import {
saveAs
} from "file-saver";
export default {
data() {
return {
@ -64,9 +67,7 @@
page_size: 10,
month: this.$moment().format('YYYY-MM'),
department_id: ''
},
my_department_id:"",
is_bgs:false, //
},
departments: [],
mergeCells: [],
exportName: '加班统计表',
@ -115,7 +116,7 @@
department,
overtime
} = item;
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.jiabanshichang), 0);
const allDay = overtime.reduce((sum, overtimeItem) => sum + parseFloat(overtimeItem.day), 0);
overtime.forEach(overtimeItem => {
overtimeItem.pid = id;
overtimeItem.name = name;
@ -184,14 +185,7 @@
},
computed: {},
created() {
this.my_department_id = store.state.department?store.state.department.id:''
this.dName = store.state.department?store.state.department.name:'全部科室'
if(this.my_department_id){
this.is_bgs = this.my_department_id==2?true:false
this.select.department_id = this.my_department_id
}
created() {
this.getDepartmentList()
this.getList()
},
@ -205,14 +199,5 @@
}
</script>
<style scoped lang="scss">
::v-deep .vxe-body--column {
border-left: 1px solid #333 !important;
border-bottom: 1px solid #333 !important;
}
::v-deep th.vxe-header--column{
border-left: 1px solid #333 !important;
border-bottom: 2px solid #333 !important;
}
<style scoped lang="scss">
</style>

@ -170,34 +170,23 @@
<div class="mycard flow">
<div class="mycard__title">
<span>常用流程</span>
<div>
<el-button
size="mini"
type="primary"
style="padding: 5px 10px"
@click="openQucik"
>批量更改</el-button>
</div>
</div>
<div class="mycard__body flow__body">
<!-- 自己的 常用流程 -->
<div
v-for="item in usualFlows"
:key="item.key"
@click="toCreate(item)">
<div class="flow-cover">
<template v-if="item.icon">
<Icon class="flow__body--icon" :icon="item.icon"></Icon>
</template>
<template v-else>
<i class="el-icon-edit flow__body--icon"></i>
</template>
</div>
<span class="flow__body--name">{{item.name}}
</span>
<div
v-for="item in usualFlows"
:key="item.key"
@click="toCreate(item)">
<div class="flow-cover">
<template v-if="item.icon">
<Icon class="flow__body--icon" :icon="item.icon"></Icon>
</template>
<template v-else>
<i class="el-icon-edit flow__body--icon"></i>
</template>
</div>
<span class="flow__body--name">{{ item.name }}</span>
</div>
</div>
</div>
</div>
@ -296,48 +285,6 @@
frameborder="0"
/>
</vxe-modal>
<!-- 编辑菜单 -->
<vxe-modal
v-model="isShowQuick"
:z-index="zIndex"
transfer
show-zoom
resize
show-footer
show-confirm-button
show-cancel-button
type="confirm"
:fullscreen="$store.getters.device === 'mobile'"
title="常用流程"
:width="defaultModalSize.width"
:height="defaultModalSize.height"
esc-closable
:padding="false"
>
<div class="mycard flow dashboard-container">
<div class="mycard__body flow__body" style="width: 100%;grid-template-columns: repeat(6, 1fr);">
<div
v-for="item in flows"
:key="item.key"
@click="changeCheck(item)">
<div class="flow-cover">
<template v-if="item.icon">
<Icon class="flow__body--icon" :icon="item.icon"></Icon>
</template>
<template v-else>
<i class="el-icon-edit flow__body--icon"></i>
</template>
</div>
<span class="flow__body--name">
<el-checkbox @change="(e)=>{return changeCheck(item,e)}" v-model="item.checked">{{ item.name }}</el-checkbox>
</span>
</div>
</div>
</div>
<template #footer>
<el-button type="primary" :loading="quickLoading" @click="updatequick"></el-button>
</template>
</vxe-modal>
</div>
</template>
@ -352,9 +299,6 @@ import { index as configIndex } from "@/api/config";
import { index } from "@/api/attendance";
import {isExternal} from "@/utils/validate";
import { defaultModalSize } from "@/settings";
import {saveMyself} from "@/api/user"
import {getInfo} from "@/api/me"
export default {
name: "Dashboard",
components: {
@ -366,8 +310,7 @@ export default {
modalUrl: "",
zIndex: PopupManager.nextZIndex(),
isShowModal: false,
isShowQuick:false,
quickLoading:false,
weatherIcon: new Map([
["晴", "el-icon-sunny"],
["阴", "el-icon-cloudy"],
@ -493,29 +436,22 @@ export default {
console.error(err);
}
},
//
changeCheck(item){
this.$set(item,'checked',!item.checked)
this.$forceUpdate()
},
async getUsualFlows() {
try {
await this.getFlows();
const res = await getInfo()
this.usualFlows = res.quick_enter?res.quick_enter:[]
// const res = await configIndex({
// filter: [
// {
// key: "key",
// op: "eq",
// value: "dashboard_menus",
// },
// ],
// });
// this.usualFlows = this.flows.filter(
// (i) => res.data[0]?.value?.indexOf(i.id.toString()) !== -1
// );
console.log(res,this.usualFlows);
const res = await configIndex({
filter: [
{
key: "key",
op: "eq",
value: "dashboard_menus",
},
],
});
this.usualFlows = this.flows.filter(
(i) => res.data[0]?.value?.indexOf(i.id.toString()) !== -1
);
console.log(this.usualFlows);
} catch (err) {
console.error(err);
}
@ -528,29 +464,6 @@ export default {
console.error(err);
}
},
openQucik(){
this.flows.map(flow => {
const isChecked = this.usualFlows.some(usualFlow => usualFlow.id === flow.id);
flow.checked = isChecked
});
this.isShowQuick = true
},
updatequick(){
this.quickLoading = true
let arr = this.flows.filter((i)=> i.checked===true)
saveMyself({
quick_enter:arr
}).then(res=>{
this.$message({
type: 'success',
message: '更改成功!'
})
this.isShowQuick = false
this.quickLoading = false
this.getUsualFlows()
})
},
async getTotal() {
try {
const res = await axios.get(`${process.env.VUE_APP_BASE_API}/api/oa/statistics/notifications`,{
@ -570,7 +483,7 @@ export default {
async getWeather() {
try {
const res = await axios.get(
`https://restapi.amap.com/v3/weather/weatherInfo?city=320400&key=a37c084cac0c3459b892276ec0a1c880`
`https://restapi.amap.com/v3/weather/weatherInfo?city=320400&key=15ecd1e7de61e684959f43d8965a89f0`
);
if (res.status === 200) {
this.weather = res.data.lives[0];
@ -754,9 +667,6 @@ $btn-colors: linear-gradient(90deg, #d4bbfd 0%, #af7bff 100%),
font-weight: bold;
padding-left: 20px;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
&::before {
content: "";
@ -905,8 +815,6 @@ $btn-colors: linear-gradient(90deg, #d4bbfd 0%, #af7bff 100%),
font-size: 14px;
padding-top: 20px;
text-align: center;
width: 100%;
height: 40px;
}
}
}

@ -1,7 +1,7 @@
<script>
import {deepCopy,debounce} from "@/utils";
import {deepCopy} from "@/utils";
import formBuilder from "@/utils/formBuilder";
import { PopupManager } from "element-ui/lib/utils/popup";
import {PopupManager} from "element-ui/lib/utils/popup";
import request from '@/utils/request'
import moment from "moment/moment";
import {defaultModalSize} from "@/settings";
@ -151,7 +151,6 @@ export default {
methods: {
getToken,
request,
debounce,
async validate() {
this.customValidate()
const $elForm = this.$refs['elForm']

@ -1,179 +0,0 @@
<template>
<div>
<vxe-modal
:z-index="zIndex"
:value="isShow"
show-footer
title="特殊日期"
show-confirm-button
:width="defaultModalSize.width"
:height="defaultModalSize.height"
esc-closable
transfer
:fullscreen="$store.getters.device === 'mobile'"
@input="e => $emit('update:isShow',e)"
>
<div>
<h4>当前导出流程 {{ config.name }}</h4>
<h4 style="display: inline-block;">导出文件名</h4>
<el-input style="max-width: 220px;" size="small" v-model="fileName"></el-input>
<el-button style="margin-left: 10px;" type="primary" size="small" icon="el-icon-download" @click="confirm"></el-button>
<h4>需要导出字段</h4>
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"></el-checkbox>
<div style="margin: 15px 0;"></div>
<el-checkbox-group v-model="selectedFields" @change="handleCheckedFieldsChange">
<el-checkbox v-for="field in mainFields" :label="field.name" :key="field.id">{{ field.label }}</el-checkbox>
</el-checkbox-group>
<h4 style="color: var(--theme-color);">存在子表单</h4>
<div v-for="field in relationsFields" :key="field.id" style="padding-left: 10px;">
<FieldExportItem :custom-model-id="field.sub_custom_model_id"></FieldExportItem>
</div>
</div>
</vxe-modal>
</div>
</template>
<script>
import FieldExportItem from "./FieldExportItem.vue";
import {fieldConfig} from "@/api/flow"
import {defaultModalSize} from "@/settings";
import {PopupManager} from "element-ui/lib/utils/popup";
import {download} from "@/utils/downloadRequest"
export default {
components: {
FieldExportItem
},
props: {
isShow: {
type: Boolean,
default: false,
required: true
},
select: {
type: Object,
default: () => ({})
}
},
data() {
return {
zIndex: PopupManager.nextZIndex(),
defaultModalSize,
loading: false,
config: {
fields: []
},
fileName: `导出_${this.$moment().valueOf()}`,
selectedFields: [],
checkAll: false,
isIndeterminate: false,
}
},
computed: {
mainFields() {
return this.config?.fields?.filter(i => i.type !== 'relation')
},
relationsFields() {
return this.config?.fields?.filter(i => i.type === 'relation')
}
},
methods: {
handleCheckedFieldsChange(value) {
let checkedCount = value.length;
this.checkAll = checkedCount === this.config?.fields?.length;
this.isIndeterminate = checkedCount > 0 && checkedCount < this.config?.fields?.length;
},
handleCheckAllChange(val) {
this.selectedFields = val ? this.config.fields?.map(i => i.name) : [];
this.isIndeterminate = false;
},
async getFields(id) {
try {
const { customModel } = await fieldConfig(id)
this.config = customModel
this.config.fields.forEach(i => {
i.name = 'data.' + i.name
})
this.fileName = `${customModel.name}_${this.$moment().valueOf()}`
} catch (err) {
console.error(id)
}
},
async confirm() {
// paramsSerializer
const paramsSerializer = (params) => {
const parts = [];
//
const serialize = (obj, parentKey) => {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
const value = obj[key];
const fullKey = parentKey ? `${parentKey}[${key}]` : key;
if (value && typeof value === 'object' && !Array.isArray(value)) {
//
serialize(value, fullKey);
} else if (Array.isArray(value)) {
//
value.forEach((item, index) => {
if (item && typeof item === 'object') {
//
serialize(item, `${fullKey}[${index}]`);
} else {
//
parts.push(`${encodeURIComponent(`${fullKey}[${index}]`)}=${encodeURIComponent(item)}`);
}
});
} else {
//
parts.push(`${encodeURIComponent(fullKey)}=${encodeURIComponent(value)}`);
}
}
}
};
//
serialize(params, '');
//
return parts.join('&');
};
try {
let export_fields = {}
this.selectedFields?.forEach(field => {
let key = field
export_fields[key] = this.config?.fields?.find(j => j.name === key)?.label
})
await download('/api/oa/flow/list-groups', 'get', {
custom_model_id: this.select.custom_model_id,
type: this.$route.params.type,
is_export: 1,
export_name: this.fileName,
export_fields
}, this.fileName+'.xlsx', paramsSerializer)
} catch (err) {
console.error(err)
}
}
},
watch: {
isShow(newVal) {
if(newVal) {
this.zIndex = PopupManager.nextZIndex()
}
},
"select.custom_model_id"(newVal) {
if(newVal) {
this.getFields(newVal)
}
}
},
}
</script>
<style scoped lang="scss">
</style>

@ -1,141 +0,0 @@
<template>
<div>
<h5>当前导出流程 {{ config.name }}</h5>
<h4 style="display: inline-block;">导出文件名</h4>
<el-input style="max-width: 220px;" size="small" v-model="fileName"></el-input>
<el-button style="margin-left: 10px;" type="primary" size="small" icon="el-icon-download" @click="confirm"></el-button>
<h4>需要导出字段</h4>
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange"></el-checkbox>
<div style="margin: 15px 0;"></div>
<el-checkbox-group v-model="selectedFields" @change="handleCheckedFieldsChange">
<el-checkbox v-for="field in mainFields" :label="field.name" :key="field.id">{{ field.label }}</el-checkbox>
</el-checkbox-group>
</div>
</template>
<script>
import {fieldConfig} from "@/api/flow";
import {download} from "@/utils/downloadRequest";
export default {
props: {
customModelId: {
type: [String, Number],
default: ''
}
},
data() {
return {
loading: false,
config: {
fields: []
},
fileName: `导出_${this.$moment().valueOf()}`,
selectedFields: [],
checkAll: false,
isIndeterminate: false,
}
},
methods: {
handleCheckedFieldsChange(value) {
let checkedCount = value.length;
this.checkAll = checkedCount === this.config?.fields?.length;
this.isIndeterminate = checkedCount > 0 && checkedCount < this.config?.fields?.length;
},
handleCheckAllChange(val) {
this.selectedFields = val ? this.config.fields?.map(i => i.name) : [];
this.isIndeterminate = false;
},
async getFields(id) {
try {
const { customModel } = await fieldConfig(id)
this.config = customModel
this.config.fields.forEach(i => {
i.name = 'data.' + i.name
})
this.fileName = `${customModel.name}_${this.$moment().valueOf()}`
} catch (err) {
console.error(id)
}
},
async confirm() {
// paramsSerializer
const paramsSerializer = (params) => {
const parts = [];
//
const serialize = (obj, parentKey) => {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
const value = obj[key];
const fullKey = parentKey ? `${parentKey}[${key}]` : key;
if (value && typeof value === 'object' && !Array.isArray(value)) {
//
serialize(value, fullKey);
} else if (Array.isArray(value)) {
//
value.forEach((item, index) => {
if (item && typeof item === 'object') {
//
serialize(item, `${fullKey}[${index}]`);
} else {
//
parts.push(`${encodeURIComponent(`${fullKey}[${index}]`)}=${encodeURIComponent(item)}`);
}
});
} else {
//
parts.push(`${encodeURIComponent(fullKey)}=${encodeURIComponent(value)}`);
}
}
}
};
//
serialize(params, '');
//
return parts.join('&');
};
try {
let export_fields = {}
this.selectedFields?.forEach(field => {
let key = field
export_fields[key] = this.config?.fields?.find(j => j.name === key)?.label
})
await download('/api/oa/flow/list-groups', 'get', {
custom_model_id: this.customModelId,
type: this.$route.params.type,
is_export: 1,
export_name: this.fileName,
export_fields
}, this.fileName+'.xlsx', paramsSerializer)
} catch (err) {
console.error(err)
}
}
},
computed: {
mainFields() {
return this.config?.fields?.filter(i => i.type !== 'relation')
},
},
watch: {
customModelId: {
handler: function (newVal,oldVal) {
console.log(33, newVal,oldVal)
if(newVal) {
this.getFields(newVal)
}
},
immediate: true
},
},
}
</script>
<style scoped lang="scss">
</style>

@ -1,111 +0,0 @@
<template>
<div class="steps" v-if="!/\/detail/.test($route.path) && logs.length > 0">
<el-tooltip effect="dark" content="退回原因点击节点标题查看" placement="top-end">
<i class="el-icon-question steps__ask"></i>
</el-tooltip>
<el-steps :space="120" finish-status="success" align-center>
<el-step
v-for="(logGroup, index) in groupedLogs"
v-if="!(logGroup[0].flow_node_id === currentNode.id && isLastGroup(index))"
:title="logGroup[0].node ? logGroup[0].node.name : '节点已调整'"
:status="logGroup[0].status !== -1 ? 'success' : 'error'"
icon="el-icon-circle-check"
>
<template #title>
<template v-if="logGroup[0].status === -1">
<el-tooltip effect="dark" :content="logGroup[0].reason" placement="bottom">
<span>{{ logGroup[0].node ? logGroup[0].node.name : '节点已调整' }}</span>
</el-tooltip>
</template>
<template v-else>
{{ logGroup[0].node ? logGroup[0].node.name : '节点已调整' }}
</template>
</template>
</el-step>
<el-step status="finish" :title="currentNode.name + '(正在办理)'" icon="el-icon-edit"></el-step>
<el-step v-if="currentNode.nextNodes && currentNode.nextNodes.length" status="wait" icon="el-icon-right">
<template #title>
<div style="max-width: 180px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<span v-for="(nextNode, index) in ((currentNode.nextNodes && currentNode.nextNodes instanceof Array) ? currentNode.nextNodes : [])">{{ index === 0 ? '' : ',' }}{{ nextNode.name }}</span>
</div>
<div v-if="currentNode.nextNodes">{{ currentNode.nextNodes.length }}</div>
</template>
</el-step>
</el-steps>
<el-divider></el-divider>
</div>
</template>
<script>
export default {
props: {
logs: {
type: Array,
default: () => []
},
currentNode: {
type: Object,
default: () => ({})
}
},
data() {
return {}
},
methods: {
//
isLastGroup(index) {
return index === this.groupedLogs.length - 1;
}
},
computed: {
groupedLogs() {
const groups = {};
this.logs.forEach(log => {
const key = log.jointly_sign_id;
if (!groups[key]) {
groups[key] = [];
}
groups[key].push(log);
});
return Object.values(groups);
}
},
}
</script>
<style scoped lang="scss">
::v-deep .el-step__title:has(.el-tooltip) {
cursor: pointer;
}
::v-deep .el-step__title {
font-size: 14px;
line-height: 1.5;
}
::v-deep .el-step__icon.is-icon {
border-radius: 100%;
box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
width: 36px;
height: 36px;
border: solid 2px;
}
::v-deep .el-step.is-center .el-step__line {
top: 50%;
}
.steps {
position: relative;
&__ask {
position: absolute;
right: 0;
top: 0;
}
}
@media (max-width: 768px) {
::v-deep .el-steps--horizontal {
display: flex;
flex-wrap: wrap;
}
}
</style>

@ -27,7 +27,7 @@
</el-radio>
</el-radio-group>
<h4><span style="color: #F56C6C;"> * </span>请输入退回原因</h4>
<h4>请输入退回原因</h4>
<el-input v-model="form.reason" type="textarea" :autosize="{ minRows: 2 }"></el-input>
</div>
@ -41,7 +41,7 @@
</template>
<script>
import { flowLogs, rollback } from '@/api/flow'
import { flowLogs, rollback, rollbackSimple } from '@/api/flow'
import { PopupManager } from 'element-ui/lib/utils/popup'
import { defaultModalSize } from '@/settings'
export default {
@ -84,13 +84,10 @@ export default {
this.$message.warning("请选择退回步骤!")
return
}
if(!this.form.reason) {
this.$message.warning("请填写退回原因!")
return
}
try {
this.form.id = this.flow.id;
const res = await rollback(this.form)
const res = await rollbackSimple(this.form)
// const res = await rollback(this.form)
this.$message({
message: res,
duration: 2000,

@ -14,7 +14,40 @@
</template>
<template>
<Steps :logs="config.logs" :current-node="node"></Steps>
<div class="steps" v-if="!/\/detail/.test($route.path)">
<el-steps :space="120" finish-status="success" align-center>
<template v-if="!isFirstNode">
<el-step
v-for="step in config.logs ? config.logs.slice(0, -1) : []"
:title="step.node.name"
:status="step.status !== -1 ? 'success' : 'error'"
icon="el-icon-circle-check"
></el-step>
</template>
<el-step
:title="node.name"
status="finish"
icon="el-icon-edit"
></el-step>
<el-step
icon="el-icon-right"
status="wait"
>
<template #title>
<el-tooltip class="item" effect="dark" :content="(node.nextNodes && node.nextNodes instanceof Array) ? node.nextNodes.map(i => i.name).toString() : ''" placement="bottom">
<div>
<div style="max-width: 180px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<span v-for="(nextNode, index) in ((node.nextNodes && node.nextNodes instanceof Array) ? node.nextNodes : [])">{{ index === 0 ? '' : ',' }}{{ nextNode.name }}</span>
</div>
<div v-if="node.nextNodes">{{ node.nextNodes.length }}</div>
</div>
</el-tooltip>
</template>
</el-step>
</el-steps>
<el-divider></el-divider>
</div>
<div class="form-container" id="print-content">
<DesktopForm
@ -177,14 +210,6 @@
>
</template>
<template v-else>
<el-button
v-if="$store.state.user.adminId === 1 && $route.query.flow_id"
icon="el-icon-arrow-left"
type="danger"
size="small"
@click="isShowRollback = true"
>退回</el-button
>
<el-button plain size="small" @click="$router.go(-1)"></el-button>
<el-button plain size="small" @click="print(false)"></el-button>
<el-button plain size="small" @click="print(true)">()</el-button>
@ -217,7 +242,6 @@
</template>
<script>
import Steps from "./components/Steps.vue";
import DesktopForm from "./DesktopForm.vue";
import MobileForm from "./MobileForm.vue";
import assign from "./components/assign.vue";
@ -227,11 +251,13 @@ import { generateRandomString } from '@/utils'
import {
create,
deal,
fieldConfig, flowList,
fieldConfig,
flowList,
preConfig,
preDeal,
updateNodeTime,
view,
rollbackJump
} from "@/api/flow";
import { deepCopy } from "@/utils";
import { validation, validationName } from "@/utils/validate";
@ -239,7 +265,6 @@ import { print } from "@/utils/print";
import JSONBigint from 'json-bigint'
export default {
components: {
Steps,
DesktopForm,
MobileForm,
assign,
@ -763,7 +788,35 @@ export default {
if (this.$route.query.flow_id) {
copyForm["temporary_save"] = 0;
}
callback = () => (this.isShowAssign = true);
callback = () => {
if (this.isRollbackNode) {
this.$confirm('是否直接流转至退回人节点', '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '流转至退回人节点',
cancelButtonText: '重新流转'
}).then(async _ => {
try {
const res = await rollbackJump({
id: this.$route.query.flow_id,
way: 2
})
this.$router.push("/flow/list/todo")
} catch (err) {
console.error(err)
}
}).catch(async(action) => {
if (action === 'cancel') {
const res = await rollbackJump({
id: this.$route.query.flow_id,
way: 1
})
this.isShowAssign = true
}
})
} else {
this.isShowAssign = true
}
};
break;
}
@ -813,7 +866,7 @@ export default {
})
})
}
},
}
},
computed: {
device() {
@ -834,6 +887,21 @@ export default {
node() {
return this.config?.currentNode || {};
},
isRollbackNode() {
if (this.config.logs && this.config.logs instanceof Array && this.config.logs?.length > 0) {
if (this.config.logs.at(-1)?.flow_node_id === this.node.id) {
if (this.config.logs.at(-2)?.hasOwnProperty('status')) {
return this.config.logs.at(-2).status === -1
} else {
return false
}
} else {
return false
}
} else {
return false
}
},
scriptContent() {
if (this.config?.customModel?.view_js && this.$route.query.flow_id && /\/detail/.test(this.$route.path)) {
return this.config?.customModel?.view_js;

@ -63,34 +63,6 @@
"
>
</el-date-picker>
<el-select
style="width: 150px"
size="small"
v-model="select.status"
placeholder="请选择状态"
clearable
>
<el-option
v-for="item in myStatusList"
:key="item.value"
:value="item.value"
:label="item.label"
></el-option>
</el-select>
<el-select
style="width: 150px"
size="small"
v-model="select.flow_log_cancel"
placeholder="请选择我退回的"
clearable
>
<el-option
v-for="item in [{value:1,label:'我退回过'}]"
:key="item.value"
:value="item.value"
:label="item.label"
></el-option>
</el-select>
<el-input
clearable
v-model="select.keyword"
@ -105,14 +77,6 @@
@click="getList(true)"
>搜索</el-button
>
<el-button
v-if="select.custom_model_id"
icon="el-icon-download"
type="primary"
size="small"
@click="isShowFieldExport = true"
>导出</el-button
>
<!-- <el-button-->
<!-- v-if="$route.path === '/flow/list/todo'"-->
<!-- icon="el-icon-edit"-->
@ -246,14 +210,6 @@
>
</div>
</div>
<div class="mobile-desc-row">
<div class="mobile-desc-row__title">
我是否退回过
</div>
<div class="mobile-desc-row__value">
{{ row.flow_log_cancel?'是':'否' }}
</div>
</div>
</div>
<template v-if="$route.params.type !== 'all'">
<el-button
@ -360,7 +316,6 @@
>
</template>
</vxe-column>
<vxe-column
:visible="$store.getters.device === 'desktop'"
width="164"
@ -403,19 +358,6 @@
>
</template>
</vxe-column>
<vxe-column
:visible="$store.getters.device === 'desktop'"
width="120"
align="center"
field="status"
title="我是否退回过"
>
<template #default="{ row }">
{{ row.flow_log_cancel?'是':'否' }}
</template>
</vxe-column>
<vxe-column
:visible="$store.getters.device === 'desktop'"
min-width="280"
@ -504,7 +446,6 @@
<share ref="share" :is-show.sync="isShowShare" :flow="pickedFlow"></share>
<list-popover :is-show.sync="isShowListPopover" :id="listPopoverId" :pos="listPopoverPos" />
<multi-deal :is-show.sync="isShowMultiDeal" :deal-flows="multiDealFlows" @refresh="getList" />
<field-export :is-show.sync="isShowFieldExport" :select="select" />
</div>
</template>
@ -514,20 +455,16 @@ import moment from "moment/moment";
import ListPopover from "./components/ListPopover.vue";
import MultiDeal from "./components/MultiDeal.vue"
import share from "./components/share.vue";
import FieldExport from "./components/FieldExport.vue";
import { departmentListNoAuth } from "@/api/common"
export default {
name: "flowList",
components: {
share,
ListPopover,
MultiDeal,
FieldExport
MultiDeal
},
data() {
return {
isShowFieldExport: false,
todoTotal: [],
isShowMultiDeal: false,
multiDealFlows: [],
@ -543,18 +480,6 @@ export default {
[0, "办理中"],
[1, "已完成"],
]),
myStatusList:[
{
value:-1,
label:'已退回'
},{
value:0,
label:'办理中'
},{
value:1,
label:'已完成'
}
],
statusColor: new Map([
[-1, "warning"],
[0, ""],
@ -625,8 +550,6 @@ export default {
sort_name: "",
sort_type: "",
keyword: "",
flow_log_cancel:'',
status:'',
department_id: "",
is_fav: "",
custom_model_id: "",

Loading…
Cancel
Save