This commit is contained in:
1378012178@qq.com 2025-05-13 15:45:03 +08:00
commit 3e1297b8f0
29 changed files with 1413 additions and 144 deletions

View File

@ -196,24 +196,28 @@
.jeecg-menu-item-active:not(.jeecg-menu-submenu) { .jeecg-menu-item-active:not(.jeecg-menu-submenu) {
color: white !important; color: white !important;
background-color: #1890ff !important; background-color: #1890ff !important;
border-radius: 5px; border-radius: 8px;
margin: 10px 20px; margin: 0px 20px 0 20px;
padding: 10px; }
.jeecg-menu-vertical .jeecg-menu-item:hover, .jeecg-menu-vertical .jeecg-menu-submenu-title:hover {
color: #fff !important;
border-radius: 8px;
background: #c9cacc;
margin: 10px 20px 0 20px;
} }
// .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 { .jeecg-menu-light.jeecg-menu-vertical .jeecg-menu-item-active.jeecg-menu-submenu {
color: #606266 !important;
background: #f0f0f0; background: #f0f0f0;
}
.jeecg-menu-vertical .jeecg-menu-item, .jeecg-menu-vertical .jeecg-menu-submenu-title {
position: relative;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
margin-top: 10px;
padding: 8px;
} }
</style> </style>

View File

@ -504,7 +504,7 @@
padding: 24px 10px 0px 10px; padding: 24px 10px 0px 10px;
margin-bottom: 8px; margin-bottom: 8px;
background-color: @component-background; background-color: @component-background;
border-radius: 5px; border-radius: 8px;
} }
} }
@ -523,7 +523,7 @@
.ant-table-wrapper { .ant-table-wrapper {
padding: 6px; padding: 6px;
background-color: @component-background; background-color: @component-background;
border-radius: 5px; border-radius: 8px;
.ant-table-title { .ant-table-title {
min-height: 40px; min-height: 40px;
@ -624,4 +624,7 @@
} }
// update-end--author:liaozhiyang---date:20240604---forTV360X-377table // update-end--author:liaozhiyang---date:20240604---forTV360X-377table
} }
.ant-table-wrapper .ant-table.ant-table-middle .ant-table-tbody > tr > td{
padding: 8px 8px;
}
</style> </style>

View File

@ -7,9 +7,44 @@
// &.ant-btn-error:not(.ant-btn-link), // &.ant-btn-error:not(.ant-btn-link),
// &.ant-btn-warning:not(.ant-btn-link), // &.ant-btn-warning:not(.ant-btn-link),
&.ant-btn-primary:not(.ant-btn-link) { &.ant-btn-primary:not(.ant-btn-link) {
box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important; // box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
background: linear-gradient(to right, #1ea1fb, #0480e7); // background: linear-gradient(to right, #1ea1fb, #017de9);
// align-items: center;
border-radius: 8px;
background: linear-gradient(to right,#1ea0fa , #017de9);
// border: 1px solid #fff;
// color: #fff;
// position: relative; /* needed for pseudo-element */
overflow: hidden; /* clip the animated stripe */
// height: 34px;
} }
&.ant-btn-primary:not(.ant-btn-link)::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255,255,255,0.4) 50%,
transparent 100%
);
transform: skewX(0);
}
&.ant-btn-primary:not(.ant-btn-link):hover::before {
animation: light-sweep 1.5s forwards;
}
@keyframes light-sweep {
to {
left: 100%;
}
}
// &-group { // &-group {
// .ant-btn:not(:first-child) { // .ant-btn:not(:first-child) {
// bottom: 1px; // bottom: 1px;
@ -322,3 +357,51 @@
} }
} }
} }
.ant-btn-default {
border-radius: 8px !important;
color: white;
background: linear-gradient(to right,#1ea0fa , #017de9);
border: 0px;
}
:where(.css-dev-only-do-not-override-9m98ij).ant-btn-default:not(:disabled):hover {
color: white;
border-color: white;
}
&.ant-btn-default:not(.ant-btn-link) {
border-radius: 8px;
color: white;
background: linear-gradient(to right,#1ea0fa , #017de9);
overflow: hidden; /* clip the animated stripe */
}
&.ant-btn-default:not(:disabled):hover {
color: white;
border-color: #40a9ff;
}
&.ant-btn-default:not(.ant-btn-link)::before {
content: '';
color: white;
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255,255,255,0.4) 50%,
transparent 100%
);
transform: skewX(0);
}
&.ant-btn-default:not(.ant-btn-link):hover::before {
animation: light-sweep 1.5s forwards;
}
@keyframes light-sweep {
to {
left: 100%;
}
}

View File

