This commit is contained in:
吴红兵
2026-03-07 12:35:45 +08:00
parent 271710e870
commit b997b3ba48
423 changed files with 79612 additions and 91574 deletions

View File

@@ -1,258 +1,261 @@
<template>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading"
:disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type"/>
</el-form-item>
</el-col>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputStartTimeTip')" :disabled="disabledFields.startTime"
v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputStartTimeTip')"
:disabled="disabledFields.startTime"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputEndTimeTip')" :disabled="disabledFields.endTime"
v-model="form.endTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputEndTimeTip')"
:disabled="disabledFields.endTime"
v-model="form.endTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" :disabled="disabledFields.carbonCopyPerson"
remote :remote-method="remoteMethod" :reserve-keyword="false"
clearable filterable multiple>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name"
:value="item.userId">
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.carbonCopyPerson"
:placeholder="t('askLeave.inputCarbonCopyPersonTip')"
:disabled="disabledFields.carbonCopyPerson"
remote
:remote-method="remoteMethod"
:reserve-keyword="false"
clearable
filterable
multiple
>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"> </el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
</el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="data.submitBtn">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{ t('jfI18n.print') }} </el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }}</el-button>
</span>
</footer>
</template>
<template v-else>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{ t('jfI18n.print') }} </el-button>
</span>
</footer>
</template>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="data.submitBtn">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{
t('jfI18n.print')
}}
</el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }}</el-button>
</span>
</footer>
</template>
<template v-else>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{
t('jfI18n.print')
}}
</el-button>
</span>
</footer>
</template>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px"
:title="data.tinymceTitle" append-to-body
@close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="form" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px" :title="data.tinymceTitle" append-to-body @close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="form" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="AskLeaveForm">
import { useMessage } from '/@/hooks/message';
import * as askLeave from '/@/api/order/ask-leave';
import { useI18n } from 'vue-i18n';
import { onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert.ts';
import * as orderVue from '/@/api/order/order-key-vue';
import { handleCustomFormPerm, handleFormPrint } from '/@/flow/utils/form-perm';
import { deepClone } from '/@/utils/other';
import { initCustomFormMethods } from '../index';
import {useMessage} from "/@/hooks/message";
import * as askLeave from '/@/api/order/ask-leave'
import {useI18n} from "vue-i18n"
import {onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey} from "/@/flow/components/convert-name/convert.ts";
import * as orderVue from "/@/api/order/order-key-vue";
import {handleCustomFormPerm, handleFormPrint} from "/@/flow/utils/form-perm";
import {deepClone} from "/@/utils/other";
import {initCustomFormMethods} from "../index";
const { t } = useI18n();
const emits = defineEmits(['handleJob']);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const {t} = useI18n();
const emits = defineEmits(["handleJob"]);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'carbonCopyPerson' });
onMounted(async () => {
// await onLoad(dicData);
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "carbonCopyPerson"});
onMounted(async () => {
// await onLoad(dicData);
});
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'carbonCopyPerson');
}
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "carbonCopyPerson")
}
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 定义校验规则
const dataRules = ref({
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '请假事由不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
startTime: [{required: true, message: '开始时间不能为空', trigger: 'blur'}],
days: [{required: true, message: '请假天数不能为空', trigger: 'blur'}],
remark: [{required: true, message: '请假事由不能为空', trigger: 'blur'}],
})
function initJobData() {
handleGetObj(props.currJob.orderId);
}
function initJobData() {
handleGetObj(props.currJob.orderId)
}
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
};
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
}
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
function handleGetObj(id) {
askLeave.getObj(id).then(async (resp) => {
let formData = resp.data ? resp.data : {};
Object.assign(form, formData);
await onFormLoaded(dicData, form);
form.runJobId = props.currJob.id;
await initFormPermPrint();
});
}
function handleGetObj(id) {
askLeave.getObj(id).then(async resp => {
let formData = resp.data ? resp.data : {}
Object.assign(form, formData)
await onFormLoaded(dicData, form);
form.runJobId = props.currJob.id
await initFormPermPrint()
})
}
const data = reactive({
showTinymceView: false,
tinymceTitle: '',
submitBtn: true,
elTab: null,
});
const data = reactive({
showTinymceView: false,
tinymceTitle: '',
submitBtn: true,
elTab: null
})
const methods = initCustomFormMethods(data, disabledFields, operType);
const methods = initCustomFormMethods(data, disabledFields, operType)
async function initFormPermPrint() {
let elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
// 处理表单权限
let res = await handleCustomFormPerm(props, hiddenFields, disabledFields, elTab);
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback);
// 采用elTab配置的模板
await handleFormPrint(form, elTab.type, elTab.id, '1');
data.elTab = elTab;
}
async function initFormPermPrint() {
let elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
// 处理表单权限
let res = await handleCustomFormPerm(props, hiddenFields, disabledFields, elTab)
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback)
// 采用elTab配置的模板
await handleFormPrint(form, elTab.type, elTab.id, '1')
data.elTab = elTab
}
function printForm() {
closePrint(true, false);
data.tinymceTitle = '请假工单';
data.showTinymceView = true;
}
function printForm() {
closePrint(true, false)
data.tinymceTitle = '请假工单'
data.showTinymceView = true
}
function closePrint(isInit, isSave) {
if (isInit) {
form.formData = form;
form.dicData = { carbonCopyPerson: dicData.carbonCopyPerson };
form['carbonCopyPerson.valueKey'] = 'userId';
form['carbonCopyPerson.showKey'] = 'name';
} else {
delete form.formData;
delete form.dicData;
delete form['carbonCopyPerson.valueKey'];
delete form['carbonCopyPerson.showKey'];
}
if (isSave) delete form.printInfo;
}
function closePrint(isInit, isSave){
if (isInit) {
form.formData = form
form.dicData = {carbonCopyPerson: dicData.carbonCopyPerson}
form['carbonCopyPerson.valueKey'] = 'userId'
form['carbonCopyPerson.showKey'] = 'name'
} else {
delete form.formData
delete form.dicData
delete form['carbonCopyPerson.valueKey']
delete form['carbonCopyPerson.showKey']
}
if (isSave) delete form.printInfo
}
async function submitForm() {
closePrint(false, true);
try {
loading.value = true;
await askLeave.putObj(form);
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
async function submitForm() {
closePrint(false, true)
try {
loading.value = true;
await askLeave.putObj(form)
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits)
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
initJobData();
}
);
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
initJobData();
}
);
onMounted(() => {
initJobData()
});
onMounted(() => {
initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
.el-dialog__footer {
text-align: center;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,307 +1,314 @@
<template>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type"/>
</el-form-item>
</el-col>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputStartTimeTip')" :disabled="disabledFields.startTime"
v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputStartTimeTip')"
:disabled="disabledFields.startTime"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputEndTimeTip')" :disabled="disabledFields.endTime"
v-model="form.endTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputEndTimeTip')"
:disabled="disabledFields.endTime"
v-model="form.endTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" clearable filterable multiple
remote :remote-method="remoteMethod" :reserve-keyword="false"
:disabled="disabledFields.carbonCopyPerson">
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.carbonCopyPerson"
:placeholder="t('askLeave.inputCarbonCopyPersonTip')"
clearable
filterable
multiple
remote
:remote-method="remoteMethod"
:reserve-keyword="false"
:disabled="disabledFields.carbonCopyPerson"
>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="operType !== 'view'">
<div style="text-align: center">
<span class="dialog-footer">
<template v-if="form.status !== DIC_PROP.ORDER_STATUS[0].value">
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('jfI18n.initialBtn') }}</el-button>
<el-button @click="onRefresh()">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onTemp" :disabled="loading">{{ $t('jfI18n.temp') }}</el-button>
</template>
<template v-else>
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{
t('jfI18n.print')
}}
</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.editBtn') }}</el-button>
</template>
</span>
</div>
</template>
<template v-if="operType === 'view'">
<footer class="el-dialog__footer">
<div style="text-align: center">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{
t('jfI18n.print')
}}
</el-button>
</span>
</div>
</footer>
</template>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px"
:title="data.tinymceTitle" append-to-body
@close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="form" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="operType !== 'view'">
<div style="text-align: center">
<span class="dialog-footer">
<template v-if="form.status !== DIC_PROP.ORDER_STATUS[0].value">
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('jfI18n.initialBtn') }}</el-button>
<el-button @click="onRefresh()">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onTemp" :disabled="loading">{{ $t('jfI18n.temp') }}</el-button>
</template>
<template v-else>
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{ t('jfI18n.print') }} </el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.editBtn') }}</el-button>
</template>
</span>
</div>
</template>
<template v-if="operType === 'view'">
<footer class="el-dialog__footer">
<div style="text-align: center">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.printInfo">{{ t('jfI18n.print') }} </el-button>
</span>
</div>
</footer>
</template>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px" :title="data.tinymceTitle" append-to-body @close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="form" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="AskLeaveDialog">
import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj, tempStore } from '/@/api/order/ask-leave';
import { useI18n } from 'vue-i18n';
import { rule, validateNull } from '/@/utils/validate';
import { onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert.ts';
import * as common from '/@/flow/support/common';
import { handleFormPrint, handleFormStartPerm } from '/@/flow/utils/form-perm';
import { currFormIsView, orderKeyMap } from '/@/api/order/order-key-vue';
import { deepClone } from '/@/utils/other';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import { initCustomFormMethods } from '../index';
import { useMessage } from "/@/hooks/message";
import {getObj, addObj, putObj, tempStore} from '/@/api/order/ask-leave'
import { useI18n } from "vue-i18n"
import {rule, validateNull} from '/@/utils/validate';
import {onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey} from "/@/flow/components/convert-name/convert.ts";
import * as common from '/@/flow/support/common'
import {handleFormPrint, handleFormStartPerm} from "/@/flow/utils/form-perm";
import {currFormIsView, orderKeyMap} from "/@/api/order/order-key-vue";
import {deepClone} from "/@/utils/other";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import {initCustomFormMethods} from "../index";
const emit = defineEmits(['refresh']);
const { t } = useI18n();
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const emit = defineEmits(['refresh']);
const { t } = useI18n();
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'carbonCopyPerson' });
onMounted(async () => {
// await onLoad(dicData);
await openDialog(props.formData.type, props.formData.id);
});
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "carbonCopyPerson"});
onMounted(async () => {
// await onLoad(dicData);
await openDialog(props.formData.type, props.formData.id)
});
const props = defineProps({
formData: {
type: Object,
default: null,
},
});
const props = defineProps({
formData: {
type: Object,
default: null,
}
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 定义校验规则
const dataRules = ref({
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '请假事由不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
startTime: [{required: true, message: '开始时间不能为空', trigger: 'blur'}],
days: [{required: true, message: '请假天数不能为空', trigger: 'blur'}],
remark: [{required: true, message: '请假事由不能为空', trigger: 'blur'}],
})
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
};
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
}
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
// 打开弹窗
const openDialog = async (type: string, id: string) => {
visible.value = true;
operType.value = type;
form.id = '';
// 打开弹窗
const openDialog = async (type: string, id: string) => {
visible.value = true
operType.value = type;
form.id = ''
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
} else if (type === 'copy') {
title.value = t('common.copyBtn');
}
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
} else if (type === 'copy') {
title.value = t('common.copyBtn');
}
// 重置表单数据
nextTick(async () => {
dataFormRef.value?.resetFields();
// 获取AskLeave信息
if (id) {
form.id = id;
await getAskLeaveData(id);
}
await initFormPermPrint();
});
};
// 重置表单数据
nextTick(async () => {
dataFormRef.value?.resetFields();
// 获取AskLeave信息
if (id) {
form.id = id
await getAskLeaveData(id)
}
await initFormPermPrint()
});
const data = reactive({
showTinymceView: false,
tinymceTitle: '',
elTab: null,
});
};
const methods = initCustomFormMethods(data, disabledFields);
const data = reactive({
showTinymceView: false,
tinymceTitle: '',
elTab: null
})
async function initFormPermPrint() {
// 处理表单权限 开始节点必须配置表单
let res = await handleFormStartPerm(hiddenFields, disabledFields, null, null, orderKeyMap.AskLeave, null);
await currFormIsView(methods, res.elTab, true, res.callback);
// 采用elTab配置的模板
await handleFormPrint(form, res.elTab.type, res.elTab.id, '1');
data.elTab = res.elTab;
}
const methods = initCustomFormMethods(data, disabledFields)
function printForm() {
closePrint(true, false);
data.tinymceTitle = '请假工单';
data.showTinymceView = true;
}
async function initFormPermPrint() {
// 处理表单权限 开始节点必须配置表单
let res = await handleFormStartPerm(hiddenFields, disabledFields, null, null, orderKeyMap.AskLeave, null);
await currFormIsView(methods, res.elTab, true, res.callback)
// 采用elTab配置的模板
await handleFormPrint(form, res.elTab.type, res.elTab.id, '1')
data.elTab = res.elTab
}
function closePrint(isInit, isSave) {
if (isInit) {
form.formData = form;
form.dicData = { carbonCopyPerson: dicData.carbonCopyPerson };
form['carbonCopyPerson.valueKey'] = 'userId';
form['carbonCopyPerson.showKey'] = 'name';
} else {
delete form.formData;
delete form.dicData;
delete form['carbonCopyPerson.valueKey'];
delete form['carbonCopyPerson.showKey'];
}
if (isSave) delete form.printInfo;
}
function printForm() {
closePrint(true, false)
data.tinymceTitle = '请假工单'
data.showTinymceView = true
}
// 暂存
const onTemp = async () => {
closePrint(false, true);
function closePrint(isInit, isSave){
if (isInit) {
form.formData = form
form.dicData = {carbonCopyPerson: dicData.carbonCopyPerson}
form['carbonCopyPerson.valueKey'] = 'userId'
form['carbonCopyPerson.showKey'] = 'name'
} else {
delete form.formData
delete form.dicData
delete form['carbonCopyPerson.valueKey']
delete form['carbonCopyPerson.showKey']
}
if (isSave) delete form.printInfo
}
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
await tempStore(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
onRefresh();
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 暂存
const onTemp = async () => {
closePrint(false, true)
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'carbonCopyPerson');
}
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone);
try {
loading.value = true;
await tempStore(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
onRefresh();
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
closePrint(false, true);
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "carbonCopyPerson")
}
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
form.status !== DIC_PROP.ORDER_STATUS[0].value ? await addObj(form) : await putObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
onRefresh();
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
closePrint(false, true)
const onRefresh = () => {
emit('refresh');
};
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone)
try {
loading.value = true;
form.status !== DIC_PROP.ORDER_STATUS[0].value ? await addObj(form) : await putObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
onRefresh();
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getAskLeaveData = async (id: string) => {
// 获取数据
loading.value = true;
let res = await getObj(id);
loading.value = false;
Object.assign(form, res.data);
await onFormLoaded(dicData, form);
let clone = { operType: operType.value, form: form };
common.handleClone(clone);
};
const onRefresh = () => {
emit('refresh');
}
async function getFormData() {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
return form;
}
// 初始化表单数据
const getAskLeaveData = async (id: string) => {
// 获取数据
loading.value = true
let res = await getObj(id)
loading.value = false
Object.assign(form, res.data)
await onFormLoaded(dicData, form);
let clone = {operType: operType.value, form: form};
common.handleClone(clone);
};
async function getFormData() {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
return form
}
// 暴露变量
defineExpose({
openDialog,
getFormData
});
// 暴露变量
defineExpose({
openDialog,
getFormData,
});
</script>

View File

@@ -1,44 +1,43 @@
export default {
askLeave: {
index: '#',
importaskLeaveTip: 'import AskLeave',
id: 'id',
code: 'code',
flowKey: 'flowKey',
type: 'type',
startTime: 'startTime',
endTime: 'endTime',
days: 'days',
carbonCopyPerson: 'carbonCopyPerson',
remark: 'remark',
status: 'status',
finishTime: 'finishTime',
createUser: 'createUser',
createTime: 'createTime',
flowInstId: 'flowInstId',
imgUrls: 'imgUrls',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputTypeTip: 'input type',
inputStartTimeTip: 'input startTime',
inputEndTimeTip: 'input endTime',
inputDaysTip: 'input days',
inputCarbonCopyPersonTip: 'input carbonCopyPerson',
inputRemarkTip: 'input remark',
inputStatusTip: 'input status',
inputFinishTimeTip: 'input finishTime',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputFlowInstIdTip: 'input flowInstId',
inputImgUrlsTip: 'input imgUrls',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
}
}
askLeave: {
index: '#',
importaskLeaveTip: 'import AskLeave',
id: 'id',
code: 'code',
flowKey: 'flowKey',
type: 'type',
startTime: 'startTime',
endTime: 'endTime',
days: 'days',
carbonCopyPerson: 'carbonCopyPerson',
remark: 'remark',
status: 'status',
finishTime: 'finishTime',
createUser: 'createUser',
createTime: 'createTime',
flowInstId: 'flowInstId',
imgUrls: 'imgUrls',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputTypeTip: 'input type',
inputStartTimeTip: 'input startTime',
inputEndTimeTip: 'input endTime',
inputDaysTip: 'input days',
inputCarbonCopyPersonTip: 'input carbonCopyPerson',
inputRemarkTip: 'input remark',
inputStatusTip: 'input status',
inputFinishTimeTip: 'input finishTime',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputFlowInstIdTip: 'input flowInstId',
inputImgUrlsTip: 'input imgUrls',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
},
};

View File

@@ -1,44 +1,43 @@
export default {
askLeave: {
index: '#',
importaskLeaveTip: '导入请假工单',
id: '主键id',
code: '工单编号',
flowKey: '流程KEY',
type: '请假类型',
startTime: '开始时间',
endTime: '结束时间',
days: '请假天数',
carbonCopyPerson: '抄送人',
remark: '请假事由',
status: '状态',
finishTime: '完成时间',
createUser: '创建人',
createTime: '创建时间',
flowInstId: '流程实例ID',
imgUrls: '上传文档',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入流程KEY',
inputTypeTip: '请输入请假类型',
inputStartTimeTip: '请输入开始时间',
inputEndTimeTip: '请输入结束时间',
inputDaysTip: '请输入请假天数',
inputCarbonCopyPersonTip: '请输入抄送人',
inputRemarkTip: '请输入请假事由',
inputStatusTip: '请输入状态',
inputFinishTimeTip: '请输入完成时间',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputFlowInstIdTip: '请输入流程实例ID',
inputImgUrlsTip: '请输入上传文档',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
}
}
askLeave: {
index: '#',
importaskLeaveTip: '导入请假工单',
id: '主键id',
code: '工单编号',
flowKey: '流程KEY',
type: '请假类型',
startTime: '开始时间',
endTime: '结束时间',
days: '请假天数',
carbonCopyPerson: '抄送人',
remark: '请假事由',
status: '状态',
finishTime: '完成时间',
createUser: '创建人',
createTime: '创建时间',
flowInstId: '流程实例ID',
imgUrls: '上传文档',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入流程KEY',
inputTypeTip: '请输入请假类型',
inputStartTimeTip: '请输入开始时间',
inputEndTimeTip: '请输入结束时间',
inputDaysTip: '请输入请假天数',
inputCarbonCopyPersonTip: '请输入抄送人',
inputRemarkTip: '请输入请假事由',
inputStatusTip: '请输入状态',
inputFinishTimeTip: '请输入完成时间',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputFlowInstIdTip: '请输入流程实例ID',
inputImgUrlsTip: '请输入上传文档',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
},
};

View File

@@ -1,304 +1,303 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('askLeave.code')" prop="code" >
<el-input :placeholder="t('askLeave.inputCodeTip')" v-model="state.queryForm.code" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('askLeave.status')" prop="status">
<el-select v-model="state.queryForm.status" :placeholder="t('askLeave.inputStatusTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.ORDER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{
$t('common.resetBtn')
}}
</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('askLeave.code')" prop="code">
<el-input :placeholder="t('askLeave.inputCodeTip')" v-model="state.queryForm.code" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('askLeave.status')" prop="status">
<el-select v-model="state.queryForm.status" :placeholder="t('askLeave.inputStatusTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.ORDER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }} </el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.addBtn') }}
</template>
<el-button icon="Plus" type="primary" class="ml10" @click="openDialog('add')" v-auth="'order_askleave_add'"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button
plain
:disabled="multiple"
icon="Delete"
type="primary"
class="ml10"
v-auth="'order_askleave_del'"
@click="handleDelete(selectObjs)"
>
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.addBtn') }}
</template>
<el-button icon="Plus" type="primary" class="ml10" @click="openDialog('add')"
v-auth="'order_askleave_add'">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button plain :disabled="multiple" icon="Delete" type="primary" class="ml10"
v-auth="'order_askleave_del'" @click="handleDelete(selectObjs)">
</el-button>
</el-tooltip>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_askleave_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('askLeave.index')" width="40" />
<el-table-column prop="code" :label="t('askLeave.code')" show-overflow-tooltip />
<el-table-column prop="flowKey" :label="t('askLeave.flowKey')" show-overflow-tooltip />
<el-table-column prop="type" :label="t('askLeave.type')" show-overflow-tooltip />
<el-table-column prop="startTime" :label="t('askLeave.startTime')" show-overflow-tooltip />
<el-table-column prop="endTime" :label="t('askLeave.endTime')" show-overflow-tooltip />
<el-table-column prop="days" :label="t('askLeave.days')" show-overflow-tooltip />
<el-table-column prop="carbonCopyPerson" :label="t('askLeave.carbonCopyPerson')" show-overflow-tooltip>
<template #default="scope">
<convert-name
:options="state.dicData.carbonCopyPerson"
:value="scope.row.carbonCopyPerson"
:valueKey="'userId'"
:showKey="'name'"
></convert-name>
</template>
</el-table-column>
<el-table-column prop="remark" :label="t('askLeave.remark')" show-overflow-tooltip />
<el-table-column prop="status" :label="t('askLeave.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.ORDER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="finishTime" :label="t('askLeave.finishTime')" show-overflow-tooltip />
<el-table-column prop="createUser" :label="t('askLeave.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('askLeave.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="150">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="openDialog('view', scope.row.id)"> </el-button>
</el-tooltip>
<right-toolbar v-model:showSearch="showSearch" :export="'order_askleave_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" :label="t('askLeave.index')" width="40"/>
<el-table-column prop="code" :label="t('askLeave.code')" show-overflow-tooltip/>
<el-table-column prop="flowKey" :label="t('askLeave.flowKey')" show-overflow-tooltip/>
<el-table-column prop="type" :label="t('askLeave.type')" show-overflow-tooltip/>
<el-table-column prop="startTime" :label="t('askLeave.startTime')" show-overflow-tooltip/>
<el-table-column prop="endTime" :label="t('askLeave.endTime')" show-overflow-tooltip/>
<el-table-column prop="days" :label="t('askLeave.days')" show-overflow-tooltip/>
<el-table-column prop="carbonCopyPerson" :label="t('askLeave.carbonCopyPerson')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.carbonCopyPerson" :value="scope.row.carbonCopyPerson"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="remark" :label="t('askLeave.remark')" show-overflow-tooltip/>
<el-table-column prop="status" :label="t('askLeave.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.ORDER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="finishTime" :label="t('askLeave.finishTime')" show-overflow-tooltip/>
<el-table-column prop="createUser" :label="t('askLeave.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('askLeave.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="150">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="openDialog('view', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content> 打印表单 </template>
<el-button icon="Document" text type="primary" @click="openDialog('view', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
打印表单
</template>
<el-button icon="Document" text type="primary" @click="openDialog('view', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.copyBtn') }}
</template>
<el-button icon="DocumentCopy" text type="primary" @click="openDialog('copy', scope.row.id, scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.copyBtn') }}
</template>
<el-button icon="DocumentCopy" text type="primary" @click="openDialog('copy', scope.row.id, scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.flowInstId">
<template #content>
{{ $t('jfI18n.viewFlow') }}
</template>
<el-button text type="primary" icon="Share" @click="openPreview(scope.row)"></el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.flowInstId">
<template #content>
{{ $t('jfI18n.viewFlow') }}
</template>
<el-button text type="primary" icon="Share" @click="openPreview(scope.row)"></el-button>
</el-tooltip>
<el-tooltip
placement="top"
v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value || scope.row.status === DIC_PROP.ORDER_STATUS[0].value"
>
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="openDialog('edit', scope.row.id, scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])"> </el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value || scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="openDialog('edit', scope.row.id, scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])">
</el-button>
</el-tooltip>
<!-- 发起工单 -->
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="refresh">
<template v-slot="slotProps" v-if="showInitiateOrder">
<form-dialog ref="form" v-show="slotProps.currActive === 'form'" :formData="formData" @refresh="refresh" />
</template>
</json-flow-predict>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
v-bind="state.pagination"/>
</div>
<!-- 发起工单 -->
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="refresh">
<template v-slot="slotProps" v-if="showInitiateOrder">
<form-dialog ref="form" v-show="slotProps.currActive === 'form'" :formData="formData" @refresh="refresh"/>
</template>
</json-flow-predict>
<!-- 编辑新增 -->
<el-dialog title="请假工单" v-model="showFormDialog" width="60%"
:close-on-click-modal="false" draggable>
<form-dialog v-if="showFormDialog" ref="formDialogRef" :formData="formData" @refresh="refresh"/>
</el-dialog>
</div>
<!-- 编辑新增 -->
<el-dialog title="请假工单" v-model="showFormDialog" width="60%" :close-on-click-modal="false" draggable>
<form-dialog v-if="showFormDialog" ref="formDialogRef" :formData="formData" @refresh="refresh" />
</el-dialog>
</div>
</template>
<script setup lang="ts" name="systemAskLeave">
import {BasicTableProps, useTable} from "/@/hooks/table";
import {fetchList, delObjs} from "/@/api/order/ask-leave";
import {useMessage, useMessageBox} from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from '/@/api/order/ask-leave';
import { useMessage, useMessageBox } from '/@/hooks/message';
import {useI18n} from "vue-i18n";
import {onCascadeChange, onLoadDicUrl, onLoaded} from "/@/flow/components/convert-name/convert";
import {recallReset} from "/@/api/jsonflow/run-flow";
import {openFlowPreview} from "/@/flow/support/extend";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import {orderKeyMap} from "/@/api/order/order-key-vue";
import { useI18n } from 'vue-i18n';
import { onCascadeChange, onLoadDicUrl, onLoaded } from '/@/flow/components/convert-name/convert';
import { recallReset } from '/@/api/jsonflow/run-flow';
import { openFlowPreview } from '/@/flow/support/extend';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import { orderKeyMap } from '/@/api/order/order-key-vue';
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
const {t} = useI18n()
const {proxy} = getCurrentInstance();
// 定义查询字典
const dicData = reactive({});
// const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
// 定义变量内容
const formDialogRef = ref()
const showFormDialog = ref(false)
const showInitiateOrder = ref(false)
const formData = ref({})
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
const { t } = useI18n();
const { proxy } = getCurrentInstance();
// 定义查询字典
const dicData = reactive({});
// const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
// 定义变量内容
const formDialogRef = ref();
const showFormDialog = ref(false);
const showInitiateOrder = ref(false);
const formData = ref({});
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({key: "createUser"}, {key: "carbonCopyPerson"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({ key: 'createUser' }, { key: 'carbonCopyPerson' }),
descs: ['create_time'],
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/ask-leave/export', state.queryForm, 'ask-leave.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/ask-leave/export', state.queryForm, 'ask-leave.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
function handleRecallReset(row) {
let params = {id: row.flowInstId, flowKey: row.flowKey, status: row.status}
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
})
return
}
useMessageBox().confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params)
}).then(() => {
useMessage().success('撤回成功')
getDataList();
})
}
function handleRecallReset(row) {
let params = { id: row.flowInstId, flowKey: row.flowKey, status: row.status };
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
});
return;
}
useMessageBox()
.confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params);
})
.then(() => {
useMessage().success('撤回成功');
getDataList();
});
}
const $router = useRouter();
function openPreview(row) {
openFlowPreview($router, {flowInstId: row.flowInstId}, '1')
}
const $router = useRouter();
function openPreview(row) {
openFlowPreview($router, { flowInstId: row.flowInstId }, '1');
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool)
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool);
}
// 打开弹窗
const openDialog = (type?: string, id?: string, row?) => {
formData.value = {type, id}
if (type === 'add' || type === 'edit' || type === 'copy') {
showInitiateOrder.value = true
if (type === 'add') {
openPredict({flowKey: orderKeyMap.AskLeave}, true)
} else {
openPredict(row, true)
}
} else {
showFormDialog.value = true
}
}
function refresh() {
getDataList(false)
openPredict({}, false)
showInitiateOrder.value = false
showFormDialog.value = false
}
// 打开弹窗
const openDialog = (type?: string, id?: string, row?) => {
formData.value = { type, id };
if (type === 'add' || type === 'edit' || type === 'copy') {
showInitiateOrder.value = true;
if (type === 'add') {
openPredict({ flowKey: orderKeyMap.AskLeave }, true);
} else {
openPredict(row, true);
}
} else {
showFormDialog.value = true;
}
};
function refresh() {
getDataList(false);
openPredict({}, false);
showInitiateOrder.value = false;
showFormDialog.value = false;
}
</script>

