|
@@ -1,34 +1,38 @@
|
|
<template>
|
|
<template>
|
|
<div>
|
|
<div>
|
|
- <div class="score m-4 p-4 bg-white">
|
|
|
|
- <div class="scoreTitle text-base">硬件产品评分</div>
|
|
|
|
- <div class=""></div>
|
|
|
|
|
|
+ <div class="score m-4 bg-white">
|
|
|
|
+ <a-collapse v-model:activeKey="activeKey" ghost :bordered="false">
|
|
|
|
+ <a-collapse-panel key="1" header="硬件产品评分" ghost :bordered="false">
|
|
|
|
+ <GrowCard :loading="loading" class="enter-y" :list="score.hardware" />
|
|
|
|
+ </a-collapse-panel>
|
|
|
|
+ <a-collapse-panel key="2" header="软件产品评分">
|
|
|
|
+ <GrowCard :loading="loading" class="enter-y" :list="score.hardware" />
|
|
|
|
+ </a-collapse-panel>
|
|
|
|
+ </a-collapse>
|
|
|
|
+ <!-- <div class="scoreTitle text-base">硬件产品评分</div>
|
|
|
|
+ <div class="scoreList">
|
|
|
|
+ <GrowCard :loading="loading" class="enter-y" :list="score.hardware" />
|
|
|
|
+ </div>
|
|
|
|
+ <div class="scoreTitle text-base">软件产品评分</div>
|
|
|
|
+ <div class="scoreList">
|
|
|
|
+ <GrowCard :loading="loading" class="enter-y" :list="score.hardware" />
|
|
|
|
+ </div> -->
|
|
</div>
|
|
</div>
|
|
<BasicTable @register="registerTable" @editEnd="editEnd">
|
|
<BasicTable @register="registerTable" @editEnd="editEnd">
|
|
<template #toolbar>
|
|
<template #toolbar>
|
|
- <a-button type="primary" v-if="getCheckPerm('recruit-add')" @click="openModal(true)">
|
|
|
|
- 新增职位</a-button
|
|
|
|
- >
|
|
|
|
|
|
+ <a-button type="primary" v-if="getCheckPerm('recruit-add')" @click="router.push('/operate/configuration')"> 选项配置 </a-button>
|
|
|
|
+ <a-button type="primary" v-if="getCheckPerm('recruit-add')" @click="downTemplate({})"> 导出 </a-button>
|
|
</template>
|
|
</template>
|
|
<template #action="{ record }">
|
|
<template #action="{ record }">
|
|
<TableAction
|
|
<TableAction
|
|
stopButtonPropagation
|
|
stopButtonPropagation
|
|
:actions="[
|
|
:actions="[
|
|
{
|
|
{
|
|
- label: '编辑',
|
|
|
|
|
|
+ label: record.status == 0 ? '处理' : '查看',
|
|
//icon: 'ep:edit',
|
|
//icon: 'ep:edit',
|
|
- ifShow: getCheckPerm('recruit-edit') && record.isPush == 0,
|
|
|
|
|
|
+ //ifShow: record.state == 0,
|
|
onClick: handleEdit.bind(null, record),
|
|
onClick: handleEdit.bind(null, record),
|
|
},
|
|
},
|
|
- {
|
|
|
|
- label: '删除',
|
|
|
|
- ifShow: getCheckPerm('recruit-delete'),
|
|
|
|
- //icon: 'ic:outline-delete-outline',
|
|
|
|
- popConfirm: {
|
|
|
|
- title: '是否确认删除',
|
|
|
|
- confirm: handleDelete.bind(null, record),
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
]"
|
|
]"
|
|
/>
|
|
/>
|
|
</template>
|
|
</template>
|
|
@@ -37,24 +41,29 @@
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<script lang="ts">
|
|
<script lang="ts">
|
|
- import { defineComponent, h } from 'vue';
|
|
|
|
|
|
+ import { defineComponent, h, ref, onMounted, reactive } from 'vue';
|
|
import { BasicTable, useTable, TableAction, BasicColumn, FormProps } from '/@/components/Table';
|
|
import { BasicTable, useTable, TableAction, BasicColumn, FormProps } from '/@/components/Table';
|
|
import { Time } from '/@/components/Time';
|
|
import { Time } from '/@/components/Time';
|
|
import {
|
|
import {
|
|
- employNoteList,
|
|
|
|
- addOrUpdate,
|
|
|
|
|
|
+ getAllByTypeId,
|
|
|
|
+ getScoreAug,
|
|
|
|
+ getfeedbackList,
|
|
employNoteIsTop,
|
|
employNoteIsTop,
|
|
NewPublicNews,
|
|
NewPublicNews,
|
|
employNoteIsPush,
|
|
employNoteIsPush,
|
|
employNoteDelete,
|
|
employNoteDelete,
|
|
|
|
+ downTemplate,
|
|
} from '/@/api/operate';
|
|
} from '/@/api/operate';
|
|
import { useModal } from '/@/components/Modal';
|
|
import { useModal } from '/@/components/Modal';
|
|
|
|
+ import GrowCard from './components/GrowCard.vue';
|
|
import { Descriptions } from 'ant-design-vue';
|
|
import { Descriptions } from 'ant-design-vue';
|
|
import { useI18n } from '/@/hooks/web/useI18n';
|
|
import { useI18n } from '/@/hooks/web/useI18n';
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
import { Switch } from 'ant-design-vue';
|
|
import { Switch } from 'ant-design-vue';
|
|
- import addRecruitModal from './components/recruit/addModal.vue';
|
|
|
|
|
|
+ import addRecruitModal from './components/config/messgeModal.vue';
|
|
|
|
+ import { useRouter } from 'vue-router';
|
|
import { usePermissionStore } from '/@/store/modules/permission';
|
|
import { usePermissionStore } from '/@/store/modules/permission';
|
|
|
|
+ import { Collapse } from 'ant-design-vue';
|
|
export default defineComponent({
|
|
export default defineComponent({
|
|
components: {
|
|
components: {
|
|
BasicTable,
|
|
BasicTable,
|
|
@@ -62,6 +71,10 @@
|
|
addRecruitModal,
|
|
addRecruitModal,
|
|
[Descriptions.name]: Descriptions,
|
|
[Descriptions.name]: Descriptions,
|
|
[Descriptions.Item.name]: Descriptions.Item,
|
|
[Descriptions.Item.name]: Descriptions.Item,
|
|
|
|
+ GrowCard,
|
|
|
|
+ [Collapse.name]: Collapse,
|
|
|
|
+ [Collapse.Panel.name]: Collapse.Panel,
|
|
|
|
+
|
|
},
|
|
},
|
|
setup() {
|
|
setup() {
|
|
const { t } = useI18n();
|
|
const { t } = useI18n();
|
|
@@ -69,42 +82,82 @@
|
|
const permissionStore = usePermissionStore();
|
|
const permissionStore = usePermissionStore();
|
|
const { getCheckPerm } = permissionStore;
|
|
const { getCheckPerm } = permissionStore;
|
|
const [register, { openModal }] = useModal();
|
|
const [register, { openModal }] = useModal();
|
|
|
|
+ const router = useRouter()
|
|
|
|
+ const loading = ref(true);
|
|
|
|
+ const score = ref({
|
|
|
|
+ hardware: [],
|
|
|
|
+ software: [],
|
|
|
|
+ });
|
|
|
|
+ const activeKey = ref([]);
|
|
|
|
+ const fileFlow = reactive({
|
|
|
|
+ file: null,
|
|
|
|
+ });
|
|
const columns: BasicColumn[] = [
|
|
const columns: BasicColumn[] = [
|
|
{
|
|
{
|
|
- title: '职位名称',
|
|
|
|
- dataIndex: 'workName',
|
|
|
|
|
|
+ title: '问题描述',
|
|
|
|
+ dataIndex: 'problemDesc',
|
|
ellipsis: true,
|
|
ellipsis: true,
|
|
|
|
+ align: 'left',
|
|
width: 250,
|
|
width: 250,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '工作地点',
|
|
|
|
- dataIndex: 'workAddress',
|
|
|
|
|
|
+ title: '硬件产品',
|
|
|
|
+ dataIndex: 'hardwareOption',
|
|
ellipsis: true,
|
|
ellipsis: true,
|
|
width: 150,
|
|
width: 150,
|
|
|
|
+ customRender: ({ record }) => {
|
|
|
|
+ return record.hardwareOption?.nameCn;
|
|
|
|
+ },
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '薪资待遇',
|
|
|
|
- dataIndex: 'salary',
|
|
|
|
|
|
+ title: '软件产品',
|
|
|
|
+ dataIndex: 'softwareOption',
|
|
ellipsis: false,
|
|
ellipsis: false,
|
|
- width: 80,
|
|
|
|
|
|
+ width: 200,
|
|
|
|
+ customRender: ({ record }) => {
|
|
|
|
+ return record.softwareOption?.nameCn;
|
|
|
|
+ },
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '招聘人数',
|
|
|
|
- dataIndex: 'employNum',
|
|
|
|
|
|
+ title: '所在行业',
|
|
|
|
+ dataIndex: 'industryOption',
|
|
width: 150,
|
|
width: 150,
|
|
- edit: true,
|
|
|
|
- editRule: async (text) => {
|
|
|
|
- if (text < 1) {
|
|
|
|
- return '招聘人数应大于0';
|
|
|
|
- } else if (text > 999) {
|
|
|
|
- return '招聘人数应小于999';
|
|
|
|
- }
|
|
|
|
- return '';
|
|
|
|
|
|
+ customRender: ({ record }) => {
|
|
|
|
+ return record.industryOption?.nameCn;
|
|
},
|
|
},
|
|
- editComponent: 'InputNumber',
|
|
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '创建时间',
|
|
|
|
|
|
+ title: '期望解决方案',
|
|
|
|
+ dataIndex: 'solution',
|
|
|
|
+ width: 150,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '姓名',
|
|
|
|
+ dataIndex: 'nickName',
|
|
|
|
+ width: 80,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '联系方式',
|
|
|
|
+ dataIndex: 'phone',
|
|
|
|
+ width: 120,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '国家和地区',
|
|
|
|
+ dataIndex: 'address',
|
|
|
|
+ width: 120,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '评分',
|
|
|
|
+ dataIndex: 'score',
|
|
|
|
+ width: 50,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '评分理由',
|
|
|
|
+ dataIndex: 'scoreReason',
|
|
|
|
+ width: 150,
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ title: '反馈时间',
|
|
dataIndex: 'createTime',
|
|
dataIndex: 'createTime',
|
|
width: 150,
|
|
width: 150,
|
|
customRender: ({ record }) => {
|
|
customRender: ({ record }) => {
|
|
@@ -118,91 +171,107 @@
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '状态',
|
|
|
|
- dataIndex: 'isPush',
|
|
|
|
|
|
+ title: '处理状态',
|
|
|
|
+ dataIndex: 'status',
|
|
width: 80,
|
|
width: 80,
|
|
- ifShow: getCheckPerm('recruit-publish'),
|
|
|
|
customRender: ({ record }) => {
|
|
customRender: ({ record }) => {
|
|
- if (!Reflect.has(record, 'pendingStatus')) {
|
|
|
|
- record.pendingStatus = false;
|
|
|
|
- }
|
|
|
|
- return h(Switch, {
|
|
|
|
- checked: record.isPush === 1,
|
|
|
|
- checkedChildren: '已发布',
|
|
|
|
- unCheckedChildren: '未发布',
|
|
|
|
- loading: false,
|
|
|
|
- onChange: async (checked: boolean) => {
|
|
|
|
- record.pendingStatus = true;
|
|
|
|
- const id: string = record.id || '';
|
|
|
|
- const newStatus = checked ? 1 : 0;
|
|
|
|
- Reflect.set(record, 'isPush', newStatus);
|
|
|
|
- await employNoteIsPush({ id: id, isPush: newStatus });
|
|
|
|
- createMessage.success(t('common.optSuccess'));
|
|
|
|
- // reload()
|
|
|
|
- },
|
|
|
|
- });
|
|
|
|
|
|
+ return record.status == 0 ? '未处理' : '已处理';
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '置顶',
|
|
|
|
- dataIndex: 'isTop',
|
|
|
|
- ifShow: getCheckPerm('recruit-top'),
|
|
|
|
- width: 80,
|
|
|
|
|
|
+ title: '处理结果',
|
|
|
|
+ dataIndex: 'result',
|
|
|
|
+ width: 120,
|
|
customRender: ({ record }) => {
|
|
customRender: ({ record }) => {
|
|
- if (!Reflect.has(record, 'pendingStatus')) {
|
|
|
|
- record.pendingStatus = false;
|
|
|
|
- }
|
|
|
|
- return h(Switch, {
|
|
|
|
- checked: record.isTop === 1,
|
|
|
|
- checkedChildren: '是',
|
|
|
|
- unCheckedChildren: '否',
|
|
|
|
- loading: false,
|
|
|
|
- onChange: async (checked: boolean) => {
|
|
|
|
- record.pendingStatus = true;
|
|
|
|
- const id: string = record.id || '';
|
|
|
|
- const newStatus = checked ? 1 : 0;
|
|
|
|
- // Reflect.set(record, 'isOnSale', newStatus);
|
|
|
|
- await employNoteIsTop({ id, isTop: newStatus });
|
|
|
|
- createMessage.success(t('common.optSuccess'));
|
|
|
|
- reload();
|
|
|
|
- },
|
|
|
|
- });
|
|
|
|
|
|
+ return record.result || '-';
|
|
},
|
|
},
|
|
},
|
|
},
|
|
];
|
|
];
|
|
const searchForm: Partial<FormProps> = {
|
|
const searchForm: Partial<FormProps> = {
|
|
labelWidth: 100,
|
|
labelWidth: 100,
|
|
autoSubmitOnEnter: true,
|
|
autoSubmitOnEnter: true,
|
|
|
|
+ autoAdvancedLine: 1,
|
|
schemas: [
|
|
schemas: [
|
|
- // {
|
|
|
|
- // field: 'sceneName',
|
|
|
|
- // label: t('routes.operate.releaseTime'),
|
|
|
|
- // component: 'RangePicker',
|
|
|
|
- // componentProps: {
|
|
|
|
- // maxLength: 100,
|
|
|
|
- // format: 'YYYY-MM-DD',
|
|
|
|
- // valueFormat:'YYYY-MM-DD',
|
|
|
|
- // showTime: true,
|
|
|
|
- // },
|
|
|
|
- // colProps: {
|
|
|
|
- // xl: 11,
|
|
|
|
- // xxl: 11,
|
|
|
|
- // },
|
|
|
|
- // },
|
|
|
|
{
|
|
{
|
|
- field: 'workName',
|
|
|
|
- label: '职位名称',
|
|
|
|
- component: 'Input',
|
|
|
|
|
|
+ field: 'hardwareOptionId',
|
|
|
|
+ component: 'ApiSelect',
|
|
|
|
+ label: '硬件产品',
|
|
|
|
+ itemProps: {
|
|
|
|
+ validateTrigger: 'blur',
|
|
|
|
+ },
|
|
|
|
+ componentProps: {
|
|
|
|
+ api: getAllByTypeId,
|
|
|
|
+ numberToString: true,
|
|
|
|
+ labelField: 'nameCn',
|
|
|
|
+ valueField: 'id',
|
|
|
|
+ immediate: true,
|
|
|
|
+ params: 2,
|
|
|
|
+ },
|
|
colProps: {
|
|
colProps: {
|
|
xl: 6,
|
|
xl: 6,
|
|
- xxl: 6,
|
|
|
|
|
|
+ xxl: 8,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ field: 'softwareOptionId',
|
|
|
|
+ component: 'ApiSelect',
|
|
|
|
+ label: '软件产品',
|
|
|
|
+ itemProps: {
|
|
|
|
+ validateTrigger: 'blur',
|
|
|
|
+ },
|
|
|
|
+ componentProps: {
|
|
|
|
+ api: getAllByTypeId,
|
|
|
|
+ numberToString: true,
|
|
|
|
+ labelField: 'nameCn',
|
|
|
|
+ valueField: 'id',
|
|
|
|
+ immediate: true,
|
|
|
|
+ params: 3,
|
|
|
|
+ },
|
|
|
|
+ colProps: {
|
|
|
|
+ xl: 6,
|
|
|
|
+ xxl: 8,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ field: 'industryOptionId',
|
|
|
|
+ component: 'ApiSelect',
|
|
|
|
+ label: '所在行业',
|
|
|
|
+ itemProps: {
|
|
|
|
+ validateTrigger: 'blur',
|
|
|
|
+ },
|
|
|
|
+ componentProps: {
|
|
|
|
+ api: getAllByTypeId,
|
|
|
|
+ numberToString: true,
|
|
|
|
+ labelField: 'nameCn',
|
|
|
|
+ valueField: 'id',
|
|
|
|
+ immediate: true,
|
|
|
|
+ params: 1,
|
|
|
|
+ },
|
|
|
|
+ colProps: {
|
|
|
|
+ xl: 6,
|
|
|
|
+ xxl: 8,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ field: 'status',
|
|
|
|
+ label: '处理状态',
|
|
|
|
+ component: 'Select',
|
|
|
|
+ componentProps: {
|
|
|
|
+ options: [
|
|
|
|
+ { label: '未处理', value: '0' },
|
|
|
|
+ { label: '已处理', value: '1' },
|
|
|
|
+ ],
|
|
|
|
+ },
|
|
|
|
+ colProps: {
|
|
|
|
+ xl: 8,
|
|
|
|
+ xxl: 8,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
],
|
|
],
|
|
};
|
|
};
|
|
const [registerTable, { reload }] = useTable({
|
|
const [registerTable, { reload }] = useTable({
|
|
- api: employNoteList,
|
|
|
|
- title: '职位列表',
|
|
|
|
|
|
+ api: getfeedbackList,
|
|
|
|
+ title: '用户反馈列表',
|
|
columns: columns,
|
|
columns: columns,
|
|
useSearchForm: true,
|
|
useSearchForm: true,
|
|
formConfig: searchForm,
|
|
formConfig: searchForm,
|
|
@@ -223,6 +292,12 @@
|
|
},
|
|
},
|
|
canResize: true,
|
|
canResize: true,
|
|
});
|
|
});
|
|
|
|
+ onMounted(() => {
|
|
|
|
+ getScoreAug().then(res => {
|
|
|
|
+ score.value = res
|
|
|
|
+ loading.value = false
|
|
|
|
+ })
|
|
|
|
+ });
|
|
async function handleDelete(record: Recordable) {
|
|
async function handleDelete(record: Recordable) {
|
|
await employNoteDelete({ id: record.id });
|
|
await employNoteDelete({ id: record.id });
|
|
createMessage.success(t('common.optSuccess'));
|
|
createMessage.success(t('common.optSuccess'));
|
|
@@ -235,7 +310,6 @@
|
|
reload();
|
|
reload();
|
|
}
|
|
}
|
|
function handleEdit(record: Recordable) {
|
|
function handleEdit(record: Recordable) {
|
|
- console.log('点击了编辑', record);
|
|
|
|
openModal(true, record);
|
|
openModal(true, record);
|
|
}
|
|
}
|
|
async function handleWithdraw(record: Recordable) {
|
|
async function handleWithdraw(record: Recordable) {
|
|
@@ -263,14 +337,37 @@
|
|
openModal,
|
|
openModal,
|
|
editEnd,
|
|
editEnd,
|
|
getCheckPerm,
|
|
getCheckPerm,
|
|
|
|
+ score,
|
|
|
|
+ activeKey,
|
|
|
|
+ loading,
|
|
|
|
+ router,
|
|
|
|
+ downTemplate,
|
|
};
|
|
};
|
|
},
|
|
},
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
<style lang="less" scoped>
|
|
<style lang="less" scoped>
|
|
.score {
|
|
.score {
|
|
- mar
|
|
|
|
.scoreTitle {
|
|
.scoreTitle {
|
|
|
|
+ margin: 10px 0;
|
|
|
|
+ }
|
|
|
|
+ .scoreList{
|
|
|
|
+ // display: flex;
|
|
|
|
+ width: 100%;
|
|
|
|
+ overflow: auto;
|
|
|
|
+ .scoreitem {
|
|
|
|
+ // 保障flex下元素宽度不变
|
|
|
|
+ flex-grow: 0;
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
+ padding: 10px 20px 0 20px;
|
|
|
|
+ margin-right: 20px;
|
|
|
|
+ width: calc(100% / 6 - 20px);
|
|
|
|
+ border: 1px solid #444
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ ::v-deep .ant-collapse-item{
|
|
|
|
+ background: #fff;
|
|
|
|
+ border: none;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
</style>
|