Merge remote-tracking branch 'origin/master'

This commit is contained in:
曹磊 2025-05-13 09:09:55 +08:00
commit 5f6db02737
25 changed files with 1198 additions and 245 deletions

27
.env.development002 Normal file
View File

@ -0,0 +1,27 @@
# 是否打开mock
VITE_USE_MOCK = true
# 发布路径
VITE_PUBLIC_PATH = /
# 跨域代理,您可以配置多个 ,请注意,没有换行符
VITE_PROXY = [["/nursing-unit-002","http://localhost:8082/nursing-unit_002"],["/upload","http://localhost:3300/upload"]]
#后台接口全路径地址(必填)
VITE_GLOB_DOMAIN_URL=http://localhost:8082/nursing-unit_002
#后台接口父地址(必填)
VITE_GLOB_API_URL=/nursing-unit-002
# 接口前缀
VITE_GLOB_API_URL_PREFIX=
#微前端qiankun应用,命名必须以VITE_APP_SUB_开头,jeecg-app-1为子应用的项目名称,也是子应用的路由父路径
VITE_APP_SUB_jeecg-app-1 = '//localhost:8092'
# 填写后将作为乾坤子应用启动主应用注册时AppName需保持一致放开 VITE_GLOB_QIANKUN_MICRO_APP_NAME 参数表示jeecg-vue3将以乾坤子应用模式启动
#VITE_GLOB_QIANKUN_MICRO_APP_NAME=jeecg-vue3
# 作为乾坤子应用启动时必填需与qiankun主应用注册子应用时填写的 entry 保持一致
#VITE_GLOB_QIANKUN_MICRO_APP_ENTRY=//localhost:3001/jeecg-vue3

25
.env002 Normal file
View File

@ -0,0 +1,25 @@
# port
VITE_PORT = 3102
# 网站标题
VITE_GLOB_APP_TITLE = 业务系统2
# 简称,此变量只能是字符/下划线
VITE_GLOB_APP_SHORT_NAME = 业务系统2
# 单点登录服务端地址
VITE_GLOB_APP_CAS_BASE_URL=http://cas.test.com:8443/cas
# 是否开启单点登录
VITE_GLOB_APP_OPEN_SSO = false
# 开启微前端模式
VITE_GLOB_APP_OPEN_QIANKUN=true
# 文件预览地址
VITE_GLOB_ONLINE_VIEW_URL=http://fileview.jeecg.com/onlinePreview
# 运维服务器接口地址
VITE_GLOB_INSTITUTIONS_URL=http://192.168.2.19:8080/nursing-unit/

BIN
public/resource/img/bj.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

View File

@ -3,7 +3,7 @@
* @Description: logo component
-->
<template>
<div class="anticon advisoryClass" :class="getAppLogoClass" @click="goHome" style="background-image: url('/src/assets/images/bj.png');text-align: center;">
<div class="anticon" :class="getAppLogoClass" @click="goHome" style="background: #e3f6fc;text-align: center;">
<img src="../../../assets/images/logo2.png" style="width:100%" v-show="showTitle"/>
<div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="!showTitle">
<img src="../../../assets/images/logo.png" style="width:100%"/>
@ -92,7 +92,4 @@
}
}
.advisoryClass{
background-image: url(/@/assets/images/bj.png);
}
</style>

View File

@ -192,4 +192,28 @@
</script>
<style lang="less">
@import './index.less';
.jeecg-menu-item-active:not(.jeecg-menu-submenu) {
color: white !important;
background-color: #1890ff !important;
border-radius: 5px;
margin: 10px 20px;
padding: 10px;
}
// .jeecg-menu {
// background: #fbfbfd;
// position: relative;
// display: block;
// width: 100%;
// padding: 0;
// margin: 0;
// font-size: 14px;
// color: rgba(0, 0, 0, 0.88);
// list-style: none;
// outline: none;
// border-radius: 5px;
// }
.jeecg-menu-light.jeecg-menu-vertical .jeecg-menu-item-active.jeecg-menu-submenu {
background: #f0f0f0;
}
</style>

View File

@ -501,10 +501,10 @@
padding: 10px;
.ant-form {
padding: 12px 10px 6px 10px;
padding: 24px 10px 0px 10px;
margin-bottom: 8px;
background-color: @component-background;
border-radius: 2px;
border-radius: 5px;
}
}
@ -523,7 +523,7 @@
.ant-table-wrapper {
padding: 6px;
background-color: @component-background;
border-radius: 2px;
border-radius: 5px;
.ant-table-title {
min-height: 40px;

View File

@ -1,5 +1,5 @@
<template>
<Tooltip placement="top" v-bind="getBindProps" >
<Tooltip placement="top" v-bind="getBindProps">
<template #title>
<span>{{ t('component.table.settingColumn') }}</span>
</template>

View File

@ -1,5 +1,5 @@
<template>
<Header :class="getHeaderClass" style="background-image: url('/src/assets/images/bj.png');">
<Header :class="getHeaderClass" style="background-image: url('../resource/img/bj.png');">
<!-- left start -->
<div :class="`${prefixCls}-left`" >
<!-- logo -->

View File

@ -1,10 +1,10 @@
<template>
<Layout :class="prefixCls" v-bind="lockEvents">
<LayoutFeatures />
<LayoutHeader fixed v-if="getShowFullHeaderRef" />
<!-- <LayoutFeatures /> -->
<!-- <LayoutHeader fixed v-if="getShowFullHeaderRef" /> -->
<Layout :class="[layoutClass]">
<LayoutSideBar v-if="getShowSidebar || getIsMobile" />
<Layout :class="`${prefixCls}-main`" style="background-image: url('/src/assets/images/bj.png');">
<Layout :class="`${prefixCls}-main`" style="background-image: url('../resource/img/bj.png');">
<LayoutMultipleHeader />
<LayoutContent />
<LayoutFooter />

View File

@ -11,7 +11,7 @@
<Sider />
</Drawer>
<MixSider v-else-if="getIsMixSidebar" />
<Sider v-else />
<Sider v-else />
</template>
<script lang="ts">
import { defineComponent } from 'vue';

View File

@ -0,0 +1,72 @@
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from "/@/hooks/web/useMessage";
const { createConfirm } = useMessage();
enum Api {
list = '/sysconfig/sysConfig/list',
save='/sysconfig/sysConfig/add',
edit='/sysconfig/sysConfig/edit',
deleteOne = '/sysconfig/sysConfig/delete',
deleteBatch = '/sysconfig/sysConfig/deleteBatch',
importExcel = '/sysconfig/sysConfig/importExcel',
exportXls = '/sysconfig/sysConfig/exportXls',
}
/**
* api
* @param params
*/
export const getExportUrl = Api.exportXls;
/**
* api
*/
export const getImportUrl = Api.importExcel;
/**
*
* @param params
*/
export const list = (params) => defHttp.get({ url: Api.list, params });
/**
*
* @param params
* @param handleSuccess
*/
export const deleteOne = (params,handleSuccess) => {
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
/**
*
* @param params
* @param handleSuccess
*/
export const batchDelete = (params, handleSuccess) => {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
handleSuccess();
});
}
});
}
/**
*
* @param params
* @param isUpdate
*/
export const saveOrUpdate = (params, isUpdate) => {
let url = isUpdate ? Api.edit : Api.save;
return defHttp.post({ url: url, params }, { isTransformResponse: false });
}