View File

@@ -1,88 +1,87 @@
<template>
<el-dialog :title="title" v-model="visible" width="80%" append-to-body
:close-on-click-modal="false" draggable @closed="onCancel">
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="100px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.tableName')" prop="tableName">
<el-input v-model="form.tableName" :placeholder="t('createTable.inputTableNameTip')"/>
</el-form-item>
</el-col>
<el-dialog :title="title" v-model="visible" width="80%" append-to-body :close-on-click-modal="false" draggable @closed="onCancel">
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="100px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.tableName')" prop="tableName">
<el-input v-model="form.tableName" :placeholder="t('createTable.inputTableNameTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.comments')" prop="comments">
<el-input v-model="form.comments" :placeholder="t('createTable.inputCommentsTip')"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.comments')" prop="comments">
<el-input v-model="form.comments" :placeholder="t('createTable.inputCommentsTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.databaseType')" prop="databaseType">
<el-select v-model="form.databaseType" :placeholder="t('createTable.databaseType')">
<el-option v-for="(item, index) in DIC_PROP.DATABASE_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.databaseType')" prop="databaseType">
<el-select v-model="form.databaseType" :placeholder="t('createTable.databaseType')">
<el-option v-for="(item, index) in DIC_PROP.DATABASE_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.pkPolicy')" prop="pkPolicy">
<el-select v-model="form.pkPolicy" :placeholder="t('createTable.inputPkPolicyTip')" clearable>
<el-option label="ID_WORKER(分布式自增)" value="ID_WORKER"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.pkPolicy')" prop="pkPolicy">
<el-select v-model="form.pkPolicy" :placeholder="t('createTable.inputPkPolicyTip')" clearable>
<el-option label="ID_WORKER(分布式自增)" value="ID_WORKER"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.primaryKey')" prop="primaryKey">
<el-select v-model="form.primaryKey" :placeholder="t('createTable.inputPrimaryKeyTip')" clearable>
<el-option v-for="(item, index) in form.columns" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('createTable.primaryKey')" prop="primaryKey">
<el-select v-model="form.primaryKey" :placeholder="t('createTable.inputPrimaryKeyTip')" clearable>
<el-option v-for="(item, index) in form.columns" :key="index" :label="item.name" :value="item.name"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item :label="t('createTable.columnInfo')" prop="columns">
<el-table :data="form.columns" border style="width: 100%" max-height="500">
<el-table-column type="index" :label="t('createTable.index')" width="80">
<template #header>
<el-button icon="Plus" size="small" type="primary" circle @click="onAddItem"></el-button>
</template>
<template #default="scope">
<el-button icon="Minus" size="small" type="danger" circle @click="handleDelete(scope.$index, scope.row)"></el-button>
</template>
</el-table-column>
<el-table-column prop="name" :label="t('createTable.name')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.name" :placeholder="t('createTable.name')"/>
</template>
</el-table-column>
<el-table-column prop="comment" :label="t('createTable.comment')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.comment" :placeholder="t('createTable.comment')"/>
</template>
</el-table-column>
<el-table-column prop="typeName" :label="t('createTable.typeName')" show-overflow-tooltip>
<template #default="scope">
<el-select v-model="scope.row.typeName" :placeholder="t('createTable.typeName')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.COLUMN_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="precision" :label="t('createTable.precision')" show-overflow-tooltip>
<template #default="scope">
<el-input-number :min="0" :max="10000" v-model="scope.row.precision" :placeholder="t('createTable.precision')"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="scale" :label="t('createTable.scale')" show-overflow-tooltip>
<template #default="scope">
<el-input-number :min="0" :max="10000" v-model="scope.row.scale" :placeholder="t('createTable.scale')"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="defaultValue" :label="t('createTable.defaultValue')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.defaultValue" :placeholder="t('createTable.defaultValue')"/>
</template>
</el-table-column>
<!-- <el-table-column prop="primary" :label="t('createTable.primaryKey')" show-overflow-tooltip>
<el-col :span="24" class="mb20">
<el-form-item :label="t('createTable.columnInfo')" prop="columns">
<el-table :data="form.columns" border style="width: 100%" max-height="500">
<el-table-column type="index" :label="t('createTable.index')" width="80">
<template #header>
<el-button icon="Plus" size="small" type="primary" circle @click="onAddItem"></el-button>
</template>
<template #default="scope">
<el-button icon="Minus" size="small" type="danger" circle @click="handleDelete(scope.$index, scope.row)"></el-button>
</template>
</el-table-column>
<el-table-column prop="name" :label="t('createTable.name')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.name" :placeholder="t('createTable.name')" />
</template>
</el-table-column>
<el-table-column prop="comment" :label="t('createTable.comment')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.comment" :placeholder="t('createTable.comment')" />
</template>
</el-table-column>
<el-table-column prop="typeName" :label="t('createTable.typeName')" show-overflow-tooltip>
<template #default="scope">
<el-select v-model="scope.row.typeName" :placeholder="t('createTable.typeName')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.COLUMN_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column prop="precision" :label="t('createTable.precision')" show-overflow-tooltip>
<template #default="scope">
<el-input-number :min="0" :max="10000" v-model="scope.row.precision" :placeholder="t('createTable.precision')"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="scale" :label="t('createTable.scale')" show-overflow-tooltip>
<template #default="scope">
<el-input-number :min="0" :max="10000" v-model="scope.row.scale" :placeholder="t('createTable.scale')"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="defaultValue" :label="t('createTable.defaultValue')" show-overflow-tooltip>
<template #default="scope">
<el-input v-model="scope.row.defaultValue" :placeholder="t('createTable.defaultValue')" />
</template>
</el-table-column>
<!-- <el-table-column prop="primary" :label="t('createTable.primaryKey')" show-overflow-tooltip>
<template #default="scope">
<el-radio-group v-model="scope.row.primary">
<el-radio v-for="(item, index) in DIC_PROP.YES_OR_NO_NUM" :key="index" :label="item.value" >
@@ -91,193 +90,211 @@
</el-radio-group>
</template>
</el-table-column>-->
<el-table-column prop="nullable" :label="t('createTable.nullable')" show-overflow-tooltip>
<template #default="scope">
<el-radio-group v-model="scope.row.nullable">
<el-radio v-for="(item, index) in DIC_PROP.YES_OR_NO_NUM" :key="index" :label="item.value" >
{{ getLabelByLanguage(item) }}
</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
<el-table-column prop="nullable" :label="t('createTable.nullable')" show-overflow-tooltip>
<template #default="scope">
<el-radio-group v-model="scope.row.nullable">
<el-radio v-for="(item, index) in DIC_PROP.YES_OR_NO_NUM" :key="index" :label="item.value">
{{ getLabelByLanguage(item) }}
</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="CreateTableDialog">
import { useMessage, useMessageBox } from '/@/hooks/message';
import { getObj, addObj, putObj } from '/@/api/order/create-table';
import { useI18n } from 'vue-i18n';
import { rule, validateNull } from '/@/utils/validate';
import { utils } from '/@/flow/designer/utils/common';
const emit = defineEmits(['refreshDone', 'refresh']);
import {useMessage, useMessageBox} from "/@/hooks/message";
import { getObj, addObj, putObj } from '/@/api/order/create-table'
import { useI18n } from "vue-i18n"
import {rule, validateNull} from '/@/utils/validate';
import {utils} from "/@/flow/designer/utils/common";
const emit = defineEmits(['refreshDone', 'refresh']);
const { t } = useI18n();
const { t } = useI18n();
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
// 提交表单数据
const form = reactive({
tableName: '',
comments: '',
databaseType: 'MySQL',
pkPolicy: 'ID_WORKER',
columns: [],
});
// 提交表单数据
const form = reactive({
tableName: '',
comments: '',
databaseType: 'MySQL',
pkPolicy: 'ID_WORKER',
columns: [],
});
/**
* 校验数据源名
* @param {校验数据源名} rule
* @param {*} value
* @param {*} callback
*/
let validateDsName = (rule, value, callback) => {
let re = /(?=.*[a-z]|[A-Z])(?=.*_)/;
if (value && !re.test(value)) {
callback(new Error('数据源名称不合法, 组名_数据源名形式'));
} else {
callback();
}
};
/**
* 校验数据源名
* @param {校验数据源名} rule
* @param {*} value
* @param {*} callback
*/
let validateDsName = (rule, value, callback) => {
let re = /(?=.*[a-z]|[A-Z])(?=.*_)/;
if (value && (!(re).test(value))) {
callback(new Error('数据源名称不合法, 组名_数据源名形式'))
} else {
callback()
}
}
// 定义校验规则
const dataRules = ref({
tableName: [
{ required: true, message: '表名称不能为空', trigger: 'blur' },
{ max: 32, message: '长度在 32 个字符', trigger: 'blur' },
{ validator: validateDsName, trigger: 'blur' },
],
comments: [{ required: true, message: '表注释不能为空', trigger: 'blur' }],
databaseType: [{ required: true, message: '数据库类型不能为空', trigger: 'blur' }],
pkPolicy: [{ required: true, message: '主键策略不能为空', trigger: 'blur' }],
primaryKey: [{ required: true, message: '主键字段不能为空', trigger: 'blur' }],
columns: [{ required: true, message: '字段信息不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
tableName: [
{required: true, message: '表名称不能为空', trigger: 'blur'},
{max: 32, message: '长度在 32 个字符', trigger: 'blur'},
{validator: validateDsName, trigger: 'blur'}
],
comments: [{required: true, message: '表注释不能为空', trigger: 'blur'}],
databaseType: [{required: true, message: '数据库类型不能为空', trigger: 'blur'}],
pkPolicy: [{required: true, message: '主键策略不能为空', trigger: 'blur'}],
primaryKey: [{required: true, message: '主键字段不能为空', trigger: 'blur'}],
columns: [{required: true, message: '字段信息不能为空', trigger: 'blur'}],
})
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true;
operType.value = type;
form.id = '';
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true
operType.value = type;
form.id = ''
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
if (!id) onAddItem();
});
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
if (!id) onAddItem()
});
// 获取CreateTable信息
if (id) {
form.id = id;
getCreateTableData(id);
}
};
// 获取CreateTable信息
if (id) {
form.id = id
getCreateTableData(id)
}
};
const isOnSubmitRef = ref(false);
const onCancel = async () => {
emit('refreshDone', form.tableName, operType.value, isOnSubmitRef.value);
};
const isOnSubmitRef = ref(false);
const onCancel = async () => {
emit('refreshDone', form.tableName, operType.value, isOnSubmitRef.value);
}
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
try {
if (form.id) {
await useMessageBox().confirm('注意若已有表中存在数据时,修改字段类型可能会报错。请确保数据值可自由转换');
}
} catch {
return;
}
try {
if (form.id) {
await useMessageBox().confirm("注意若已有表中存在数据时,修改字段类型可能会报错。请确保数据值可自由转换");
}
} catch {
return;
}
try {
loading.value = true;
form.columnInfo = JSON.stringify(form.columns);
let columns = {};
form.columns.forEach((each) => {
if (validateNull(each.defaultValue)) each.defaultValue = null;
columns[each.name] = each;
});
form.columnsInfo = JSON.stringify(columns);
await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
isOnSubmitRef.value = true;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
try {
loading.value = true;
form.columnInfo = JSON.stringify(form.columns)
let columns = {}
form.columns.forEach(each => {
if (validateNull(each.defaultValue)) each.defaultValue = null
columns[each.name] = each
})
form.columnsInfo = JSON.stringify(columns)
await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
isOnSubmitRef.value = true;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getCreateTableData = (id: string) => {
// 获取数据
loading.value = true;
getObj(id)
.then((res: any) => {
let columnInfo = res.data.columnInfo;
res.data.columns = validateNull(columnInfo) ? [] : JSON.parse(columnInfo);
Object.assign(form, res.data);
})
.finally(() => {
loading.value = false;
});
};
// 初始化表单数据
const getCreateTableData = (id: string) => {
// 获取数据
loading.value = true
getObj(id).then((res: any) => {
let columnInfo = res.data.columnInfo;
res.data.columns = validateNull(columnInfo) ? [] : JSON.parse(columnInfo);
Object.assign(form, res.data)
}).finally(() => {
loading.value = false
})
};
const onAddItem = () => {
let find = form.columns.find((f) => f.name === 'id');
if (find) {
let obj = { name: '', comment: '', typeName: '', precision: 0, scale: 0, defaultValue: null, nullable: 1, uniId: utils.getId() };
form.columns.push(obj);
return;
}
// primary 1是0否默认-1
let id = { name: 'id', comment: '主键', typeName: 'bigint', precision: 20, scale: 0, defaultValue: null, nullable: 0, uniId: utils.getId() };
let create_user = {
name: 'create_user',
comment: '创建人',
typeName: 'bigint',
precision: 20,
scale: 0,
defaultValue: null,
nullable: 0,
uniId: utils.getId(),
};
let create_time = {
name: 'create_time',
comment: '创建时间',
typeName: 'date',
precision: 0,
scale: 0,
defaultValue: null,
nullable: 1,
uniId: utils.getId(),
};
form.columns.push(id);
form.columns.push(create_user);
form.columns.push(create_time);
form.primaryKey = id.name;
};
const onAddItem = () => {
let find = form.columns.find(f => f.name === 'id');
if (find) {
let obj = {name: '', comment: '', typeName: '', precision: 0, scale: 0, defaultValue: null, nullable: 1, uniId: utils.getId()};
form.columns.push(obj);
return
}
// primary 1是0否默认-1
let id = {name: 'id', comment: '主键', typeName: 'bigint', precision: 20, scale: 0, defaultValue: null, nullable: 0, uniId: utils.getId()};
let create_user = {name: 'create_user', comment: '创建人', typeName: 'bigint', precision: 20, scale: 0, defaultValue: null, nullable: 0, uniId: utils.getId()};
let create_time = {name: 'create_time', comment: '创建时间', typeName: 'date', precision: 0, scale: 0, defaultValue: null, nullable: 1, uniId: utils.getId()};
form.columns.push(id);
form.columns.push(create_user);
form.columns.push(create_time);
form.primaryKey = id.name
}
const handleDelete = (index: number, row: any) => {
if (row.name === 'id' || row.name === 'create_user' || row.name === 'create_time') {
useMessage().warning('不能删除【主键】、【创建人】、【创建时间】');
return;
}
form.columns.splice(index, 1);
};
const handleDelete = (index: number, row: any) => {
if (row.name === 'id' || row.name === 'create_user' || row.name === 'create_time') {
useMessage().warning("不能删除【主键】、【创建人】、【创建时间】");
return
}
form.columns.splice(index, 1)
}
// 暴露变量
defineExpose({
openDialog
});
// 暴露变量
defineExpose({
openDialog,
});
</script>

View File

@@ -1,34 +1,34 @@
export default {
createTable: {
index: '#',
importcreateTableTip: 'import CreateTable',
id: 'id',
tableName: 'tableName',
comments: 'comments',
comment: 'comment',
databaseType: 'databaseType',
pkPolicy: 'pkPolicy',
createUser: 'createUser',
createTime: 'createTime',
columnInfo: 'columnInfo',
primaryKey: 'primaryKey',
inputIdTip: 'input id',
inputTableNameTip: 'input tableName',
inputCommentsTip: 'input comments',
inputCommentTip: 'input comment',
inputDatabaseTypeTip: 'input databaseType',
inputPkPolicyTip: 'input pkPolicy',
inputPrimaryKeyTip: 'input primaryKey',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputColumnInfoTip: 'input columnInfo',
name: 'name',
typeName: 'typeName',
precision: 'precision',
scale: 'scale',
defaultValue: 'defaultValue',
nullable: 'nullable',
}
}
createTable: {
index: '#',
importcreateTableTip: 'import CreateTable',
id: 'id',
tableName: 'tableName',
comments: 'comments',
comment: 'comment',
databaseType: 'databaseType',
pkPolicy: 'pkPolicy',
createUser: 'createUser',
createTime: 'createTime',
columnInfo: 'columnInfo',
primaryKey: 'primaryKey',
inputIdTip: 'input id',
inputTableNameTip: 'input tableName',
inputCommentsTip: 'input comments',
inputCommentTip: 'input comment',
inputDatabaseTypeTip: 'input databaseType',
inputPkPolicyTip: 'input pkPolicy',
inputPrimaryKeyTip: 'input primaryKey',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputColumnInfoTip: 'input columnInfo',
name: 'name',
typeName: 'typeName',
precision: 'precision',
scale: 'scale',
defaultValue: 'defaultValue',
nullable: 'nullable',
},
};

View File

@@ -1,34 +1,34 @@
export default {
createTable: {
index: '#',
importcreateTableTip: '导入自动创建表管理',
id: '主键ID',
tableName: '表名称',
comments: '表注释',
comment: '字段注释',
databaseType: '数据库类型',
pkPolicy: '主键策略',
createUser: '创建人',
createTime: '创建时间',
columnInfo: '字段信息',
primaryKey: '主键字段',
inputIdTip: '请输入主键ID',
inputTableNameTip: '请输入表名称',
inputCommentsTip: '请输入表注释',
inputCommentTip: '请输入字段注释',
inputDatabaseTypeTip: '请输入数据库引擎',
inputPkPolicyTip: '请输入主键策略',
inputPrimaryKeyTip: '请选择主键字段',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputColumnInfoTip: '请输入字段信息',
name: '字段名称',
typeName: '字段类型',
precision: '字段长度',
scale: '小数位数',
defaultValue: '默认值',
nullable: '允许NULL',
}
}
createTable: {
index: '#',
importcreateTableTip: '导入自动创建表管理',
id: '主键ID',
tableName: '表名称',
comments: '表注释',
comment: '字段注释',
databaseType: '数据库类型',
pkPolicy: '主键策略',
createUser: '创建人',
createTime: '创建时间',
columnInfo: '字段信息',
primaryKey: '主键字段',
inputIdTip: '请输入主键ID',
inputTableNameTip: '请输入表名称',
inputCommentsTip: '请输入表注释',
inputCommentTip: '请输入字段注释',
inputDatabaseTypeTip: '请输入数据库引擎',
inputPkPolicyTip: '请输入主键策略',
inputPrimaryKeyTip: '请选择主键字段',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputColumnInfoTip: '请输入字段信息',
name: '字段名称',
typeName: '字段类型',
precision: '字段长度',
scale: '小数位数',
defaultValue: '默认值',
nullable: '允许NULL',
},
};

View File

