rebuild all

This commit is contained in:
吴红兵
2026-03-02 12:36:49 +08:00
parent 4167a2a94d
commit 7a7fa25df4
3 changed files with 82 additions and 12 deletions

View File

@@ -360,6 +360,21 @@
</el-row>
</div>
<div v-if="isViewMode && dataForm.representorName" class="implement-info-block mb20">
<el-divider content-position="left">采购代表/评委</el-divider>
<el-row :gutter="24">
<el-col :span="8" class="mb12">
<div class="view-label">参与人员</div>
<div class="view-value">
{{ dataForm.representorName }}
<el-tag v-if="dataForm.representorType" type="info" size="small" style="margin-left: 8px;">
{{ dataForm.representorType }}
</el-tag>
</div>
</el-col>
</el-row>
</div>
<!-- 帮助弹窗展示金额与规则说明 -->
<el-dialog
v-model="helpDialogVisible"
@@ -631,6 +646,8 @@ const dataForm = reactive({
fileFlowStatus: '',
agentId: '',
agentName: '',
representorName:'',
representorType: ''
});
/** 查看时展示的招标文件列表(实施采购上传的 type=130 */
const viewImplementPurchaseFiles = ref<{ id: string; fileTitle?: string; createTime?: string; remark?: string }[]>([]);
@@ -648,6 +665,8 @@ const businessDeptList = ref<any[]>([]);
const schoolLeaderList = ref<any[]>([]);
const purchasingManagerList = ref<any[]>([]);
const businessLeaderList = ref<any[]>([]);
/** 人员类型字典(采购代表/评委) */
const representorTypeList = ref<any[]>([]);
const loading = ref(false);
const helpDialogVisible = ref(false);
@@ -724,6 +743,12 @@ const isSpecialType = (dictValue: string) => {
return item ? dataForm.isSpecial === item.value : dataForm.isSpecial === dictValue;
};
// 辅助函数:根据人员类型值获取标签(采购代表/评委类型)
const getRepresentorTypeLabel = (value: string): string => {
const item = representorTypeList.value.find(item => item.value === value);
return item ? item.label : value;
};
// 采购途径(与后端 purchasing_apply.purchase_channel 一致1 自行采购 2 委托采购中心采购)
const PURCHASE_CHANNEL = {
SELF: '1',
@@ -1262,6 +1287,8 @@ async function loadDetail(applyId: string | number) {
fileFlowStatus: detail.fileFlowStatus ?? '',
agentId: detail.agentId ?? '',
agentName: detail.agentName ?? '',
representorName: detail.representorName ?? '',
representorType: detail.representorType ?? '',
});
setCategoryCodePath();
try {

View File

@@ -6,6 +6,7 @@
destroy-on-close
:close-on-click-modal="false"
@close="handleClose">
<el-tabs v-model="activeTab">
<!-- 采购需求文件 -->
<el-tab-pane label="采购需求文件" name="requirement">
@@ -59,14 +60,14 @@
</el-upload>
</template>
<!-- 保存草稿按钮 -->
<el-button
v-if="canSaveDraft && fileList.length > 0"
type="info"
:loading="uploadSubmitting"
@click="handleSaveDraft"
class="ml-2">
保存草稿
</el-button>
<!-- <el-button-->
<!-- v-if="canSaveDraft && fileList.length > 0"-->
<!-- type="info"-->
<!-- :loading="uploadSubmitting"-->
<!-- @click="handleSaveDraft"-->
<!-- class="ml-2">-->
<!-- 保存草稿-->
<!-- </el-button>-->
<!-- 提交审核按钮 -->
<el-button
v-if="canSubmitDraft && fileList.length > 0"
@@ -133,6 +134,13 @@
<ReviewerSetting :apply-id="applyId" @saved="handleReviewerSaved" />
</el-tab-pane>
<el-tab-pane v-if="rowData.representorName" label="学校招标参与人">
<el-tag type="info">{{rowData.representorName}} {{rowData.representorType}}</el-tag>
</el-tab-pane>
<!-- 开标通知 - 仅招标代理模式且状态为已完成时显示 -->
<el-tab-pane v-if="showBidOpeningNotice" label="开标通知" name="bidOpening">
<div class="bid-opening-form" v-loading="bidOpeningLoading">

View File

@@ -4,6 +4,7 @@
<!-- 当前采购代表 -->
<el-form-item label="当前代表" v-if="currentRepresentor.teacherName">
<el-tag type="success">{{ currentRepresentor.teacherName }} ({{ currentRepresentor.teacherNo }})</el-tag>
<el-tag v-if="currentRepresentor.representorType" type="info" style="margin-left: 8px;">{{ getRepresentorTypeLabel(currentRepresentor.representorType) }}</el-tag>
</el-form-item>
<!-- 选择方式 -->
@@ -61,6 +62,17 @@
</el-form-item>
</template>
<!-- 人员类型选择 -->
<el-form-item label="人员类型">
<el-select v-model="formData.representorType" placeholder="请选择人员类型" clearable style="width: 200px;">
<el-option
v-for="item in representorTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<!-- 保存按钮 -->
<el-form-item>
<el-button type="primary" :loading="saving" :disabled="!canSave" @click="handleSave">
@@ -74,6 +86,7 @@
<script setup lang="ts" name="ReviewerSetting">
import { ref, computed, onMounted, onUnmounted } from 'vue'
import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { getReviewerSetting, setReviewerSetting, randomSelectReviewer } from '/@/api/purchase/docProcess'
import orgSelector from '/@/components/OrgSelector/index.vue'
@@ -91,18 +104,31 @@ const SELECT_MODE = {
RANDOM: 'RANDOM',
} as const
// 字典数据
const { PURCHASE_REPRESENTOR_TYPE: representorTypeDict } = useDict('PURCHASE_REPRESENTOR_TYPE')
// 人员类型选项
const representorTypeOptions = computed(() => {
return (representorTypeDict.value || []).map((item: any) => ({
value: item.value,
label: item.label
}))
})
// 表单数据
const formData = ref({
selectMode: 'DESIGNATED' as 'DESIGNATED' | 'RANDOM',
teacherNo: '',
teacherName: '',
candidates: [] as Array<{ teacherNo: string; teacherName: string }>
candidates: [] as Array<{ teacherNo: string; teacherName: string }>,
representorType: ''
})
// 当前采购代表(已有设置)
const currentRepresentor = ref({
teacherNo: '',
teacherName: ''
teacherName: '',
representorType: ''
})
// 用户选择相关
@@ -143,6 +169,12 @@ const handleSelectModeChange = () => {
rollingName.value = ''
}
// 获取人员类型标签
const getRepresentorTypeLabel = (value: string): string => {
const option = representorTypeOptions.value.find((item: any) => item.value === value)
return option ? option.label : value
}
// 处理指定人员变化
const handleUserChange = (list: any[]) => {
if (list && list.length > 0) {
@@ -247,7 +279,8 @@ const handleSave = async () => {
applyId: props.applyId,
selectMode: formData.value.selectMode,
teacherNo: formData.value.teacherNo,
teacherName: formData.value.teacherName
teacherName: formData.value.teacherName,
representorType: formData.value.representorType
}
if (formData.value.selectMode === SELECT_MODE.RANDOM) {
@@ -276,11 +309,13 @@ const loadData = async () => {
if (data) {
currentRepresentor.value = {
teacherNo: data.teacherNo || '',
teacherName: data.teacherName || ''
teacherName: data.teacherName || '',
representorType: data.representorType || ''
}
formData.value.selectMode = data.selectMode || SELECT_MODE.DESIGNATED
formData.value.teacherNo = data.teacherNo || ''
formData.value.teacherName = data.teacherName || ''
formData.value.representorType = data.representorType || ''
if (data.candidateList && data.candidateList.length > 0) {
candidates.value = data.candidateList