@ -18,11 +18,11 @@ export default {
totalField: 'total', totalField: 'total',
}, },
// 可选的分页选项 // 可选的分页选项
pageSizeOptions: ['10', '50', '80', '100'], pageSizeOptions: ['15', '50', '80', '100'],
// 表格默认尺寸 // 表格默认尺寸
defaultSize: 'middle', defaultSize: 'middle',
//默认每页显示多少条 //默认每页显示多少条
defaultPageSize: 10, defaultPageSize: 15,
// 默认排序方法 // 默认排序方法
defaultSortFn: (sortInfo: SorterResult) => { defaultSortFn: (sortInfo: SorterResult) => {
//update-begin-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序 //update-begin-author:taoyan date:2022-10-21 for: VUEN-2199【表单设计器】多字段排序

View File

@ -24,7 +24,7 @@
</div> </div>
<a-row> <a-row>
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;"> <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-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
<a-col :span="4"> <a-col :span="4">
<div class="bjclass"> <div class="bjclass">
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" @error="setDefaultImage"/> <img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" @error="setDefaultImage"/>
@ -62,47 +62,6 @@
</a-col> </a-col>
</a-row> </a-row>
</a-col> </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>
<span class="buttonMargin">
<a-button type="primary" @click="handleEdit(item)">编辑</a-button>
</span>
<span class="buttonMargin">
<a-button type="primary" @click="handleFwbq(item)">服务标签</a-button>
</span>
<span class="buttonMargin">
<a-button type="primary" @click="handleFpzh(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.entryTime}}</p>
<p>身份证号: {{item.idCard}}</p>
<p>联系电话: {{item.tel}}</p>
<p>出生日期: {{item.dateOfBirth}}</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> -->
</a-row> </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;"> <div style="text-align:right;right: 20px;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
@ -310,7 +269,7 @@ function onPageChange(page,pageSize){
.cardClass{ .cardClass{
margin: 5px; margin: 5px;
// //
border-radius: 5px; border-radius: 8px;
transition: box-shadow 0.3s ease-in-out; transition: box-shadow 0.3s ease-in-out;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);

View File

@ -73,6 +73,7 @@ import { defHttp } from '/@/utils/http/axios';
const employeesDataSource = ref<any[]>([]); const employeesDataSource = ref<any[]>([]);
const tagsDetailData = ref<any[]>([]); const tagsDetailData = ref<any[]>([]);
const employeesInfo = reactive<any>({}); const employeesInfo = reactive<any>({});
const emit = defineEmits(['register', 'ok']);
//model //model
const [registerModal, {openModal}] = useModal(); const [registerModal, {openModal}] = useModal();
//table //table
@ -191,11 +192,15 @@ import { defHttp } from '/@/utils/http/axios';
reload(); reload();
getEmployessServiceTagsList(); getEmployessServiceTagsList();
} }
function submitForm(){
emit('ok');
}
defineExpose({ defineExpose({
init, init,
submitForm
}); });
</script> </script>

View File

@ -30,7 +30,7 @@
<a-row> <a-row>
<a-col :span="6" v-for="(item,index) in dataList" :key="index" style="padding: 5px 10px 0 0;height: 240px;"> <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-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
<a-col :span="4"> <a-col :span="4">
<div class="bjclass"> <div class="bjclass">
<img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" /> <img :src="handleHeadPath(item.headPath)" style="width: 40px;height:40px;margin-top: 10px;" />
@ -297,7 +297,7 @@
.cardClass{ .cardClass{
margin: 5px; margin: 5px;
// //
border-radius: 5px; border-radius: 8px;
transition: box-shadow 0.3s ease-in-out; transition: box-shadow 0.3s ease-in-out;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);

View File

@ -55,18 +55,18 @@ export const columns: BasicColumn[] = [
align: "center", align: "center",
dataIndex: 'medicationId_dictText' dataIndex: 'medicationId_dictText'
}, },
{ // {
title: '物料图片', // title: '物料图片',
align: "center", // align: "center",
dataIndex: 'materialImg', // dataIndex: 'materialImg',
customRender: render.renderImage, // customRender: render.renderImage,
}, // },
{ // {
title: '物料标识', // title: '物料标识',
align: "center", // align: "center",
dataIndex: 'materialIdent', // dataIndex: 'materialIdent',
customRender: render.renderImage, // customRender: render.renderImage,
}, // },
{ {
title: '是否启用', title: '是否启用',
align: "center", align: "center",

View File

@ -74,7 +74,7 @@
<a-menu <a-menu
v-model:openKeys="openKeys" v-model:openKeys="openKeys"
v-model:selectedKeys="selectedKeys" v-model:selectedKeys="selectedKeys"
style="height:720px;overflow-y:auto;overflow-x: hidden;" style="height:700px;overflow-y:auto;overflow-x: hidden;"
mode="inline" mode="inline"
> >
<template v-for="(item2,key2) in treeChildData" > <template v-for="(item2,key2) in treeChildData" >
@ -84,7 +84,7 @@
<span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span> <span><img src="/src/assets/images/logo.png" /></span><span style="margin-left: 10px;">{{item2.title}}</span>
</div> </div>
</template> </template>
<a-menu-item v-for="(item3,key3) in item2.children" :key="key3" style="height:50px;" > <a-menu-item v-for="(item3,key3) in item2.children" :key="key3" style="height:50px;text-align:left;" >
<div @click="onSelect(item3)"> <div @click="onSelect(item3)">
<span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span> <span style="font-size: 18px;">·</span> <span style="margin-left: 10px;">{{item3.title}}</span>
</div> </div>

View File

@ -50,12 +50,12 @@ export const columns: BasicColumn[] = [
align:"center", align:"center",
dataIndex: 'wechartId' dataIndex: 'wechartId'
}, },
{ // {
title: '资质照片', // title: '资质照片',
align:"center", // align:"center",
dataIndex: 'imgPath', // dataIndex: 'imgPath',
customRender:render.renderImage, // customRender:render.renderImage,
}, // },
]; ];
//查询数据 //查询数据
export const searchFormSchema: FormSchema[] = [ export const searchFormSchema: FormSchema[] = [

View File

@ -1,5 +1,38 @@
<template> <template>
<div> <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="suppliersName">
<template #label><span title="供应商名称">供应商名称</span></template>
<j-input placeholder="请输入供应商名称" v-model:value="queryParam.suppliersName" allow-clear ></j-input>
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item name="personInCharge">
<template #label><span title="负责人">负责人</span></template>
<j-input placeholder="请输入负责人" v-model:value="queryParam.personInCharge" allow-clear ></j-input>
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item name="supplyState">
<template #label><span title="供应状态">供应状态</span></template>
<j-dict-select-tag type='list' placeholder="请选择供应状态" v-model:value="queryParam.supplyState" dictCode="supply_state" allow-clear />
</a-form-item>
</a-col>
<a-col :lg="6" :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"> <BasicTable @register="registerTable">
<!--插槽:table标题--> <!--插槽:table标题-->
@ -32,9 +65,12 @@
import { downloadFile } from '/@/utils/common/renderUtils'; import { downloadFile } from '/@/utils/common/renderUtils';
import { useUserStore } from '/@/store/modules/user'; import { useUserStore } from '/@/store/modules/user';
import { useDrawer } from '/@/components/Drawer'; import { useDrawer } from '/@/components/Drawer';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import JInput from '/@/components/Form/src/jeecg/components/JInput.vue';
const queryParam = reactive<any>({}); const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]); const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore(); const userStore = useUserStore();
const formRef = ref();
//model //model
const [registerModal, {openModal}] = useModal(); const [registerModal, {openModal}] = useModal();
//drawer //drawer
@ -47,16 +83,6 @@
columns, columns,
canResize:false, canResize:false,
showIndexColumn: true, showIndexColumn: true,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter:true,
showAdvancedButton:true,
fieldMapToNumber: [
],
fieldMapToTime: [
],
},
actionColumn: { actionColumn: {
width: 160, width: 160,
fixed:'right' fixed:'right'
@ -77,7 +103,16 @@
}) })
const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext const [registerTable, {reload},{ rowSelection, selectedRowKeys }] = tableContext
const labelCol = reactive({
xs:24,
sm:6,
xl:6,
xxl:6
});
const wrapperCol = reactive({
xs: 24,
sm: 24,
});
// //
const superQueryConfig = reactive(superQuerySchema); const superQueryConfig = reactive(superQuerySchema);
@ -90,6 +125,22 @@
}); });
reload(); reload();
} }
/**
* 查询
*/
function searchQuery() {
reload();
}
/**
* 重置
*/
function searchReset() {
formRef.value.resetFields();
selectedRowKeys.value = [];
//
reload();
}
/** /**
* 新增事件 * 新增事件
*/ */
@ -175,6 +226,29 @@
</script> </script>
<style lang="less" scoped> <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%;
}
}
:deep(.ant-picker),:deep(.ant-input-number){ :deep(.ant-picker),:deep(.ant-input-number){
width: 100%; width: 100%;
} }

