批量更新功能

This commit is contained in:
2026-09-14 16:15:44 +08:00
parent 6f106e43af
commit a26c98b92b
79 changed files with 4529 additions and 724 deletions
@@ -5,8 +5,8 @@
<el-descriptions-item label="项目名称" :span="2">{{ project.project_name }}</el-descriptions-item>
<el-descriptions-item label="项目编号">{{ project.project_no || "-" }}</el-descriptions-item>
<el-descriptions-item label="项目类型">
<el-tag :type="isBackToBack ? 'warning' : 'info'" size="small" effect="plain">
{{ isBackToBack ? "上下游项目" : "单一项目" }}
<el-tag :type="projectTypeTag(project.project_type)" size="small" effect="plain">
{{ projectTypeText(project.project_type) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="项目状态">
@@ -30,35 +30,47 @@
<el-descriptions-item label="备注" :span="2">{{ project.remark || "-" }}</el-descriptions-item>
</el-descriptions>
<!-- 单一项目不存在上下游概念,只展示客户信息;上下游项目则区分上游(客户侧) -->
<el-divider content-position="left">{{ isBackToBack ? "上游信息" : "客户信息" }}</el-divider>
<!-- 单一项目不存在上下游概念,只展示客户信息;上下游 / 上中游项目区分上游(客户侧) -->
<el-divider content-position="left">{{ hasCounterparty ? "上游信息" : "客户信息" }}</el-divider>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="客户名称">{{ project.customer_name || "-" }}</el-descriptions-item>
<el-descriptions-item :label="isBackToBack ? '上游金额' : '项目金额'">
<el-descriptions-item :label="hasCounterparty ? '上游客户' : '客户名称'">
{{ project.customer_name || "-" }}
</el-descriptions-item>
<el-descriptions-item :label="hasCounterparty ? '上游金额' : '项目金额'">
{{ formatMoney(upstreamAmount) }}
</el-descriptions-item>
<el-descriptions-item :label="isBackToBack ? '上游对接人' : '对接人'">
<el-descriptions-item :label="hasCounterparty ? '上游对接人' : '对接人'">
{{ project.upstream_contact || project.contact_person || "-" }}
</el-descriptions-item>
<el-descriptions-item :label="isBackToBack ? '上游联系电话' : '联系电话'">
<el-descriptions-item :label="hasCounterparty ? '上游联系电话' : '联系电话'">
{{ project.upstream_phone || project.contact_phone || "-" }}
</el-descriptions-item>
</el-descriptions>
<!-- 下游(供应商侧):仅上下游项目展示 -->
<template v-if="isBackToBack">
<el-divider content-position="left">下游信息</el-divider>
<!-- 对方主体(上下游的下游供应商 / 上中游的中游中间方):仅这两类项目展示 -->
<template v-if="hasCounterparty">
<el-divider content-position="left">{{ counterpartyLabel }}信息</el-divider>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="供应商/客户">
<el-descriptions-item :label="isUpMid ? '中游企业' : '供应商/客户'">
{{ project.supplier_name || "-" }}
<el-tag v-if="Number(project.supplier_ref_type) === 1" size="small" effect="plain" type="success">客户</el-tag>
<el-tag v-else-if="Number(project.supplier_ref_type) === 2" size="small" effect="plain" type="warning">
供应商
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="下游金额">{{ formatMoney(project.downstream_amount) }}</el-descriptions-item>
<el-descriptions-item label="下游对接人">{{ project.downstream_contact || "-" }}</el-descriptions-item>
<el-descriptions-item label="下游联系电话">{{ project.downstream_phone || "-" }}</el-descriptions-item>
<el-descriptions-item :label="`${counterpartyLabel}金额`">
{{ formatMoney(project.downstream_amount) }}
</el-descriptions-item>
<el-descriptions-item :label="`${counterpartyLabel}对接人`">
{{ project.downstream_contact || "-" }}
</el-descriptions-item>
<el-descriptions-item :label="`${counterpartyLabel}联系电话`">
{{ project.downstream_phone || "-" }}
</el-descriptions-item>
<!-- 上中游项目:下游固定为本公司 -->
<el-descriptions-item v-if="isUpMid" label="下游(本公司)" :span="2">
{{ ownCompanyName }}
</el-descriptions-item>
</el-descriptions>
</template>
</div>
@@ -66,9 +78,12 @@
<script setup>
import { computed } from "vue";
import { useAuthStore } from "@/stores/auth";
import {
projectStatusText,
projectStatusTag,
projectTypeText,
projectTypeTag,
formatDateTime,
formatMoney,
formatDateOnly,
@@ -79,9 +94,23 @@ const props = defineProps({
project: { type: Object, default: null },
});
const authStore = useAuthStore();
/** 是否背靠背项目:需要展示下游(供应商)信息 */
const isBackToBack = computed(() => Number(props.project?.project_type) === 2);
/** 是否上中游项目:上游 A 公司 + 中游 B 公司,下游固定为本公司 */
const isUpMid = computed(() => Number(props.project?.project_type) === 3);
/** 是否需要展示「对方主体」(上下游的下游 / 上中游的中游) */
const hasCounterparty = computed(() => isBackToBack.value || isUpMid.value);
/** 对方主体称谓:上下游项目叫「下游」,上中游项目叫「中游」 */
const counterpartyLabel = computed(() => (isUpMid.value ? "中游" : "下游"));
/** 本公司名称:上中游项目的下游固定为本公司 */
const ownCompanyName = computed(() => authStore.user?.tenant_name || "本公司");
/** 上游金额:新字段优先,兼容存量项目仅有旧「项目金额」的情况 */
const upstreamAmount = computed(
() => Number(props.project?.upstream_amount) || Number(props.project?.amount) || 0