优化合同个管理和产品管理相关功能

This commit is contained in:
hero920103 committed 2026-09-12 23:29:45 +08:00
1 parent 2b1874943f
commit 4455b95e37
92 files changed
+5367 -3144

No files matched your search

@@ -8,6 +8,18 @@
@opened="loadAll"
>
<div v-if="project" class="project-detail">
<div class="detail-toolbar">
<div class="toolbar-status">
<el-tag :type="projectStatusTag(project.status)" size="small">{{ projectStatusText(project.status) }}</el-tag>
<el-tag v-if="projectOverdue(project).overdue" type="danger" size="small" effect="dark">
{{ overdueText(projectOverdue(project).days) }}
</el-tag>
</div>
<div class="toolbar-actions">
<el-button type="primary" size="small" :icon="Edit" @click="handleEdit">编辑</el-button>
<el-button type="danger" size="small" :icon="Delete" @click="handleDelete">删除</el-button>
</div>
</div>
<el-tabs v-model="activeTab" tab-position="left" class="detail-tabs">
<!-- 基本信息 -->
<el-tab-pane label="基本信息" name="basic">
@@ -80,6 +92,9 @@
<script setup>
import { ref, reactive, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { Edit, Delete } from "@element-plus/icons-vue";
import { deleteProject } from "@/api/crmPipeline";
import DetailBasic from "./detail_basic.vue";
import DetailContact from "./detail_contact.vue";
import DetailFollow from "./detail_follow.vue";
@@ -87,12 +102,13 @@ import DetailContract from "./detail_contract.vue";
import DetailAttach from "./detail_attach.vue";
import DetailDocs from "./detail_docs.vue";
import DetailLog from "./detail_log.vue";
import { projectStatusText, projectStatusTag, projectOverdue, overdueText } from "../../dict";
const props = defineProps({
visible: { type: Boolean, default: false },
project: { type: Object, default: null },
});
const emit = defineEmits(["update:visible", "refresh"]);
const emit = defineEmits(["update:visible", "refresh", "edit", "delete"]);
// 关联类型:3=项目
const RELATED_TYPE = 3;
@@ -125,6 +141,24 @@ function handleClose() {
emit("update:visible", false);
}
function handleEdit() {
emit("edit", props.project);
}
async function handleDelete() {
try {
await ElMessageBox.confirm(`确定删除项目「${props.project.project_name}」吗?删除后不可恢复。`, "删除确认", {
type: "warning",
});
await deleteProject(props.project.id);
ElMessage.success("删除成功");
emit("update:visible", false);
emit("delete");
} catch (e) {
if (e !== "cancel") ElMessage.error(e.message || "删除失败");
}
}
/** 抽屉打开后刷新各 Tab 数据 */
function loadAll() {
if (!props.project?.id) return;
@@ -145,6 +179,27 @@ defineExpose({ loadAll });
}
.project-detail {
.detail-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 4px 12px;
margin-bottom: 8px;
border-bottom: 1px solid var(--el-border-color-lighter);
.toolbar-status {
display: flex;
align-items: center;
gap: 10px;
}
.toolbar-actions {
display: flex;
align-items: center;
gap: 8px;
}
}
.detail-tabs {
// 横向 flex:导航固定宽 + 内容区占满剩余宽度
display: flex;