View File

@ -203,6 +203,7 @@
cameraData.value.regionId = formData.regionId; cameraData.value.regionId = formData.regionId;
cameraData.value.multitrans = formData.multitrans; cameraData.value.multitrans = formData.multitrans;
cameraData.value.scale = formData.scale; cameraData.value.scale = formData.scale;
cameraData.value.parentId = formData.parentId;
}) })
</script> </script>

View File

@ -14,9 +14,9 @@
<span style="margin-left: 5px;"> <span style="margin-left: 5px;">
<a-button preIcon="ant-design:swap-outlined" @click="switchResolution">{{ resolution }}</a-button> <a-button preIcon="ant-design:swap-outlined" @click="switchResolution">{{ resolution }}</a-button>
</span> </span>
<span style="margin-left: 5px;"> <!-- <span style="margin-left: 5px;">
<a-button preIcon="ant-design:phone-outlined" @click="screenshot">巡航*</a-button> <a-button preIcon="ant-design:phone-outlined" @click="screenshot">巡航*</a-button>
</span> </span>-->
<span style="margin-left: 5px;" v-show="!izPhone"> <span style="margin-left: 5px;" v-show="!izPhone">
<a-button preIcon="ant-design:phone-outlined" @click="startPhone">电话</a-button> <a-button preIcon="ant-design:phone-outlined" @click="startPhone">电话</a-button>
</span> </span>

View File

@ -196,6 +196,7 @@ import {
formData.regionId = props.data.regionId; formData.regionId = props.data.regionId;
formData.multitrans = props.data.multitrans; formData.multitrans = props.data.multitrans;
formData.scale = props.data.scale; formData.scale = props.data.scale;
formData.parentId = props.data.parentId;
}, },
{ deep: true, immediate: true } { deep: true, immediate: true }
); );

View File

@ -0,0 +1,81 @@
<template>
<a-row class="p-2">
<a-col :span="9">
<PlanAddTree ref="leftTree" :data="formData" @select="onTreeSelect"/>
</a-col>
<a-col :span="15">
<PlanAddForm ref="addForm" :initData="formData" :data="nodeData" @success="submitCallback" />
</a-col>
</a-row>
</template>
<script lang="ts" name="iot-nuIotRegionInfo" setup>
import {defineExpose, nextTick, reactive, ref} from 'vue';
import { useDesign } from '/@/hooks/web/useDesign';
import PlanAddTree from './PlanAddTree.vue'
import PlanAddForm from './PlanAddForm.vue';
const emit = defineEmits(['register', 'ok']);
const formData = reactive<Record<string, any>>({
projectId: '',
regionId: ''
});
// ref
const leftTree = ref();
const addForm = ref();
//
const nodeData = ref({});
//
function onTreeSelect(data) {
nodeData.value = data;
}
/**
* 详情
*/
async function edit(record) {
await nextTick(() => {
const tmpData = {};
Object.keys(formData).forEach((key) => {
if(record.hasOwnProperty(key)){
tmpData[key] = record[key]
}
})
//
Object.assign(formData, tmpData);
leftTree.value.clean();
});
}
async function submitForm(){
addForm.value.submitForm();
}
function submitCallback() {
emit('ok');
}
defineExpose({
edit,
submitForm
});
</script>
<style lang="less" scoped>
.p-2{
height: calc(100vh - 325px);
}
.form-content{
background-color: #ffffff;
height: 100%;
}
:deep(.ant-tabs-nav ){
padding: 0 20px;
}
</style>

View File

@ -0,0 +1,160 @@
<template>
<a-card :bordered="false" style="height: 100%">
<div class="title">
2.选择录像存储位置码流计划
</div>
<a-divider />
<a-spin :spinning="loading">
<BasicForm @register="registerForm" class="jeecg-basic-form">
<template #storageDevInput="{ model, field }">
<a-select v-model:value="model[field]">
<template v-for="item in storageDevOptions" :key="`${item.storageDevId}`">
<a-select-option :value="item.storageDevId" :label="item.storageDevName">
{{item.storageDevName}}
</a-select-option>
</template>
</a-select>
</template>
<template #planInput="{ model, field }">
<a-select v-model:value="model[field]">
<template v-for="item in planOptions" :key="`${item.recordPlanId}`">
<a-select-option :value="item.recordPlanId" :label="item.planName">
{{item.planName}}
</a-select-option>
</template>
</a-select>
</template>
</BasicForm>
</a-spin>
</a-card>
</template>
<script lang="ts" setup>
import { watch, computed, inject, ref, unref, onMounted } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { addRecordCfgs, getAllRecordPlans, getStorageDevice } from '../plan.api';
import { addFormSchema } from "../plan.data";
import { useDesign } from '/@/hooks/web/useDesign';
import { useMessage } from '/@/hooks/web/useMessage';
import {propTypes} from "@/utils/propTypes";
const { createMessage, createSuccessModal } = useMessage();
const emit = defineEmits(['success']);
const props = defineProps({
initData: { type: Object, default: () => ({}) },
data: { type: Array, default: () => ([]) }
});
const areaOptions = ref<any[]>([]);
const loading = ref<boolean>(false);
//
const isUpdate = ref<boolean>(true);
//
const initModel = ref<object>({});
//
const treeModel = ref<object>([]);
//
const model = ref<object>({});
const planOptions = ref<any[]>([]);
const storageDevOptions = ref<any[]>([]);
//
const [registerForm, { resetFields, setFieldsValue, validate, updateSchema }] = useForm({
schemas: addFormSchema,
showActionButtonGroup: false
});
onMounted(() => {
watch(
() => props.initData,
async () => {
let record = unref(props.initData);
if (typeof record !== 'object') {
record = {};
}
initModel.value = record;
if(record.projectId!=''&&record.regionId!=''){
await fetchStorageDev(record.projectId,record.regionId);
await fetchPlan();
}
},
{ deep: true, immediate: true }
);
// data
watch(
() => props.data,
async () => {
let record = unref(props.data);
console.log(record);
if (typeof record !== 'object') {
record = [];
}
treeModel.value = record;
},
{ deep: true, immediate: true }
);
});
//
async function submitForm() {
if(treeModel.value!=null){
if(treeModel.value.length == 0){
createMessage.info('请选择监控点!');
}else{
try {
loading.value = true;
let values = await validate();
values = Object.assign({}, model.value, values);
console.log(values);
values["ids"] = treeModel.value.join(',');
//
await addRecordCfgs(values);
//
emit('success');
Object.assign(model.value, {});
} finally {
loading.value = false;
}
}
}
}
const fetchStorageDev = async (projectId,regionId) => {
storageDevOptions.value = [];
const data = await getStorageDevice({ projectId : projectId, regionId: regionId });
console.log(data);
Object.assign(storageDevOptions.value, data);
}
const fetchPlan = async () => {
planOptions.value = [];
const data = await getAllRecordPlans({});
console.log(data);
Object.assign(planOptions.value, data);
}
defineExpose({
submitForm,
});
</script>
<style lang="less" scoped>
:deep(.ant-card-body){
padding: 0px 0px 0px 0px;
}
.ant-divider-horizontal{
margin: 0px 0px 20px 0px;
}
.title{
padding: 10px 0px 10px 10px;
font-size: 16px;
font-weight: bold;
}
.jeecg-basic-form {
padding: 0px 20px;
}
</style>

