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