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> </el-row>
</div> </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 <el-dialog
v-model="helpDialogVisible" v-model="helpDialogVisible"
@@ -631,6 +646,8 @@ const dataForm = reactive({
fileFlowStatus: '', fileFlowStatus: '',
agentId: '', agentId: '',
agentName: '', agentName: '',
representorName:'',
representorType: ''
}); });
/** 查看时展示的招标文件列表(实施采购上传的 type=130 */ /** 查看时展示的招标文件列表(实施采购上传的 type=130 */
const viewImplementPurchaseFiles = ref<{ id: string; fileTitle?: string; createTime?: string; remark?: string }[]>([]); const viewImplementPurchaseFiles = ref<{ id: string; fileTitle?: string; createTime?: string; remark?: string }[]>([]);
@@ -648,6 +665,8 @@ const businessDeptList = ref<any[]>([]);
const schoolLeaderList = ref<any[]>([]); const schoolLeaderList = ref<any[]>([]);
const purchasingManagerList = ref<any[]>([]); const purchasingManagerList = ref<any[]>([]);
const businessLeaderList = ref<any[]>([]); const businessLeaderList = ref<any[]>([]);
/** 人员类型字典(采购代表/评委) */
const representorTypeList = ref<any[]>([]);
const loading = ref(false); const loading = ref(false);
const helpDialogVisible = ref(false); const helpDialogVisible = ref(false);
@@ -724,6 +743,12 @@ const isSpecialType = (dictValue: string) => {
return item ? dataForm.isSpecial === item.value : dataForm.isSpecial === dictValue; 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 委托采购中心采购) // 采购途径(与后端 purchasing_apply.purchase_channel 一致1 自行采购 2 委托采购中心采购)
const PURCHASE_CHANNEL = { const PURCHASE_CHANNEL = {
SELF: '1', SELF: '1',
@@ -1262,6 +1287,8 @@ async function loadDetail(applyId: string | number) {
fileFlowStatus: detail.fileFlowStatus ?? '', fileFlowStatus: detail.fileFlowStatus ?? '',
agentId: detail.agentId ?? '', agentId: detail.agentId ?? '',
agentName: detail.agentName ?? '', agentName: detail.agentName ?? '',
representorName: detail.representorName ?? '',
representorType: detail.representorType ?? '',
}); });
setCategoryCodePath(); setCategoryCodePath();
try { try {

View File

@@ -6,6 +6,7 @@
destroy-on-close destroy-on-close
:close-on-click-modal="false" :close-on-click-modal="false"
@close="handleClose"> @close="handleClose">
<el-tabs v-model="activeTab"> <el-tabs v-model="activeTab">
<!-- 采购需求文件 --> <!-- 采购需求文件 -->
<el-tab-pane label="采购需求文件" name="requirement"> <el-tab-pane label="采购需求文件" name="requirement">
@@ -59,14 +60,14 @@
</el-upload> </el-upload>
</template> </template>
<!-- 保存草稿按钮 --> <!-- 保存草稿按钮 -->
<el-button <!-- <el-button-->
v-if="canSaveDraft && fileList.length > 0" <!-- v-if="canSaveDraft && fileList.length > 0"-->
type="info" <!-- type="info"-->
:loading="uploadSubmitting" <!-- :loading="uploadSubmitting"-->
@click="handleSaveDraft" <!-- @click="handleSaveDraft"-->
class="ml-2"> <!-- class="ml-2">-->
保存草稿 <!-- 保存草稿-->
</el-button> <!-- </el-button>-->
<!-- 提交审核按钮 --> <!-- 提交审核按钮 -->
<el-button <el-button
v-if="canSubmitDraft && fileList.length > 0" v-if="canSubmitDraft && fileList.length > 0"
@@ -133,6 +134,13 @@
<ReviewerSetting :apply-id="applyId" @saved="handleReviewerSaved" /> <ReviewerSetting :apply-id="applyId" @saved="handleReviewerSaved" />
</el-tab-pane> </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"> <el-tab-pane v-if="showBidOpeningNotice" label="开标通知" name="bidOpening">
<div class="bid-opening-form" v-loading="bidOpeningLoading"> <div class="bid-opening-form" v-loading="bidOpeningLoading">

View File

@@ -4,6 +4,7 @@
<!-- 当前采购代表 --> <!-- 当前采购代表 -->
<el-form-item label="当前代表" v-if="currentRepresentor.teacherName"> <el-form-item label="当前代表" v-if="currentRepresentor.teacherName">
<el-tag type="success">{{ currentRepresentor.teacherName }} ({{ currentRepresentor.teacherNo }})</el-tag> <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> </el-form-item>
<!-- 选择方式 --> <!-- 选择方式 -->
@@ -61,6 +62,17 @@
</el-form-item> </el-form-item>
</template> </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-form-item>
<el-button type="primary" :loading="saving" :disabled="!canSave" @click="handleSave"> <el-button type="primary" :loading="saving" :disabled="!canSave" @click="handleSave">
@@ -74,6 +86,7 @@
<script setup lang="ts" name="ReviewerSetting"> <script setup lang="ts" name="ReviewerSetting">
import { ref, computed, onMounted, onUnmounted } from 'vue' import { ref, computed, onMounted, onUnmounted } from 'vue'
import { useMessage } from '/@/hooks/message' import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { getReviewerSetting, setReviewerSetting, randomSelectReviewer } from '/@/api/purchase/docProcess' import { getReviewerSetting, setReviewerSetting, randomSelectReviewer } from '/@/api/purchase/docProcess'
import orgSelector from '/@/components/OrgSelector/index.vue' import orgSelector from '/@/components/OrgSelector/index.vue'
@@ -91,18 +104,31 @@ const SELECT_MODE = {
RANDOM: 'RANDOM', RANDOM: 'RANDOM',
} as const } 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({ const formData = ref({
selectMode: 'DESIGNATED' as 'DESIGNATED' | 'RANDOM', selectMode: 'DESIGNATED' as 'DESIGNATED' | 'RANDOM',
teacherNo: '', teacherNo: '',
teacherName: '', teacherName: '',
candidates: [] as Array<{ teacherNo: string; teacherName: string }> candidates: [] as Array<{ teacherNo: string; teacherName: string }>,
representorType: ''
}) })
// 当前采购代表(已有设置) // 当前采购代表(已有设置)
const currentRepresentor = ref({ const currentRepresentor = ref({
teacherNo: '', teacherNo: '',
teacherName: '' teacherName: '',
representorType: ''
}) })
// 用户选择相关 // 用户选择相关
@@ -143,6 +169,12 @@ const handleSelectModeChange = () => {
rollingName.value = '' 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[]) => { const handleUserChange = (list: any[]) => {
if (list && list.length > 0) { if (list && list.length > 0) {
@@ -247,7 +279,8 @@ const handleSave = async () => {
applyId: props.applyId, applyId: props.applyId,
selectMode: formData.value.selectMode, selectMode: formData.value.selectMode,
teacherNo: formData.value.teacherNo, teacherNo: formData.value.teacherNo,
teacherName: formData.value.teacherName teacherName: formData.value.teacherName,
representorType: formData.value.representorType
} }
if (formData.value.selectMode === SELECT_MODE.RANDOM) { if (formData.value.selectMode === SELECT_MODE.RANDOM) {
@@ -276,11 +309,13 @@ const loadData = async () => {
if (data) { if (data) {
currentRepresentor.value = { currentRepresentor.value = {
teacherNo: data.teacherNo || '', teacherNo: data.teacherNo || '',
teacherName: data.teacherName || '' teacherName: data.teacherName || '',
representorType: data.representorType || ''
} }
formData.value.selectMode = data.selectMode || SELECT_MODE.DESIGNATED formData.value.selectMode = data.selectMode || SELECT_MODE.DESIGNATED
formData.value.teacherNo = data.teacherNo || '' formData.value.teacherNo = data.teacherNo || ''
formData.value.teacherName = data.teacherName || '' formData.value.teacherName = data.teacherName || ''
formData.value.representorType = data.representorType || ''
if (data.candidateList && data.candidateList.length > 0) { if (data.candidateList && data.candidateList.length > 0) {
candidates.value = data.candidateList candidates.value = data.candidateList