@@ -1,170 +1,174 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('createTable.tableName')" prop="tableName" >
<el-input :placeholder="t('createTable.inputTableNameTip')" v-model="state.queryForm.tableName"
style="max-width: 180px" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.addBtn') }}
</template>
<el-button icon="Plus" type="primary" class="ml10" @click="formDialogRef.openDialog('add')"
v-auth="'order_createtable_add'">
</el-button>
</el-tooltip>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('createTable.tableName')" prop="tableName">
<el-input :placeholder="t('createTable.inputTableNameTip')" v-model="state.queryForm.tableName" style="max-width: 180px" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.addBtn') }}
</template>
<el-button icon="Plus" type="primary" class="ml10" @click="formDialogRef.openDialog('add')" v-auth="'order_createtable_add'"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button plain :disabled="multiple" icon="Delete" type="primary" class="ml10"
v-auth="'order_createtable_del'" @click="handleDelete(selectObjs)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button
plain
:disabled="multiple"
icon="Delete"
type="primary"
class="ml10"
v-auth="'order_createtable_del'"
@click="handleDelete(selectObjs)"
>
</el-button>
</el-tooltip>
<right-toolbar v-model:showSearch="showSearch" :export="'order_createtable_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('createTable.index')" width="40" />
<el-table-column prop="tableName" :label="t('createTable.tableName')" show-overflow-tooltip/>
<el-table-column prop="comments" :label="t('createTable.comments')" show-overflow-tooltip/>
<el-table-column prop="databaseType" :label="t('createTable.databaseType')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.DATABASE_TYPE" :value="scope.row.databaseType"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="pkPolicy" :label="t('createTable.pkPolicy')" show-overflow-tooltip/>
<el-table-column prop="createUser" :label="t('createTable.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('createTable.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="100">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])">
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_createtable_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('createTable.index')" width="40" />
<el-table-column prop="tableName" :label="t('createTable.tableName')" show-overflow-tooltip />
<el-table-column prop="comments" :label="t('createTable.comments')" show-overflow-tooltip />
<el-table-column prop="databaseType" :label="t('createTable.databaseType')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.DATABASE_TYPE" :value="scope.row.databaseType"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="pkPolicy" :label="t('createTable.pkPolicy')" show-overflow-tooltip />
<el-table-column prop="createUser" :label="t('createTable.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('createTable.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="100">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])"> </el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</template>
<script setup lang="ts" name="systemCreateTable">
import { BasicTableProps, useTable } from "/@/hooks/table";
import { fetchList, delObjs } from "/@/api/order/create-table";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from '/@/api/order/create-table';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { useI18n } from "vue-i18n";
import { onLoaded } from "/@/flow/components/convert-name/convert";
import { useI18n } from 'vue-i18n';
import { onLoaded } from '/@/flow/components/convert-name/convert';
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n()
// 定义查询字典
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n();
// 定义查询字典
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 定义变量内容
const formDialogRef = ref();
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({key: "createUser"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({ key: 'createUser' }),
descs: ['create_time'],
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/create-table/export', state.queryForm, 'create-table.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/create-table/export', state.queryForm, 'create-table.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
</script>

View File

@@ -1,275 +1,278 @@
<template>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading"
:disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type"/>
</el-form-item>
</el-col>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputStartTimeTip')" :disabled="disabledFields.startTime"
v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputStartTimeTip')"
:disabled="disabledFields.startTime"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputEndTimeTip')" :disabled="disabledFields.endTime"
v-model="form.endTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputEndTimeTip')"
:disabled="disabledFields.endTime"
v-model="form.endTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" :disabled="disabledFields.carbonCopyPerson"
remote :remote-method="remoteMethod" :reserve-keyword="false"
clearable filterable multiple>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name"
:value="item.userId">
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.carbonCopyPerson"
:placeholder="t('askLeave.inputCarbonCopyPersonTip')"
:disabled="disabledFields.carbonCopyPerson"
remote
:remote-method="remoteMethod"
:reserve-keyword="false"
clearable
filterable
multiple
>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"> </el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
</el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="data.submitBtn">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{ t('jfI18n.print') }} </el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }}</el-button>
</span>
</footer>
</template>
<template v-else>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{ t('jfI18n.print') }} </el-button>
</span>
</footer>
</template>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="data.submitBtn">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{
t('jfI18n.print')
}}
</el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }}</el-button>
</span>
</footer>
</template>
<template v-else>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{
t('jfI18n.print')
}}
</el-button>
</span>
</footer>
</template>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px"
:title="data.tinymceTitle" append-to-body
@close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="data.currFlowForm" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px" :title="data.tinymceTitle" append-to-body @close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="data.currFlowForm" :elTab="data.elTab"></tinymce-view>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="CustomLeaveFlow">
import { useMessage } from '/@/hooks/message';
import { useI18n } from 'vue-i18n';
import { rule, validateNull } from '/@/utils/validate';
import { onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert.ts';
import * as orderVue from '/@/api/order/order-key-vue';
import * as runApplication from '/@/api/order/run-application';
import { parseWithFunctions } from '/@/flow';
import { deepClone } from '/@/utils/other';
import { handleCustomFormPerm, handleFormPrint } from '/@/flow/utils/form-perm';
import { initCustomFormMethods } from '../index';
import {useMessage} from "/@/hooks/message";
import {useI18n} from "vue-i18n"
import {rule, validateNull} from '/@/utils/validate';
import {onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey} from "/@/flow/components/convert-name/convert.ts";
import * as orderVue from "/@/api/order/order-key-vue";
import * as runApplication from "/@/api/order/run-application";
import {parseWithFunctions} from "/@/flow";
import {deepClone} from "/@/utils/other";
import {handleCustomFormPerm, handleFormPrint} from "/@/flow/utils/form-perm";
import {initCustomFormMethods} from "../index";
const { t } = useI18n();
const emits = defineEmits(['handleJob']);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const {t} = useI18n();
const emits = defineEmits(["handleJob"]);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'carbonCopyPerson' });
onMounted(async () => {
// await onLoad(dicData);
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "carbonCopyPerson"});
onMounted(async () => {
// await onLoad(dicData);
});
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'carbonCopyPerson');
}
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "carbonCopyPerson")
}
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 定义校验规则
const dataRules = ref({
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '请假事由不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
startTime: [{required: true, message: '开始时间不能为空', trigger: 'blur'}],
days: [{required: true, message: '请假天数不能为空', trigger: 'blur'}],
remark: [{required: true, message: '请假事由不能为空', trigger: 'blur'}],
})
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const data = reactive({
currFlowForm: {},
formData: {},
showTinymceView: false,
tinymceTitle: null,
submitBtn: true,
elTab: null,
});
const data = reactive({
currFlowForm: {},
formData: {},
showTinymceView: false,
tinymceTitle: null,
submitBtn: true,
elTab: null
})
function initJobData() {
handleGetObj(props.currJob.orderId);
}
function initJobData() {
handleGetObj(props.currJob.orderId)
}
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
};
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
}
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
function handleGetObj(id) {
runApplication.getObj(id).then(async (resp) => {
let res = resp.data ? resp.data : {};
data.currFlowForm = res;
let data2 = parseWithFunctions(res.formData);
Object.assign(form, data2);
await onFormLoaded(dicData, form);
data.currFlowForm.runJobId = props.currJob.id;
data.formData = data2;
await initFormPermPrint();
});
}
function handleGetObj(id) {
runApplication.getObj(id).then(async resp => {
let res = resp.data ? resp.data : {}
data.currFlowForm = res
let data2 = parseWithFunctions(res.formData)
Object.assign(form, data2)
await onFormLoaded(dicData, form);
data.currFlowForm.runJobId = props.currJob.id
data.formData = data2
await initFormPermPrint()
})
}
const methods = initCustomFormMethods(data, disabledFields, operType);
const methods = initCustomFormMethods(data, disabledFields, operType)
async function initFormPermPrint() {
let elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
// 处理表单权限
let res = await handleCustomFormPerm(props, hiddenFields, disabledFields, elTab);
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback);
// 采用elTab配置的模板
await handleFormPrint(data.currFlowForm, elTab.type, elTab.id, '1');
data.elTab = elTab;
}
async function initFormPermPrint() {
let elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id)
// 处理表单权限
let res = await handleCustomFormPerm(props, hiddenFields, disabledFields, elTab)
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback)
// 采用elTab配置的模板
await handleFormPrint(data.currFlowForm, elTab.type, elTab.id, '1')
data.elTab = elTab
}
function printForm() {
closePrint(true, false);
data.tinymceTitle = data.currFlowForm.formName;
data.showTinymceView = true;
}
function printForm() {
closePrint(true, false)
data.tinymceTitle = data.currFlowForm.formName
data.showTinymceView = true
}
function closePrint(isInit, isSave) {
if (isInit) {
data.currFlowForm.formData = form;
data.currFlowForm.dicData = { carbonCopyPerson: dicData.carbonCopyPerson };
data.currFlowForm['carbonCopyPerson.valueKey'] = 'userId';
data.currFlowForm['carbonCopyPerson.showKey'] = 'name';
} else {
delete data.currFlowForm.dicData;
delete data.currFlowForm['carbonCopyPerson.valueKey'];
delete data.currFlowForm['carbonCopyPerson.showKey'];
}
if (isSave) delete data.currFlowForm.printInfo;
}
function closePrint(isInit, isSave){
if (isInit) {
data.currFlowForm.formData = form
data.currFlowForm.dicData = {carbonCopyPerson: dicData.carbonCopyPerson}
data.currFlowForm['carbonCopyPerson.valueKey'] = 'userId'
data.currFlowForm['carbonCopyPerson.showKey'] = 'name'
} else {
delete data.currFlowForm.dicData
delete data.currFlowForm['carbonCopyPerson.valueKey']
delete data.currFlowForm['carbonCopyPerson.showKey']
}
if (isSave) delete data.currFlowForm.printInfo
}
async function submitForm() {
try {
loading.value = true;
let formJson = saveInitData(form);
await runApplication.putObj(formJson);
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits);
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
async function submitForm() {
try {
loading.value = true;
let formJson = saveInitData(form);
await runApplication.putObj(formJson)
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits)
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
function saveInitData(form) {
closePrint(false, true);
data.currFlowForm.formData = validateNull(form) ? null : form;
let formJson = deepClone(data.currFlowForm);
if (!validateNull(form)) {
formJson.formData = Object.assign({}, data.formData, formJson.formData);
}
formJson.formData = JSON.stringify(formJson.formData);
return formJson;
}
function saveInitData(form) {
closePrint(false, true)
data.currFlowForm.formData = validateNull(form) ? null : form
let formJson = deepClone(data.currFlowForm)
if (!validateNull(form)) {
formJson.formData = Object.assign({}, data.formData, formJson.formData);
}
formJson.formData = JSON.stringify(formJson.formData)
return formJson;
}
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
initJobData();
}
);
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
initJobData();
}
);
onMounted(() => {
initJobData()
});
onMounted(() => {
initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
.el-dialog__footer {
text-align: center;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,242 +1,257 @@
<template>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type"/>
</el-form-item>
</el-col>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20" v-if="!hiddenFields.type">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" :disabled="disabledFields.type" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputStartTimeTip')" :disabled="disabledFields.startTime"
v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.startTime">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputStartTimeTip')"
:disabled="disabledFields.startTime"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputEndTimeTip')" :disabled="disabledFields.endTime"
v-model="form.endTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.endTime">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputEndTimeTip')"
:disabled="disabledFields.endTime"
v-model="form.endTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.days">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" :disabled="disabledFields.days" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" clearable filterable multiple
remote :remote-method="remoteMethod" :reserve-keyword="false"
:disabled="disabledFields.carbonCopyPerson">
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.carbonCopyPerson">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.carbonCopyPerson"
:placeholder="t('askLeave.inputCarbonCopyPersonTip')"
clearable
filterable
multiple
remote
:remote-method="remoteMethod"
:reserve-keyword="false"
:disabled="disabledFields.carbonCopyPerson"
>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.remark">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" :disabled="disabledFields.remark" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-col :span="12" class="mb20" v-if="!hiddenFields.imgUrls">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" :disabled="disabledFields.imgUrls" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup lang="ts" name="CustomLeaveForm">
import { useMessage } from '/@/hooks/message';
import { useI18n } from 'vue-i18n';
import { rule, validateNull } from '/@/utils/validate';
import { onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert.ts';
import * as common from '/@/flow/support/common';
import { paramsFilter, parseWithFunctions } from '/@/flow';
import { deepClone } from '/@/utils/other';
import * as runApplication from '/@/api/order/run-application';
import { handleFormPrint, handleFormStartPerm } from '/@/flow/utils/form-perm';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import { initCustomFormMethods } from '../index';
import { currFormIsView } from '/@/api/order/order-key-vue';
import { useMessage } from "/@/hooks/message";
import { useI18n } from "vue-i18n"
import {rule, validateNull} from '/@/utils/validate';
import {onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey} from "/@/flow/components/convert-name/convert.ts";
import * as common from '/@/flow/support/common'
import {paramsFilter, parseWithFunctions} from "/@/flow";
import {deepClone} from "/@/utils/other";
import * as runApplication from "/@/api/order/run-application";
import {handleFormPrint, handleFormStartPerm} from "/@/flow/utils/form-perm";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import {initCustomFormMethods} from "../index";
import {currFormIsView} from "/@/api/order/order-key-vue";
const { t } = useI18n();
const { t } = useI18n();
const props = defineProps({
currJob: {
type: Object,
default: null,
},
});
const props = defineProps({
currJob: {
type: Object,
default: null,
}
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'carbonCopyPerson' });
onMounted(async () => {
// await onLoad(dicData);
openForm(props.currJob.operType, props.currJob.id);
props.currJob.onSubmit = onSubmit;
props.currJob.onTemp = onTemp;
props.currJob.getFormData = getFormData;
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "carbonCopyPerson"});
onMounted(async () => {
// await onLoad(dicData);
openForm(props.currJob.operType, props.currJob.id)
props.currJob.onSubmit = onSubmit
props.currJob.onTemp = onTemp
props.currJob.getFormData = getFormData
});
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'carbonCopyPerson');
}
function remoteMethod(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "carbonCopyPerson")
}
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 定义校验规则
const dataRules = ref({
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '请假事由不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
startTime: [{required: true, message: '开始时间不能为空', trigger: 'blur'}],
days: [{required: true, message: '请假天数不能为空', trigger: 'blur'}],
remark: [{required: true, message: '请假事由不能为空', trigger: 'blur'}],
})
// 打开表单
const openForm = (type: string, id: string) => {
operType.value = type;
// 打开表单
const openForm = (type: string, id: string) => {
operType.value = type;
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
// 获取表单信息
if (id) {
rowEditInitData(type, id);
}
});
};
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
// 获取表单信息
if (id) {
rowEditInitData(type, id)
}
});
};
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
};
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
const fieldsPerm = {
type: false,
startTime: false,
endTime: false,
days: false,
carbonCopyPerson: false,
remark: false,
imgUrls: false,
}
// 定义字段显隐
const hiddenFields = reactive(fieldsPerm);
// 定义字段是否可编辑
const disabledFields = reactive(deepClone(fieldsPerm));
const methods = initCustomFormMethods({}, disabledFields);
const methods = initCustomFormMethods({}, disabledFields)
async function rowEditInitData(type, id) {
// 处理表单权限 开始节点必须配置表单
let res = await handleFormStartPerm(hiddenFields, disabledFields, null, props.currJob.defFlowId, null, null);
await currFormIsView(methods, res.elTab, true, res.callback);
if (type === 'add') {
props.currJob.formId = id;
return;
}
if (validateNull(props.currJob.formData)) return;
let data = parseWithFunctions(props.currJob.formData);
Object.assign(form, data);
await onFormLoaded(dicData, form);
await initFormPermPrint();
}
async function rowEditInitData(type, id) {
// 处理表单权限 开始节点必须配置表单
let res = await handleFormStartPerm(hiddenFields, disabledFields, null, props.currJob.defFlowId, null, null)
await currFormIsView(methods, res.elTab, true, res.callback)
if (type === 'add') {
props.currJob.formId = id
return
}
if (validateNull(props.currJob.formData)) return
let data = parseWithFunctions(props.currJob.formData)
Object.assign(form, data)
await onFormLoaded(dicData, form);
await initFormPermPrint()
}
async function initFormPermPrint() {
// 处理表单权限
await handleFormPrint(props.currJob, props.currJob.type, props.currJob.formId, '1');
props.currJob.resolvePrintForm = printForm;
props.currJob.resolveClosePrint = closePrint;
}
async function initFormPermPrint() {
// 处理表单权限
await handleFormPrint(props.currJob, props.currJob.type, props.currJob.formId, '1')
props.currJob.resolvePrintForm = printForm
props.currJob.resolveClosePrint = closePrint
}
function printForm() {
closePrint(true, false);
}
function printForm() {
closePrint(true, false)
}
function closePrint(isInit, isSave) {
if (isInit) {
props.currJob.formData = form;
props.currJob.dicData = { carbonCopyPerson: dicData.carbonCopyPerson };
props.currJob['carbonCopyPerson.valueKey'] = 'userId';
props.currJob['carbonCopyPerson.showKey'] = 'name';
} else {
delete props.currJob.dicData;
delete props.currJob['carbonCopyPerson.valueKey'];
delete props.currJob['carbonCopyPerson.showKey'];
}
if (isSave) delete props.currJob.printInfo;
}
function closePrint(isInit, isSave){
if (isInit) {
props.currJob.formData = form
props.currJob.dicData = {carbonCopyPerson: dicData.carbonCopyPerson}
props.currJob['carbonCopyPerson.valueKey'] = 'userId'
props.currJob['carbonCopyPerson.showKey'] = 'name'
} else {
delete props.currJob.dicData
delete props.currJob['carbonCopyPerson.valueKey']
delete props.currJob['carbonCopyPerson.showKey']
}
if (isSave) delete props.currJob.printInfo
}
// 暂存
const onTemp = async () => {
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
let formJson = saveInitData(form);
await runApplication.tempStore(formJson);
useMessage().success('暂存成功,请在【我的申请】查看');
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 暂存
const onTemp = async () => {
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone);
try {
loading.value = true;
let formJson = saveInitData(form);
await runApplication.tempStore(formJson)
useMessage().success("暂存成功,请在【我的申请】查看");
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
let formJson = saveInitData(form);
props.currJob.status !== DIC_PROP.ORDER_STATUS[0].value ? await runApplication.addObj(formJson) : await runApplication.putObj(formJson);
useMessage().success(t(formJson.id ? 'common.editSuccessText' : '发起成功,请在【我的申请】查看'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone)
try {
loading.value = true;
let formJson = saveInitData(form);
props.currJob.status !== DIC_PROP.ORDER_STATUS[0].value ? await runApplication.addObj(formJson) : await runApplication.putObj(formJson);
useMessage().success(t(formJson.id ? 'common.editSuccessText' : '发起成功,请在【我的申请】查看'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
function saveInitData(form) {
closePrint(false, true)
form = paramsFilter(form)
props.currJob.formData = validateNull(form) ? undefined : form
let formJson = deepClone(props.currJob)
let clone = {operType: props.currJob.operType, form: formJson};
common.handleCloneSubmit(clone)
formJson.formData = JSON.stringify(formJson.formData)
return formJson;
}
async function getFormData() {
return saveInitData(form);
}
function saveInitData(form) {
closePrint(false, true);
form = paramsFilter(form);
props.currJob.formData = validateNull(form) ? undefined : form;
let formJson = deepClone(props.currJob);
let clone = { operType: props.currJob.operType, form: formJson };
common.handleCloneSubmit(clone);
formJson.formData = JSON.stringify(formJson.formData);
return formJson;
}
async function getFormData() {
return saveInitData(form);
}
</script>

View File

@@ -1,168 +1,177 @@
<template>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')"/>
</el-form-item>
</el-col>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.type')" prop="type">
<el-input v-model="form.type" :placeholder="t('askLeave.inputTypeTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputStartTimeTip')" v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.startTime')" prop="startTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputStartTimeTip')"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker type="datetime" :placeholder="t('askLeave.inputEndTimeTip')" v-model="form.endTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.endTime')" prop="endTime">
<el-date-picker
type="datetime"
:placeholder="t('askLeave.inputEndTimeTip')"
v-model="form.endTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.days')" prop="days">
<el-input v-model="form.days" :placeholder="t('askLeave.inputDaysTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" clearable filterable multiple>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.carbonCopyPerson')" prop="carbonCopyPerson">
<el-select v-model="form.carbonCopyPerson" :placeholder="t('askLeave.inputCarbonCopyPersonTip')" clearable filterable multiple>
<el-option v-for="(item, index) in dicData.carbonCopyPerson" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.remark')" prop="remark">
<el-input v-model="form.remark" type="textarea" :placeholder="t('askLeave.inputRemarkTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-col :span="12" class="mb20">
<el-form-item :label="t('askLeave.imgUrls')" prop="imgUrls">
<el-input v-model="form.imgUrls" :placeholder="t('askLeave.inputImgUrlsTip')" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup lang="ts" name="CustomAskLeave">
import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj, tempStore } from '/@/api/order/ask-leave';
import { useI18n } from 'vue-i18n';
import { rule } from '/@/utils/validate';
import { onLoadDicUrl } from '/@/flow/components/convert-name/convert.ts';
import * as common from '/@/flow/support/common';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import { useMessage } from "/@/hooks/message";
import {getObj, addObj, putObj, tempStore} from '/@/api/order/ask-leave'
import { useI18n } from "vue-i18n"
import { rule } from '/@/utils/validate';
import {onLoadDicUrl} from "/@/flow/components/convert-name/convert.ts";
import * as common from '/@/flow/support/common'
import {DIC_PROP} from "/@/flow/support/dict-prop";
const { t } = useI18n();
const { t } = useI18n();
const props = defineProps({
currJob: {
type: Object,
default: null,
},
});
const props = defineProps({
currJob: {
type: Object,
default: null,
}
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl({ key: 'carbonCopyPerson' });
onMounted(() => {
onLoad(dicData);
openForm(props.currJob.operType, props.currJob.id);
props.currJob.onSubmit = onSubmit;
props.currJob.onTemp = onTemp;
});
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl({key: "carbonCopyPerson"});
onMounted(() => {
onLoad(dicData);
openForm(props.currJob.operType, props.currJob.id)
props.currJob.onSubmit = onSubmit
props.currJob.onTemp = onTemp
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 提交表单数据
const form = reactive({
type: '',
startTime: '',
endTime: '',
days: '',
carbonCopyPerson: [],
remark: '',
imgUrls: '',
});
// 定义校验规则
const dataRules = ref({
startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
days: [{ required: true, message: '请假天数不能为空', trigger: 'blur' }],
remark: [{ required: true, message: '请假事由不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
startTime: [{required: true, message: '开始时间不能为空', trigger: 'blur'}],
days: [{required: true, message: '请假天数不能为空', trigger: 'blur'}],
remark: [{required: true, message: '请假事由不能为空', trigger: 'blur'}],
})
// 打开表单
const openForm = (type: string, id: string) => {
operType.value = type;
form.id = '';
// 打开表单
const openForm = (type: string, id: string) => {
operType.value = type;
form.id = ''
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 获取AskLeave信息
if (id) {
form.id = id;
getAskLeaveData(id);
}
};
// 获取AskLeave信息
if (id) {
form.id = id
getAskLeaveData(id)
}
};
// 暂存
const onTemp = async () => {
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
await tempStore(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 暂存
const onTemp = async () => {
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone);
try {
loading.value = true;
await tempStore(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
let clone = {operType: operType.value, form: form};
common.handleCloneSubmit(clone)
try {
loading.value = true;
form.status !== DIC_PROP.ORDER_STATUS[0].value ? await addObj(form) : await putObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getAskLeaveData = (id: string) => {
// 获取数据
loading.value = true
getObj(id).then((res: any) => {
Object.assign(form, res.data)
let clone = {operType: operType.value, form: form};
common.handleClone(clone);
}).finally(() => {
loading.value = false
})
};
let clone = { operType: operType.value, form: form };
common.handleCloneSubmit(clone);
try {
loading.value = true;
form.status !== DIC_PROP.ORDER_STATUS[0].value ? await addObj(form) : await putObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
return true;
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getAskLeaveData = (id: string) => {
// 获取数据
loading.value = true;
getObj(id)
.then((res: any) => {
Object.assign(form, res.data);
let clone = { operType: operType.value, form: form };
common.handleClone(clone);
})
.finally(() => {
loading.value = false;
});
};
</script>

View File

@@ -1,52 +1,51 @@
export default {
flowApplication: {
index: '#',
importflowApplicationTip: 'import FlowApplication',
id: 'id',
flowKey: 'flowKey',
icon: 'icon',
formName: 'formName',
groupName: 'groupName',
tableName: 'tableName',
permission: 'permission',
remark: 'remark',
status: 'status',
version: 'version',
createUser: 'createUser',
createTime: 'createTime',
defFlowId: 'defFlowId',
formInfo: 'formInfo',
type: 'type',
subTableName: 'subTableName',
subMainField: 'subMainField',
mainSubProp: 'mainSubProp',
sort: 'sort',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputFlowKeyTip: 'input flowKey',
inputIconTip: 'input icon',
inputFormNameTip: 'input formName',
inputGroupNameTip: 'input groupName',
inputTableNameTip: 'input tableName',
inputPermissionTip: 'input permission',
inputRemarkTip: 'input remark',
inputStatusTip: 'input status',
inputVersionTip: 'input version',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputDefFlowIdTip: 'input defFlowId',
inputFormInfoTip: 'input formInfo',
inputTypeTip: 'input type',
inputSubTableNameTip: 'input subTableName',
inputSubMainFieldTip: 'input subMainField',
inputMainSubPropTip: 'input mainSubProp',
inputSortTip: 'input sort',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
}
}
flowApplication: {
index: '#',
importflowApplicationTip: 'import FlowApplication',
id: 'id',
flowKey: 'flowKey',
icon: 'icon',
formName: 'formName',
groupName: 'groupName',
tableName: 'tableName',
permission: 'permission',
remark: 'remark',
status: 'status',
version: 'version',
createUser: 'createUser',
createTime: 'createTime',
defFlowId: 'defFlowId',
formInfo: 'formInfo',
type: 'type',
subTableName: 'subTableName',
subMainField: 'subMainField',
mainSubProp: 'mainSubProp',
sort: 'sort',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputFlowKeyTip: 'input flowKey',
inputIconTip: 'input icon',
inputFormNameTip: 'input formName',
inputGroupNameTip: 'input groupName',
inputTableNameTip: 'input tableName',
inputPermissionTip: 'input permission',
inputRemarkTip: 'input remark',
inputStatusTip: 'input status',
inputVersionTip: 'input version',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputDefFlowIdTip: 'input defFlowId',
inputFormInfoTip: 'input formInfo',
inputTypeTip: 'input type',
inputSubTableNameTip: 'input subTableName',
inputSubMainFieldTip: 'input subMainField',
inputMainSubPropTip: 'input mainSubProp',
inputSortTip: 'input sort',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
},
};

View File

@@ -1,52 +1,51 @@
export default {
flowApplication: {
index: '#',
importflowApplicationTip: '导入办公申请',
id: '主键id',
flowKey: '流程KEY',
icon: '表单图标',
formName: '表单名称',
groupName: '分组名称',
tableName: '关联表名称',
permission: '操作权限',
remark: '表单备注',
status: '状态',
version: '版本',
createUser: '创建人',
createTime: '创建时间',
defFlowId: '流程定义ID',
formInfo: '表单信息',
type: '表单类型',
subTableName: '关联子表名称',
subMainField: '关联主表列名',
mainSubProp: '关联子表属性',
sort: '排序值',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputFlowKeyTip: '请输入流程KEY',
inputIconTip: '请输入表单图标',
inputFormNameTip: '请输入表单名称',
inputGroupNameTip: '请输入分组名称',
inputTableNameTip: '请输入关联表名称',
inputPermissionTip: '请选择操作角色, 默认所有人都可以发起该流程',
inputRemarkTip: '请输入表单备注',
inputStatusTip: '请输入状态',
inputVersionTip: '请输入版本',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputDefFlowIdTip: '请输入流程定义ID',
inputFormInfoTip: '请输入表单信息',
inputTypeTip: '请选择表单类型',
inputSubTableNameTip: '请选择关联子表名称',
inputSubMainFieldTip: '请输入关联主表列名',
inputMainSubPropTip: '请输入关联子表属性',
inputSortTip: '请输入排序值',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
}
}
flowApplication: {
index: '#',
importflowApplicationTip: '导入办公申请',
id: '主键id',
flowKey: '流程KEY',
icon: '表单图标',
formName: '表单名称',
groupName: '分组名称',
tableName: '关联表名称',
permission: '操作权限',
remark: '表单备注',
status: '状态',
version: '版本',
createUser: '创建人',
createTime: '创建时间',
defFlowId: '流程定义ID',
formInfo: '表单信息',
type: '表单类型',
subTableName: '关联子表名称',
subMainField: '关联主表列名',
mainSubProp: '关联子表属性',
sort: '排序值',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputFlowKeyTip: '请输入流程KEY',
inputIconTip: '请输入表单图标',
inputFormNameTip: '请输入表单名称',
inputGroupNameTip: '请输入分组名称',
inputTableNameTip: '请输入关联表名称',
inputPermissionTip: '请选择操作角色, 默认所有人都可以发起该流程',
inputRemarkTip: '请输入表单备注',
inputStatusTip: '请输入状态',
inputVersionTip: '请输入版本',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputDefFlowIdTip: '请输入流程定义ID',
inputFormInfoTip: '请输入表单信息',
inputTypeTip: '请选择表单类型',
inputSubTableNameTip: '请选择关联子表名称',
inputSubMainFieldTip: '请输入关联主表列名',
inputMainSubPropTip: '请输入关联子表属性',
inputSortTip: '请输入排序值',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
},
};

View File

@@ -1,309 +1,296 @@
<template>
<div class="layout-padding">
<div class="layout-padding">
<div style="background: #f4f4f5; margin-bottom: 10px" class="el_result_layout">
<el-row :gutter="24">
<el-col :span="8">
<el-space class="el-space_container" @click="handleClickHref('TodoJobHash')">
<el-result style="width: 100px; padding: 0">
<template #icon>
<el-icon :size="50" style="color: #409eff"><BellFilled /></el-icon>
</template>
</el-result>
<el-card shadow="never" class="el-card__title__" style="width: 220px; border: none">
<template #header> 待我审批 </template>
<div style="height: 23px; font-size: 30px; font-weight: bold">{{ useFlowJob().jobLen }}</div>
</el-card>
</el-space>
</el-col>
<el-col :span="4" style="padding: 0">
<el-result class="el-result__style__" @click="handleClickHref('RunApplicationHash')" title="我的申请">
<template #icon>
<el-icon :size="40" style="color: #409eff"><Promotion /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0">
<el-result class="el-result__style__" @click="handleClickHref('TodoJobHash', '?belongType=1')" title="抄送我的">
<template #icon>
<el-icon :size="40" style="color: #409eff"><Avatar /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0">
<el-result class="el-result__style__" @click="handleClickHref('SignJobHash')" title="待认领的">
<template #icon>
<el-icon :size="40" style="color: #409eff"><Opportunity /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0 10px 0 0">
<el-result class="el-result__style__" @click="handleClickHref('HiJobHash')" title="我审批的">
<template #icon>
<el-icon :size="40" style="color: #409eff"><Stamp /></el-icon>
</template>
</el-result>
</el-col>
</el-row>
</div>
<div style="background: #f4f4f5; margin-bottom: 10px" class="el_result_layout">
<el-row :gutter="24">
<el-col :span="8">
<el-space class="el-space_container" @click="handleClickHref('TodoJobHash')">
<el-result style="width: 100px; padding: 0;">
<template #icon>
<el-icon :size="50" style="color: #409EFF;"><BellFilled /></el-icon>
</template>
</el-result>
<el-card shadow="never" class="el-card__title__" style="width: 220px; border: none">
<template #header> 待我审批 </template>
<div style="height: 23px; font-size: 30px; font-weight: bold;"> {{ useFlowJob().jobLen }} </div>
</el-card>
</el-space>
</el-col>
<el-col :span="4" style="padding: 0;">
<el-result class="el-result__style__" @click="handleClickHref('RunApplicationHash')"
title="我的申请">
<template #icon>
<el-icon :size="40" style="color: #409EFF;"><Promotion /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0;">
<el-result class="el-result__style__" @click="handleClickHref('TodoJobHash', '?belongType=1')"
title="抄送我的">
<template #icon>
<el-icon :size="40" style="color: #409EFF;"><Avatar /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0;">
<el-result class="el-result__style__" @click="handleClickHref('SignJobHash')"
title="待认领的">
<template #icon>
<el-icon :size="40" style="color: #409EFF;"><Opportunity /></el-icon>
</template>
</el-result>
</el-col>
<el-col :span="4" style="padding: 0 10px 0 0;">
<el-result class="el-result__style__" @click="handleClickHref('HiJobHash')"
title="我审批的">
<template #icon>
<el-icon :size="40" style="color: #409EFF;"><Stamp /></el-icon>
</template>
</el-result>
</el-col>
</el-row>
</div>
<div class="layout-padding-auto layout-padding-view" style="overflow-y: auto">
<template v-for="(tabs, index) in data.tabsData" :key="index">
<el-collapse v-model="data.collapse">
<el-collapse-item :name="index">
<template #title>
<el-icon :size="24" style="margin-right: 8px; color: #409eff">
<CaretRight v-if="!data.collapse.includes(index)" />
<CaretBottom v-else />
</el-icon>
<div style="font-size: 14px">{{ tabs.groupName }}</div>
</template>
<div class="layout-padding-auto layout-padding-view" style="overflow-y: auto;">
<template v-for="(tabs, index) in data.tabsData" :key="index">
<el-collapse v-model="data.collapse">
<el-collapse-item :name="index">
<template #title>
<el-icon :size="24" style="margin-right: 8px; color: #409EFF;">
<CaretRight v-if="!data.collapse.includes(index)" />
<CaretBottom v-else />
</el-icon>
<div style="font-size: 14px;"> {{ tabs.groupName }} </div>
</template>
<div class="avue-view__avue-card">
<el-row :span="24" :gutter="20">
<el-col v-for="(item, index) in data.tableData.filter((f) => f.groupName === tabs.groupName)" :key="index" :span="6">
<div class="avue-card__item">
<div class="avue-card__body">
<div class="avue-card__avatar2">
<i :class="item.icon" alt="" style="font-size: 38px !important; color: #409eff" />
</div>
<div class="avue-card__detail">
<div class="avue-card__title">{{ item.formName }} V{{ item.version }}</div>
<div class="avue-card__info">{{ item.remark }}</div>
</div>
</div>
<div class="avue-card__menu">
<span v-if="item.status === '1'" v-auth="'order_flowapplication_edit'" @click.stop="handleInitiateOrder(item, index)"
>发起工单
</span>
<span v-auth="'order_flowapplication_edit'" @click.stop="openPreview(item.defFlowId)">查看流程图 </span>
</div>
</div>
</el-col>
</el-row>
</div>
</el-collapse-item>
</el-collapse>
</template>
<div class="avue-view__avue-card">
<el-row
:span="24"
:gutter="20">
<el-col v-for="(item,index) in data.tableData.filter(f => f.groupName === tabs.groupName)"
:key="index"
:span="6">
<div class="avue-card__item">
<div class="avue-card__body">
<div class="avue-card__avatar2">
<i :class="item.icon" alt="" style="font-size: 38px!important;color: #409EFF;"/>
</div>
<div class="avue-card__detail">
<div class="avue-card__title">{{ item.formName }} V{{ item.version }}</div>
<div class="avue-card__info">{{ item.remark }}</div>
</div>
</div>
<div class="avue-card__menu">
<span
v-if="item.status === '1'" v-auth="'order_flowapplication_edit'"
@click.stop="handleInitiateOrder(item,index)">发起工单
</span>
<span v-auth="'order_flowapplication_edit'"
@click.stop="openPreview(item.defFlowId)">查看流程图
</span>
</div>
</div>
</el-col>
</el-row>
</div>
<!-- 发起工单 -->
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="handleInitiateOrder">
<template v-slot="slotProps" v-if="data.showInitiateOrder">
<flow-initiate
ref="form"
v-show="slotProps.currActive === 'form'"
:curr-flow-form="data.currFlowForm"
@handleInitiateOrder="handleInitiateOrder"
></flow-initiate>
</template>
<template v-slot="slotProps" v-if="data.showHandleForm">
<custom-form
ref="form"
v-show="slotProps.currActive === 'form'"
:curr-job="data.currFlowForm"
@onHandleForm="handleInitiateOrder"
></custom-form>
</template>
</json-flow-predict>
</el-collapse-item>
</el-collapse>
</template>
<!-- 发起工单 -->
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="handleInitiateOrder">
<template v-slot="slotProps" v-if="data.showInitiateOrder">
<flow-initiate ref="form" v-show="slotProps.currActive === 'form'" :curr-flow-form="data.currFlowForm"
@handleInitiateOrder="handleInitiateOrder"></flow-initiate>
</template>
<template v-slot="slotProps" v-if="data.showHandleForm">
<custom-form ref="form" v-show="slotProps.currActive === 'form'" :curr-job="data.currFlowForm"
@onHandleForm="handleInitiateOrder"></custom-form>
</template>
</json-flow-predict>
<!-- 查看流程图 -->
<el-drawer
class="flow-overflow-drawer" direction="rtl"
append-to-body size="90%"
v-model="data.showFlowPic"
>
<flow-photo v-if="data.showFlowPic" :curr-job="data.currFlowForm"></flow-photo>
</el-drawer>
</div>
</div>
<!-- 查看流程图 -->
<el-drawer class="flow-overflow-drawer" direction="rtl" append-to-body size="90%" v-model="data.showFlowPic">
<flow-photo v-if="data.showFlowPic" :curr-job="data.currFlowForm"></flow-photo>
</el-drawer>
</div>
</div>
</template>
<script setup lang="ts" name="systemFlowApplication">
import * as flowApplication from "/@/api/order/flow-application";
import {useI18n} from "vue-i18n";
import other, {deepClone} from "/@/utils/other";
import {useFlowJob} from "/@/flow/stores/flowJob";
import {windowLocationHrefParam} from "/@/flow/support/extend";
import {handleCustomForm, vueKey} from "/@/api/order/order-key-vue";
import * as flowApplication from '/@/api/order/flow-application';
import { useI18n } from 'vue-i18n';
import other, { deepClone } from '/@/utils/other';
import { useFlowJob } from '/@/flow/stores/flowJob';
import { windowLocationHrefParam } from '/@/flow/support/extend';
import { handleCustomForm, vueKey } from '/@/api/order/order-key-vue';
// 引入组件
const FlowPhoto = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/view.vue'));
const FlowInitiate = defineAsyncComponent(() => import('./initiate.vue'));
const CustomForm = defineAsyncComponent(() => import('/@/flow/components/custom-form/handle.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
// 引入组件
const FlowPhoto = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/view.vue'));
const FlowInitiate = defineAsyncComponent(() => import('./initiate.vue'));
const CustomForm = defineAsyncComponent(() => import('/@/flow/components/custom-form/handle.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
const {t} = useI18n()
const {proxy} = getCurrentInstance();
const { t } = useI18n();
const { proxy } = getCurrentInstance();
const data = reactive({
tableData: [],
tabsData: [],
showInitiateOrder: false,
showFlowPic: false,
currFlowForm: {},
showHandleForm: false,
collapse: [0]
})
const data = reactive({
tableData: [],
tabsData: [],
showInitiateOrder: false,
showFlowPic: false,
currFlowForm: {},
showHandleForm: false,
collapse: [0],
});
// 列表查询
function getList() {
flowApplication.listByPerms({}).then(response => {
data.tableData = response.data
data.tabsData = data.tableData.filter((value, i, arr) =>
arr.findIndex(x => x.groupName === value.groupName) === i
);
})
}
// 列表查询
function getList() {
flowApplication.listByPerms({}).then((response) => {
data.tableData = response.data;
data.tabsData = data.tableData.filter((value, i, arr) => arr.findIndex((x) => x.groupName === value.groupName) === i);
});
}
function handleInitiateOrder(row, index) {
if (row === false) {
openPredict({}, false)
data.showInitiateOrder = false
data.showHandleForm = false
return
}
data.currFlowForm = deepClone(row)
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row)
data.currFlowForm.operType = 'add'
data.showHandleForm = true
} else {
data.showInitiateOrder = true
}
openPredict(row, true)
}
function handleInitiateOrder(row, index) {
if (row === false) {
openPredict({}, false);
data.showInitiateOrder = false;
data.showHandleForm = false;
return;
}
data.currFlowForm = deepClone(row);
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row);
data.currFlowForm.operType = 'add';
data.showHandleForm = true;
} else {
data.showInitiateOrder = true;
}
openPredict(row, true);
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool)
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool);
}
function handleClickHref(hash, param = '') {
windowLocationHrefParam(hash, param)
}
function handleClickHref(hash, param = '') {
windowLocationHrefParam(hash, param);
}
function openPreview(defFlowId) {
data.currFlowForm = {defFlowId: defFlowId}
data.showFlowPic = true
}
function openPreview(defFlowId) {
data.currFlowForm = { defFlowId: defFlowId };
data.showFlowPic = true;
}
onMounted(() => {
getList()
})
onMounted(() => {
getList();
});
</script>
<style lang="scss">
@import "../../../flow/components/style/flow-drawer.scss";
@import '../../../flow/components/style/flow-drawer.scss';
</style>
<style lang="scss" scoped>
.avue-view__avue-card {
width: 100%;
-webkit-box-sizing: border-box;
box-sizing: border-box;
.avue-view__avue-card {
width: 100%;
-webkit-box-sizing: border-box;
box-sizing: border-box;
.avue-card__item:hover {
border-color: #409EFF;
}
.avue-card__item:hover {
border-color: #409eff;
}
.avue-card__item {
margin-bottom: 12px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fff;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: rgba(0, 0, 0, .65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
-webkit-font-feature-settings: "tnum";
font-feature-settings: "tnum";
cursor: pointer;
.avue-card__item {
margin-bottom: 12px;
border: 1px solid #e8e8e8;
border-radius: 8px;
background-color: #fff;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
-webkit-font-feature-settings: 'tnum';
font-feature-settings: 'tnum';
cursor: pointer;
.avue-card__body {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
.avue-card__body {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
.avue-card__avatar2 {
width: 48px;
height: 48px;
border-radius: 48px;
overflow: hidden;
margin-right: 12px;
margin-left: 12px;
}
.avue-card__avatar2 {
width: 48px;
height: 48px;
border-radius: 48px;
overflow: hidden;
margin-right: 12px;
margin-left: 12px;
}
.avue-card__detail {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
.avue-card__detail {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
.avue-card__title {
color: rgba(0, 0, 0, .85);
margin-top: 6px;
margin-bottom: 6px;
font-size: 16px;
}
.avue-card__title {
color: rgba(0, 0, 0, 0.85);
margin-top: 6px;
margin-bottom: 6px;
font-size: 16px;
}
.avue-card__info {
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
height: 64px;
}
}
}
.avue-card__info {
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
height: 64px;
}
}
}
.avue-card__menu {
border-radius: 8px;
display: -ms-flexbox;
display: flex;
-ms-flex-pack: distribute;
justify-content: space-around;
height: 50px;
background: #f7f9fa;
text-align: center;
line-height: 50px;
}
}
}
.avue-card__menu {
border-radius: 8px;
display: -ms-flexbox;
display: flex;
-ms-flex-pack: distribute;
justify-content: space-around;
height: 50px;
background: #f7f9fa;
text-align: center;
line-height: 50px;
}
}
}
.el_result_layout {
cursor: pointer;
.el_result_layout {
cursor: pointer;
.el-space_container {
width: 100%;
background: white;
border-radius: 8px;
}
.el-space_container {
width: 100%;
background: white;
border-radius: 8px;
}
.el-card__title__:hover {
background: #f4f4f5;
}
.el-card__title__ {
// 居中不能适应屏幕大小
// display: grid;
// place-items: center;
margin: 0;
font-size: 20px;
}
.el-result__style__:hover {
background: #f4f4f5;
}
.el-result__style__ {
border-radius: 8px;
background: white;
padding: 10px;
}
}
.el-card__title__:hover {
background: #f4f4f5;
}
.el-card__title__ {
// 居中不能适应屏幕大小
// display: grid;
// place-items: center;
margin: 0;
font-size: 20px;
}
.el-result__style__:hover {
background: #f4f4f5;
}
.el-result__style__ {
border-radius: 8px;
background: white;
padding: 10px;
}
}
</style>

View File

@@ -1,125 +1,118 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="data.currFlowForm" :initFormPermPrint="initFormPermPrint">
</form-render>
</div>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<el-button type="primary" @click="submitForm" :disabled="loading">{{
t('jfI18n.submit')
}}
</el-button>
<el-button type="primary" @click="handleTempStore" :disabled="loading">{{
t('jfI18n.temp')
}}
</el-button>
</span>
</footer>
</div>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="data.currFlowForm" :initFormPermPrint="initFormPermPrint"> </form-render>
</div>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }} </el-button>
<el-button type="primary" @click="handleTempStore" :disabled="loading">{{ t('jfI18n.temp') }} </el-button>
</span>
</footer>
</div>
</template>
<script setup lang="ts" name="FlowApplicationInitiate">
import * as flowApplication from '/@/api/order/flow-application'
import {useI18n} from "vue-i18n";
import {validateNull} from "/@/utils/validate";
import {deepClone} from "/@/utils/other";
import {setPropsNull} from "/@/flow/support/common";
import {doInitData, doInitiateForm, doTempStore, initFormMethods, initJobDataByApp} from "../index";
import {handleFormStartPerm} from "/@/flow/utils/form-perm";
import {currFormIsView} from "/@/api/order/order-key-vue";
import * as flowApplication from '/@/api/order/flow-application';
import { useI18n } from 'vue-i18n';
import { validateNull } from '/@/utils/validate';
import { deepClone } from '/@/utils/other';
import { setPropsNull } from '/@/flow/support/common';
import { doInitData, doInitiateForm, doTempStore, initFormMethods, initJobDataByApp } from '../index';
import { handleFormStartPerm } from '/@/flow/utils/form-perm';
import { currFormIsView } from '/@/api/order/order-key-vue';
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null)
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null);
const {t} = useI18n();
const $emit = defineEmits(['handleInitiateOrder']);
const loading = ref(false);
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
}
});
const { t } = useI18n();
const $emit = defineEmits(['handleInitiateOrder']);
const loading = ref(false);
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
},
});
const data = reactive({
// 兼容app端监听currFlowForm
currFlowForm: {
type: Object,
default: {},
},
submitBtn: true
});
const data = reactive({
// 兼容app端监听currFlowForm
currFlowForm: {
type: Object,
default: {},
},
submitBtn: true,
});
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, () => {
data.currFlowForm = props.currFlowForm
})
}
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, () => {
data.currFlowForm = props.currFlowForm;
});
}
function handleGetObj(id) {
flowApplication.getObj(id).then(resp => {
let form = resp.data ? resp.data : {}
Object.assign(data.currFlowForm, form);
})
}
function handleGetObj(id) {
flowApplication.getObj(id).then((resp) => {
let form = resp.data ? resp.data : {};
Object.assign(data.currFlowForm, form);
});
}
async function submitForm() {
await doInitiateForm(loading, props, data, $route, formCreateRef, $emit, saveInitData, t)
}
async function submitForm() {
await doInitiateForm(loading, props, data, $route, formCreateRef, $emit, saveInitData, t);
}
function handleTempStore() {
doTempStore(loading, data, $route, formCreateRef, $emit, saveInitData)
}
function handleTempStore() {
doTempStore(loading, data, $route, formCreateRef, $emit, saveInitData);
}
const methods = initFormMethods(formCreateRef, data)
const methods = initFormMethods(formCreateRef, data);
async function initFormPermPrint(formInfo) {
// 处理表单权限
let res = await handleFormStartPerm(null, null, formInfo, data.currFlowForm.defFlowId, null, data.currFlowForm.type)
await currFormIsView(methods, res.elTab, true, res.callback, res.widgetList)
return res.elTab
}
async function initFormPermPrint(formInfo) {
// 处理表单权限
let res = await handleFormStartPerm(null, null, formInfo, data.currFlowForm.defFlowId, null, data.currFlowForm.type);
await currFormIsView(methods, res.elTab, true, res.callback, res.widgetList);
return res.elTab;
}
function saveInitData(form) {
data.currFlowForm.formData = validateNull(form) ? undefined : form
let formJson = deepClone(data.currFlowForm)
formJson.formData = JSON.stringify(formJson.formData)
formJson.formId = formJson.id
setPropsNull(formJson, 'id', 'status')
return formJson;
}
function saveInitData(form) {
data.currFlowForm.formData = validateNull(form) ? undefined : form;
let formJson = deepClone(data.currFlowForm);
formJson.formData = JSON.stringify(formJson.formData);
formJson.formId = formJson.id;
setPropsNull(formJson, 'id', 'status');
return formJson;
}
async function getFormData() {
return await doInitData(formCreateRef, saveInitData)
}
async function getFormData() {
return await doInitData(formCreateRef, saveInitData);
}
// 暴露变量
defineExpose({
getFormData,
})
// 暴露变量
defineExpose({
getFormData,
});
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
onMounted(() => {
initJobData()
});
onMounted(() => {
initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,170 +1,176 @@
<template>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading"
:disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.type')" prop="type">
<el-select v-model="form.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable
filterable disabled>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<div>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.type')" prop="type">
<el-select v-model="form.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable disabled>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select v-model="form.receiveDept" :placeholder="t('handoverFlow.inputReceiveDeptTip')"
remote :remote-method="remoteMethodDept" :reserve-keyword="false"
clearable filterable disabled>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name"
:value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select
v-model="form.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')"
remote
:remote-method="remoteMethodDept"
:reserve-keyword="false"
clearable
filterable
disabled
>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.receiveUser" :placeholder="t('handoverFlow.inputReceiveUserTip')"
remote :remote-method="remoteMethodUser" :reserve-keyword="false"
clearable filterable disabled>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name"
:value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="operType !== 'view'">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="methods.handleUpdate" :disabled="loading">{{
$t('common.confirmButtonText')
}}</el-button>
</span>
</footer>
</template>
</div>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')"
remote
:remote-method="remoteMethodUser"
:reserve-keyword="false"
clearable
filterable
disabled
>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template v-if="operType !== 'view'">
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="methods.handleUpdate" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</footer>
</template>
</div>
</template>
<script setup lang="ts" name="HandoverDistributionForm">
import {useMessage} from "/@/hooks/message";
import {distributePerson, getObj} from '/@/api/order/handover-flow'
import {useI18n} from "vue-i18n"
import {rule} from '/@/utils/validate';
import {onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey} from "/@/flow/components/convert-name/convert";
import * as orderVue from "/@/api/order/order-key-vue";
import { useMessage } from '/@/hooks/message';
import { distributePerson, getObj } from '/@/api/order/handover-flow';
import { useI18n } from 'vue-i18n';
import { rule } from '/@/utils/validate';
import { onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert';
import * as orderVue from '/@/api/order/order-key-vue';
const {t} = useI18n();
const emits = defineEmits(["handleJob"]);
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "receiveDept"}, {key: "receiveUser"});
onMounted(() => {
// onLoad(dicData);
});
const { t } = useI18n();
const emits = defineEmits(['handleJob']);
// 定义变量内容
const dataFormRef = ref();
const loading = ref(false);
const operType = ref(false);
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'receiveDept' }, { key: 'receiveUser' });
onMounted(() => {
// onLoad(dicData);
});
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', "receiveDept")
}
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', 'receiveDept');
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "receiveUser")
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'receiveUser');
}
// 提交表单数据
const form = reactive({
type: '',
receiveDept: '',
receiveUser: '',
});
// 提交表单数据
const form = reactive({
type: '',
receiveDept: '',
receiveUser: '',
});
// 定义校验规则
const dataRules = ref({
type: [{required: true, message: '交接类型不能为空', trigger: 'blur'}],
receiveDept: [{required: true, message: '接收部门不能为空', trigger: 'blur'}],
receiveUser: [{required: true, message: '接收人不能为空', trigger: 'blur'}],
})
// 定义校验规则
const dataRules = ref({
type: [{ required: true, message: '交接类型不能为空', trigger: 'blur' }],
receiveDept: [{ required: true, message: '接收部门不能为空', trigger: 'blur' }],
receiveUser: [{ required: true, message: '接收人不能为空', trigger: 'blur' }],
});
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const methods = {
disableForm() {
operType.value = "view"
},
enableForm() {
operType.value = "flow"
},
async initJobData() {
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, methods.handleUpdate)
methods.handleGetObj(props.currJob.orderId)
},
handleGetObj(id) {
getObj(id).then(response => {
Object.assign(form, response.data)
onFormLoaded(dicData, form);
form.runJobId = props.currJob.id
})
},
async handleUpdate() {
try {
loading.value = true;
// 转岗或离职交接时需要分配接收人来接收未来任务
let handoverReason = props.currJob.order.handoverReason;
if (form.isNeedReceive && (handoverReason === '1' || handoverReason === '2') && !form.receiveUser) {
useMessage().error('转岗或离职交接时需要分配接收人来接收未来任务')
return
}
await distributePerson(form)
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits)
useMessage().success('操作成功')
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
}
}
const methods = {
disableForm() {
operType.value = 'view';
},
enableForm() {
operType.value = 'flow';
},
async initJobData() {
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, methods.handleUpdate);
methods.handleGetObj(props.currJob.orderId);
},
handleGetObj(id) {
getObj(id).then((response) => {
Object.assign(form, response.data);
onFormLoaded(dicData, form);
form.runJobId = props.currJob.id;
});
},
async handleUpdate() {
try {
loading.value = true;
// 转岗或离职交接时需要分配接收人来接收未来任务
let handoverReason = props.currJob.order.handoverReason;
if (form.isNeedReceive && (handoverReason === '1' || handoverReason === '2') && !form.receiveUser) {
useMessage().error('转岗或离职交接时需要分配接收人来接收未来任务');
return;
}
await distributePerson(form);
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits);
useMessage().success('操作成功');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
},
};
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
methods.initJobData();
}
);
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
methods.initJobData();
}
);
onMounted(() => {
methods.initJobData()
});
onMounted(() => {
methods.initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
.el-dialog__footer {
text-align: center;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,226 +1,239 @@
<template>
<el-dialog :title="title" v-model="visible" width="60%"
:close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.code')" prop="code">
<el-input v-model="form.code" :placeholder="t('handoverFlow.inputCodeTip')" disabled/>
</el-form-item>
</el-col>
<el-dialog :title="title" v-model="visible" width="60%" :close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.code')" prop="code">
<el-input v-model="form.code" :placeholder="t('handoverFlow.inputCodeTip')" disabled />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.flowKey')" prop="flowKey">
<el-select v-model="form.flowKey" :placeholder="t('handoverFlow.inputFlowKeyTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.flowKey" :key="index" :label="item.flowName" :value="item.flowKey"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.flowKey')" prop="flowKey">
<el-select v-model="form.flowKey" :placeholder="t('handoverFlow.inputFlowKeyTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.flowKey" :key="index" :label="item.flowName" :value="item.flowKey"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.type')" prop="type">
<el-select v-model="form.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.type')" prop="type">
<el-select v-model="form.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.status')" prop="status">
<el-select v-model="form.status" :placeholder="t('handoverFlow.inputStatusTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.status')" prop="status">
<el-select v-model="form.status" :placeholder="t('handoverFlow.inputStatusTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverReason')" prop="handoverReason">
<el-select v-model="form.handoverReason" :placeholder="t('handoverFlow.inputHandoverReasonTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverReason')" prop="handoverReason">
<el-select v-model="form.handoverReason" :placeholder="t('handoverFlow.inputHandoverReasonTip')" clearable filterable>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverUserDept')" prop="handoverUserDept">
<el-select v-model="form.handoverUserDept" :placeholder="t('handoverFlow.inputHandoverUserDeptTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.handoverUserDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverUserDept')" prop="handoverUserDept">
<el-select v-model="form.handoverUserDept" :placeholder="t('handoverFlow.inputHandoverUserDeptTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.handoverUserDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverUser')" prop="handoverUser">
<el-select v-model="form.handoverUser" :placeholder="t('handoverFlow.inputHandoverUserTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.handoverUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.handoverUser')" prop="handoverUser">
<el-select v-model="form.handoverUser" :placeholder="t('handoverFlow.inputHandoverUserTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.handoverUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select v-model="form.receiveDept" :placeholder="t('handoverFlow.inputReceiveDeptTip')" clearable filterable
remote :remote-method="remoteMethodDept" :reserve-keyword="false">
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select
v-model="form.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')"
clearable
filterable
remote
:remote-method="remoteMethodDept"
:reserve-keyword="false"
>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="form.receiveUser" :placeholder="t('handoverFlow.inputReceiveUserTip')" clearable filterable
remote :remote-method="remoteMethodUser" :reserve-keyword="false">
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="form.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')"
clearable
filterable
remote
:remote-method="remoteMethodUser"
:reserve-keyword="false"
>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.finishTime')" prop="finishTime">
<el-date-picker type="datetime" :placeholder="t('handoverFlow.inputFinishTimeTip')" v-model="form.finishTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverFlow.finishTime')" prop="finishTime">
<el-date-picker
type="datetime"
:placeholder="t('handoverFlow.inputFinishTimeTip')"
v-model="form.finishTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="HandoverFlowDialog">
import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj } from '/@/api/order/handover-flow';
import { useI18n } from 'vue-i18n';
import { rule } from '/@/utils/validate';
import { onCascadeChange, onFormLoadedUrl, onLoadDicUrl, remoteMethodByKey } from '/@/flow/components/convert-name/convert';
const emit = defineEmits(['refresh']);
import { useMessage } from "/@/hooks/message";
import { getObj, addObj, putObj } from '/@/api/order/handover-flow'
import { useI18n } from "vue-i18n"
import { rule } from '/@/utils/validate';
import {
onCascadeChange,
onFormLoadedUrl,
onLoadDicUrl,
remoteMethodByKey
} from "/@/flow/components/convert-name/convert";
const emit = defineEmits(['refresh']);
const { t } = useI18n();
const { t } = useI18n();
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const cascadeDic = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'receiveDept' }, { key: 'receiveUser' }, { key: 'handoverUserDept' }, { key: 'handoverUser' });
const onCascade = onCascadeChange(cascadeDic, { key: 'flowInstId', cascades: ['flowKey'] });
onMounted(() => {
// onLoad(dicData);
});
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const cascadeDic = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "receiveDept"}, {key: "receiveUser"}, {key: "handoverUserDept"}, {key: "handoverUser"});
const onCascade = onCascadeChange(cascadeDic, {key: "flowInstId", cascades: ["flowKey"]});
onMounted(() => {
// onLoad(dicData);
});
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', 'receiveDept');
}
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', "receiveDept")
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'receiveUser');
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "receiveUser")
}
// 提交表单数据
const form = reactive({
code: '',
flowKey: '',
type: '',
status: '',
handoverReason: '',
handoverUser: '',
handoverUserDept: '',
receiveDept: '',
receiveUser: '',
flowInstId: '',
finishTime: '',
});
// 提交表单数据
const form = reactive({
code: '',
flowKey: '',
type: '',
status: '',
handoverReason: '',
handoverUser: '',
handoverUserDept: '',
receiveDept: '',
receiveUser: '',
flowInstId: '',
finishTime: '',
});
// 定义校验规则
const dataRules = ref({
code: [{ required: true, message: '编号不能为空', trigger: 'blur' }],
flowKey: [{ required: true, message: '业务类型不能为空', trigger: 'blur' }],
type: [{ required: true, message: '交接类型不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
handoverReason: [{ required: true, message: '交接原因不能为空', trigger: 'blur' }],
receiveDept: [{ required: true, message: '接收部门不能为空', trigger: 'blur' }],
receiveUser: [{ required: true, message: '接收人不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
code: [{required: true, message: '编号不能为空', trigger: 'blur'}],
flowKey: [{required: true, message: '业务类型不能为空', trigger: 'blur'}],
type: [{required: true, message: '交接类型不能为空', trigger: 'blur'}],
status: [{required: true, message: '状态不能为空', trigger: 'blur'}],
handoverReason: [{required: true, message: '交接原因不能为空', trigger: 'blur'}],
receiveDept: [{required: true, message: '接收部门不能为空', trigger: 'blur'}],
receiveUser: [{required: true, message: '接收人不能为空', trigger: 'blur'}],
})
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true;
operType.value = type;
form.id = '';
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true
operType.value = type;
form.id = ''
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 获取HandoverFlow信息
if (id) {
form.id = id;
getHandoverFlowData(id);
}
};
// 获取HandoverFlow信息
if (id) {
form.id = id
getHandoverFlowData(id)
}
};
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
try {
loading.value = true;
form.id ? await putObj(form) : await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
try {
loading.value = true;
form.id ? await putObj(form) : await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getHandoverFlowData = (id: string) => {
// 获取数据
loading.value = true;
getObj(id)
.then((res: any) => {
Object.assign(form, res.data);
onFormLoaded(dicData, form);
onCascade(form);
})
.finally(() => {
loading.value = false;
});
};
// 初始化表单数据
const getHandoverFlowData = (id: string) => {
// 获取数据
loading.value = true
getObj(id).then((res: any) => {
Object.assign(form, res.data)
onFormLoaded(dicData, form);
onCascade(form);
}).finally(() => {
loading.value = false
})
};
// 暴露变量
defineExpose({
openDialog
});
// 暴露变量
defineExpose({
openDialog,
});
</script>

View File

@@ -1,42 +1,41 @@
export default {
handoverFlow: {
index: '#',
importhandoverFlowTip: 'import HandoverFlow',
id: 'id',
code: 'code',
flowKey: 'flowKey',
type: 'type',
status: 'status',
createUser: 'createUser',
createTime: 'createTime',
handoverReason: 'handoverReason',
handoverUser: 'handoverUser',
handoverUserDept: 'handoverUserDept',
receiveDept: 'receiveDept',
receiveUser: 'receiveUser',
flowInstId: 'flowInstId',
finishTime: 'finishTime',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputTypeTip: 'input type',
inputStatusTip: 'input status',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputHandoverReasonTip: 'input handoverReason',
inputHandoverUserTip: 'input handoverUser',
inputHandoverUserDeptTip: 'input handoverUserDept',
inputReceiveDeptTip: 'input receiveDept',
inputReceiveUserTip: 'input receiveUser',
inputFlowInstIdTip: 'input flowInstId',
inputFinishTimeTip: 'input finishTime',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
}
}
handoverFlow: {
index: '#',
importhandoverFlowTip: 'import HandoverFlow',
id: 'id',
code: 'code',
flowKey: 'flowKey',
type: 'type',
status: 'status',
createUser: 'createUser',
createTime: 'createTime',
handoverReason: 'handoverReason',
handoverUser: 'handoverUser',
handoverUserDept: 'handoverUserDept',
receiveDept: 'receiveDept',
receiveUser: 'receiveUser',
flowInstId: 'flowInstId',
finishTime: 'finishTime',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputTypeTip: 'input type',
inputStatusTip: 'input status',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputHandoverReasonTip: 'input handoverReason',
inputHandoverUserTip: 'input handoverUser',
inputHandoverUserDeptTip: 'input handoverUserDept',
inputReceiveDeptTip: 'input receiveDept',
inputReceiveUserTip: 'input receiveUser',
inputFlowInstIdTip: 'input flowInstId',
inputFinishTimeTip: 'input finishTime',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
},
};

View File

@@ -1,42 +1,41 @@
export default {
handoverFlow: {
index: '#',
importhandoverFlowTip: '导入交接流程',
id: 'ID',
code: '工单编号',
flowKey: '流程名称',
type: '交接类型',
status: '状态',
createUser: '创建人',
createTime: '创建时间',
handoverReason: '交接原因',
handoverUser: '交接人',
handoverUserDept: '交接人部门',
receiveDept: '接收部门',
receiveUser: '接收人',
flowInstId: '流程实例ID',
finishTime: '完成时间',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标识',
inputIdTip: '请输入ID',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入业务类型',
inputTypeTip: '请输入交接类型',
inputStatusTip: '请输入状态',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputHandoverReasonTip: '请输入交接原因',
inputHandoverUserTip: '请输入交接人',
inputHandoverUserDeptTip: '请输入交接人部门',
inputReceiveDeptTip: '请输入接收部门',
inputReceiveUserTip: '请输入接收人',
inputFlowInstIdTip: '请输入流程实例ID',
inputFinishTimeTip: '请输入完成时间',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标识',
}
}
handoverFlow: {
index: '#',
importhandoverFlowTip: '导入交接流程',
id: 'ID',
code: '工单编号',
flowKey: '流程名称',
type: '交接类型',
status: '状态',
createUser: '创建人',
createTime: '创建时间',
handoverReason: '交接原因',
handoverUser: '交接人',
handoverUserDept: '交接人部门',
receiveDept: '接收部门',
receiveUser: '接收人',
flowInstId: '流程实例ID',
finishTime: '完成时间',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标识',
inputIdTip: '请输入ID',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入业务类型',
inputTypeTip: '请输入交接类型',
inputStatusTip: '请输入状态',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputHandoverReasonTip: '请输入交接原因',
inputHandoverUserTip: '请输入交接人',
inputHandoverUserDeptTip: '请输入交接人部门',
inputReceiveDeptTip: '请输入接收部门',
inputReceiveUserTip: '请输入接收人',
inputFlowInstIdTip: '请输入流程实例ID',
inputFinishTimeTip: '请输入完成时间',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标识',
},
};

View File

@@ -1,286 +1,310 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.code')" prop="code">
<el-input :placeholder="t('handoverFlow.inputCodeTip')" v-model="state.queryForm.code" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason" >
<el-tooltip content="离职 或 转岗 会默认交接全部任务。故可随意选择1条任务发起即可" placement="top">
<el-select v-model="state.queryForm.handoverReason" :placeholder="t('handoverFlow.inputHandoverReasonTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept" >
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveDept" :placeholder="t('handoverFlow.inputReceiveDeptTip')" clearable filterable
remote :remote-method="remoteMethodDept" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser" >
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveUser" :placeholder="t('handoverFlow.inputReceiveUserTip')" clearable filterable
remote :remote-method="remoteMethodUser" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type" >
<el-select v-model="state.queryForm.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable style="max-width: 180px"
@change="typeChange">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :disabled="DIC_PROP.HANDOVER_TYPE[1].value === item.value"
:key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="Promotion" type="primary" class="ml10" @click="handleInitiate"
:loading="state.loading"
v-auth="'order_handoverflow_add'">
{{ $t('jfI18n.initHandover') }}
</el-button>
<right-toolbar v-model:showSearch="showSearch" :export="'order_handoverflow_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverFlow.index')" width="40" />
<el-table-column prop="code" :label="t('handoverFlow.code')" show-overflow-tooltip/>
<el-table-column prop="flowKey" :label="t('handoverFlow.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId"
:valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="type" :label="t('handoverFlow.type')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_TYPE" :value="scope.row.type ? scope.row.type : state.queryForm.type"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverFlow.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverFlow.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverFlow.createTime')" show-overflow-tooltip/>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.code')" prop="code">
<el-input :placeholder="t('handoverFlow.inputCodeTip')" v-model="state.queryForm.code" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason">
<el-tooltip content="离职 或 转岗 会默认交接全部任务。故可随意选择1条任务发起即可" placement="top">
<el-select
v-model="state.queryForm.handoverReason"
:placeholder="t('handoverFlow.inputHandoverReasonTip')"
clearable
filterable
style="max-width: 180px"
>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')"
clearable
filterable
remote
:remote-method="remoteMethodDept"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')"
clearable
filterable
remote
:remote-method="remoteMethodUser"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type">
<el-select
v-model="state.queryForm.type"
:placeholder="t('handoverFlow.inputTypeTip')"
clearable
filterable
style="max-width: 180px"
@change="typeChange"
>
<el-option
v-for="(item, index) in DIC_PROP.HANDOVER_TYPE"
:disabled="DIC_PROP.HANDOVER_TYPE[1].value === item.value"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="Promotion" type="primary" class="ml10" @click="handleInitiate" :loading="state.loading" v-auth="'order_handoverflow_add'">
{{ $t('jfI18n.initHandover') }}
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_handoverflow_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverFlow.index')" width="40" />
<el-table-column prop="code" :label="t('handoverFlow.code')" show-overflow-tooltip />
<el-table-column prop="flowKey" :label="t('handoverFlow.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId" :valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="type" :label="t('handoverFlow.type')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_TYPE" :value="scope.row.type ? scope.row.type : state.queryForm.type"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverFlow.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverFlow.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverFlow.createTime')" show-overflow-tooltip />
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<el-dialog
v-if="data.showNodeHandover"
append-to-body
v-model="data.showNodeHandover"
top="20px"
width="80%"
:title="data.handoverTitle">
<handover-node-record
ref="node"
:selections="data.selections"
:handover-form="data.handoverForm"
@onHandoverFlow="onHandoverFlow"></handover-node-record>
</el-dialog>
</div>
<el-dialog v-if="data.showNodeHandover" append-to-body v-model="data.showNodeHandover" top="20px" width="80%" :title="data.handoverTitle">
<handover-node-record
ref="node"
:selections="data.selections"
:handover-form="data.handoverForm"
@onHandoverFlow="onHandoverFlow"
></handover-node-record>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="systemHandoverFlow">
import { BasicTableProps, useTable } from "/@/hooks/table";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { useI18n } from "vue-i18n";
import {onLoadDicUrl, onLoaded, remoteMethodByKey} from "/@/flow/components/convert-name/convert";
import {validateNull} from "/@/utils/validate";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import * as handoverFlow from "/@/api/order/handover-flow";
import * as runJob from "/@/api/jsonflow/run-job";
import { BasicTableProps, useTable } from '/@/hooks/table';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { useI18n } from 'vue-i18n';
import { onLoadDicUrl, onLoaded, remoteMethodByKey } from '/@/flow/components/convert-name/convert';
import { validateNull } from '/@/utils/validate';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import * as handoverFlow from '/@/api/order/handover-flow';
import * as runJob from '/@/api/jsonflow/run-job';
// 引入组件
const HandoverNodeRecord = defineAsyncComponent(() => import('/@/views/order/handover-node-record/initiate.vue'));
const { t } = useI18n()
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
// 引入组件
const HandoverNodeRecord = defineAsyncComponent(() => import('/@/views/order/handover-node-record/initiate.vue'));
const { t } = useI18n();
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', "receiveDept")
}
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', 'receiveDept');
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "receiveUser")
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'receiveUser');
}
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
type: DIC_PROP.HANDOVER_TYPE[0].value,
status: DIC_PROP.HANDOVER_STATUS[1].value
},
pageList: runJob.fetchNodeHandover,
onLoaded: onLoaded({key: "createUser"}, {key: "flowInstId"}, {key: "runJobId"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
type: DIC_PROP.HANDOVER_TYPE[0].value,
status: DIC_PROP.HANDOVER_STATUS[1].value,
},
pageList: runJob.fetchNodeHandover,
onLoaded: onLoaded({ key: 'createUser' }, { key: 'flowInstId' }, { key: 'runJobId' }),
descs: ['create_time'],
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
data.selections = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
data.selections = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-flow/export', state.queryForm, 'handover-flow.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-flow/export', state.queryForm, 'handover-flow.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
data.selections = objs
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
data.selections = objs;
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverFlow.delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverFlow.delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
const data = reactive({
selections: [],
showNodeHandover: false,
handoverTitle: null,
handoverForm: null,
})
const data = reactive({
selections: [],
showNodeHandover: false,
handoverTitle: null,
handoverForm: null,
});
function fetchListFun(fetchList, params) {
if (!params.status || !params.type) {
useMessage().info('请选择必填交接条件')
return
}
state.pageList = fetchList
getDataList()
}
function fetchListFun(fetchList, params) {
if (!params.status || !params.type) {
useMessage().info('请选择必填交接条件');
return;
}
state.pageList = fetchList;
getDataList();
}
function typeChange() {
let type = state.queryForm.type
let handoverType = DIC_PROP.HANDOVER_TYPE
if (type === handoverType[0].value) {
// 任务交接
fetchListFun(runJob.fetchNodeHandover, state.queryForm)
} else {
// 公共交接 TODO 需自行扩展自身业务,参考任务交接
// fetchListFun(company.fetchCommonHandover, state.queryForm)
}
handleSelectionChange([])
}
function typeChange() {
let type = state.queryForm.type;
let handoverType = DIC_PROP.HANDOVER_TYPE;
if (type === handoverType[0].value) {
// 任务交接
fetchListFun(runJob.fetchNodeHandover, state.queryForm);
} else {
// 公共交接 TODO 需自行扩展自身业务,参考任务交接
// fetchListFun(company.fetchCommonHandover, state.queryForm)
}
handleSelectionChange([]);
}
function handleInitiate() {
const type = state.queryForm.type
if (validateFormInfo(type)) {
return;
}
data.handoverTitle = DIC_PROP.HANDOVER_TYPE.filter(f => f.value === type)[0].label
// 转岗或离职,则全部交接
if (validateNull(data.selections)) {
useMessage().info('请选择交接项')
return
}
data.handoverForm = Object.assign({}, state.queryForm)
data.handoverForm.code = null
data.showNodeHandover = true
}
function handleInitiate() {
const type = state.queryForm.type;
if (validateFormInfo(type)) {
return;
}
data.handoverTitle = DIC_PROP.HANDOVER_TYPE.filter((f) => f.value === type)[0].label;
// 转岗或离职,则全部交接
if (validateNull(data.selections)) {
useMessage().info('请选择交接项');
return;
}
data.handoverForm = Object.assign({}, state.queryForm);
data.handoverForm.code = null;
data.showNodeHandover = true;
}
function validateFormInfo(type) {
const handoverReason = state.queryForm.handoverReason
if (!handoverReason) {
useMessage().info('请选择交接原因')
return true
}
if (!type) {
useMessage().info('请选择交接类型')
return true
}
if (!state.queryForm.status) {
useMessage().info('请选择交接状态')
return true
}
if (!state.queryForm.receiveDept) {
useMessage().info('请选择接收部门')
return true
}
if (!state.queryForm.receiveUser) {
useMessage().info('请选择接收人')
return true
}
return false
}
function validateFormInfo(type) {
const handoverReason = state.queryForm.handoverReason;
if (!handoverReason) {
useMessage().info('请选择交接原因');
return true;
}
if (!type) {
useMessage().info('请选择交接类型');
return true;
}
if (!state.queryForm.status) {
useMessage().info('请选择交接状态');
return true;
}
if (!state.queryForm.receiveDept) {
useMessage().info('请选择接收部门');
return true;
}
if (!state.queryForm.receiveUser) {
useMessage().info('请选择接收人');
return true;
}
return false;
}
function onHandoverFlow(type) {
getDataList()
data.showNodeHandover = false
}
function onHandoverFlow(type) {
getDataList();
data.showNodeHandover = false;
}
onMounted(() => {
state.loading = false
});
onMounted(() => {
state.loading = false;
});
</script>

View File

@@ -1,267 +1,296 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.code')" prop="code" >
<el-input :placeholder="t('handoverFlow.inputCodeTip')" v-model="state.queryForm.code" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason" >
<el-select v-model="state.queryForm.handoverReason" :placeholder="t('handoverFlow.inputHandoverReasonTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept" >
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveDept" :placeholder="t('handoverFlow.inputReceiveDeptTip')" clearable filterable
remote :remote-method="remoteMethodDept" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser" >
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveUser" :placeholder="t('handoverFlow.inputReceiveUserTip')" clearable filterable
remote :remote-method="remoteMethodUser" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type" >
<el-select v-model="state.queryForm.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :disabled="DIC_PROP.HANDOVER_TYPE[1].value === item.value"
:key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.status')" prop="status" >
<el-select v-model="state.queryForm.status" :placeholder="t('handoverFlow.inputStatusTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.code')" prop="code">
<el-input :placeholder="t('handoverFlow.inputCodeTip')" v-model="state.queryForm.code" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason">
<el-select
v-model="state.queryForm.handoverReason"
:placeholder="t('handoverFlow.inputHandoverReasonTip')"
clearable
filterable
style="max-width: 180px"
>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')"
clearable
filterable
remote
:remote-method="remoteMethodDept"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')"
clearable
filterable
remote
:remote-method="remoteMethodUser"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type">
<el-select v-model="state.queryForm.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable style="max-width: 180px">
<el-option
v-for="(item, index) in DIC_PROP.HANDOVER_TYPE"
:disabled="DIC_PROP.HANDOVER_TYPE[1].value === item.value"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.status')" prop="status">
<el-select v-model="state.queryForm.status" :placeholder="t('handoverFlow.inputStatusTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button
plain
:disabled="multiple"
icon="Delete"
type="primary"
class="ml10"
v-auth="'order_handoverflow_del'"
@click="handleDelete(selectObjs)"
>
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button plain :disabled="multiple" icon="Delete" type="primary" class="ml10"
v-auth="'order_handoverflow_del'" @click="handleDelete(selectObjs)">
</el-button>
</el-tooltip>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_handoverflow_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverFlow.index')" width="40" />
<el-table-column prop="code" :label="t('handoverFlow.code')" show-overflow-tooltip />
<el-table-column prop="flowKey" :label="t('handoverFlow.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="receiveDept" :label="t('handoverFlow.receiveDept')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.receiveDept" :value="scope.row.receiveDept" :valueKey="'deptId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="receiveUser" :label="t('handoverFlow.receiveUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.receiveUser" :value="scope.row.receiveUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="type" :label="t('handoverFlow.type')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_TYPE" :value="scope.row.type"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverFlow.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverFlow.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverFlow.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="120">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)"> </el-button>
</el-tooltip>
<right-toolbar v-model:showSearch="showSearch" :export="'order_handoverflow_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverFlow.index')" width="40" />
<el-table-column prop="code" :label="t('handoverFlow.code')" show-overflow-tooltip/>
<el-table-column prop="flowKey" :label="t('handoverFlow.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="receiveDept" :label="t('handoverFlow.receiveDept')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.receiveDept" :value="scope.row.receiveDept"
:valueKey="'deptId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="receiveUser" :label="t('handoverFlow.receiveUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.receiveUser" :value="scope.row.receiveUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="type" :label="t('handoverFlow.type')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_TYPE" :value="scope.row.type"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverFlow.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverFlow.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverFlow.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="120">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip
placement="top"
v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value || scope.row.status === DIC_PROP.ORDER_STATUS[0].value"
>
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])"> </el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value || scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])">
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</template>
<script setup lang="ts" name="systemHandoverFlowView">
import { BasicTableProps, useTable } from "/@/hooks/table";
import { fetchList, delObjs } from "/@/api/order/handover-flow";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from '/@/api/order/handover-flow';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { useI18n } from "vue-i18n";
import {onLoadDicUrl, onLoaded, remoteMethodByKey} from "/@/flow/components/convert-name/convert";
import {recallReset} from "/@/api/jsonflow/run-flow";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import { useI18n } from 'vue-i18n';
import { onLoadDicUrl, onLoaded, remoteMethodByKey } from '/@/flow/components/convert-name/convert';
import { recallReset } from '/@/api/jsonflow/run-flow';
import { DIC_PROP } from '/@/flow/support/dict-prop';
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n()
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n();
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
onMounted(() => {
// onLoad(dicData);
});
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', "receiveDept")
}
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', 'receiveDept');
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "receiveUser")
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'receiveUser');
}
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 定义变量内容
const formDialogRef = ref();
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({key: "createUser"}, {key: "receiveUser"}, {key: "flowInstId"}, {key: "receiveDept"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({ key: 'createUser' }, { key: 'receiveUser' }, { key: 'flowInstId' }, { key: 'receiveDept' }),
descs: ['create_time'],
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-flow/export', state.queryForm, 'handover-flow.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-flow/export', state.queryForm, 'handover-flow.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
function handleRecallReset(row) {
let params = {id: row.flowInstId, flowKey: row.flowKey, status: row.status}
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
})
return
}
useMessageBox().confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params)
}).then(() => {
useMessage().success('撤回成功')
getDataList();
})
}
function handleRecallReset(row) {
let params = { id: row.flowInstId, flowKey: row.flowKey, status: row.status };
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
});
return;
}
useMessageBox()
.confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params);
})
.then(() => {
useMessage().success('撤回成功');
getDataList();
});
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
</script>