View File

@ -0,0 +1,147 @@
<template>
<a-card :bordered="false" style="height: 100%" class="card">
<div class="title">
1.选择监控点
</div>
<a-divider />
<a-alert type="info" show-icon class="alert" style="margin-bottom: 8px">
<template #message>
<template v-if="checkedKeys.length > 0">
<span>已选中 {{ checkedKeys.length }} 条记录</span>
<a-divider type="vertical" />
<a @click="clean">清空</a>
</template>
<template v-else>
<span>未选中任何数据</span>
</template>
</template>
</a-alert>
<a-spin :spinning="loading">
<!--区域树-->
<template v-if="treeData.length > 0">
<a-tree
:clickRowToExpand="false"
:treeData="treeData"
:selectedKeys="selectedKeys"
:checkStrictly="checkStrictly"
:load-data="loadChildrenTreeData"
:checkedKeys="checkedKeys"
v-model:expandedKeys="expandedKeys"
@check="onCheck"
checkable
>
</a-tree>
</template>
<a-empty v-else description="暂无数据" />
</a-spin>
</a-card>
</template>
<script lang="ts" setup>
import {defineExpose, nextTick, onMounted, ref, unref, watch} from 'vue';
import { useModal } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useMethods } from '/@/hooks/system/useMethods';
const { createMessage } = useMessage();
import { queryTreeList } from '../plan.api';
const props = defineProps({
data: { type: Object, default: () => ({}) },
});
//
const model = ref<object>({});
const emit = defineEmits(['select']);
const syncoading = ref<boolean>(false);
const loading = ref<boolean>(false);
//
const treeData = ref<any[]>([]);
//
const checkedKeys = ref<any[]>([]);
//
const expandedKeys = ref<any[]>([]);
//
const selectedKeys = ref<any[]>([]);
//
const checkStrictly = ref<boolean>(true);
//
async function loadRootTreeData() {
if(model.value.projectId==''&&model.value.regionId==''){
return ;
}
try {
loading.value = true;
treeData.value = [];
model.value["recordPlanId"] = "-1";
const result = await queryTreeList(model.value);
if (Array.isArray(result)) {
treeData.value = result;
}
} finally {
loading.value = false;
syncoading.value = false;
}
}
function clean(){
checkedKeys.value = [];
emit('select', checkedKeys.value);
}
//
function onCheck(e) {
if (Array.isArray(e)) {
checkedKeys.value = e;
} else {
checkedKeys.value = e.checked;
}
emit('select', checkedKeys.value);
}
onMounted(() => {
// data
watch(
() => props.data,
async () => {
let record = unref(props.data);
if (typeof record !== 'object') {
record = {};
}
model.value = record;
await loadRootTreeData();
},
{ deep: true, immediate: true }
);
});
defineExpose({
clean
});
</script>
<style lang="less" scoped>
:deep(.ant-card-body){
padding: 0px 0px 0px 0px;
background-color: aliceblue;
}
.card{
background-color: aliceblue;
}
:deep(.ant-tree-list-holder){
background-color: aliceblue !important;
}
.ant-divider-horizontal{
margin: 0px 0px 10px 0px;
}
.title{
padding: 10px 0px 10px 10px;
font-size: 16px;
font-weight: bold;
}
</style>

View File

