更新采购申请文件模版下载

This commit is contained in:
吴红兵
2026-03-09 15:22:19 +08:00
parent 5963bbafd6
commit 03f10180dc
22 changed files with 333 additions and 364 deletions

140
auto-imports.d.ts vendored
View File

@@ -1,73 +1,73 @@
// Generated by 'unplugin-auto-import' // Generated by 'unplugin-auto-import'
export {} export {};
declare global { declare global {
const EffectScope: typeof import('vue')['EffectScope'] const EffectScope: typeof import('vue')['EffectScope'];
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'];
const computed: typeof import('vue')['computed'] const computed: typeof import('vue')['computed'];
const createApp: typeof import('vue')['createApp'] const createApp: typeof import('vue')['createApp'];
const createPinia: typeof import('pinia')['createPinia'] const createPinia: typeof import('pinia')['createPinia'];
const customRef: typeof import('vue')['customRef'] const customRef: typeof import('vue')['customRef'];
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'];
const defineComponent: typeof import('vue')['defineComponent'] const defineComponent: typeof import('vue')['defineComponent'];
const defineStore: typeof import('pinia')['defineStore'] const defineStore: typeof import('pinia')['defineStore'];
const effectScope: typeof import('vue')['effectScope'] const effectScope: typeof import('vue')['effectScope'];
const getActivePinia: typeof import('pinia')['getActivePinia'] const getActivePinia: typeof import('pinia')['getActivePinia'];
const getCurrentInstance: typeof import('vue')['getCurrentInstance'] const getCurrentInstance: typeof import('vue')['getCurrentInstance'];
const getCurrentScope: typeof import('vue')['getCurrentScope'] const getCurrentScope: typeof import('vue')['getCurrentScope'];
const h: typeof import('vue')['h'] const h: typeof import('vue')['h'];
const inject: typeof import('vue')['inject'] const inject: typeof import('vue')['inject'];
const isProxy: typeof import('vue')['isProxy'] const isProxy: typeof import('vue')['isProxy'];
const isReactive: typeof import('vue')['isReactive'] const isReactive: typeof import('vue')['isReactive'];
const isReadonly: typeof import('vue')['isReadonly'] const isReadonly: typeof import('vue')['isReadonly'];
const isRef: typeof import('vue')['isRef'] const isRef: typeof import('vue')['isRef'];
const mapActions: typeof import('pinia')['mapActions'] const mapActions: typeof import('pinia')['mapActions'];
const mapGetters: typeof import('pinia')['mapGetters'] const mapGetters: typeof import('pinia')['mapGetters'];
const mapState: typeof import('pinia')['mapState'] const mapState: typeof import('pinia')['mapState'];
const mapStores: typeof import('pinia')['mapStores'] const mapStores: typeof import('pinia')['mapStores'];
const mapWritableState: typeof import('pinia')['mapWritableState'] const mapWritableState: typeof import('pinia')['mapWritableState'];
const markRaw: typeof import('vue')['markRaw'] const markRaw: typeof import('vue')['markRaw'];
const nextTick: typeof import('vue')['nextTick'] const nextTick: typeof import('vue')['nextTick'];
const onActivated: typeof import('vue')['onActivated'] const onActivated: typeof import('vue')['onActivated'];
const onBeforeMount: typeof import('vue')['onBeforeMount'] const onBeforeMount: typeof import('vue')['onBeforeMount'];
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'];
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'];
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'];
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'];
const onDeactivated: typeof import('vue')['onDeactivated'] const onDeactivated: typeof import('vue')['onDeactivated'];
const onErrorCaptured: typeof import('vue')['onErrorCaptured'] const onErrorCaptured: typeof import('vue')['onErrorCaptured'];
const onMounted: typeof import('vue')['onMounted'] const onMounted: typeof import('vue')['onMounted'];
const onRenderTracked: typeof import('vue')['onRenderTracked'] const onRenderTracked: typeof import('vue')['onRenderTracked'];
const onRenderTriggered: typeof import('vue')['onRenderTriggered'] const onRenderTriggered: typeof import('vue')['onRenderTriggered'];
const onScopeDispose: typeof import('vue')['onScopeDispose'] const onScopeDispose: typeof import('vue')['onScopeDispose'];
const onServerPrefetch: typeof import('vue')['onServerPrefetch'] const onServerPrefetch: typeof import('vue')['onServerPrefetch'];
const onUnmounted: typeof import('vue')['onUnmounted'] const onUnmounted: typeof import('vue')['onUnmounted'];
const onUpdated: typeof import('vue')['onUpdated'] const onUpdated: typeof import('vue')['onUpdated'];
const provide: typeof import('vue')['provide'] const provide: typeof import('vue')['provide'];
const reactive: typeof import('vue')['reactive'] const reactive: typeof import('vue')['reactive'];
const readonly: typeof import('vue')['readonly'] const readonly: typeof import('vue')['readonly'];
const ref: typeof import('vue')['ref'] const ref: typeof import('vue')['ref'];
const resolveComponent: typeof import('vue')['resolveComponent'] const resolveComponent: typeof import('vue')['resolveComponent'];
const resolveDirective: typeof import('vue')['resolveDirective'] const resolveDirective: typeof import('vue')['resolveDirective'];
const setActivePinia: typeof import('pinia')['setActivePinia'] const setActivePinia: typeof import('pinia')['setActivePinia'];
const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'] const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'];
const shallowReactive: typeof import('vue')['shallowReactive'] const shallowReactive: typeof import('vue')['shallowReactive'];
const shallowReadonly: typeof import('vue')['shallowReadonly'] const shallowReadonly: typeof import('vue')['shallowReadonly'];
const shallowRef: typeof import('vue')['shallowRef'] const shallowRef: typeof import('vue')['shallowRef'];
const storeToRefs: typeof import('pinia')['storeToRefs'] const storeToRefs: typeof import('pinia')['storeToRefs'];
const toRaw: typeof import('vue')['toRaw'] const toRaw: typeof import('vue')['toRaw'];
const toRef: typeof import('vue')['toRef'] const toRef: typeof import('vue')['toRef'];
const toRefs: typeof import('vue')['toRefs'] const toRefs: typeof import('vue')['toRefs'];
const triggerRef: typeof import('vue')['triggerRef'] const triggerRef: typeof import('vue')['triggerRef'];
const unref: typeof import('vue')['unref'] const unref: typeof import('vue')['unref'];
const useAttrs: typeof import('vue')['useAttrs'] const useAttrs: typeof import('vue')['useAttrs'];
const useCssModule: typeof import('vue')['useCssModule'] const useCssModule: typeof import('vue')['useCssModule'];
const useCssVars: typeof import('vue')['useCssVars'] const useCssVars: typeof import('vue')['useCssVars'];
const useLink: typeof import('vue-router')['useLink'] const useLink: typeof import('vue-router')['useLink'];
const useRoute: typeof import('vue-router')['useRoute'] const useRoute: typeof import('vue-router')['useRoute'];
const useRouter: typeof import('vue-router')['useRouter'] const useRouter: typeof import('vue-router')['useRouter'];
const useSlots: typeof import('vue')['useSlots'] const useSlots: typeof import('vue')['useSlots'];
const watch: typeof import('vue')['watch'] const watch: typeof import('vue')['watch'];
const watchEffect: typeof import('vue')['watchEffect'] const watchEffect: typeof import('vue')['watchEffect'];
const watchPostEffect: typeof import('vue')['watchPostEffect'] const watchPostEffect: typeof import('vue')['watchPostEffect'];
const watchSyncEffect: typeof import('vue')['watchSyncEffect'] const watchSyncEffect: typeof import('vue')['watchSyncEffect'];
} }