View File

@@ -1,439 +1,498 @@
<template>
<div>
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason">
<el-select v-model="state.queryForm.handoverReason"
:placeholder="t('handoverFlow.inputHandoverReasonTip')" clearable filterable
style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index"
:label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')" clearable filterable
remote :remote-method="remoteMethodDept" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name"
:value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select v-model="state.queryForm.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')" clearable filterable
remote :remote-method="remoteMethodUser" :reserve-keyword="false"
style="max-width: 180px">
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name"
:value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type">
<el-select v-model="state.queryForm.type" :placeholder="t('handoverFlow.inputTypeTip')"
clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverNodeRecord.status')" prop="status">
<el-select v-model="state.queryForm.status"
:placeholder="t('handoverNodeRecord.inputStatusTip')" clearable filterable
style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index"
:label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="edit-pen" type="primary" class="ml10" @click="methods.handleUpdateFlow"
:loading="state.loading" v-if="state.queryForm.retStatus === '1'"
v-auth="'order_handovernoderecord_edit'">
{{ $t('jfI18n.updateFlow') }}
</el-button>
<el-button icon="RefreshLeft" type="primary" class="ml10" @click="methods.handleCheckToReject"
:loading="state.loading" v-if="data.isCheckToReject"
v-auth="'order_handovernoderecord_edit'">
{{ $t('jfI18n.rejectBtn') }}
</el-button>
<el-button icon="CircleCheck" type="primary" class="ml10" @click="methods.handleConfirmReceive"
:loading="state.loading" v-if="data.isConfirmReceive"
v-auth="'order_handovernoderecord_edit'">
{{ $t('jfI18n.receiveBtn') }}
</el-button>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center" v-if="data.selection"/>
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40"/>
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId"
:valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip/>
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip>
<template #default="scope">
<el-input :disabled="!scope.row.$cellEdit" v-model="scope.row.todoList" type="textarea"
:placeholder="t('handoverNodeRecord.inputTodoListTip')"/>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="200" v-if="data.menu">
<template #default="scope">
<el-button text type="primary" icon="view" v-if="!scope.row.$cellEdit"
@click="formDialogRef.openDialog('view', scope.row.id)"
v-auth="'order_handovernoderecord_view'">
{{ $t('common.viewBtn') }}
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'order_handovernoderecord_edit'" v-if="!scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, true)">{{ $t('common.editBtn') }}
</el-button>
<el-button icon="Check" text type="primary" v-auth="'order_handovernoderecord_add'" v-if="scope.row.$cellEdit"
@click="methods.handleUpdate(scope.row, scope.$index)">{{ $t('jfI18n.saveBtn') }}
</el-button>
<el-button icon="Close" text type="primary" v-auth="'order_handovernoderecord_edit'" v-if="scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, false)">{{ $t('jfI18n.cancelBtn') }}
</el-button>
<el-button icon="delete" text type="primary" v-auth="'order_handovernoderecord_del'"
@click="handleDelete(scope.row.id, scope.$index)">{{
$t('common.delBtn')
}}
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
v-bind="state.pagination"/>
</div>
<div>
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverFlow.handoverReason')" prop="handoverReason">
<el-select
v-model="state.queryForm.handoverReason"
:placeholder="t('handoverFlow.inputHandoverReasonTip')"
clearable
filterable
style="max-width: 180px"
>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_REASON" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveDept')" prop="receiveDept">
<el-tooltip content="请输入部门名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveDept"
:placeholder="t('handoverFlow.inputReceiveDeptTip')"
clearable
filterable
remote
:remote-method="remoteMethodDept"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveDept" :key="index" :label="item.name" :value="item.deptId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.receiveUser')" prop="receiveUser">
<el-tooltip content="请输入用户名称进行模糊搜索" placement="top">
<el-select
v-model="state.queryForm.receiveUser"
:placeholder="t('handoverFlow.inputReceiveUserTip')"
clearable
filterable
remote
:remote-method="remoteMethodUser"
:reserve-keyword="false"
style="max-width: 180px"
>
<el-option v-for="(item, index) in dicData.receiveUser" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-tooltip>
</el-form-item>
<el-form-item :label="$t('handoverFlow.type')" prop="type">
<el-select v-model="state.queryForm.type" :placeholder="t('handoverFlow.inputTypeTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_TYPE" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="$t('handoverNodeRecord.status')" prop="status">
<el-select
v-model="state.queryForm.status"
:placeholder="t('handoverNodeRecord.inputStatusTip')"
clearable
filterable
style="max-width: 180px"
>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button
icon="edit-pen"
type="primary"
class="ml10"
@click="methods.handleUpdateFlow"
:loading="state.loading"
v-if="state.queryForm.retStatus === '1'"
v-auth="'order_handovernoderecord_edit'"
>
{{ $t('jfI18n.updateFlow') }}
</el-button>
<el-button
icon="RefreshLeft"
type="primary"
class="ml10"
@click="methods.handleCheckToReject"
:loading="state.loading"
v-if="data.isCheckToReject"
v-auth="'order_handovernoderecord_edit'"
>
{{ $t('jfI18n.rejectBtn') }}
</el-button>
<el-button
icon="CircleCheck"
type="primary"
class="ml10"
@click="methods.handleConfirmReceive"
:loading="state.loading"
v-if="data.isConfirmReceive"
v-auth="'order_handovernoderecord_edit'"
>
{{ $t('jfI18n.receiveBtn') }}
</el-button>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" v-if="data.selection" />
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40" />
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId" :valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip />
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip>
<template #default="scope">
<el-input
:disabled="!scope.row.$cellEdit"
v-model="scope.row.todoList"
type="textarea"
:placeholder="t('handoverNodeRecord.inputTodoListTip')"
/>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="200" v-if="data.menu">
<template #default="scope">
<el-button
text
type="primary"
icon="view"
v-if="!scope.row.$cellEdit"
@click="formDialogRef.openDialog('view', scope.row.id)"
v-auth="'order_handovernoderecord_view'"
>
{{ $t('common.viewBtn') }}
</el-button>
<el-button
icon="edit-pen"
text
type="primary"
v-auth="'order_handovernoderecord_edit'"
v-if="!scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, true)"
>{{ $t('common.editBtn') }}
</el-button>
<el-button
icon="Check"
text
type="primary"
v-auth="'order_handovernoderecord_add'"
v-if="scope.row.$cellEdit"
@click="methods.handleUpdate(scope.row, scope.$index)"
>{{ $t('jfI18n.saveBtn') }}
</el-button>
<el-button
icon="Close"
text
type="primary"
v-auth="'order_handovernoderecord_edit'"
v-if="scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, false)"
>{{ $t('jfI18n.cancelBtn') }}
</el-button>
<el-button icon="delete" text type="primary" v-auth="'order_handovernoderecord_del'" @click="handleDelete(scope.row.id, scope.$index)"
>{{ $t('common.delBtn') }}
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</template>
<script setup lang="ts" name="HandoverNodeRecordFlow">
import {BasicTableProps, useTable} from "/@/hooks/table";
import * as handoverNodeRecord from '/@/api/order/handover-node-record'
import {useMessage, useMessageBox} from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import * as handoverNodeRecord from '/@/api/order/handover-node-record';
import { useMessage, useMessageBox } from '/@/hooks/message';
import {useI18n} from "vue-i18n";
import {onFormLoadedUrl, onLoadDicUrl, onLoaded, remoteMethodByKey} from "/@/flow/components/convert-name/convert";
import {validateNull} from "/@/utils/validate";
import * as handoverFlow from '/@/api/order/handover-flow'
import * as orderVue from "/@/api/order/order-key-vue";
import {PROP_CONST} from '/@/flow/support/prop-const'
import {useUserInfo} from "/@/stores/userInfo";
import {setCrudQueryForm} from "/@/flow/support/common";
import { useI18n } from 'vue-i18n';
import { onFormLoadedUrl, onLoadDicUrl, onLoaded, remoteMethodByKey } from '/@/flow/components/convert-name/convert';
import { validateNull } from '/@/utils/validate';
import * as handoverFlow from '/@/api/order/handover-flow';
import * as orderVue from '/@/api/order/order-key-vue';
import { PROP_CONST } from '/@/flow/support/prop-const';
import { useUserInfo } from '/@/stores/userInfo';
import { setCrudQueryForm } from '/@/flow/support/common';
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const {t} = useI18n()
const userInfo = useUserInfo();
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "receiveDept"}, {key: "receiveUser"});
onMounted(() => {
// onLoad(dicData);
});
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n();
const userInfo = useUserInfo();
// 定义查询字典
const dicData = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'receiveDept' }, { key: 'receiveUser' });
onMounted(() => {
// onLoad(dicData);
});
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', "receiveDept")
}
function remoteMethodDept(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'deptName', 'receiveDept');
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', "receiveUser")
}
function remoteMethodUser(query: string) {
remoteMethodByKey(query, onLoad, dicData, 'userName', 'receiveUser');
}
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 定义变量内容
const formDialogRef = ref();
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const onTableLoaded = async (state) => {
let onLoadedInit = onLoaded({key: "createUser"}, {key: "initiatorId"}, {key: "flowInstId"}, {key: "runJobId"});
await onLoadedInit(state)
await onFormLoaded(dicData, state.queryForm)
}
const onTableLoaded = async (state) => {
let onLoadedInit = onLoaded({ key: 'createUser' }, { key: 'initiatorId' }, { key: 'flowInstId' }, { key: 'runJobId' });
await onLoadedInit(state);
await onFormLoaded(dicData, state.queryForm);
};
const validate = async () => {
// 防止被手动修改
methods.setCrudQueryForm()
if (!state.queryForm.status || !state.queryForm.type) {
useMessage().info('请选择交接条件')
return false
}
// 被驳回时查询
state.queryForm.createUser = props.currJob.createUser
return true
}
const validate = async () => {
// 防止被手动修改
methods.setCrudQueryForm();
if (!state.queryForm.status || !state.queryForm.type) {
useMessage().info('请选择交接条件');
return false;
}
// 被驳回时查询
state.queryForm.createUser = props.currJob.createUser;
return true;
};
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: handoverNodeRecord.fetchFlowList,
validate: validate,
onLoaded: onTableLoaded,
descs: ["create_time"],
createdIsNeed: false
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: handoverNodeRecord.fetchFlowList,
validate: validate,
onLoaded: onTableLoaded,
descs: ['create_time'],
createdIsNeed: false,
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
data.selections = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
data.selections = [];
getDataList();
};
// 多选事件
const handleSelectionChange = (objs: any) => {
data.selections = objs
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
data.selections = objs;
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (id: string, index) => {
if (validateNull(id)) {
useMessage().info('还未保存')
return
}
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverNodeRecord.delObjs(id);
state.dataList.splice(index, 1)
state.pagination!.total = state.dataList.length
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
// 删除操作
const handleDelete = async (id: string, index) => {
if (validateNull(id)) {
useMessage().info('还未保存');
return;
}
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverNodeRecord.delObjs(id);
state.dataList.splice(index, 1);
state.pagination!.total = state.dataList.length;
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const data = reactive({
selections: [],
isCheckToReject: false,
isConfirmReceive: false,
menu: false,
selection: false
})
const props = defineProps({
currJob: {
type: Object,
default: null,
},
currElTab: {
type: Object,
default: {},
},
});
const data = reactive({
selections: [],
isCheckToReject: false,
isConfirmReceive: false,
menu: false,
selection: false,
});
const methods = {
initJobData() {
state.loading = false
data.menu = false;
data.selection = false;
data.isConfirmReceive = false
data.isCheckToReject = false
methods.initSelections()
},
async resolveMethod() {
let index = state.dataList.findIndex(f => f.retStatus === '1') + 1
if (index !== 0) {
useMessage().info('第 ' + index + ' 行交接项未修改,请先修改并保存')
return false
}
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true)
return true
},
async initSelections() {
let hiJob = props.currJob.hiJob
// 判断是否仅查看
await orderVue.currElTabIsView(null, props.currJob, props.currElTab.id)
let find = orderVue.currElTabIsExist(props.currJob, props.currElTab.id)
if (find.isFormEdit === '0') hiJob = true
let userKey = props.currJob.userKey
let currJob = PROP_CONST.HANDOVER_FLOW.userKey
if (userKey === currJob.create_user) {
// 判断修改工单
if (!hiJob) {// 为0后带入参数查询不出1的数据
state.queryForm.retStatus = '1'
data.menu = true;
} else data.menu = false;
// 被驳回需全部保存
props.currJob.resolveMethods.push(methods.resolveMethod)
} else if (userKey === currJob.receive_user || userKey === currJob.curr_dept_manager) {
data.menu = false;
state.queryForm.retStatus = '0'
// 判断驳回工单
if (!hiJob) {
data.isCheckToReject = true
data.selection = true;
if (userKey === currJob.curr_dept_manager) orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true)
}
// 判断接收工单
if (userKey === currJob.receive_user && !hiJob) {
props.currJob.resolveSaves.push(methods.handleConfirmReceive)
data.isConfirmReceive = true
}
} else {
// 其他节点自动完成
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true)
}
// 初始化
getDataList()
},
async handleUpdate(row, index) {
try {
state.loading = true;
// 防止被手动修改
methods.setCrudQueryForm()
// 驳回后修改为正常状态
if (state.queryForm.retStatus === '1') row.retStatus = '0'
let resp = await handoverNodeRecord.putObj(Object.assign({}, state.queryForm, row));
// 延迟赋值
setTimeout(() => {
state.dataList[index].id = resp.data.id
state.dataList[index].$cellEdit = false
}, 0)
useMessage().success('操作成功')
} catch (err: any) {
useMessage().error(err.msg);
} finally {
state.loading = false;
}
},
handleUpdateFlow() {
// 可手动修改的交接参数
// common.setPropsDataValue(order, state.queryForm, 'handoverReason', 'receiveDept')
if (!state.queryForm.status || !state.queryForm.type || !state.queryForm.handoverReason || !state.queryForm.receiveDept) {
useMessage().info('请选择交接条件:交接状态、交接类型、交接原因、接受部门')
return
}
methods.timeoutLoading(3)
let queryForm = {
id: props.currJob.orderId,
code: props.currJob.code,
flowKey: props.currJob.flowKey,
flowInstId: props.currJob.flowInstId,
runJobId: props.currJob.id
}
// 修改工单信息时,任务交接不允许修改类型、状态
let order = props.currJob.order
let assign = Object.assign({}, state.queryForm, queryForm, {type: order.type, status: order.status});
handoverFlow.putObj(assign).then(data => {
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true)
useMessage().success('修改成功')
})
},
// 防止被手动修改
setCrudQueryForm() {
let order = props.currJob.order
setCrudQueryForm(state, {prop: 'receiveDept', value: order.receiveDept}, {prop: 'type', value: order.type}
, {prop: 'status', value: order.status}, {prop: 'receiveUser', value: order.receiveUser},
{prop: 'handoverReason', value: order.handoverReason},{prop: 'orderId', value: props.currJob.orderId} )
},
handleCheckToReject() {
// 防止被手动修改
methods.setCrudQueryForm()
// 驳回
if (validateNull(data.selections)) {
useMessage().info('请选择需驳回的交接项')
return
}
methods.timeoutLoading(3)
state.queryForm.id = data.selections[0].orderId
state.queryForm.rejectIds = data.selections.map(m => m.id)
handoverFlow.checkToReject(state.queryForm).then(data => {
state.queryForm.id = null
getDataList()
useMessage().success('驳回成功')
})
},
async handleConfirmReceive() {
// 防止被手动修改
methods.setCrudQueryForm()
// 接收
if (validateNull(state.dataList)) {
useMessage().info('请选择交接项')
return
}
methods.timeoutLoading(3)
state.queryForm.id = state.dataList[0].orderId
await handoverFlow.confirmReceive(state.queryForm)
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, null)
useMessage().success('接收成功')
},
timeoutLoading(t) {
state.loading = true
setTimeout(() => {// 防重复提交
state.loading = false
}, t * 1000)
},
handleEdit(row, index, bool) {
row.$cellEdit = bool
}
}
const methods = {
initJobData() {
state.loading = false;
data.menu = false;
data.selection = false;
data.isConfirmReceive = false;
data.isCheckToReject = false;
methods.initSelections();
},
async resolveMethod() {
let index = state.dataList.findIndex((f) => f.retStatus === '1') + 1;
if (index !== 0) {
useMessage().info('第 ' + index + ' 行交接项未修改,请先修改并保存');
return false;
}
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true);
return true;
},
async initSelections() {
let hiJob = props.currJob.hiJob;
// 判断是否仅查看
await orderVue.currElTabIsView(null, props.currJob, props.currElTab.id);
let find = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
if (find.isFormEdit === '0') hiJob = true;
let userKey = props.currJob.userKey;
let currJob = PROP_CONST.HANDOVER_FLOW.userKey;
if (userKey === currJob.create_user) {
// 判断修改工单
if (!hiJob) {
// 为0后带入参数查询不出1的数据
state.queryForm.retStatus = '1';
data.menu = true;
} else data.menu = false;
// 被驳回需全部保存
props.currJob.resolveMethods.push(methods.resolveMethod);
} else if (userKey === currJob.receive_user || userKey === currJob.curr_dept_manager) {
data.menu = false;
state.queryForm.retStatus = '0';
// 判断驳回工单
if (!hiJob) {
data.isCheckToReject = true;
data.selection = true;
if (userKey === currJob.curr_dept_manager) orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true);
}
// 判断接收工单
if (userKey === currJob.receive_user && !hiJob) {
props.currJob.resolveSaves.push(methods.handleConfirmReceive);
data.isConfirmReceive = true;
}
} else {
// 其他节点自动完成
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true);
}
// 初始化
getDataList();
},
async handleUpdate(row, index) {
try {
state.loading = true;
// 防止被手动修改
methods.setCrudQueryForm();
// 驳回后修改为正常状态
if (state.queryForm.retStatus === '1') row.retStatus = '0';
let resp = await handoverNodeRecord.putObj(Object.assign({}, state.queryForm, row));
// 延迟赋值
setTimeout(() => {
state.dataList[index].id = resp.data.id;
state.dataList[index].$cellEdit = false;
}, 0);
useMessage().success('操作成功');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
state.loading = false;
}
},
handleUpdateFlow() {
// 可手动修改的交接参数
// common.setPropsDataValue(order, state.queryForm, 'handoverReason', 'receiveDept')
if (!state.queryForm.status || !state.queryForm.type || !state.queryForm.handoverReason || !state.queryForm.receiveDept) {
useMessage().info('请选择交接条件:交接状态、交接类型、交接原因、接受部门');
return;
}
methods.timeoutLoading(3);
let queryForm = {
id: props.currJob.orderId,
code: props.currJob.code,
flowKey: props.currJob.flowKey,
flowInstId: props.currJob.flowInstId,
runJobId: props.currJob.id,
};
// 修改工单信息时,任务交接不允许修改类型、状态
let order = props.currJob.order;
let assign = Object.assign({}, state.queryForm, queryForm, { type: order.type, status: order.status });
handoverFlow.putObj(assign).then((data) => {
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true);
useMessage().success('修改成功');
});
},
// 防止被手动修改
setCrudQueryForm() {
let order = props.currJob.order;
setCrudQueryForm(
state,
{ prop: 'receiveDept', value: order.receiveDept },
{ prop: 'type', value: order.type },
{ prop: 'status', value: order.status },
{ prop: 'receiveUser', value: order.receiveUser },
{ prop: 'handoverReason', value: order.handoverReason },
{ prop: 'orderId', value: props.currJob.orderId }
);
},
handleCheckToReject() {
// 防止被手动修改
methods.setCrudQueryForm();
// 驳回
if (validateNull(data.selections)) {
useMessage().info('请选择需驳回的交接项');
return;
}
methods.timeoutLoading(3);
state.queryForm.id = data.selections[0].orderId;
state.queryForm.rejectIds = data.selections.map((m) => m.id);
handoverFlow.checkToReject(state.queryForm).then((data) => {
state.queryForm.id = null;
getDataList();
useMessage().success('驳回成功');
});
},
async handleConfirmReceive() {
// 防止被手动修改
methods.setCrudQueryForm();
// 接收
if (validateNull(state.dataList)) {
useMessage().info('请选择交接项');
return;
}
methods.timeoutLoading(3);
state.queryForm.id = state.dataList[0].orderId;
await handoverFlow.confirmReceive(state.queryForm);
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, null);
useMessage().success('接收成功');
},
timeoutLoading(t) {
state.loading = true;
setTimeout(() => {
// 防重复提交
state.loading = false;
}, t * 1000);
},
handleEdit(row, index, bool) {
row.$cellEdit = bool;
},
};
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
methods.initJobData();
}
);
// 监听双向绑定
watch(
() => props.currJob.id,
() => {
methods.initJobData();
}
);
onMounted(() => {
methods.initJobData()
});
onMounted(() => {
methods.initJobData();
});
</script>