@ -0,0 +1,181 @@
<template>
<a-card :bordered="false" style="height: 100%">
<a-spin :spinning="syncoading">
<!-- <div class="j-table-operator" style="width: 100%">
<a-button preIcon="ant-design:sync-outlined" @click="loadRootTreeData">刷新</a-button>
</div>-->
<a-spin :spinning="loading">
<!--区域树-->
<template v-if="treeData.length > 0">
<a-tree
v-if="!treeReloading"
:clickRowToExpand="false"
:treeData="treeData"
:selectedKeys="selectedKeys"
:checkStrictly="checkStrictly"
:load-data="loadChildrenTreeData"
:checkedKeys="checkedKeys"
v-model:expandedKeys="expandedKeys"
@select="onSelect"
>
</a-tree>
</template>
<a-empty v-else description="暂无数据" />
</a-spin>
</a-spin>
</a-card>
</template>
<script lang="ts" setup>
import { nextTick, ref } from 'vue';
import { useModal } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useMethods } from '/@/hooks/system/useMethods';
const { createMessage } = useMessage();
import { queryProjectTreeSync, queryRegionTreeSync } from '../plan.api';
const emit = defineEmits(['select', 'rootTreeData']);
const syncoading = ref<boolean>(false);
const loading = ref<boolean>(false);
//
const treeData = ref<any[]>([]);
//
const checkedKeys = ref<any[]>([]);
//
const expandedKeys = ref<any[]>([]);
//
const selectedKeys = ref<any[]>([]);
//
const treeReloading = ref<boolean>(false);
//
const checkStrictly = ref<boolean>(true);
//
const currentRegion = ref<any>(null);
//
async function loadRootTreeData() {
try {
loading.value = true;
treeData.value = [];
const result = await queryProjectTreeSync();
if (Array.isArray(result)) {
treeData.value = result;
}
if (expandedKeys.value.length === 0) {
autoExpandParentNode();
} else {
if (selectedKeys.value.length === 0) {
let item = treeData.value[0];
if (item) {
//
setSelectedKey(item.id, item);
}
} else {
emit('select', currentRegion.value);
}
}
emit('rootTreeData', treeData.value);
} finally {
loading.value = false;
syncoading.value = false;
}
}
loadRootTreeData();
/**
* 加载子级区域信息
*/
async function loadChildrenTreeData(treeNode) {
try {
const result = await queryRegionTreeSync({
parentId: treeNode.dataRef.id,
projectId: treeNode.dataRef.projectId,
});
if (result.length == 0) {
treeNode.dataRef.isLeaf = true;
} else {
treeNode.dataRef.children = result;
if (expandedKeys.value.length > 0) {
//
let subKeys: any[] = [];
for (let key of expandedKeys.value) {
if (result.findIndex((item) => item.id === key) !== -1) {
subKeys.push(key);
}
}
if (subKeys.length > 0) {
expandedKeys.value = [...expandedKeys.value];
}
}
}
treeData.value = [...treeData.value];
emit('rootTreeData', treeData.value);
} catch (e) {
console.error(e);
}
return Promise.resolve();
}
/**
* 自动展开父节点只展开一级
*/
function autoExpandParentNode() {
let item = treeData.value[0];
if (item) {
if (!item.isLeaf) {
expandedKeys.value = [item.key];
}
//
setSelectedKey(item.id, item);
reloadTree();
} else {
emit('select', null);
}
}
/**
* 重新加载树组件防止无法默认展开数据
*/
async function reloadTree() {
await nextTick();
treeReloading.value = true;
await nextTick();
treeReloading.value = false;
}
/**
* 设置当前选中的行
*/
function setSelectedKey(key: string, data?: object) {
selectedKeys.value = [key];
if (data) {
currentRegion.value = data;
emit('select', data);
}
}
/**
* 树选择事件
*/
function onSelect(selKeys, event) {
if (selKeys.length > 0 && selectedKeys.value[0] !== selKeys[0]) {
setSelectedKey(selKeys[0], event.selectedNodes[0]);
} else {
//
setSelectedKey(selectedKeys.value[0]);
}
}
defineExpose({
loadRootTreeData,
});
</script>
<style lang="less" scoped>
:deep(.ant-card-body){
padding: 24px 0px 0px 24px;
}
</style>

View File

@ -0,0 +1,213 @@
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
<a-button v-if="queryParam.regionId" type="primary" preIcon="ant-design:plus-outlined" @click="handleAdd"> 新增</a-button>
<a-button v-if="selectedRowKeys.length > 0" preIcon="ant-design:delete-outlined" @click="batchHandleDelete"> 删除</a-button>
</template>
<!--操作栏-->
<template #action="{ record }"></template>
<template v-slot:bodyCell="{ column, record, index, text }">
<template v-if="column.dataIndex === 'recordSwitchBoolean'">
<a-switch
v-model:checked="record.recordSwitchBoolean"
checked-children="开"
un-checked-children="关"
@change="(checked) => handleSwitchChange(checked, record)"
/>
</template>
</template>
<!-- <template #recordSlot="{ text, record }">
<a-switch
v-model:checked="record.recordSwitch"
checked-children="启用"
un-checked-children="停用"
/>
</template>-->
</BasicTable>
<!-- 表单区域 -->
<PlanModal ref="registerModal"></PlanModal>
</div>
</template>
<script lang="ts" name="iot-nuIotCameraInfo" setup>
import { ref, reactive, createVNode, h, onMounted, watch, unref } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns } from '../plan.data';
import {batchDeleteCfgs, editRecordCfgs, list} from '../plan.api';
import { useUserStore } from '/@/store/modules/user';
import { useDrawer } from "@/components/Drawer";
import { useRouter } from 'vue-router';
import PlanModal from './PlanModal.vue';
const props = defineProps({
data: { type: Object, default: () => ({}) },
});
//drawer
const [registerDrawer, { openDrawer }] = useDrawer();
let router = useRouter();
const queryParam = reactive<any>({});
const registerModal = ref();
const userStore = useUserStore();
//table
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
title: '护理单元-物联管理-录像计划',
api: list,
columns,
rowKey : "ids",
canResize: false,
showActionColumn: false,
actionColumn: {
width: 180,
fixed: 'right',
},
beforeFetch: async (params) => {
return Object.assign(params, queryParam);
},
},
});
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource, getSelectRows }, { rowSelection, selectedRowKeys }] = tableContext;
const labelCol = reactive({
xs:24,
sm:4,
xl:6,
xxl:4
});
const wrapperCol = reactive({
xs: 24,
sm: 20,
});
onMounted(() => {
watch(
() => props.data,
async () => {
queryParam.projectId = props.data.projectId;
queryParam.regionId = props.data.regionId;
let record = unref(props.data);
if (typeof record !== 'object') {
record = {};
}
reload();
},
{ deep: true, immediate: true }
);
});
/**
* 新增
*/
function handleAdd(record: Recordable) {
record["projectId"] = queryParam.projectId;
record["regionId"] = queryParam.regionId;
registerModal.value.disableSubmit = false;
registerModal.value.edit(record);
}
/**
* 编辑
*/
function handleEdit(record: Recordable) {
record["projectId"] = queryParam.projectId;
record["regionId"] = queryParam.regionId;
openDrawer(true, {
record,
isUpdate: true,
showFooter: true,
tenantSaas: false,
});
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
const selectRows = getSelectRows();
let ids = [];
let devIds = [];
if(selectRows.length>0){
selectRows.forEach(function(element) {
ids.push(element.ids);
devIds.push(element.deviceIndex);
})
let params = { ids: ids.join(","), deviceIndex: devIds.join(",")};
console.log(params);
await batchDeleteCfgs(params);
}
}
/**
* 成功回调
*/
function handleSuccess() {
reload();
}
/**
* 操作栏
*/
function getTableAction(record) {
return [
];
}
function handleSwitchChange(checked, record) {
let recordSwitch = 0;
if(checked){
recordSwitch = 1;
}
editRecordCfgs({ ids: record.ids, recordSwitch: recordSwitch });
}
/**
* 左侧树选择后触发
*/
function onTreeSelect(data) {
// departData.value = data;
}
/**
* 左侧树rootTreeData触发
*/
function onRootTreeData(data) {
// rootTreeData.value = data;
}
</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%;
}
}
.p-2{
height: calc(100vh - 120px);
}
</style>

