rebuild all
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user