View File

@@ -1,166 +1,175 @@
<template>
<el-dialog :title="title" v-model="visible" width="60%"
:close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.flowKey')" prop="flowKey">
<el-select v-model="form.flowKey" :placeholder="t('handoverNodeRecord.inputFlowKeyTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.flowKey" :key="index" :label="item.flowName" :value="item.flowKey"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-dialog :title="title" v-model="visible" width="60%" :close-on-click-modal="false" draggable>
<el-form ref="dataFormRef" :model="form" :rules="dataRules" label-width="90px" v-loading="loading" :disabled="operType === 'view'">
<el-row :gutter="24">
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.flowKey')" prop="flowKey">
<el-select v-model="form.flowKey" :placeholder="t('handoverNodeRecord.inputFlowKeyTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.flowKey" :key="index" :label="item.flowName" :value="item.flowKey"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.initiatorId')" prop="initiatorId">
<el-select v-model="form.initiatorId" :placeholder="t('handoverNodeRecord.inputInitiatorIdTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.initiatorId" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.initiatorId')" prop="initiatorId">
<el-select v-model="form.initiatorId" :placeholder="t('handoverNodeRecord.inputInitiatorIdTip')" clearable filterable disabled>
<el-option v-for="(item, index) in dicData.initiatorId" :key="index" :label="item.name" :value="item.userId"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.runJobId')" prop="runJobId">
<el-select v-model="form.runJobId" :placeholder="t('handoverNodeRecord.inputRunJobIdTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.runJobId" :key="index" :label="item.jobName" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.runJobId')" prop="runJobId">
<el-select v-model="form.runJobId" :placeholder="t('handoverNodeRecord.inputRunJobIdTip')" clearable filterable disabled>
<el-option v-for="(item, index) in cascadeDic.runJobId" :key="index" :label="item.jobName" :value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.startTime')" prop="startTime">
<el-date-picker disabled type="datetime" :placeholder="t('handoverNodeRecord.inputStartTimeTip')" v-model="form.startTime" :value-format="dateTimeStr"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.startTime')" prop="startTime">
<el-date-picker
disabled
type="datetime"
:placeholder="t('handoverNodeRecord.inputStartTimeTip')"
v-model="form.startTime"
:value-format="dateTimeStr"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.todoList')" prop="todoList">
<el-input v-model="form.todoList" type="textarea" :placeholder="t('handoverNodeRecord.inputTodoListTip')"/>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.todoList')" prop="todoList">
<el-input v-model="form.todoList" type="textarea" :placeholder="t('handoverNodeRecord.inputTodoListTip')" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.status')" prop="status">
<el-select v-model="form.status" :placeholder="t('handoverNodeRecord.inputStatusTip')" clearable filterable disabled>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
<el-col :span="12" class="mb20">
<el-form-item :label="t('handoverNodeRecord.status')" prop="status">
<el-select v-model="form.status" :placeholder="t('handoverNodeRecord.inputStatusTip')" clearable filterable disabled>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer v-if="operType !== 'view'">
<span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts" name="HandoverNodeRecordDialog">
import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj } from '/@/api/order/handover-node-record';
import { useI18n } from 'vue-i18n';
import { rule } from '/@/utils/validate';
import { onCascadeChange, onFormLoadedUrl, onLoadDicUrl } from '/@/flow/components/convert-name/convert';
const emit = defineEmits(['refresh']);
import { useMessage } from "/@/hooks/message";
import { getObj, addObj, putObj } from '/@/api/order/handover-node-record'
import { useI18n } from "vue-i18n"
import { rule } from '/@/utils/validate';
import {onCascadeChange, onFormLoadedUrl, onLoadDicUrl} from "/@/flow/components/convert-name/convert";
const emit = defineEmits(['refresh']);
const { t } = useI18n();
const { t } = useI18n();
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const cascadeDic = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({ key: 'initiatorId' });
const onCascade = onCascadeChange(
cascadeDic,
{ key: 'flowInstId', cascades: ['flowKey', 'runNodeId'] },
{ key: 'runNodeId', cascades: ['runJobId'] }
);
onMounted(() => {
// onLoad(dicData);
});
// 提交表单数据
const form = reactive({
flowKey: '',
initiatorId: '',
nodeJobId: '',
startTime: '',
todoList: '',
status: '',
});
// 定义变量内容
const dataFormRef = ref();
const visible = ref(false);
const loading = ref(false);
const operType = ref(false);
const title = ref('');
// 定义字典
const dicData = reactive({});
const cascadeDic = reactive({});
const onLoad = onLoadDicUrl();
const onFormLoaded = onFormLoadedUrl({key: "initiatorId"});
const onCascade = onCascadeChange(cascadeDic, {key: "flowInstId", cascades: ["flowKey", "runNodeId"]}, {key: "runNodeId", cascades: ["runJobId"]});
onMounted(() => {
// onLoad(dicData);
});
// 提交表单数据
const form = reactive({
flowKey: '',
initiatorId: '',
nodeJobId: '',
startTime: '',
todoList: '',
status: '',
});
// 定义校验规则
const dataRules = ref({
flowKey: [{ required: true, message: '业务类型不能为空', trigger: 'blur' }],
initiatorId: [{ required: true, message: '交接申请人不能为空', trigger: 'blur' }],
nodeJobId: [{ required: true, message: '任务名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '交接状态不能为空', trigger: 'blur' }],
});
// 定义校验规则
const dataRules = ref({
flowKey: [{required: true, message: '业务类型不能为空', trigger: 'blur'}],
initiatorId: [{required: true, message: '交接申请人不能为空', trigger: 'blur'}],
nodeJobId: [{required: true, message: '任务名称不能为空', trigger: 'blur'}],
status: [{required: true, message: '交接状态不能为空', trigger: 'blur'}],
})
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true;
operType.value = type;
form.id = '';
// 打开弹窗
const openDialog = (type: string, id: string) => {
visible.value = true
operType.value = type;
form.id = ''
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
if (type === 'add') {
title.value = t('common.addBtn');
} else if (type === 'edit') {
title.value = t('common.editBtn');
} else if (type === 'view') {
title.value = t('common.viewBtn');
}
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 重置表单数据
nextTick(() => {
dataFormRef.value?.resetFields();
});
// 获取HandoverNodeRecord信息
if (id) {
form.id = id;
getHandoverNodeRecordData(id);
}
};
// 获取HandoverNodeRecord信息
if (id) {
form.id = id
getHandoverNodeRecordData(id)
}
};
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
// 提交
const onSubmit = async () => {
const valid = await dataFormRef.value.validate().catch(() => {});
if (!valid) return false;
try {
loading.value = true;
form.id ? await putObj(form) : await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
try {
loading.value = true;
form.id ? await putObj(form) : await addObj(form);
useMessage().success(t(form.id ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false;
emit('refresh');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
loading.value = false;
}
};
// 初始化表单数据
const getHandoverNodeRecordData = (id: string) => {
// 获取数据
loading.value = true;
getObj(id)
.then((res: any) => {
Object.assign(form, res.data);
onFormLoaded(dicData, form);
onCascade(form);
})
.finally(() => {
loading.value = false;
});
};
// 初始化表单数据
const getHandoverNodeRecordData = (id: string) => {
// 获取数据
loading.value = true
getObj(id).then((res: any) => {
Object.assign(form, res.data)
onFormLoaded(dicData, form);
onCascade(form);
}).finally(() => {
loading.value = false
})
};
// 暴露变量
defineExpose({
openDialog
});
// 暴露变量
defineExpose({
openDialog,
});
</script>

View File

@@ -1,40 +1,39 @@
export default {
handoverNodeRecord: {
index: '#',
importhandoverNodeRecordTip: 'import HandoverNodeRecord',
id: 'id',
flowKey: 'flowKey',
initiatorId: 'initiatorId',
nodeJobId: 'nodeJobId',
startTime: 'startTime',
todoList: 'todoList',
status: 'status',
createUser: 'createUser',
createTime: 'createTime',
orderId: 'orderId',
flowInstId: 'flowInstId',
retStatus: 'retStatus',
runJobId: 'runJobId',
runNodeId: 'runNodeId',
updateUser: 'updateUser',
updateTime: 'updateTime',
inputIdTip: 'input id',
inputFlowKeyTip: 'input flowKey',
inputInitiatorIdTip: 'input initiatorId',
inputNodeJobIdTip: 'input nodeJobId',
inputStartTimeTip: 'input startTime',
inputTodoListTip: 'input todoList',
inputStatusTip: 'input status',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputOrderIdTip: 'input orderId',
inputFlowInstIdTip: 'input flowInstId',
inputRetStatusTip: 'input retStatus',
inputRunJobIdTip: 'input runJobId',
inputRunNodeIdTip: 'input runNodeId',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
}
}
handoverNodeRecord: {
index: '#',
importhandoverNodeRecordTip: 'import HandoverNodeRecord',
id: 'id',
flowKey: 'flowKey',
initiatorId: 'initiatorId',
nodeJobId: 'nodeJobId',
startTime: 'startTime',
todoList: 'todoList',
status: 'status',
createUser: 'createUser',
createTime: 'createTime',
orderId: 'orderId',
flowInstId: 'flowInstId',
retStatus: 'retStatus',
runJobId: 'runJobId',
runNodeId: 'runNodeId',
updateUser: 'updateUser',
updateTime: 'updateTime',
inputIdTip: 'input id',
inputFlowKeyTip: 'input flowKey',
inputInitiatorIdTip: 'input initiatorId',
inputNodeJobIdTip: 'input nodeJobId',
inputStartTimeTip: 'input startTime',
inputTodoListTip: 'input todoList',
inputStatusTip: 'input status',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputOrderIdTip: 'input orderId',
inputFlowInstIdTip: 'input flowInstId',
inputRetStatusTip: 'input retStatus',
inputRunJobIdTip: 'input runJobId',
inputRunNodeIdTip: 'input runNodeId',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
},
};

View File

@@ -1,40 +1,39 @@
export default {
handoverNodeRecord: {
index: '#',
importhandoverNodeRecordTip: '导入交接任务记录',
id: 'ID',
flowKey: '流程名称',
initiatorId: '交接申请人',
nodeJobId: '任务名称',
startTime: '任务开始时间',
todoList: '待办事项',
status: '交接状态',
createUser: '创建人',
createTime: '创建时间',
orderId: '交接流程表ID',
flowInstId: '流程实例ID',
retStatus: '是否被驳回',
runJobId: '任务名称',
runNodeId: '运行节点ID',
updateUser: '修改人',
updateTime: '修改时间',
inputIdTip: '请输入ID',
inputFlowKeyTip: '请输入业务类型',
inputInitiatorIdTip: '请输入交接申请人',
inputNodeJobIdTip: '请输入任务名称',
inputStartTimeTip: '请输入任务开始时间',
inputTodoListTip: '请输入待办事项',
inputStatusTip: '请输入交接状态',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputOrderIdTip: '请输入交接流程表ID',
inputFlowInstIdTip: '请输入流程实例ID',
inputRetStatusTip: '请输入是否被驳回',
inputRunJobIdTip: '请输入任务名称',
inputRunNodeIdTip: '请输入运行节点ID',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
}
}
handoverNodeRecord: {
index: '#',
importhandoverNodeRecordTip: '导入交接任务记录',
id: 'ID',
flowKey: '流程名称',
initiatorId: '交接申请人',
nodeJobId: '任务名称',
startTime: '任务开始时间',
todoList: '待办事项',
status: '交接状态',
createUser: '创建人',
createTime: '创建时间',
orderId: '交接流程表ID',
flowInstId: '流程实例ID',
retStatus: '是否被驳回',
runJobId: '任务名称',
runNodeId: '运行节点ID',
updateUser: '修改人',
updateTime: '修改时间',
inputIdTip: '请输入ID',
inputFlowKeyTip: '请输入业务类型',
inputInitiatorIdTip: '请输入交接申请人',
inputNodeJobIdTip: '请输入任务名称',
inputStartTimeTip: '请输入任务开始时间',
inputTodoListTip: '请输入待办事项',
inputStatusTip: '请输入交接状态',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputOrderIdTip: '请输入交接流程表ID',
inputFlowInstIdTip: '请输入流程实例ID',
inputRetStatusTip: '请输入是否被驳回',
inputRunJobIdTip: '请输入任务名称',
inputRunNodeIdTip: '请输入运行节点ID',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
},
};

View File

@@ -1,192 +1,205 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverNodeRecord.flowInstId')" prop="flowInstId" >
<el-input :placeholder="t('handoverNodeRecord.inputFlowInstIdTip')" v-model="state.queryForm.flowInstId" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runFlow.flowKey')" prop="flowKey" >
<el-input :placeholder="t('runFlow.inputFlowKeyTip')" v-model="state.queryForm.flowKey" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverNodeRecord.status')" prop="status" >
<el-select v-model="state.queryForm.status" :placeholder="t('handoverNodeRecord.inputStatusTip')" clearable filterable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button plain :disabled="multiple" icon="Delete" type="primary" class="ml10"
v-auth="'order_handovernoderecord_del'" @click="handleDelete(selectObjs)">
</el-button>
</el-tooltip>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('handoverNodeRecord.flowInstId')" prop="flowInstId">
<el-input
:placeholder="t('handoverNodeRecord.inputFlowInstIdTip')"
v-model="state.queryForm.flowInstId"
clearable
style="max-width: 180px"
/>
</el-form-item>
<el-form-item :label="$t('runFlow.flowKey')" prop="flowKey">
<el-input :placeholder="t('runFlow.inputFlowKeyTip')" v-model="state.queryForm.flowKey" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('handoverNodeRecord.status')" prop="status">
<el-select
v-model="state.queryForm.status"
:placeholder="t('handoverNodeRecord.inputStatusTip')"
clearable
filterable
style="max-width: 180px"
>
<el-option v-for="(item, index) in DIC_PROP.HANDOVER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button
plain
:disabled="multiple"
icon="Delete"
type="primary"
class="ml10"
v-auth="'order_handovernoderecord_del'"
@click="handleDelete(selectObjs)"
>
</el-button>
</el-tooltip>
<right-toolbar v-model:showSearch="showSearch" :export="'order_handovernoderecord_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40" />
<el-table-column prop="flowInstId" :label="t('runReject.flowInstId')" show-overflow-tooltip/>
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId"
:valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip/>
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip/>
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="retStatus" :label="t('handoverNodeRecord.retStatus')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.YES_OR_NO" :value="scope.row.retStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="100">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])">
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_handovernoderecord_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40" />
<el-table-column prop="flowInstId" :label="t('runReject.flowInstId')" show-overflow-tooltip />
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId" :valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip />
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip />
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="retStatus" :label="t('handoverNodeRecord.retStatus')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.YES_OR_NO" :value="scope.row.retStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="100">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="formDialogRef.openDialog('view', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="formDialogRef.openDialog('edit', scope.row.id)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])"> </el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</template>
<script setup lang="ts" name="systemHandoverNodeRecord">
import { BasicTableProps, useTable } from "/@/hooks/table";
import { fetchList, delObjs } from "/@/api/order/handover-node-record";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from '/@/api/order/handover-node-record';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { useI18n } from "vue-i18n";
import {onLoaded} from "/@/flow/components/convert-name/convert";
import { useI18n } from 'vue-i18n';
import { onLoaded } from '/@/flow/components/convert-name/convert';
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n()
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n();
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 定义变量内容
const formDialogRef = ref();
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({key: "createUser"}, {key: "initiatorId"}, {key: "flowInstId"}, {key: "runJobId"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList,
onLoaded: onLoaded({ key: 'createUser' }, { key: 'initiatorId' }, { key: 'flowInstId' }, { key: 'runJobId' }),
descs: ['create_time'],
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-node-record/export', state.queryForm, 'handover-node-record.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/handover-node-record/export', state.queryForm, 'handover-node-record.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
</script>

View File

@@ -1,254 +1,286 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="Promotion" type="primary" class="ml10" @click="methods.handleInitiate"
:loading="state.loading" v-if="!validateNull(props.selections)"
v-auth="'order_handovernoderecord_add'">
{{ $t('jfI18n.initialBtn') }}
</el-button>
<el-button icon="Check" type="primary" class="ml10" @click="methods.batchSaveOrUpdate"
:loading="state.loading" v-if="!validateNull(props.selections)"
v-auth="'order_handovernoderecord_add'">
{{ $t('jfI18n.batchBtn') }}
</el-button>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@sort-change="sortChangeHandle">
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40"/>
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId"
:valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip/>
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip>
<template #default="scope">
<el-input :disabled="!scope.row.$cellEdit" v-model="scope.row.todoList" type="textarea" :placeholder="t('handoverNodeRecord.inputTodoListTip')"/>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip/>
<el-table-column :label="$t('common.action')" width="200">
<template #default="scope">
<el-button text type="primary" icon="view" v-if="!scope.row.$cellEdit && scope.row.id"
@click="formDialogRef.openDialog('view', scope.row.id)" v-auth="'order_handovernoderecord_edit'">
{{ $t('common.viewBtn') }}
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'order_handovernoderecord_edit'" v-if="!scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, true)">{{ $t('common.editBtn') }}
</el-button>
<el-button icon="Check" text type="primary" v-auth="'order_handovernoderecord_add'" v-if="scope.row.$cellEdit"
@click="methods.handleUpdate(scope.row, scope.$index)">{{ $t('jfI18n.saveBtn') }}
</el-button>
<el-button icon="Close" text type="primary" v-auth="'order_handovernoderecord_edit'" v-if="scope.row.$cellEdit && scope.row.id"
@click="methods.handleEdit(scope.row, scope.$index, false)">{{ $t('jfI18n.cancelBtn') }}
</el-button>
<el-button icon="delete" text type="primary" v-auth="'order_handovernoderecord_del'"
@click="handleDelete(scope.row.id, scope.$index)">{{
$t('common.delBtn')
}}
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle"
v-bind="state.pagination"/>
</div>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row>
<div class="mb8" style="width: 100%">
<el-button
icon="Promotion"
type="primary"
class="ml10"
@click="methods.handleInitiate"
:loading="state.loading"
v-if="!validateNull(props.selections)"
v-auth="'order_handovernoderecord_add'"
>
{{ $t('jfI18n.initialBtn') }}
</el-button>
<el-button
icon="Check"
type="primary"
class="ml10"
@click="methods.batchSaveOrUpdate"
:loading="state.loading"
v-if="!validateNull(props.selections)"
v-auth="'order_handovernoderecord_add'"
>
{{ $t('jfI18n.batchBtn') }}
</el-button>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%" @sort-change="sortChangeHandle">
<el-table-column type="index" :label="t('handoverNodeRecord.index')" width="40" />
<el-table-column prop="flowKey" :label="t('handoverNodeRecord.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.flowInstId" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="initiatorId" :label="t('handoverNodeRecord.initiatorId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.initiatorId" :value="scope.row.initiatorId" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="runJobId" :label="t('handoverNodeRecord.runJobId')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.runJobId" :value="scope.row.runJobId" :valueKey="'id'" :showKey="'jobName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="startTime" :label="t('handoverNodeRecord.startTime')" show-overflow-tooltip />
<el-table-column prop="todoList" :label="t('handoverNodeRecord.todoList')" show-overflow-tooltip>
<template #default="scope">
<el-input
:disabled="!scope.row.$cellEdit"
v-model="scope.row.todoList"
type="textarea"
:placeholder="t('handoverNodeRecord.inputTodoListTip')"
/>
</template>
</el-table-column>
<el-table-column prop="status" :label="t('handoverNodeRecord.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.HANDOVER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="createUser" :label="t('handoverNodeRecord.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser" :valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('handoverNodeRecord.createTime')" show-overflow-tooltip />
<el-table-column :label="$t('common.action')" width="200">
<template #default="scope">
<el-button
text
type="primary"
icon="view"
v-if="!scope.row.$cellEdit && scope.row.id"
@click="formDialogRef.openDialog('view', scope.row.id)"
v-auth="'order_handovernoderecord_edit'"
>
{{ $t('common.viewBtn') }}
</el-button>
<el-button
icon="edit-pen"
text
type="primary"
v-auth="'order_handovernoderecord_edit'"
v-if="!scope.row.$cellEdit"
@click="methods.handleEdit(scope.row, scope.$index, true)"
>{{ $t('common.editBtn') }}
</el-button>
<el-button
icon="Check"
text
type="primary"
v-auth="'order_handovernoderecord_add'"
v-if="scope.row.$cellEdit"
@click="methods.handleUpdate(scope.row, scope.$index)"
>{{ $t('jfI18n.saveBtn') }}
</el-button>
<el-button
icon="Close"
text
type="primary"
v-auth="'order_handovernoderecord_edit'"
v-if="scope.row.$cellEdit && scope.row.id"
@click="methods.handleEdit(scope.row, scope.$index, false)"
>{{ $t('jfI18n.cancelBtn') }}
</el-button>
<el-button icon="delete" text type="primary" v-auth="'order_handovernoderecord_del'" @click="handleDelete(scope.row.id, scope.$index)"
>{{ $t('common.delBtn') }}
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
</div>
<!-- 编辑新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</template>
<script setup lang="ts" name="HandoverNodeRecordInitiate">
import {BasicTableProps, useTable} from "/@/hooks/table";
import * as handoverNodeRecord from '/@/api/order/handover-node-record'
import {useMessage, useMessageBox} from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import * as handoverNodeRecord from '/@/api/order/handover-node-record';
import { useMessage, useMessageBox } from '/@/hooks/message';
import {useI18n} from "vue-i18n";
import {onLoaded} from "/@/flow/components/convert-name/convert";
import {validateNull} from "/@/utils/validate";
import * as handoverFlow from '/@/api/order/handover-flow'
import {deepClone} from "/@/utils/other";
import {paramsFilter} from "/@/flow";
import { useI18n } from 'vue-i18n';
import { onLoaded } from '/@/flow/components/convert-name/convert';
import { validateNull } from '/@/utils/validate';
import * as handoverFlow from '/@/api/order/handover-flow';
import { deepClone } from '/@/utils/other';
import { paramsFilter } from '/@/flow';
const $emit = defineEmits(['onHandoverFlow']);
const props = defineProps({
selections: {
type: Object,
default: null,
},
handoverForm: {
type: Object,
default: null,
}
});
const $emit = defineEmits(['onHandoverFlow']);
const props = defineProps({
selections: {
type: Object,
default: null,
},
handoverForm: {
type: Object,
default: null,
},
});
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const {t} = useI18n()
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const { t } = useI18n();
// 定义变量内容
const formDialogRef = ref()
// 定义变量内容
const formDialogRef = ref();
const state: BasicTableProps = reactive<BasicTableProps>({
createdIsNeed: false,
isPage: false
})
const state: BasicTableProps = reactive<BasicTableProps>({
createdIsNeed: false,
isPage: false,
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle } = useTable(state);
// 删除操作
const handleDelete = async (id: string, index) => {
if (validateNull(id)) {
useMessage().info('还未保存')
return
}
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverNodeRecord.delObj(id);
state.dataList.splice(index, 1)
state.pagination!.total = state.dataList.length
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
// 删除操作
const handleDelete = async (id: string, index) => {
if (validateNull(id)) {
useMessage().info('还未保存');
return;
}
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await handoverNodeRecord.delObj(id);
state.dataList.splice(index, 1);
state.pagination!.total = state.dataList.length;
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
const initLoaded = onLoaded({key: "flowInstId"}, {key: "runJobId"}, {key: "createUser"}, {key: "initiatorId"})
const initLoaded = onLoaded({ key: 'flowInstId' }, { key: 'runJobId' }, { key: 'createUser' }, { key: 'initiatorId' });
const methods = {
async initSelections() {
state.loading = true
// 搜索条件
state.queryForm = paramsFilter(Object.assign(state.queryForm, props.handoverForm))
// 任务交接交接数据一定不能为空
if (validateNull(props.selections)) {
useMessage().info('请选择交接项')
state.loading = false
return
}
let selections = deepClone(props.selections)
for (let i = 0; i < selections.length; i++) {
selections[i].$cellEdit = true
selections[i].id = null// 防止复用
}
Object.assign(state.dataList, selections)
await initLoaded(state);
state.pagination!.total = state.dataList.length
state.loading = false
},
async handleUpdate(row, index) {
try {
state.loading = true;
let resp = await handoverNodeRecord.putObj(Object.assign(row, state.queryForm));
// 延迟赋值
setTimeout(() => {
state.dataList[index].id = resp.data.id
state.dataList[index].$cellEdit = false
}, 0)
useMessage().success('操作成功')
} catch (err: any) {
useMessage().error(err.msg);
} finally {
state.loading = false;
}
},
handleInitiate() {
// 发起
if (validateNull(state.dataList)) {
useMessage().info('请选择交接项')
return
}
let index = state.dataList.findIndex(f => !f.id) + 1
if (index !== 0) {
useMessage().info('第 ' + index + ' 行交接项未保存,请先保存')
return
}
methods.timeoutLoading()
// 防止再次发起复用
let assign = Object.assign({}, state.queryForm, {id: state.dataList[0].orderId});
handoverFlow.addObj(assign).then(data => {
useMessage().success('发起成功')
$emit('onHandoverFlow', state.queryForm.type)
})
},
batchSaveOrUpdate() {
state.loading = true
state.dataList[0] = Object.assign({}, state.queryForm, state.dataList[0]);
handoverNodeRecord.batchSaveOrUpdate(state.dataList).then(resp => {
// 延迟赋值
setTimeout(() => {
resp.data.forEach(data => {
let find = state.dataList.find(f => f.flowInstId === data.flowInstId && f.runJobId === data.runJobId)
find.id = data.id
find.type = state.queryForm.type
find.$cellEdit = false
})
useMessage().success('保存成功')
state.loading = false
}, 0)
}).catch((e) => {
state.loading= false
})
},
timeoutLoading() {
state.loading = true
setTimeout(() => {// 防重复提交
state.loading = false
}, 3 * 1000)
},
handleEdit(row, index, bool) {
row.$cellEdit = bool
}
}
const methods = {
async initSelections() {
state.loading = true;
// 搜索条件
state.queryForm = paramsFilter(Object.assign(state.queryForm, props.handoverForm));
// 任务交接交接数据一定不能为空
if (validateNull(props.selections)) {
useMessage().info('请选择交接项');
state.loading = false;
return;
}
let selections = deepClone(props.selections);
for (let i = 0; i < selections.length; i++) {
selections[i].$cellEdit = true;
selections[i].id = null; // 防止复用
}
Object.assign(state.dataList, selections);
await initLoaded(state);
state.pagination!.total = state.dataList.length;
state.loading = false;
},
async handleUpdate(row, index) {
try {
state.loading = true;
let resp = await handoverNodeRecord.putObj(Object.assign(row, state.queryForm));
// 延迟赋值
setTimeout(() => {
state.dataList[index].id = resp.data.id;
state.dataList[index].$cellEdit = false;
}, 0);
useMessage().success('操作成功');
} catch (err: any) {
useMessage().error(err.msg);
} finally {
state.loading = false;
}
},
handleInitiate() {
// 发起
if (validateNull(state.dataList)) {
useMessage().info('请选择交接项');
return;
}
let index = state.dataList.findIndex((f) => !f.id) + 1;
if (index !== 0) {
useMessage().info('第 ' + index + ' 行交接项未保存,请先保存');
return;
}
methods.timeoutLoading();
// 防止再次发起复用
let assign = Object.assign({}, state.queryForm, { id: state.dataList[0].orderId });
handoverFlow.addObj(assign).then((data) => {
useMessage().success('发起成功');
$emit('onHandoverFlow', state.queryForm.type);
});
},
batchSaveOrUpdate() {
state.loading = true;
state.dataList[0] = Object.assign({}, state.queryForm, state.dataList[0]);
handoverNodeRecord
.batchSaveOrUpdate(state.dataList)
.then((resp) => {
// 延迟赋值
setTimeout(() => {
resp.data.forEach((data) => {
let find = state.dataList.find((f) => f.flowInstId === data.flowInstId && f.runJobId === data.runJobId);
find.id = data.id;
find.type = state.queryForm.type;
find.$cellEdit = false;
});
useMessage().success('保存成功');
state.loading = false;
}, 0);
})
.catch((e) => {
state.loading = false;
});
},
timeoutLoading() {
state.loading = true;
setTimeout(() => {
// 防重复提交
state.loading = false;
}, 3 * 1000);
},
handleEdit(row, index, bool) {
row.$cellEdit = bool;
},
};
// 监听双向绑定
watch(
() => props.selections.length,
() => {
methods.initSelections();
},
{deep: true}
);
// 监听双向绑定
watch(
() => props.selections.length,
() => {
methods.initSelections();
},
{ deep: true }
);
onMounted(() => {
methods.initSelections()
});
onMounted(() => {
methods.initSelections();
});
</script>

View File

@@ -1,151 +1,150 @@
import {flowConfig} from "/@/flow/designer/config/flow-config";
import {validateNull} from "/@/utils/validate";
import {useMessage} from "/@/hooks/message";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import * as runApplication from "/@/api/order/run-application";
import {disabledAllFormFields} from "/@/flow/utils/form-perm";
import { flowConfig } from '/@/flow/designer/config/flow-config';
import { validateNull } from '/@/utils/validate';
import { useMessage } from '/@/hooks/message';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import * as runApplication from '/@/api/order/run-application';
import { disabledAllFormFields } from '/@/flow/utils/form-perm';
export function validateApp($route) {
let appdata = flowConfig.mobileConfig.mobilePrefix
return !validateNull($route.query[appdata]);
let appdata = flowConfig.mobileConfig.mobilePrefix;
return !validateNull($route.query[appdata]);
}
export function initJobDataByApp($route, handleGetObj, rowEditInitData) {
// 兼容移动端
let appdata = flowConfig.mobileConfig.mobilePrefix
let app = !validateNull($route.query[appdata]);
if (app) {
let split = $route.query[appdata].split('-');
let query = {id: split[1]}
handleGetObj(query.id)
} else {
if (rowEditInitData) rowEditInitData()
}
// 兼容移动端
let appdata = flowConfig.mobileConfig.mobilePrefix;
let app = !validateNull($route.query[appdata]);
if (app) {
let split = $route.query[appdata].split('-');
let query = { id: split[1] };
handleGetObj(query.id);
} else {
if (rowEditInitData) rowEditInitData();
}
}
export async function doInitData(formCreateRef, saveInitData) {
let state = await formCreateRef.value.design.fApi.validate();
let formData = formCreateRef.value.design.formData;
if (!state || validateNull(formData)) {
useMessage().warning("请输入表单信息");
return
}
return saveInitData(formData);
let state = await formCreateRef.value.design.fApi.validate();
let formData = formCreateRef.value.design.formData;
if (!state || validateNull(formData)) {
useMessage().warning('请输入表单信息');
return;
}
return saveInitData(formData);
}
export async function doInitiateForm(loading, props, data, $route, formCreateRef, $emit, saveInitData, t) {
try {
loading.value = true;
let formJson = await doInitData(formCreateRef, saveInitData)
props.currFlowForm.status !== DIC_PROP.ORDER_STATUS[0].value ? await runApplication.addObj(formJson) : await runApplication.putObj(formJson);
// 兼容移动端
let app = validateApp($route);
if (app) {
useMessage().success("发起成功,请在【我的申请】查看");
formCreateRef.value.design.fApi.disabled(true)
data.submitBtn = false
} else {
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
$emit('handleInitiateOrder', false)
}
} catch (err: any) {
console.log(err)
} finally {
loading.value = false;
}
try {
loading.value = true;
let formJson = await doInitData(formCreateRef, saveInitData);
props.currFlowForm.status !== DIC_PROP.ORDER_STATUS[0].value ? await runApplication.addObj(formJson) : await runApplication.putObj(formJson);
// 兼容移动端
let app = validateApp($route);
if (app) {
useMessage().success('发起成功,请在【我的申请】查看');
formCreateRef.value.design.fApi.disabled(true);
data.submitBtn = false;
} else {
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
$emit('handleInitiateOrder', false);
}
} catch (err: any) {
console.log(err);
} finally {
loading.value = false;
}
}
export function doTempStore(loading, data, $route, formCreateRef, $emit, saveInitData) {
try {
loading.value = true;
let formData = formCreateRef.value.design.formData;
if (validateNull(formData)) {
useMessage().warning("请输入表单信息");
return
}
let formJson = saveInitData(formData);
runApplication.tempStore(formJson).then(resp => {
useMessage().success("暂存成功,请在【我的申请】查看");
// 兼容移动端
let app = validateApp($route);
if (app) {
formCreateRef.value.design.fApi.disabled(true)
data.submitBtn = false
} else {
$emit('handleInitiateOrder', false)
}
})
} catch (err: any) {
useMessage().error(err);
} finally {
loading.value = false;
}
try {
loading.value = true;
let formData = formCreateRef.value.design.formData;
if (validateNull(formData)) {
useMessage().warning('请输入表单信息');
return;
}
let formJson = saveInitData(formData);
runApplication.tempStore(formJson).then((resp) => {
useMessage().success('暂存成功,请在【我的申请】查看');
// 兼容移动端
let app = validateApp($route);
if (app) {
formCreateRef.value.design.fApi.disabled(true);
data.submitBtn = false;
} else {
$emit('handleInitiateOrder', false);
}
});
} catch (err: any) {
useMessage().error(err);
} finally {
loading.value = false;
}
}
function handleDisabledFields(disabledFields, disabled) {
if (disabledFields) {
Object.keys(disabledFields).forEach(key => {
disabledFields[key] = disabled
});
}
if (disabledFields) {
Object.keys(disabledFields).forEach((key) => {
disabledFields[key] = disabled;
});
}
}
export function initCustomFormMethods(data, disabledFields, operType?) {
return {
disableForm(isAll) {
// 流程中页面因发起页面可copy
if (isAll) operType.value = "view"
else handleDisabledFields(disabledFields, true)
},
enableForm(isAll) {
if (isAll) operType.value = "flow"
else handleDisabledFields(disabledFields, false)
},
disableSubmit() {
data.submitBtn = false
},
enableSubmit() {
data.submitBtn = true
},
}
return {
disableForm(isAll) {
// 流程中页面因发起页面可copy
if (isAll) operType.value = 'view';
else handleDisabledFields(disabledFields, true);
},
enableForm(isAll) {
if (isAll) operType.value = 'flow';
else handleDisabledFields(disabledFields, false);
},
disableSubmit() {
data.submitBtn = false;
},
enableSubmit() {
data.submitBtn = true;
},
};
}
export function initFormMethods(formCreateRef, data) {
return {
hiddenForm(isAll, widgetList) {
if (isAll) {
nextTick(async () => {
formCreateRef.value.design.fApi.hidden(true)
})
} else {
disabledAllFormFields(widgetList, '-1')
}
},
disableForm(isAll, widgetList) {
if (isAll) {
// TODO 目前调用会早于规则赋值无效
nextTick(async () => {
formCreateRef.value.design.fApi.disabled(true)
})
} else {
disabledAllFormFields(widgetList, '0')
}
},
enableForm(isAll, widgetList) {
if (isAll) {
nextTick(async () => {
formCreateRef.value.design.fApi.disabled(false)
})
} else {
disabledAllFormFields(widgetList, '1')
}
},
disableSubmit() {
data.submitBtn = false
},
enableSubmit() {
data.submitBtn = true
},
}
return {
hiddenForm(isAll, widgetList) {
if (isAll) {
nextTick(async () => {
formCreateRef.value.design.fApi.hidden(true);
});
} else {
disabledAllFormFields(widgetList, '-1');
}
},
disableForm(isAll, widgetList) {
if (isAll) {
// TODO 目前调用会早于规则赋值无效
nextTick(async () => {
formCreateRef.value.design.fApi.disabled(true);
});
} else {
disabledAllFormFields(widgetList, '0');
}
},
enableForm(isAll, widgetList) {
if (isAll) {
nextTick(async () => {
formCreateRef.value.design.fApi.disabled(false);
});
} else {
disabledAllFormFields(widgetList, '1');
}
},
disableSubmit() {
data.submitBtn = false;
},
enableSubmit() {
data.submitBtn = true;
},
};
}

View File

@@ -1,202 +1,196 @@
<template>
<div>
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="data.currFlowFormClone" v-if="!validateNull(data.currFlowFormClone)"
:initFormPermPrint="initFormPermPrint">
</form-render>
<div>
<div class="layout-padding-auto layout-padding-view">
<form-render
ref="formCreateRef"
:currFlowForm="data.currFlowFormClone"
v-if="!validateNull(data.currFlowFormClone)"
:initFormPermPrint="initFormPermPrint"
>
</form-render>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{
t('jfI18n.print')
}}
</el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{
t('jfI18n.submit')
}}
</el-button>
</span>
</footer>
<footer class="el-dialog__footer" v-else>
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{
t('jfI18n.print')
}}
</el-button>
</span>
</footer>
</div>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{ t('jfI18n.print') }} </el-button>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }} </el-button>
</span>
</footer>
<footer class="el-dialog__footer" v-else>
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="data.currFlowForm.printInfo">{{ t('jfI18n.print') }} </el-button>
</span>
</footer>
</div>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px"
:title="data.tinymceTitle" append-to-body
@close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="data.currFlowForm"></tinymce-view>
</el-dialog>
</div>
<!-- 打印表单 -->
<el-dialog v-model="data.showTinymceView" top="20px" width="700px" :title="data.tinymceTitle" append-to-body @close="closePrint">
<tinymce-view v-if="data.showTinymceView" :currFlowForm="data.currFlowForm"></tinymce-view>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="RunApplicationForm">
import * as runApplication from '/@/api/order/run-application'
import * as orderVue from "/@/api/order/order-key-vue";
import {parseWithFunctions} from "/@/flow";
import {handleDesignFormPerm, handleFormPrint} from "/@/flow/utils/form-perm";
import {useI18n} from "vue-i18n";
import {useMessage} from "/@/hooks/message";
import {validateNull} from "/@/utils/validate";
import {deepClone} from "/@/utils/other";
import {initJobDataByApp} from "/@/flow/support/extend";
import {initFormMethods} from "../index";
import * as runApplication from '/@/api/order/run-application';
import * as orderVue from '/@/api/order/order-key-vue';
import { parseWithFunctions } from '/@/flow';
import { handleDesignFormPerm, handleFormPrint } from '/@/flow/utils/form-perm';
import { useI18n } from 'vue-i18n';
import { useMessage } from '/@/hooks/message';
import { validateNull } from '/@/utils/validate';
import { deepClone } from '/@/utils/other';
import { initJobDataByApp } from '/@/flow/support/extend';
import { initFormMethods } from '../index';
const emits = defineEmits(["handleJob"]);
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null)
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const emits = defineEmits(['handleJob']);
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const {t} = useI18n();
const loading = ref(false);
const props = defineProps({
currJob: {
type: Object,
default: {},
},
currElTab: {
type: Object,
default: {},
},
});
const data = reactive({
// 兼容app端监听printInfo
currFlowForm: {
type: Object,
default: {},
},
// 含可选表单formInfo
currFlowFormClone: {},
elTab: null,
initFormData: {},
showTinymceView: false,
tinymceTitle: null,
submitBtn: true
})
const { t } = useI18n();
const loading = ref(false);
const props = defineProps({
currJob: {
type: Object,
default: {},
},
currElTab: {
type: Object,
default: {},
},
});
const data = reactive({
// 兼容app端监听printInfo
currFlowForm: {
type: Object,
default: {},
},
// 含可选表单formInfo
currFlowFormClone: {},
elTab: null,
initFormData: {},
showTinymceView: false,
tinymceTitle: null,
submitBtn: true,
});
const methods = initFormMethods(formCreateRef, data)
const methods = initFormMethods(formCreateRef, data);
const $route = useRoute();
async function initJobData() {
// 兼容移动端
await initJobDataByApp($route, props);
// 判断是否存在该表单
data.elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
handleGetObj(props.currJob.orderId)
}
const $route = useRoute();
async function initJobData() {
// 兼容移动端
await initJobDataByApp($route, props);
// 判断是否存在该表单
data.elTab = orderVue.currElTabIsExist(props.currJob, props.currElTab.id);
handleGetObj(props.currJob.orderId);
}
function handleGetObj(id) {
runApplication.getObj(id).then(async resp => {
let form = resp.data ? resp.data : {}
data.currFlowForm = form
data.currFlowForm.runJobId = props.currJob.id
rowEditInitData(form)
})
}
function handleGetObj(id) {
runApplication.getObj(id).then(async (resp) => {
let form = resp.data ? resp.data : {};
data.currFlowForm = form;
data.currFlowForm.runJobId = props.currJob.id;
rowEditInitData(form);
});
}
function rowEditInitData(form: Object) {
let formInfoStr = form.formInfo
// 判断是否为可选表单
if (data.elTab.id !== form.formId) formInfoStr = data.elTab.formInfo
data.currFlowFormClone = deepClone(form)
data.currFlowFormClone.formInfo = formInfoStr
// 记录原始值
let formData = parseWithFunctions(form.formData)
Object.assign(data.initFormData, formData)
}
function rowEditInitData(form: Object) {
let formInfoStr = form.formInfo;
// 判断是否为可选表单
if (data.elTab.id !== form.formId) formInfoStr = data.elTab.formInfo;
data.currFlowFormClone = deepClone(form);
data.currFlowFormClone.formInfo = formInfoStr;
// 记录原始值
let formData = parseWithFunctions(form.formData);
Object.assign(data.initFormData, formData);
}
async function initFormPermPrint(cloneFormInfo) {
let form = data.currFlowForm
// 判断是否为可选表单
let formType = form.type, formId = form.formId
if (data.elTab.id !== form.formId) {
formType = data.elTab.type
formId = data.elTab.id
}
let res = await handleDesignFormPerm(props, cloneFormInfo, data.elTab, formType, formId);
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback, res.widgetList)
await handleFormPrint(form, formType, formId, '1')
return data.elTab;
}
async function initFormPermPrint(cloneFormInfo) {
let form = data.currFlowForm;
// 判断是否为可选表单
let formType = form.type,
formId = form.formId;
if (data.elTab.id !== form.formId) {
formType = data.elTab.type;
formId = data.elTab.id;
}
let res = await handleDesignFormPerm(props, cloneFormInfo, data.elTab, formType, formId);
// 判断是否仅查看
await orderVue.currElTabIsView(methods, props.currJob, props.currElTab.id, submitForm, res.callback, res.widgetList);
await handleFormPrint(form, formType, formId, '1');
return data.elTab;
}
function printForm() {
data.currFlowForm.formData = formCreateRef.value.design.formData
data.currFlowForm.modelRefList = []
let children = formCreateRef.value.design.fApi.children;
if (children && children.length > 0) {
children.forEach(each => data.currFlowForm.modelRefList.push({model: each.model}))
}
data.currFlowForm.rule = formCreateRef.value.design.rule
data.tinymceTitle = data.currFlowForm.formName
data.showTinymceView = true
}
function printForm() {
data.currFlowForm.formData = formCreateRef.value.design.formData;
data.currFlowForm.modelRefList = [];
let children = formCreateRef.value.design.fApi.children;
if (children && children.length > 0) {
children.forEach((each) => data.currFlowForm.modelRefList.push({ model: each.model }));
}
data.currFlowForm.rule = formCreateRef.value.design.rule;
data.tinymceTitle = data.currFlowForm.formName;
data.showTinymceView = true;
}
function closePrint(isSave){
delete data.currFlowForm.modelRefList
delete data.currFlowForm.rule
if (isSave) delete data.currFlowForm.printInfo
}
function closePrint(isSave) {
delete data.currFlowForm.modelRefList;
delete data.currFlowForm.rule;
if (isSave) delete data.currFlowForm.printInfo;
}
async function submitForm() {
try {
loading.value = true;
let state = await formCreateRef.value.design.fApi.validate();
let formData = formCreateRef.value.design.formData
if (!state || validateNull(formData)) {
useMessage().warning("请输入表单信息");
return
}
let formJson = saveInitData(formData);
await runApplication.putObj(formJson)
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits)
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().warning("请输入表单信息");
} finally {
loading.value = false;
}
}
async function submitForm() {
try {
loading.value = true;
let state = await formCreateRef.value.design.fApi.validate();
let formData = formCreateRef.value.design.formData;
if (!state || validateNull(formData)) {
useMessage().warning('请输入表单信息');
return;
}
let formJson = saveInitData(formData);
await runApplication.putObj(formJson);
orderVue.currElTabIsSave(props.currJob, props.currElTab.id, true, emits);
useMessage().success(t(formJson.id ? 'common.editSuccessText' : 'common.addSuccessText'));
} catch (err: any) {
useMessage().warning('请输入表单信息');
} finally {
loading.value = false;
}
}
function saveInitData(form) {
closePrint(true)
data.currFlowForm.formData = validateNull(form) ? null : form
let formJson = deepClone(data.currFlowForm)
if (!validateNull(form)) {
// 合并不同页面不同字段
formJson.formData = Object.assign({}, data.initFormData, formJson.formData);
}
formJson.formData = JSON.stringify(formJson.formData)
return formJson;
}
function saveInitData(form) {
closePrint(true);
data.currFlowForm.formData = validateNull(form) ? null : form;
let formJson = deepClone(data.currFlowForm);
if (!validateNull(form)) {
// 合并不同页面不同字段
formJson.formData = Object.assign({}, data.initFormData, formJson.formData);
}
formJson.formData = JSON.stringify(formJson.formData);
return formJson;
}
// 监听双向绑定
watch(
() => props.currJob.id,
async () => {
await initJobData();
}
);
// 监听双向绑定
watch(
() => props.currJob.id,
async () => {
await initJobData();
}
);
onMounted(async () => {
await initJobData()
});
onMounted(async () => {
await initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,52 +1,51 @@
export default {
runApplication: {
index: '#',
importrunApplicationTip: 'import RunApplication',
id: 'id',
code: 'code',
flowKey: 'flowKey',
icon: 'icon',
formName: 'formName',
groupName: 'groupName',
finishTime: 'finishTime',
status: 'status',
remark: 'remark',
version: 'version',
createUser: 'createUser',
createTime: 'createTime',
tableName: 'tableName',
formInfo: 'formInfo',
sort: 'sort',
defFlowId: 'defFlowId',
flowInstId: 'flowInstId',
formData: 'formData',
formId: 'formId',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputIconTip: 'input icon',
inputFormNameTip: 'input formName',
inputGroupNameTip: 'input groupName',
inputFinishTimeTip: 'input finishTime',
inputStatusTip: 'input status',
inputRemarkTip: 'input remark',
inputVersionTip: 'input version',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputTableNameTip: 'input tableName',
inputFormInfoTip: 'input formInfo',
inputSortTip: 'input sort',
inputDefFlowIdTip: 'input defFlowId',
inputFlowInstIdTip: 'input flowInstId',
inputFormDataTip: 'input formData',
inputFormIdTip: 'input formId',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
}
}
runApplication: {
index: '#',
importrunApplicationTip: 'import RunApplication',
id: 'id',
code: 'code',
flowKey: 'flowKey',
icon: 'icon',
formName: 'formName',
groupName: 'groupName',
finishTime: 'finishTime',
status: 'status',
remark: 'remark',
version: 'version',
createUser: 'createUser',
createTime: 'createTime',
tableName: 'tableName',
formInfo: 'formInfo',
sort: 'sort',
defFlowId: 'defFlowId',
flowInstId: 'flowInstId',
formData: 'formData',
formId: 'formId',
updateUser: 'updateUser',
updateTime: 'updateTime',
delFlag: 'delFlag',
inputIdTip: 'input id',
inputCodeTip: 'input code',
inputFlowKeyTip: 'input flowKey',
inputIconTip: 'input icon',
inputFormNameTip: 'input formName',
inputGroupNameTip: 'input groupName',
inputFinishTimeTip: 'input finishTime',
inputStatusTip: 'input status',
inputRemarkTip: 'input remark',
inputVersionTip: 'input version',
inputCreateUserTip: 'input createUser',
inputCreateTimeTip: 'input createTime',
inputTableNameTip: 'input tableName',
inputFormInfoTip: 'input formInfo',
inputSortTip: 'input sort',
inputDefFlowIdTip: 'input defFlowId',
inputFlowInstIdTip: 'input flowInstId',
inputFormDataTip: 'input formData',
inputFormIdTip: 'input formId',
inputUpdateUserTip: 'input updateUser',
inputUpdateTimeTip: 'input updateTime',
inputDelFlagTip: 'input delFlag',
},
};

View File

@@ -1,52 +1,51 @@
export default {
runApplication: {
index: '#',
importrunApplicationTip: '导入我的申请',
id: '主键id',
code: '工单编号',
flowKey: '流程名称',
icon: '表单图标',
formName: '表单名称',
groupName: '分组名称',
finishTime: '完成时间',
status: '状态',
remark: '表单备注',
version: '版本',
createUser: '创建人',
createTime: '创建时间',
tableName: '关联表名称',
formInfo: '表单信息',
sort: '排序值',
defFlowId: '流程定义ID',
flowInstId: '流程实例ID',
formData: '表单数据',
formId: '表单ID',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入流程KEY',
inputIconTip: '请输入表单图标',
inputFormNameTip: '请输入表单名称',
inputGroupNameTip: '请输入分组名称',
inputFinishTimeTip: '请输入完成时间',
inputStatusTip: '请输入状态',
inputRemarkTip: '请输入表单备注',
inputVersionTip: '请输入版本',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputTableNameTip: '请输入关联表名称',
inputFormInfoTip: '请输入表单信息',
inputSortTip: '请输入排序值',
inputDefFlowIdTip: '请输入流程定义ID',
inputFlowInstIdTip: '请输入流程实例ID',
inputFormDataTip: '请输入表单数据',
inputFormIdTip: '请输入表单ID',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
}
}
runApplication: {
index: '#',
importrunApplicationTip: '导入我的申请',
id: '主键id',
code: '工单编号',
flowKey: '流程名称',
icon: '表单图标',
formName: '表单名称',
groupName: '分组名称',
finishTime: '完成时间',
status: '状态',
remark: '表单备注',
version: '版本',
createUser: '创建人',
createTime: '创建时间',
tableName: '关联表名称',
formInfo: '表单信息',
sort: '排序值',
defFlowId: '流程定义ID',
flowInstId: '流程实例ID',
formData: '表单数据',
formId: '表单ID',
updateUser: '修改人',
updateTime: '修改时间',
delFlag: '删除标',
inputIdTip: '请输入主键id',
inputCodeTip: '请输入编号',
inputFlowKeyTip: '请输入流程KEY',
inputIconTip: '请输入表单图标',
inputFormNameTip: '请输入表单名称',
inputGroupNameTip: '请输入分组名称',
inputFinishTimeTip: '请输入完成时间',
inputStatusTip: '请输入状态',
inputRemarkTip: '请输入表单备注',
inputVersionTip: '请输入版本',
inputCreateUserTip: '请输入创建人',
inputCreateTimeTip: '请输入创建时间',
inputTableNameTip: '请输入关联表名称',
inputFormInfoTip: '请输入表单信息',
inputSortTip: '请输入排序值',
inputDefFlowIdTip: '请输入流程定义ID',
inputFlowInstIdTip: '请输入流程实例ID',
inputFormDataTip: '请输入表单数据',
inputFormIdTip: '请输入表单ID',
inputUpdateUserTip: '请输入修改人',
inputUpdateTimeTip: '请输入修改时间',
inputDelFlagTip: '请输入删除标',
},
};

