中航光电热表web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

307 lines
8.8 KiB

<template>
<nf-container v-if="moduleLoadInit">
<el-skeleton :loading="waiting" avatar :rows="8">
<h3 style="margin-bottom: 20px">{{ process.name }}</h3>
<el-card shadow="never" style="margin-top: 20px">
<!-- 自定义表单区域 -->
<nf-form
v-if="
option &&
((option.column && option.column.length > 0) ||
(option.group && option.group.length > 0))
"
v-model="form"
ref="form"
:option="option"
@submit="handleSubmit"
@error="loading = false"
:upload-preview="handleUploadPreview"
>
</nf-form>
<!-- 自定义表单区域 -->
</el-card>
<el-card shadow="never" style="margin-top: 20px" v-if="showExamForm">
<nf-examine-form
ref="examineForm"
:process="process"
@user-select="handleUserSelect"
></nf-examine-form>
</el-card>
<div style="height: 80px"></div>
<el-affix position="bottom" :offset="20">
<el-row
class="foot-item"
:style="{ width: isCollapse ? 'calc(100% - 71px)' : 'calc(100% - 241px)' }"
>
<el-button type="primary" size="default" v-loading="loading" @click="handleSubmit">
发起
</el-button>
<el-button
v-if="permission.wf_process_draft"
type="success"
size="default"
v-loading="loading"
@click="
handleDraft({ processDefId: process.id, formKey: process.formKey, variables: form })
"
>
存为草稿
</el-button>
</el-row>
</el-affix>
</el-skeleton>
<!-- 人员选择弹窗 -->
<nf-user-select
ref="user-select"
:check-type="checkType"
:default-checked="defaultChecked"
@onConfirm="handleUserSelectConfirm"
></nf-user-select>
</nf-container>
</template>
<script>
import { submit,startProcess } from '../../../api/demo/leave.js';
import NfExamineForm from '../../../components/nf-exam-form/index.vue';
import NfUserSelect from '../../../components/nf-user-select/index.vue';
import exForm from '../../../mixins/ex-form';
import draft from '../../../mixins/draft';
export default {
components: {
NfUserSelect,
NfExamineForm,
},
mixins: [exForm, draft],
watch: {
'$route.query.p': {
handler(val) {
if (val) {
const param = JSON.parse(window.atob(val));
const { processId, processDefKey, params } = param;
if (processId || processDefKey) this.getForm(processId, processDefKey);
if (params) this.params = params;
}
},
immediate: true,
},
},
computed: {
showExamForm() {
const { hideComment, hideCopy, hideExamine } = this.process;
return !hideComment || !hideCopy || !hideExamine;
},
},
data() {
return {
form: {},
option: {
menuBtn: false,
column: [
{
type: 'input',
label: '创建人55555777',
span: 12,
display: true,
prop: 'creator',
value: '${this.$store.getters.userInfo.nick_name}',
readonly: true,
},
{
type: 'input',
label: '创建部门',
span: 12,
display: true,
prop: 'creatorDept',
value: '${this.$store.getters.userInfo.dept_name}',
readonly: true,
},
{
type: 'datetimerange',
label: '请假时间',
span: 12,
display: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
prop: 'datetime',
dataType: 'string',
required: true,
rules: [
{
required: true,
message: '开始时间必须填写',
},
],
change: ({ value }) => {
if (!value || value.length == 0) {
this.form.day = undefined;
} else {
const d1 = Date.parse(value.split(',')[0]);
const d2 = Date.parse(value.split(',')[1]);
const day = (d2 - d1) / (1 * 24 * 60 * 60 * 1000);
this.form.days = Number(day.toFixed(2));
}
},
},
{
type: 'number',
label: '请假天数',
span: 12,
display: true,
prop: 'days',
required: true,
rules: [
{
required: true,
message: '请假天数必须填写',
},
],
controls: true,
controlsPosition: 'right',
change: ({ value }) => {
if (value) this.form.reason = '请假' + value + '天';
else this.form.reason = '';
},
},
{
type: 'textarea',
label: '请假理由',
span: 24,
display: true,
prop: 'reason',
required: true,
rules: [
{
required: true,
message: '请假理由必须填写',
},
],
},
{
label: '附件',
type: 'upload',
propsHttp: {
res: 'data',
url: 'link',
name: 'originalName',
},
action: '/blade-resource/oss/endpoint/put-file',
display: true,
span: 24,
showFileList: true,
multiple: true,
limit: 10,
prop: 'attachment',
dataType: 'string',
},
],
},
process: {},
loading: false,
params: null,
};
},
methods: {
getForm(processId, processDefKey) {
let param;
let method;
if (processId) {
param = processId;
method = 'getStartForm';
} else if (processDefKey) {
param = processDefKey;
method = 'getStartFormByProcessDefKey';
}
this[method](param).then(res => {
let { process, startForm } = res;
this.form.processId = process.id;
const option = this.option;
const { column, group } = option;
const groupArr = [];
const columnArr = this.filterAvueColumn(column, startForm, true).column;
if (group && group.length > 0) {
// 处理group
group.forEach(gro => {
gro.column = this.filterAvueColumn(gro.column, startForm, true).column;
if (gro.column.length > 0) groupArr.push(gro);
});
}
if (option.initFunction) {
option.initFunction = eval((option.initFunction + '').replace(/this/g, '_this'));
}
option.column = columnArr;
option.group = groupArr;
this.option = option;
setTimeout(() => {
if (!this.validatenull(this.params)) {
this.form = { ...this.form, ...this.params };
console.log('外部参数赋值', this.params);
}
}, 500);
if (this.permission.wf_process_draft) {
// 查询是否有草稿箱
this.initDraft({ processDefId: process.id }).then(data => {
this.$confirm('是否恢复之前保存的草稿?', '提示', {})
.then(() => {
this.form = JSON.parse(data);
})
.catch(() => {});
});
}
this.waiting = false;
});
},
handleSubmit() {
let form = this.deepClone(this.form);
form = {
...form,
processDefId: form.processId,
formKey: this.process.formKey,
formUrl: this.process.formUrl,
};
startProcess(form).then(res => {
const data = res.data.data;
this.form.processDefKey = this.process.key;
this.form.businessKey = data.id;
this.handleStartProcessByKey(true)
.then((res, done) => {
const processInsId = res.data.data;
submit({ id: data.id, processInsId }).then(() => {
this.$message.success('发起成功');
this.handleCloseTag('/plugin/workflow/pages/process/send');
if (typeof done == 'function') done();
});
})
.catch(() => {
this.loading = false;
});
});
},
},
};
</script>
<style lang="scss" scoped>
.foot-item {
position: fixed;
bottom: 5px;
margin-left: -20px;
// right: 0;
z-index: 101;
height: 66px;
background-color: #fff;
display: flex;
justify-content: center;
align-items: center;
-webkit-transition: 0.3s;
transition: 0.3s;
-webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
</style>