View File

@ -0,0 +1,43 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
import { rules} from '/@/utils/helper/validator';
import { render } from '/@/utils/common/renderUtils';
import { getWeekMonthQuarterYear } from '/@/utils';
//列表数据
export const columns: BasicColumn[] = [
{
title: '参数名称',
align: "center",
dataIndex: 'name',
},
{
title: '键名',
align: "center",
dataIndex: 'configKey',
},
{
title: '键值',
align: "center",
dataIndex: 'configValue'
},
{
title: '备注',
align: "center",
dataIndex: 'descr'
},
{
title: '是否启用',
align: "center",
dataIndex: 'izEnabled_dictText',
width:100
},
];
// 高级查询数据
export const superQuerySchema = {
name: {title: '参数名称',order: 0,view: 'text', type: 'string',},
configKey: {title: '键名',order: 1,view: 'text', type: 'string',},
configValue: {title: '键值',order: 2,view: 'textarea', type: 'string',},
descr: {title: '备注',order: 3,view: 'textarea', type: 'string',},
izEnabled: {title: '是否启用',order: 4,view: 'text', type: 'string',},
};

View File

@ -0,0 +1,254 @@
<template>
<div class="p-2">
<!--查询区域-->
<div class="jeecg-basic-table-form-container">
<a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol"
:wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :lg="6">
<a-form-item name="name">
<template #label><span title="参数名称">参数名称</span></template>
<JInput v-model:value="queryParam.name" />
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item name="configKey">
<template #label><span title="键名">键名</span></template>
<JInput v-model:value="queryParam.configKey" />
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item name="izEnabled">
<template #label><span title="是否启用">是否启用</span></template>
<j-dict-select-tag type='list' v-model:value="queryParam.izEnabled" dictCode="iz_enabled"
placeholder="请选择是否启用"  allowClear />
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
style="margin-left: 8px">重置</a-button>
</a-col>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'sysconfig:nu_sys_config:add'" @click="handleAdd"
preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'sysconfig:nu_sys_config:exportXls'" preIcon="ant-design:export-outlined"
@click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'sysconfig:nu_sys_config:importExcel'"
preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined"></Icon>
删除
</a-menu-item>
</a-menu>
</template>
<a-button v-auth="'sysconfig:nu_sys_config:deleteBatch'">批量操作
<Icon icon="mdi:chevron-down"></Icon>
</a-button>
</a-dropdown>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
</template>
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
<!-- 表单区域 -->
<SysConfigModal ref="registerModal" @success="handleSuccess"></SysConfigModal>
</div>
</template>
<script lang="ts" name="sysconfig-sysConfig" setup>
import { ref, reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns, superQuerySchema } from './SysConfig.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './SysConfig.api';
import SysConfigModal from './components/SysConfigModal.vue'
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JInput from "/@/components/Form/src/jeecg/components/JInput.vue";
const formRef = ref();
const queryParam = reactive<any>({});
const registerModal = ref();
//table
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
title: '系统参数配置',
api: list,
columns,
canResize: false,
useSearchForm: false,
actionColumn: {
width: 230,
fixed: 'right',
},
beforeFetch: async (params) => {
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: "系统参数配置",
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess
},
});
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
const labelCol = reactive({
xs: 24,
sm: 4,
xl: 6,
xxl: 4
});
const wrapperCol = reactive({
xs: 24,
sm: 20,
});
/**
* 新增事件
*/
function handleAdd() {
registerModal.value.disableSubmit = false;
registerModal.value.add();
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
registerModal.value.disableSubmit = false;
registerModal.value.edit(record);
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
registerModal.value.disableSubmit = true;
registerModal.value.edit(record);
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
auth: 'sysconfig:nu_sys_config:edit'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
}, {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'sysconfig:nu_sys_config:delete'
}
];
}
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [
]
}
/**
* 查询
*/
function searchQuery() {
reload();
}
/**
* 重置
*/
function searchReset() {
formRef.value.resetFields();
selectedRowKeys.value = [];
//
reload();
}
</script>
<style lang="less" scoped>
.jeecg-basic-table-form-container {
padding: 0;
.table-page-search-submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
.query-group-cust {
min-width: 100px !important;
}
.query-group-split-cust {
width: 30px;
display: inline-block;
text-align: center
}
.ant-form-item:not(.ant-form-item-with-help) {
margin-bottom: 16px;
height: 32px;
}
:deep(.ant-picker),
:deep(.ant-input-number) {
width: 100%;
}
}
</style>

View File