View File

@@ -1,362 +1,356 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('runApplication.code')" prop="code" >
<el-input :placeholder="t('runApplication.inputCodeTip')" v-model="state.queryForm.code" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.flowKey')" prop="flowKey" >
<el-input :placeholder="t('runApplication.inputFlowKeyTip')" v-model="state.queryForm.flowKey" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.formName')" prop="formName" >
<el-input :placeholder="t('runApplication.inputFormNameTip')" v-model="state.queryForm.formName" clearable
style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.status')" prop="status" >
<el-select v-model="state.queryForm.status" :placeholder="t('runApplication.inputStatusTip')" clearable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.ORDER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button plain :disabled="multiple" icon="Delete" type="primary" class="ml10"
v-auth="'order_runapplication_del'" @click="handleDelete(selectObjs)">
</el-button>
</el-tooltip>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item :label="$t('runApplication.code')" prop="code">
<el-input :placeholder="t('runApplication.inputCodeTip')" v-model="state.queryForm.code" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.flowKey')" prop="flowKey">
<el-input :placeholder="t('runApplication.inputFlowKeyTip')" v-model="state.queryForm.flowKey" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.formName')" prop="formName">
<el-input :placeholder="t('runApplication.inputFormNameTip')" v-model="state.queryForm.formName" clearable style="max-width: 180px" />
</el-form-item>
<el-form-item :label="$t('runApplication.status')" prop="status">
<el-select v-model="state.queryForm.status" :placeholder="t('runApplication.inputStatusTip')" clearable style="max-width: 180px">
<el-option v-for="(item, index) in DIC_PROP.ORDER_STATUS" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
{{ $t('common.queryBtn') }}
</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-tooltip placement="top">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button
plain
:disabled="multiple"
icon="Delete"
type="primary"
class="ml10"
v-auth="'order_runapplication_del'"
@click="handleDelete(selectObjs)"
>
</el-button>
</el-tooltip>
<right-toolbar v-model:showSearch="showSearch" :export="'order_runapplication_export'"
@exportExcel="exportExcel" class="ml10" style="float: right;margin-right: 20px"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" style="width: 100%"
@selection-change="handleSelectionChange" @sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" :label="t('runApplication.index')" width="40"/>
<el-table-column prop="code" :label="t('runApplication.code')" show-overflow-tooltip/>
<el-table-column prop="flowKey" :label="t('runApplication.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="dicData.flowKey" :value="scope.row.flowKey"
:valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="icon" :label="t('runApplication.icon')" show-overflow-tooltip>
<template #default="scope">
<SvgIcon :name="scope.row.icon" :size="20" color="#409EFF"/>
</template>
</el-table-column>
<el-table-column prop="formName" :label="t('runApplication.formName')" show-overflow-tooltip/>
<el-table-column prop="groupName" :label="t('runApplication.groupName')" show-overflow-tooltip/>
<el-table-column prop="finishTime" :label="t('runApplication.finishTime')" show-overflow-tooltip/>
<el-table-column prop="status" :label="t('runApplication.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.ORDER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="remark" :label="t('runApplication.remark')" width="200" show-overflow-tooltip/>
<el-table-column prop="version" :label="t('runApplication.version')" show-overflow-tooltip/>
<!-- <el-table-column prop="createUser" :label="t('runApplication.createUser')" show-overflow-tooltip>
<right-toolbar
v-model:showSearch="showSearch"
:export="'order_runapplication_export'"
@exportExcel="exportExcel"
class="ml10"
style="float: right; margin-right: 20px"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
style="width: 100%"
@selection-change="handleSelectionChange"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" :label="t('runApplication.index')" width="40" />
<el-table-column prop="code" :label="t('runApplication.code')" show-overflow-tooltip />
<el-table-column prop="flowKey" :label="t('runApplication.flowKey')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="dicData.flowKey" :value="scope.row.flowKey" :valueKey="'flowKey'" :showKey="'flowName'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="icon" :label="t('runApplication.icon')" show-overflow-tooltip>
<template #default="scope">
<SvgIcon :name="scope.row.icon" :size="20" color="#409EFF" />
</template>
</el-table-column>
<el-table-column prop="formName" :label="t('runApplication.formName')" show-overflow-tooltip />
<el-table-column prop="groupName" :label="t('runApplication.groupName')" show-overflow-tooltip />
<el-table-column prop="finishTime" :label="t('runApplication.finishTime')" show-overflow-tooltip />
<el-table-column prop="status" :label="t('runApplication.status')" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="DIC_PROP.ORDER_STATUS" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="remark" :label="t('runApplication.remark')" width="200" show-overflow-tooltip />
<el-table-column prop="version" :label="t('runApplication.version')" show-overflow-tooltip />
<!-- <el-table-column prop="createUser" :label="t('runApplication.createUser')" show-overflow-tooltip>
<template #default="scope">
<convert-name :options="state.dicData.createUser" :value="scope.row.createUser"
:valueKey="'userId'" :showKey="'name'"></convert-name>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="t('runApplication.createTime')" show-overflow-tooltip/>-->
<el-table-column :label="$t('common.action')" width="170">
<template #default="scope">
<el-table-column :label="$t('common.action')" width="170">
<template #default="scope">
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="handleViewOrder(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.viewBtn') }}
</template>
<el-button text type="primary" icon="view" @click="handleViewOrder(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content> 打印表单 </template>
<el-button icon="Document" text type="primary" @click="handleViewOrder(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
打印表单
</template>
<el-button icon="Document" text type="primary" @click="handleViewOrder(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.copyBtn') }}
</template>
<el-button icon="DocumentCopy" text type="primary" @click="handleInitiateOrder(scope.row, 'copy')"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('common.copyBtn') }}
</template>
<el-button icon="DocumentCopy" text type="primary" @click="handleInitiateOrder(scope.row,'copy')">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[2].value">
<template #content>
{{ $t('jfI18n.recallBtn') }}
</template>
<el-button icon="RefreshLeft" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('jfI18n.resetBtn') }}
</template>
<el-button icon="RefreshRight" text type="primary" @click="handleRecallReset(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('jfI18n.viewFlow') }}
</template>
<el-button icon="Share" text type="primary" @click="openPreview(scope.row)"> </el-button>
</el-tooltip>
<el-tooltip placement="top">
<template #content>
{{ $t('jfI18n.viewFlow') }}
</template>
<el-button icon="Share" text type="primary" @click="openPreview(scope.row)">
</el-button>
</el-tooltip>
<el-tooltip
placement="top"
v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value || scope.row.status === DIC_PROP.ORDER_STATUS[0].value"
>
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="handleInitiateOrder(scope.row, 'edit')"> </el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status === DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])"> </el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value || scope.row.status===DIC_PROP.ORDER_STATUS[0].value">
<template #content>
{{ $t('common.editBtn') }}
</template>
<el-button icon="edit-pen" text type="primary" @click="handleInitiateOrder(scope.row,'edit')">
</el-button>
</el-tooltip>
<el-tooltip placement="top" v-if="scope.row.status===DIC_PROP.ORDER_STATUS[1].value">
<template #content>
{{ $t('common.delBtn') }}
</template>
<el-button icon="delete" text type="primary" @click="handleDelete([scope.row.id])">
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
</div>
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="handleInitiateOrder">
<template v-slot="slotProps" v-if="data.showInitiateOrder">
<run-initiate
ref="form"
v-show="slotProps.currActive === 'form'"
:curr-flow-form="data.currFlowForm"
@handleInitiateOrder="handleInitiateOrder"
></run-initiate>
</template>
<template v-slot="slotProps" v-if="data.showHandleForm">
<custom-form
ref="form"
v-show="slotProps.currActive === 'form'"
:curr-job="data.currFlowForm"
@onHandleForm="handleInitiateOrder"
></custom-form>
</template>
</json-flow-predict>
<json-flow-predict ref="predict" :proxy="proxy" @handleInitiateOrder="handleInitiateOrder">
<template v-slot="slotProps" v-if="data.showInitiateOrder">
<run-initiate ref="form" v-show="slotProps.currActive === 'form'" :curr-flow-form="data.currFlowForm"
@handleInitiateOrder="handleInitiateOrder"></run-initiate>
</template>
<template v-slot="slotProps" v-if="data.showHandleForm">
<custom-form ref="form" v-show="slotProps.currActive === 'form'" :curr-job="data.currFlowForm"
@onHandleForm="handleInitiateOrder"></custom-form>
</template>
</json-flow-predict>
<!-- 查看工单 -->
<el-dialog v-model="data.showHandleFormView" top="20px" width="90%" title="查看工单" append-to-body>
<custom-form v-if="data.showHandleFormView" :curr-job="data.currFlowForm"></custom-form>
</el-dialog>
<!-- 查看工单 -->
<el-dialog
v-model="data.showHandleFormView"
top="20px"
width="90%"
title="查看工单"
append-to-body>
<custom-form v-if="data.showHandleFormView" :curr-job="data.currFlowForm"></custom-form>
</el-dialog>
<!-- 查看工单 -->
<el-dialog v-model="data.showViewOrder" top="20px" width="90%" title="查看工单" append-to-body>
<run-view v-if="data.showViewOrder" :curr-flow-form="data.currFlowForm"></run-view>
</el-dialog>
<!-- 查看工单 -->
<el-dialog
v-model="data.showViewOrder"
top="20px"
width="90%"
title="查看工单"
append-to-body>
<run-view v-if="data.showViewOrder" :curr-flow-form="data.currFlowForm"></run-view>
</el-dialog>
<!-- 查看流程图 -->
<el-drawer
class="flow-overflow-drawer" direction="rtl"
append-to-body size="90%"
v-model="data.showFlowPic"
>
<flow-photo v-if="data.showFlowPic" :curr-job="data.currFlowForm"></flow-photo>
</el-drawer>
</div>
<!-- 查看流程图 -->
<el-drawer class="flow-overflow-drawer" direction="rtl" append-to-body size="90%" v-model="data.showFlowPic">
<flow-photo v-if="data.showFlowPic" :curr-job="data.currFlowForm"></flow-photo>
</el-drawer>
</div>
</template>
<script setup lang="ts" name="systemRunApplication">
import { BasicTableProps, useTable } from "/@/hooks/table";
import * as runApplication from '/@/api/order/run-application'
import { useMessage, useMessageBox } from "/@/hooks/message";
import { BasicTableProps, useTable } from '/@/hooks/table';
import * as runApplication from '/@/api/order/run-application';
import { useMessage, useMessageBox } from '/@/hooks/message';
import {useI18n} from "vue-i18n";
import {onLoadDicUrl, onLoaded} from "/@/flow/components/convert-name/convert";
import * as common from '/@/flow/support/common'
import other, {deepClone} from "/@/utils/other";
import {recallReset} from "/@/api/jsonflow/run-flow";
import {DIC_PROP} from "/@/flow/support/dict-prop";
import {openFlowPreview} from "/@/flow/support/extend";
import {handleCustomForm, vueKey} from "/@/api/order/order-key-vue";
import { useI18n } from 'vue-i18n';
import { onLoadDicUrl, onLoaded } from '/@/flow/components/convert-name/convert';
import * as common from '/@/flow/support/common';
import other, { deepClone } from '/@/utils/other';
import { recallReset } from '/@/api/jsonflow/run-flow';
import { DIC_PROP } from '/@/flow/support/dict-prop';
import { openFlowPreview } from '/@/flow/support/extend';
import { handleCustomForm, vueKey } from '/@/api/order/order-key-vue';
// 引入组件
const FlowPhoto = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/view.vue'));
const RunInitiate = defineAsyncComponent(() => import('./initiate.vue'));
const RunView = defineAsyncComponent(() => import('./view.vue'));
const CustomForm = defineAsyncComponent(() => import('/@/flow/components/custom-form/handle.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
// 引入组件
const FlowPhoto = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/view.vue'));
const RunInitiate = defineAsyncComponent(() => import('./initiate.vue'));
const RunView = defineAsyncComponent(() => import('./view.vue'));
const CustomForm = defineAsyncComponent(() => import('/@/flow/components/custom-form/handle.vue'));
const JsonFlowPredict = defineAsyncComponent(() => import('/@/views/jsonflow/flow-design/predict.vue'));
const { t } = useI18n()
const {proxy} = getCurrentInstance();
const { t } = useI18n();
const { proxy } = getCurrentInstance();
// 搜索变量
const queryRef = ref()
const showSearch = ref(true)
// 多选变量
const selectObjs = ref([]) as any
const multiple = ref(true)
// 搜索变量
const queryRef = ref();
const showSearch = ref(true);
// 多选变量
const selectObjs = ref([]) as any;
const multiple = ref(true);
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: runApplication.fetchList,
onLoaded: onLoaded({key: "createUser"}),
descs: ["create_time"]
})
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: runApplication.fetchList,
onLoaded: onLoaded({ key: 'createUser' }),
descs: ['create_time'],
});
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl({key: "flowKey"});
onMounted(() => {
onLoad(dicData);
});
// 定义字典
const dicData = reactive({});
const onLoad = onLoadDicUrl({ key: 'flowKey' });
onMounted(() => {
onLoad(dicData);
});
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile
} = useTable(state)
// table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile } = useTable(state);
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields();
// 清空多选
selectObjs.value = [];
getDataList();
};
// 导出excel
const exportExcel = () => {
downBlobFile('/order/run-application/export', state.queryForm, 'run-application.xlsx')
}
// 导出excel
const exportExcel = () => {
downBlobFile('/order/run-application/export', state.queryForm, 'run-application.xlsx');
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 多选事件
const handleSelectionChange = (objs: any) => {
selectObjs.value = objs.map(({ id }) => id);
multiple.value = !objs.length;
};
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm(t('common.delConfirmText'));
} catch {
return;
}
try {
await runApplication.delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await runApplication.delObjs(ids);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
};
const data = reactive({
showViewOrder: false,
showInitiateOrder: false,
showFlowPic: false,
currFlowForm: {},
showHandleFormView: false,
showHandleForm: false,
})
const data = reactive({
showViewOrder: false,
showInitiateOrder: false,
showFlowPic: false,
currFlowForm: {},
showHandleFormView: false,
showHandleForm: false,
});
function handleViewOrder(row) {
data.currFlowForm = row
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row)
data.currFlowForm.operType = 'view'
data.showHandleFormView = true
} else {
data.showViewOrder = true
}
}
function handleViewOrder(row) {
data.currFlowForm = row;
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row);
data.currFlowForm.operType = 'view';
data.showHandleFormView = true;
} else {
data.showViewOrder = true;
}
}
function handleInitiateOrder(row, operType) {
if (row === false) {
getDataList();
openPredict({}, false)
data.showInitiateOrder = false
data.showHandleForm = false
return
}
data.currFlowForm = deepClone(row)
data.currFlowForm.operType = operType
let clone = {operType: data.currFlowForm.operType};
common.handleClone(clone, data.currFlowForm)
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row)
data.showHandleForm = true
} else {
data.showInitiateOrder = true
}
openPredict(row, true)
}
function handleInitiateOrder(row, operType) {
if (row === false) {
getDataList();
openPredict({}, false);
data.showInitiateOrder = false;
data.showHandleForm = false;
return;
}
data.currFlowForm = deepClone(row);
data.currFlowForm.operType = operType;
let clone = { operType: data.currFlowForm.operType };
common.handleClone(clone, data.currFlowForm);
// 判断是否自定义首页
if (row.path !== vueKey.RunApplicationForm) {
handleCustomForm(data, row);
data.showHandleForm = true;
} else {
data.showInitiateOrder = true;
}
openPredict(row, true);
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool)
}
function openPredict(row, bool) {
proxy.$refs.predict.open(row, bool);
}
const $router = useRouter();
function openPreview(row) {
if (row.status === DIC_PROP.ORDER_STATUS[1].value) {
data.currFlowForm = {defFlowId: row.defFlowId}
data.showFlowPic = true
} else {
openFlowPreview($router, {flowInstId: row.flowInstId}, '1')
}
}
function handleRecallReset(row) {
let params = {id: row.flowInstId, flowKey: row.flowKey, status: row.status}
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
})
return
}
useMessageBox().confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params)
}).then(() => {
useMessage().success('撤回成功')
getDataList();
})
}
const $router = useRouter();
function openPreview(row) {
if (row.status === DIC_PROP.ORDER_STATUS[1].value) {
data.currFlowForm = { defFlowId: row.defFlowId };
data.showFlowPic = true;
} else {
openFlowPreview($router, { flowInstId: row.flowInstId }, '1');
}
}
function handleRecallReset(row) {
let params = { id: row.flowInstId, flowKey: row.flowKey, status: row.status };
if (row.status === DIC_PROP.ORDER_STATUS[0].value) {
recallReset(params).then(() => {
useMessage().success('重发成功');
getDataList();
});
return;
}
useMessageBox()
.confirm('是否确认要撤回该工单?')
.then(() => {
return recallReset(params);
})
.then(() => {
useMessage().success('撤回成功');
getDataList();
});
}
</script>
<style lang="scss">
@import "../../../flow/components/style/flow-drawer.scss";
@import '../../../flow/components/style/flow-drawer.scss';
</style>