View File

@@ -69,11 +69,7 @@ export function uploadBidFileNewVersion(data: {
}); });
} }
export function submitBidFileTask(data: { export function submitBidFileTask(data: { runJobId: string; to?: number; comment?: string }) {
runJobId: string;
to?: number;
comment?: string;
}) {
return request({ return request({
url: '/purchase/purchasingbidfile/submit', url: '/purchase/purchasingbidfile/submit',
method: 'post', method: 'post',
@@ -121,13 +117,7 @@ export function getFlowPurchaseDetail(purchaseId: string) {
}); });
} }
export function tempStoreBidFile(data: { export function tempStoreBidFile(data: { purchaseId: string; fileId?: string; fileName?: string; fileUrl?: string; comment?: string }) {
purchaseId: string;
fileId?: string;
fileName?: string;
fileUrl?: string;
comment?: string;
}) {
return request({ return request({
url: '/purchase/purchasingbidfile/tempStore', url: '/purchase/purchasingbidfile/tempStore',
method: 'post', method: 'post',

View File

@@ -31,7 +31,7 @@ const init = () => {
let flowInstId = props.currJob.flowInstId; let flowInstId = props.currJob.flowInstId;
let runJobId = props.currJob.id; let runJobId = props.currJob.id;
src.value = props.currElTab.path + `?token=${token}&tenantId=${tenantId}&flowInstId=${flowInstId}&runJobId=${runJobId}`; src.value = props.currElTab.path + `?token=${token}&tenantId=${tenantId}&flowInstId=${flowInstId}&runJobId=${runJobId}`;
console.log(src.value) console.log(src.value);
}; };
function handleJob(jobBtn) { function handleJob(jobBtn) {

View File

@@ -20,7 +20,9 @@
<el-descriptions :column="1" border size="small"> <el-descriptions :column="1" border size="small">
<el-descriptions-item label="采购编号">{{ applyData.purchaseNo || '-' }}</el-descriptions-item> <el-descriptions-item label="采购编号">{{ applyData.purchaseNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="项目名称">{{ applyData.projectName || '-' }}</el-descriptions-item> <el-descriptions-item label="项目名称">{{ applyData.projectName || '-' }}</el-descriptions-item>
<el-descriptions-item label="采购金额">{{ applyData.budget ? Number(applyData.budget).toLocaleString() + ' 元' : '-' }}</el-descriptions-item> <el-descriptions-item label="采购金额">{{
applyData.budget ? Number(applyData.budget).toLocaleString() + ' 元' : '-'
}}</el-descriptions-item>
<el-descriptions-item label="招标代理">{{ applyData.agentName || '-' }}</el-descriptions-item> <el-descriptions-item label="招标代理">{{ applyData.agentName || '-' }}</el-descriptions-item>
<el-descriptions-item label="审批状态"> <el-descriptions-item label="审批状态">
<el-tag v-if="applyData.fileFlowStatus === '0'" type="primary">运行中</el-tag> <el-tag v-if="applyData.fileFlowStatus === '0'" type="primary">运行中</el-tag>

View File

@@ -19,11 +19,7 @@
<el-divider content-position="left">采购相关文件补充上传</el-divider> <el-divider content-position="left">采购相关文件补充上传</el-divider>
<el-alert <el-alert :type="fileTypeAlertType" :closable="false" style="margin-bottom: 16px">
:type="fileTypeAlertType"
:closable="false"
style="margin-bottom: 16px"
>
<template #title> <template #title>
<span v-if="requiredFileType">{{ requiredFileTypeName }}必传</span> <span v-if="requiredFileType">{{ requiredFileTypeName }}必传</span>
<span v-else>当前采购方式无需补充材料</span> <span v-else>当前采购方式无需补充材料</span>

View File

@@ -20,7 +20,9 @@
<el-descriptions :column="1" border size="small"> <el-descriptions :column="1" border size="small">
<el-descriptions-item label="采购编号">{{ applyData.purchaseNo || '-' }}</el-descriptions-item> <el-descriptions-item label="采购编号">{{ applyData.purchaseNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="项目名称">{{ applyData.projectName || '-' }}</el-descriptions-item> <el-descriptions-item label="项目名称">{{ applyData.projectName || '-' }}</el-descriptions-item>
<el-descriptions-item label="采购金额">{{ applyData.budget ? Number(applyData.budget).toLocaleString() + ' 元' : '-' }}</el-descriptions-item> <el-descriptions-item label="采购金额">{{
applyData.budget ? Number(applyData.budget).toLocaleString() + ' 元' : '-'
}}</el-descriptions-item>
<el-descriptions-item label="采购方式">{{ purchaseTypeLabel || '-' }}</el-descriptions-item> <el-descriptions-item label="采购方式">{{ purchaseTypeLabel || '-' }}</el-descriptions-item>
<el-descriptions-item label="补充状态"> <el-descriptions-item label="补充状态">
<el-tag v-if="applyData.supplementFlowStatus === '1'" type="success">已完成</el-tag> <el-tag v-if="applyData.supplementFlowStatus === '1'" type="success">已完成</el-tag>

View File

@@ -1586,37 +1586,16 @@ watch(
// 下载模版:统一走后端接口,按原始文件下载(避免前端静态资源被当成 HTML 返回) // 下载模版:统一走后端接口,按原始文件下载(避免前端静态资源被当成 HTML 返回)
const downloadTemplate = async (type: string) => { const downloadTemplate = async (type: string) => {
// 优先从后台模版列表获取模版名称 // 从后台模版列表获取模版名称templateName 包含原始文件扩展名)
const backendTemplate = templateList.value.find((t: any) => t.templateType === type); const backendTemplate = templateList.value.find((t: any) => t.templateType === type);
let displayName = '';
if (backendTemplate?.templateTitle) { if (!backendTemplate?.templateName) {
displayName = backendTemplate.templateTitle; useMessage().error('模版不存在或未维护模版文件,请联系管理员');
} else {
// 后备:使用本地硬编码的名称
const templateMap: Record<string, string> = {
business_negotiation: '商务洽谈表.doc',
market_purchase_minutes: '部门自行采购市场采购纪要.doc',
inquiry: '部门采购询价模版.doc',
direct_select: '服务商城项目需求模板(直选).doc',
public_select: '服务商城项目需求模板(公开比选).doc',
invite_select: '服务商城项目需求模板(邀请比选).doc',
purchase_requirement: '采购需求填报模板.doc',
import_application: '进口产品申请及专家论证意见表.doc',
single_source: '单一来源论专家证附件.docx',
feasibility_report: '项目可行性论证报告模板.doc',
gov_pur_int: '政府采购意向申请表.doc',
};
displayName = templateMap[type] || '';
}
if (!displayName) {
useMessage().error('模版不存在');
return; return;
} }
try { try {
await other.downBlobFile(`/purchase/purchasingtemplate/download?type=${encodeURIComponent(type)}`, {}, displayName); await other.downBlobFile(`/purchase/purchasingtemplate/download?type=${encodeURIComponent(type)}`, {}, backendTemplate.templateName);
useMessage().success('模版下载成功'); useMessage().success('模版下载成功');
} catch (err) { } catch (err) {
useMessage().error('模版下载失败,请联系管理员维护模版文件'); useMessage().error('模版下载失败,请联系管理员维护模版文件');

View File

@@ -232,13 +232,7 @@
<!-- 指定一人 --> <!-- 指定一人 -->
<el-form-item v-if="representorSelectMode === 'designate'" label="选择参与人"> <el-form-item v-if="representorSelectMode === 'designate'" label="选择参与人">
<el-select <el-select v-model="selectedRepresentor" placeholder="请选择参与人" filterable :disabled="isViewMode" style="width: 300px">
v-model="selectedRepresentor"
placeholder="请选择参与人"
filterable
:disabled="isViewMode"
style="width: 300px"
>
<el-option <el-option
v-for="member in deptMembers" v-for="member in deptMembers"
:key="member.teacherNo" :key="member.teacherNo"
@@ -278,9 +272,7 @@
<!-- 已选中的参与人 --> <!-- 已选中的参与人 -->
<el-form-item v-if="currentRepresentor" label="已选中参与人"> <el-form-item v-if="currentRepresentor" label="已选中参与人">
<el-tag type="success" size="large"> <el-tag type="success" size="large"> {{ currentRepresentor.realName }} ({{ currentRepresentor.teacherNo }}) </el-tag>
{{ currentRepresentor.realName }} ({{ currentRepresentor.teacherNo }})
</el-tag>
</el-form-item> </el-form-item>
<!-- 参与人身份 --> <!-- 参与人身份 -->
@@ -293,12 +285,7 @@
<!-- 保存按钮 --> <!-- 保存按钮 -->
<el-form-item> <el-form-item>
<el-button <el-button type="primary" :loading="saveRepresentorLoading" :disabled="!canSaveRepresentor || isViewMode" @click="handleSaveRepresentor">
type="primary"
:loading="saveRepresentorLoading"
:disabled="!canSaveRepresentor || isViewMode"
@click="handleSaveRepresentor"
>
保存参与人信息 保存参与人信息
</el-button> </el-button>
</el-form-item> </el-form-item>
@@ -492,7 +479,7 @@ const effectivePurchaseId = computed(() => {
if (props.currJob?.orderId) { if (props.currJob?.orderId) {
return String(props.currJob.orderId); return String(props.currJob.orderId);
} }
return route.query.id as string || route.query.purchaseId as string || ''; return (route.query.id as string) || (route.query.purchaseId as string) || '';
}); });
// 是否可以提交(非查看模式即可提交,不强制要求上传文件) // 是否可以提交(非查看模式即可提交,不强制要求上传文件)
@@ -724,7 +711,7 @@ const handleFlowSave = async () => {
fileName: uploadForm.fileName || '', fileName: uploadForm.fileName || '',
fileUrl: uploadForm.fileUrl || '', fileUrl: uploadForm.fileUrl || '',
comment: uploadForm.comment || '', comment: uploadForm.comment || '',
flowTarget: flowTarget.value || '' flowTarget: flowTarget.value || '',
}; };
const res = await tempStoreBidFile(params); const res = await tempStoreBidFile(params);
@@ -735,8 +722,6 @@ const handleFlowSave = async () => {
currElTabIsSave(props.currJob, props.currElTab.id, true, emit); currElTabIsSave(props.currJob, props.currElTab.id, true, emit);
} }
return true; return true;
} else { } else {
ElMessage.error(res.msg || '暂存失败'); ElMessage.error(res.msg || '暂存失败');
@@ -783,10 +768,7 @@ const handleRandomSelect = async () => {
try { try {
randomSelectLoading.value = true; randomSelectLoading.value = true;
const res = await randomSelectRepresentor( const res = await randomSelectRepresentor(effectivePurchaseId.value, randomCandidates.value.join(','));
effectivePurchaseId.value,
randomCandidates.value.join(',')
);
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
currentRepresentor.value = res.data; currentRepresentor.value = res.data;
ElMessage.success(`随机抽取成功:${res.data.realName}`); ElMessage.success(`随机抽取成功:${res.data.realName}`);
@@ -816,12 +798,7 @@ const handleSaveRepresentor = async () => {
let res: any; let res: any;
if (representorSelectMode.value === 'designate') { if (representorSelectMode.value === 'designate') {
res = await saveRepresentor( res = await saveRepresentor(Number(effectivePurchaseId.value), selectedRepresentor.value, undefined, representorType.value);
Number(effectivePurchaseId.value),
selectedRepresentor.value,
undefined,
representorType.value
);
} else { } else {
res = await saveRepresentor( res = await saveRepresentor(
Number(effectivePurchaseId.value), Number(effectivePurchaseId.value),

View File

@@ -287,15 +287,11 @@ const handleSendToAgent = async () => {
// 确认弹窗 // 确认弹窗
try { try {
await ElMessageBox.confirm( await ElMessageBox.confirm('是否确认发送至招标代理启动招标文件审核流程?', '确认发送', {
'是否确认发送至招标代理启动招标文件审核流程?',
'确认发送',
{
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning', type: 'warning',
} });
);
} catch { } catch {
// 用户取消 // 用户取消
return; return;

View File

@@ -283,10 +283,18 @@
<el-tag v-if="scope.row.fileFlowStatus === '0'" type="primary" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)" <el-tag v-if="scope.row.fileFlowStatus === '0'" type="primary" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)"
>运行中 >运行中
</el-tag> </el-tag>
<el-tag v-else-if="scope.row.fileFlowStatus === '1'" type="success" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)" <el-tag
v-else-if="scope.row.fileFlowStatus === '1'"
type="success"
class="status-tag-clickable"
@click="handleShowDocAudit(scope.row)"
>完成 >完成
</el-tag> </el-tag>
<el-tag v-else-if="scope.row.fileFlowStatus === '2'" type="danger" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)" <el-tag
v-else-if="scope.row.fileFlowStatus === '2'"
type="danger"
class="status-tag-clickable"
@click="handleShowDocAudit(scope.row)"
>作废 >作废
</el-tag> </el-tag>
<el-tag v-else-if="scope.row.fileFlowStatus === '3'" type="info" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)" <el-tag v-else-if="scope.row.fileFlowStatus === '3'" type="info" class="status-tag-clickable" @click="handleShowDocAudit(scope.row)"

View File

@@ -29,12 +29,7 @@
</span> </span>
</div> </div>
</template> </template>
<el-alert <el-alert v-if="requiredFileTypeName" type="info" :closable="false" style="margin-bottom: 16px">
v-if="requiredFileTypeName"
type="info"
:closable="false"
style="margin-bottom: 16px"
>
<template #title> <template #title>
<span>{{ requiredFileTypeName }}</span> <span>{{ requiredFileTypeName }}</span>
</template> </template>

View File

@@ -129,14 +129,29 @@
</template> </template>
<script setup lang="ts" name="ActivityInfoSubSignup"> <script setup lang="ts" name="ActivityInfoSubSignup">
import { reactive, ref, onMounted, computed } from 'vue' import { reactive, ref, onMounted, computed } from 'vue';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObj, getActivityInfoList, getActivityInfoSubList } from "/@/api/stuwork/activityinfosubsignup"; import { fetchList, delObj, getActivityInfoList, getActivityInfoSubList } from '/@/api/stuwork/activityinfosubsignup';
import { makeExportActivitySignUpDetailTask } from "/@/api/stuwork/file"; import { makeExportActivitySignUpDetailTask } from '/@/api/stuwork/file';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import TableColumnControl from '/@/components/TableColumnControl/index.vue' import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import { List, Trophy, Document, Files, CreditCard, Avatar, OfficeBuilding, Grid, UserFilled, Phone, Setting, Menu, Search, Document as DocIcon } from '@element-plus/icons-vue' import {
import { useTableColumnControl } from '/@/hooks/tableColumn' List,
Trophy,
Document,
Files,
CreditCard,
Avatar,
OfficeBuilding,
Grid,
UserFilled,
Phone,
Setting,
Menu,
Search,
Document as DocIcon,
} from '@element-plus/icons-vue';
import { useTableColumnControl } from '/@/hooks/tableColumn';
// 定义变量内容 // 定义变量内容
const searchFormRef = ref(); const searchFormRef = ref();
@@ -230,16 +245,16 @@ const handleDelete = async (row: any) => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
exportLoading.value = true exportLoading.value = true;
try { try {
await makeExportActivitySignUpDetailTask(state.queryForm) await makeExportActivitySignUpDetailTask(state.queryForm);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg || '导出失败') useMessage().error(err.msg || '导出失败');
} finally { } finally {
exportLoading.value = false exportLoading.value = false;
}
} }
};
// 获取活动主题列表 // 获取活动主题列表
const getActivityInfoListData = async () => { const getActivityInfoListData = async () => {

View File

@@ -269,19 +269,35 @@
</template> </template>
<script setup lang="ts" name="ClassFeeLog"> <script setup lang="ts" name="ClassFeeLog">
import { reactive, ref, onMounted, computed } from 'vue' import { reactive, ref, onMounted, computed } from 'vue';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObj, getSummary } from "/@/api/stuwork/classfeelog"; import { fetchList, delObj, getSummary } from '/@/api/stuwork/classfeelog';
import { makeExportClassFundTask } from "/@/api/stuwork/file"; import { makeExportClassFundTask } from '/@/api/stuwork/file';
import { getDeptList } from "/@/api/basic/basicclass"; import { getDeptList } from '/@/api/basic/basicclass';
import { queryAllSchoolYear } from "/@/api/basic/basicyear"; import { queryAllSchoolYear } from '/@/api/basic/basicyear';
import { getClassListByRole } from "/@/api/basic/basicclass"; import { getClassListByRole } from '/@/api/basic/basicclass';
import { getDicts } from "/@/api/admin/dict"; import { getDicts } from '/@/api/admin/dict';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import TableColumnControl from '/@/components/TableColumnControl/index.vue' import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import FormDialog from './form.vue' import FormDialog from './form.vue';
import { List, Calendar, Clock, OfficeBuilding, Grid, Collection, Money, User, Document, Setting, Menu, Search, FolderAdd, EditPen, DataAnalysis } from '@element-plus/icons-vue' import {
import { useTableColumnControl } from '/@/hooks/tableColumn' List,
Calendar,
Clock,
OfficeBuilding,
Grid,
Collection,
Money,
User,
Document,
Setting,
Menu,
Search,
FolderAdd,
EditPen,
DataAnalysis,
} from '@element-plus/icons-vue';
import { useTableColumnControl } from '/@/hooks/tableColumn';
// 定义变量内容 // 定义变量内容
const formDialogRef = ref(); const formDialogRef = ref();
@@ -387,12 +403,12 @@ const handleViewAttachment = (row: any) => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
try { try {
await makeExportClassFundTask(state.queryForm) await makeExportClassFundTask(state.queryForm);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg || '导出失败') useMessage().error(err.msg || '导出失败');
}
} }
};
// 编辑 // 编辑
const handleEdit = (row: any) => { const handleEdit = (row: any) => {

View File

@@ -224,19 +224,33 @@
</template> </template>
<script setup lang="ts" name="ClassSafeEdu"> <script setup lang="ts" name="ClassSafeEdu">
import { reactive, ref, onMounted } from 'vue' import { reactive, ref, onMounted } from 'vue';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObj, statisticsByYearTerm } from "/@/api/stuwork/classsafeedu"; import { fetchList, delObj, statisticsByYearTerm } from '/@/api/stuwork/classsafeedu';
import { makeExportSafetyEducationTask } from "/@/api/stuwork/file"; import { makeExportSafetyEducationTask } from '/@/api/stuwork/file';
import { getClassListByRole } from "/@/api/basic/basicclass"; import { getClassListByRole } from '/@/api/basic/basicclass';
import { queryAllSchoolYear } from "/@/api/basic/basicyear"; import { queryAllSchoolYear } from '/@/api/basic/basicyear';
import { getDicts } from "/@/api/admin/dict"; import { getDicts } from '/@/api/admin/dict';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import TableColumnControl from '/@/components/TableColumnControl/index.vue' import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import FormDialog from './form.vue' import FormDialog from './form.vue';
import DetailDialog from './detail.vue' import DetailDialog from './detail.vue';
import { List, Calendar, Clock, Grid, Trophy, User, Location, UserFilled, Setting, Menu, Search, Document, DataAnalysis } from '@element-plus/icons-vue' import {
import { useTableColumnControl } from '/@/hooks/tableColumn' List,
Calendar,
Clock,
Grid,
Trophy,
User,
Location,
UserFilled,
Setting,
Menu,
Search,
Document,
DataAnalysis,
} from '@element-plus/icons-vue';
import { useTableColumnControl } from '/@/hooks/tableColumn';
// 定义变量内容 // 定义变量内容
const formDialogRef = ref(); const formDialogRef = ref();
@@ -333,12 +347,12 @@ const handleViewImage = (url: string) => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
try { try {
await makeExportSafetyEducationTask(state.queryForm) await makeExportSafetyEducationTask(state.queryForm);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg || '导出失败') useMessage().error(err.msg || '导出失败');
}
} }
};
// 查看详情 // 查看详情
const handleView = (row: any) => { const handleView = (row: any) => {

View File

@@ -169,7 +169,14 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="月份" prop="month"> <el-form-item label="月份" prop="month">
<el-date-picker v-model="importForm.month" type="month" placeholder="选择月份" format="YYYY-MM" value-format="YYYY-MM" style="width: 100%" /> <el-date-picker
v-model="importForm.month"
type="month"
placeholder="选择月份"
format="YYYY-MM"
value-format="YYYY-MM"
style="width: 100%"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button icon="Download" type="success" @click="handleDownloadTemplate"> 下载模板 </el-button> <el-button icon="Download" type="success" @click="handleDownloadTemplate"> 下载模板 </el-button>

View File

@@ -183,16 +183,16 @@
</template> </template>
<script setup lang="ts" name="DormHygieneMonthly"> <script setup lang="ts" name="DormHygieneMonthly">
import { ref, reactive, defineAsyncComponent, computed, onMounted, nextTick } from 'vue' import { ref, reactive, defineAsyncComponent, computed, onMounted, nextTick } from 'vue';
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, putObj, delObjs } from "/@/api/stuwork/dormreform"; import { fetchList, putObj, delObjs } from '/@/api/stuwork/dormreform';
import { makeExportDormReformTask } from "/@/api/stuwork/file"; import { makeExportDormReformTask } from '/@/api/stuwork/file';
import { getBuildingList } from "/@/api/stuwork/dormbuilding"; import { getBuildingList } from '/@/api/stuwork/dormbuilding';
import { getDormRoomDataByBuildingNo } from "/@/api/stuwork/dormroom"; import { getDormRoomDataByBuildingNo } from '/@/api/stuwork/dormroom';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import { getDicts } from "/@/api/admin/dict"; import { getDicts } from '/@/api/admin/dict';
import TableColumnControl from '/@/components/TableColumnControl/index.vue' import TableColumnControl from '/@/components/TableColumnControl/index.vue';
// 引入组件 // 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue')); const FormDialog = defineAsyncComponent(() => import('./form.vue'));
@@ -347,12 +347,12 @@ const handleDelete = async (row: any) => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
try { try {
await makeExportDormReformTask(searchForm) await makeExportDormReformTask(searchForm);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg || '导出失败') useMessage().error(err.msg || '导出失败');
}
} }
};
// 格式化整改结果 // 格式化整改结果
const formatReformStatus = (value: string | number) => { const formatReformStatus = (value: string | number) => {

View File

@@ -163,16 +163,16 @@
</template> </template>
<script setup lang="ts" name="DormRoom"> <script setup lang="ts" name="DormRoom">
import { ref, reactive, defineAsyncComponent, onMounted, computed, nextTick } from 'vue' import { ref, reactive, defineAsyncComponent, onMounted, computed, nextTick } from 'vue';
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObj, editDept } from "/@/api/stuwork/dormroom"; import { fetchList, delObj, editDept } from '/@/api/stuwork/dormroom';
import { makeExportDormRoomTask } from "/@/api/stuwork/file"; import { makeExportDormRoomTask } from '/@/api/stuwork/file';
import { getDeptList } from "/@/api/basic/basicclass"; import { getDeptList } from '/@/api/basic/basicclass';
import { getBuildingList } from "/@/api/stuwork/dormbuilding"; import { getBuildingList } from '/@/api/stuwork/dormbuilding';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import { getDicts } from "/@/api/admin/dict"; import { getDicts } from '/@/api/admin/dict';
import TableColumnControl from '/@/components/TableColumnControl/index.vue' import TableColumnControl from '/@/components/TableColumnControl/index.vue';
// 引入组件 // 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue')); const FormDialog = defineAsyncComponent(() => import('./form.vue'));
@@ -321,12 +321,12 @@ const confirmDeptAssign = async () => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
try { try {
await makeExportDormRoomTask(searchForm) await makeExportDormRoomTask(searchForm);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg || '导出失败') useMessage().error(err.msg || '导出失败');
}
} }
};
// 获取学院列表 // 获取学院列表
const getDeptListData = async () => { const getDeptListData = async () => {

View File

@@ -3,13 +3,7 @@
<div class="layout-padding-auto layout-padding-view"> <div class="layout-padding-auto layout-padding-view">
<!-- 顶部工具栏 --> <!-- 顶部工具栏 -->
<div class="mb10"> <div class="mb10">
<el-button <el-button icon="Download" type="primary" plain @click="handleExport"> 导出 </el-button>
icon="Download"
type="primary"
plain
@click="handleExport">
导出
</el-button>
</div> </div>
<!-- 表格 --> <!-- 表格 -->
<el-table <el-table
@@ -17,7 +11,8 @@
v-loading="state.loading" v-loading="state.loading"
border border
:cell-style="tableStyle.cellStyle" :cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"> :header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column type="index" label="序号" width="60" align="center" /> <el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="deptName" label="学院" show-overflow-tooltip align="center" /> <el-table-column prop="deptName" label="学院" show-overflow-tooltip align="center" />
<el-table-column prop="classNo" label="班号" show-overflow-tooltip align="center" /> <el-table-column prop="classNo" label="班号" show-overflow-tooltip align="center" />
@@ -29,13 +24,7 @@
<el-table-column prop="teacherPhone" label="班主任电话" show-overflow-tooltip align="center" /> <el-table-column prop="teacherPhone" label="班主任电话" show-overflow-tooltip align="center" />
<el-table-column label="操作" width="150" align="center" fixed="right"> <el-table-column label="操作" width="150" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button <el-button icon="View" text type="primary" @click="handleView(scope.row)"> 查看 </el-button>
icon="View"
text
type="primary"
@click="handleView(scope.row)">
查看
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -44,11 +33,11 @@
</template> </template>
<script setup lang="ts" name="DormAbnormal"> <script setup lang="ts" name="DormAbnormal">
import { reactive, onMounted } from 'vue' import { reactive, onMounted } from 'vue';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { queryStudentAbnormal } from "/@/api/stuwork/dormroomstudent"; import { queryStudentAbnormal } from '/@/api/stuwork/dormroomstudent';
import { makeExportDormStudentAbnormalTask } from "/@/api/stuwork/file"; import { makeExportDormStudentAbnormalTask } from '/@/api/stuwork/file';
import { useMessage } from "/@/hooks/message"; import { useMessage } from '/@/hooks/message';
// 配置 useTable // 配置 useTable
const state: BasicTableProps = reactive<BasicTableProps>({ const state: BasicTableProps = reactive<BasicTableProps>({
@@ -94,12 +83,12 @@ const handleView = (row: any) => {
// 导出 // 导出
const handleExport = async () => { const handleExport = async () => {
try { try {
await makeExportDormStudentAbnormalTask() await makeExportDormStudentAbnormalTask();
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err?.msg || '导出失败') useMessage().error(err?.msg || '导出失败');
}
} }
};
// 初始化 // 初始化
onMounted(() => { onMounted(() => {

View File

@@ -191,20 +191,16 @@
</template> </template>
<script setup lang="ts" name="DormRoomStudent"> <script setup lang="ts" name="DormRoomStudent">
import { reactive, ref, onMounted, computed, nextTick } from 'vue' import { reactive, ref, onMounted, computed, nextTick } from 'vue';
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router';
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from "/@/api/stuwork/dormroomstudent"; import { fetchList, delObjs } from '/@/api/stuwork/dormroomstudent';
import { import { makeExportDormStudentTask, makeExportDormStudentAbnormalTask, makeExportDormStatisticsTask } from '/@/api/stuwork/file';
makeExportDormStudentTask, import { getDeptList } from '/@/api/basic/basicclass';
makeExportDormStudentAbnormalTask, import { getBuildingList } from '/@/api/stuwork/dormbuilding';
makeExportDormStatisticsTask import { fetchDormRoomTreeList } from '/@/api/stuwork/dormroom';
} from "/@/api/stuwork/file"; import { useMessage, useMessageBox } from '/@/hooks/message';
import { getDeptList } from "/@/api/basic/basicclass"; import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import { getBuildingList } from "/@/api/stuwork/dormbuilding";
import { fetchDormRoomTreeList } from "/@/api/stuwork/dormroom";
import { useMessage, useMessageBox } from "/@/hooks/message";
import TableColumnControl from '/@/components/TableColumnControl/index.vue'
import FormDialog from './form.vue'; import FormDialog from './form.vue';
import TransferDialog from './transfer.vue'; import TransferDialog from './transfer.vue';
import SwapDialog from './swap.vue'; import SwapDialog from './swap.vue';
@@ -379,14 +375,14 @@ const handleExport = async () => {
roomNo: searchForm.roomNo || searchForm.roomNoInput, roomNo: searchForm.roomNo || searchForm.roomNoInput,
classNo: searchForm.classNo, classNo: searchForm.classNo,
stuNo: searchForm.stuNo, stuNo: searchForm.stuNo,
realName: searchForm.realName realName: searchForm.realName,
} };
await makeExportDormStatisticsTask(params) await makeExportDormStatisticsTask(params);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err?.msg || '导出失败') useMessage().error(err?.msg || '导出失败');
}
} }
};
// 名单导出:住宿学生名单导出 // 名单导出:住宿学生名单导出
const handleExportList = async () => { const handleExportList = async () => {
@@ -399,14 +395,14 @@ const handleExportList = async () => {
roomNo: searchForm.roomNo || searchForm.roomNoInput, roomNo: searchForm.roomNo || searchForm.roomNoInput,
classNo: searchForm.classNo, classNo: searchForm.classNo,
stuNo: searchForm.stuNo, stuNo: searchForm.stuNo,
realName: searchForm.realName realName: searchForm.realName,
} };
await makeExportDormStudentTask(params) await makeExportDormStudentTask(params);
useMessage().success('导出任务已创建,请在文件管理中下载') useMessage().success('导出任务已创建,请在文件管理中下载');
} catch (err: any) { } catch (err: any) {
useMessage().error(err?.msg || '导出失败') useMessage().error(err?.msg || '导出失败');
}
} }
};
// 编辑(与转宿共用接口 edit修改房间/床位/是否舍长) // 编辑(与转宿共用接口 edit修改房间/床位/是否舍长)
const handleEdit = (row: any) => { const handleEdit = (row: any) => {

View File

@@ -170,20 +170,7 @@ import { queryAllSchoolYear } from '/@/api/basic/basicyear';
import { getDicts } from '/@/api/admin/dict'; import { getDicts } from '/@/api/admin/dict';
import { useMessage, useMessageBox } from '/@/hooks/message'; import { useMessage, useMessageBox } from '/@/hooks/message';
import TableColumnControl from '/@/components/TableColumnControl/index.vue'; import TableColumnControl from '/@/components/TableColumnControl/index.vue';
import { import { List, Calendar, Clock, OfficeBuilding, Grid, UserFilled, Trophy, EditPen, Setting, Menu, Search, Document } from '@element-plus/icons-vue';
List,
Calendar,
Clock,
OfficeBuilding,
Grid,
UserFilled,
Trophy,
EditPen,
Setting,
Menu,
Search,
Document,
} from '@element-plus/icons-vue';
import { useTableColumnControl } from '/@/hooks/tableColumn'; import { useTableColumnControl } from '/@/hooks/tableColumn';
import FormDialog from './form.vue'; import FormDialog from './form.vue';