View File

@ -0,0 +1,67 @@
<template>
<j-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
<PlanAdd ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></PlanAdd>
</j-modal>
</template>
<script lang="ts" setup>
import { ref, nextTick, defineExpose } from 'vue';
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import PlanAdd from "./PlanAdd.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']);
// const player = ref();
/**
* 编辑
* @param record
*/
function edit(record) {
title.value = "添加录像设置";
visible.value = true;
nextTick(() => {
registerForm.value.edit(record);
});
}
/**
* 确定按钮点击事件
*/
function handleOk() {
registerForm.value.submitForm();
}
/**
* form保存回调事件
*/
function submitCallback() {
handleCancel();
}
/**
* 取消按钮回调事件
*/
function handleCancel() {
visible.value = false;
}
defineExpose({
edit,
disableSubmit,
});
</script>
<style lang="less">
/**隐藏样式-modal确定按钮 */
.jee-hidden {
display: none !important;
}
</style>
<style lang="less" scoped></style>

View File

@ -0,0 +1,46 @@
<template>
<a-row class="p-2" type="flex" :gutter="10">
<a-col :xl="4" :lg="24" :md="24" style="margin-bottom: 10px">
<PlanLeftTree ref="leftTree" @select="onTreeSelect" @rootTreeData="onRootTreeData" />
</a-col>
<a-col :xl="20" :lg="24" :md="24" style="margin-bottom: 10px">
<div v-show="planData != null">
<PlanList :data="planData" />
</div>
<div v-show="planData == null" style="padding-top: 40px">
<a-empty description="请选择区域" />
</div>
</a-col>
</a-row>
</template>
<script lang="ts" name="iot-nuIotCameraInfo" setup>
import { ref } from 'vue';
import { useDesign } from '/@/hooks/web/useDesign';
import PlanLeftTree from './components/PlanLeftTree.vue'
import PlanList from './components/PlanList.vue';
// ref
const leftTree = ref();
//
const planData = ref({});
const rootTreeData = ref<any[]>([]);
//
function onTreeSelect(data) {
planData.value = data;
}
// rootTreeData
function onRootTreeData(data) {
rootTreeData.value = data;
}
</script>
<style lang="less" scoped>
.p-2{
height: calc(100vh - 120px);
}
</style>

View File

@ -0,0 +1,86 @@
import { defHttp } from '/@/utils/http/axios';
import {Modal} from "ant-design-vue";
enum Api {
queryProjectTreeSync = '/iot/projectInfo/queryRegionTreeSync',
queryRegionTreeSync = '/iot/regionInfo/queryRegionTreeSync',
queryTreeList = '/iot/cameraInfo/queryTreeList',
getStorageDevice = '/iot/cameraInfo/getStorageDevice',
getAllRecordPlans = '/iot/cameraInfo/getAllRecordPlans',
getRecordCfgs = '/iot/cameraInfo/getRecordCfgs',
addRecordCfgs = '/iot/cameraInfo/addRecordCfgs',
setRecordCfgs = '/iot/cameraInfo/setRecordCfgs',
delRecordCfgs = '/iot/cameraInfo/delRecordCfgs',
getBatchProgress = '/iot/cameraInfo/getBatchProgress',
}
/**
*
* @param params
*/
export const queryProjectTreeSync = (params?) => defHttp.get({ url: Api.queryProjectTreeSync, params });
/**
*
* @param params
*/
export const queryRegionTreeSync = (params?) => defHttp.get({ url: Api.queryRegionTreeSync, params });
/**
*
* @param params
*/
export const queryTreeList = (params?) => defHttp.get({ url: Api.queryTreeList, params });
/**
*
* @param params
*/
export const getStorageDevice = (params) => defHttp.get({ url: Api.getStorageDevice, params });
/**
*
* @param params
*/
export const getAllRecordPlans = (params) => defHttp.get({ url: Api.getAllRecordPlans, params });
/**
*
* @param params
*/
export const list = (params) => defHttp.get({ url: Api.getRecordCfgs, params });
/**
*
* @param params
*/
export const addRecordCfgs = (params) => defHttp.post({ url: Api.addRecordCfgs, params });
/**
*
* @param params
*/
export const editRecordCfgs = (params) => defHttp.post({ url: Api.setRecordCfgs, params });
/**
*
* @param params
*/
export const getBatchProgress = (params) => defHttp.get({ url: Api.getBatchProgress, params });
/**
*
* @param params
*/
export const batchDeleteCfgs = (params) => {
Modal.confirm({
title: '确认删除',
content: '是否删除选中数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
defHttp.get({ url: Api.delRecordCfgs, params });
},
});
};

View File

