修改文章病例库管理相关操作问题111

This commit is contained in:
wucongxing8150 2025-08-12 08:53:03 +08:00
parent 7103c40c44
commit 1b50770874
5 changed files with 303 additions and 44 deletions

View File

@ -31,7 +31,15 @@
</a-form-item>
<a-form-item label="发表时间" name="pushDate">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.pushDate" style="width: 100%" placeholder="发表时间" />
<a-date-picker
show-time
valueFormat="YYYY-MM-DD HH:mm:ss"
v-model:value="form.pushDate"
style="width: 100%"
placeholder="发表时间"
:disabled-date="disabledFutureDate"
:disabled-time="disabledFutureTime"
/>
</a-form-item>
<a-form-item label="是否外部链接" name="isLink">
<a-switch v-model:checked="isLinkChecked" @change="isLinkCheckedChange" />
@ -213,6 +221,7 @@
import SmartWangeditor from '/@/components/framework/wangeditor/index.vue';
import { FILE_FOLDER_TYPE_ENUM } from '/@/constants/support/file-const';
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import dayjs from 'dayjs';
// ------------------------ ------------------------
@ -329,7 +338,7 @@
articleTitle: undefined, //
articleStatus: 1, //1: 2:-
pushDate: undefined, //
pushDate: new Date().toISOString().slice(0, 19).replace('T', ' '), //
isLink: 0, //0: 1:
isLinkUrl: undefined, //
shareQrcode: undefined, //
@ -344,6 +353,54 @@
//
const isLinkChecked = ref(false);
//
function disabledFutureDate(current) {
//
return current && current > dayjs().endOf('day');
}
//
function disabledFutureTime(date) {
if (date) {
const today = dayjs();
const selectedDate = dayjs(date);
//
if (selectedDate.isSame(today, 'day')) {
return {
disabledHours: () => {
const hours = [];
for (let i = today.hour() + 1; i < 24; i++) {
hours.push(i);
}
return hours;
},
disabledMinutes: (hour) => {
if (hour === today.hour()) {
const minutes = [];
for (let i = today.minute() + 1; i < 60; i++) {
minutes.push(i);
}
return minutes;
}
return [];
},
disabledSeconds: (hour, minute) => {
if (hour === today.hour() && minute === today.minute()) {
const seconds = [];
for (let i = today.second() + 1; i < 60; i++) {
seconds.push(i);
}
return seconds;
}
return [];
}
};
}
}
return {};
}
//
const qrcodeLoading = ref(false);
@ -626,7 +683,37 @@
const rules = computed(() => ({
articleTitle: [{ required: true, message: '标题 必填' }],
articleStatus: [{ required: true, message: '状态1:正常 2:禁用) 必填' }],
pushDate: [{ required: true, message: '发表时间 必填' }],
pushDate: [
{ required: true, message: '发表时间 必填' },
{
validator: (rule, value) => {
if (!value) {
return Promise.resolve();
}
const selectedDate = new Date(value);
const currentDate = new Date();
// 23:59:59
currentDate.setHours(23, 59, 59, 999);
if (selectedDate > currentDate) {
return Promise.reject('发表时间不能大于当前时间');
}
return Promise.resolve();
}
}
],
authorList: [
{
required: true,
message: '作者 必填',
validator: (rule, value) => {
if (!value || !Array.isArray(value) || value.length === 0) {
return Promise.reject('请至少选择一个作者');
}
return Promise.resolve();
}
}
],
isLinkUrl: [{
required: isLinkChecked.value,
message: '外部链接地址 必填',

View File

@ -20,9 +20,6 @@
<a-form-item label="标题" name="videoTitle">
<a-input style="width: 100%" v-model:value="form.videoTitle" placeholder="标题" />
</a-form-item>
<a-form-item label="视频编号" name="videoNo">
<a-input style="width: 100%" v-model:value="form.videoNo" placeholder="视频编号" />
</a-form-item>
<a-form-item label="状态" name="videoStatus">
<SmartEnumSelect
width="100%"
@ -34,14 +31,25 @@
</a-form-item>
<a-form-item label="发表时间" name="pushDate">
<a-date-picker show-time valueFormat="YYYY-MM-DD HH:mm:ss" v-model:value="form.pushDate" style="width: 100%" placeholder="发表时间" />
<a-date-picker
show-time
valueFormat="YYYY-MM-DD HH:mm:ss"
v-model:value="form.pushDate"
style="width: 100%"
placeholder="发表时间"
:disabled-date="disabledFutureDate"
:disabled-time="disabledFutureTime"
/>
</a-form-item>
<a-form-item label="是否外部链接" name="isLink">
<a-form-item label="是否外部链接" name="isLink" :colon="false">
<a-switch v-model:checked="isLinkChecked" />
</a-form-item>
<a-form-item label="外部链接地址" name="isLinkUrl" v-if="isLinkChecked">
<a-input style="width: 100%" v-model:value="form.isLinkUrl" placeholder="外部链接地址" />
</a-form-item>
<a-form-item label="视频编号" name="videoNo" v-if="!isLinkChecked">
<a-input style="width: 100%" v-model:value="form.videoNo" placeholder="视频编号" />
</a-form-item>
<a-form-item label="疾病标签" name="labelList">
<div class="label-container">
<!-- 标签选择器 -->
@ -211,6 +219,7 @@
import { smartSentry } from '/@/lib/smart-sentry';
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons-vue';
import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue';
import dayjs from 'dayjs';
// ------------------------ ------------------------
@ -325,7 +334,7 @@
videoNo: undefined, //
videoStatus: 1, //
deleteStatus: 0, //
pushDate: undefined, //
pushDate: new Date().toISOString().slice(0, 19).replace('T', ' '), //
isLink: 0, //0: 1:
isLinkUrl: undefined, //
labelList: [], //
@ -335,12 +344,82 @@
let form = reactive({ ...formDefault });
const rules = {
// ------------------------ ------------------------
const isLinkChecked = computed({
get: () => form.isLink === 1,
set: (value) => {
form.isLink = value ? 1 : 0;
if (value) {
//
form.videoNo = undefined;
} else {
//
form.isLinkUrl = undefined;
}
}
});
const rules = computed(() => ({
videoTitle: [{ required: true, message: '标题 必填' }],
videoNo: [{ required: true, message: '视频编号 必填' }],
videoNo: [{
required: !isLinkChecked.value,
message: '视频编号 必填',
validator: (rule, value) => {
if (isLinkChecked.value) {
return Promise.resolve();
}
if (!value || value.trim() === '') {
return Promise.reject('视频编号 必填');
}
return Promise.resolve();
}
}],
videoStatus: [{ required: true, message: '状态 必填' }],
pushDate: [{ required: true, message: '发表时间 必填' }],
};
pushDate: [
{ required: true, message: '发表时间 必填' },
{
validator: (rule, value) => {
if (!value) {
return Promise.resolve();
}
const selectedDate = new Date(value);
const currentDate = new Date();
// 23:59:59
currentDate.setHours(23, 59, 59, 999);
if (selectedDate > currentDate) {
return Promise.reject('发表时间不能大于当前时间');
}
return Promise.resolve();
}
}
],
isLinkUrl: [{
required: isLinkChecked.value,
message: '外部链接地址 必填',
validator: (rule, value) => {
if (!isLinkChecked.value) {
return Promise.resolve();
}
if (!value || value.trim() === '') {
return Promise.reject('外部链接地址 必填');
}
return Promise.resolve();
}
}],
authorList: [
{
required: true,
message: '作者 必填',
validator: (rule, value) => {
if (!value || !Array.isArray(value) || value.length === 0) {
return Promise.reject('请至少选择一个作者');
}
return Promise.resolve();
}
}
],
}));
//
async function onSubmit() {
@ -371,17 +450,6 @@
}
}
// ------------------------ ------------------------
const isLinkChecked = computed({
get: () => form.isLink === 1,
set: (value) => {
form.isLink = value ? 1 : 0;
if (!value) {
form.isLinkUrl = undefined;
}
}
});
// ------------------------ ------------------------
const selectedLabels = ref([null, null, null]);
const labelOptions = ref([[], [], []]);
@ -612,6 +680,54 @@
});
}
//
function disabledFutureDate(current) {
//
return current && current > dayjs().endOf('day');
}
//
function disabledFutureTime(date) {
if (date) {
const today = dayjs();
const selectedDate = dayjs(date);
//
if (selectedDate.isSame(today, 'day')) {
return {
disabledHours: () => {
const hours = [];
for (let i = today.hour() + 1; i < 24; i++) {
hours.push(i);
}
return hours;
},
disabledMinutes: (hour) => {
if (hour === today.hour()) {
const minutes = [];
for (let i = today.minute() + 1; i < 60; i++) {
minutes.push(i);
}
return minutes;
}
return [];
},
disabledSeconds: (hour, minute) => {
if (hour === today.hour() && minute === today.minute()) {
const seconds = [];
for (let i = today.second() + 1; i < 60; i++) {
seconds.push(i);
}
return seconds;
}
return [];
}
};
}
}
return {};
}
//
defineExpose({

View File

@ -10,14 +10,11 @@
<a-form class="smart-query-form">
<a-row class="smart-query-form-row">
<a-form-item label="关键字" class="smart-query-form-item">
<a-input style="width: 200px" v-model:value="queryForm.keywords" placeholder="标题/作者/" />
<a-input style="width: 200px" v-model:value="queryForm.keywords" placeholder="疾病名称/标题/作者" />
</a-form-item>
<a-form-item label="状态" name="videoStatus" class="smart-query-form-item">
<SmartEnumSelect enum-name="STATUS_ENUM" v-model:value="queryForm.videoStatus" width="160px" />
</a-form-item>
<a-form-item label="删除状态" name="deleteStatus" class="smart-query-form-item">
<SmartEnumSelect enum-name="DELETE_STATUS_ENUM" v-model:value="queryForm.deleteStatus" width="160px" />
</a-form-item>
<a-form-item class="smart-query-form-item">
<a-button type="primary" @click="onSearch">
<template #icon>
@ -107,10 +104,6 @@
/>
</template>
<template v-if="column.dataIndex === 'deleteStatus'">
<span>{{ text === 1 ? '是' : '否' }}</span>
</template>
<template v-if="column.dataIndex === 'videoTitle'">
<div class="text-wrap">{{ text }}</div>
</template>
@ -196,11 +189,6 @@
},
width: 150,
},
{
title: '删除状态',
dataIndex: 'deleteStatus',
ellipsis: true,
},
{
title: '阅读量',
dataIndex: 'readNum',
@ -239,7 +227,6 @@
const queryFormState = {
keywords: undefined, //
videoStatus: undefined, //
deleteStatus: undefined, //
pageNum: 1,
pageSize: 10,
};

View File

@ -44,7 +44,9 @@
valueFormat="YYYY-MM-DD HH:mm:ss"
v-model:value="form.pushDate"
style="width: 100%"
placeholder="发表时间"
placeholder="发表时间"
:disabled-date="disabledFutureDate"
:disabled-time="disabledFutureTime"
/>
</a-form-item>
<a-form-item label="内容" name="exchangeContent">
@ -222,13 +224,15 @@
<script setup>
import { reactive, ref, nextTick, computed } from 'vue';
import _ from 'lodash';
import { message } from 'ant-design-vue';
import { message, Modal } from 'ant-design-vue';
import { SmartLoading } from '/@/components/framework/smart-loading';
import { caseExchangeApi } from '/@/api/business/case-exchange/case-exchange-api';
import { caseClinicalArticleApi } from '/@/api/business/case-clinical-article/case-clinical-article-api';
import { smartSentry } from '/@/lib/smart-sentry';
import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue';
import SmartWangeditor from '/@/components/framework/wangeditor/index.vue';
import SmartEnumSelect from '/@/components/framework/smart-enum-select/index.vue';
import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import dayjs from 'dayjs';
// ------------------------ ------------------------
@ -333,7 +337,7 @@
exchangeTitle: undefined, //
exchangeStatus: 1, //1: 2:-
isSelected: 0, //0: 1:-
pushDate: undefined, //
pushDate: new Date().toISOString().slice(0, 19).replace('T', ' '), //
exchangeContent: '', //
exchangeSummary: undefined, //
labelList: [], //
@ -371,7 +375,25 @@
exchangeTitle: [{ required: true, message: '标题 必填' }],
exchangeStatus: [{ required: true, message: '状态 必填' }],
isSelected: [{ required: true, message: '精选状态 必填' }],
pushDate: [{ required: true, message: '发表时间 必填' }],
pushDate: [
{ required: true, message: '发表时间 必填' },
{
validator: (rule, value) => {
if (!value) {
return Promise.resolve();
}
const selectedDate = new Date(value);
const currentDate = new Date();
// 23:59:59
currentDate.setHours(23, 59, 59, 999);
if (selectedDate > currentDate) {
return Promise.reject('发表时间不能大于当前时间');
}
return Promise.resolve();
}
}
],
exchangeContent: [{ required: true, message: '内容 必填' }],
exchangeSummary: [{ required: true, message: '总结 必填' }],
};
@ -535,6 +557,53 @@
}
}
//
function disabledFutureDate(current) {
return current && current > dayjs().endOf('day').toDate();
}
//
function disabledFutureTime(date) {
if (date) {
const today = dayjs();
const selectedDate = dayjs(date);
//
if (selectedDate.isSame(today, 'day')) {
return {
disabledHours: () => {
const hours = [];
for (let i = today.hour() + 1; i < 24; i++) {
hours.push(i);
}
return hours;
},
disabledMinutes: (hour) => {
if (hour === today.hour()) {
const minutes = [];
for (let i = today.minute() + 1; i < 60; i++) {
minutes.push(i);
}
return minutes;
}
return [];
},
disabledSeconds: (hour, minute) => {
if (hour === today.hour() && minute === today.minute()) {
const seconds = [];
for (let i = today.second() + 1; i < 60; i++) {
seconds.push(i);
}
return seconds;
}
return [];
}
};
}
}
return {};
}
defineExpose({
show,
});

View File

@ -238,7 +238,7 @@
title: '操作',
dataIndex: 'action',
fixed: 'right',
width: 90,
width: 120,
},
]);