@ -0,0 +1,180 @@
<template>
<a-spin :spinning="confirmLoading">
<JFormContainer :disabled="disabled">
<template #detail>
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol"
name="SysConfigForm">
<a-row>
<a-col :span="24">
<a-form-item label="参数名称" v-bind="validateInfos.name" id="SysConfigForm-name" name="name">
<a-input v-model:value="formData.name" placeholder="请输入参数名称" allow-clear></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="键名" v-bind="validateInfos.configKey" id="SysConfigForm-configKey" name="configKey">
<a-input v-model:value="formData.configKey" placeholder="请输入键名" allow-clear></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="键值" v-bind="validateInfos.configValue" id="SysConfigForm-configValue"
name="configValue">
<a-textarea v-model:value="formData.configValue" :rows="4" placeholder="请输入键值" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="备注" v-bind="validateInfos.descr" id="SysConfigForm-descr" name="descr">
<a-textarea v-model:value="formData.descr" :rows="4" placeholder="请输入备注" />
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="是否启用" v-bind="validateInfos.izEnabled" id="SysConfigForm-izEnabled" name="izEnabled">
<j-dict-select-tag type='radio' v-model:value="formData.izEnabled" dictCode="iz_enabled"
placeholder="请选择是否启用"  allowClear />
</a-form-item>
</a-col>
</a-row>
</a-form>
</template>
</JFormContainer>
</a-spin>
</template>
<script lang="ts" setup>
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { getValueType } from '/@/utils';
import { saveOrUpdate } from '../SysConfig.api';
import { Form } from 'ant-design-vue';
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
import { duplicateValidate } from '/@/utils/helper/validator'
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
const props = defineProps({
formDisabled: { type: Boolean, default: false },
formData: { type: Object, default: () => ({}) },
formBpm: { type: Boolean, default: true }
});
const formRef = ref();
const useForm = Form.useForm;
const emit = defineEmits(['register', 'ok']);
const formData = reactive<Record<string, any>>({
id: '',
name: '',
configKey: '',
configValue: '',
descr: '',
izEnabled: '0',
delFlag: '0',
});
const { createMessage } = useMessage();
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
const confirmLoading = ref<boolean>(false);
//
const validatorRules = reactive({
configKey: [{ required: true, message: '请输入键名!' }, { validator: configKeyDuplicatevalidate }],
izEnabled: [{ required: true, message: '请输入是否启用!' },],
});
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
//
const disabled = computed(() => {
if (props.formBpm === true) {
if (props.formData.disabled === false) {
return false;
} else {
return true;
}
}
return props.formDisabled;
});
/**
* 新增
*/
function add() {
edit({});
}
/**
* 编辑
*/
function edit(record) {
nextTick(() => {
resetFields();
const tmpData = {};
Object.keys(formData).forEach((key) => {
if (record.hasOwnProperty(key)) {
tmpData[key] = record[key]
}
})
//
Object.assign(formData, tmpData);
});
}
/**
* 提交数据
*/
async function submitForm() {
try {
//
await validate();
} catch ({ errorFields }) {
if (errorFields) {
const firstField = errorFields[0];
if (firstField) {
formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
}
}
return Promise.reject(errorFields);
}
confirmLoading.value = true;
const isUpdate = ref<boolean>(false);
//
let model = formData;
if (model.id) {
isUpdate.value = true;
}
//
for (let data in model) {
//
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
await saveOrUpdate(model, isUpdate.value)
.then((res) => {
if (res.success) {
createMessage.success(res.message);
emit('ok');
} else {
createMessage.warning(res.message);
}
})
.finally(() => {
confirmLoading.value = false;
});
}
async function configKeyDuplicatevalidate(_r, value) {
return duplicateValidate('nu_sys_config', 'config_key', value, formData.id || '')
}
defineExpose({
add,
edit,
submitForm,
});
</script>
<style lang="less" scoped>
.antd-modal-form {
padding: 14px;
}
</style>

View File

@ -0,0 +1,77 @@
<template>
<j-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
<SysConfigForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></SysConfigForm>
</j-modal>
</template>
<script lang="ts" setup>
import { ref, nextTick, defineExpose } from 'vue';
import SysConfigForm from './SysConfigForm.vue'
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
const title = ref<string>('');
const width = ref<number>(800);
const visible = ref<boolean>(false);
const disableSubmit = ref<boolean>(false);
const registerForm = ref();
const emit = defineEmits(['register', 'success']);
/**
* 新增
*/
function add() {
title.value = '新增';
visible.value = true;
nextTick(() => {
registerForm.value.add();
});
}
/**
* 编辑
* @param record
*/
function edit(record) {
title.value = disableSubmit.value ? '详情' : '编辑';
visible.value = true;
nextTick(() => {
registerForm.value.edit(record);
});
}
/**
* 确定按钮点击事件
*/
function handleOk() {
registerForm.value.submitForm();
}
/**
* form保存回调事件
*/
function submitCallback() {
handleCancel();
emit('success');
}
/**
* 取消按钮回调事件
*/
function handleCancel() {
visible.value = false;
}
defineExpose({
add,
edit,
disableSubmit,
});
</script>
<style lang="less">
/**隐藏样式-modal确定按钮 */
.jee-hidden {
display: none !important;
}
</style>
<style lang="less" scoped></style>

View File

@ -23,10 +23,49 @@
</a-form>
</div>
<a-row>
<a-col :span="6" v-for="(item,index) in dataList" :key="index">
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
<a-col :span="4">
<div class="bjclass">
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" @error="setDefaultImage"/>
</div>
</a-col>
<a-col :span="20" style="padding-left: 15px;">
<div>
<span class="titleOne">
{{item.name}} /
{{item.sex_dictText?item.sex_dictText:'无'}}
</span>
</div>
<div style="height: 130px">
<div class="center-lines">入职日期: {{item.entryTime }}</div>
<div class="center-lines">身份证号: {{item.idCard }}</div>
<div class="center-lines">联系电话: {{item.tel }}</div>
<div class="center-lines">出生日期: {{item.dateOfBirth }}</div>
</div>
<div style="color: #857f7f;">
<span style="float:left;"><Icon icon="ant-design:user-add-outlined" :size="18" /><span style="margin-left:5px;">{{ item.createBy_dictText }}</span></span>
<span style="margin-left: 15px;float:left;"><Icon icon="ant-design:field-time-outlined" :size="20" /><span style="margin-left:5px;font-size:16px;">{{ item.createTime.substring(0,10) }}</span></span>
<span style="margin-right: 15px;float:right;">
<a-dropdown :trigger="['hover']" placement="topRight">
<a-button type="link"><Icon icon="ant-design:more-outlined" :size="20" /></a-button>
<template #overlay>
<a-menu>
<a-menu-item @click="handleEdit(item)">编辑</a-menu-item>
<a-menu-item @click="handleFwbq(item)">服务标签</a-menu-item>
<a-menu-item @click="handleFpzh(item)">分配账号</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</span>
</div>
</a-col>
</a-row>
</a-col>
<!-- <a-col :span="6" v-for="(item,index) in dataList" :key="index">
<a-card :title="item.name +'/'+item.sex_dictText" class="cardClass">
<template #extra><a title="操作">
<a-popover title="功能" style="width: 300px;">
<template #content>
<div>
@ -43,9 +82,7 @@
</template>
<icon icon="ant-design:setting-outlined" />
</a-popover>
</a></template>
<!-- 人员信息 -->
<a-row>
<a-col :span="8" style="padding: 0 8px;">
<img
@ -62,12 +99,17 @@
</a-col>
</a-row>
</a-card>
</a-col>
<a-col :span="24" style="text-align: right;">
</a-col> -->
<!-- <a-col :span="24" style="text-align: right;">
<a-pagination v-model:current="current" v-model:page-size="pageSize" :total="total" show-less-items @change="onPageChange" />
</a-col>
</a-col> -->
</a-row>
<div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
<span style="margin-right: 10px;"> {{ total }} 条数据</span>
<Pagination showLessItems v-model:current="current" :pageSize="pageSize" size="small"
show-quick-jumper :total="total" @change="onPageChange" />
</div>
<!-- 表单区域 -->
@ -103,7 +145,7 @@
const registerServiceTagModal = ref();
const dataList = ref<any[]>([]);
const current = ref(1);
const pageSize = ref(8);
const pageSize = ref(12);
const total = ref(0);
const labelCol = reactive({
@ -123,7 +165,7 @@
if(headPath){
return getFileAccessHttpUrl(headPath);
}else{
return '../../../../../public/resource/img/logo.png';
return '../resource/img/logo.png';
}
}
@ -276,4 +318,30 @@ function onPageChange(page,pageSize){
.buttonMargin{
margin: 3px;
}
.bjclass{
text-align: center;
margin-top: 16px;
border-radius: 50%;
width: 60px;
height: 60px;
background: linear-gradient(to bottom, #fff, #efe9e9);
}
.titleOne {
font-size: 16px;
font-weight: 600;
height: 40px;
line-height: 40px;
margin-bottom: 10px;
}
.ellipsis-two-lines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 限制文本为2行 */
overflow: hidden;
text-overflow: ellipsis;
line-height:24px;color: #5a5a5a;
}
.center-lines {
line-height:24px;color: #5a5a5a;
}
</style>

View File

@ -27,66 +27,61 @@
</a-row>
</a-form>
</div>
<a-row>
<a-col :span="6" v-for="(item,index) in dataList" :key="index">
<a-card class="cardClass">
<template #title>
{{item.customerName}} /
{{item.customerSex_dictText?item.customerSex_dictText:'无'}} /
<span v-if="item.currentState=='0'" style="color: #1890ff">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='1'" style="color: green">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='2'" style="color: #ff6c00">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='3'" style="color: red">{{item.currentState_dictText}}</span>
</template>
<template #extra><a title="操作">
<a-popover title="功能" style="width: 300px;" placement="topRight">
<template #content>
<div>
<span class="buttonMargin">
<a-button type="primary" @click="handleEdit(item)">编辑</a-button>
</span>
<span class="buttonMargin" v-if="item.currentState!='3'">
<a-button type="primary" @click="handleCheckNu(item)">更换护理单元</a-button>
</span>
<span class="buttonMargin" v-if="item.currentState=='1'">
<a-button type="primary" @click="handleWaichu(item)">外出</a-button>
</span>
<span class="buttonMargin" v-if="item.currentState=='2'">
<a-button type="primary" @click="handleFanhui(item)">返回</a-button>
</span>
<span class="buttonMargin" v-if="item.currentState=='1' || item.currentState=='2'">
<a-button type="primary" @click="handleTuizhu(item)">退住</a-button>
</span>
</div>
</template>
<icon icon="ant-design:setting-outlined" />
</a-popover>
</a></template>
<!-- 人员信息 -->
<a-row>
<a-col :span="8" style="padding: 0 8px;">
<img
width="100%"
:src="handleHeadPath(item.headPath)"
@error="setDefaultImage"
/>
</a-col>
<a-col :span="16">
<p>护理单元{{item.nuId_dictText }}</p>
<p>报销类型{{item.reimbType_dictText }}</p>
<p>医保类型{{item.medicalType_dictText }}</p>
<p>联系电话{{item.contactNumber }}</p>
</a-col>
</a-row>
</a-card>
</a-col>
<a-col :span="24" style="text-align: right;">
<a-pagination v-model:current="current" v-model:page-size="pageSize" :total="total" show-less-items @change="onPageChange" />
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;">
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
<a-col :span="4">
<div class="bjclass">
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" />
</div>
</a-col>
<a-col :span="20" style="padding-left: 15px;">
<div>
<span class="titleOne">
{{item.customerName}} /
{{item.customerSex_dictText?item.customerSex_dictText:'无'}} /
<span v-if="item.currentState=='0'" style="color: #1890ff">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='1'" style="color: green">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='2'" style="color: #ff6c00">{{item.currentState_dictText}}</span>
<span v-if="item.currentState=='3'" style="color: red">{{item.currentState_dictText}}</span>
</span>
</div>
<div style="height: 130px">
<div class="center-lines">护理单元{{item.nuId_dictText }}</div>
<div class="center-lines">报销类型{{item.reimbType_dictText }}</div>
<div class="center-lines">医保类型{{item.medicalType_dictText }}</div>
<div class="center-lines">联系电话{{item.contactNumber }}</div>
</div>
<div style="color: #857f7f;">
<span style="float:left;"><Icon icon="ant-design:user-add-outlined" :size="18" /><span style="margin-left:5px;">{{ item.createBy_dictText }}</span></span>
<span style="margin-left: 15px;float:left;"><Icon icon="ant-design:field-time-outlined" :size="20" /><span style="margin-left:5px;font-size:16px;">{{ item.createTime.substring(0,10) }}</span></span>
<span style="margin-right: 15px;float:right;">
<a-dropdown :trigger="['hover']" placement="topRight">
<a-button type="link"><Icon icon="ant-design:more-outlined" :size="20" /></a-button>
<template #overlay>
<a-menu>
<a-menu-item @click="handleEdit(item)">编辑</a-menu-item>
<a-menu-item @click="handleCheckNu(item)" v-if="item.currentState!='3'">更换护理单元</a-menu-item>
<a-menu-item @click="handleWaichu(item)" v-if="item.currentState=='1'">外出</a-menu-item>
<a-menu-item @click="handleFanhui(item)" v-if="item.currentState=='2'">返回</a-menu-item>
<a-menu-item @click="handleTuizhu(item)" v-if="item.currentState=='1' || item.currentState=='2'">退住</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</span>
</div>
</a-col>
</a-row>
</a-col>
</a-row>
<div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
<span style="margin-right: 10px;"> {{ total }} 条数据</span>
<Pagination showLessItems v-model:current="current" :pageSize="pageSize" size="small"
show-quick-jumper :total="total" @change="onPageChange" />
</div>
<!-- 表单区域 -->
<NuBizCustomerInfoModal ref="registerModal" @success="handleSuccess"></NuBizCustomerInfoModal>
<CheckNuListModal ref="checkNuListModal" @success="handleSuccess"></CheckNuListModal>
@ -114,7 +109,7 @@
const userStore = useUserStore();
const dataList = ref<any[]>([]);
const current = ref(1);
const pageSize = ref(8);
const pageSize = ref(12);
const total = ref(0);
const labelCol = reactive({
xs:24,
@ -158,7 +153,7 @@
if(headPath){
return getFileAccessHttpUrl(headPath);
}else{
return '../../../../../public/resource/img/logo.png';
return '../resource/img/logo.png';
}
}
/**
@ -226,21 +221,6 @@
];
}
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [ {
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
placement: 'topLeft',
},
auth: 'nuBizCustomerInfo:nu_biz_customer_info:delete'
}
]
}
/**
* 查询
@ -258,12 +238,17 @@
reload();
}
/**
* 分页
*/
function onPageChange(page,pageSize){
console.log('onPageChange', page,pageSize);
current.value = page;
reload();
}
/**
* 加载数据
*/
function reload(){
queryParam.pageSize = pageSize;
queryParam.pageNo = current;
@ -320,4 +305,30 @@
.buttonMargin{
margin: 3px;
}
.bjclass{
text-align: center;
margin-top: 16px;
border-radius: 50%;
width: 60px;
height: 60px;
background: linear-gradient(to bottom, #fff, #efe9e9);
}
.titleOne {
font-size: 16px;
font-weight: 600;
height: 40px;
line-height: 40px;
margin-bottom: 10px;
}
.ellipsis-two-lines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 限制文本为2行 */
overflow: hidden;
text-overflow: ellipsis;
line-height:24px;color: #5a5a5a;
}
.center-lines {
line-height:24px;color: #5a5a5a;
}
</style>

View File

@ -57,62 +57,71 @@
</a-row>
</a-form>
</div>
<a-row>
<a-col :span="4" style="padding: 0 10px 0 0;">
<div style="height:729px;background:white;padding: 10px; ">
<a-tabs v-model:activeKey="activeKey" tabPosition="left" type="card" style="height:600px;">
<a-tab-pane :key="key" v-for="(item,key) in treeData">
<!-- 一级分类 -->
<template #tab>
<div><img src="/src/assets/images/logo.png" /></div>
<span title="{{item.title}}">{{item.title}}</span>
</template>
<div>
<div style="width:300px;float: left;">
<div style="with: 100%;display: flex;">
<div class="all-card">
<div v-for="(item, index) in treeData" :key="index" style="position: relative;">
<div :class="clickCount === index ? 'card-target' : 'card'" :style="getCardStyle(index,treeData.length)" @click="handleClick(index,item)">
<img class="logo" src="/src/assets/images/logo.png" width="30" height="30" />
<span style="margin-top: 8px;">{{ item.title }}</span>
</div>
<div v-show="clickCount === index && index !== 4" class="sanjiao-down"></div>
<div v-show="clickCount === index && index" class="sanjiao-up"></div>
</div>
</div>
<div style="background: #fff;border-radius: 0px 5px 5px 5px ;width: calc(100% - 80px);">
<a-menu
v-model:openKeys="openKeys"
v-model:selectedKeys="selectedKeys"
style="height:690px;overflow:auto;"
style="height:720px;overflow-y:auto;overflow-x: hidden;"
mode="inline"
>
<template v-for="(item2,key2) in item.children" >
<a-sub-menu v-if="item2.children.length>0" :key="`sub`+key2" style="background-image: url('/src/assets/images/bj.png');text-align:center;border-radius:5px;">
<template v-for="(item2,key2) in treeChildData" >
<a-sub-menu v-if="item2.children.length>0" :key="`sub`+key2" style="margin:20px;background-image: url('../resource/img/bj.png');text-align:center;border-radius:5px;">
<template #title>
<div>
<div style="height:50px;line-height:50px;">
<span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span>
</div>
</template>
<a-menu-item v-for="(item3,key3) in item2.children" :key="key3" style="height:50px;" >
<div @click="onSelect(item3)"><span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span></div>
<div @click="onSelect(item3)">
<span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span>
</div>
</a-menu-item>
</a-sub-menu>
<a-menu-item v-if="item2.children.length==0" :key="`sub`+key2" style="background-image: url('/src/assets/images/bj.png');text-align:center;border-radius:5px;">
<a-menu-item v-if="item2.children.length==0" :key="`sub`+key2" style="margin:20px;background-image: url('../resource/img/bj.png');text-align:center;border-radius:5px;width:85%;height:50px;line-height:50px;">
<div @click="onSelect(item2)">
<span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span>
</div>
</a-menu-item>
</template>
</a-menu>
</a-tab-pane>
</a-tabs>
</div>
</div>
</div>
</a-col>
<a-col :span="20">
<!--引用表格-->
<BasicTable @register="registerTable" >
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'configMaterialInfo:config_material_info:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'configMaterialInfo:config_material_info:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'configMaterialInfo:config_material_info:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
</a-col>
</a-row>
<div style="width:calc(100% - 320px);float: left;margin-left: 20px;">
<!--引用表格-->
<BasicTable @register="registerTable" >
<!--插槽:table标题-->
<template #tableTitle>
<a-button type="primary" v-auth="'configMaterialInfo:config_material_info:add'" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" v-auth="'configMaterialInfo:config_material_info:exportXls'" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" v-auth="'configMaterialInfo:config_material_info:importExcel'" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template v-slot:bodyCell="{ column, record, index, text }">
</template>
</BasicTable>
</div>
</div>
<!-- 表单区域 -->
<ConfigMaterialInfoModal ref="registerModal" @success="handleSuccess"></ConfigMaterialInfoModal>
@ -143,11 +152,40 @@ import type { CollapseProps } from 'ant-design-vue';
const registerModal = ref();
const userStore = useUserStore();
let treeData = ref<any>([]);
let treeChildData = ref<any>([]);
const activeKey = ref(0);
const activeKey2 = ref(0);
const rootSubmenuKeys= ['sub1']
const openKeys= []
const selectedKeys= []
const clickCount = ref(0);
/**
* 点击菜单
* @param index 菜单索引
* @param lengths 菜单数量
* @param item 菜单数据
*/
const handleClick = (index,item) => {
clickCount.value = index;
treeChildData.value = item.children;
};
const getCardStyle = (index,allSize) => {
const style = {borderBottomLeftRadius:'',borderTopLeftRadius:''};
if (clickCount.value - 1 === index) {
style.borderBottomLeftRadius = '5px';
}
if (clickCount.value + 1 === index) {
style.borderTopLeftRadius= '5px';
}
if(!index){
style.borderTopLeftRadius= '5px';
}
if(index === allSize){
style.borderBottomLeftRadius= '5px';
}
return style;
};
//table
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
@ -307,6 +345,12 @@ import type { CollapseProps } from 'ant-design-vue';
onMounted(() => {
defHttp.get({url:'/ConfigMaterial/configMaterialCategory/getMaterialTreeData'}).then(res =>{
treeData.value = res;
console.log("🚀 ~ defHttp.get ~ treeData:", treeData)
console.log("🚀 ~ defHttp.get ~ res:", res)
if(treeData.value.length > 0){
treeChildData.value = treeData.value[0].children;
}
})
});
@ -337,4 +381,67 @@ import type { CollapseProps } from 'ant-design-vue';
width: 100%;
}
}
.all-card {
width: 80px;
height: 730px;
// background-color: rgb(217, 230, 239);
// display: flex;
/* justify-content: flex-end; */
align-items: flex-end;
flex-direction: column;
// padding-top: 10px;
}
.card {
display: flex;
justify-content: center;
align-items: center;
width: 80px;
height: 120px;
flex-direction: column;
background-color: rgb(243, 248, 251);
/* border-radius: 25px; */
}
.card-target {
display: flex;
justify-content: center;
align-items: center;
width: 80px;
height: 120px;
flex-direction: column;
background-color: #fff;
border-top-left-radius: 30px;
border-bottom-left-radius: 30px;
/* position: relative; */
/* border-radius: 10px; */
}
.sanjiao-down {
position: absolute;
bottom: -26px;
left: 17px;
width: 64px;
/* 上边长度 */
height: 27px;
/* 右边长度 */
background-color: #fff;
/* 三角形填充色 */
/* 三点依次为:右上 (100% 0),右下 (100% 100%),左上 (0 0) */
clip-path: polygon(100% 0, 100% 100%, 0 0);
z-index: 999;
}
.sanjiao-up {
position: absolute;
top: -26px;
left: 17px;
width: 64px;
height: 27px;
background-color: #fff;
/* 三点依次为:右下 (100% 100%),左下 (0 100%),右上 (100% 0) */
clip-path: polygon(100% 100%, 0 100%, 100% 0);
z-index: 999;
}
</style>

View File

@ -25,14 +25,26 @@
</a-form>
</div>
<a-row>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id">
<a-card :bordered="false" style="margin: 5px;">
<!-- 自定义标题区域 -->
<template #title>
<div style="display: flex; align-items: center; justify-content: space-between;">
<span>{{ directive.packageName }}</span>
<a-dropdown :trigger="['hover']" placement="bottomRight">
<a-button type="link" preIcon="tabler:settings"></a-button>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
<a-col :span="4">
<div class="bjclass">
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
</div>
</a-col>
<a-col :span="20" style="padding-left: 15px;">
<div>
<span class="titleOne">{{ directive.packageName }}</span>
</div>
<div style="height: 130px">
<span class="ellipsis-two-lines" :title="directive.description">{{ directive.description }}</span>
</div>
<div style="color: #857f7f;">
<span style="float:left;"><Icon icon="ant-design:user-add-outlined" :size="18" /><span style="margin-left:5px;">{{ directive.createBy_dictText }}</span></span>
<span style="margin-left: 15px;float:left;"><Icon icon="ant-design:field-time-outlined" :size="20" /><span style="margin-left:5px;font-size:16px;">{{ directive.createTime.substring(0,10) }}</span></span>
<span style="margin-right: 15px;float:right;">
<a-dropdown :trigger="['hover']" placement="topRight">
<a-button type="link"><Icon icon="ant-design:more-outlined" :size="20" /></a-button>
<template #overlay>
<a-menu>
<a-menu-item @click="packageEdit(directive)">
@ -47,25 +59,14 @@
</a-menu>
</template>
</a-dropdown>
</span>
</div>
</template>
<!-- 保持原有内容区域 -->
<div style="position: relative; height: 23vh;">
<div
style="height: 80%; overflow-y: auto; line-height: 1.5;white-space: pre-line;word-wrap: break-word;overflow-wrap: break-word;">
{{ directive.description }}
</div>
<div
style="position: absolute;bottom: 0;right: 0;font-weight: 600;color: rgba(0, 0, 0, 0.6);padding: 8px 0 0;">
{{ directive.createTime }} - {{ directive.createBy_dictText }}
</div>
</div>
</a-card>
</a-col>
</a-row>
</a-col>
</a-row>
<div
style="position: fixed;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
<span style="margin-right: 10px;"> {{ tableData.total }} 条数据</span>
<Pagination showLessItems v-model:current="pageParams.pageNo" :pageSize="pageParams.pageSize" size="small"
show-quick-jumper :total="tableData.total" @change="queryList" />
@ -96,7 +97,7 @@ const wrapperCol = reactive({
xl: 14,
xxl: 14
});
const pageParams = ref({ pageNo: 1, pageSize: 8 })
const pageParams = ref({ pageNo: 1, pageSize: 12 })
/**
* 搜索
@ -156,7 +157,7 @@ function remove(data) {
}
onMounted(() => {
queryList({ pageNo: 1, pageSize: 10 })
queryList({ pageNo: 1, pageSize: 12 })
})
</script>
@ -190,4 +191,27 @@ onMounted(() => {
width: 100%;
}
}
.bjclass{
text-align: center;
margin-top: 16px;
border-radius: 50%;
width: 60px;
height: 60px;
background: linear-gradient(to bottom, #fff, #efe9e9);
}
.titleOne {
font-size: 16px;
font-weight: 600;
height: 40px;
line-height: 40px;
margin-bottom: 10px;
}
.ellipsis-two-lines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 限制文本为2行 */
overflow: hidden;
text-overflow: ellipsis;
line-height:24px;color: #5a5a5a;
}
</style>

View File

@ -5,31 +5,53 @@
<a-drawer v-model:open="visible" v-if="visible" :title="title" width="80vw" :closable="false"
:footer-style="{ textAlign: 'right' }" @close="handleCancel">
<div style="display:flex;justify-content:space-between">
<div>
<a-card title="服务指令包详情" style="width: 25vw">
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw">
<div style="font-size: 18px;font-weight:700;padding: 15px">服务指令包详情</div>
<DirectivePackageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false">
</DirectivePackageForm>
</a-card>
</div>
<a-card title="服务指令" style="width: 25vw">
<template #extra>
<a href="javascript:void(0);" @click="handleQuoteDirectives">引用 </a>
<a href="javascript:void(0);" @click="handleAddDirectives">新增</a>
</template>
<div class="scrollable-content">
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;">
<div style="padding: 15px;height: 30px;width:100%;">
<a-row>
<a-col :span="12">
<span style="font-size: 18px;font-weight:700;">服务指令</span>
</a-col>
<a-col :span="12" style="text-align: right;">
<span style="color: #777;">
<Icon icon="ant-design:reconciliation-outlined" /><a href="javascript:void(0);" @click="handleQuoteDirectives" style="color: #777;">引用 </a>
</span>
<span style="color: #777;margin-left: 10px;">
<Icon icon="ant-design:file-add-outlined" /><a href="javascript:void(0);" @click="handleAddDirectives" style="color: #777;">新增</a>
</span>
</a-col>
</a-row>
</div>
<div style="margin-top: 15px;">
<a-row>
<a-col :span="22" :push="1" v-for="directive of seletedRecord.directives" :key="directive.id"
style="margin-top: 15px;" @click="directiveInfo(directive)">
<a-badge-ribbon :text="filterDictTextByCache('period_type', directive.cycleType)"
:style="{ top: '-10px' }">
style="margin-top: 15px;border-radius: 5px;" @click="directiveInfo(directive)" :class="{ 'selected': selectedDirective === directive.id }">
<a-card size="small">
<span>
<a-popconfirm title="是否确认移除?" ok-text="确认" cancel-text="取消"
@confirm="deleteDirective(directive.id)">
<a-button type="link" danger preIcon="ic:baseline-remove-circle"></a-button>
</a-popconfirm>
</span>
<div :class="{ 'selected': selectedDirective === directive.id }">
<div >
<a-row :span="24">
<a-col :span="12" >
<span style="background-color: #67b4eb;border-radius: 50%;padding: 3px;color: white;width:27px;display: block;text-align: center;" v-if="selectedDirective === directive.id">
<a-popconfirm title="是否确认移除?" ok-text="确认" cancel-text="取消"
@confirm="deleteDirective(directive.id)">
<Icon icon="ant-design:delete-outlined" size="18"/>
</a-popconfirm>
</span>
</a-col>
<a-col :span="12" style="text-align: right;">
<span v-if="directive.cycleType=='1'" style="background-color: #1c9ef9;border-radius: 0 15px 15px 15px;padding: 5px 10px;color:white;">{{filterDictTextByCache('period_type', directive.cycleType)}}</span>
<span v-if="directive.cycleType=='2'" style="background-color: #7a5ffd;border-radius: 0 15px 15px 15px;padding: 5px 10px;color:white;">{{filterDictTextByCache('period_type', directive.cycleType)}}</span>
<span v-if="directive.cycleType=='3'" style="background-color: #35b082;border-radius: 0 15px 15px 15px;padding: 5px 10px;color:white;">{{filterDictTextByCache('period_type', directive.cycleType)}}</span>
</a-col>
</a-row>
</div>
<div style="margin-top: 10px;">
<div>
{{ directive.directiveName }}
</div>
@ -41,36 +63,43 @@
</div>
</div>
</a-card>
</a-badge-ribbon>
</a-col>
</a-row>
</div>
</a-card>
</div>
<div>
<a-card title="服务指令详情" style="width: 25vw">
<div class="">分类标签{{ filterDictTextByCache('instruction_tag', derectiveInfo.instructionTagId) }}</div>
<div class="directiveInfoClass">服务类别{{ derectiveInfo.categoryName || derectiveInfo.categoryId_dictText }}
<div style="border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;border: 1px solid #dcdfe6;">
<div style="padding: 15px;height: 30px;width:100%;">
<a-row>
<a-col :span="24">
<span style="font-size: 18px;font-weight:700;">服务指令详情</span>
</a-col>
</a-row>
</div>
<div class="directiveInfoClass">服务类型{{ derectiveInfo.typeName || derectiveInfo.typeId_dictText }}</div>
<div class="directiveInfoClass">服务指令名称{{ derectiveInfo.directiveName }}</div>
<div class="directiveInfoClass">周期类型{{ filterDictTextByCache('period_type', derectiveInfo.cycleType) }}</div>
<div class="directiveInfoClass">服务时长(分钟){{ derectiveInfo.serviceDuration }}</div>
<div class="directiveInfoClass">服务说明{{ derectiveInfo.serviceContent }}</div>
<div class="directiveInfoClass">体型标签{{ handleBodyTags('', derectiveInfo, '') }}</div>
<div class="directiveInfoClass">情绪标签{{ handleEmotionTags('', derectiveInfo, '') }}</div>
<div class="directiveInfoClass">语音文件
<span v-if="!derectiveInfo.mp3File">暂无文件</span>
<audio controls disabled="false" v-else>
<source :src="getFileAccessHttpUrl(derectiveInfo.mp3File)">
</audio>
<div style="margin-top: 20px;padding: 15px;">
<div class="directiveInfoClass">服务类别{{ derectiveInfo.categoryName || derectiveInfo.categoryId_dictText }}</div>
<div class="directiveInfoClass">服务类型{{ derectiveInfo.typeName || derectiveInfo.typeId_dictText }}</div>
<div class="directiveInfoClass">服务指令名称{{ derectiveInfo.directiveName }}</div>
<div class="directiveInfoClass">周期类型{{ filterDictTextByCache('period_type', derectiveInfo.cycleType) }}</div>
<div class="directiveInfoClass">服务时长(分钟){{ derectiveInfo.serviceDuration }}</div>
<div class="directiveInfoClass">服务说明{{ derectiveInfo.serviceContent }}</div>
<div class="directiveInfoClass">体型标签{{ handleBodyTags('', derectiveInfo, '') }}</div>
<div class="directiveInfoClass">情绪标签{{ handleEmotionTags('', derectiveInfo, '') }}</div>
<div class="directiveInfoClass">语音文件
<span v-if="!derectiveInfo.mp3File">暂无文件</span>
<audio controls disabled="false" v-else>
<source :src="getFileAccessHttpUrl(derectiveInfo.mp3File)">
</audio>
</div>
<div class="directiveInfoClass">视频文件
<span v-if="!derectiveInfo.mp4File">暂无文件</span>
<video controls v-else>
<source :src="getFileAccessHttpUrl(derectiveInfo.mp4File)">
</video>
</div>
</div>
<div class="directiveInfoClass">视频文件
<span v-if="!derectiveInfo.mp4File">暂无文件</span>
<video controls v-else>
<source :src="getFileAccessHttpUrl(derectiveInfo.mp4File)">
</video>
</div>
</a-card>
</div>
</div>
</div>
@ -303,8 +332,7 @@ defineExpose({
</style>
<style lang="less" scoped>
.selected {
color: rgb(0, 156, 0);
font-weight: bold;
border: 1px solid #1890ff;
}
.directiveInfoClass {

View File

@ -27,12 +27,7 @@
<div>
<div class="scrollable-content">
<a-row>
<a-col :span="11" :push="1" v-for="(directive, index) of tableData.records" :key="directive.id">
<!-- <a-popover :placement="index % 2 == 0 ? 'left' : 'right'">
<template #content>
<p style="width: 10vw; word-wrap: break-word; white-space: pre-wrap">{{ directive.description ||
'暂无说明' }}</p>
</template> -->
<a-col :span="11" :push="1" v-for="(directive, index) of tableData.records" :key="index">
<a-card :bordered="false" size="small" class="smart-card"
style="margin: 10px;box-shadow: 1px 1px 5px #b0b0b0;" @click="handlePackageClick(directive)"
:class="{ 'selected': selectedDirective.id === directive.id }">

View File

@ -14,10 +14,8 @@
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
style="margin-left: 8px">重置</a-button>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleAdd"
style="margin-left: 8px">新增</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleAdd" style="margin-left: 8px">新增</a-button>
</a-col>
</span>
</a-col>
@ -25,14 +23,26 @@
</a-form>
</div>
<a-row>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id">
<a-card :bordered="false" style="margin: 5px;">
<!-- 自定义标题区域 -->
<template #title>
<div style="display: flex; align-items: center; justify-content: space-between;">
<span>{{ directive.tagName }}</span>
<a-dropdown :trigger="['hover']" placement="bottomRight">
<a-button type="link" preIcon="tabler:settings"></a-button>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;">
<a-row style="padding: 5px;background-color: white;border-radius: 5px;height: 220px;">
<a-col :span="4">
<div class="bjclass">
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
</div>
</a-col>
<a-col :span="20" style="padding-left: 15px;">
<div>
<span class="titleOne">{{ directive.tagName }}</span>
</div>
<div style="height: 130px">
<span class="ellipsis-two-lines" :title="directive.description">{{ directive.description }}</span>
</div>
<div style="color: #857f7f;">
<span style="float:left;"><Icon icon="ant-design:user-add-outlined" :size="18" /><span style="margin-left:5px;">{{ directive.createBy_dictText }}</span></span>
<span style="margin-left: 15px;float:left;"><Icon icon="ant-design:field-time-outlined" :size="20" /><span style="margin-left:5px;font-size:16px;">{{ directive.createTime.substring(0,10) }}</span></span>
<span style="margin-right: 15px;float:right;">
<a-dropdown :trigger="['hover']" placement="topRight">
<a-button type="link"><Icon icon="ant-design:more-outlined" :size="20" /></a-button>
<template #overlay>
<a-menu>
<a-menu-item @click="tagEdit(directive)">
@ -47,25 +57,14 @@
</a-menu>
</template>
</a-dropdown>
</span>
</div>
</template>
<!-- 保持原有内容区域 -->
<div style="position: relative; height: 11vh;">
<div
style="height: 75%; overflow-y: auto; line-height: 1.5;white-space: pre-line;word-wrap: break-word;overflow-wrap: break-word;">
{{ directive.description }}
</div>
<div
style="position: absolute;bottom: 0;right: 0;font-weight: 600;color: rgba(0, 0, 0, 0.6);padding: 8px 0 0;">
{{ directive.createTime }} - {{ directive.createBy_dictText }}
</div>
</div>
</a-card>
</a-col>
</a-row>
</a-col>
</a-row>
<div
style="position: fixed;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
<div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
<span style="margin-right: 10px;"> {{ tableData.total }} 条数据</span>
<Pagination showLessItems v-model:current="pageParams.pageNo" :pageSize="pageParams.pageSize" size="small"
show-quick-jumper :total="tableData.total" @change="queryList" />
@ -156,7 +155,7 @@ function remove(data) {
}
onMounted(() => {
queryList({ pageNo: 1, pageSize: 10 })
queryList({ pageNo: 1, pageSize: 12 })
})
</script>
@ -190,4 +189,27 @@ onMounted(() => {
width: 100%;
}
}
.bjclass{
text-align: center;
margin-top: 16px;
border-radius: 50%;
width: 60px;
height: 60px;
background: linear-gradient(to bottom, #fff, #efe9e9);
}
.titleOne {
font-size: 16px;
font-weight: 600;
height: 40px;
line-height: 40px;
margin-bottom: 10px;
}
.ellipsis-two-lines {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2; /* 限制文本为2行 */
overflow: hidden;
text-overflow: ellipsis;
line-height:24px;color: #5a5a5a;
}
</style>

View File

@ -122,8 +122,8 @@
const rememberMe = ref(false);
const formData = reactive({
account: 'admin',
password: '123456',
account: '',
password: '',
inputCode: '',
});
const randCodeData = reactive({

View File

@ -81,10 +81,9 @@ export function useBasicFormSchema() {
// 机构类型选项
export const orgCategoryOptions = {
// 一级部门
root: [{ value: '1', label: '公司' }],
root: [{ value: '1', label: '机构' }],
// 子级部门
child: [
{ value: '2', label: '部门' },
{ value: '3', label: '岗位' },
{ value: '2', label: '区域' },
],
};

View File

@ -132,8 +132,8 @@
//
const formData = reactive<any>({
inputCode: '',
username: 'admin',
password: '123456',
username: '',
password: '',
});
//
const phoneFormData = reactive<any>({