View File

@@ -1,125 +1,116 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="props.currFlowForm" :initFormPermPrint="initFormPermPrint">
</form-render>
</div>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<template v-if="props.currFlowForm.status !== DIC_PROP.ORDER_STATUS[0].value">
<el-button type="primary" @click="submitForm" :disabled="loading">{{
t('jfI18n.submit')
}}
</el-button>
<el-button type="primary" @click="handleTempStore" :disabled="loading">{{
t('jfI18n.temp')
}}
</el-button>
</template>
<template v-else>
<el-button type="primary" @click="submitForm" :disabled="loading">{{
$t('common.editBtn')
}}</el-button>
</template>
</span>
</footer>
</div>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="props.currFlowForm" :initFormPermPrint="initFormPermPrint"> </form-render>
</div>
<footer class="el-dialog__footer" v-if="data.submitBtn">
<span class="dialog-footer">
<template v-if="props.currFlowForm.status !== DIC_PROP.ORDER_STATUS[0].value">
<el-button type="primary" @click="submitForm" :disabled="loading">{{ t('jfI18n.submit') }} </el-button>
<el-button type="primary" @click="handleTempStore" :disabled="loading">{{ t('jfI18n.temp') }} </el-button>
</template>
<template v-else>
<el-button type="primary" @click="submitForm" :disabled="loading">{{ $t('common.editBtn') }}</el-button>
</template>
</span>
</footer>
</div>
</template>
<script setup lang="ts" name="RunApplicationInitiate">
import * as runApplication from '/@/api/order/run-application'
import {useI18n} from "vue-i18n";
import {validateNull} from "/@/utils/validate";
import {deepClone} from "/@/utils/other";
import * as common from "/@/flow/support/common";
import {doInitData, doInitiateForm, doTempStore, initFormMethods, initJobDataByApp} from "../index";
import {handleFormStartPerm} from "/@/flow/utils/form-perm";
import {currFormIsView} from "/@/api/order/order-key-vue";
import * as runApplication from '/@/api/order/run-application';
import { useI18n } from 'vue-i18n';
import { validateNull } from '/@/utils/validate';
import { deepClone } from '/@/utils/other';
import * as common from '/@/flow/support/common';
import { doInitData, doInitiateForm, doTempStore, initFormMethods, initJobDataByApp } from '../index';
import { handleFormStartPerm } from '/@/flow/utils/form-perm';
import { currFormIsView } from '/@/api/order/order-key-vue';
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null)
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null);
const {t} = useI18n();
const $emit = defineEmits(['handleInitiateOrder']);
const loading = ref(false);
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
}
});
const { t } = useI18n();
const $emit = defineEmits(['handleInitiateOrder']);
const loading = ref(false);
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
},
});
const data = reactive({
submitBtn: true
});
const data = reactive({
submitBtn: true,
});
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, null)
}
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, null);
}
function handleGetObj(id) {
runApplication.getObj(id).then(resp => {
let form = resp.data ? resp.data : {}
Object.assign(props.currFlowForm, form);
})
}
function handleGetObj(id) {
runApplication.getObj(id).then((resp) => {
let form = resp.data ? resp.data : {};
Object.assign(props.currFlowForm, form);
});
}
async function submitForm() {
await doInitiateForm(loading, props, data, $route, formCreateRef, $emit, saveInitData, t)
}
async function submitForm() {
await doInitiateForm(loading, props, data, $route, formCreateRef, $emit, saveInitData, t);
}
function handleTempStore() {
doTempStore(loading, data, $route, formCreateRef, $emit, saveInitData)
}
function handleTempStore() {
doTempStore(loading, data, $route, formCreateRef, $emit, saveInitData);
}
const methods = initFormMethods(formCreateRef, data)
const methods = initFormMethods(formCreateRef, data);
async function initFormPermPrint(formInfo) {
// 处理表单权限
let res = await handleFormStartPerm(null, null, formInfo, props.currFlowForm.defFlowId, null, props.currFlowForm.type)
await currFormIsView(methods, res.elTab, true, res.callback, res.widgetList)
return res.elTab
}
async function initFormPermPrint(formInfo) {
// 处理表单权限
let res = await handleFormStartPerm(null, null, formInfo, props.currFlowForm.defFlowId, null, props.currFlowForm.type);
await currFormIsView(methods, res.elTab, true, res.callback, res.widgetList);
return res.elTab;
}
function saveInitData(form) {
props.currFlowForm.formData = validateNull(form) ? undefined : form
let formJson = deepClone(props.currFlowForm)
let clone = {operType: props.currFlowForm.operType, form: formJson};
common.handleCloneSubmit(clone)
formJson.formData = JSON.stringify(formJson.formData)
return formJson;
}
function saveInitData(form) {
props.currFlowForm.formData = validateNull(form) ? undefined : form;
let formJson = deepClone(props.currFlowForm);
let clone = { operType: props.currFlowForm.operType, form: formJson };
common.handleCloneSubmit(clone);
formJson.formData = JSON.stringify(formJson.formData);
return formJson;
}
async function getFormData() {
return await doInitData(formCreateRef, saveInitData)
}
async function getFormData() {
return await doInitData(formCreateRef, saveInitData);
}
// 暴露变量
defineExpose({
getFormData,
})
// 暴露变量
defineExpose({
getFormData,
});
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
onMounted(() => {
initJobData()
});
onMounted(() => {
initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>

View File

@@ -1,115 +1,114 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render ref="formCreateRef" :currFlowForm="form.currFlowForm" v-if="!validateNull(form.currFlowForm)" :renderType="'-1'"
:initFormPermPrint="initFormPermPrint">
</form-render>
</div>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.currFlowForm.printInfo">{{
t('jfI18n.print')
}}
</el-button>
</span>
</footer>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<form-render
ref="formCreateRef"
:currFlowForm="form.currFlowForm"
v-if="!validateNull(form.currFlowForm)"
:renderType="'-1'"
:initFormPermPrint="initFormPermPrint"
>
</form-render>
</div>
<footer class="el-dialog__footer">
<span class="dialog-footer">
<el-button type="primary" @click="printForm" v-if="form.currFlowForm.printInfo">{{ t('jfI18n.print') }} </el-button>
</span>
</footer>
<!-- 打印表单 -->
<el-dialog v-model="form.showTinymceView" top="20px" width="700px"
:title="form.tinymceTitle" append-to-body
@close="closePrint">
<tinymce-view v-if="form.showTinymceView" :currFlowForm="form.currFlowForm"></tinymce-view>
</el-dialog>
</div>
<!-- 打印表单 -->
<el-dialog v-model="form.showTinymceView" top="20px" width="700px" :title="form.tinymceTitle" append-to-body @close="closePrint">
<tinymce-view v-if="form.showTinymceView" :currFlowForm="form.currFlowForm"></tinymce-view>
</el-dialog>
</div>
</template>
<script setup lang="ts" name="RunApplicationView">
import * as runApplication from "/@/api/order/run-application";
import {useI18n} from "vue-i18n";
import {initJobDataByApp} from "../index";
import {deepClone} from "/@/utils/other";
import {handleFormPrint} from "/@/flow/utils/form-perm";
import * as runApplication from '/@/api/order/run-application';
import { useI18n } from 'vue-i18n';
import { initJobDataByApp } from '../index';
import { deepClone } from '/@/utils/other';
import { handleFormPrint } from '/@/flow/utils/form-perm';
const {t} = useI18n();
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null)
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const { t } = useI18n();
const FormRender = defineAsyncComponent(() => import('/@/flow/components/form-create/render.vue'));
const formCreateRef = ref(null);
// 引入组件
const TinymceView = defineAsyncComponent(() => import('/@/flow/components/tinymce/TinymceView.vue'));
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
}
});
const props = defineProps({
currFlowForm: {
type: Object,
default: {},
},
});
const form = reactive({
// 兼容app端监听printInfo
currFlowForm: {
type: Object,
default: {},
},
showTinymceView: false,
tinymceTitle: null,
});
const form = reactive({
// 兼容app端监听printInfo
currFlowForm: {
type: Object,
default: {},
},
showTinymceView: false,
tinymceTitle: null,
});
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, () => {
form.currFlowForm = props.currFlowForm
})
}
const $route = useRoute();
function initJobData() {
initJobDataByApp($route, handleGetObj, () => {
form.currFlowForm = props.currFlowForm;
});
}
function handleGetObj(id) {
runApplication.getObj(id).then(resp => {
let formData = resp.data ? resp.data : {}
Object.assign(form.currFlowForm, formData);
})
}
function handleGetObj(id) {
runApplication.getObj(id).then((resp) => {
let formData = resp.data ? resp.data : {};
Object.assign(form.currFlowForm, formData);
});
}
async function initFormPermPrint() {
await handleFormPrint(form.currFlowForm, form.currFlowForm.type, form.currFlowForm.formId, '1')
}
async function initFormPermPrint() {
await handleFormPrint(form.currFlowForm, form.currFlowForm.type, form.currFlowForm.formId, '1');
}
function printForm() {
form.currFlowForm.formData = formCreateRef.value.design.formData
form.currFlowForm.modelRefList = []
let children = formCreateRef.value.design.fApi.children;
if (children && children.length > 0) {
// 防止!validateNull(form.currFlowForm)引用循环
children.forEach(each => form.currFlowForm.modelRefList.push({model: each.model}))
}
form.currFlowForm.rule = formCreateRef.value.design.rule
form.tinymceTitle = form.currFlowForm.formName
form.showTinymceView = true
}
function printForm() {
form.currFlowForm.formData = formCreateRef.value.design.formData;
form.currFlowForm.modelRefList = [];
let children = formCreateRef.value.design.fApi.children;
if (children && children.length > 0) {
// 防止!validateNull(form.currFlowForm)引用循环
children.forEach((each) => form.currFlowForm.modelRefList.push({ model: each.model }));
}
form.currFlowForm.rule = formCreateRef.value.design.rule;
form.tinymceTitle = form.currFlowForm.formName;
form.showTinymceView = true;
}
function closePrint(){
delete form.currFlowForm.modelRefList
delete form.currFlowForm.rule
}
function closePrint() {
delete form.currFlowForm.modelRefList;
delete form.currFlowForm.rule;
}
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
// 监听双向绑定
watch(
() => props.currFlowForm.id,
() => {
initJobData();
}
);
onMounted(() => {
initJobData()
});
onMounted(() => {
initJobData();
});
</script>
<style lang="scss" scoped>
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.el-dialog__footer {
text-align: center;
margin-top: 10px;
.dialog-footer {
text-align: center;
}
}
.dialog-footer {
text-align: center;
}
}
</style>