updates
This commit is contained in:
parent
2e47337789
commit
cc9271c344
|
|
@ -23,6 +23,10 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
|
|||
"social-callback": () => import("@/views/_builtin/social-callback/index.vue"),
|
||||
"user-center": () => import("@/views/_builtin/user-center/index.vue"),
|
||||
about: () => import("@/views/about/index.vue"),
|
||||
"art_history-score-control-line": () => import("@/views/art/history-score-control-line/index.vue"),
|
||||
art_major: () => import("@/views/art/major/index.vue"),
|
||||
"art_school-recruit-major-history": () => import("@/views/art/school-recruit-major-history/index.vue"),
|
||||
"art_school-recruit-major": () => import("@/views/art/school-recruit-major/index.vue"),
|
||||
art_school: () => import("@/views/art/school/index.vue"),
|
||||
"art_school_modules_school-campus": () => import("@/views/art/school/modules/school-campus/index.vue"),
|
||||
"art_school_modules_school-college": () => import("@/views/art/school/modules/school-college/index.vue"),
|
||||
|
|
|
|||
|
|
@ -59,6 +59,24 @@ export const generatedRoutes: GeneratedRoute[] = [
|
|||
i18nKey: 'route.art'
|
||||
},
|
||||
children: [
|
||||
{
|
||||
name: 'art_history-score-control-line',
|
||||
path: '/art/history-score-control-line',
|
||||
component: 'view.art_history-score-control-line',
|
||||
meta: {
|
||||
title: 'art_history-score-control-line',
|
||||
i18nKey: 'route.art_history-score-control-line'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'art_major',
|
||||
path: '/art/major',
|
||||
component: 'view.art_major',
|
||||
meta: {
|
||||
title: 'art_major',
|
||||
i18nKey: 'route.art_major'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'art_school',
|
||||
path: '/art/school',
|
||||
|
|
@ -169,6 +187,24 @@ export const generatedRoutes: GeneratedRoute[] = [
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'art_school-recruit-major',
|
||||
path: '/art/school-recruit-major',
|
||||
component: 'view.art_school-recruit-major',
|
||||
meta: {
|
||||
title: 'art_school-recruit-major',
|
||||
i18nKey: 'route.art_school-recruit-major'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'art_school-recruit-major-history',
|
||||
path: '/art/school-recruit-major-history',
|
||||
component: 'view.art_school-recruit-major-history',
|
||||
meta: {
|
||||
title: 'art_school-recruit-major-history',
|
||||
i18nKey: 'route.art_school-recruit-major-history'
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -172,6 +172,8 @@ const routeMap: RouteMap = {
|
|||
"500": "/500",
|
||||
"about": "/about",
|
||||
"art": "/art",
|
||||
"art_history-score-control-line": "/art/history-score-control-line",
|
||||
"art_major": "/art/major",
|
||||
"art_school": "/art/school",
|
||||
"art_school_modules": "/art/school/modules",
|
||||
"art_school_modules_school-campus": "/art/school/modules/school-campus",
|
||||
|
|
@ -184,6 +186,8 @@ const routeMap: RouteMap = {
|
|||
"art_school_modules_school-media": "/art/school/modules/school-media",
|
||||
"art_school_modules_school-name": "/art/school/modules/school-name",
|
||||
"art_school_modules_school-tag": "/art/school/modules/school-tag",
|
||||
"art_school-recruit-major": "/art/school-recruit-major",
|
||||
"art_school-recruit-major-history": "/art/school-recruit-major-history",
|
||||
"demo": "/demo",
|
||||
"demo_demo": "/demo/demo",
|
||||
"demo_tree": "/demo/tree",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
import { request } from '@/service/request';
|
||||
|
||||
/** 获取历年省控线列表 */
|
||||
export function fetchGetHistoryScoreControlLineList (params?: Api.Art.HistoryScoreControlLineSearchParams) {
|
||||
return request<Api.Art.HistoryScoreControlLineList>({
|
||||
url: '/art/historyScoreControlLine/list',
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
}
|
||||
/** 新增历年省控线 */
|
||||
export function fetchCreateHistoryScoreControlLine (data: Api.Art.HistoryScoreControlLineOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/historyScoreControlLine',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 修改历年省控线 */
|
||||
export function fetchUpdateHistoryScoreControlLine (data: Api.Art.HistoryScoreControlLineOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/historyScoreControlLine',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 批量删除历年省控线 */
|
||||
export function fetchBatchDeleteHistoryScoreControlLine (controlIds: CommonType.IdType[]) {
|
||||
return request<boolean>({
|
||||
url: `/art/historyScoreControlLine/${controlIds.join(',')}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import { request } from '@/service/request';
|
||||
|
||||
/** 获取艺术专业库列表 */
|
||||
export function fetchGetMajorList (params?: Api.Art.MajorSearchParams) {
|
||||
return request<Api.Art.MajorList>({
|
||||
url: '/art/major/list',
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
}
|
||||
/** 新增艺术专业库 */
|
||||
export function fetchCreateMajor (data: Api.Art.MajorOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/major',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 修改艺术专业库 */
|
||||
export function fetchUpdateMajor (data: Api.Art.MajorOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/major',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 批量删除艺术专业库 */
|
||||
export function fetchBatchDeleteMajor (majorIds: CommonType.IdType[]) {
|
||||
return request<boolean>({
|
||||
url: `/art/major/${majorIds.join(',')}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import { request } from '@/service/request';
|
||||
|
||||
/** 获取院校招录专业历年录取数据列表 */
|
||||
export function fetchGetSchoolRecruitMajorHistoryList (params?: Api.Art.SchoolRecruitMajorHistorySearchParams) {
|
||||
return request<Api.Art.SchoolRecruitMajorHistoryList>({
|
||||
url: '/art/schoolRecruitMajorHistory/list',
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
}
|
||||
/** 新增院校招录专业历年录取数据 */
|
||||
export function fetchCreateSchoolRecruitMajorHistory (data: Api.Art.SchoolRecruitMajorHistoryOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/schoolRecruitMajorHistory',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 修改院校招录专业历年录取数据 */
|
||||
export function fetchUpdateSchoolRecruitMajorHistory (data: Api.Art.SchoolRecruitMajorHistoryOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/schoolRecruitMajorHistory',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 批量删除院校招录专业历年录取数据 */
|
||||
export function fetchBatchDeleteSchoolRecruitMajorHistory (historyIds: CommonType.IdType[]) {
|
||||
return request<boolean>({
|
||||
url: `/art/schoolRecruitMajorHistory/${historyIds.join(',')}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
import { request } from '@/service/request';
|
||||
|
||||
/** 获取院校招录专业列表 */
|
||||
export function fetchGetSchoolRecruitMajorList (params?: Api.Art.SchoolRecruitMajorSearchParams) {
|
||||
return request<Api.Art.SchoolRecruitMajorList>({
|
||||
url: '/art/schoolRecruitMajor/list',
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
}
|
||||
/** 新增院校招录专业 */
|
||||
export function fetchCreateSchoolRecruitMajor (data: Api.Art.SchoolRecruitMajorOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/schoolRecruitMajor',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 修改院校招录专业 */
|
||||
export function fetchUpdateSchoolRecruitMajor (data: Api.Art.SchoolRecruitMajorOperateParams) {
|
||||
return request<boolean>({
|
||||
url: '/art/schoolRecruitMajor',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
/** 批量删除院校招录专业 */
|
||||
export function fetchBatchDeleteSchoolRecruitMajor (recruitMajorIds: CommonType.IdType[]) {
|
||||
return request<boolean>({
|
||||
url: `/art/schoolRecruitMajor/${recruitMajorIds.join(',')}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* Namespace Api
|
||||
*
|
||||
* All backend api type
|
||||
*/
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace Art
|
||||
*
|
||||
* backend api module: "Art"
|
||||
*/
|
||||
namespace Art {
|
||||
/** history score control line */
|
||||
type HistoryScoreControlLine = Common.CommonRecord<{
|
||||
/** 省控线主键 */
|
||||
controlId: CommonType.IdType;
|
||||
/** 租户编号 */
|
||||
tenantId: CommonType.IdType;
|
||||
/** 删除标志(0存在 1删除) */
|
||||
delFlag: string;
|
||||
/** 省份行政区划代码 */
|
||||
provinceCode: string;
|
||||
/** 省份名称 */
|
||||
provinceName: string;
|
||||
/** 年份 */
|
||||
year: number;
|
||||
/** 专业类别 */
|
||||
majorCategory: string;
|
||||
/** 批次 */
|
||||
batchName: string;
|
||||
/** 科类(文/理) */
|
||||
subjectType: string;
|
||||
/** 文化成绩分数 */
|
||||
cultureScore: number;
|
||||
/** 专业成绩分数 */
|
||||
majorScore: number;
|
||||
/** 文化成绩校考分数 */
|
||||
cultureScoreExam: number;
|
||||
/** 专业成绩校考分数 */
|
||||
majorScoreExam: number;
|
||||
/** 备注 */
|
||||
remark: string;
|
||||
}>;
|
||||
|
||||
/** history score control line search params */
|
||||
type HistoryScoreControlLineSearchParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.HistoryScoreControlLine,
|
||||
| 'provinceCode'
|
||||
| 'provinceName'
|
||||
| 'year'
|
||||
| 'majorCategory'
|
||||
| 'batchName'
|
||||
| 'subjectType'
|
||||
| 'cultureScore'
|
||||
| 'majorScore'
|
||||
| 'cultureScoreExam'
|
||||
| 'majorScoreExam'
|
||||
> &
|
||||
Api.Common.CommonSearchParams
|
||||
>;
|
||||
|
||||
/** history score control line operate params */
|
||||
type HistoryScoreControlLineOperateParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.HistoryScoreControlLine,
|
||||
| 'controlId'
|
||||
| 'provinceCode'
|
||||
| 'provinceName'
|
||||
| 'year'
|
||||
| 'majorCategory'
|
||||
| 'batchName'
|
||||
| 'subjectType'
|
||||
| 'cultureScore'
|
||||
| 'majorScore'
|
||||
| 'cultureScoreExam'
|
||||
| 'majorScoreExam'
|
||||
| 'remark'
|
||||
>
|
||||
>;
|
||||
|
||||
/** history score control line list */
|
||||
type HistoryScoreControlLineList = Api.Common.PaginatingQueryRecord<HistoryScoreControlLine>;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* Namespace Api
|
||||
*
|
||||
* All backend api type
|
||||
*/
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace Art
|
||||
*
|
||||
* backend api module: "Art"
|
||||
*/
|
||||
namespace Art {
|
||||
/** major */
|
||||
type Major = Common.CommonRecord<{
|
||||
/** 专业主键ID */
|
||||
majorId: CommonType.IdType;
|
||||
/** 租户编号 */
|
||||
tenantId: CommonType.IdType;
|
||||
/** 删除标志(0存在 1删除) */
|
||||
delFlag: string;
|
||||
/** 专业名称 */
|
||||
majorName: string;
|
||||
/** 学历层次 */
|
||||
educationLevel: string;
|
||||
/** 专业图标 */
|
||||
majorIcon: string;
|
||||
/** 学制(年) */
|
||||
schoolingYears: number;
|
||||
/** 所属一级学科 */
|
||||
disciplinePrimary: string;
|
||||
/** 所属二级学科 */
|
||||
disciplineSecondary: string;
|
||||
/** 授予学士学位 */
|
||||
degreeAwarded: string;
|
||||
/** 专业概括 */
|
||||
summary: string;
|
||||
/** 培养方向 */
|
||||
trainingDirection: string;
|
||||
/** 主要课程 */
|
||||
coreCourses: string;
|
||||
/** 备注 */
|
||||
remark: string;
|
||||
}>;
|
||||
|
||||
/** major search params */
|
||||
type MajorSearchParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.Major,
|
||||
| 'majorName'
|
||||
| 'educationLevel'
|
||||
| 'majorIcon'
|
||||
| 'schoolingYears'
|
||||
| 'disciplinePrimary'
|
||||
| 'disciplineSecondary'
|
||||
| 'degreeAwarded'
|
||||
| 'summary'
|
||||
| 'trainingDirection'
|
||||
| 'coreCourses'
|
||||
> &
|
||||
Api.Common.CommonSearchParams
|
||||
>;
|
||||
|
||||
/** major operate params */
|
||||
type MajorOperateParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.Major,
|
||||
| 'majorId'
|
||||
| 'majorName'
|
||||
| 'educationLevel'
|
||||
| 'majorIcon'
|
||||
| 'schoolingYears'
|
||||
| 'disciplinePrimary'
|
||||
| 'disciplineSecondary'
|
||||
| 'degreeAwarded'
|
||||
| 'summary'
|
||||
| 'trainingDirection'
|
||||
| 'coreCourses'
|
||||
| 'remark'
|
||||
>
|
||||
>;
|
||||
|
||||
/** major list */
|
||||
type MajorList = Api.Common.PaginatingQueryRecord<Major>;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
/**
|
||||
* Namespace Api
|
||||
*
|
||||
* All backend api type
|
||||
*/
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace Art
|
||||
*
|
||||
* backend api module: "Art"
|
||||
*/
|
||||
namespace Art {
|
||||
/** school recruit major history */
|
||||
type SchoolRecruitMajorHistory = Common.CommonRecord<{
|
||||
/** 历年录取数据ID */
|
||||
historyId: CommonType.IdType;
|
||||
/** 租户编号 */
|
||||
tenantId: CommonType.IdType;
|
||||
/** 删除标志(0存在 1删除) */
|
||||
delFlag: string;
|
||||
/** 对应招录专业ID */
|
||||
recruitMajorId: CommonType.IdType;
|
||||
/** 学校ID */
|
||||
schoolId: CommonType.IdType;
|
||||
/** 学校代码 */
|
||||
schoolCode: string;
|
||||
/** 院校代码 */
|
||||
collegeCode: string;
|
||||
/** 学校名称 */
|
||||
schoolName: string;
|
||||
/** 专业ID */
|
||||
majorId: CommonType.IdType;
|
||||
/** 专业代码 */
|
||||
majorCode: string;
|
||||
/** 专业名称 */
|
||||
majorName: string;
|
||||
/** 招生代码 */
|
||||
enrollCode: string;
|
||||
/** 专业类型 */
|
||||
majorType: string;
|
||||
/** 专业类别子级 */
|
||||
majorTypeSub: string;
|
||||
/** 主考科目 */
|
||||
mainExamSubject: string;
|
||||
/** 年份 */
|
||||
year: number;
|
||||
/** 科类(文/理) */
|
||||
subjectType: string;
|
||||
/** 批次 */
|
||||
batchName: string;
|
||||
/** 录取方式(文*x+专*y) */
|
||||
admissionFormula: string;
|
||||
/** 录取概率规则运算符 */
|
||||
probabilityOperator: string;
|
||||
/** 省控线 */
|
||||
controlScore: number;
|
||||
/** 录取线 */
|
||||
admissionScore: number;
|
||||
/** 招生人数 */
|
||||
planEnroll: number;
|
||||
/** 实际投档人数 */
|
||||
filedAmount: number;
|
||||
/** 录取数 */
|
||||
admitAmount: number;
|
||||
/** 一志愿录取数 */
|
||||
firstChoiceAdmitAmount: number;
|
||||
/** 最低分数差 */
|
||||
minScoreDiff: number;
|
||||
/** 学费(元/年) */
|
||||
tuitionFee: number;
|
||||
/** 备注 */
|
||||
remark: string;
|
||||
}>;
|
||||
|
||||
/** school recruit major history search params */
|
||||
type SchoolRecruitMajorHistorySearchParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.SchoolRecruitMajorHistory,
|
||||
| 'recruitMajorId'
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'collegeCode'
|
||||
| 'schoolName'
|
||||
| 'majorId'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'enrollCode'
|
||||
| 'majorType'
|
||||
| 'majorTypeSub'
|
||||
| 'mainExamSubject'
|
||||
| 'year'
|
||||
| 'subjectType'
|
||||
| 'batchName'
|
||||
| 'admissionFormula'
|
||||
| 'probabilityOperator'
|
||||
| 'controlScore'
|
||||
| 'admissionScore'
|
||||
| 'planEnroll'
|
||||
| 'filedAmount'
|
||||
| 'admitAmount'
|
||||
| 'firstChoiceAdmitAmount'
|
||||
| 'minScoreDiff'
|
||||
| 'tuitionFee'
|
||||
> &
|
||||
Api.Common.CommonSearchParams
|
||||
>;
|
||||
|
||||
/** school recruit major history operate params */
|
||||
type SchoolRecruitMajorHistoryOperateParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.SchoolRecruitMajorHistory,
|
||||
| 'historyId'
|
||||
| 'recruitMajorId'
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'collegeCode'
|
||||
| 'schoolName'
|
||||
| 'majorId'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'enrollCode'
|
||||
| 'majorType'
|
||||
| 'majorTypeSub'
|
||||
| 'mainExamSubject'
|
||||
| 'year'
|
||||
| 'subjectType'
|
||||
| 'batchName'
|
||||
| 'admissionFormula'
|
||||
| 'probabilityOperator'
|
||||
| 'controlScore'
|
||||
| 'admissionScore'
|
||||
| 'planEnroll'
|
||||
| 'filedAmount'
|
||||
| 'admitAmount'
|
||||
| 'firstChoiceAdmitAmount'
|
||||
| 'minScoreDiff'
|
||||
| 'tuitionFee'
|
||||
| 'remark'
|
||||
>
|
||||
>;
|
||||
|
||||
/** school recruit major history list */
|
||||
type SchoolRecruitMajorHistoryList = Api.Common.PaginatingQueryRecord<SchoolRecruitMajorHistory>;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
/**
|
||||
* Namespace Api
|
||||
*
|
||||
* All backend api type
|
||||
*/
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace Art
|
||||
*
|
||||
* backend api module: "Art"
|
||||
*/
|
||||
namespace Art {
|
||||
/** school recruit major */
|
||||
type SchoolRecruitMajor = Common.CommonRecord<{
|
||||
/** 院校招录专业ID */
|
||||
recruitMajorId: CommonType.IdType;
|
||||
/** 租户编号 */
|
||||
tenantId: CommonType.IdType;
|
||||
/** 删除标志(0存在 1删除) */
|
||||
delFlag: string;
|
||||
/** 学校ID */
|
||||
schoolId: CommonType.IdType;
|
||||
/** 学校代码 */
|
||||
schoolCode: string;
|
||||
/** 学校名称(冗余) */
|
||||
schoolName: string;
|
||||
/** 年份 */
|
||||
year: number;
|
||||
/** 专业ID */
|
||||
majorId: CommonType.IdType;
|
||||
/** 专业代码 */
|
||||
majorCode: string;
|
||||
/** 专业名称 */
|
||||
majorName: string;
|
||||
/** 招生代码(为空则存空串) */
|
||||
enrollCode: string;
|
||||
/** 数据状态(停招/新招/新增) */
|
||||
dataStatus: string;
|
||||
/** 批次 */
|
||||
batchName: string;
|
||||
/** 专业类型 */
|
||||
majorType: string;
|
||||
/** 二级专业类型 */
|
||||
majorTypeSub: string;
|
||||
/** 科类(文/理) */
|
||||
subjectType: string;
|
||||
/** 录取方式缩写 */
|
||||
admissionWayShort: string;
|
||||
/** 对外录取方式 */
|
||||
admissionWayExternal: string;
|
||||
/** 对外录取方式运算符 */
|
||||
admissionWayExternalOp: string;
|
||||
/** 内部录取方式 */
|
||||
admissionWayInternal: string;
|
||||
/** 内部录取方式运算符 */
|
||||
admissionWayInternalOp: string;
|
||||
/** 计划招生人数 */
|
||||
planEnroll: number;
|
||||
/** 主考科目 */
|
||||
mainExamSubject: string;
|
||||
/** 学制(年) */
|
||||
schoolingYears: number;
|
||||
/** 院校限制说明 */
|
||||
enrollLimitDesc: string;
|
||||
/** 学费(元/年) */
|
||||
tuitionFee: number;
|
||||
/** 文化分数限制 */
|
||||
cultureScoreLimit: number;
|
||||
/** 专业分数限制 */
|
||||
majorScoreLimit: number;
|
||||
/** 语文成绩限制 */
|
||||
chineseScoreLimit: number;
|
||||
/** 英语成绩限制 */
|
||||
englishScoreLimit: number;
|
||||
/** 备注 */
|
||||
remark: string;
|
||||
}>;
|
||||
|
||||
/** school recruit major search params */
|
||||
type SchoolRecruitMajorSearchParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.SchoolRecruitMajor,
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'schoolName'
|
||||
| 'year'
|
||||
| 'majorId'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'enrollCode'
|
||||
| 'dataStatus'
|
||||
| 'batchName'
|
||||
| 'majorType'
|
||||
| 'majorTypeSub'
|
||||
| 'subjectType'
|
||||
| 'admissionWayShort'
|
||||
| 'admissionWayExternal'
|
||||
| 'admissionWayExternalOp'
|
||||
| 'admissionWayInternal'
|
||||
| 'admissionWayInternalOp'
|
||||
| 'planEnroll'
|
||||
| 'mainExamSubject'
|
||||
| 'schoolingYears'
|
||||
| 'enrollLimitDesc'
|
||||
| 'tuitionFee'
|
||||
| 'cultureScoreLimit'
|
||||
| 'majorScoreLimit'
|
||||
| 'chineseScoreLimit'
|
||||
| 'englishScoreLimit'
|
||||
> &
|
||||
Api.Common.CommonSearchParams
|
||||
>;
|
||||
|
||||
/** school recruit major operate params */
|
||||
type SchoolRecruitMajorOperateParams = CommonType.RecordNullable<
|
||||
Pick<
|
||||
Api.Art.SchoolRecruitMajor,
|
||||
| 'recruitMajorId'
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'schoolName'
|
||||
| 'year'
|
||||
| 'majorId'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'enrollCode'
|
||||
| 'dataStatus'
|
||||
| 'batchName'
|
||||
| 'majorType'
|
||||
| 'majorTypeSub'
|
||||
| 'subjectType'
|
||||
| 'admissionWayShort'
|
||||
| 'admissionWayExternal'
|
||||
| 'admissionWayExternalOp'
|
||||
| 'admissionWayInternal'
|
||||
| 'admissionWayInternalOp'
|
||||
| 'planEnroll'
|
||||
| 'mainExamSubject'
|
||||
| 'schoolingYears'
|
||||
| 'enrollLimitDesc'
|
||||
| 'tuitionFee'
|
||||
| 'cultureScoreLimit'
|
||||
| 'majorScoreLimit'
|
||||
| 'chineseScoreLimit'
|
||||
| 'englishScoreLimit'
|
||||
| 'remark'
|
||||
>
|
||||
>;
|
||||
|
||||
/** school recruit major list */
|
||||
type SchoolRecruitMajorList = Api.Common.PaginatingQueryRecord<SchoolRecruitMajor>;
|
||||
}
|
||||
}
|
||||
|
|
@ -26,6 +26,8 @@ declare module "@elegant-router/types" {
|
|||
"500": "/500";
|
||||
"about": "/about";
|
||||
"art": "/art";
|
||||
"art_history-score-control-line": "/art/history-score-control-line";
|
||||
"art_major": "/art/major";
|
||||
"art_school": "/art/school";
|
||||
"art_school_modules": "/art/school/modules";
|
||||
"art_school_modules_school-campus": "/art/school/modules/school-campus";
|
||||
|
|
@ -38,6 +40,8 @@ declare module "@elegant-router/types" {
|
|||
"art_school_modules_school-media": "/art/school/modules/school-media";
|
||||
"art_school_modules_school-name": "/art/school/modules/school-name";
|
||||
"art_school_modules_school-tag": "/art/school/modules/school-tag";
|
||||
"art_school-recruit-major": "/art/school-recruit-major";
|
||||
"art_school-recruit-major-history": "/art/school-recruit-major-history";
|
||||
"demo": "/demo";
|
||||
"demo_demo": "/demo/demo";
|
||||
"demo_tree": "/demo/tree";
|
||||
|
|
@ -141,6 +145,10 @@ declare module "@elegant-router/types" {
|
|||
| "social-callback"
|
||||
| "user-center"
|
||||
| "about"
|
||||
| "art_history-score-control-line"
|
||||
| "art_major"
|
||||
| "art_school-recruit-major-history"
|
||||
| "art_school-recruit-major"
|
||||
| "art_school"
|
||||
| "art_school_modules_school-campus"
|
||||
| "art_school_modules_school-college"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,255 @@
|
|||
<script setup lang="tsx">
|
||||
import { ref } from 'vue';
|
||||
import { NDivider } from 'naive-ui';
|
||||
import { fetchBatchDeleteHistoryScoreControlLine, fetchGetHistoryScoreControlLineList } from '@/service/api/art/history-score-control-line';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useAuth } from '@/hooks/business/auth';
|
||||
import { useDownload } from '@/hooks/business/download';
|
||||
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
|
||||
import { $t } from '@/locales';
|
||||
import ButtonIcon from '@/components/custom/button-icon.vue';
|
||||
import HistoryScoreControlLineOperateDrawer from './modules/history-score-control-line-operate-drawer.vue';
|
||||
import HistoryScoreControlLineSearch from './modules/history-score-control-line-search.vue';
|
||||
|
||||
defineOptions({
|
||||
name: 'HistoryScoreControlLineList'
|
||||
});
|
||||
|
||||
|
||||
const appStore = useAppStore();
|
||||
const { download } = useDownload();
|
||||
const { hasAuth } = useAuth();
|
||||
|
||||
const searchParams = ref<Api.Art.HistoryScoreControlLineSearchParams>({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
provinceCode: null,
|
||||
provinceName: null,
|
||||
year: null,
|
||||
majorCategory: null,
|
||||
batchName: null,
|
||||
subjectType: null,
|
||||
cultureScore: null,
|
||||
majorScore: null,
|
||||
cultureScoreExam: null,
|
||||
majorScoreExam: null,
|
||||
params: {}
|
||||
});
|
||||
|
||||
const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } =
|
||||
useNaivePaginatedTable({
|
||||
api: () => fetchGetHistoryScoreControlLineList(searchParams.value),
|
||||
transform: response => defaultTransform(response),
|
||||
onPaginationParamsChange: params => {
|
||||
searchParams.value.pageNum = params.page;
|
||||
searchParams.value.pageSize = params.pageSize;
|
||||
},
|
||||
columns: () => [
|
||||
{
|
||||
type: 'selection',
|
||||
align: 'center',
|
||||
width: 48
|
||||
},
|
||||
{
|
||||
key: 'index',
|
||||
title: $t('common.index'),
|
||||
align: 'center',
|
||||
width: 64,
|
||||
render: (_, index) => index + 1
|
||||
},
|
||||
{
|
||||
key: 'controlId',
|
||||
title: '省控线主键',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'provinceCode',
|
||||
title: '省份行政区划代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'provinceName',
|
||||
title: '省份名称',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'year',
|
||||
title: '年份',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorCategory',
|
||||
title: '专业类别',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'batchName',
|
||||
title: '批次',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'subjectType',
|
||||
title: '科类(文/理)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'cultureScore',
|
||||
title: '文化成绩分数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorScore',
|
||||
title: '专业成绩分数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'cultureScoreExam',
|
||||
title: '文化成绩校考分数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorScoreExam',
|
||||
title: '专业成绩校考分数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'operate',
|
||||
title: $t('common.operate'),
|
||||
align: 'center',
|
||||
width: 130,
|
||||
render: row => {
|
||||
const divider = () => {
|
||||
if (!hasAuth('art:historyScoreControlLine:edit') || !hasAuth('art:historyScoreControlLine:remove')) {
|
||||
return null;
|
||||
}
|
||||
return <NDivider vertical />;
|
||||
};
|
||||
|
||||
const editBtn = () => {
|
||||
if (!hasAuth('art:historyScoreControlLine:edit')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="primary"
|
||||
icon="material-symbols:drive-file-rename-outline-outline"
|
||||
tooltipContent={$t('common.edit')}
|
||||
onClick={() => edit(row.controlId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const deleteBtn = () => {
|
||||
if (!hasAuth('art:historyScoreControlLine:remove')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="error"
|
||||
icon="material-symbols:delete-outline"
|
||||
tooltipContent={$t('common.delete')}
|
||||
popconfirmContent={$t('common.confirmDelete')}
|
||||
onPositiveClick={() => handleDelete(row.controlId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div class="flex-center gap-8px">
|
||||
{editBtn()}
|
||||
{divider()}
|
||||
{deleteBtn()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } =
|
||||
useTableOperate(data, 'controlId', getData);
|
||||
|
||||
async function handleBatchDelete() {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteHistoryScoreControlLine(checkedRowKeys.value);
|
||||
if (error) return;
|
||||
onBatchDeleted();
|
||||
}
|
||||
|
||||
async function handleDelete(controlId: CommonType.IdType) {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteHistoryScoreControlLine([controlId]);
|
||||
if (error) return;
|
||||
onDeleted();
|
||||
}
|
||||
|
||||
function edit(controlId: CommonType.IdType) {
|
||||
handleEdit(controlId);
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
download('/art/historyScoreControlLine/export', searchParams.value, `历年省控线_${new Date().getTime()}.xlsx`);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
|
||||
<HistoryScoreControlLineSearch v-model:model="searchParams" @search="getDataByPage" />
|
||||
<NCard title="历年省控线列表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
|
||||
<template #header-extra>
|
||||
<TableHeaderOperation
|
||||
v-model:columns="columnChecks"
|
||||
:disabled-delete="checkedRowKeys.length === 0"
|
||||
:loading="loading"
|
||||
:show-add="hasAuth('art:historyScoreControlLine:add')"
|
||||
:show-delete="hasAuth('art:historyScoreControlLine:remove')"
|
||||
:show-export="hasAuth('art:historyScoreControlLine:export')"
|
||||
@add="handleAdd"
|
||||
@delete="handleBatchDelete"
|
||||
@export="handleExport"
|
||||
@refresh="getData"
|
||||
/>
|
||||
</template>
|
||||
<NDataTable
|
||||
v-model:checked-row-keys="checkedRowKeys"
|
||||
:columns="columns"
|
||||
:data="data"
|
||||
size="small"
|
||||
:flex-height="!appStore.isMobile"
|
||||
:scroll-x="scrollX"
|
||||
:loading="loading"
|
||||
remote
|
||||
:row-key="row => row.controlId"
|
||||
:pagination="mobilePagination"
|
||||
class="sm:h-full"
|
||||
/>
|
||||
<HistoryScoreControlLineOperateDrawer
|
||||
v-model:visible="drawerVisible"
|
||||
:operate-type="operateType"
|
||||
:row-data="editingData"
|
||||
@submitted="getDataByPage"
|
||||
/>
|
||||
</NCard>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,188 @@
|
|||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { fetchCreateHistoryScoreControlLine, fetchUpdateHistoryScoreControlLine } from '@/service/api/art/history-score-control-line';
|
||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'HistoryScoreControlLineOperateDrawer'
|
||||
});
|
||||
|
||||
interface Props {
|
||||
/** the type of operation */
|
||||
operateType: NaiveUI.TableOperateType;
|
||||
/** the edit row data */
|
||||
rowData?: Api.Art.HistoryScoreControlLine | null;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
interface Emits {
|
||||
(e: 'submitted'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const visible = defineModel<boolean>('visible', {
|
||||
default: false
|
||||
});
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
const { createRequiredRule } = useFormRules();
|
||||
|
||||
const title = computed(() => {
|
||||
const titles: Record<NaiveUI.TableOperateType, string> = {
|
||||
add: '新增历年省控线',
|
||||
edit: '编辑历年省控线'
|
||||
};
|
||||
return titles[props.operateType];
|
||||
});
|
||||
|
||||
type Model = Api.Art.HistoryScoreControlLineOperateParams;
|
||||
|
||||
const model = ref<Model>(createDefaultModel());
|
||||
|
||||
function createDefaultModel(): Model {
|
||||
return {
|
||||
controlId: null,
|
||||
provinceCode: '',
|
||||
provinceName: '',
|
||||
year: null,
|
||||
majorCategory: '',
|
||||
batchName: '',
|
||||
subjectType: '',
|
||||
cultureScore: null,
|
||||
majorScore: null,
|
||||
cultureScoreExam: null,
|
||||
majorScoreExam: null,
|
||||
remark: ''
|
||||
};
|
||||
}
|
||||
|
||||
type RuleKey = Extract<
|
||||
keyof Model,
|
||||
| 'controlId'
|
||||
| 'tenantId'
|
||||
| 'delFlag'
|
||||
| 'provinceCode'
|
||||
| 'provinceName'
|
||||
| 'year'
|
||||
| 'majorCategory'
|
||||
| 'batchName'
|
||||
| 'subjectType'
|
||||
>;
|
||||
|
||||
const rules: Record<RuleKey, App.Global.FormRule> = {
|
||||
controlId: createRequiredRule('省控线主键不能为空'),
|
||||
tenantId: createRequiredRule('租户编号不能为空'),
|
||||
delFlag: createRequiredRule('删除标志(0存在 1删除)不能为空'),
|
||||
provinceCode: createRequiredRule('省份行政区划代码不能为空'),
|
||||
provinceName: createRequiredRule('省份名称不能为空'),
|
||||
year: createRequiredRule('年份不能为空'),
|
||||
majorCategory: createRequiredRule('专业类别不能为空'),
|
||||
batchName: createRequiredRule('批次不能为空'),
|
||||
subjectType: createRequiredRule('科类(文/理)不能为空'),
|
||||
};
|
||||
|
||||
function handleUpdateModelWhenEdit() {
|
||||
model.value = createDefaultModel();
|
||||
|
||||
if (props.operateType === 'edit' && props.rowData) {
|
||||
Object.assign(model.value, jsonClone(props.rowData));
|
||||
}
|
||||
}
|
||||
|
||||
function closeDrawer() {
|
||||
visible.value = false;
|
||||
}
|
||||
|
||||
async function handleSubmit() {
|
||||
await validate();
|
||||
|
||||
const { controlId, provinceCode, provinceName, year, majorCategory, batchName, subjectType, cultureScore, majorScore, cultureScoreExam, majorScoreExam, remark } = model.value;
|
||||
|
||||
// request
|
||||
if (props.operateType === 'add') {
|
||||
const { error } = await fetchCreateHistoryScoreControlLine({ provinceCode, provinceName, year, majorCategory, batchName, subjectType, cultureScore, majorScore, cultureScoreExam, majorScoreExam, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
if (props.operateType === 'edit') {
|
||||
const { error } = await fetchUpdateHistoryScoreControlLine({ controlId, provinceCode, provinceName, year, majorCategory, batchName, subjectType, cultureScore, majorScore, cultureScoreExam, majorScoreExam, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
window.$message?.success($t('common.updateSuccess'));
|
||||
closeDrawer();
|
||||
emit('submitted');
|
||||
}
|
||||
|
||||
watch(visible, () => {
|
||||
if (visible.value) {
|
||||
handleUpdateModelWhenEdit();
|
||||
restoreValidation();
|
||||
getTreeList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
|
||||
<NDrawerContent :title="title" :native-scrollbar="false" closable>
|
||||
<NForm ref="formRef" :model="model" :rules="rules">
|
||||
<NFormItem label="省份行政区划代码" path="provinceCode">
|
||||
<NInput v-model:value="model.provinceCode" placeholder="请输入省份行政区划代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="省份名称" path="provinceName">
|
||||
<NInput v-model:value="model.provinceName" placeholder="请输入省份名称" />
|
||||
</NFormItem>
|
||||
<NFormItem label="年份" path="year">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业类别" path="majorCategory">
|
||||
<NInput v-model:value="model.majorCategory" placeholder="请输入专业类别" />
|
||||
</NFormItem>
|
||||
<NFormItem label="批次" path="batchName">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItem>
|
||||
<NFormItem label="科类(文/理)" path="subjectType">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[{ value: '0', label: '请选择字典生成' }]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="文化成绩分数" path="cultureScore">
|
||||
<NInput v-model:value="model.cultureScore" placeholder="请输入文化成绩分数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业成绩分数" path="majorScore">
|
||||
<NInput v-model:value="model.majorScore" placeholder="请输入专业成绩分数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="文化成绩校考分数" path="cultureScoreExam">
|
||||
<NInput v-model:value="model.cultureScoreExam" placeholder="请输入文化成绩校考分数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业成绩校考分数" path="majorScoreExam">
|
||||
<NInput v-model:value="model.majorScoreExam" placeholder="请输入专业成绩校考分数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="备注" path="remark">
|
||||
<NInput
|
||||
v-model:value="model.remark"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入备注"
|
||||
/>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
<template #footer>
|
||||
<NSpace :size="16">
|
||||
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
|
||||
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
|
||||
</NSpace>
|
||||
</template>
|
||||
</NDrawerContent>
|
||||
</NDrawer>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,103 @@
|
|||
<script setup lang="ts">
|
||||
import { toRaw } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'HistoryScoreControlLineSearch'
|
||||
});
|
||||
|
||||
interface Emits {
|
||||
(e: 'search'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
|
||||
const model = defineModel<Api.Art.HistoryScoreControlLineSearchParams>('model', { required: true });
|
||||
|
||||
const defaultModel = jsonClone(toRaw(model.value));
|
||||
|
||||
function resetModel() {
|
||||
Object.assign(model.value, defaultModel);
|
||||
}
|
||||
|
||||
async function reset() {
|
||||
await restoreValidation();
|
||||
resetModel();
|
||||
emit('search');
|
||||
}
|
||||
|
||||
async function search() {
|
||||
await validate();
|
||||
emit('search');
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NCard :bordered="false" size="small" class="card-wrapper">
|
||||
<NCollapse>
|
||||
<NCollapseItem :title="$t('common.search')" name="art-history-score-control-line-search">
|
||||
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
|
||||
<NGrid responsive="screen" item-responsive>
|
||||
<NFormItemGi span="24 s:12 m:6" label="省份行政区划代码" label-width="auto" path="provinceCode" class="pr-24px">
|
||||
<NInput v-model:value="model.provinceCode" placeholder="请输入省份行政区划代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="省份名称" label-width="auto" path="provinceName" class="pr-24px">
|
||||
<NInput v-model:value="model.provinceName" placeholder="请输入省份名称" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="年份" label-width="auto" path="year" class="pr-24px">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业类别" label-width="auto" path="majorCategory" class="pr-24px">
|
||||
<NInput v-model:value="model.majorCategory" placeholder="请输入专业类别" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="批次" label-width="auto" path="batchName" class="pr-24px">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="科类(文/理)" label-width="auto" path="subjectType" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="文化成绩分数" label-width="auto" path="cultureScore" class="pr-24px">
|
||||
<NInput v-model:value="model.cultureScore" placeholder="请输入文化成绩分数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业成绩分数" label-width="auto" path="majorScore" class="pr-24px">
|
||||
<NInput v-model:value="model.majorScore" placeholder="请输入专业成绩分数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="文化成绩校考分数" label-width="auto" path="cultureScoreExam" class="pr-24px">
|
||||
<NInput v-model:value="model.cultureScoreExam" placeholder="请输入文化成绩校考分数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业成绩校考分数" label-width="auto" path="majorScoreExam" class="pr-24px">
|
||||
<NInput v-model:value="model.majorScoreExam" placeholder="请输入专业成绩校考分数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi :show-feedback="false" span="24" class="pr-24px">
|
||||
<NSpace class="w-full" justify="end">
|
||||
<NButton @click="reset">
|
||||
<template #icon>
|
||||
<icon-ic-round-refresh class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.reset') }}
|
||||
</NButton>
|
||||
<NButton type="primary" ghost @click="search">
|
||||
<template #icon>
|
||||
<icon-ic-round-search class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.search') }}
|
||||
</NButton>
|
||||
</NSpace>
|
||||
</NFormItemGi>
|
||||
</NGrid>
|
||||
</NForm>
|
||||
</NCollapseItem>
|
||||
</NCollapse>
|
||||
</NCard>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,255 @@
|
|||
<script setup lang="tsx">
|
||||
import { ref } from 'vue';
|
||||
import { NDivider } from 'naive-ui';
|
||||
import { fetchBatchDeleteMajor, fetchGetMajorList } from '@/service/api/art/major';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useAuth } from '@/hooks/business/auth';
|
||||
import { useDownload } from '@/hooks/business/download';
|
||||
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
|
||||
import { $t } from '@/locales';
|
||||
import ButtonIcon from '@/components/custom/button-icon.vue';
|
||||
import MajorOperateDrawer from './modules/major-operate-drawer.vue';
|
||||
import MajorSearch from './modules/major-search.vue';
|
||||
|
||||
defineOptions({
|
||||
name: 'MajorList'
|
||||
});
|
||||
|
||||
|
||||
const appStore = useAppStore();
|
||||
const { download } = useDownload();
|
||||
const { hasAuth } = useAuth();
|
||||
|
||||
const searchParams = ref<Api.Art.MajorSearchParams>({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
majorName: null,
|
||||
educationLevel: null,
|
||||
majorIcon: null,
|
||||
schoolingYears: null,
|
||||
disciplinePrimary: null,
|
||||
disciplineSecondary: null,
|
||||
degreeAwarded: null,
|
||||
summary: null,
|
||||
trainingDirection: null,
|
||||
coreCourses: null,
|
||||
params: {}
|
||||
});
|
||||
|
||||
const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } =
|
||||
useNaivePaginatedTable({
|
||||
api: () => fetchGetMajorList(searchParams.value),
|
||||
transform: response => defaultTransform(response),
|
||||
onPaginationParamsChange: params => {
|
||||
searchParams.value.pageNum = params.page;
|
||||
searchParams.value.pageSize = params.pageSize;
|
||||
},
|
||||
columns: () => [
|
||||
{
|
||||
type: 'selection',
|
||||
align: 'center',
|
||||
width: 48
|
||||
},
|
||||
{
|
||||
key: 'index',
|
||||
title: $t('common.index'),
|
||||
align: 'center',
|
||||
width: 64,
|
||||
render: (_, index) => index + 1
|
||||
},
|
||||
{
|
||||
key: 'majorId',
|
||||
title: '专业主键ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorName',
|
||||
title: '专业名称',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'educationLevel',
|
||||
title: '学历层次',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorIcon',
|
||||
title: '专业图标',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolingYears',
|
||||
title: '学制(年)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'disciplinePrimary',
|
||||
title: '所属一级学科',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'disciplineSecondary',
|
||||
title: '所属二级学科',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'degreeAwarded',
|
||||
title: '授予学士学位',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'summary',
|
||||
title: '专业概括',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'trainingDirection',
|
||||
title: '培养方向',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'coreCourses',
|
||||
title: '主要课程',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'operate',
|
||||
title: $t('common.operate'),
|
||||
align: 'center',
|
||||
width: 130,
|
||||
render: row => {
|
||||
const divider = () => {
|
||||
if (!hasAuth('art:major:edit') || !hasAuth('art:major:remove')) {
|
||||
return null;
|
||||
}
|
||||
return <NDivider vertical />;
|
||||
};
|
||||
|
||||
const editBtn = () => {
|
||||
if (!hasAuth('art:major:edit')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="primary"
|
||||
icon="material-symbols:drive-file-rename-outline-outline"
|
||||
tooltipContent={$t('common.edit')}
|
||||
onClick={() => edit(row.majorId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const deleteBtn = () => {
|
||||
if (!hasAuth('art:major:remove')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="error"
|
||||
icon="material-symbols:delete-outline"
|
||||
tooltipContent={$t('common.delete')}
|
||||
popconfirmContent={$t('common.confirmDelete')}
|
||||
onPositiveClick={() => handleDelete(row.majorId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div class="flex-center gap-8px">
|
||||
{editBtn()}
|
||||
{divider()}
|
||||
{deleteBtn()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } =
|
||||
useTableOperate(data, 'majorId', getData);
|
||||
|
||||
async function handleBatchDelete() {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteMajor(checkedRowKeys.value);
|
||||
if (error) return;
|
||||
onBatchDeleted();
|
||||
}
|
||||
|
||||
async function handleDelete(majorId: CommonType.IdType) {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteMajor([majorId]);
|
||||
if (error) return;
|
||||
onDeleted();
|
||||
}
|
||||
|
||||
function edit(majorId: CommonType.IdType) {
|
||||
handleEdit(majorId);
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
download('/art/major/export', searchParams.value, `艺术专业库_${new Date().getTime()}.xlsx`);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
|
||||
<MajorSearch v-model:model="searchParams" @search="getDataByPage" />
|
||||
<NCard title="艺术专业库列表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
|
||||
<template #header-extra>
|
||||
<TableHeaderOperation
|
||||
v-model:columns="columnChecks"
|
||||
:disabled-delete="checkedRowKeys.length === 0"
|
||||
:loading="loading"
|
||||
:show-add="hasAuth('art:major:add')"
|
||||
:show-delete="hasAuth('art:major:remove')"
|
||||
:show-export="hasAuth('art:major:export')"
|
||||
@add="handleAdd"
|
||||
@delete="handleBatchDelete"
|
||||
@export="handleExport"
|
||||
@refresh="getData"
|
||||
/>
|
||||
</template>
|
||||
<NDataTable
|
||||
v-model:checked-row-keys="checkedRowKeys"
|
||||
:columns="columns"
|
||||
:data="data"
|
||||
size="small"
|
||||
:flex-height="!appStore.isMobile"
|
||||
:scroll-x="scrollX"
|
||||
:loading="loading"
|
||||
remote
|
||||
:row-key="row => row.majorId"
|
||||
:pagination="mobilePagination"
|
||||
class="sm:h-full"
|
||||
/>
|
||||
<MajorOperateDrawer
|
||||
v-model:visible="drawerVisible"
|
||||
:operate-type="operateType"
|
||||
:row-data="editingData"
|
||||
@submitted="getDataByPage"
|
||||
/>
|
||||
</NCard>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,190 @@
|
|||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { fetchCreateMajor, fetchUpdateMajor } from '@/service/api/art/major';
|
||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'MajorOperateDrawer'
|
||||
});
|
||||
|
||||
interface Props {
|
||||
/** the type of operation */
|
||||
operateType: NaiveUI.TableOperateType;
|
||||
/** the edit row data */
|
||||
rowData?: Api.Art.Major | null;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
interface Emits {
|
||||
(e: 'submitted'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const visible = defineModel<boolean>('visible', {
|
||||
default: false
|
||||
});
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
const { createRequiredRule } = useFormRules();
|
||||
|
||||
const title = computed(() => {
|
||||
const titles: Record<NaiveUI.TableOperateType, string> = {
|
||||
add: '新增艺术专业库',
|
||||
edit: '编辑艺术专业库'
|
||||
};
|
||||
return titles[props.operateType];
|
||||
});
|
||||
|
||||
type Model = Api.Art.MajorOperateParams;
|
||||
|
||||
const model = ref<Model>(createDefaultModel());
|
||||
|
||||
function createDefaultModel(): Model {
|
||||
return {
|
||||
majorId: null,
|
||||
majorName: '',
|
||||
educationLevel: '',
|
||||
majorIcon: '',
|
||||
schoolingYears: null,
|
||||
disciplinePrimary: '',
|
||||
disciplineSecondary: '',
|
||||
degreeAwarded: '',
|
||||
summary: '',
|
||||
trainingDirection: '',
|
||||
coreCourses: '',
|
||||
remark: ''
|
||||
};
|
||||
}
|
||||
|
||||
type RuleKey = Extract<
|
||||
keyof Model,
|
||||
| 'majorId'
|
||||
| 'tenantId'
|
||||
| 'delFlag'
|
||||
| 'majorName'
|
||||
| 'educationLevel'
|
||||
>;
|
||||
|
||||
const rules: Record<RuleKey, App.Global.FormRule> = {
|
||||
majorId: createRequiredRule('专业主键ID不能为空'),
|
||||
tenantId: createRequiredRule('租户编号不能为空'),
|
||||
delFlag: createRequiredRule('删除标志(0存在 1删除)不能为空'),
|
||||
majorName: createRequiredRule('专业名称不能为空'),
|
||||
educationLevel: createRequiredRule('学历层次不能为空'),
|
||||
};
|
||||
|
||||
function handleUpdateModelWhenEdit() {
|
||||
model.value = createDefaultModel();
|
||||
|
||||
if (props.operateType === 'edit' && props.rowData) {
|
||||
Object.assign(model.value, jsonClone(props.rowData));
|
||||
}
|
||||
}
|
||||
|
||||
function closeDrawer() {
|
||||
visible.value = false;
|
||||
}
|
||||
|
||||
async function handleSubmit() {
|
||||
await validate();
|
||||
|
||||
const { majorId, majorName, educationLevel, majorIcon, schoolingYears, disciplinePrimary, disciplineSecondary, degreeAwarded, summary, trainingDirection, coreCourses, remark } = model.value;
|
||||
|
||||
// request
|
||||
if (props.operateType === 'add') {
|
||||
const { error } = await fetchCreateMajor({ majorName, educationLevel, majorIcon, schoolingYears, disciplinePrimary, disciplineSecondary, degreeAwarded, summary, trainingDirection, coreCourses, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
if (props.operateType === 'edit') {
|
||||
const { error } = await fetchUpdateMajor({ majorId, majorName, educationLevel, majorIcon, schoolingYears, disciplinePrimary, disciplineSecondary, degreeAwarded, summary, trainingDirection, coreCourses, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
window.$message?.success($t('common.updateSuccess'));
|
||||
closeDrawer();
|
||||
emit('submitted');
|
||||
}
|
||||
|
||||
watch(visible, () => {
|
||||
if (visible.value) {
|
||||
handleUpdateModelWhenEdit();
|
||||
restoreValidation();
|
||||
getTreeList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
|
||||
<NDrawerContent :title="title" :native-scrollbar="false" closable>
|
||||
<NForm ref="formRef" :model="model" :rules="rules">
|
||||
<NFormItem label="专业名称" path="majorName">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学历层次" path="educationLevel">
|
||||
<NInput v-model:value="model.educationLevel" placeholder="请输入学历层次" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业图标" path="majorIcon">
|
||||
<NInput v-model:value="model.majorIcon" placeholder="请输入专业图标" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学制(年)" path="schoolingYears">
|
||||
<NInput v-model:value="model.schoolingYears" placeholder="请输入学制(年)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="所属一级学科" path="disciplinePrimary">
|
||||
<NInput v-model:value="model.disciplinePrimary" placeholder="请输入所属一级学科" />
|
||||
</NFormItem>
|
||||
<NFormItem label="所属二级学科" path="disciplineSecondary">
|
||||
<NInput v-model:value="model.disciplineSecondary" placeholder="请输入所属二级学科" />
|
||||
</NFormItem>
|
||||
<NFormItem label="授予学士学位" path="degreeAwarded">
|
||||
<NInput v-model:value="model.degreeAwarded" placeholder="请输入授予学士学位" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业概括" path="summary">
|
||||
<NInput
|
||||
v-model:value="model.summary"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入专业概括"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="培养方向" path="trainingDirection">
|
||||
<NInput
|
||||
v-model:value="model.trainingDirection"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入培养方向"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="主要课程" path="coreCourses">
|
||||
<NInput
|
||||
v-model:value="model.coreCourses"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入主要课程"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="备注" path="remark">
|
||||
<NInput
|
||||
v-model:value="model.remark"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入备注"
|
||||
/>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
<template #footer>
|
||||
<NSpace :size="16">
|
||||
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
|
||||
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
|
||||
</NSpace>
|
||||
</template>
|
||||
</NDrawerContent>
|
||||
</NDrawer>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
<script setup lang="ts">
|
||||
import { toRaw } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'MajorSearch'
|
||||
});
|
||||
|
||||
interface Emits {
|
||||
(e: 'search'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
|
||||
const model = defineModel<Api.Art.MajorSearchParams>('model', { required: true });
|
||||
|
||||
const defaultModel = jsonClone(toRaw(model.value));
|
||||
|
||||
function resetModel() {
|
||||
Object.assign(model.value, defaultModel);
|
||||
}
|
||||
|
||||
async function reset() {
|
||||
await restoreValidation();
|
||||
resetModel();
|
||||
emit('search');
|
||||
}
|
||||
|
||||
async function search() {
|
||||
await validate();
|
||||
emit('search');
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NCard :bordered="false" size="small" class="card-wrapper">
|
||||
<NCollapse>
|
||||
<NCollapseItem :title="$t('common.search')" name="art-major-search">
|
||||
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
|
||||
<NGrid responsive="screen" item-responsive>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业名称" label-width="auto" path="majorName" class="pr-24px">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学历层次" label-width="auto" path="educationLevel" class="pr-24px">
|
||||
<NInput v-model:value="model.educationLevel" placeholder="请输入学历层次" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业图标" label-width="auto" path="majorIcon" class="pr-24px">
|
||||
<NInput v-model:value="model.majorIcon" placeholder="请输入专业图标" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学制(年)" label-width="auto" path="schoolingYears" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolingYears" placeholder="请输入学制(年)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="所属一级学科" label-width="auto" path="disciplinePrimary" class="pr-24px">
|
||||
<NInput v-model:value="model.disciplinePrimary" placeholder="请输入所属一级学科" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="所属二级学科" label-width="auto" path="disciplineSecondary" class="pr-24px">
|
||||
<NInput v-model:value="model.disciplineSecondary" placeholder="请输入所属二级学科" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="授予学士学位" label-width="auto" path="degreeAwarded" class="pr-24px">
|
||||
<NInput v-model:value="model.degreeAwarded" placeholder="请输入授予学士学位" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业概括" label-width="auto" path="summary" class="pr-24px">
|
||||
<NInput v-model:value="model.summary" placeholder="请输入专业概括" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="培养方向" label-width="auto" path="trainingDirection" class="pr-24px">
|
||||
<NInput v-model:value="model.trainingDirection" placeholder="请输入培养方向" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="主要课程" label-width="auto" path="coreCourses" class="pr-24px">
|
||||
<NInput v-model:value="model.coreCourses" placeholder="请输入主要课程" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi :show-feedback="false" span="24" class="pr-24px">
|
||||
<NSpace class="w-full" justify="end">
|
||||
<NButton @click="reset">
|
||||
<template #icon>
|
||||
<icon-ic-round-refresh class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.reset') }}
|
||||
</NButton>
|
||||
<NButton type="primary" ghost @click="search">
|
||||
<template #icon>
|
||||
<icon-ic-round-search class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.search') }}
|
||||
</NButton>
|
||||
</NSpace>
|
||||
</NFormItemGi>
|
||||
</NGrid>
|
||||
</NForm>
|
||||
</NCollapseItem>
|
||||
</NCollapse>
|
||||
</NCard>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,360 @@
|
|||
<script setup lang="tsx">
|
||||
import { ref } from 'vue';
|
||||
import { NDivider } from 'naive-ui';
|
||||
import { fetchBatchDeleteSchoolRecruitMajorHistory, fetchGetSchoolRecruitMajorHistoryList } from '@/service/api/art/school-recruit-major-history';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useAuth } from '@/hooks/business/auth';
|
||||
import { useDownload } from '@/hooks/business/download';
|
||||
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
|
||||
import { $t } from '@/locales';
|
||||
import ButtonIcon from '@/components/custom/button-icon.vue';
|
||||
import SchoolRecruitMajorHistoryOperateDrawer from './modules/school-recruit-major-history-operate-drawer.vue';
|
||||
import SchoolRecruitMajorHistorySearch from './modules/school-recruit-major-history-search.vue';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorHistoryList'
|
||||
});
|
||||
|
||||
|
||||
const appStore = useAppStore();
|
||||
const { download } = useDownload();
|
||||
const { hasAuth } = useAuth();
|
||||
|
||||
const searchParams = ref<Api.Art.SchoolRecruitMajorHistorySearchParams>({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
recruitMajorId: null,
|
||||
schoolId: null,
|
||||
schoolCode: null,
|
||||
collegeCode: null,
|
||||
schoolName: null,
|
||||
majorId: null,
|
||||
majorCode: null,
|
||||
majorName: null,
|
||||
enrollCode: null,
|
||||
majorType: null,
|
||||
majorTypeSub: null,
|
||||
mainExamSubject: null,
|
||||
year: null,
|
||||
subjectType: null,
|
||||
batchName: null,
|
||||
admissionFormula: null,
|
||||
probabilityOperator: null,
|
||||
controlScore: null,
|
||||
admissionScore: null,
|
||||
planEnroll: null,
|
||||
filedAmount: null,
|
||||
admitAmount: null,
|
||||
firstChoiceAdmitAmount: null,
|
||||
minScoreDiff: null,
|
||||
tuitionFee: null,
|
||||
params: {}
|
||||
});
|
||||
|
||||
const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } =
|
||||
useNaivePaginatedTable({
|
||||
api: () => fetchGetSchoolRecruitMajorHistoryList(searchParams.value),
|
||||
transform: response => defaultTransform(response),
|
||||
onPaginationParamsChange: params => {
|
||||
searchParams.value.pageNum = params.page;
|
||||
searchParams.value.pageSize = params.pageSize;
|
||||
},
|
||||
columns: () => [
|
||||
{
|
||||
type: 'selection',
|
||||
align: 'center',
|
||||
width: 48
|
||||
},
|
||||
{
|
||||
key: 'index',
|
||||
title: $t('common.index'),
|
||||
align: 'center',
|
||||
width: 64,
|
||||
render: (_, index) => index + 1
|
||||
},
|
||||
{
|
||||
key: 'historyId',
|
||||
title: '历年录取数据ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'recruitMajorId',
|
||||
title: '对应招录专业ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolId',
|
||||
title: '学校ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolCode',
|
||||
title: '学校代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'collegeCode',
|
||||
title: '院校代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolName',
|
||||
title: '学校名称',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorId',
|
||||
title: '专业ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorCode',
|
||||
title: '专业代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorName',
|
||||
title: '专业名称',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'enrollCode',
|
||||
title: '招生代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorType',
|
||||
title: '专业类型',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorTypeSub',
|
||||
title: '专业类别子级',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'mainExamSubject',
|
||||
title: '主考科目',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'year',
|
||||
title: '年份',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'subjectType',
|
||||
title: '科类(文/理)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'batchName',
|
||||
title: '批次',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionFormula',
|
||||
title: '录取方式(文*x+专*y)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'probabilityOperator',
|
||||
title: '录取概率规则运算符',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'controlScore',
|
||||
title: '省控线',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionScore',
|
||||
title: '录取线',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'planEnroll',
|
||||
title: '招生人数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'filedAmount',
|
||||
title: '实际投档人数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admitAmount',
|
||||
title: '录取数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'firstChoiceAdmitAmount',
|
||||
title: '一志愿录取数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'minScoreDiff',
|
||||
title: '最低分数差',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'tuitionFee',
|
||||
title: '学费(元/年)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'operate',
|
||||
title: $t('common.operate'),
|
||||
align: 'center',
|
||||
width: 130,
|
||||
render: row => {
|
||||
const divider = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajorHistory:edit') || !hasAuth('art:schoolRecruitMajorHistory:remove')) {
|
||||
return null;
|
||||
}
|
||||
return <NDivider vertical />;
|
||||
};
|
||||
|
||||
const editBtn = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajorHistory:edit')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="primary"
|
||||
icon="material-symbols:drive-file-rename-outline-outline"
|
||||
tooltipContent={$t('common.edit')}
|
||||
onClick={() => edit(row.historyId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const deleteBtn = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajorHistory:remove')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="error"
|
||||
icon="material-symbols:delete-outline"
|
||||
tooltipContent={$t('common.delete')}
|
||||
popconfirmContent={$t('common.confirmDelete')}
|
||||
onPositiveClick={() => handleDelete(row.historyId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div class="flex-center gap-8px">
|
||||
{editBtn()}
|
||||
{divider()}
|
||||
{deleteBtn()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } =
|
||||
useTableOperate(data, 'historyId', getData);
|
||||
|
||||
async function handleBatchDelete() {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteSchoolRecruitMajorHistory(checkedRowKeys.value);
|
||||
if (error) return;
|
||||
onBatchDeleted();
|
||||
}
|
||||
|
||||
async function handleDelete(historyId: CommonType.IdType) {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteSchoolRecruitMajorHistory([historyId]);
|
||||
if (error) return;
|
||||
onDeleted();
|
||||
}
|
||||
|
||||
function edit(historyId: CommonType.IdType) {
|
||||
handleEdit(historyId);
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
download('/art/schoolRecruitMajorHistory/export', searchParams.value, `院校招录专业历年录取数据_${new Date().getTime()}.xlsx`);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
|
||||
<SchoolRecruitMajorHistorySearch v-model:model="searchParams" @search="getDataByPage" />
|
||||
<NCard title="院校招录专业历年录取数据列表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
|
||||
<template #header-extra>
|
||||
<TableHeaderOperation
|
||||
v-model:columns="columnChecks"
|
||||
:disabled-delete="checkedRowKeys.length === 0"
|
||||
:loading="loading"
|
||||
:show-add="hasAuth('art:schoolRecruitMajorHistory:add')"
|
||||
:show-delete="hasAuth('art:schoolRecruitMajorHistory:remove')"
|
||||
:show-export="hasAuth('art:schoolRecruitMajorHistory:export')"
|
||||
@add="handleAdd"
|
||||
@delete="handleBatchDelete"
|
||||
@export="handleExport"
|
||||
@refresh="getData"
|
||||
/>
|
||||
</template>
|
||||
<NDataTable
|
||||
v-model:checked-row-keys="checkedRowKeys"
|
||||
:columns="columns"
|
||||
:data="data"
|
||||
size="small"
|
||||
:flex-height="!appStore.isMobile"
|
||||
:scroll-x="scrollX"
|
||||
:loading="loading"
|
||||
remote
|
||||
:row-key="row => row.historyId"
|
||||
:pagination="mobilePagination"
|
||||
class="sm:h-full"
|
||||
/>
|
||||
<SchoolRecruitMajorHistoryOperateDrawer
|
||||
v-model:visible="drawerVisible"
|
||||
:operate-type="operateType"
|
||||
:row-data="editingData"
|
||||
@submitted="getDataByPage"
|
||||
/>
|
||||
</NCard>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,255 @@
|
|||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { fetchCreateSchoolRecruitMajorHistory, fetchUpdateSchoolRecruitMajorHistory } from '@/service/api/art/school-recruit-major-history';
|
||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorHistoryOperateDrawer'
|
||||
});
|
||||
|
||||
interface Props {
|
||||
/** the type of operation */
|
||||
operateType: NaiveUI.TableOperateType;
|
||||
/** the edit row data */
|
||||
rowData?: Api.Art.SchoolRecruitMajorHistory | null;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
interface Emits {
|
||||
(e: 'submitted'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const visible = defineModel<boolean>('visible', {
|
||||
default: false
|
||||
});
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
const { createRequiredRule } = useFormRules();
|
||||
|
||||
const title = computed(() => {
|
||||
const titles: Record<NaiveUI.TableOperateType, string> = {
|
||||
add: '新增院校招录专业历年录取数据',
|
||||
edit: '编辑院校招录专业历年录取数据'
|
||||
};
|
||||
return titles[props.operateType];
|
||||
});
|
||||
|
||||
type Model = Api.Art.SchoolRecruitMajorHistoryOperateParams;
|
||||
|
||||
const model = ref<Model>(createDefaultModel());
|
||||
|
||||
function createDefaultModel(): Model {
|
||||
return {
|
||||
historyId: null,
|
||||
recruitMajorId: null,
|
||||
schoolId: null,
|
||||
schoolCode: '',
|
||||
collegeCode: '',
|
||||
schoolName: '',
|
||||
majorId: null,
|
||||
majorCode: '',
|
||||
majorName: '',
|
||||
enrollCode: '',
|
||||
majorType: '',
|
||||
majorTypeSub: '',
|
||||
mainExamSubject: '',
|
||||
year: null,
|
||||
subjectType: '',
|
||||
batchName: '',
|
||||
admissionFormula: '',
|
||||
probabilityOperator: '',
|
||||
controlScore: null,
|
||||
admissionScore: null,
|
||||
planEnroll: null,
|
||||
filedAmount: null,
|
||||
admitAmount: null,
|
||||
firstChoiceAdmitAmount: null,
|
||||
minScoreDiff: null,
|
||||
tuitionFee: null,
|
||||
remark: '',
|
||||
};
|
||||
}
|
||||
|
||||
type RuleKey = Extract<
|
||||
keyof Model,
|
||||
| 'historyId'
|
||||
| 'tenantId'
|
||||
| 'delFlag'
|
||||
| 'recruitMajorId'
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'schoolName'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'year'
|
||||
>;
|
||||
|
||||
const rules: Record<RuleKey, App.Global.FormRule> = {
|
||||
historyId: createRequiredRule('历年录取数据ID不能为空'),
|
||||
tenantId: createRequiredRule('租户编号不能为空'),
|
||||
delFlag: createRequiredRule('删除标志(0存在 1删除)不能为空'),
|
||||
recruitMajorId: createRequiredRule('对应招录专业ID不能为空'),
|
||||
schoolId: createRequiredRule('学校ID不能为空'),
|
||||
schoolCode: createRequiredRule('学校代码不能为空'),
|
||||
schoolName: createRequiredRule('学校名称不能为空'),
|
||||
majorCode: createRequiredRule('专业代码不能为空'),
|
||||
majorName: createRequiredRule('专业名称不能为空'),
|
||||
year: createRequiredRule('年份不能为空'),
|
||||
};
|
||||
|
||||
function handleUpdateModelWhenEdit() {
|
||||
model.value = createDefaultModel();
|
||||
|
||||
if (props.operateType === 'edit' && props.rowData) {
|
||||
Object.assign(model.value, jsonClone(props.rowData));
|
||||
}
|
||||
}
|
||||
|
||||
function closeDrawer() {
|
||||
visible.value = false;
|
||||
}
|
||||
|
||||
async function handleSubmit() {
|
||||
await validate();
|
||||
|
||||
const { historyId, recruitMajorId, schoolId, schoolCode, collegeCode, schoolName, majorId, majorCode, majorName, enrollCode, majorType, majorTypeSub, mainExamSubject, year, subjectType, batchName, admissionFormula, probabilityOperator, controlScore, admissionScore, planEnroll, filedAmount, admitAmount, firstChoiceAdmitAmount, minScoreDiff, tuitionFee, remark } = model.value;
|
||||
|
||||
// request
|
||||
if (props.operateType === 'add') {
|
||||
const { error } = await fetchCreateSchoolRecruitMajorHistory({ recruitMajorId, schoolId, schoolCode, collegeCode, schoolName, majorId, majorCode, majorName, enrollCode, majorType, majorTypeSub, mainExamSubject, year, subjectType, batchName, admissionFormula, probabilityOperator, controlScore, admissionScore, planEnroll, filedAmount, admitAmount, firstChoiceAdmitAmount, minScoreDiff, tuitionFee, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
if (props.operateType === 'edit') {
|
||||
const { error } = await fetchUpdateSchoolRecruitMajorHistory({ historyId, recruitMajorId, schoolId, schoolCode, collegeCode, schoolName, majorId, majorCode, majorName, enrollCode, majorType, majorTypeSub, mainExamSubject, year, subjectType, batchName, admissionFormula, probabilityOperator, controlScore, admissionScore, planEnroll, filedAmount, admitAmount, firstChoiceAdmitAmount, minScoreDiff, tuitionFee, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
window.$message?.success($t('common.updateSuccess'));
|
||||
closeDrawer();
|
||||
emit('submitted');
|
||||
}
|
||||
|
||||
watch(visible, () => {
|
||||
if (visible.value) {
|
||||
handleUpdateModelWhenEdit();
|
||||
restoreValidation();
|
||||
getTreeList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
|
||||
<NDrawerContent :title="title" :native-scrollbar="false" closable>
|
||||
<NForm ref="formRef" :model="model" :rules="rules">
|
||||
<NFormItem label="对应招录专业ID" path="recruitMajorId">
|
||||
<NInput v-model:value="model.recruitMajorId" placeholder="请输入对应招录专业ID" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学校ID" path="schoolId">
|
||||
<NInput v-model:value="model.schoolId" placeholder="请输入学校ID" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学校代码" path="schoolCode">
|
||||
<NInput v-model:value="model.schoolCode" placeholder="请输入学校代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="院校代码" path="collegeCode">
|
||||
<NInput v-model:value="model.collegeCode" placeholder="请输入院校代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学校名称" path="schoolName">
|
||||
<NInput v-model:value="model.schoolName" placeholder="请输入学校名称" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业ID" path="majorId">
|
||||
<NInput v-model:value="model.majorId" placeholder="请输入专业ID" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业代码" path="majorCode">
|
||||
<NInput v-model:value="model.majorCode" placeholder="请输入专业代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业名称" path="majorName">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItem>
|
||||
<NFormItem label="招生代码" path="enrollCode">
|
||||
<NInput v-model:value="model.enrollCode" placeholder="请输入招生代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业类型" path="majorType">
|
||||
<NSelect
|
||||
v-model:value="model.majorType"
|
||||
placeholder="请选择专业类型"
|
||||
:options="[{ value: '0', label: '请选择字典生成' }]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="专业类别子级" path="majorTypeSub">
|
||||
<NInput v-model:value="model.majorTypeSub" placeholder="请输入专业类别子级" />
|
||||
</NFormItem>
|
||||
<NFormItem label="主考科目" path="mainExamSubject">
|
||||
<NInput v-model:value="model.mainExamSubject" placeholder="请输入主考科目" />
|
||||
</NFormItem>
|
||||
<NFormItem label="年份" path="year">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItem>
|
||||
<NFormItem label="科类(文/理)" path="subjectType">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[{ value: '0', label: '请选择字典生成' }]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="批次" path="batchName">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItem>
|
||||
<NFormItem label="录取方式(文*x+专*y)" path="admissionFormula">
|
||||
<NInput v-model:value="model.admissionFormula" placeholder="请输入录取方式(文*x+专*y)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="录取概率规则运算符" path="probabilityOperator">
|
||||
<NInput v-model:value="model.probabilityOperator" placeholder="请输入录取概率规则运算符" />
|
||||
</NFormItem>
|
||||
<NFormItem label="省控线" path="controlScore">
|
||||
<NInput v-model:value="model.controlScore" placeholder="请输入省控线" />
|
||||
</NFormItem>
|
||||
<NFormItem label="录取线" path="admissionScore">
|
||||
<NInput v-model:value="model.admissionScore" placeholder="请输入录取线" />
|
||||
</NFormItem>
|
||||
<NFormItem label="招生人数" path="planEnroll">
|
||||
<NInput v-model:value="model.planEnroll" placeholder="请输入招生人数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="实际投档人数" path="filedAmount">
|
||||
<NInput v-model:value="model.filedAmount" placeholder="请输入实际投档人数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="录取数" path="admitAmount">
|
||||
<NInput v-model:value="model.admitAmount" placeholder="请输入录取数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="一志愿录取数" path="firstChoiceAdmitAmount">
|
||||
<NInput v-model:value="model.firstChoiceAdmitAmount" placeholder="请输入一志愿录取数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="最低分数差" path="minScoreDiff">
|
||||
<NInput v-model:value="model.minScoreDiff" placeholder="请输入最低分数差" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学费(元/年)" path="tuitionFee">
|
||||
<NInput v-model:value="model.tuitionFee" placeholder="请输入学费(元/年)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="备注" path="remark">
|
||||
<NInput
|
||||
v-model:value="model.remark"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入备注"
|
||||
/>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
<template #footer>
|
||||
<NSpace :size="16">
|
||||
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
|
||||
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
|
||||
</NSpace>
|
||||
</template>
|
||||
</NDrawerContent>
|
||||
</NDrawer>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
<script setup lang="ts">
|
||||
import { toRaw } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorHistorySearch'
|
||||
});
|
||||
|
||||
interface Emits {
|
||||
(e: 'search'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
|
||||
const model = defineModel<Api.Art.SchoolRecruitMajorHistorySearchParams>('model', { required: true });
|
||||
|
||||
const defaultModel = jsonClone(toRaw(model.value));
|
||||
|
||||
function resetModel() {
|
||||
Object.assign(model.value, defaultModel);
|
||||
}
|
||||
|
||||
async function reset() {
|
||||
await restoreValidation();
|
||||
resetModel();
|
||||
emit('search');
|
||||
}
|
||||
|
||||
async function search() {
|
||||
await validate();
|
||||
emit('search');
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NCard :bordered="false" size="small" class="card-wrapper">
|
||||
<NCollapse>
|
||||
<NCollapseItem :title="$t('common.search')" name="art-school-recruit-major-history-search">
|
||||
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
|
||||
<NGrid responsive="screen" item-responsive>
|
||||
<NFormItemGi span="24 s:12 m:6" label="对应招录专业ID" label-width="auto" path="recruitMajorId" class="pr-24px">
|
||||
<NInput v-model:value="model.recruitMajorId" placeholder="请输入对应招录专业ID" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校ID" label-width="auto" path="schoolId" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolId" placeholder="请输入学校ID" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校代码" label-width="auto" path="schoolCode" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolCode" placeholder="请输入学校代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="院校代码" label-width="auto" path="collegeCode" class="pr-24px">
|
||||
<NInput v-model:value="model.collegeCode" placeholder="请输入院校代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校名称" label-width="auto" path="schoolName" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolName" placeholder="请输入学校名称" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业ID" label-width="auto" path="majorId" class="pr-24px">
|
||||
<NInput v-model:value="model.majorId" placeholder="请输入专业ID" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业代码" label-width="auto" path="majorCode" class="pr-24px">
|
||||
<NInput v-model:value="model.majorCode" placeholder="请输入专业代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业名称" label-width="auto" path="majorName" class="pr-24px">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="招生代码" label-width="auto" path="enrollCode" class="pr-24px">
|
||||
<NInput v-model:value="model.enrollCode" placeholder="请输入招生代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业类型" label-width="auto" path="majorType" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.majorType"
|
||||
placeholder="请选择专业类型"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业类别子级" label-width="auto" path="majorTypeSub" class="pr-24px">
|
||||
<NInput v-model:value="model.majorTypeSub" placeholder="请输入专业类别子级" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="主考科目" label-width="auto" path="mainExamSubject" class="pr-24px">
|
||||
<NInput v-model:value="model.mainExamSubject" placeholder="请输入主考科目" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="年份" label-width="auto" path="year" class="pr-24px">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="科类(文/理)" label-width="auto" path="subjectType" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="批次" label-width="auto" path="batchName" class="pr-24px">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="录取方式(文*x+专*y)" label-width="auto" path="admissionFormula" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionFormula" placeholder="请输入录取方式(文*x+专*y)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="录取概率规则运算符" label-width="auto" path="probabilityOperator" class="pr-24px">
|
||||
<NInput v-model:value="model.probabilityOperator" placeholder="请输入录取概率规则运算符" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="省控线" label-width="auto" path="controlScore" class="pr-24px">
|
||||
<NInput v-model:value="model.controlScore" placeholder="请输入省控线" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="录取线" label-width="auto" path="admissionScore" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionScore" placeholder="请输入录取线" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="招生人数" label-width="auto" path="planEnroll" class="pr-24px">
|
||||
<NInput v-model:value="model.planEnroll" placeholder="请输入招生人数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="实际投档人数" label-width="auto" path="filedAmount" class="pr-24px">
|
||||
<NInput v-model:value="model.filedAmount" placeholder="请输入实际投档人数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="录取数" label-width="auto" path="admitAmount" class="pr-24px">
|
||||
<NInput v-model:value="model.admitAmount" placeholder="请输入录取数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="一志愿录取数" label-width="auto" path="firstChoiceAdmitAmount" class="pr-24px">
|
||||
<NInput v-model:value="model.firstChoiceAdmitAmount" placeholder="请输入一志愿录取数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="最低分数差" label-width="auto" path="minScoreDiff" class="pr-24px">
|
||||
<NInput v-model:value="model.minScoreDiff" placeholder="请输入最低分数差" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学费(元/年)" label-width="auto" path="tuitionFee" class="pr-24px">
|
||||
<NInput v-model:value="model.tuitionFee" placeholder="请输入学费(元/年)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi :show-feedback="false" span="24" class="pr-24px">
|
||||
<NSpace class="w-full" justify="end">
|
||||
<NButton @click="reset">
|
||||
<template #icon>
|
||||
<icon-ic-round-refresh class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.reset') }}
|
||||
</NButton>
|
||||
<NButton type="primary" ghost @click="search">
|
||||
<template #icon>
|
||||
<icon-ic-round-search class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.search') }}
|
||||
</NButton>
|
||||
</NSpace>
|
||||
</NFormItemGi>
|
||||
</NGrid>
|
||||
</NForm>
|
||||
</NCollapseItem>
|
||||
</NCollapse>
|
||||
</NCard>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,374 @@
|
|||
<script setup lang="tsx">
|
||||
import { ref } from 'vue';
|
||||
import { NDivider } from 'naive-ui';
|
||||
import { fetchBatchDeleteSchoolRecruitMajor, fetchGetSchoolRecruitMajorList } from '@/service/api/art/school-recruit-major';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import { useAuth } from '@/hooks/business/auth';
|
||||
import { useDownload } from '@/hooks/business/download';
|
||||
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table';
|
||||
import { $t } from '@/locales';
|
||||
import ButtonIcon from '@/components/custom/button-icon.vue';
|
||||
import SchoolRecruitMajorOperateDrawer from './modules/school-recruit-major-operate-drawer.vue';
|
||||
import SchoolRecruitMajorSearch from './modules/school-recruit-major-search.vue';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorList'
|
||||
});
|
||||
|
||||
|
||||
const appStore = useAppStore();
|
||||
const { download } = useDownload();
|
||||
const { hasAuth } = useAuth();
|
||||
|
||||
const searchParams = ref<Api.Art.SchoolRecruitMajorSearchParams>({
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
schoolId: null,
|
||||
schoolCode: null,
|
||||
schoolName: null,
|
||||
year: null,
|
||||
majorId: null,
|
||||
majorCode: null,
|
||||
majorName: null,
|
||||
enrollCode: null,
|
||||
dataStatus: null,
|
||||
batchName: null,
|
||||
majorType: null,
|
||||
majorTypeSub: null,
|
||||
subjectType: null,
|
||||
admissionWayShort: null,
|
||||
admissionWayExternal: null,
|
||||
admissionWayExternalOp: null,
|
||||
admissionWayInternal: null,
|
||||
admissionWayInternalOp: null,
|
||||
planEnroll: null,
|
||||
mainExamSubject: null,
|
||||
schoolingYears: null,
|
||||
enrollLimitDesc: null,
|
||||
tuitionFee: null,
|
||||
cultureScoreLimit: null,
|
||||
majorScoreLimit: null,
|
||||
chineseScoreLimit: null,
|
||||
englishScoreLimit: null,
|
||||
params: {}
|
||||
});
|
||||
|
||||
const { columns, columnChecks, data, getData, getDataByPage, loading, mobilePagination, scrollX } =
|
||||
useNaivePaginatedTable({
|
||||
api: () => fetchGetSchoolRecruitMajorList(searchParams.value),
|
||||
transform: response => defaultTransform(response),
|
||||
onPaginationParamsChange: params => {
|
||||
searchParams.value.pageNum = params.page;
|
||||
searchParams.value.pageSize = params.pageSize;
|
||||
},
|
||||
columns: () => [
|
||||
{
|
||||
type: 'selection',
|
||||
align: 'center',
|
||||
width: 48
|
||||
},
|
||||
{
|
||||
key: 'index',
|
||||
title: $t('common.index'),
|
||||
align: 'center',
|
||||
width: 64,
|
||||
render: (_, index) => index + 1
|
||||
},
|
||||
{
|
||||
key: 'recruitMajorId',
|
||||
title: '院校招录专业ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolId',
|
||||
title: '学校ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolCode',
|
||||
title: '学校代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolName',
|
||||
title: '学校名称(冗余)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'year',
|
||||
title: '年份',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorId',
|
||||
title: '专业ID',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorCode',
|
||||
title: '专业代码',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorName',
|
||||
title: '专业名称',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'enrollCode',
|
||||
title: '招生代码(为空则存空串)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'dataStatus',
|
||||
title: '数据状态(停招/新招/新增)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'batchName',
|
||||
title: '批次',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorType',
|
||||
title: '专业类型',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorTypeSub',
|
||||
title: '二级专业类型',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'subjectType',
|
||||
title: '科类(文/理)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionWayShort',
|
||||
title: '录取方式缩写',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionWayExternal',
|
||||
title: '对外录取方式',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionWayExternalOp',
|
||||
title: '对外录取方式运算符',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionWayInternal',
|
||||
title: '内部录取方式',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'admissionWayInternalOp',
|
||||
title: '内部录取方式运算符',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'planEnroll',
|
||||
title: '计划招生人数',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'mainExamSubject',
|
||||
title: '主考科目',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'schoolingYears',
|
||||
title: '学制(年)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'enrollLimitDesc',
|
||||
title: '院校限制说明',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'tuitionFee',
|
||||
title: '学费(元/年)',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'cultureScoreLimit',
|
||||
title: '文化分数限制',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'majorScoreLimit',
|
||||
title: '专业分数限制',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'chineseScoreLimit',
|
||||
title: '语文成绩限制',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'englishScoreLimit',
|
||||
title: '英语成绩限制',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'remark',
|
||||
title: '备注',
|
||||
align: 'center',
|
||||
minWidth: 120
|
||||
},
|
||||
{
|
||||
key: 'operate',
|
||||
title: $t('common.operate'),
|
||||
align: 'center',
|
||||
width: 130,
|
||||
render: row => {
|
||||
const divider = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajor:edit') || !hasAuth('art:schoolRecruitMajor:remove')) {
|
||||
return null;
|
||||
}
|
||||
return <NDivider vertical />;
|
||||
};
|
||||
|
||||
const editBtn = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajor:edit')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="primary"
|
||||
icon="material-symbols:drive-file-rename-outline-outline"
|
||||
tooltipContent={$t('common.edit')}
|
||||
onClick={() => edit(row.recruitMajorId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
const deleteBtn = () => {
|
||||
if (!hasAuth('art:schoolRecruitMajor:remove')) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ButtonIcon
|
||||
text
|
||||
type="error"
|
||||
icon="material-symbols:delete-outline"
|
||||
tooltipContent={$t('common.delete')}
|
||||
popconfirmContent={$t('common.confirmDelete')}
|
||||
onPositiveClick={() => handleDelete(row.recruitMajorId)}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div class="flex-center gap-8px">
|
||||
{editBtn()}
|
||||
{divider()}
|
||||
{deleteBtn()}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
const { drawerVisible, operateType, editingData, handleAdd, handleEdit, checkedRowKeys, onBatchDeleted, onDeleted } =
|
||||
useTableOperate(data, 'recruitMajorId', getData);
|
||||
|
||||
async function handleBatchDelete() {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteSchoolRecruitMajor(checkedRowKeys.value);
|
||||
if (error) return;
|
||||
onBatchDeleted();
|
||||
}
|
||||
|
||||
async function handleDelete(recruitMajorId: CommonType.IdType) {
|
||||
// request
|
||||
const { error } = await fetchBatchDeleteSchoolRecruitMajor([recruitMajorId]);
|
||||
if (error) return;
|
||||
onDeleted();
|
||||
}
|
||||
|
||||
function edit(recruitMajorId: CommonType.IdType) {
|
||||
handleEdit(recruitMajorId);
|
||||
}
|
||||
|
||||
function handleExport() {
|
||||
download('/art/schoolRecruitMajor/export', searchParams.value, `院校招录专业_${new Date().getTime()}.xlsx`);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-500px flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
|
||||
<SchoolRecruitMajorSearch v-model:model="searchParams" @search="getDataByPage" />
|
||||
<NCard title="院校招录专业列表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
|
||||
<template #header-extra>
|
||||
<TableHeaderOperation
|
||||
v-model:columns="columnChecks"
|
||||
:disabled-delete="checkedRowKeys.length === 0"
|
||||
:loading="loading"
|
||||
:show-add="hasAuth('art:schoolRecruitMajor:add')"
|
||||
:show-delete="hasAuth('art:schoolRecruitMajor:remove')"
|
||||
:show-export="hasAuth('art:schoolRecruitMajor:export')"
|
||||
@add="handleAdd"
|
||||
@delete="handleBatchDelete"
|
||||
@export="handleExport"
|
||||
@refresh="getData"
|
||||
/>
|
||||
</template>
|
||||
<NDataTable
|
||||
v-model:checked-row-keys="checkedRowKeys"
|
||||
:columns="columns"
|
||||
:data="data"
|
||||
size="small"
|
||||
:flex-height="!appStore.isMobile"
|
||||
:scroll-x="scrollX"
|
||||
:loading="loading"
|
||||
remote
|
||||
:row-key="row => row.recruitMajorId"
|
||||
:pagination="mobilePagination"
|
||||
class="sm:h-full"
|
||||
/>
|
||||
<SchoolRecruitMajorOperateDrawer
|
||||
v-model:visible="drawerVisible"
|
||||
:operate-type="operateType"
|
||||
:row-data="editingData"
|
||||
@submitted="getDataByPage"
|
||||
/>
|
||||
</NCard>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,274 @@
|
|||
<script setup lang="ts">
|
||||
import { computed, ref, watch } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { fetchCreateSchoolRecruitMajor, fetchUpdateSchoolRecruitMajor } from '@/service/api/art/school-recruit-major';
|
||||
import { useFormRules, useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorOperateDrawer'
|
||||
});
|
||||
|
||||
interface Props {
|
||||
/** the type of operation */
|
||||
operateType: NaiveUI.TableOperateType;
|
||||
/** the edit row data */
|
||||
rowData?: Api.Art.SchoolRecruitMajor | null;
|
||||
}
|
||||
|
||||
const props = defineProps<Props>();
|
||||
|
||||
interface Emits {
|
||||
(e: 'submitted'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const visible = defineModel<boolean>('visible', {
|
||||
default: false
|
||||
});
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
const { createRequiredRule } = useFormRules();
|
||||
|
||||
const title = computed(() => {
|
||||
const titles: Record<NaiveUI.TableOperateType, string> = {
|
||||
add: '新增院校招录专业',
|
||||
edit: '编辑院校招录专业'
|
||||
};
|
||||
return titles[props.operateType];
|
||||
});
|
||||
|
||||
type Model = Api.Art.SchoolRecruitMajorOperateParams;
|
||||
|
||||
const model = ref<Model>(createDefaultModel());
|
||||
|
||||
function createDefaultModel(): Model {
|
||||
return {
|
||||
recruitMajorId: null,
|
||||
schoolId: null,
|
||||
schoolCode: '',
|
||||
schoolName: '',
|
||||
year: null,
|
||||
majorId: null,
|
||||
majorCode: '',
|
||||
majorName: '',
|
||||
enrollCode: '',
|
||||
dataStatus: '',
|
||||
batchName: '',
|
||||
majorType: '',
|
||||
majorTypeSub: '',
|
||||
subjectType: '',
|
||||
admissionWayShort: '',
|
||||
admissionWayExternal: '',
|
||||
admissionWayExternalOp: '',
|
||||
admissionWayInternal: '',
|
||||
admissionWayInternalOp: '',
|
||||
planEnroll: null,
|
||||
mainExamSubject: '',
|
||||
schoolingYears: null,
|
||||
enrollLimitDesc: '',
|
||||
tuitionFee: null,
|
||||
cultureScoreLimit: null,
|
||||
majorScoreLimit: null,
|
||||
chineseScoreLimit: null,
|
||||
englishScoreLimit: null,
|
||||
remark: '',
|
||||
};
|
||||
}
|
||||
|
||||
type RuleKey = Extract<
|
||||
keyof Model,
|
||||
| 'recruitMajorId'
|
||||
| 'tenantId'
|
||||
| 'delFlag'
|
||||
| 'schoolId'
|
||||
| 'schoolCode'
|
||||
| 'schoolName'
|
||||
| 'year'
|
||||
| 'majorCode'
|
||||
| 'majorName'
|
||||
| 'enrollCode'
|
||||
| 'dataStatus'
|
||||
>;
|
||||
|
||||
const rules: Record<RuleKey, App.Global.FormRule> = {
|
||||
recruitMajorId: createRequiredRule('院校招录专业ID不能为空'),
|
||||
tenantId: createRequiredRule('租户编号不能为空'),
|
||||
delFlag: createRequiredRule('删除标志(0存在 1删除)不能为空'),
|
||||
schoolId: createRequiredRule('学校ID不能为空'),
|
||||
schoolCode: createRequiredRule('学校代码不能为空'),
|
||||
schoolName: createRequiredRule('学校名称(冗余)不能为空'),
|
||||
year: createRequiredRule('年份不能为空'),
|
||||
majorCode: createRequiredRule('专业代码不能为空'),
|
||||
majorName: createRequiredRule('专业名称不能为空'),
|
||||
enrollCode: createRequiredRule('招生代码(为空则存空串)不能为空'),
|
||||
dataStatus: createRequiredRule('数据状态(停招/新招/新增)不能为空'),
|
||||
};
|
||||
|
||||
function handleUpdateModelWhenEdit() {
|
||||
model.value = createDefaultModel();
|
||||
|
||||
if (props.operateType === 'edit' && props.rowData) {
|
||||
Object.assign(model.value, jsonClone(props.rowData));
|
||||
}
|
||||
}
|
||||
|
||||
function closeDrawer() {
|
||||
visible.value = false;
|
||||
}
|
||||
|
||||
async function handleSubmit() {
|
||||
await validate();
|
||||
|
||||
const { recruitMajorId, schoolId, schoolCode, schoolName, year, majorId, majorCode, majorName, enrollCode, dataStatus, batchName, majorType, majorTypeSub, subjectType, admissionWayShort, admissionWayExternal, admissionWayExternalOp, admissionWayInternal, admissionWayInternalOp, planEnroll, mainExamSubject, schoolingYears, enrollLimitDesc, tuitionFee, cultureScoreLimit, majorScoreLimit, chineseScoreLimit, englishScoreLimit, remark } = model.value;
|
||||
|
||||
// request
|
||||
if (props.operateType === 'add') {
|
||||
const { error } = await fetchCreateSchoolRecruitMajor({ schoolId, schoolCode, schoolName, year, majorId, majorCode, majorName, enrollCode, dataStatus, batchName, majorType, majorTypeSub, subjectType, admissionWayShort, admissionWayExternal, admissionWayExternalOp, admissionWayInternal, admissionWayInternalOp, planEnroll, mainExamSubject, schoolingYears, enrollLimitDesc, tuitionFee, cultureScoreLimit, majorScoreLimit, chineseScoreLimit, englishScoreLimit, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
if (props.operateType === 'edit') {
|
||||
const { error } = await fetchUpdateSchoolRecruitMajor({ recruitMajorId, schoolId, schoolCode, schoolName, year, majorId, majorCode, majorName, enrollCode, dataStatus, batchName, majorType, majorTypeSub, subjectType, admissionWayShort, admissionWayExternal, admissionWayExternalOp, admissionWayInternal, admissionWayInternalOp, planEnroll, mainExamSubject, schoolingYears, enrollLimitDesc, tuitionFee, cultureScoreLimit, majorScoreLimit, chineseScoreLimit, englishScoreLimit, remark });
|
||||
if (error) return;
|
||||
}
|
||||
|
||||
window.$message?.success($t('common.updateSuccess'));
|
||||
closeDrawer();
|
||||
emit('submitted');
|
||||
}
|
||||
|
||||
watch(visible, () => {
|
||||
if (visible.value) {
|
||||
handleUpdateModelWhenEdit();
|
||||
restoreValidation();
|
||||
getTreeList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NDrawer v-model:show="visible" :title="title" display-directive="show" :width="800" class="max-w-90%">
|
||||
<NDrawerContent :title="title" :native-scrollbar="false" closable>
|
||||
<NForm ref="formRef" :model="model" :rules="rules">
|
||||
<NFormItem label="学校ID" path="schoolId">
|
||||
<NInput v-model:value="model.schoolId" placeholder="请输入学校ID" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学校代码" path="schoolCode">
|
||||
<NInput v-model:value="model.schoolCode" placeholder="请输入学校代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学校名称(冗余)" path="schoolName">
|
||||
<NInput v-model:value="model.schoolName" placeholder="请输入学校名称(冗余)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="年份" path="year">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业ID" path="majorId">
|
||||
<NInput v-model:value="model.majorId" placeholder="请输入专业ID" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业代码" path="majorCode">
|
||||
<NInput v-model:value="model.majorCode" placeholder="请输入专业代码" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业名称" path="majorName">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItem>
|
||||
<NFormItem label="招生代码(为空则存空串)" path="enrollCode">
|
||||
<NInput v-model:value="model.enrollCode" placeholder="请输入招生代码(为空则存空串)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="数据状态(停招/新招/新增)" path="dataStatus">
|
||||
<NRadioGroup v-model:value="model.dataStatus">
|
||||
<NSpace>
|
||||
<NRadio value="0" label="请选择字典生成" />
|
||||
</NSpace>
|
||||
</NRadioGroup>
|
||||
</NFormItem>
|
||||
<NFormItem label="批次" path="batchName">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业类型" path="majorType">
|
||||
<NSelect
|
||||
v-model:value="model.majorType"
|
||||
placeholder="请选择专业类型"
|
||||
:options="[{ value: '0', label: '请选择字典生成' }]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="二级专业类型" path="majorTypeSub">
|
||||
<NInput v-model:value="model.majorTypeSub" placeholder="请输入二级专业类型" />
|
||||
</NFormItem>
|
||||
<NFormItem label="科类(文/理)" path="subjectType">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[{ value: '0', label: '请选择字典生成' }]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="录取方式缩写" path="admissionWayShort">
|
||||
<NInput v-model:value="model.admissionWayShort" placeholder="请输入录取方式缩写" />
|
||||
</NFormItem>
|
||||
<NFormItem label="对外录取方式" path="admissionWayExternal">
|
||||
<NInput v-model:value="model.admissionWayExternal" placeholder="请输入对外录取方式" />
|
||||
</NFormItem>
|
||||
<NFormItem label="对外录取方式运算符" path="admissionWayExternalOp">
|
||||
<NInput v-model:value="model.admissionWayExternalOp" placeholder="请输入对外录取方式运算符" />
|
||||
</NFormItem>
|
||||
<NFormItem label="内部录取方式" path="admissionWayInternal">
|
||||
<NInput v-model:value="model.admissionWayInternal" placeholder="请输入内部录取方式" />
|
||||
</NFormItem>
|
||||
<NFormItem label="内部录取方式运算符" path="admissionWayInternalOp">
|
||||
<NInput v-model:value="model.admissionWayInternalOp" placeholder="请输入内部录取方式运算符" />
|
||||
</NFormItem>
|
||||
<NFormItem label="计划招生人数" path="planEnroll">
|
||||
<NInput v-model:value="model.planEnroll" placeholder="请输入计划招生人数" />
|
||||
</NFormItem>
|
||||
<NFormItem label="主考科目" path="mainExamSubject">
|
||||
<NInput v-model:value="model.mainExamSubject" placeholder="请输入主考科目" />
|
||||
</NFormItem>
|
||||
<NFormItem label="学制(年)" path="schoolingYears">
|
||||
<NInput v-model:value="model.schoolingYears" placeholder="请输入学制(年)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="院校限制说明" path="enrollLimitDesc">
|
||||
<NInput
|
||||
v-model:value="model.enrollLimitDesc"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入院校限制说明"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NFormItem label="学费(元/年)" path="tuitionFee">
|
||||
<NInput v-model:value="model.tuitionFee" placeholder="请输入学费(元/年)" />
|
||||
</NFormItem>
|
||||
<NFormItem label="文化分数限制" path="cultureScoreLimit">
|
||||
<NInput v-model:value="model.cultureScoreLimit" placeholder="请输入文化分数限制" />
|
||||
</NFormItem>
|
||||
<NFormItem label="专业分数限制" path="majorScoreLimit">
|
||||
<NInput v-model:value="model.majorScoreLimit" placeholder="请输入专业分数限制" />
|
||||
</NFormItem>
|
||||
<NFormItem label="语文成绩限制" path="chineseScoreLimit">
|
||||
<NInput v-model:value="model.chineseScoreLimit" placeholder="请输入语文成绩限制" />
|
||||
</NFormItem>
|
||||
<NFormItem label="英语成绩限制" path="englishScoreLimit">
|
||||
<NInput v-model:value="model.englishScoreLimit" placeholder="请输入英语成绩限制" />
|
||||
</NFormItem>
|
||||
<NFormItem label="备注" path="remark">
|
||||
<NInput
|
||||
v-model:value="model.remark"
|
||||
:rows="3"
|
||||
type="textarea"
|
||||
placeholder="请输入备注"
|
||||
/>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
<template #footer>
|
||||
<NSpace :size="16">
|
||||
<NButton @click="closeDrawer">{{ $t('common.cancel') }}</NButton>
|
||||
<NButton type="primary" @click="handleSubmit">{{ $t('common.confirm') }}</NButton>
|
||||
</NSpace>
|
||||
</template>
|
||||
</NDrawerContent>
|
||||
</NDrawer>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
<script setup lang="ts">
|
||||
import { toRaw } from 'vue';
|
||||
import { jsonClone } from '@sa/utils';
|
||||
import { useNaiveForm } from '@/hooks/common/form';
|
||||
import { $t } from '@/locales';
|
||||
|
||||
defineOptions({
|
||||
name: 'SchoolRecruitMajorSearch'
|
||||
});
|
||||
|
||||
interface Emits {
|
||||
(e: 'search'): void;
|
||||
}
|
||||
|
||||
const emit = defineEmits<Emits>();
|
||||
|
||||
const { formRef, validate, restoreValidation } = useNaiveForm();
|
||||
|
||||
const model = defineModel<Api.Art.SchoolRecruitMajorSearchParams>('model', { required: true });
|
||||
|
||||
const defaultModel = jsonClone(toRaw(model.value));
|
||||
|
||||
function resetModel() {
|
||||
Object.assign(model.value, defaultModel);
|
||||
}
|
||||
|
||||
async function reset() {
|
||||
await restoreValidation();
|
||||
resetModel();
|
||||
emit('search');
|
||||
}
|
||||
|
||||
async function search() {
|
||||
await validate();
|
||||
emit('search');
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NCard :bordered="false" size="small" class="card-wrapper">
|
||||
<NCollapse>
|
||||
<NCollapseItem :title="$t('common.search')" name="art-school-recruit-major-search">
|
||||
<NForm ref="formRef" :model="model" label-placement="left" :label-width="80">
|
||||
<NGrid responsive="screen" item-responsive>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校ID" label-width="auto" path="schoolId" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolId" placeholder="请输入学校ID" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校代码" label-width="auto" path="schoolCode" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolCode" placeholder="请输入学校代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学校名称(冗余)" label-width="auto" path="schoolName" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolName" placeholder="请输入学校名称(冗余)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="年份" label-width="auto" path="year" class="pr-24px">
|
||||
<NInput v-model:value="model.year" placeholder="请输入年份" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业ID" label-width="auto" path="majorId" class="pr-24px">
|
||||
<NInput v-model:value="model.majorId" placeholder="请输入专业ID" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业代码" label-width="auto" path="majorCode" class="pr-24px">
|
||||
<NInput v-model:value="model.majorCode" placeholder="请输入专业代码" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业名称" label-width="auto" path="majorName" class="pr-24px">
|
||||
<NInput v-model:value="model.majorName" placeholder="请输入专业名称" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="招生代码(为空则存空串)" label-width="auto" path="enrollCode" class="pr-24px">
|
||||
<NInput v-model:value="model.enrollCode" placeholder="请输入招生代码(为空则存空串)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="数据状态(停招/新招/新增)" label-width="auto" path="dataStatus" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.dataStatus"
|
||||
placeholder="请选择数据状态(停招/新招/新增)"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="批次" label-width="auto" path="batchName" class="pr-24px">
|
||||
<NInput v-model:value="model.batchName" placeholder="请输入批次" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业类型" label-width="auto" path="majorType" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.majorType"
|
||||
placeholder="请选择专业类型"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="二级专业类型" label-width="auto" path="majorTypeSub" class="pr-24px">
|
||||
<NInput v-model:value="model.majorTypeSub" placeholder="请输入二级专业类型" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="科类(文/理)" label-width="auto" path="subjectType" class="pr-24px">
|
||||
<NSelect
|
||||
v-model:value="model.subjectType"
|
||||
placeholder="请选择科类(文/理)"
|
||||
:options="[]"
|
||||
clearable
|
||||
/>
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="录取方式缩写" label-width="auto" path="admissionWayShort" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionWayShort" placeholder="请输入录取方式缩写" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="对外录取方式" label-width="auto" path="admissionWayExternal" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionWayExternal" placeholder="请输入对外录取方式" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="对外录取方式运算符" label-width="auto" path="admissionWayExternalOp" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionWayExternalOp" placeholder="请输入对外录取方式运算符" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="内部录取方式" label-width="auto" path="admissionWayInternal" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionWayInternal" placeholder="请输入内部录取方式" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="内部录取方式运算符" label-width="auto" path="admissionWayInternalOp" class="pr-24px">
|
||||
<NInput v-model:value="model.admissionWayInternalOp" placeholder="请输入内部录取方式运算符" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="计划招生人数" label-width="auto" path="planEnroll" class="pr-24px">
|
||||
<NInput v-model:value="model.planEnroll" placeholder="请输入计划招生人数" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="主考科目" label-width="auto" path="mainExamSubject" class="pr-24px">
|
||||
<NInput v-model:value="model.mainExamSubject" placeholder="请输入主考科目" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学制(年)" label-width="auto" path="schoolingYears" class="pr-24px">
|
||||
<NInput v-model:value="model.schoolingYears" placeholder="请输入学制(年)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="院校限制说明" label-width="auto" path="enrollLimitDesc" class="pr-24px">
|
||||
<NInput v-model:value="model.enrollLimitDesc" placeholder="请输入院校限制说明" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="学费(元/年)" label-width="auto" path="tuitionFee" class="pr-24px">
|
||||
<NInput v-model:value="model.tuitionFee" placeholder="请输入学费(元/年)" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="文化分数限制" label-width="auto" path="cultureScoreLimit" class="pr-24px">
|
||||
<NInput v-model:value="model.cultureScoreLimit" placeholder="请输入文化分数限制" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="专业分数限制" label-width="auto" path="majorScoreLimit" class="pr-24px">
|
||||
<NInput v-model:value="model.majorScoreLimit" placeholder="请输入专业分数限制" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="语文成绩限制" label-width="auto" path="chineseScoreLimit" class="pr-24px">
|
||||
<NInput v-model:value="model.chineseScoreLimit" placeholder="请输入语文成绩限制" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi span="24 s:12 m:6" label="英语成绩限制" label-width="auto" path="englishScoreLimit" class="pr-24px">
|
||||
<NInput v-model:value="model.englishScoreLimit" placeholder="请输入英语成绩限制" />
|
||||
</NFormItemGi>
|
||||
<NFormItemGi :show-feedback="false" span="24" class="pr-24px">
|
||||
<NSpace class="w-full" justify="end">
|
||||
<NButton @click="reset">
|
||||
<template #icon>
|
||||
<icon-ic-round-refresh class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.reset') }}
|
||||
</NButton>
|
||||
<NButton type="primary" ghost @click="search">
|
||||
<template #icon>
|
||||
<icon-ic-round-search class="text-icon" />
|
||||
</template>
|
||||
{{ $t('common.search') }}
|
||||
</NButton>
|
||||
</NSpace>
|
||||
</NFormItemGi>
|
||||
</NGrid>
|
||||
</NForm>
|
||||
</NCollapseItem>
|
||||
</NCollapse>
|
||||
</NCard>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
Loading…
Reference in New Issue