diff --git a/.env.local b/.env.local index 14cd1e33..b2b5fbb6 100644 --- a/.env.local +++ b/.env.local @@ -3,8 +3,8 @@ NODE_ENV=development VITE_DEV=true -# 请求路径 - 本地后端服务地址 -VITE_BASE_URL='http://localhost:48080' +# 请求路径 - 后端服务地址 +VITE_BASE_URL='http://192.168.9.121:48080' # 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务 VITE_UPLOAD_TYPE=server diff --git a/.eslintrc.js b/.eslintrc.js index b28255ca..1df855fa 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -70,6 +70,10 @@ module.exports = defineConfig({ 'vue/no-v-html': 'off', 'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件 '@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐 - '@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐 + '@unocss/order-attributify': 'off', // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐 + + // 禁止命名空间导入,统一使用默认导入或命名导入 + 'import/default': 'error', + 'import/no-namespace': 'error' } }) diff --git a/index.html b/index.html index 8cfcbefa..9b0a531a 100644 --- a/index.html +++ b/index.html @@ -25,7 +25,7 @@ justify-content: center; align-items: center; flex-direction: column; - background: #f0f2f5; + background: linear-gradient(135deg, #1a365d 0%, #2d3748 50%, #1a365d 100%); } .app-loading .app-loading-wrap { @@ -41,15 +41,19 @@ } .app-loading .app-loading-title { - margin-bottom: 30px; + margin-bottom: 20px; font-size: 20px; font-weight: bold; text-align: center; + color: #f6e05e; + letter-spacing: 2px; } .app-loading .app-loading-logo { - width: 100px; - margin: 0 auto 15px auto; + width: 64px; + height: 64px; + margin: 0 auto 10px auto; + border-radius: 8px; } .app-loading .app-loading-item { @@ -58,91 +62,121 @@ width: 60px; height: 60px; vertical-align: middle; - border-radius: 50%; } - .app-loading .app-loading-outter { + /* 书本+天平图标 */ + .app-loading .app-loading-shield { + width: 80px; + height: 80px; + animation: bookFloat 2s ease-in-out infinite; + } + + @keyframes bookFloat { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-8px); + } + } + + /* 旋转光环 */ + .app-loading .app-loading-ring { position: absolute; - width: 100%; + top: 50%; + left: 50%; + width: 100px; + height: 100px; + border: 3px solid transparent; + border-top-color: #ffd700; + border-radius: 50%; + transform: translate(-50%, -50%); + animation: rotateRing 2s linear infinite; + opacity: 0.6; + } + + @keyframes rotateRing { + from { + transform: translate(-50%, -50%) rotate(0deg); + } + to { + transform: translate(-50%, -50%) rotate(360deg); + } + } + + /* 进度条 */ + .app-loading .app-loading-progress { + width: 200px; + height: 4px; + background: rgba(255, 255, 255, 0.1); + border-radius: 2px; + margin-top: 30px; + overflow: hidden; + } + + .app-loading .app-loading-progress-bar { height: 100%; - border: 4px solid #2d8cf0; - border-bottom: 0; - border-left-color: transparent; - border-radius: 50%; - animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite; + width: 30%; + background: linear-gradient(90deg, #daa520, #ffd700, #daa520); + border-radius: 2px; + animation: progressMove 1.5s ease-in-out infinite; } - .app-loading .app-loading-inner { - position: absolute; - top: calc(50% - 20px); - left: calc(50% - 20px); - width: 40px; - height: 40px; - border: 4px solid #87bdff; - border-right: 0; - border-top-color: transparent; - border-radius: 50%; - animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite; - } - - @-webkit-keyframes loader-outter { + @keyframes progressMove { 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); + width: 10%; + margin-left: 0; + } + 50% { + width: 50%; + margin-left: 25%; } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); + width: 10%; + margin-left: 90%; } } - @keyframes loader-outter { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); - } - } - - @-webkit-keyframes loader-inner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } - } - - @keyframes loader-inner { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - - 100% { - -webkit-transform: rotate(-360deg); - transform: rotate(-360deg); - } + /* 加载文字 */ + .app-loading .app-loading-text { + margin-top: 15px; + font-size: 14px; + color: #a0aec0; + letter-spacing: 2px; }
-
- -
%VITE_APP_TITLE%
-
+
%VITE_APP_TITLE%
+
-
-
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
正在加载系统中...
diff --git a/package.json b/package.json index 1a12256e..6a53ca91 100644 --- a/package.json +++ b/package.json @@ -109,6 +109,7 @@ "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-define-config": "^2.1.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-vue": "^9.22.0", "lint-staged": "^15.2.2", diff --git a/src/api/prison/consumption/index.ts b/src/api/prison/consumption/index.ts index 3ddd2d0a..4facb3d9 100644 --- a/src/api/prison/consumption/index.ts +++ b/src/api/prison/consumption/index.ts @@ -5,6 +5,9 @@ export interface ConsumptionPageParams { pageNo: number pageSize: number prisonerNo?: string + prisonerName?: string // 罪犯姓名 + prisonAreaId?: number // 监区ID + prisonCellId?: number // 监室ID type?: number status?: number totalAmount?: number @@ -26,6 +29,11 @@ export interface Consumption { id: number // 订单ID prisonerId?: number // 罪犯ID prisonerNo?: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 + prisonAreaId?: number // 监区ID + prisonAreaName?: string // 监区名称 + prisonCellId?: number // 监室ID + prisonCellName?: string // 监室名称 orderNo?: string // 订单号 type?: number // 类型:1-购物 2-餐饮 3-医疗 4-通讯 5-其他 totalAmount?: number // 订单总金额 @@ -34,6 +42,7 @@ export interface Consumption { status?: number // 状态:1-成功 2-失败 remark: string // 备注 details?: ConsumptionDetail[] // 消费明细列表 + createTime?: Date // 创建时间 } // 消费订单 API diff --git a/src/api/prison/dashboard/index.ts b/src/api/prison/dashboard/index.ts index be8879e1..e58e82e6 100644 --- a/src/api/prison/dashboard/index.ts +++ b/src/api/prison/dashboard/index.ts @@ -24,7 +24,7 @@ export interface ChartDataVO { /** 省份数据 */ export interface ProvinceChartVO { province: string // 省份名称 - provinceCode: number // 省份编码 + provinceCode: string | number // 省份编码(支持字符串名称或数字编码) count: number // 人数 } diff --git a/src/api/prison/prisoner/index.ts b/src/api/prison/prisoner/index.ts index 257aeb49..5f1579ff 100644 --- a/src/api/prison/prisoner/index.ts +++ b/src/api/prison/prisoner/index.ts @@ -1,10 +1,19 @@ import request from '@/config/axios' +// 性别枚举:0-未知 1-男 2-女 +export const GENDER_ENUM = { + UNKNOWN: 0, + MALE: 1, + FEMALE: 2 +} as const + +export type GenderType = typeof GENDER_ENUM[keyof typeof GENDER_ENUM] + export interface PrisonerVO { id: number prisonerNo: string name: string - gender: number + gender: number // 性别:0-未知 1-男 2-女 genderName?: string // 性别名称 birthday: string idCard: string @@ -47,7 +56,7 @@ export interface PrisonerCreateVO { id?: number prisonerNo: string name: string - gender: number + gender: number // 性别:0-未知 1-男 2-女 birthday: string idCard: string ethnicity: string @@ -74,39 +83,48 @@ export interface PrisonerCreateVO { remark: string } -// 服刑人员分页查询 -export const getPrisonerPage = (params: PageParam) => { - return request.get({ url: '/prison/prisoner/page', params }) -} - -// 服刑人员详情 -export const getPrisoner = (id: number) => { - return request.get({ url: '/prison/prisoner/get?id=' + id }) -} - -// 新增服刑人员 -export const createPrisoner = (data: PrisonerCreateVO) => { - return request.post({ url: '/prison/prisoner/create', data }) -} - -// 修改服刑人员 -export const updatePrisoner = (data: PrisonerCreateVO) => { - return request.put({ url: '/prison/prisoner/update', data }) -} - -// 删除服刑人员 -export const deletePrisoner = (id: number) => { - return request.delete({ url: '/prison/prisoner/delete?id=' + id }) -} - -// 批量删除服刑人员 -export const deletePrisonerList = (ids: number[]) => { - return request.delete({ url: '/prison/prisoner/delete-list', params: { ids: ids.join(',') } }) -} - -// 导出服刑人员 -export const exportPrisoner = (params) => { - return request.download({ url: '/prison/prisoner/export-excel', params }) +// PrisonerApi 对象 - 统一使用对象导出模式 +export const PrisonerApi = { + // 分页查询 + getPage: (params: PageParam) => { + return request.get({ url: '/prison/prisoner/page', params }) + }, + // 获取详情 + get: (id: number) => { + return request.get({ url: '/prison/prisoner/get', params: { id } }) + }, + // 创建 + create: (data: PrisonerCreateVO) => { + return request.post({ url: '/prison/prisoner/create', data }) + }, + // 更新 + update: (data: PrisonerCreateVO) => { + return request.put({ url: '/prison/prisoner/update', data }) + }, + // 删除 + delete: (id: number) => { + return request.delete({ url: '/prison/prisoner/delete', params: { id } }) + }, + // 批量删除 + deleteList: (ids: number[]) => { + return request.delete({ url: '/prison/prisoner/delete-list', params: { ids: ids.join(',') } }) + }, + // 导出 + export: (params: PageParam) => { + return request.download({ url: '/prison/prisoner/export-excel', params }) + }, + // 调监 + doTransfer: (data: TransferReqVO) => { + return request.post({ url: '/prison/prisoner/transfer', params: data }) + }, + // 获取位置历史 + getAreaHistory: (prisonerId: number) => { + return request.get({ url: '/prison/prisoner-area-log/list-by-prisoner-id', params: { prisonerId } }) + }, + // 导入 + import: (data: FormData) => { + return request.upload({ url: '/prison/prisoner/import-excel', data }) + } } // 调监请求 @@ -116,11 +134,6 @@ export interface TransferReqVO { reason?: string } -// 执行调监 -export const doTransfer = (data: TransferReqVO) => { - return request.post({ url: '/prison/prisoner/transfer', params: data }) -} - // 罪犯位置历史记录 export interface PrisonerAreaLogVO { id: number @@ -142,27 +155,3 @@ export interface PrisonerAreaLogVO { operatorName: string createTime: string } - -// 获取罪犯位置历史 -export const getPrisonerAreaHistory = (prisonerId: number) => { - return request.get({ url: '/prison/prisoner-area-log/list-by-prisoner-id', params: { prisonerId } }) -} - -// 导入服刑人员 -export const importPrisoner = (data: FormData) => { - return request.upload({ url: '/prison/prisoner/import-excel', data }) -} - -// PrisonerApi 对象 - 用于组件导入 -export const PrisonerApi = { - getPage: getPrisonerPage, - get: getPrisoner, - create: createPrisoner, - update: updatePrisoner, - delete: deletePrisoner, - deleteList: deletePrisonerList, - export: exportPrisoner, - doTransfer: doTransfer, - getAreaHistory: getPrisonerAreaHistory, - import: importPrisoner -} diff --git a/src/api/prison/question/index.ts b/src/api/prison/question/index.ts index a331b264..3cefbbec 100644 --- a/src/api/prison/question/index.ts +++ b/src/api/prison/question/index.ts @@ -3,20 +3,19 @@ import request from '@/config/axios' /** 问卷问题信息 */ export interface Question { id?: number // 问题ID(创建时不需要) - questionnaireId?: number // 所属问卷ID - title?: string // 问题标题 - type?: number // 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字 - options?: string // 选项JSON + questionnaireId: number // 所属问卷ID + title: string // 问题标题 + type: number // 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字 + options?: string // 选项JSON(单选/多选时使用) score?: number // 分值 sort?: number // 排序 isRequired?: boolean // 是否必答 - // 新增字段 partName?: string // 分区名称 partSort?: number // 分区排序 - helpText?: string // 帮助说明 + helpText?: string // 帮助说明文字 placeholder?: string // 占位提示 defaultValue?: string // 默认值 - autoFillType?: string // 自动填充类型:NONE/AUTO/MANUAL + autoFillType?: string // 自动填充类型:NONE-无 AUTO-自动填充 MANUAL-手动输入 autoFillSource?: string // 自动填充来源 displayCondition?: string // 显示条件JSON minValue?: number // 最小值 @@ -28,23 +27,20 @@ export interface Question { export interface QuestionPageParams { pageNo: number pageSize: number - questionnaireId?: number - title?: string - type?: number - partName?: string -} - -/** 批量更新参数 */ -export interface BatchUpdateQuestion { - id: number - partName?: string - partSort?: number - sort?: number + questionnaireId?: number // 所属问卷ID + title?: string // 问题标题 + type?: number // 问题类型 + partName?: string // 分区名称 } /** 批量更新请求 */ -export interface BatchUpdateReq { - questions: BatchUpdateQuestion[] +export interface QuestionBatchUpdateReq { + questions: Array<{ + id: number + partName?: string + partSort?: number + sort?: number + }> } // 问卷问题 API @@ -79,13 +75,13 @@ export const QuestionApi = { return await request.delete({ url: `/prison/question/delete-list`, params: { ids: ids.join(',') } }) }, + // 批量更新问卷问题 + batchUpdate: async (data: QuestionBatchUpdateReq) => { + return await request.put({ url: `/prison/question/batch-update`, data }) + }, + // 导出问卷问题 Excel exportQuestion: async (params: QuestionPageParams) => { return await request.download({ url: `/prison/question/export-excel`, params }) - }, - - // 批量更新问卷问题(仅排序和分区字段) - batchUpdate: async (data: BatchUpdateReq) => { - return await request.post({ url: `/prison/question/batch-update`, data }) } } diff --git a/src/api/prison/questionnaire/index.ts b/src/api/prison/questionnaire/index.ts index d155318e..43d99b10 100644 --- a/src/api/prison/questionnaire/index.ts +++ b/src/api/prison/questionnaire/index.ts @@ -27,18 +27,20 @@ export interface QuestionnairePageParams { title?: string type?: number status?: number + description?: string coverImage?: string instruction?: string estimatedTime?: number partCount?: number allowAnonymous?: boolean + createTime?: string } // 问卷模板 API export const QuestionnaireApi = { // 查询问卷模板分页 getQuestionnairePage: async (params: QuestionnairePageParams) => { - return await request.get({ url: `/prison/questionnaire/page`, params }) + return await request.get<{ list: Questionnaire[]; total: number }>({ url: `/prison/questionnaire/page`, params }) }, // 查询问卷模板详情 diff --git a/src/api/prison/questionnairerecord/index.ts b/src/api/prison/questionnairerecord/index.ts index b69b2e85..a65f3d5d 100644 --- a/src/api/prison/questionnairerecord/index.ts +++ b/src/api/prison/questionnairerecord/index.ts @@ -19,7 +19,7 @@ export interface QuestionnaireRecord { totalScore?: number // 总分 passScore?: number // 及格分数 passStatus?: number // 及格状态:1-及格 2-不及格 3-待评阅 - riskLevel?: number // 风险等级:1-高风险 2-中风险 3-低风险 + riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 evaluatorId?: number // 评阅人ID evaluatorName?: string // 评阅人姓名 evaluateTime?: string // 评阅时间 @@ -73,7 +73,7 @@ export interface AssessmentManualScoreReq { recordId: number // 测评记录ID subjectiveScore: number // 主观题得分 comment?: string // 评语 - riskLevel?: number // 风险等级:1-高风险 2-中风险 3-低风险 + riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 } /** 分数分布数据 */ @@ -87,6 +87,7 @@ export interface ScoreDistribution { /** 风险分布数据 */ export interface RiskDistribution { + extreme?: number // 极高风险 high?: number medium?: number low?: number diff --git a/src/api/prison/quick-comment/index.ts b/src/api/prison/quick-comment/index.ts new file mode 100644 index 00000000..8b97db02 --- /dev/null +++ b/src/api/prison/quick-comment/index.ts @@ -0,0 +1,107 @@ +import request from '@/config/axios' + +// ============ 快捷评语相关类型 ============ + +/** 快捷评语分类 */ +export interface CommentCategory { + id: number + name: string + type: number // 评估类型:1-入监 2-定期 3-出监 4-减刑 5-专项 + sort: number + status: number +} + +/** 快捷评语分页参数 */ +export interface QuickCommentPageParams { + pageNo: number + pageSize: number + categoryId?: number + content?: string + status?: number +} + +/** 快捷评语 */ +export interface QuickComment { + id: number + categoryId: number + categoryName?: string // 分类名称 + content: string // 评语内容 + usageCount: number // 使用次数 + sort: number + status: number // 0-停用 1-启用 + creator?: string + createTime?: string +} + +// ============ 快捷评语分类 API ============ + +export const CommentCategoryApi = { + // 查询分类列表 + getList: async (params?: { type?: number; status?: number }) => { + return await request.get({ url: '/prison/quick-comment/category/list', params }) + }, + + // 查询分类详情 + getCategory: async (id: number) => { + return await request.get({ url: '/prison/quick-comment/category/get?id=' + id }) + }, + + // 新增分类 + createCategory: async (data: Partial) => { + return await request.post({ url: '/prison/quick-comment/category/create', data }) + }, + + // 修改分类 + updateCategory: async (data: Partial) => { + return await request.put({ url: '/prison/quick-comment/category/update', data }) + }, + + // 删除分类 + deleteCategory: async (id: number) => { + return await request.delete({ url: '/prison/quick-comment/category/delete?id=' + id }) + } +} + +// ============ 快捷评语 API ============ + +export const QuickCommentApi = { + // 查询评语分页 + getPage: async (params: QuickCommentPageParams) => { + return await request.get({ url: '/prison/quick-comment/page', params }) + }, + + // 查询评语详情 + get: async (id: number) => { + return await request.get({ url: '/prison/quick-comment/get?id=' + id }) + }, + + // 新增评语 + create: async (data: QuickComment) => { + return await request.post({ url: '/prison/quick-comment/create', data }) + }, + + // 修改评语 + update: async (data: QuickComment) => { + return await request.put({ url: '/prison/quick-comment/update', data }) + }, + + // 删除评语 + delete: async (id: number) => { + return await request.delete({ url: '/prison/quick-comment/delete?id=' + id }) + }, + + // 批量删除评语 + deleteList: async (ids: number[]) => { + return await request.delete({ url: '/prison/quick-comment/delete-list?ids=' + ids.join(',') }) + }, + + // 导入评语 + importComments: async (data: { categoryId: number; contents: string[] }) => { + return await request.post({ url: '/prison/quick-comment/import', data }) + }, + + // 导出评语 + export: async (params: QuickCommentPageParams) => { + return await request.download({ url: '/prison/quick-comment/export', params }) + } +} diff --git a/src/api/prison/report/index.ts b/src/api/prison/report/index.ts new file mode 100644 index 00000000..e4e05d5a --- /dev/null +++ b/src/api/prison/report/index.ts @@ -0,0 +1,386 @@ +import request from '@/config/axios' + +// ============ 评估报告模板相关类型 ============ + +/** 评估报告模板分页参数 */ +export interface ReportTemplatePageParams { + pageNo: number + pageSize: number + name?: string + type?: number + status?: number +} + +/** 评估维度配置 */ +export interface ReportDimension { + id?: number + name: string // 维度名称 + aiPrompt?: string // AI提示词 + dataSources: string[] // 数据源绑定 + outputFormat: string // 输出格式:text/paragraph/list + enableAi: boolean // 是否AI生成 + editorType: string // 编辑器类型:text/richtext/select + sort: number // 排序 +} + +/** 评估报告模板 */ +export interface ReportTemplate { + id: number + name: string // 模板名称 + type: number // 模板类型:1-入监综合评估 2-定期考核报告 3-出监评估 4-减刑假释建议 5-专项评估 + titleFormat: string // 报告标题格式 + dimensions: ReportDimension[] // 评估维度 + aiPromptConfig?: string // AI提示词配置(JSON) + styleConfig?: string // 样式配置(JSON) + status: number // 状态:0-停用 1-启用 + isDefault: boolean // 是否默认 + version: number // 版本号 + remark?: string // 备注 + creator?: string + createTime?: string +} + +// ============ 评估报告相关类型 ============ + +/** 报告分页参数 */ +export interface ReportPageParams { + pageNo: number + pageSize: number + reportNo?: string + prisonerNo?: string + templateId?: number + status?: number + reportDate?: string[] +} + +/** 报告维度内容 */ +export interface ReportDimensionContent { + dimensionId: number + dimensionName: string + content: string // 内容 + dataSources?: string // 数据源(JSON) + isAiGenerated: boolean // 是否AI生成 + aiGenerateTime?: string // AI生成时间 + lastModifyTime?: string // 最后修改时间 + lastModifyBy?: string // 最后修改人 +} + +/** 评估报告 */ +export interface Report { + id: number + reportNo: string // 报告编号 + prisonerId: number // 罪犯ID + prisonerNo: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 + templateId: number // 模板ID + templateName?: string // 模板名称 + title: string // 报告标题 + reportDate: string // 报告日期 + dimensions: ReportDimensionContent[] // 维度内容 + conclusion?: string // 综合结论 + suggestions?: string // 改造建议 + riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 + attachments?: string[] // 附件列表 + status: number // 状态:1-草稿 2-待审核 3-已通过 4-已退回 + version: number // 版本号 + signature?: string // 数字签名 + fingerprint?: string // 报告指纹 + submitterId?: number // 提交人ID + submitterName?: string // 提交人姓名 + submitTime?: string // 提交时间 + reviewerId?: number // 审核人ID + reviewerName?: string // 审核人姓名 + reviewTime?: string // 审核时间 + reviewComment?: string // 审核意见 + remark?: string // 备注 + creator?: string + createTime?: string +} + +// ============ 快捷评语相关类型 ============ + +/** 快捷评语分类 */ +export interface CommentCategory { + id: number + name: string + type: number // 评估类型 + sort: number + status: number +} + +/** 快捷评语 */ +export interface QuickComment { + id: number + categoryId: number + categoryName?: string // 分类名称 + content: string + usageCount: number // 使用次数 + sort: number + status: number +} + +// ============ 报告版本历史 ============ + +/** 报告版本历史 */ +export interface ReportVersion { + id: number + reportId: number + version: number + content: string // 内容快照(JSON) + modifierId: number + modifierName: string + modifyTime: string + comment?: string // 版本备注 +} + +// ============ 评估报告模板 API ============ + +export const ReportTemplateApi = { + // 查询模板分页 + getTemplatePage: async (params: ReportTemplatePageParams) => { + return await request.get({ url: '/prison/report-template/page', params }) + }, + + // 查询模板详情 + getTemplate: async (id: number) => { + return await request.get({ url: '/prison/report-template/get?id=' + id }) + }, + + // 新增模板 + createTemplate: async (data: ReportTemplate) => { + return await request.post({ url: '/prison/report-template/create', data }) + }, + + // 修改模板 + updateTemplate: async (data: ReportTemplate) => { + return await request.put({ url: '/prison/report-template/update', data }) + }, + + // 删除模板 + deleteTemplate: async (id: number) => { + return await request.delete({ url: '/prison/report-template/delete?id=' + id }) + }, + + // 批量删除模板 + deleteTemplateList: async (ids: number[]) => { + return await request.delete({ url: '/prison/report-template/delete-list?ids=' + ids.join(',') }) + }, + + // 复制模板 + copyTemplate: async (id: number) => { + return await request.post({ url: '/prison/report-template/copy?id=' + id }) + }, + + // 启用/停用模板 + updateStatus: async (id: number, status: number) => { + return await request.put({ url: '/prison/report-template/update-status', params: { id, status } }) + }, + + // 设为默认 + setDefault: async (id: number) => { + return await request.put({ url: '/prison/report-template/set-default?id=' + id }) + }, + + // 导出模板 + exportTemplate: async (params: ReportTemplatePageParams) => { + return await request.download({ url: '/prison/report-template/export-excel', params }) + } +} + +// ============ 评估报告 API ============ + +export const ReportApi = { + // 查询报告分页 + getReportPage: async (params: ReportPageParams) => { + return await request.get({ url: '/prison/report/page', params }) + }, + + // 查询报告详情 + getReport: async (id: number) => { + return await request.get({ url: '/prison/report/get?id=' + id }) + }, + + // 根据报告编号查询 + getReportByNo: async (reportNo: string) => { + return await request.get({ url: '/prison/report/get-by-no?reportNo=' + reportNo }) + }, + + // 新增报告 + createReport: async (data: Report) => { + return await request.post({ url: '/prison/report/create', data }) + }, + + // 修改报告 + updateReport: async (data: Report) => { + return await request.put({ url: '/prison/report/update', data }) + }, + + // 删除报告 + deleteReport: async (id: number) => { + return await request.delete({ url: '/prison/report/delete?id=' + id }) + }, + + // 批量删除报告 + deleteReportList: async (ids: number[]) => { + return await request.delete({ url: '/prison/report/delete-list?ids=' + ids.join(',') }) + }, + + // 提交审核 + submitReport: async (id: number) => { + return await request.post({ url: '/prison/report/submit?id=' + id }) + }, + + // 审核通过 + approveReport: async (id: number, comment?: string) => { + return await request.post({ url: '/prison/report/approve', data: { id, comment } }) + }, + + // 审核退回 + rejectReport: async (id: number, comment: string) => { + return await request.post({ url: '/prison/report/reject', data: { id, comment } }) + }, + + // AI生成报告 + generateReportByAi: async (id: number, dimensionIds?: number[]) => { + return await request.post({ + url: '/prison/report/generate-by-ai', + data: { id, dimensionIds } + }) + }, + + // 批量生成报告 + batchGenerateReports: async (data: { templateId: number; prisonerIds: number[] }) => { + return await request.post({ url: '/prison/report/batch-generate', data }) + }, + + // 获取AI生成进度 + getGenerateProgress: async (taskId: string) => { + return await request.get({ url: '/prison/report/generate-progress?taskId=' + taskId }) + }, + + // 验证报告签名 + verifySignature: async (id: number) => { + return await request.get({ url: '/prison/report/verify-signature?id=' + id }) + }, + + // 导出报告 + exportReport: async (id: number, format: 'pdf' | 'word') => { + return await request.download({ url: '/prison/report/export', params: { id, format } }) + }, + + // 批量导出报告 + batchExportReports: async (ids: number[], format: 'pdf' | 'word') => { + return await request.download({ url: '/prison/report/batch-export', params: { ids: ids.join(','), format } }) + }, + + // 归档报告 + archiveReport: async (id: number) => { + return await request.post({ url: '/prison/report/archive?id=' + id }) + }, + + // 导出报告 Excel + exportReportExcel: async (params: ReportPageParams) => { + return await request.download({ url: '/prison/report/export-excel', params }) + } +} + +// ============ 快捷评语 API ============ + +export const QuickCommentApi = { + // 查询评语分类列表 + getCategoryList: async (params: { type?: number; status?: number }) => { + return await request.get({ url: '/prison/quick-comment/category/list', params }) + }, + + // 查询评语分页 + getCommentPage: async (params: { pageNo: number; pageSize: number; categoryId?: number; keyword?: string }) => { + return await request.get({ url: '/prison/quick-comment/page', params }) + }, + + // 新增评语 + createComment: async (data: QuickComment) => { + return await request.post({ url: '/prison/quick-comment/create', data }) + }, + + // 修改评语 + updateComment: async (data: QuickComment) => { + return await request.put({ url: '/prison/quick-comment/update', data }) + }, + + // 删除评语 + deleteComment: async (id: number) => { + return await request.delete({ url: '/prison/quick-comment/delete?id=' + id }) + }, + + // 批量删除评语 + deleteCommentList: async (ids: number[]) => { + return await request.delete({ url: '/prison/quick-comment/delete-list?ids=' + ids.join(',') }) + }, + + // 导入评语 + importComments: async (data: { categoryId: number; comments: string[] }) => { + return await request.post({ url: '/prison/quick-comment/import', data }) + }, + + // 导出评语 + exportComments: async (categoryId: number) => { + return await request.download({ url: '/prison/quick-comment/export', params: { categoryId } }) + } +} + +// ============ 报告版本历史 API ============ + +export const ReportVersionApi = { + // 查询版本历史 + getVersionList: async (reportId: number) => { + return await request.get({ url: '/prison/report-version/list?reportId=' + reportId }) + }, + + // 获取版本详情 + getVersion: async (id: number) => { + return await request.get({ url: '/prison/report-version/get?id=' + id }) + }, + + // 恢复版本 + restoreVersion: async (id: number) => { + return await request.post({ url: '/prison/report-version/restore?id=' + id }) + }, + + // 对比版本 + compareVersions: async (versionId1: number, versionId2: number) => { + return await request.get({ url: '/prison/report-version/compare', params: { versionId1, versionId2 } }) + } +} + +// ============ 罪犯选择相关 API ============ + +/** 罪犯简要信息 */ +export interface PrisonerBrief { + id: number + prisonerNo: string + name: string + areaId: number + areaName: string + riskLevel?: number // 风险等级 +} + +/** 罪犯分页参数 */ +export interface PrisonerPageParams { + pageNo: number + pageSize: number + name?: string + prisonerNo?: string + areaId?: number +} + +export const PrisonerSelectApi = { + // 查询罪犯简要信息分页 + getPrisonerPage: async (params: PrisonerPageParams) => { + return await request.get({ url: '/prison/prisoner/brief/page', params }) + }, + + // 查询所有罪犯简要信息(用于选择列表) + getAllPrisoners: async (params: { name?: string; prisonerNo?: string }) => { + return await request.get({ url: '/prison/prisoner/brief/list', params }) + } +} diff --git a/src/api/prison/risk/index.ts b/src/api/prison/risk/index.ts new file mode 100644 index 00000000..c8c03223 --- /dev/null +++ b/src/api/prison/risk/index.ts @@ -0,0 +1,123 @@ +import request from '@/config/axios' + +/** 风险评估信息 */ +export interface Risk { + id: number // 评估ID + prisonerId?: number // 罪犯ID + prisonerCode?: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 + assessmentType?: number // 评估类型:1-入监评估 2-定期评估 3-专项评估 4-出监评估 + assessmentDate?: Date // 评估日期 + assessMethod?: number // 评估方式:1-量表评估 2-民警评估 3-综合评估 + overallScore?: number // 综合风险得分 + riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 + mentalState?: number // 精神状态:1-正常 2-异常 + escapeRisk?: number // 脱逃风险:1-低 2-中 3-高 + violenceRisk?: number // 暴力倾向:1-低 2-中 3-高 + revoltRisk?: number // 抗改风险:1-低 2-中 3-高 + selfHarmRisk?: number // 自杀自伤:1-低 2-中 3-高 + recommendation?: string // 建议 + assessor?: string // 评估人 + conclusion?: string // 结论 + itemScores?: string // 项目得分JSON + remark?: string // 备注 + createTime?: Date // 创建时间 +} + +// 风险评估创建/更新请求 +export interface RiskSaveReqVO { + id?: number + prisonerId?: number + prisonerCode?: string + prisonerName?: string + assessmentType?: number + assessmentDate?: string + assessMethod?: number + overallScore?: number + riskLevel?: number + mentalState?: number + escapeRisk?: number + violenceRisk?: number + revoltRisk?: number + selfHarmRisk?: number + recommendation?: string + assessor?: string + conclusion?: string + itemScores?: string + remark?: string +} + +// 风险评估分页查询 +export interface RiskPageReqVO { + pageNo: number + pageSize: number + prisonerId?: number + prisonerCode?: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 + assessmentType?: number + riskLevel?: number + assessor?: string + assessmentDate?: string +} + +// 风险评估详情响应 +export interface RiskRespVO { + id: number + prisonerId: number + prisonerCode: string // 罪犯编号 + prisonerName: string // 罪犯姓名 + assessmentType: number + assessmentDate: string + assessMethod: number + overallScore: number + riskLevel: number + mentalState: string + escapeRisk: string + violenceRisk: string + revoltRisk: string + selfHarmRisk: string + recommendation: string + assessor: string + conclusion: string + itemScores: string + remark: string + createTime: string +} + +/** 风险评估 API */ +export const RiskApi = { + // 查询风险评估分页 + getRiskPage: async (params: RiskPageReqVO) => { + return await request.get({ url: `/prison/risk/page`, params }) + }, + + // 查询风险评估详情 + getRisk: async (id: number) => { + return await request.get({ url: `/prison/risk/get?id=` + id }) + }, + + // 新增风险评估 + createRisk: async (data: RiskSaveReqVO) => { + return await request.post({ url: `/prison/risk/create`, data }) + }, + + // 修改风险评估 + updateRisk: async (data: RiskSaveReqVO) => { + return await request.put({ url: `/prison/risk/update`, data }) + }, + + // 删除风险评估 + deleteRisk: async (id: number) => { + return await request.delete({ url: `/prison/risk/delete?id=` + id }) + }, + + /** 批量删除风险评估 */ + deleteRiskList: async (ids: number[]) => { + return await request.delete({ url: `/prison/risk/delete-list?ids=${ids.join(',')}` }) + }, + + // 导出风险评估 Excel + exportRisk: async (params) => { + return await request.download({ url: `/prison/risk/export-excel`, params }) + } +} diff --git a/src/api/prison/riskassessment/index.ts b/src/api/prison/riskassessment/index.ts index ef160931..0a81aa16 100644 --- a/src/api/prison/riskassessment/index.ts +++ b/src/api/prison/riskassessment/index.ts @@ -4,7 +4,9 @@ import request from '@/config/axios' export interface RiskAssessmentPageParams { pageNo: number pageSize: number + prisonerId?: number prisonerNo?: string + prisonerName?: string assessmentType?: number riskLevel?: number status?: number @@ -15,6 +17,7 @@ export interface RiskAssessment { id: number // 评估ID prisonerId?: number // 罪犯ID prisonerNo?: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 assessmentType?: number // 评估类型:1-入狱评估 2-定期评估 3-专项评估 assessmentDate?: string // 评估日期 violenceScore: number // 暴力倾向得分 diff --git a/src/api/prison/score/index.ts b/src/api/prison/score/index.ts index 180344a4..9dbd5b9e 100644 --- a/src/api/prison/score/index.ts +++ b/src/api/prison/score/index.ts @@ -5,6 +5,9 @@ export interface ScorePageParams { pageNo: number pageSize: number prisonerNo?: string + prisonerName?: string // 罪犯姓名 + prisonAreaId?: number // 监区ID + prisonCellId?: number // 监室ID year?: number month?: number level?: number @@ -16,6 +19,11 @@ export interface Score { id: number // 记录ID prisonerId?: number // 罪犯ID prisonerNo?: string // 罪犯编号 + prisonerName?: string // 罪犯姓名 + prisonAreaId?: number // 监区ID + prisonAreaName?: string // 监区名称 + prisonCellId?: number // 监室ID + prisonCellName?: string // 监室名称 year?: number // 考核年份 month?: number // 考核月份 baseScore: number // 基础分 @@ -27,6 +35,8 @@ export interface Score { assessorName: string // 考核人姓名 status?: number // 状态:1-待审核 2-已通过 3-已驳回 remark: string // 备注 + createTime?: Date // 创建时间 + updateTime?: Date // 更新时间 } // 计分考核 API diff --git a/src/api/prison/situation/index.ts b/src/api/prison/situation/index.ts new file mode 100644 index 00000000..189e4533 --- /dev/null +++ b/src/api/prison/situation/index.ts @@ -0,0 +1,119 @@ +import request from '@/config/axios' +import { AreaApi } from '@/api/prison/area' + +/** 狱情收集信息 */ +export interface Situation { + id: number // 狱情ID + title?: string // 标题 + content?: string // 详情内容 + category?: number // 分类:1-监管安全 2-生产安全 3-生活卫生 4-教育改造 5-民警队伍 6-其他 + level?: number // 等级:1-一般 2-重要 3-紧急 + source?: number // 来源:1-现场发现 2-耳目反映 3-技术监控 4-他人举报 5-主动报告 6-其他 + status?: number // 状态:1-待处理 2-处理中 3-已处理 4-已归档 + areaId?: number // 监区ID + cellId?: number // 监室ID + reporter?: string // 报告人 + handler?: string // 处理人 + occurTime?: Date // 发生时间 + remark?: string // 备注 + createTime?: Date // 创建时间 +} + +// 狱情收集创建/更新请求 +export interface SituationSaveReqVO { + id?: number + title: string + content?: string + category?: number + level?: number + source?: number + status?: number + areaId?: number + cellId?: number + reporter?: string + handler?: string + occurTime?: string + remark?: string +} + +// 狱情收集分页查询 +export interface SituationPageReqVO { + pageNo: number + pageSize: number + title?: string + category?: number + level?: number + source?: number + status?: number + areaId?: number + cellId?: number + reporter?: string + handler?: string + occurTime?: string +} + +// 狱情收集详情响应 +export interface SituationRespVO { + id: number + title: string + content: string + category: number + level: number + source: number + status: number + areaId: number + cellId: number + reporter: string + handler: string + occurTime: string + remark: string + createTime: string + areaName?: string // 监区名称 + cellName?: string // 监室名称 +} + +/** 狱情收集 API */ +export const SituationApi = { + // 查询狱情收集分页 + getSituationPage: async (params: SituationPageReqVO) => { + return await request.get({ url: `/prison/situation/page`, params }) + }, + + // 查询狱情收集详情 + getSituation: async (id: number) => { + return await request.get({ url: `/prison/situation/get?id=` + id }) + }, + + // 查询监室列表(用于新增/编辑时选择) + getCellList: async (params?: { areaId?: number; status?: number }) => { + return await request.get({ url: `/prison/cell/list`, params }) + }, + + // 新增狱情收集 + createSituation: async (data: SituationSaveReqVO) => { + return await request.post({ url: `/prison/situation/create`, data }) + }, + + // 修改狱情收集 + updateSituation: async (data: SituationSaveReqVO) => { + return await request.put({ url: `/prison/situation/update`, data }) + }, + + // 删除狱情收集 + deleteSituation: async (id: number) => { + return await request.delete({ url: `/prison/situation/delete?id=` + id }) + }, + + /** 批量删除狱情收集 */ + deleteSituationList: async (ids: number[]) => { + return await request.delete({ url: `/prison/situation/delete-list?ids=${ids.join(',')}` }) + }, + + // 导出狱情收集 Excel + exportSituation: async (params) => { + return await request.download({ url: `/prison/situation/export-excel`, params }) + }, + + // 导出 AreaApi 供页面使用 + AreaApi +} diff --git a/src/api/prison/warning/index.ts b/src/api/prison/warning/index.ts new file mode 100644 index 00000000..5e138017 --- /dev/null +++ b/src/api/prison/warning/index.ts @@ -0,0 +1,174 @@ +import request from '@/config/axios' +import { AreaApi } from '@/api/prison/area' + +/** 预警管理 */ +export interface Warning { + id: number // 预警ID + title?: string // 标题 + content?: string // 内容 + type?: number // 类型 + level?: number // 等级 + status?: number // 状态 + source?: number // 来源 + situationId?: number // 关联狱情ID + areaId?: number // 监区ID + cellId?: number // 监室ID + alertTime?: Date // 预警时间 + verifyTime?: Date // 核实时间 + verifier?: string // 核实人 + verifyResult?: string // 核实结果 + handleTime?: Date // 处置时间 + handler?: string // 处置人 + handleResult?: string // 处置结果 + releaseTime?: Date // 解除时间 + releaser?: string // 解除人 + releaseReason?: string // 解除原因 + occurTime?: Date // 发生时间 + remark?: string // 备注 + createTime?: Date // 创建时间 +} + +// 预警创建/更新请求 +export interface WarningSaveReqVO { + id?: number + title: string + content?: string + type?: number + level?: number + status?: number + source?: number + situationId?: number + areaId?: number + cellId?: number + alertTime?: string + occurTime?: string + remark?: string +} + +// 预警核实请求 +export interface WarningVerifyReqVO { + id: number + verifyResult: string +} + +// 预警处置请求 +export interface WarningHandleReqVO { + id: number + handleResult: string +} + +// 预警解除请求 +export interface WarningReleaseReqVO { + id: number + releaseReason: string +} + +// 预警分页查询 +export interface WarningPageReqVO { + pageNo: number + pageSize: number + title?: string + type?: number + level?: number + status?: number + source?: number + areaId?: number + cellId?: number + occurTime?: string +} + +// 预警详情响应 +export interface WarningRespVO { + id: number + title: string + content: string + type: number + level: number + status: number + source: number + situationId: number + areaId: number + cellId: number + alertTime: string + verifyTime: string + verifier: string + verifyResult: string + handleTime: string + handler: string + handleResult: string + releaseTime: string + releaser: string + releaseReason: string + occurTime: string + remark: string + createTime: string + areaName?: string // 监区名称 + cellName?: string // 监室名称 + situationTitle?: string // 关联狱情标题 +} + +/** 预警管理 API */ +export const WarningApi = { + // 查询预警分页 + getWarningPage: async (params: WarningPageReqVO) => { + return await request.get({ url: `/prison/warning/page`, params }) + }, + + // 查询预警详情 + getWarning: async (id: number) => { + return await request.get({ url: `/prison/warning/get?id=` + id }) + }, + + // 查询监室列表 + getCellList: async (params?: { areaId?: number; status?: number }) => { + return await request.get({ url: `/prison/cell/list`, params }) + }, + + // 查询狱情列表 + getSituationList: async (params?: { status?: number }) => { + return await request.get({ url: `/prison/situation/list`, params }) + }, + + // 新增预警 + createWarning: async (data: WarningSaveReqVO) => { + return await request.post({ url: `/prison/warning/create`, data }) + }, + + // 修改预警 + updateWarning: async (data: WarningSaveReqVO) => { + return await request.put({ url: `/prison/warning/update`, data }) + }, + + // 预警核实 + verifyWarning: async (data: WarningVerifyReqVO) => { + return await request.put({ url: `/prison/warning/verify`, data }) + }, + + // 预警处置 + handleWarning: async (data: WarningHandleReqVO) => { + return await request.put({ url: `/prison/warning/handle`, data }) + }, + + // 预警解除 + releaseWarning: async (data: WarningReleaseReqVO) => { + return await request.put({ url: `/prison/warning/release`, data }) + }, + + // 删除预警 + deleteWarning: async (id: number) => { + return await request.delete({ url: `/prison/warning/delete?id=` + id }) + }, + + /** 批量删除预警 */ + deleteWarningList: async (ids: number[]) => { + return await request.delete({ url: `/prison/warning/delete-list?ids=${ids.join(',')}` }) + }, + + // 导出预警 Excel + exportWarning: async (params) => { + return await request.download({ url: `/prison/warning/export-excel`, params }) + }, + + // 导出 AreaApi 供页面使用 + AreaApi +} diff --git a/src/components/Icon/JusticeIcon.vue b/src/components/Icon/JusticeIcon.vue new file mode 100644 index 00000000..b4a5e7c6 --- /dev/null +++ b/src/components/Icon/JusticeIcon.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/index.ts b/src/components/index.ts index 4d030c37..5ec86d49 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,6 +1,8 @@ import type { App } from 'vue' import { Icon } from './Icon' +import JusticeIcon from './Icon/JusticeIcon.vue' export const setupGlobCom = (app: App): void => { app.component('Icon', Icon) + app.component('JusticeIcon', JusticeIcon) } diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 99a994b9..a3513d6e 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -768,6 +768,32 @@ const remainingRouter: AppRouteRecordRaw[] = [ hidden: true, canTo: true } + }, + { + path: 'situation-platform', + component: () => import('@/views/prison/situation/index.vue'), + name: 'PrisonSituationPlatform', + meta: { + title: '狱情收集', + icon: 'ep:warning', + permission: 'prison:situation:query', + noCache: false, + hidden: true, + canTo: true + } + }, + { + path: 'report/edit', + component: () => import('@/views/prison/report/edit/index.vue'), + name: 'PrisonReportEdit', + meta: { + title: '评估报告编辑', + icon: 'ep:document-checked', + permission: 'prison:report:update', + noCache: true, + hidden: true, + canTo: true + } } ] } diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 8a5e1a77..91613f88 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -1,10 +1,13 @@ /** * 数据字典工具类 */ -import { useDictStoreWithOut } from '@/store/modules/dict' +import { useDictStoreWithOut as _useDictStoreWithOut } from '@/store/modules/dict' import { ElementPlusInfoType } from '@/types/elementPlus' -const dictStore = useDictStoreWithOut() +const dictStore = _useDictStoreWithOut() + +// Re-export for convenience +export const useDictStoreWithOut = _useDictStoreWithOut /** * 获取 dictType 对应的数据字典数组 @@ -276,5 +279,10 @@ export enum DICT_TYPE { PRISON_CERTIFICATE_TYPE = 'prison_certificate_type', // 证件类型:1-身份证 2-户口簿 3-其他 PRISON_ASSESSMENT_STATUS = 'prison_assessment_status', // 测评状态:1-待测评 2-测评中 3-已完成 4-已过期 PRISON_ASSESSMENT_PASS_STATUS = 'prison_assessment_pass_status', // 测评及格状态:1-及格 2-不及格 3-待评分 - PRISON_ASSESSMENT_ANSWER_STATUS = 'prison_assessment_answer_status' // 测评答题状态:1-待评分 2-已评分 + PRISON_ASSESSMENT_ANSWER_STATUS = 'prison_assessment_answer_status', // 测评答题状态:1-待评分 2-已评分 + + // ========== 评估报告模块 ========== + PRISON_REPORT_STATUS = 'prison_report_status', // 报告状态:1-草稿 2-待审核 3-已通过 4-已退回 + PRISON_REPORT_TEMPLATE_TYPE = 'prison_report_template_type', // 报告模板类型:1-入监综合评估 2-定期考核报告 3-出监评估 4-减刑假释建议 5-专项评估 + PRISON_COMMON_STATUS = 'prison_common_status' // 通用状态:0-停用 1-启用 } diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts index 99eb428c..89b3e1b2 100644 --- a/src/utils/formatTime.ts +++ b/src/utils/formatTime.ts @@ -72,6 +72,17 @@ export function formatDate(date: Date, format?: string): string { return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : '' } +/** + * 格式化日期时间为 YYYY-MM-DD HH:mm:ss 格式 + * @param dateTime 日期时间值 + */ +export function formatDateTime(dateTime: any): string { + if (!dateTime) { + return '' + } + return dayjs(dateTime).format('YYYY-MM-DD HH:mm:ss') +} + /** * 获取当前的日期+时间 */ @@ -198,7 +209,16 @@ export function formatPast2(ms: number): string { * @param cellValue 字段值 */ export function dateFormatter(_row: any, _column: TableColumnCtx, cellValue: any): string { - return cellValue ? formatDate(cellValue) : '' + if (!cellValue) { + return '' + } + // 直接返回已有格式的日期字符串 + if (typeof cellValue === 'string' && cellValue.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)) { + return cellValue + } + // 处理其他格式 + const date = dayjs(cellValue) + return date.isValid() ? date.format('YYYY-MM-DD HH:mm:ss') : '' } /** diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue index 1bb5173d..4f9c7096 100644 --- a/src/views/Login/components/LoginForm.vue +++ b/src/views/Login/components/LoginForm.vue @@ -1,4 +1,14 @@