@ -0,0 +1,158 @@
import {BasicColumn} from '/@/components/Table';
import {FormSchema} from '/@/components/Table';
//列表数据
export const columns: BasicColumn[] = [
{
title: '设备序号',
align: "center",
dataIndex: 'deviceIndex'
},
{
title: '设备名称',
align: "center",
dataIndex: 'deviceName'
},
{
title: 'IP地址',
align: "center",
dataIndex: 'ip'
},
{
title: '录像开关',
align: "center",
dataIndex: 'recordSwitchBoolean',
},
{
title: '录像存储位置',
align: "center",
dataIndex: 'storageDevName'
},
{
title: '录像码流',
align: "center",
dataIndex: 'streamType',
customRender:({record})=>{
if(record.streamType == 0){
return '主码流';
}else if(record.streamType == 1){
return '子码流';
}else{
return '';
}
},
},
{
title: '录像计划',
align: "center",
dataIndex: 'planName'
},
];
export const formSchema: FormSchema[] = [
{
label: '',
field: 'ids',
component: 'Input',
show: false,
},
{
label: '设备序号',
field: 'deviceIndex',
component: 'Input',
dynamicDisabled: true
},
{
label: '设备名称',
field: 'deviceName',
component: 'Input',
dynamicDisabled: true
},
{
label: '录像开关',
field: 'recordSwitch',
component: 'Select',
componentProps: {
options: [
{label:'开启' , value: '1'},
{label:'关闭' , value: '0'},
]
},
defaultValue: '1'
},
{
label: '存储位置',
field: 'storageDevName',
component: 'Input',
slot: 'storageDevInput',
},
{
label: '录像码流',
field: 'streamType',
component: 'Select',
componentProps: {
options: [
{label:'主码流' , value: 0},
{label:'子码流' , value: 1},
]
},
dynamicDisabled: true
},
{
label: '录像计划',
field: 'planName',
component: 'Input',
}
];
export const addFormSchema: FormSchema[] = [
{
label: '设备序号',
field: 'deviceIndex',
component: 'Input',
show: false
},
{
label: '录像开关',
field: 'recordSwitch',
component: 'Select',
componentProps: {
options: [
{label:'开启' , value: '1'},
{label:'关闭' , value: '0'},
]
},
defaultValue: '1',
required: true,
},
{
label: '存储位置',
field: 'storageDevId',
component: 'Input',
slot: 'storageDevInput',
defaultValue: '0',
required: true,
},
{
label: '录像码流',
field: 'streamType',
component: 'Select',
componentProps: {
options: [
{label:'主码流' , value: 0},
{label:'子码流' , value: 1},
]
},
defaultValue: 0,
required: true,
},
{
label: '录像计划',
field: 'recordPlanId',
component: 'Input',
slot: 'planInput',
defaultValue: '1',
required: true,
}
];

View File

