weizong song 3 months ago
parent 977922082d
commit 36444be2f9

@ -123,3 +123,4 @@ echo ""

@ -339,3 +339,23 @@ export function getRelationList(flowId, isLoading = false) {
isLoading
})
}
// 打捞流程至付款流程
export function salvageFlow(flowId, isLoading = true) {
return request({
method: 'post',
url: '/api/oa/flow/salvage',
data: { flow_id: flowId },
isLoading
})
}
// 取消打捞
export function cancelSalvage(flowId, isLoading = true) {
return request({
method: 'post',
url: '/api/oa/flow/cancel-salvage',
data: { flow_id: flowId },
isLoading
})
}

@ -219,8 +219,49 @@
</el-tree>
</div>
<div v-if="offsetPrepaidTree.length" class="tree-block" style="margin-top: 16px">
<div class="tree-title">抵消预付账款</div>
<el-tree
ref="offsetPrepaidTreeRef"
:data="offsetPrepaidTree"
node-key="id"
:props="treeProps"
highlight-current
default-expand-all
:expand-on-click-node="false"
show-checkbox
check-strictly
:check-on-click-node="false"
@check-change="onTreeCheckChange"
@node-click="onNodeClickToggle"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span class="node-label" :class="{ 'node-label--clickable': data.is_leaf }" @click.stop="onLabelClick(data, node, $refs.offsetPrepaidTreeRef)">{{ node.label }}</span>
<span v-if="data.is_leaf" class="node-usage-info">
<span class="usage-item">
<span class="usage-label">预算:</span>
<span class="usage-value">{{ formatAmount(data.budget_amount) }}</span>
</span>
<span class="usage-item">
<span class="usage-label">已用:</span>
<span class="usage-value usage-value--used">{{ formatAmount(data.used_amount || 0) }}</span>
</span>
<span class="usage-item">
<span class="usage-label">执行率:</span>
<span
class="usage-value usage-value--rate"
:class="getExecutionRateClass(data.execution_rate || 0)"
>
{{ formatExecutionRate(data.execution_rate || 0) }}
</span>
</span>
</span>
</span>
</el-tree>
</div>
<div
v-if="!treeLoading && departmentTree.length === 0 && projectTree.length === 0 && specialFundTree.length === 0 && lastYearCarryoverTree.length === 0"
v-if="!treeLoading && departmentTree.length === 0 && projectTree.length === 0 && specialFundTree.length === 0 && lastYearCarryoverTree.length === 0 && offsetPrepaidTree.length === 0"
style="text-align: center; color: #909399; padding: 32px 0"
>
暂无数据
@ -462,12 +503,16 @@ export default {
lastYearCarryoverTree() {
return (this.treeData || []).filter((n) => n?.budget_type === "last_year_carryover");
},
offsetPrepaidTree() {
return (this.treeData || []).filter((n) => n?.budget_type === "offset_prepaid");
},
budgetTypeMap() {
return {
department: "部门预算",
project: "自有账户",
special_fund: "专项资金",
last_year_carryover: "上一年结转资金",
offset_prepaid: "抵消预付账款",
};
},
//
@ -624,6 +669,7 @@ export default {
this.$refs.projectTreeRef,
this.$refs.specialFundTreeRef,
this.$refs.lastYearCarryoverTreeRef,
this.$refs.offsetPrepaidTreeRef,
].filter(Boolean);
const nodes = [];
refs.forEach((tree) => {
@ -646,6 +692,7 @@ export default {
this.$refs.projectTreeRef,
this.$refs.specialFundTreeRef,
this.$refs.lastYearCarryoverTreeRef,
this.$refs.offsetPrepaidTreeRef,
].filter(Boolean);
refs.forEach((tree) => {
if (typeof tree.setCheckedKeys === "function") {

@ -96,7 +96,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="合同类型" prop="contract_type_id">
<el-select v-model="form.contract_type_id" placeholder="请选择合同类型" filterable clearable style="width: 100%">
<el-select v-model="form.contract_type_id" placeholder="请选择合同类型" filterable clearable style="width: 100%" @change="handleContractTypeChange">
<el-option
v-for="type in contractTypeOptions"
:key="type.id"
@ -221,19 +221,19 @@
/>
</el-select>
</el-form-item>
<el-form-item label="科室" prop="owner_department_ids" :required="isEditMode()">
<el-form-item label="科室" prop="owner_department_ids_array">
<el-select v-model="form.owner_department_ids_array" multiple placeholder="请选择科室" filterable clearable style="width: 100%">
<el-option v-for="dept in departmentList" :key="dept.id" :label="dept.name" :value="dept.id.toString()" />
</el-select>
</el-form-item>
<el-form-item label="合同签订/变更经办人" prop="handler_admin_ids" :required="isEditMode()">
<el-form-item label="合同签订/变更经办人" prop="handler_admin_ids_array">
<el-select v-model="form.handler_admin_ids_array" multiple placeholder="请选择经办人" filterable clearable style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id.toString()" />
</el-select>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="申请科室经办人" prop="apply_handler_id" :required="isEditMode()">
<el-form-item label="申请科室经办人" prop="apply_handler_id_array">
<el-select v-model="form.apply_handler_id_array" placeholder="请选择" filterable multiple clearable style="width: 100%">
<el-option v-for="user in userList" :key="user.id" :label="user.name" :value="user.id.toString()" />
</el-select>
@ -328,7 +328,6 @@ import {
getContractByFlowId,
createContract,
getBudgetYearOptions,
save,
} from "@/api/flow";
import { userListNoAuth, departmentListNoAuth } from "@/api/common";
@ -439,17 +438,17 @@ export default {
//
'form.owner_department_ids_array'() {
if (this.$refs.formRef) {
this.$refs.formRef.validateField('owner_department_ids', () => {});
this.$refs.formRef.validateField('owner_department_ids_array', () => {});
}
},
'form.handler_admin_ids_array'() {
if (this.$refs.formRef) {
this.$refs.formRef.validateField('handler_admin_ids', () => {});
this.$refs.formRef.validateField('handler_admin_ids_array', () => {});
}
},
'form.apply_handler_id_array'() {
if (this.$refs.formRef) {
this.$refs.formRef.validateField('apply_handler_id', () => {});
this.$refs.formRef.validateField('apply_handler_id_array', () => {});
}
},
'form.pay_plans'() {
@ -463,6 +462,16 @@ export default {
this.$refs.formRef.validateField('amount_description', () => {});
}
},
//
'form.contract_type_id'() {
//
if (this.$refs.formRef) {
this.$nextTick(() => {
this.$refs.formRef.validateField('fund_source_year_id');
this.$refs.formRef.validateField('fund_source_budget_data_id');
});
}
},
},
async mounted() {
// valueflowId
@ -514,7 +523,21 @@ export default {
trigger: 'blur'
}
],
budget_amount: [{ required: true, message: "请填写项目预算金额", trigger: "blur" }],
budget_amount: [
{ required: true, message: "请填写项目预算金额", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || value === '') {
callback(new Error('请填写项目预算金额'));
} else if (value === 0) {
callback(new Error('项目预算金额不能为0'));
} else {
callback();
}
},
trigger: 'blur'
}
],
contract_type_id: [{ required: true, message: "请选择合同类型", trigger: "change" }],
sign_date: [{ required: true, message: "请选择签订日期", trigger: "change" }],
apply_date: [{ required: true, message: "请选择申请日期", trigger: "change" }],
@ -531,18 +554,56 @@ export default {
//
this.rules = {
...baseRules,
fund_source_year_id: [{ required: true, message: "请选择预算年度", trigger: "change" }],
fund_source_budget_data_id: [{ required: true, message: "请选择项目经费来源", trigger: "change" }],
fund_source_year_id: [
{
validator: (rule, value, callback) => {
// ""
const contractTypeName = this.getContractTypeName();
if (contractTypeName === '收入类') {
//
callback();
} else {
//
if (!value) {
callback(new Error('请选择预算年度'));
} else {
callback();
}
}
},
trigger: 'change'
}
],
fund_source_budget_data_id: [
{
validator: (rule, value, callback) => {
// ""
const contractTypeName = this.getContractTypeName();
if (contractTypeName === '收入类') {
//
callback();
} else {
//
if (!value) {
callback(new Error('请选择项目经费来源'));
} else {
callback();
}
}
},
trigger: 'change'
}
],
is_government_purchase: [{ required: true, message: "请选择是否为政府采购", trigger: "change" }],
purchase_category_id: [{ required: true, message: "请选择采购类别", trigger: "change" }],
purchase_method_id: [{ required: true, message: "请选择采购方式", trigger: "change" }],
is_accepted: [{ required: true, message: "请选择是否验收", trigger: "change" }],
handler_admin_ids: [
handler_admin_ids_array: [
{
required: true,
validator: (rule, value, callback) => {
const ids = this.form.handler_admin_ids_array;
if (!ids || !Array.isArray(ids) || ids.length === 0) {
const ids = Array.isArray(value) ? value : [];
if (ids.length === 0) {
callback(new Error('请选择合同签订/变更经办人'));
} else {
callback();
@ -551,12 +612,12 @@ export default {
trigger: ['change', 'blur']
}
],
apply_handler_id: [
apply_handler_id_array: [
{
required: true,
validator: (rule, value, callback) => {
const ids = this.form.apply_handler_id_array;
if (!ids || !Array.isArray(ids) || ids.length === 0) {
const ids = Array.isArray(value) ? value : [];
if (ids.length === 0) {
callback(new Error('请选择申请科室经办人'));
} else {
callback();
@ -565,12 +626,12 @@ export default {
trigger: ['change', 'blur']
}
],
owner_department_ids: [
owner_department_ids_array: [
{
required: true,
validator: (rule, value, callback) => {
const ids = this.form.owner_department_ids_array;
if (!ids || !Array.isArray(ids) || ids.length === 0) {
const ids = Array.isArray(value) ? value : [];
if (ids.length === 0) {
callback(new Error('请选择科室'));
} else {
callback();
@ -614,12 +675,30 @@ export default {
]
};
},
//
getContractTypeName() {
if (!this.form.contract_type_id) {
return null;
}
const contractType = this.contractTypeOptions.find(type => type.id === this.form.contract_type_id);
return contractType ? contractType.name : null;
},
handleFundSourceYearChange() {
this.form.fund_source_budget_data_id = null;
if (this.form.fund_source_year_id) {
this.fetchFundSourceOptions(this.form.fund_source_year_id);
}
},
//
handleContractTypeChange() {
//
if (this.$refs.formRef) {
this.$nextTick(() => {
this.$refs.formRef.validateField('fund_source_year_id');
this.$refs.formRef.validateField('fund_source_budget_data_id');
});
}
},
async fetchBudgetYearOptions() {
try {
const response = await getBudgetYearOptions(false);
@ -829,7 +908,41 @@ export default {
//
this.$nextTick(() => {
if (this.$refs.formRef) {
this.$refs.formRef.clearValidate();
//
if (this.isEditMode()) {
// DOM
this.$nextTick(() => {
if (this.$refs.formRef) {
//
//
const fieldsToCheck = [
{ prop: 'owner_department_ids_array', arrayField: 'owner_department_ids_array' },
{ prop: 'handler_admin_ids_array', arrayField: 'handler_admin_ids_array' },
{ prop: 'apply_handler_id_array', arrayField: 'apply_handler_id_array' },
];
fieldsToCheck.forEach(({ prop, arrayField }) => {
const ids = this.form[arrayField];
if (ids && Array.isArray(ids) && ids.length > 0) {
//
this.$refs.formRef.clearValidate(prop);
} else {
//
//
this.$refs.formRef.clearValidate(prop);
this.$nextTick(() => {
if (this.$refs.formRef) {
this.$refs.formRef.validateField(prop, () => {});
}
});
}
});
}
});
} else {
//
this.$refs.formRef.clearValidate();
}
}
});
},
@ -1222,11 +1335,12 @@ export default {
this.dialogVisible = false;
Message.success(contractId ? "合同更新成功" : "合同创建成功");
// flowId
// flowId
if (!contractId && this.flowId && this.fieldName) {
try {
await save(this.flowId, {
[this.fieldName]: String(data.id),
await request.post(`/api/oa/flow/save-field/${this.flowId}`, {
field_name: this.fieldName,
field_value: String(data.id),
});
//
} catch (e) {

@ -1420,6 +1420,23 @@ export default function formBuilder(
);
break;
default:
// flow_title 在只读模式下,需要添加发起人和创建时间后缀
let textDisplayValue = target[info.name] || "";
if (info.name === "flow_title" && this.config && this.config.flow) {
// 优先从 logs[0].user.name 获取发起人,其次从 flow.creator.name
const firstLogCreator = this.logs && this.logs.length > 0 ? this.logs[0].user?.name : null;
const flowCreator = this.config.flow.creator?.name || null;
const creator = firstLogCreator || flowCreator || "";
const createdAt = this.config.flow.created_at;
const formattedDate = createdAt
? moment(createdAt).format("YYYY-MM-DD H:mm")
: "";
// 格式化后缀:【发起人 | 创建时间】格式yyyy-mm-dd H:i
if (creator || formattedDate) {
const suffix = `${creator || ""} | ${formattedDate}`;
textDisplayValue = textDisplayValue + suffix;
}
}
formItem = h(
"span",
{
@ -1427,7 +1444,7 @@ export default function formBuilder(
color: "#333",
},
},
target[info.name]
textDisplayValue
);
}
}
@ -1563,8 +1580,9 @@ export default function formBuilder(
},
isJointly
? [info._writeable ? formItem : "", jointlySignContent]
: [
(() => {
: (() => {
// 获取字段值显示内容
let fieldValueDisplay = (() => {
if (info.name === "flow_title") {
return formItem;
}
@ -1582,95 +1600,106 @@ export default function formBuilder(
if ((log && log.status) || log?.user?.id === this.$store.state.user.adminId || this.logs.length === 0) {
return formItem;
}
// 如果没有符合条件的 log也返回 formItem 以确保显示
return formItem;
}
})(),
(() => {
// 检查 is_sign 是否为真值(支持 1, true, "1" 等)
if (info.is_sign && (info.is_sign === 1 || info.is_sign === true || info.is_sign === "1")) {
let log = null;
// 方法1: 从 jointlySignLog 中查找(检查所有字段)
if (this.jointlySignLog && this.jointlySignLog.length > 0) {
log = this.jointlySignLog.find((log) => {
if (log.status > 0 && log.user && log.user.sign_file && log.user.sign_file.url) {
try {
const data = JSON.parse(log.data);
// 检查 data 中是否有匹配当前字段的条目
return Object.values(data).some(
(value) =>
value &&
typeof value === 'object' &&
value.custom_field_id === info.id
);
} catch (e) {
return false;
})();
// 检查是否有签名需要显示
let signLog = null;
if (info.is_sign && (info.is_sign === 1 || info.is_sign === true || info.is_sign === "1")) {
// 方法1: 从 jointlySignLog 中查找(检查所有字段)
if (this.jointlySignLog && this.jointlySignLog.length > 0) {
signLog = this.jointlySignLog.find((log) => {
if (log.status > 0 && log.user && log.user.sign_file && log.user.sign_file.url) {
try {
const data = JSON.parse(log.data);
// 检查 data 中是否有匹配当前字段的条目
return Object.values(data).some(
(value) =>
value &&
typeof value === 'object' &&
value.custom_field_id === info.id
);
} catch (e) {
return false;
}
}
return false;
});
}
// 方法2: 如果没找到,从 this.logs 中查找必须匹配字段ID和类型
if (!signLog && this.logs && this.logs.length > 0) {
signLog = this.logs.find(
(log) =>
log.status > 0 &&
log.user &&
log.user.sign_file &&
log.user.sign_file.url &&
log.node?.fields?.findIndex(
(field) =>
field?.field_id === info.id &&
field.type === "write"
) !== -1
);
}
}
// 如果找到签名日志,重新组织显示顺序
if (signLog && signLog.status > 0 && signLog.user && signLog.user.sign_file && signLog.user.sign_file.url) {
const signDate = signLog.updated_at
? this.$moment(signLog.updated_at).format("YYYY年MM月DD日")
: "";
const signImageUrl = signLog.user.sign_file.url;
return [
// 1. input框的内容独占一行
fieldValueDisplay,
// 2. 签名图片(容器占一行)
h("div", {
style: {
"margin-top": "8px",
"margin-bottom": "8px",
}
}, [
h("img", {
style: {
display: "block",
"max-height": "80px",
"max-width": "100px",
cursor: "pointer",
},
attrs: {
src: signImageUrl,
alt: signLog.user?.name || "",
},
on: {
click: () => {
this.$bus.$emit("online-file", signImageUrl);
}
}
return false;
});
}
// 方法2: 如果没找到,从 this.logs 中查找必须匹配字段ID和类型
if (!log && this.logs && this.logs.length > 0) {
log = this.logs.find(
(log) =>
log.status > 0 &&
log.user &&
log.user.sign_file &&
log.user.sign_file.url &&
log.node?.fields?.findIndex(
(field) =>
field?.field_id === info.id &&
field.type === "write"
) !== -1
);
}
// 只有当找到匹配当前字段的log时才显示
if (log && log.status > 0 && log.user && log.user.sign_file && log.user.sign_file.url) {
return h("div", {
})
]),
// 3. 日期(独占一行)
h("div", {
style: {
"margin-top": "4px",
}
}, [
h("span", {
style: {
"margin-top": "8px",
display: "flex",
"align-items": "center",
gap: "8px",
"font-size": "16px",
color: "#000",
}
}, [
h("el-image", {
style: {
"max-height": "80px",
"max-width": "100px",
display: "block",
},
props: {
src: log.user.sign_file.url,
fit: "contain",
alt: log.user?.name || "",
"preview-src-list": [log.user.sign_file.url],
lazy: false,
},
attrs: {
src: log.user.sign_file.url,
},
}),
h(
"div",
{
style: {
"font-size": "16px",
color: "#000",
}
},
log.updated_at
? this.$moment(log.updated_at).format("YYYY年MM月DD日")
: ""
),
]);
}
}
return null;
})(),
]
}, signDate)
])
];
} else {
// 没有签名时,只显示字段值
return [fieldValueDisplay];
}
})()
);
}
}

@ -440,8 +440,6 @@ export default {
padding: 8px 12px;
margin: -1px 0 0 -1px;
}
::v-deep .el-form-item__content {
}
::v-deep .el-radio, .el-radio__input {
line-height: 1.5;
}

@ -281,10 +281,26 @@
<!-- 附件/文件还原原始名并可点击 -->
<template v-else-if="f.element_type === 'attachment' || f.element_type === 'file'">
<div v-for="(fi, fidx) in getPlannedFileItems(expId, f)" :key="`${expId}_${f.element_id || f.key}_${fidx}`" style="margin-bottom: 6px;">
<el-link v-if="fi.url" type="primary" :underline="false" :href="fi.url" target="_blank">
<el-link
v-if="fi.url"
type="primary"
:underline="false"
:href="fi.url"
target="_blank"
class="file-link"
@click="handlePlannedFileClick(fi)"
>
{{ fi.name || '附件' }}
</el-link>
<el-link
v-else
type="primary"
:underline="false"
class="file-link file-link--no-url"
@click="handlePlannedFileClick(fi)"
>
{{ fi.name || '附件' }}
</el-link>
<span v-else>{{ fi.name || '' }}</span>
</div>
<span v-if="getPlannedFileItems(expId, f).length === 0">-</span>
</template>
@ -929,12 +945,38 @@ export default {
return (field && (field.key || field.field_key)) ? (field.key || field.field_key) : '';
},
// oa_custom_model/out_custom_model
//
// 1. visible === false
// 2. oa_custom_model/out_custom_model ""
// 3. meeting_minutes attachment/file ""
shouldRenderPlannedField(expenditureId, field) {
if (!field) return false;
// visible === false
if (field.visible === false) {
return false;
}
// oa_custom_model/out_custom_model
if (field.element_type === 'oa_custom_model' || field.element_type === 'out_custom_model') {
return this.getOaCustomModelBindings(expenditureId, field).length > 0;
}
// meeting_minutes ID
if (field.element_type === 'meeting_minutes') {
const meetingMinuteId = this.extractMeetingMinuteId(
this.getIndirectFieldValue(expenditureId, this.getTplFieldKey(field))
);
return meetingMinuteId !== null && meetingMinuteId !== undefined;
}
// attachment/file
if (field.element_type === 'attachment' || field.element_type === 'file') {
const fileItems = this.getPlannedFileItems(expenditureId, field);
return fileItems && fileItems.length > 0;
}
// visible
return true;
},
@ -1692,6 +1734,47 @@ export default {
},
// ---------- / ----------
// URL
buildFileUrl(path) {
if (!path) return null;
const pathStr = String(path).trim();
if (!pathStr) return null;
// URLhttp:// https://
if (pathStr.startsWith('http://') || pathStr.startsWith('https://')) {
return pathStr;
}
// /
if (pathStr.startsWith('/')) {
const origin = window.location.origin;
return `${origin}${pathStr}`;
}
// storage/files/xxx
if (pathStr.includes('/')) {
const origin = window.location.origin;
return `${origin}/${pathStr.replace(/^\//, '')}`;
}
//
return pathStr;
},
//
handlePlannedFileClick(file) {
if (file.url) {
try {
window.open(file.url, '_blank');
} catch (error) {
this.$message.error('打开文件失败:' + error.message);
}
} else {
this.$message.warning('文件链接不可用');
}
},
getPlannedFileItems(expenditureId, field) {
const v = this.getIndirectFieldValue(expenditureId, field?.key);
if (!v) return [];
@ -1701,19 +1784,33 @@ export default {
const s = x.trim();
if (!s) return null;
const name = s.split('/').pop();
return { name: name || `附件${idx + 1}`, url: s };
const url = this.buildFileUrl(s);
return { name: name || `附件${idx + 1}`, url };
}
if (typeof x === 'object') {
const url = x.url || x.path || x.file_url || x.download_url || x.href || x.preview_url;
//
let rawPath = x.url || x.path || x.file_url || x.download_url || x.href || x.preview_url || x.value || x.file_path || x.folder;
//
if (!rawPath) {
for (const [key, value] of Object.entries(x)) {
if (typeof value === 'string' && (value.includes('/') || value.includes('storage') || value.includes('files'))) {
rawPath = value;
break;
}
}
}
const url = rawPath ? this.buildFileUrl(rawPath) : null;
const name =
x.original_name ||
x.file_name ||
x.name ||
x.filename ||
x.originalName ||
(url ? String(url).split('/').pop() : null);
if (url || name) return { name: name || `附件${idx + 1}`, url };
return null;
(url ? String(url).split('/').pop() : null) ||
(rawPath ? String(rawPath).split('/').pop() : null);
return (url || name) ? { name: name || `附件${idx + 1}`, url } : null;
}
return null;
};
@ -2644,7 +2741,7 @@ export default {
table-layout: fixed;
}
::v-deep .el-descriptions-item__label {
width: 200px;
width: 250px;
white-space: nowrap;
}
::v-deep .el-descriptions-item__content {

@ -397,7 +397,17 @@
content:
'点击工作名称查看简要。\n批量审批请先选择流程类型并勾选同一节点的流程。',
}"
></vxe-column>
>
<template #default="{ row }">
<el-tag
v-if="row.is_salvaged === 1 || row.is_salvaged === true"
size="mini"
type="info"
style="margin-right: 8px"
>打捞</el-tag>
<span>{{ row.title }}</span>
</template>
</vxe-column>
<vxe-column
:visible="$route.params.type === 'all'"
width="80"
@ -679,6 +689,8 @@ import {
todoTotal,
fieldConfig,
save as saveFlow,
salvageFlow,
cancelSalvage,
} from "@/api/flow";
import moment from "moment/moment";
import ListPopover from "./components/ListPopover.vue";
@ -900,7 +912,6 @@ export default {
contextMenuClickEvent({ menu, row, column }) {
switch (menu.code) {
case "edit":
//
if (row && column) {
const target = this.$router.resolve({
path: "/flow/edit",
@ -911,9 +922,60 @@ export default {
window.open(target.href, "_blank");
}
break;
case "salvage":
//
if (row.is_salvaged) {
this.$message.warning("该流程已被打捞");
return;
}
const cutoffDate = new Date("2026-01-01 00:00:00");
const createdDate = row.created_at ? new Date(row.created_at) : null;
if (!createdDate || createdDate >= cutoffDate) {
this.$message.warning("只有2026-01-01之前创建的流程可以打捞");
return;
}
this.handleSalvage(row);
break;
case "cancel_salvage":
if (!row.is_salvaged) {
this.$message.warning("该流程未被打捞");
return;
}
this.handleCancelSalvage(row);
break;
default:
}
},
async handleSalvage(row) {
try {
await this.$confirm("确认打捞该流程至付款流程?", "提示", {
type: "warning",
});
const res = await salvageFlow(row.id);
// data
this.$message.success(res || "打捞成功");
this.getList();
} catch (err) {
if (err !== "cancel") {
this.$message.error(err.message || err.msg || "打捞失败");
}
}
},
async handleCancelSalvage(row) {
try {
await this.$confirm("确认取消打捞该流程?", "提示", {
type: "warning",
});
const res = await cancelSalvage(row.id);
// data
this.$message.success(res || "取消打捞成功");
this.getList();
} catch (err) {
if (err !== "cancel") {
this.$message.error(err.message || err.msg || "取消打捞失败");
}
}
},
contentFormatter(row) {
const { data, fields } = row;
let text = "";
@ -1135,11 +1197,6 @@ export default {
},
computed: {
menuConfig() {
console.log(
"this.$store.state",
this.$store.state,
this.$store.state.user.roles.includes("全局流程监管")
);
if (this.$store.state.user.roles.includes("全局流程监管")) {
return {
className: "my-menus",
@ -1151,6 +1208,16 @@ export default {
name: "编辑",
prefixConfig: { icon: "vxe-icon-feedback" },
},
{
code: "salvage",
name: "打捞至付款流程",
prefixConfig: { icon: "vxe-icon-check" },
},
{
code: "cancel_salvage",
name: "取消打捞",
prefixConfig: { icon: "vxe-icon-close" },
},
],
],
},

@ -1157,3 +1157,4 @@ form 对象存储字段值

@ -194,3 +194,4 @@ A: 这是正常的Vue CLI使用内容哈希来生成文件名。只要HTML文

Loading…
Cancel
Save