Files
template-10561/src/views/project/projectNoRenew/index.vue
赵忠林 37f3b6327c feat: 初始化项目配置和文档- 添加 .editorconfig 文件,配置代码编辑规范
- 添加 .env 及相关文件,配置环境变量
- 添加 .eslintignore 和 .eslintrc.js 文件,配置 ESLint 规则
- 添加 .gitignore 文件,配置 Git忽略项
- 添加 .prettierignore 文件,配置 Prettier 忽略项
- 添加隐私政策文档,详细说明用户数据的收集和使用
2025-08-23 20:31:46 +08:00

290 lines
7.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<a-page-header :title="getPageTitle()" @back="() => $router.go(-1)">
<template #extra>
<Extra/>
</template>
<a-card :bordered="false" :body-style="{ padding: '16px' }">
<ele-pro-table
ref="tableRef"
row-key="appId"
:columns="columns"
:datasource="datasource"
tool-class="ele-toolbar-form"
class="sys-org-table"
>
<template #toolbar>
<search
@search="reload"
:selection="selection"
@add="openEdit"
@remove="removeBatch"
@batchMove="openMove"
/>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'appName'">
<span>{{ record.appName }}</span>
</template>
<template v-if="column.key === 'appIcon'">
<a-avatar :src="record.appIcon" :size="40"/>
</template>
<template v-if="column.key === 'renewCount'">
<span class="cursor-pointer"
@click="openUrl(`/project/renew-log/${record.appId}`)">{{ record.renewCount }}</span>
</template>
<template v-if="column.key === 'customerName'">
<a-tooltip :title="`客户ID(${record.customerId})`">
{{ record.customerName }}
</a-tooltip>
</template>
<template v-if="column.key === 'expirationTime'">
<!-- <div><span class="text-gray-300">下单时间</span>{{ toDateString(record.createTime, 'yyyy-MM-dd') }}</div>-->
<div @click="openExpirationTimeEdit(record)">{{ toDateString(record.expirationTime, 'yyyy-MM-dd') }}</div>
<template v-if="sceneType == 'totalPrice30'">
<span class="text-purple-500">剩余 {{ record.expiredDays }} </span>
</template>
<template v-else-if="record.soon < 0 || sceneType == 'Expired'">
<span class="text-red-500">已过期 {{ record.expiredDays }} </span>
</template>
<template v-else>
<span class="text-gray-400">剩余 {{ record.expiredDays }} </span>
</template>
</template>
<template v-if="column.key === 'status'">
<a-tag color="green" v-if="record.status === 1">已入账</a-tag>
<a-tag color="orange" v-if="record.status === 0">待审核</a-tag>
</template>
<template v-if="column.key === 'action'">
<a @click="openEdit(record)">创建订单</a>
</template>
</template>
</ele-pro-table>
</a-card>
<!-- 编辑弹窗 -->
<ProjectRenewEdit v-model:visible="showEdit" :data="current" @done="reload"/>
<ExpirationTimeEdit v-model:visible="showExpirationTimeEdit" :data="current" @done="reload"/>
</a-page-header>
</template>
<script lang="ts" setup>
import {createVNode, ref, watch, unref} from 'vue';
import {message, Modal} from 'ant-design-vue';
import {ExclamationCircleOutlined} from '@ant-design/icons-vue';
import type {EleProTable} from 'ele-admin-pro';
import {useRouter} from 'vue-router';
import {toDateString} from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import Search from './components/search.vue';
import ProjectRenewEdit from './components/projectRenewEdit.vue';
import ExpirationTimeEdit from './components/expirationTimeEdit.vue';
import {pageProject, removeProject, removeBatchProject} from '@/api/project/project';
import type {Project, ProjectParam} from '@/api/project/project/model';
import {getPageTitle, openUrl, push} from "@/utils/common";
import Extra from "@/views/project/project/components/extra.vue";
import {hasRole} from "@/utils/permission";
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
const {currentRoute} = useRouter();
// 表格选中数据
const selection = ref<Project[]>([]);
// 当前编辑数据
const current = ref<Project | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 是否显示续费时间修复弹窗
const showExpirationTimeEdit = ref(false);
// 是否显示批量移动弹窗
const showMove = ref(false);
// 加载状态
const loading = ref(true);
// 场景类型
const sceneType = ref();
const isExpiration = ref(false)
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
if (filters) {
where.status = filters.status;
}
where.showExpiration = false;
return pageProject({
...where,
...orders,
page,
limit
});
};
// 表格列配置
const columns = ref<ColumnItem[]>([
// {
// title: '项目ID',
// dataIndex: 'appId',
// key: 'appId'
// },
{
title: '项目名称',
dataIndex: 'appName',
key: 'appName'
},
{
title: '客户名称',
dataIndex: 'companyName',
key: 'companyName',
align: 'center',
},
{
title: '项目负责人',
dataIndex: 'nickname',
key: 'nickname',
align: 'center',
},
{
title: '备注',
dataIndex: 'comments',
key: 'comments',
align: 'center',
ellipsis: true,
},
// {
// title: '创建时间',
// dataIndex: 'createTime',
// key: 'createTime',
// sorter: true,
// align: 'center',
// customRender: ({text}) => toDateString(text, 'yyyy-MM-dd HH:mm')
// },
{
title: '操作',
key: 'action',
width: 180,
fixed: 'right',
align: 'center'
}
]);
/* 搜索 */
const reload = (where?: ProjectParam) => {
sceneType.value = where?.sceneType;
selection.value = [];
tableRef?.value?.reload({where: where});
};
/* 打开编辑弹窗 */
const openEdit = (row?: Project) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开续费修复弹窗 */
const openExpirationTimeEdit = (row: Project) => {
// 非财务人员不能修改
if (!hasRole('superAdmin')) {
return false;
}
current.value = row;
showExpirationTimeEdit.value = true;
};
/* 打开批量移动弹窗 */
const openMove = () => {
showMove.value = true;
};
/* 删除单个 */
const remove = (row: Project) => {
const hide = message.loading('请求中..', 0);
removeProject(row.appId)
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
};
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchProject(selection.value.map((d) => d.appId))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
/* 查询 */
const query = () => {
loading.value = true;
};
/* 自定义行属性 */
const customRow = (record: Project) => {
return {
// 行点击事件
onClick: () => {
// console.log(record);
},
// 行双击事件
onDblclick: () => {
openEdit(record);
}
};
};
query();
watch(
currentRoute,
(route) => {
const {query} = unref(route);
const {expiration} = query;
if (expiration) {
isExpiration.value = true
}
reload();
},
{immediate: true}
);
</script>
<script lang="ts">
export default {
name: 'ProjectByRenew'
};
</script>
<style lang="less" scoped></style>