@ -10,7 +10,7 @@
<a-input v-model:value="searchForm.packageName" allow-clear /> <a-input v-model:value="searchForm.packageName" allow-clear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-col :lg="6" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons"> <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6"> <a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button> <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
@ -26,7 +26,7 @@
</div> </div>
<a-row> <a-row>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;"> <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-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
<a-col :span="4"> <a-col :span="4">
<div class="bjclass"> <div class="bjclass">
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" /> <img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />
@ -86,17 +86,15 @@ const registerModal = ref();
const searchForm = ref({}) const searchForm = ref({})
const tableData = ref({}) const tableData = ref({})
const labelCol = reactive({ const labelCol = reactive({
xs:24,
sm:6,
xl:6,
xxl:6
});
const wrapperCol = reactive({
xs: 24, xs: 24,
sm: 4, sm: 24,
xl: 6, });
xxl: 6
});
const wrapperCol = reactive({
xs: 24,
sm: 20,
xl: 14,
xxl: 14
});
const pageParams = ref({ pageNo: 1, pageSize: 12 }) const pageParams = ref({ pageNo: 1, pageSize: 12 })
/** /**

View File

@ -6,13 +6,13 @@
:footer-style="{ textAlign: 'right' }" @close="handleCancel"> :footer-style="{ textAlign: 'right' }" @close="handleCancel">
<div style="display:flex;justify-content:space-between"> <div style="display:flex;justify-content:space-between">
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw"> <div style="background-color: #fafafa;border-radius: 8px;padding: 10px;width: 25vw">
<div style="font-size: 18px;font-weight:700;padding: 15px">服务指令包详情</div> <div style="font-size: 18px;font-weight:700;padding: 15px">服务指令包详情</div>
<DirectivePackageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"> <DirectivePackageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false">
</DirectivePackageForm> </DirectivePackageForm>
</div> </div>
<div style="background-color: #fafafa;border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;"> <div style="background-color: #fafafa;border-radius: 8px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;">
<div style="padding: 15px;height: 30px;width:100%;"> <div style="padding: 15px;height: 30px;width:100%;">
<a-row> <a-row>
<a-col :span="12"> <a-col :span="12">
@ -31,7 +31,7 @@
<div style="margin-top: 15px;"> <div style="margin-top: 15px;">
<a-row> <a-row>
<a-col :span="22" :push="1" v-for="directive of seletedRecord.directives" :key="directive.id" <a-col :span="22" :push="1" v-for="directive of seletedRecord.directives" :key="directive.id"
style="margin-top: 15px;border-radius: 5px;" @click="directiveInfo(directive)" :class="{ 'selected': selectedDirective === directive.id }"> style="margin-top: 15px;border-radius: 8px;" @click="directiveInfo(directive)" :class="{ 'selected': selectedDirective === directive.id }">
<a-card size="small"> <a-card size="small">
<div > <div >
<a-row :span="24"> <a-row :span="24">
@ -69,7 +69,7 @@
</div> </div>
<div> <div>
<div style="border-radius: 5px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;border: 1px solid #dcdfe6;"> <div style="border-radius: 8px;padding: 10px;width: 25vw;height: 80vh;overflow:auto;border: 1px solid #dcdfe6;">
<div style="padding: 15px;height: 30px;width:100%;"> <div style="padding: 15px;height: 30px;width:100%;">
<a-row> <a-row>
<a-col :span="24"> <a-col :span="24">

View File

@ -92,11 +92,11 @@ export const columns: BasicColumn[] = [
dataIndex: 'izPreferential_dictText', dataIndex: 'izPreferential_dictText',
width: 100, width: 100,
}, },
{ // {
title: '收费频次', // title: '收费频次',
align: 'center', // align: 'center',
dataIndex: 'chargingFrequency_dictText', // dataIndex: 'chargingFrequency_dictText',
}, // },
{ {
title: '周期类型', title: '周期类型',
align: 'center', align: 'center',

View File

@ -21,7 +21,6 @@
:ignoreDisabled="true" allowClear /> :ignoreDisabled="true" allowClear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<template v-if="toggleSearchStatus">
<a-col :lg="6"> <a-col :lg="6">
<a-form-item name="directiveName"> <a-form-item name="directiveName">
<template #label><span title="服务指令">服务指令</span></template> <template #label><span title="服务指令">服务指令</span></template>
@ -35,7 +34,7 @@
:ignoreDisabled="true" placeholder="请选分类标签" allowClear /> :ignoreDisabled="true" placeholder="请选分类标签" allowClear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="6"> <!-- <a-col :lg="6">
<a-form-item name="tollPrice"> <a-form-item name="tollPrice">
<template #label><span title="收费价格">收费价格</span></template> <template #label><span title="收费价格">收费价格</span></template>
<JRangeNumber v-model:value="queryParam.tollPrice" class="query-group-cust"></JRangeNumber> <JRangeNumber v-model:value="queryParam.tollPrice" class="query-group-cust"></JRangeNumber>
@ -46,7 +45,7 @@
<template #label><span title="提成价格">提成价格</span></template> <template #label><span title="提成价格">提成价格</span></template>
<JRangeNumber v-model:value="queryParam.comPrice" class="query-group-cust"></JRangeNumber> <JRangeNumber v-model:value="queryParam.comPrice" class="query-group-cust"></JRangeNumber>
</a-form-item> </a-form-item>
</a-col> </a-col> -->
<a-col :lg="6"> <a-col :lg="6">
<a-form-item name="izReimbursement"> <a-form-item name="izReimbursement">
<template #label><span title="医保报销">医保报销</span></template> <template #label><span title="医保报销">医保报销</span></template>
@ -71,15 +70,14 @@
<a-col :lg="6"> <a-col :lg="6">
<a-form-item name="bodyTags"> <a-form-item name="bodyTags">
<template #label><span title="体型标签">体型标签</span></template> <template #label><span title="体型标签">体型标签</span></template>
<JSelectMultiple type="list" v-model:value="queryParam.bodyTags" <j-dict-select-tag type='list' v-model:value="queryParam.bodyTags" :dictCode="`nu_config_body_tag,tag_name,id,del_flag = '0' order by sort asc`"
:dictCode="`nu_config_body_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true" :ignoreDisabled="true" placeholder="请选择体型标签" allowClear />
placeholder="请选择体型标签" allowClear />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="6"> <a-col :lg="6">
<a-form-item name="emotionTags"> <a-form-item name="emotionTags">
<template #label><span title="情绪标签">情绪标签</span></template> <template #label><span title="情绪标签">情绪标签</span></template>
<JSelectMultiple type="list" v-model:value="queryParam.emotionTags" <j-dict-select-tag type="list" v-model:value="queryParam.emotionTags"
:dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true" :dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = '0' order by sort asc`" :ignoreDisabled="true"
placeholder="请选择情绪标签" allowClear /> placeholder="请选择情绪标签" allowClear />
</a-form-item> </a-form-item>
@ -98,17 +96,12 @@
:ignoreDisabled="true" placeholder="请选择是否启用" allowClear /> :ignoreDisabled="true" placeholder="请选择是否启用" allowClear />
</a-form-item> </a-form-item>
</a-col> </a-col>
</template>
<a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons"> <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6"> <a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button> <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" <a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
style="margin-left: 8px">重置</a-button> style="margin-left: 8px">重置</a-button>
<a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
{{ toggleSearchStatus ? '收起' : '展开' }}
<Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
</a>
</a-col> </a-col>
</span> </span>
</a-col> </a-col>
@ -119,15 +112,15 @@
<BasicTable @register="registerTable"> <BasicTable @register="registerTable">
<!--插槽:table标题--> <!--插槽:table标题-->
<template #tableTitle> <template #tableTitle>
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleCategory" <a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleCategory"
preIcon="tabler:settings">配置服务类别</a-button> preIcon="tabler:settings">配置服务类别</a-button>
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleType" <a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleType"
preIcon="tabler:settings">配置服务类型</a-button> preIcon="tabler:settings">配置服务类型</a-button>
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleBodyTag" <a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleBodyTag"
preIcon="tabler:settings">配置体型标签</a-button> preIcon="tabler:settings">配置体型标签</a-button>
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleEmotionTag" <a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleEmotionTag"
preIcon="tabler:settings">配置情绪标签</a-button> preIcon="tabler:settings">配置情绪标签</a-button>
<a-button type="primary" v-auth="'serviceDirective:config_service_directive:add'" @click="handleAdd" <a-button type="primary" class="btnPrivate" v-auth="'serviceDirective:config_service_directive:add'" @click="handleAdd"
preIcon="ant-design:plus-outlined">新增服务指令</a-button> preIcon="ant-design:plus-outlined">新增服务指令</a-button>
<!-- <a-button type="primary" v-auth="'serviceDirective:config_service_directive:exportXls'" <!-- <a-button type="primary" v-auth="'serviceDirective:config_service_directive:exportXls'"
preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button> preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
@ -248,6 +241,11 @@ const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
canResize: false, canResize: false,
useSearchForm: false, useSearchForm: false,
showIndexColumn: true, showIndexColumn: true,
pagination: {
current: 1,
pageSize: 10,
pageSizeOptions: ['10', '20', '50', '100'],
},
actionColumn: { actionColumn: {
width: 160, width: 160,
fixed: 'right', fixed: 'right',
@ -511,4 +509,8 @@ audio::-webkit-media-controls-current-time-display,
audio::-webkit-media-controls-time-remaining-display { audio::-webkit-media-controls-time-remaining-display {
display: none; display: none;
} }
.btnPrivate{
height: 34px;
margin-left: 4px;
}
</style> </style>

View File

@ -158,13 +158,13 @@
<a-col :span="12"> <a-col :span="12">
<a-form-item label="语音文件" v-bind="validateInfos.mp3File" id="ConfigServiceDirectiveForm-mp3File" <a-form-item label="语音文件" v-bind="validateInfos.mp3File" id="ConfigServiceDirectiveForm-mp3File"
name="mp3File"> name="mp3File">
<j-upload v-model:value="formData.mp3File" accept=".mp3" :disabled="true" :maxCount="1"></j-upload> <j-upload v-model:value="formData.mp3File" accept=".mp3" :maxCount="1"></j-upload>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<a-form-item label="视频文件" v-bind="validateInfos.mp4File" id="ConfigServiceDirectiveForm-mp4File" <a-form-item label="视频文件" v-bind="validateInfos.mp4File" id="ConfigServiceDirectiveForm-mp4File"
name="mp4File"> name="mp4File">
<j-upload v-model:value="formData.mp4File" accept=".mp4" :disabled="true" :maxCount="1"></j-upload> <j-upload v-model:value="formData.mp4File" accept=".mp4" :maxCount="1"></j-upload>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> </a-row>

View File

@ -24,7 +24,7 @@
</div> </div>
<a-row> <a-row>
<a-col :span="6" v-for="directive of tableData.records" :key="directive.id" style="padding: 5px 10px 0 0;height: 240px;"> <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-row style="padding: 5px;background-color: white;border-radius: 8px;height: 220px;">
<a-col :span="4"> <a-col :span="4">
<div class="bjclass"> <div class="bjclass">
<img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" /> <img src="/src/assets/images/logo.png" style="width: 40px;height:40px;margin-top: 10px;" />