添加大屏

main
junhong 1 week ago
parent a33489f9bc
commit 7c24f565a2
  1. 15889
      package-lock.json
  2. 3
      package.json
  3. 10
      src/api/system/config.js
  4. 10
      src/api/system/dict/data.js
  5. 10
      src/api/system/dict/type.js
  6. BIN
      src/assets/images/cneterbj.png
  7. BIN
      src/assets/images/fl.png
  8. BIN
      src/assets/images/jglv.png
  9. BIN
      src/assets/images/jgred.png
  10. BIN
      src/assets/images/tq.png
  11. BIN
      src/assets/images/wd.png
  12. BIN
      src/assets/images/yjbj.png
  13. 2
      src/layout/index.vue
  14. 50
      src/main.js
  15. 13
      src/router/routes.js
  16. 20
      src/views/constructionScheduling/construction-report/index.vue
  17. 45
      src/views/constructionScheduling/construction-report/options.js
  18. 13
      src/views/constructionScheduling/engineering-log/index.vue
  19. 14
      src/views/constructionScheduling/engineering-log/options.js
  20. 62
      src/views/constructionScheduling/production-plan/index.vue
  21. 26
      src/views/constructionScheduling/production-plan/options.js
  22. 161
      src/views/constructionScheduling/resource-scheduling/index.vue
  23. 53
      src/views/large-screen/api.js
  24. 15
      src/views/large-screen/echartsOptions.js
  25. 17
      src/views/large-screen/forward.vue
  26. 402
      src/views/large-screen/index.vue
  27. 64
      src/views/large-screen/options.js
  28. 423
      src/views/system/dict/data.vue
  29. 298
      src/views/system/dict/index.vue
  30. 4
      vite.config.js

15889
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -43,7 +43,8 @@
"vue-cropper": "1.0.3", "vue-cropper": "1.0.3",
"vue-router": "4.0.14", "vue-router": "4.0.14",
"vuedraggable": "^4.1.0", "vuedraggable": "^4.1.0",
"xml-js": "^1.6.11" "xml-js": "^1.6.11",
"vue3-seamless-scroll": "^2.0.1"
}, },
"devDependencies": { "devDependencies": {
"@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-inject": "^5.0.5",

@ -1,4 +1,14 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getsystemdict(key) {
return request({
url: `/system/dictionary/list`,
method: 'get',
params: {
code: key
},
dataType: 'json'
})
}
// 查询参数列表 // 查询参数列表
export function listConfig(query) { export function listConfig(query) {

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询字典数据列表 // 查询字典数据列表
export function listData(query) { export function listData(query) {
return request({ return request({
url: '/system/dict/data/list', url: '/system/dictionary/list',
method: 'get', method: 'get',
params: query params: query
}) })
@ -12,7 +12,7 @@ export function listData(query) {
// 查询字典数据详细 // 查询字典数据详细
export function getData(dictCode) { export function getData(dictCode) {
return request({ return request({
url: '/system/dict/data/' + dictCode, url: '/system/dictionary/' + dictCode,
method: 'get' method: 'get'
}) })
} }
@ -28,7 +28,7 @@ export function getDicts(dictType) {
// 新增字典数据 // 新增字典数据
export function addData(data) { export function addData(data) {
return request({ return request({
url: '/system/dict/data', url: '/system/dictionary',
method: 'post', method: 'post',
data: data data: data
}) })
@ -37,7 +37,7 @@ export function addData(data) {
// 修改字典数据 // 修改字典数据
export function updateData(data) { export function updateData(data) {
return request({ return request({
url: '/system/dict/data', url: '/system/dictionary',
method: 'put', method: 'put',
data: data data: data
}) })
@ -46,7 +46,7 @@ export function updateData(data) {
// 删除字典数据 // 删除字典数据
export function delData(dictCode) { export function delData(dictCode) {
return request({ return request({
url: '/system/dict/data/' + dictCode, url: '/system/dictionary/' + dictCode,
method: 'delete' method: 'delete'
}) })
} }

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询字典类型列表 // 查询字典类型列表
export function listType(query) { export function listType(query) {
return request({ return request({
url: '/system/dict/type/list', url: '/system/dictionary/list',
method: 'get', method: 'get',
params: query params: query
}) })
@ -12,7 +12,7 @@ export function listType(query) {
// 查询字典类型详细 // 查询字典类型详细
export function getType(dictId) { export function getType(dictId) {
return request({ return request({
url: '/system/dict/type/' + dictId, url: '/system/dictionary/' + dictId,
method: 'get' method: 'get'
}) })
} }
@ -20,7 +20,7 @@ export function getType(dictId) {
// 新增字典类型 // 新增字典类型
export function addType(data) { export function addType(data) {
return request({ return request({
url: '/system/dict/type', url: '/system/dictionary',
method: 'post', method: 'post',
data: data data: data
}) })
@ -29,7 +29,7 @@ export function addType(data) {
// 修改字典类型 // 修改字典类型
export function updateType(data) { export function updateType(data) {
return request({ return request({
url: '/system/dict/type', url: '/system/dictionary',
method: 'put', method: 'put',
data: data data: data
}) })
@ -38,7 +38,7 @@ export function updateType(data) {
// 删除字典类型 // 删除字典类型
export function delType(dictId) { export function delType(dictId) {
return request({ return request({
url: '/system/dict/type/' + dictId, url: '/system/dictionary/' + dictId,
method: 'delete' method: 'delete'
}) })
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@ -18,7 +18,7 @@ import useAppStore from '@/store/modules/app'
const elementPlusLoaded = ref(false); const elementPlusLoaded = ref(false);
onMounted(async () => { onMounted(async () => {
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
await proxy.$register(); // await proxy.$register();
// elementPlusLoaded true // elementPlusLoaded true
elementPlusLoaded.value = true; elementPlusLoaded.value = true;
useAppStore().setElLoading(true); useAppStore().setElLoading(true);

@ -19,7 +19,14 @@ import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, select
import RightToolbar from '@/components/RightToolbar' import RightToolbar from '@/components/RightToolbar'
//role菜单权限选择逐渐 //role菜单权限选择逐渐
import Rolemenu from '@/components/Rolemenu' import Rolemenu from '@/components/Rolemenu'
import {
getsystemdict
} from '@/api/system/config'
import DictTag from '@/components/DictTag' import DictTag from '@/components/DictTag'
import ElementPlus from 'element-plus'
import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
import vue3SeamlessScroll from 'vue3-seamless-scroll';
import elementIcons from '@/components/SvgIcon/svgicon'
import util from '@/components-zbry/utils' import util from '@/components-zbry/utils'
const app = createApp(App) const app = createApp(App)
@ -85,6 +92,7 @@ app.component('DictTag', DictTag)
app.component('svg-icon', SvgIcon) app.component('svg-icon', SvgIcon)
app.use(router) app.use(router)
app.use(store) app.use(store)
app.use(elementIcons)
app.use(plugins) app.use(plugins)
//======================================================= //=======================================================
@ -110,10 +118,10 @@ app.use(plugins)
// messagePath: 'data.msg' // messagePath: 'data.msg'
// } // }
// }; // };
// app.config.globalProperties.$pageKeys = { app.config.globalProperties.$pageKeys = {
// page: 'page', page: 'pageNo',
// limit: 'limit' limit: 'pageSize'
// }; };
//======================================================= //=======================================================
// 全局方法挂载 // 全局方法挂载
@ -126,17 +134,31 @@ app.config.globalProperties.addDateRange = addDateRange
app.config.globalProperties.selectDictLabel = selectDictLabel app.config.globalProperties.selectDictLabel = selectDictLabel
app.config.globalProperties.selectDictLabels = selectDictLabels app.config.globalProperties.selectDictLabels = selectDictLabels
app.config.globalProperties.downfile = downloadFile app.config.globalProperties.downfile = downloadFile
app.config.globalProperties.$register = async () => { app.config.globalProperties.$getsystemdict = async (key) => {
const ElementPlus = await import('element-plus'); return new Promise(async (resolve, reject) => {
const locale = await import('element-plus/lib/locale/lang/zh-cn'); await getsystemdict(key).then((res) => {
const elementIcons = await import("@/components/SvgIcon/svgicon"); if (res.code == 200) {
app.use(ElementPlus, { resolve(res.data[0].subSysDictionaryList)
locale: locale.default, }
// 支持 large、default、small })
size: Cookies.get("size") || "default" })
});
app.use(elementIcons.default)
} }
// app.config.globalProperties.$register = async () => {
// const ElementPlus = await import('element-plus');
// const locale = await import('element-plus/lib/locale/lang/zh-cn');
// const elementIcons = await import("@/components/SvgIcon/svgicon");
// app.use(ElementPlus, {
// locale: locale.default,
// // 支持 large、default、small
// size: Cookies.get("size") || "default"
// });
// app.use(elementIcons.default)
// }
app.use(ElementPlus, {
locale: locale,
// 支持 large、default、small
size: Cookies.get("size") || "default"
});
directive(app) directive(app)

@ -62,6 +62,19 @@ export default [
link: null link: null
} }
}, },
{
name: "dictdata",
path: "dictdata",
hidden: true,
component: "system/dict/data",
meta: {
title: "字典详情",
breadcrumb: false,
icon: "tree-table",
noCache: false,
link: null
}
},
] ]
}, },
{ {

@ -85,20 +85,9 @@ function getPlanList(params) {
<el-table-column label="质量安全" align="center" prop="qs" /> <el-table-column label="质量安全" align="center" prop="qs" />
<el-table-column label="机械设备运行" align="center" prop="equipmentOperation" /> --> <el-table-column label="机械设备运行" align="center" prop="equipmentOperation" /> -->
<el-table-column label="报告日期" align="center" prop="date" /> <el-table-column label="报告日期" align="center" prop="date" />
<el-table-column label="报告类型(日/周/月)" align="center" prop="cycle" /> <el-table-column label="报告周期(日/周/月)" align="center" prop="cycle" />
<el-table-column label="报告内容" align="center" prop="planId" width="400"> <el-table-column label="项目名称" align="center" prop="planName" />
<template #default="scope"> <el-table-column label="建议" align="center" prop="advises" />
<el-tooltip effect="dark" :content="scope.row.planId" placement="top">
<span style="display: inline-block; width: 400px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{ scope.row.planId }}</span>
<template #content>
<div style="width: 300px; ">
{{ scope.row.planId }}
</div>
</template>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="其他建议" align="center" prop="advises" />
<el-table-column label="总体施工进度" align="center" prop="totalProgress"> <el-table-column label="总体施工进度" align="center" prop="totalProgress">
<template #default="scope"> <template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.totalProgress)" /> <el-progress :stroke-width="6" :percentage="Number(scope.row.totalProgress)" />
@ -123,5 +112,4 @@ function getPlanList(params) {
</div> </div>
</template> </template>
<style scoped> <style scoped></style>
</style>

@ -18,15 +18,15 @@ export const baseModelOptions = () => {
{ {
tag: 'BaseSelect', tag: 'BaseSelect',
label: '报告类型:', label: '报告周期:',
key: 'cycle', key: 'cycle',
value: '', value: '',
default: '', default: '',
rules: [ rules: [
{ required: true, message: '请选择报告类型', trigger: 'blur' }, { required: true, message: '请选择报告周期', trigger: 'blur' },
], ],
attribute: { //属性 attribute: { //属性
placeholder: '请选择报告类型', placeholder: '请选择报告周期',
options: [{ options: [{
value: "日", value: "日",
label: "日" label: "日"
@ -40,17 +40,16 @@ export const baseModelOptions = () => {
}, },
}, },
{ {
tag: 'el-input', tag: 'BaseSelect',
label: '报告内容:', label: '项目名称:',
key: 'planId', key: 'planId',
value: '', value: '',
default: '', default: '',
rules: [ rules: [
{ required: true, message: '请输入报告内容', trigger: 'blur' }, { required: true, message: '请选择项目名称', trigger: 'blur' },
], ],
attribute: { //属性 attribute: { //属性
type: 'textarea', placeholder: '请选择项目名称',
placeholder: '请输入报告内容',
options: [] options: []
}, },
}, },
@ -112,7 +111,7 @@ export const baseModelOptions = () => {
// }, // },
{ {
tag: 'el-input', tag: 'el-input',
label: '其他建议:', label: '建议:',
key: 'advises', key: 'advises',
value: '', value: '',
default: '', default: '',
@ -144,20 +143,20 @@ export const baseModelOptions = () => {
export const baseFilterOptions = () => { export const baseFilterOptions = () => {
return [ return [
// { {
// tag: 'BaseSelect', tag: 'BaseSelect',
// label: '项目名称:', label: '项目名称:',
// key: 'planId', key: 'planId',
// value: '', value: '',
// default: '', default: '',
// rules: [ rules: [
// { required: true, message: '请选择项目名称', trigger: 'blur' }, { required: true, message: '请选择项目名称', trigger: 'blur' },
// ], ],
// attribute: { //属性 attribute: { //属性
// placeholder: '请选择项目名称', placeholder: '请选择项目名称',
// options: [] options: []
// }, },
// }, },
// { // {
// tag: 'el-input', // tag: 'el-input',
// label: '材料使用:', // label: '材料使用:',

@ -51,18 +51,7 @@ onMounted(() => {
<el-table-column label="风力" align="center" prop="wind" /> <el-table-column label="风力" align="center" prop="wind" />
<el-table-column label="现场负责人" align="center" prop="principalName" /> <el-table-column label="现场负责人" align="center" prop="principalName" />
<el-table-column label="联系方式" align="center" prop="principalTel" /> <el-table-column label="联系方式" align="center" prop="principalTel" />
<el-table-column label="施工情况" align="center" prop="constructionSituation" width="400"> <el-table-column label="施工情况" align="center" prop="constructionSituation" />
<template #default="scope">
<el-tooltip effect="dark" :content="scope.row.constructionSituation" placement="top">
<span style="display: inline-block; width: 400px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{ scope.row.constructionSituation }}</span>
<template #content>
<div style="width: 300px; ">
{{ scope.row.constructionSituation }}
</div>
</template>
</el-tooltip>
</template>
</el-table-column>
<el-table-column label="其他事项" align="center" prop="otherBusiness" /> <el-table-column label="其他事项" align="center" prop="otherBusiness" />
<el-table-column label="创建人" align="center" prop="creator" /> <el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" /> <el-table-column label="创建时间" align="center" prop="createTime" />

@ -36,6 +36,9 @@ export const baseModelOptions = () => {
key: 'weather', key: 'weather',
value: '', value: '',
default: '', default: '',
rules: [
{ required: true, message: '请输入天气', trigger: 'blur' },
],
attribute: {//属性 attribute: {//属性
type: 'text', type: 'text',
placeholder: '请输入天气', placeholder: '请输入天气',
@ -46,6 +49,9 @@ export const baseModelOptions = () => {
label: '温度:', label: '温度:',
key: 'temperature', key: 'temperature',
value: '', value: '',
rules: [
{ required: true, message: '请输入温度', trigger: 'blur' },
],
default: '', default: '',
attribute: {//属性 attribute: {//属性
type: 'text', type: 'text',
@ -58,6 +64,9 @@ export const baseModelOptions = () => {
label: '风力:', label: '风力:',
key: 'wind', key: 'wind',
value: '', value: '',
rules: [
{ required: true, message: '请输入风力', trigger: 'blur' },
],
default: '', default: '',
attribute: {//属性 attribute: {//属性
type: 'text', type: 'text',
@ -99,8 +108,11 @@ export const baseModelOptions = () => {
key: 'constructionSituation', key: 'constructionSituation',
value: '', value: '',
default: '', default: '',
rules: [
{ required: true, message: '请输入施工情况', trigger: 'blur' },
],
attribute: {//属性 attribute: {//属性
type: 'textarea', type: 'text',
placeholder: '请输入施工情况', placeholder: '请输入施工情况',
}, },
}, },

@ -1,10 +1,10 @@
<script setup> <script setup>
import { reactive } from 'vue' import { nextTick, onMounted, reactive } from 'vue'
import { iproductionplanList, iproductionplanAdd, iproductionplanUpdate, iproductionplanDelete, iproductionplanGetById } from './api' import { iproductionplanList, iproductionplanAdd, iproductionplanUpdate, iproductionplanDelete, iproductionplanGetById } from './api'
import { baseModelOptions, baseFilterOptions } from './options' import { baseModelOptions, baseFilterOptions } from './options'
// const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const table = ref()
const state = reactive({ const state = reactive({
baseModelOptions: baseModelOptions(), baseModelOptions: baseModelOptions(),
baseFilterOptions: baseFilterOptions(), baseFilterOptions: baseFilterOptions(),
@ -21,7 +21,7 @@ const state = reactive({
showEditBtn: false, showEditBtn: false,
showDeleteBtn: false, showDeleteBtn: false,
columnCount: 1, columnCount: 1,
addBtnName:"新增计划", addBtnName: "新增计划",
// rowControl: { // rowControl: {
// showEditBtn: false, // showEditBtn: false,
// showDelBtn: false // showDelBtn: false
@ -33,16 +33,61 @@ const state = reactive({
detail: 'productionPlan:page:list', detail: 'productionPlan:page:list',
}, },
hideselection: true, hideselection: true,
rowKey: 'id',
pageInfo: { total: 0, base: { limit: 8, current: 1 } }, pageInfo: { total: 0, base: { limit: 8, current: 1 } },
beforeEdit: function (params) {
if (params.parentId == 0) params.parentId = ' '
return new Promise((resolve) => {
getPlanList().then(() => {
resolve(params)
})
})
},
beforeSubmit: function (params) {
if (!params.parentId) params.parentId = 0
return params
},
handleAdd: function (params) {
getPlanList().then(() => {
table.value.handleAdd()
})
}
}) })
onMounted(() => {
})
function getPlanList(params) {
return new Promise((resolve) => {
iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => {
if (res.code == 200) {
state.baseModelOptions = proxy.$util.setOptions({
attrName: 'data',//
data: state.baseModelOptions, //
key: "parentId", //key
res: res, //
path: res.data.list,
relation: { key: 'value', name: 'label', resKey: 'id', resName: 'planName' },
everClear: true,
hasChildren: true,
});
}
})
resolve(params)
})
}
function handAdd(item) {
state.handleAdd()
nextTick(() => {
table.value.modelRef.setValueByKey('parentId', item.id)
})
}
</script> </script>
<template> <template>
<div class="app-container"> <div class="app-container">
<BaseTablePage :tableOptions="state"> <BaseTablePage :tableOptions="state" ref="table">
<template v-slot:column> <template v-slot:column>
<el-table-column label="计划名称" align="center" prop="planName" /> <el-table-column label="计划名称" align="center" prop="planName" width="150" />
<el-table-column label="项目阶段" align="center" prop="projectStage" /> <el-table-column label="项目阶段" align="center" prop="projectStage" />
<el-table-column label="计划描述" align="center" prop="description" /> <el-table-column label="计划描述" align="center" prop="description" />
<el-table-column label="计划开始时间" align="center" prop="startTime" /> <el-table-column label="计划开始时间" align="center" prop="startTime" />
@ -54,8 +99,11 @@ const state = reactive({
<el-table-column label="创建时间" align="center" prop="createTime" /> <el-table-column label="创建时间" align="center" prop="createTime" />
</template> </template>
<template #control="baseScope"> <template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right"> <el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.parentId==0" v-hasPermi="['productionPlan:page:add']" type="text" icon="Plus" @click="handAdd(scope.row)">
新增
</el-button>
<el-button v-hasPermi="['productionPlan:page:edit']" type="text" icon="EditPen" <el-button v-hasPermi="['productionPlan:page:edit']" type="text" icon="EditPen"
@click="baseScope.handleEdit(scope.$index, scope.row)"> @click="baseScope.handleEdit(scope.$index, scope.row)">
修改 修改

@ -1,5 +1,25 @@
export const baseModelOptions = () => { export const baseModelOptions = () => {
return [ return [
{
tag: 'el-tree-select',
label: '上级计划:',
key: 'parentId',
value: '',
default: '',
// rules: [{
// required: true,
// message: '请选择父级计划',
// trigger: 'blur'
// },],
attribute: { //属性
clearable:true,
filterable: true,
placeholder: '请选择上级计划',
'render-after-expand': true,
checkStrictly: true,
data: []
},
},
{ {
tag: 'el-input', tag: 'el-input',
label: '计划名称:', label: '计划名称:',
@ -82,7 +102,7 @@ export const baseModelOptions = () => {
{ required: true, message: '请输入总工期(天)', trigger: 'blur' }, { required: true, message: '请输入总工期(天)', trigger: 'blur' },
], ],
attribute: {//属性 attribute: {//属性
min:0, min: 0,
placeholder: '请输入总工期(天)', placeholder: '请输入总工期(天)',
}, },
}, },
@ -153,7 +173,7 @@ export const baseFilterOptions = () => {
placeholder: '请输入项目阶段', placeholder: '请输入项目阶段',
}, },
}, },
// { // {
// tag: 'el-input', // tag: 'el-input',
// label: '总工期天数:', // label: '总工期天数:',
@ -232,7 +252,7 @@ export const baseFilterOptions = () => {
placeholder: '请输入计划负责人', placeholder: '请输入计划负责人',
}, },
}, },
// { // {
// tag: 'el-input', // tag: 'el-input',
// label: '计划描述:', // label: '计划描述:',

@ -22,10 +22,6 @@ const state = reactive({
showEditBtn: false, showEditBtn: false,
showDeleteBtn: false, showDeleteBtn: false,
columnCount: 1, columnCount: 1,
// rowControl: {
// showEditBtn: false,
// showDelBtn: false
// },
permission: {// permission: {//
add: 'resourceScheduling:page:list', add: 'resourceScheduling:page:list',
edit: 'resourceScheduling:page:list', edit: 'resourceScheduling:page:list',
@ -33,7 +29,7 @@ const state = reactive({
detail: 'resourceScheduling:page:list', detail: 'resourceScheduling:page:list',
}, },
hideselection: true, hideselection: true,
pageInfo: { total: 0, base: { limit: 8, current: 1 } }, pageInfo: { total: 0, base: { limit: 7, current: 1 } },
beforeSubmit: function (params) { beforeSubmit: function (params) {
let item = state.planList.find((item) => item.id == params.planId) let item = state.planList.find((item) => item.id == params.planId)
if (item) { if (item) {
@ -41,11 +37,44 @@ const state = reactive({
} }
return params return params
}, },
planList: [] planList: [],
tableData: [],
loading:false
}) })
onMounted(() => { const table = ref()
getPlanList() const filter = ref()
function createHandler(methodName) {
return function (...args) {
if (state.pageInfo[methodName]) {
state.pageInfo[methodName](table, ...args);
}
getList()
//vue
// table.value.setScrollTop(0)
}
}
const sizeChange = createHandler('sizeChange');
const currentChange = createHandler('currentChange');
const prevClick = createHandler('prevClick');
const nextClick = createHandler('nextClick');
onMounted(async () => {
await getPlanList()
getList()
}) })
function getList(params) {
state.loading = true
iresourcescheduleList({ ...filter.value.getFilterParams(), pageNo: state.pageInfo.base.current, pageSize: state.pageInfo.base.limit }).then((res) => {
if (res.code == 200) {
state.tableData = res.data.list
state.pageInfo.total = res.data.total
state.loading = false
}
})
}
function doFilter(params) {
getList()
}
function getPlanList(params) { function getPlanList(params) {
iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => { iproductionplanList({ pageNo: 1, pageSize: 9999 }).then((res) => {
if (res.code == 200) { if (res.code == 200) {
@ -76,22 +105,44 @@ function getPlanList(params) {
</script> </script>
<template> <template>
<div class="app-container"> <div class="app-container" element-loading-text="加载中请稍后..." v-loading="state.loading">
<BaseTablePage :tableOptions="state"> <BaseFilter ref="filter" :filterOptions="state.baseFilterOptions" :showFilter="true" @doFilter="doFilter">
</BaseFilter>
<div class="dispatch-box" ref="table">
<el-empty style="margin: auto;" v-if="state.tableData.length == 0" description="暂无数据" />
<div class="dispatch-item" v-for="item, inde in state.tableData">
<div>{{ item.planName }}</div>
<div>计划开始时间<span>{{ item.startTime }}</span></div>
<div>计划结束时间<span>{{ item.endTime }}</span></div>
<div>当前进度<el-progress class="jd" style="flex: 1;margin-left: auto;"
:percentage="Number(item.currentProgress)" /></div>
<div style="flex-direction: column;align-items: start;">调度建议
<div class="suggestion">{{ item.advises }}</div>
</div>
</div>
</div>
<div style="">
<el-pagination v-if="state.tableData.length != 0" style="margin-top:20px;" v-model:current-page="state.pageInfo.base.current"
v-model:page-size="state.pageInfo.base.limit" @size-change="sizeChange" @current-change="currentChange"
@prev-click="prevClick" @next-click="nextClick" layout="total,sizes,prev, pager, next"
:page-sizes="[7, 10, 20, 30, 40, 50]" :total="state.pageInfo.total" />
</div>
<!-- <BaseTablePage :tableOptions="state">
<template v-slot:column> <template v-slot:column>
<el-table-column label="计划名称" align="center" prop="planName" /> <el-table-column label="计划名称" align="center" prop="planName" />
<el-table-column label="当前进度" align="center" prop="currentProgress"> <el-table-column label="当前进度" align="center" prop="currentProgress">
<template #default="scope"> <template #default="scope">
<el-progress :stroke-width="6" :percentage="Number(scope.row.currentProgress)" /> <el-progress :stroke-width="6" :percentage="Number(scope.row.currentProgress)" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="计划开始时间" align="center" prop="startTime" /> <el-table-column label="计划开始时间" align="center" prop="startTime" />
<el-table-column label="计划结束时间" align="center" prop="endTime" /> <el-table-column label="计划结束时间" align="center" prop="endTime" />
<el-table-column label="调度建议" align="center" prop="advises" /> <el-table-column label="调度建议" align="center" prop="advises" />
<el-table-column label="创建人" align="center" prop="creator" /> <el-table-column label="创建人" align="center" prop="creator" />
<el-table-column label="创建时间" align="center" prop="createTime" /> <el-table-column label="创建时间" align="center" prop="createTime" />
</template> </template>
<template #control="baseScope"> <template #control="baseScope">
<el-table-column label="操作" align="center" width="200" fixed="right"> <el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button v-hasPermi="['resourceScheduling:page:edit']" type="text" icon="EditPen" <el-button v-hasPermi="['resourceScheduling:page:edit']" type="text" icon="EditPen"
@ -101,10 +152,74 @@ function getPlanList(params) {
<el-button v-hasPermi="['resourceScheduling:page:remove']" type="text" icon="Delete" <el-button v-hasPermi="['resourceScheduling:page:remove']" type="text" icon="Delete"
@click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button> @click="baseScope.deleteTableData(scope.$index, scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
</BaseTablePage> </BaseTablePage> -->
</div> </div>
</template> </template>
<style scoped></style> <style scoped lang="scss">
:deep(.jd .el-progress__text) {
/* color: #fff !important; */
min-width: 30px !important;
}
.suggestion {
background: #ECF2FE;
border-radius: 10px 10px 10px 10px;
padding: 14px;
margin-top: 8px;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 14px;
color: #027CFB;
width: 100%;
}
.dispatch-item>div {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: 14px;
color: #666666;
display: flex;
align-items: center;
justify-content: space-between;
}
.dispatch-item>div:nth-child(1) {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 16px;
color: #333333;
}
.dispatch-item span {
color: #333333;
}
.dispatch-item {
background: #FFFFFF;
border-radius: 10px 10px 10px 10px;
padding: 24px;
height: 314px;
display: flex;
flex-direction: column;
justify-content: space-between;
flex: 1 1 calc(100% / 7);
max-width: calc(100% / 7);
}
.dispatch-box {
width: 100%;
display: flex;
flex-wrap: wrap;
gap: 40px;
// max-height: calc(100% - 150px);
overflow: auto;
/* 子元素超出宽度时换行 */
}
.app-container {
}
</style>

@ -0,0 +1,53 @@
import axios from '@/utils/request'
// 查询门禁分页数据:
export const getRecordPage = (arg) => {
return axios.request({
url: '/dahua/accessControl/getRecordPage',
method: 'post',
data: {
...arg,
pageNum: 1,
pageSize: 9999,
},
dataType: 'json'
})
}
// 查询工程日志
export const iengineerlogList = (arg) => {
return axios.request({
url: '/iengineerlog/list',
method: 'get',
params: {
pageNum: 1,
pageSize: 10,
},
dataType: 'json'
})
}
// 进度预警
export const querywarn = (arg) => {
return axios.request({
url: '/iproductionplan/querywarn',
method: 'get',
params: arg,
dataType: 'json'
})
}
// 工种统计
export const iuserworkerType = (arg) => {
return axios.request({
url: '/iuser/workerType',
method: 'get',
params: arg,
dataType: 'json'
})
}
// 智能资源调度
export const iresourcescheduleList = (arg) => {
return axios.request({
url: '/iresourceschedule/list',
method: 'get',
params: arg,
dataType: 'json'
})
}

@ -15,6 +15,7 @@ export function echartsBing({ }) {
subtextStyle: { subtextStyle: {
fontSize: 14, fontSize: 14,
color: ['#fff'], color: ['#fff'],
align: 'center',
verticalAlign: 'center' // 副标题垂直居中 verticalAlign: 'center' // 副标题垂直居中
}, },
left: '25%', // 整体标题水平居中放置,这里用center替代x属性 left: '25%', // 整体标题水平居中放置,这里用center替代x属性
@ -51,12 +52,20 @@ export function echartsBing({ }) {
series: [{ series: [{
name: '车辆机械设备分布', name: '车辆机械设备分布',
type: 'pie', type: 'pie',
radius: ['40%', '60%'], // 环形图内外半径 radius: ['40%', '70%'], // 环形图内外半径
center: ['30%', '60%'], center: ['30%', '60%'],
avoidLabelOverlap: false, avoidLabelOverlap: false,
label: { label: {
show: false, normal: {
position: 'center' formatter:function (params) {
return params.percent + '%'
},
fontSize: 12,
textStyle: {
color: 'black',
},
position: 'inner'
}
}, },
labelLine: { labelLine: {
show: false show: false

@ -1,17 +0,0 @@
<template>
</template>
<script setup>
import { onBeforeMount } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
onBeforeMount(() => {
router.replace({
path: '/largeScreen',
})
})
</script>
<style scoped lang='scss'></style>

@ -1,6 +1,5 @@
<template> <template>
<div class="data-screen" element-loading-text="加载中请稍后..."> <div class="data-screen" element-loading-text="加载中请稍后..." v-loading="state.loading">
<!-- v-loading="state.loading" -->
<div class="topheader"> <div class="topheader">
<div class="gradient"> <div class="gradient">
智慧工地数据大屏 智慧工地数据大屏
@ -11,17 +10,15 @@
<!-- 项目介绍 --> <!-- 项目介绍 -->
<div class="top-item"> <div class="top-item">
<div class="boxtitle">项目介绍</div> <div class="boxtitle">项目介绍</div>
<div class="boxcontent" style="display: flex;flex-direction: column;"> <div class="boxcontent" style="display: flex;flex-direction: column;padding: 15px 20px;">
<div class="displaybox" style="margin-bottom: 10px;"> <div class="displaybox" style="margin-bottom: 10px;">
<div class="diamond"></div>承包商沈阳市某某某建筑公司 <div class="diamond"></div>项目名称 新火工区建设项目
</div> </div>
<div class="displaybox" style="margin-bottom: 15px;"> <div class="displaybox" style="margin-bottom: 12px;">
<div class="diamond" style="background-color: #FFAE3C;"></div>工地负责人李海龙 <div class="diamond" style="background-color: #FFAE3C;"></div>工地负责人周运来
</div> </div>
<div class="chaochu" style="flex: 1;"> <div class="chaochu" style="flex: 1;font-size: 13px;">
项目简介本工程为综合性建筑项目总建筑面积约XX平方米建筑高度XX米结构形式采用XX如框架结构剪力墙结构钢结构等设计使用年限为XX年工程内 项目简介本项目拟新建单体包括一期5305#5601#5806#5826#5827#7310#等6栋单体建筑二期5602#5606#5607#5606#5609#5610#5701#5801#5801-1#5802#5802-1#5803#5805#5807#5808#5810#5810-1#5811#5811-1#5812#5813#5815#5816#5816-1#5817#5818#5821#5822#5828#5829#5830#5831#5909#等34栋单体建筑建筑物基础形式为杯形基础独立基础条形基础主体结构为框架结构排架结构抗爆间室屏院墙体为钢筋混凝土剪力墙结构
容包括以下分部分项工程
地基与基础工程包括基坑开挖桩基施工筏板基础浇筑及地下室结构施工
</div> </div>
</div> </div>
</div> </div>
@ -59,38 +56,25 @@
<div class="top-item"> <div class="top-item">
<div class="boxtitle">智能资源调度</div> <div class="boxtitle">智能资源调度</div>
<div class="boxcontent" style="display: flex;flex-direction: column;justify-content: space-around;"> <div class="boxcontent" style="display: flex;flex-direction: column;justify-content: space-around;">
<div> <div v-if="state.dispatchList.length == 0">
<div class="jd-title"> <el-empty :image-size="100" description="暂无预警" />
<span style="margin-right: auto;">0#厂房建设</span>
<div>
<span>进度</span>
<span style="margin-left: 10px;font-weight: bold;">78%</span>
</div>
</div>
<div style="width: 100%;margin: 8px 0;"><el-progress class="jdt" color="#1FFFDA"
:text-inside="true" :stroke-width="12" :percentage="50">
<span></span>
</el-progress></div>
<div class="jgbox">
<img src="../../assets/images/jg.png" alt="">
工程滞后建议增派人力投入
</div>
</div> </div>
<div style="margin-top: 10px;"> <div v-for="item, index in state.dispatchList.slice(0, 2)">
<div class="jd-title"> <div class="jd-title">
<span style="margin-right: auto;">0#厂房建设</span> <span style="margin-right: auto;">{{ item.planName }}</span>
<div> <div>
<span>进度</span> <span>进度</span>
<span style="margin-left: 10px;font-weight: bold;">78%</span> <span style="margin-left: 10px;font-weight: bold;">{{ item.currentProgress
}}%</span>
</div> </div>
</div> </div>
<div style="width: 100%;margin: 8px 0;"><el-progress class="jdt" color="#1FFFDA" <div style="width: 100%;margin: 8px 0;"><el-progress class="jdt" color="#1FFFDA"
:text-inside="true" :stroke-width="12" :percentage="50"> :text-inside="true" :stroke-width="12" :percentage="Number(item.currentProgress)">
<span></span> <span></span>
</el-progress></div> </el-progress></div>
<div class="jgbox"> <div class="jgbox">
<img src="../../assets/images/jg.png" alt=""> <img src="../../assets/images/jg.png" alt="">
工程滞后建议增派人力投入 {{ item.advises }}
</div> </div>
</div> </div>
</div> </div>
@ -104,38 +88,56 @@
<div class="tq-box"> <div class="tq-box">
<img src="../../assets/images/riqi.png" alt=""> <img src="../../assets/images/riqi.png" alt="">
<span>日期</span> <span>日期</span>
<span>2025/05/06</span> <span v-if="state.logList && state.logList.length > 0">{{ state.logList[0].date
}}</span>
<span v-else>-</span>
</div> </div>
<div class="tq-box"> <div class="tq-box">
<img src="../../assets/images/riqi.png" alt=""> <img src="../../assets/images/wd.png" alt="">
<span>温度</span> <span>温度</span>
<span>18</span> <span v-if="state.logList && state.logList.length > 0">{{ state.logList[0].temperature
}}</span>
<span v-else>-</span>
</div> </div>
<div class="tq-box"> <div class="tq-box">
<img src="../../assets/images/riqi.png" alt=""> <img src="../../assets/images/fl.png" alt="">
<span>风力</span> <span>风力</span>
<span>轻风</span> <span v-if="state.logList && state.logList.length > 0">{{ state.logList[0].wind
}}</span>
<span v-else>-</span>
</div> </div>
<div class="tq-box"> <div class="tq-box">
<img src="../../assets/images/riqi.png" alt=""> <img src="../../assets/images/tq.png" alt="">
<span>天气</span> <span>天气</span>
<span>16-20 多云</span> <span v-if="state.logList && state.logList.length > 0">{{ state.logList[0].weather
}}</span>
<span v-else>-</span>
</div> </div>
</div> </div>
<div> <div>
<table class="construction-table"> <table class="construction-table">
<thead> <thead>
<tr> <tr>
<th width="23%">现场负责人</th> <th width="25%">现场负责人</th>
<th>联系方式</th> <th width="25%">联系方式</th>
<th>施工情况</th> <th width="50%">施工情况</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>王大勇</td> <td width="25%">{{ state.logList && state.logList.length >
<td>13512212323</td> 0 ? state.logList[0].principalName : '-' }}</td>
<td>此处展示当日的一些简单施工情况描述...</td> <td width="25%">{{ state.logList && state.logList.length >
0 ? state.logList[0].principalTel : '-' }}</td>
<td width="50%">
<el-tooltip v-if="state.logList && state.logList.length > 0"
class="box-item" effect="dark"
:content="state.logList[0].constructionSituation" placement="top">
<div style="width: 160px;" class="chaochutwo">
{{ state.logList[0].constructionSituation }}</div>
</el-tooltip>
<span v-else>-</span>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -144,9 +146,108 @@
</div> </div>
</div> </div>
<div class="bottom-box"> <div class="bottom-box">
<div></div> <div class="right-top-item" style="overflow: hidden;">
<div class="top-item">
<div class="boxtitle">进度预警</div>
<div v-if="state.warnList.length == 0" class="boxcontent"
style="display: grid;grid-template-columns: 1fr ;">
<el-empty :image-size="100" description="暂无预警" />
</div>
<div v-else class="boxcontent"
style="display: grid;grid-template-columns: 1fr 1fr ;grid-gap: 12px;padding: 25px 21px;">
<div class="yj-box" v-for="item, index in state.warnList.slice(0, 2)" :key="index">
<img class="jgbj" src="../../assets/images/jglv.png" alt="">
<div style="text-align: center;font-size: 14px;">{{ item.planName }}</div>
<div>开始时间{{ item.startTime }}</div>
<div>计划结束时间{{ item.endTime }}</div>
<div style="display: flex;align-items: center;">当前进度<div style="flex: 1;"> <el-progress
color="#0AA0FE" :stroke-width="8" :percentage="50" class="jd">
</el-progress>
</div>
</div>
<div>备注{{ item.description }}</div>
</div>
</div>
</div>
<!-- 进度监控 -->
<div class="top-item" style="overflow: hidden;">
<div class="boxtitle">进度监控</div>
<div class="center-item">
<div class="alarm-table-header" style=" grid-template-columns: 1.5fr 2fr 3fr 2.5fr;">
<div>序号</div>
<div>任务</div>
<div>时间</div>
<div>进度状态</div>
</div>
<div class="scooll-box" ref="monitor">
<vue3-seamless-scroll style="height: 100%;overflow: hidden;" :scrollbar="{
type: 'mini',
invert: false,
}" :list="state.monitorList" :hoverStop="true" :hover="true" :step="0.3">
<div v-for="item, index in state.monitorList" :key="index"
:class="index % 2 != 0 ? 'dark' : 'light'" class="table-item"
style=" grid-template-columns: 1.5fr 2fr 3fr 2.5fr;">
<div>{{ index + 1 }}</div>
<div>
{{ 2 }}
</div>
<div>{{ 3 }}</div>
<div>
{{ 4 }}
</div>
</div>
<div class="zanwu" v-if="state.monitorList.length == 0">
暂无数据
</div>
</vue3-seamless-scroll>
</div>
</div>
</div>
</div>
<!-- 门禁记录 --> <!-- 门禁记录 -->
<div></div> <div class="center-top-item">
<div class="boxtitle">门禁记录</div>
<div class="center-item">
<div class="alarm-table-header">
<div>序号</div>
<div>姓名</div>
<div>进出门类型</div>
<div>刷卡时间</div>
<div>人员类型</div>
<div>是否佩戴口罩</div>
<div>是否超温</div>
</div>
<div class="scooll-box" ref="Access">
<vue3-seamless-scroll style="height: 100%;overflow: hidden;" :scrollbar="{
type: 'mini',
invert: false,
}" :list="state.tableData" :hoverStop="true" :hover="true" :step="0.3">
<div v-for="item, index in state.tableData" :key="index"
:class="index % 2 != 0 ? 'dark' : 'light'" class="table-item">
<div>{{ index + 1 }}</div>
<div>
{{ item.personName }}
</div>
<div>{{ stausList().find((res) =>
res.value == item.openType)?.label || '-' }}</div>
<div>
{{ item.startSwingTime }}
</div>
<div>{{ item.imageType == 1 ? '内部人员' : item.imageType == 2 ? '访客' : '-' }}</div>
<div>
{{ item.maskState == 3 ? '带口罩' : item.maskState == 2 ? '没带口罩' : '未识别' }}
</div>
<div>
{{ item.overTemp ? '是' : '否' }}
</div>
</div>
<div class="zanwu" v-if="state.tableData.length == 0">
暂无数据
</div>
</vue3-seamless-scroll>
</div>
</div>
</div>
<!-- 施工人员工种分析 and 车辆机械设备统计 --> <!-- 施工人员工种分析 and 车辆机械设备统计 -->
<div class="right-top-item"> <div class="right-top-item">
<div class="top-item"> <div class="top-item">
@ -168,37 +269,212 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted, reactive, nextTick } from 'vue' import { ref, onMounted, reactive, nextTick } from 'vue'
import { echartsZhu,echartsBing } from "./echartsOptions"; import { echartsZhu, echartsBing } from "./echartsOptions";
import { echart } from "../../echarts"; import { echart } from "../../echarts";
import { stausList } from './options'
import { getRecordPage, iengineerlogList, querywarn, iuserworkerType, iresourcescheduleList } from './api'
const { proxy } = getCurrentInstance();
const tableTrue = ref(false);
const state = reactive({ const state = reactive({
echartsBing, echartsBing,
echartsZhu, echartsZhu,
echart, echart,
loading: false loading: true,
tableData: [],
warnList: [],
monitorList: [],
logList: [],
dispatchList: [],
}) })
onMounted(() => { onMounted(async () => {
getEcharts() await getIresourceschedule()
await getIuserworkerType()
await engineeringLog()
await getQuerywarn()
await accessControl()
await getEcharts()
state.loading = false
}) })
const scrollContainer = ref()
function getIresourceschedule(params) {
iresourcescheduleList().then((res) => {
if (res.code == 200) {
state.dispatchList = res.data.list
}
})
}
//
function getIuserworkerType(params) {
iuserworkerType().then((res) => {
if (res.code == 200) {
nextTick(() => {
let staff = state.echart({
id: 'staff',
grid: state.echartsZhu({
ydata: res.data.map(item => item.name),
xdata: res.data.map(item => item.value)
}),
});
})
}
})
}
//
function getQuerywarn(params) {
proxy.$getsystemdict('purpose_expenses').then((res) => {
if (res.length > 0) {
querywarn({ day: res[0].value }).then((res) => {
if (res.code == 200) {
state.warnList = res.data
}
})
}
})
}
//
function accessControl() {
getRecordPage().then((res) => {
state.tableData = res.data.pageData
})
}
//
function engineeringLog(params) {
iengineerlogList().then((res) => {
if (res.code == 200) {
state.logList = res.data.list
}
})
}
function getEcharts() { function getEcharts() {
nextTick(() => { nextTick(() => {
let staff = state.echart({
id: 'staff',
grid: state.echartsZhu({
ydata: [20, 35, 40, 20, 30, 25, 25, 25],
xdata: ["力工", "木工", "瓦工", "电工", "油漆工", "钢筋工", "防水工", "其他"]
}),
});
let car = state.echart({ let car = state.echart({
id: 'car', id: 'car',
grid: state.echartsBing({ grid: state.echartsBing({
}), }),
}); });
}) })
} }
</script> </script>
<style scoped lang='scss'> <style scoped lang='scss'>
.chaochutwo {
white-space: nowrap;
/* 不换行 */
overflow: hidden;
/* 隐藏超出的内容 */
text-overflow: ellipsis;
}
.jgbj {
width: 36px;
height: 36px;
position: absolute;
left: 14px;
top: -12px;
}
:deep(.jd .el-progress__text) {
color: #fff !important;
min-width: 40px !important;
}
.yj-box {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 13px;
color: #FFFFFF;
background: url('../../assets/images/yjbj.png') no-repeat;
background-size: 100% 100%;
display: flex;
padding: 0 8px;
flex-direction: column;
position: relative;
>div {
margin-top: 14px;
}
}
.zanwu {
font-size: 14px;
text-align: center;
color: #fff;
padding: 10px;
}
.table-item>div {
display: flex;
align-items: center;
height: 100%;
justify-content: center;
border-right: 1px solid #103B54;
}
.table-item>div:last-child {
border: none;
}
.table-item {
width: 100%;
background: rgba(35, 92, 96, 0.6);
display: grid;
grid-template-columns: 1fr 1.5fr 2fr 4.5fr 2fr 3.5fr 2.5fr;
min-height: 32px;
font-weight: 400;
font-size: 14px;
color: #ffffff;
}
.scooll-box {
overflow: hidden;
width: 100%;
height: calc(100% - 32px);
}
.alarm-table-header>div {
font-weight: 400;
font-size: 14px;
color: #ffffff;
display: flex;
align-items: center;
height: 100%;
justify-content: center;
border-right: 1px solid #103B54;
}
.alarm-table-header>div:last-child {
border: none;
}
.alarm-table-header {
width: 100%;
height: 32px;
background: rgba(50, 165, 210, 0.4);
display: grid;
grid-template-columns: 1fr 1.5fr 2fr 4.5fr 2fr 3.5fr 2.5fr;
}
.center-item {
height: calc(100% - 48px);
width: 100%;
margin-top: 8px;
background: url('../../assets/images/cneterbj.png') no-repeat;
background-size: 100% 100%;
overflow: hidden;
padding: 25px;
}
.dark {
background: rgba(50, 165, 210, 0.15);
}
.light {
background: rgba(50, 165, 210, 0.05);
}
.right-top-item { .right-top-item {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 1fr;
@ -206,6 +482,11 @@ function getEcharts() {
grid-gap: 20px; grid-gap: 20px;
} }
.center-top-item {
height: 100%;
overflow: hidden;
}
.bottom-box { .bottom-box {
width: 100%; width: 100%;
height: calc(66.66% - 20px); height: calc(66.66% - 20px);
@ -213,6 +494,7 @@ function getEcharts() {
display: grid; display: grid;
grid-template-columns: 1fr 2fr 1fr; grid-template-columns: 1fr 2fr 1fr;
grid-gap: 20px; grid-gap: 20px;
overflow: hidden;
} }
.construction-table { .construction-table {
@ -424,7 +706,7 @@ function getEcharts() {
.data-screen { .data-screen {
width: 100%; width: 100%;
// height: 100vh; height: 100vh;
background: #040614; background: #040614;
height: 1080px; height: 1080px;
} }

@ -0,0 +1,64 @@
export const stausList = () => {
return [
{ "value": 42, "label": "合法密码开门" },
{ "value": 43, "label": "非法密码开门" },
{ "value": 45, "label": "合法指纹开门" },
{ "value": 46, "label": "非法指纹开门" },
{ "value": 48, "label": "远程开门" },
{ "value": 49, "label": "按钮开门" },
{ "value": 50, "label": "钥匙开门" },
{ "value": 51, "label": "合法刷卡开门" },
{ "value": 52, "label": "非法刷卡开门" },
{ "value": 53, "label": "门磁事件" },
{ "value": 54, "label": "异常开门" },
{ "value": 55, "label": "异常关门" },
{ "value": 56, "label": "正常关门" },
{ "value": 57, "label": "正常开门" },
{ "value": 59, "label": "对讲请求事件" },
{ "value": 61, "label": "人脸合法开门" },
{ "value": 62, "label": "人脸非法开门" },
{ "value": 1421, "label": "RFID有源合法" },
{ "value": 1422, "label": "RFID无源合法" },
{ "value": 1423, "label": "RFID有源非法" },
{ "value": 1424, "label": "RFID无源非法" },
{ "value": 1433, "label": "黑名单事件" },
{ "value": 1436, "label": "人证合法开门" },
{ "value": 1437, "label": "人证非法开门" },
{ "value": 1438, "label": "人证和身份证非法开门" },
{ "value": 1439, "label": "人证和身份证合法开门" },
{ "value": 1448, "label": "RFID感应事件" },
{ "value": 1449, "label": "RFID非法感应事件" },
{ "value": 1450, "label": "RFID按键事件" },
{ "value": 1451, "label": "RFID非法按键事件" },
{ "value": 1455, "label": "先刷卡后密码合法开门" },
{ "value": 1456, "label": "先刷卡后密码非法开门" },
{ "value": 1461, "label": "刷卡+指纹组合合法开门" },
{ "value": 1462, "label": "刷卡+指纹组合非法开门" },
{ "value": 1463, "label": "多人合法开门" },
{ "value": 1464, "label": "多人非法开门" },
{ "value": 1467, "label": "人员编号+密码合法开门" },
{ "value": 1468, "label": "人员编号+密码非法开门" },
{ "value": 1469, "label": "人脸+密码合法开门" },
{ "value": 1470, "label": "人脸+密码非法开门" },
{ "value": 1471, "label": "指纹+密码合法开门" },
{ "value": 1472, "label": "指纹+密码非法开门" },
{ "value": 1473, "label": "指纹+人脸合法开门" },
{ "value": 1474, "label": "指纹+人脸非法开门" },
{ "value": 1475, "label": "刷卡+人脸合法开门" },
{ "value": 1476, "label": "刷卡+人脸非法开门" },
{ "value": 1487, "label": "指纹+人脸+密码合法开门" },
{ "value": 1488, "label": "指纹+人脸+密码非法开门" },
{ "value": 1489, "label": "刷卡+人脸+密码合法开门" },
{ "value": 1490, "label": "刷卡+人脸+密码非法开门" },
{ "value": 1491, "label": "刷卡+指纹+密码合法开门" },
{ "value": 1492, "label": "刷卡+指纹+密码非法开门" },
{ "value": 1493, "label": "卡+指纹+人脸组合合法开门" },
{ "value": 1494, "label": "卡+指纹+人脸组合非法开门" },
{ "value": 4603, "label": "卡+指纹+人脸+密码组合合法开门" },
{ "value": 4604, "label": "卡+指纹+人脸+密码组合非法开门" },
{ "value": 4626, "label": "人脸+安全帽合法开门" },
{ "value": 4627, "label": "人脸+安全帽非法开门" },
{ "value": 10001, "label": "健康码合法开门" },
{ "value": 10002, "label": "异常健康码开门" }
]
}

@ -1,71 +1,42 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-button icon="Back" style="margin-bottom: 10px;" @click="router.back()">
<el-form-item label="字典名称" prop="dictType"> 返回</el-button>
<div v-loading="loading" :element-loading-text="'加载中...'">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="字典标签" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入字典标签" clearable @keyup.enter="handleQuery" />
</el-form-item>
<!-- <el-form-item label="字典名称" prop="dictType">
<el-select v-model="queryParams.dictType"> <el-select v-model="queryParams.dictType">
<el-option <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" />
v-for="item in typeOptions"
:key="item.dictId"
:label="item.dictName"
:value="item.dictType"
/>
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="字典标签" prop="dictLabel"> <!-- <el-form-item label="状态" prop="status">
<el-input <el-select v-model="queryParams.status" placeholder="字典状态" clearable>
v-model="queryParams.dictLabel" <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
placeholder="请输入字典标签"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="数据状态" clearable>
<el-option
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleAdd"
type="primary" v-hasPermi="['system:dict:add']">新增</el-button>
plain </el-col>
icon="Plus" <!-- <el-col :span="1.5">
@click="handleAdd" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['system:dict:add']" v-hasPermi="['system:dict:edit']">修改</el-button>
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:dict:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:dict:remove']"
>删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['system:dict:remove']">删除</el-button>
</el-col> -->
<!-- <el-col :span="1.5">
<el-button <el-button
type="warning" type="warning"
plain plain
@ -73,85 +44,83 @@
@click="handleExport" @click="handleExport"
v-hasPermi="['system:dict:export']" v-hasPermi="['system:dict:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col> -->
<el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Close" @click="handleClose">关闭</el-button>
type="warning" </el-col> -->
plain <right-toolbar v-model:showSearch="showSearch" :filterOptions="[{}]" @queryTable="getList"></right-toolbar>
icon="Close" </el-row>
@click="handleClose"
>关闭</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> <el-table :data="dataList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="字典编码" align="center" prop="dictCode" /> <el-table-column align="center" prop="prop" type="index" label="序号" width="100" />
<el-table-column label="字典标签" align="center" prop="dictLabel"> <!-- <el-table-column label="字典编码" align="center" prop="id" /> -->
<template #default="scope"> <el-table-column label="字典标签" align="center" prop="name">
<span v-if="scope.row.listClass == '' || scope.row.listClass == 'default'">{{ scope.row.dictLabel }}</span> <template #default="scope">
<el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass">{{ scope.row.dictLabel }}</el-tag> <span v-if="scope.row.listClass == '' || scope.row.listClass == 'default'">{{ scope.row.name }}</span>
</template> <el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass">{{ scope.row.name
</el-table-column> }}</el-tag>
<el-table-column label="字典键值" align="center" prop="dictValue" /> </template>
<el-table-column label="字典排序" align="center" prop="dictSort" /> </el-table-column>
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<a @click="jump(scope.row)" style="cursor: pointer;">{{ scope.row.code }}</a>
</template>
</el-table-column>
<el-table-column label="字典键值" align="center" prop="value" />
<el-table-column label="字典排序" align="center" prop="sort" />
<!-- <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button <el-button type="text" icon="Edit" @click="handleUpdate(scope.row)"
type="text" v-hasPermi="['system:dict:edit']">修改</el-button>
icon="Edit" <el-button type="text" icon="Delete" @click="handleDelete(scope.row)"
@click="handleUpdate(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button>
v-hasPermi="['system:dict:edit']" </template>
>修改</el-button> </el-table-column>
<el-button </el-table>
type="text" </div>
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:dict:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination <!-- <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="total"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"
/> /> -->
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dataRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="字典类型"> <!-- <el-form-item label="字典类型">
<el-input v-model="form.dictType" :disabled="true" /> <el-input v-model="form.dictType" :disabled="true" />
</el-form-item> -->
<el-form-item label="字典标签" prop="name">
<el-input v-model="form.name" placeholder="请输入字典标签" />
</el-form-item> </el-form-item>
<el-form-item label="数据标签" prop="dictLabel"> <el-form-item label="字典键值" prop="value">
<el-input v-model="form.dictLabel" placeholder="请输入数据标签" /> <el-input v-model="form.value" placeholder="请输入字典键值" />
</el-form-item> </el-form-item>
<el-form-item label="数据键值" prop="dictValue"> <el-form-item label="字典类型" prop="code">
<el-input v-model="form.dictValue" placeholder="请输入数据键值" /> <el-input v-model="form.code" placeholder="请输入字典类型" />
</el-form-item> </el-form-item>
<el-form-item label="样式属性" prop="cssClass"> <!-- <el-form-item label="样式属性" prop="cssClass">
<el-input v-model="form.cssClass" placeholder="请输入样式属性" /> <el-input v-model="form.cssClass" placeholder="请输入样式属性" />
</el-form-item> -->
<el-form-item label="显示排序" prop="sort">
<el-input-number v-model="form.sort" controls-position="right" :min="0" />
</el-form-item> </el-form-item>
<el-form-item label="显示排序" prop="dictSort"> <!-- <el-form-item label="回显样式" prop="listClass">
<el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="回显样式" prop="listClass">
<el-select v-model="form.listClass"> <el-select v-model="form.listClass">
<el-option <el-option
v-for="item in listClassOptions" v-for="item in listClassOptions"
@ -169,7 +138,7 @@
:label="dict.value" :label="dict.value"
>{{ dict.label }}</el-radio> >{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item> -->
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item> </el-form-item>
@ -188,11 +157,11 @@
import useDictStore from '@/store/modules/dict' import useDictStore from '@/store/modules/dict'
import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"; import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type";
import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"; import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data";
import { useRoute, useRouter } from 'vue-router';
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); // const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const sys_normal_disable = [{label :'正常',value: '0'},{label :'停用',value: '1'}] const sys_normal_disable = [{ label: '正常', value: '0' }, { label: '停用', value: '1' }]
const dataList = ref([]); const dataList = ref([]);
const open = ref(false); const open = ref(false);
@ -206,156 +175,168 @@ const title = ref("");
const defaultDictType = ref(""); const defaultDictType = ref("");
const typeOptions = ref([]); const typeOptions = ref([]);
const route = useRoute(); const route = useRoute();
// const router = useRouter()
//
const listClassOptions = ref([ const listClassOptions = ref([
{ value: "default", label: "默认" }, { value: "default", label: "默认" },
{ value: "primary", label: "主要" }, { value: "primary", label: "主要" },
{ value: "success", label: "成功" }, { value: "success", label: "成功" },
{ value: "info", label: "信息" }, { value: "info", label: "信息" },
{ value: "warning", label: "警告" }, { value: "warning", label: "警告" },
{ value: "danger", label: "危险" } { value: "danger", label: "危险" }
]); ]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, // pageNum: 1,
pageSize: 10, // pageSize: 10,
dictName: undefined, dictName: undefined,
dictType: undefined, dictType: undefined,
status: undefined status: undefined,
}, name: undefined,
rules: { },
dictLabel: [{ required: true, message: "数据标签不能为空", trigger: "blur" }], rules: {
dictValue: [{ required: true, message: "数据键值不能为空", trigger: "blur" }], name: [{ required: true, message: "字典标签不能为空", trigger: "blur" }],
dictSort: [{ required: true, message: "数据顺序不能为空", trigger: "blur" }] value: [{ required: true, message: "字典键值不能为空", trigger: "blur" }],
} sort: [{ required: true, message: "字典顺序不能为空", trigger: "blur" }]
}
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型详细 */ /** 查询字典类型详细 */
function getTypes(dictId) { function getTypes(dictId) {
getType(dictId).then(response => { // getType(dictId).then(response => {
queryParams.value.dictType = response.data.dictType; // queryParams.value.dictType = response.data.dictType;
defaultDictType.value = response.data.dictType; // defaultDictType.value = response.data.dictType;
getList(); // getList();
}); // });
getList();
} }
getList();
/** 查询字典类型列表 */ /** 查询字典类型列表 */
function getTypeList() { function getTypeList() {
getDictOptionselect().then(response => { getDictOptionselect().then(response => {
typeOptions.value = response.data; typeOptions.value = response.data;
}); });
}
function jump(params) {
router.push({
path: "/public/dictdata",
query: {
id: params.id
}
})
} }
/** 查询字典数据列表 */ /** 查询字典字典列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listData(queryParams.value).then(response => { listData({ parentId: route.query.id, ...queryParams.value }).then(response => {
dataList.value = response.rows; dataList.value = response.data;
total.value = response.total; // total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
dictCode: undefined, id: undefined,
dictLabel: undefined, name: undefined,
dictValue: undefined, value: undefined,
cssClass: undefined, cssClass: undefined,
listClass: "default", listClass: "default",
dictSort: 0, code: "",
status: "0", sort: 0,
remark: undefined status: "0",
}; remark: undefined
proxy.resetForm("dataRef"); };
proxy.resetForm("dataRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 返回按钮操作 */ /** 返回按钮操作 */
function handleClose() { function handleClose() {
const obj = { path: "/system/dict" }; const obj = { path: "/system/dict" };
proxy.$tab.closeOpenPage(obj); proxy.$tab.closeOpenPage(obj);
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
queryParams.value.dictType = defaultDictType; queryParams.value.dictType = defaultDictType;
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加字典数据"; title.value = "添加字典字典";
form.value.dictType = queryParams.value.dictType; form.value.dictType = queryParams.value.dictType;
} }
/** 多选框选中数据 */ /** 多选框选中字典 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.dictCode); ids.value = selection.map(item => item.id);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const dictCode = row.dictCode || ids.value; const id = row.id || ids.value;
getData(dictCode).then(response => { getData(id).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改字典数据"; title.value = "修改字典字典";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["dataRef"].validate(valid => { proxy.$refs["dataRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.dictCode != undefined) { if (form.value.id != undefined) {
updateData(form.value).then(response => { updateData({ ...form.value, parentId: route.query.id }).then(response => {
useDictStore().removeDict(queryParams.value.dictType); // useDictStore().removeDict(queryParams.value.dictType);
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addData(form.value).then(response => { addData({ ...form.value, parentId: route.query.id }).then(response => {
useDictStore().removeDict(queryParams.value.dictType); // useDictStore().removeDict(queryParams.value.dictType);
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
}
} }
} });
});
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const dictCodes = row.dictCode || ids.value; const arr = row.id || ids.value;
proxy.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除该的字典项?').then(function () {
return delData(dictCodes); return delData(arr);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
useDictStore().removeDict(queryParams.value.dictType); useDictStore().removeDict(queryParams.value.dictType);
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("system/dict/data/export", { proxy.download("system/dict/data/export", {
...queryParams.value ...queryParams.value
}, `dict_data_${new Date().getTime()}.xlsx`); }, `dict_data_${new Date().getTime()}.xlsx`);
} }
getTypes(route.params && route.params.dictId); // getTypes(route.params && route.params.dictId);
getTypeList(); // getTypeList();
</script> </script>

@ -1,25 +1,21 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <div v-loading="loading" :element-loading-text="'加载中...'">
<el-form-item label="字典名称" prop="dictName"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-input <el-form-item label="字典名称" prop="name">
v-model="queryParams.dictName" <el-input v-model="queryParams.name" placeholder="请输入字典名称" clearable style="width: 240px"
placeholder="请输入字典名称" @keyup.enter="handleQuery" />
clearable </el-form-item>
style="width: 240px" <!-- <el-form-item label="字典类型" prop="code">
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="字典类型" prop="dictType">
<el-input <el-input
v-model="queryParams.dictType" v-model="queryParams.code"
placeholder="请输入字典类型" placeholder="请输入字典类型"
clearable clearable
style="width: 240px" style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item> -->
<el-form-item label="状态" prop="status"> <!-- <el-form-item label="状态" prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.status"
placeholder="字典状态" placeholder="字典状态"
@ -33,8 +29,8 @@
:value="dict.value" :value="dict.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="创建时间" style="width: 308px"> <!-- <el-form-item label="创建时间" style="width: 308px">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
@ -43,24 +39,19 @@
start-placeholder="开始日期" start-placeholder="开始日期"
end-placeholder="结束日期" end-placeholder="结束日期"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="primary" plain icon="Plus" @click="handleAdd"
type="primary" v-hasPermi="['system:dict:add']">新增</el-button>
plain </el-col>
icon="Plus" <!-- <el-col :span="1.5">
@click="handleAdd"
v-hasPermi="['system:dict:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button <el-button
type="success" type="success"
plain plain
@ -79,8 +70,8 @@
@click="handleDelete" @click="handleDelete"
v-hasPermi="['system:dict:remove']" v-hasPermi="['system:dict:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col> -->
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button <el-button
type="warning" type="warning"
plain plain
@ -89,7 +80,7 @@
v-hasPermi="['system:dict:export']" v-hasPermi="['system:dict:export']"
>导出</el-button> >导出</el-button>
</el-col> --> </el-col> -->
<!-- <el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button <el-button
type="danger" type="danger"
plain plain
@ -98,67 +89,62 @@
v-hasPermi="['system:dict:remove']" v-hasPermi="['system:dict:remove']"
>刷新缓存</el-button> >刷新缓存</el-button>
</el-col> --> </el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" :filterOptions="[{}]" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> <el-table :data="typeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column align="center" prop="prop" type="index" label="序号" width="100" />
<el-table-column label="字典编号" align="center" prop="dictId" /> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true"/> <!-- <el-table-column label="字典编号" align="center" prop="id" /> -->
<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true"> <el-table-column label="字典名称" align="center" prop="name" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
<router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type"> <template #default="scope">
<span>{{ scope.row.dictType }}</span> <router-link :to="'/public/dictdata?id=' + scope.row.id" class="link-type">
</router-link> <span>{{ scope.row.code }}</span>
</template> </router-link>
</el-table-column> </template>
<el-table-column label="状态" align="center" prop="status"> </el-table-column>
<!-- <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope"> <template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span> <span>{{ parseTime(scope.row.createTime) }}</span>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button <el-button type="text" icon="Edit" @click="handleUpdate(scope.row)"
type="text" v-hasPermi="['system:dict:edit']">修改</el-button>
icon="Edit" <el-button type="text" icon="Delete" @click="handleDelete(scope.row)"
@click="handleUpdate(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button>
v-hasPermi="['system:dict:edit']" </template>
>修改</el-button> </el-table-column>
<el-button </el-table>
type="text" </div>
icon="Delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:dict:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
<!-- <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="total"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
@pagination="getList" @pagination="getList"
/> /> -->
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dictRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="字典名称" prop="dictName"> <el-form-item label="字典名称" prop="name">
<el-input v-model="form.dictName" placeholder="请输入字典名称" /> <el-input v-model="form.name" placeholder="请输入字典名称" />
</el-form-item> </el-form-item>
<el-form-item label="字典类型" prop="dictType"> <el-form-item label="字典类型" prop="code">
<el-input v-model="form.dictType" placeholder="请输入字典类型" /> <el-input v-model="form.code" placeholder="请输入字典类型" />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <!-- <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio
v-for="dict in sys_normal_disable" v-for="dict in sys_normal_disable"
@ -166,7 +152,7 @@
:label="dict.value" :label="dict.value"
>{{ dict.label }}</el-radio> >{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item> -->
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item> </el-form-item>
@ -187,7 +173,7 @@ import { listType, getType, delType, addType, updateType, refreshCache } from "@
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
// const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); // const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const sys_normal_disable = [{label :'正常',value: '0'},{label :'停用',value: '1'}] const sys_normal_disable = [{ label: '正常', value: '0' }, { label: '停用', value: '1' }]
const typeList = ref([]); const typeList = ref([]);
const open = ref(false); const open = ref(false);
@ -201,122 +187,122 @@ const title = ref("");
const dateRange = ref([]); const dateRange = ref([]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, // pageNum: 1,
pageSize: 10, // pageSize: 10,
dictName: undefined, name: undefined,
dictType: undefined, code: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
dictName: [{ required: true, message: "字典名称不能为空", trigger: "blur" }], name: [{ required: true, message: "字典名称不能为空", trigger: "blur" }],
dictType: [{ required: true, message: "字典类型不能为空", trigger: "blur" }] code: [{ required: true, message: "字典类型不能为空", trigger: "blur" }]
}, },
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型列表 */ /** 查询字典类型列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
typeList.value = response.rows; typeList.value = res.data;
total.value = response.total; // total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
dictId: undefined, id: undefined,
dictName: undefined, name: undefined,
dictType: undefined, code: undefined,
status: "0", status: "0",
remark: undefined remark: undefined
}; };
proxy.resetForm("dictRef"); proxy.resetForm("dictRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
dateRange.value = []; dateRange.value = [];
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加字典类型"; title.value = "添加字典类型";
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.dictId); ids.value = selection.map(item => item.id);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const dictId = row.dictId || ids.value; const id = row.id || ids.value;
getType(dictId).then(response => { getType(id).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改字典类型"; title.value = "修改字典类型";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["dictRef"].validate(valid => { proxy.$refs["dictRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.dictId != undefined) { if (form.value.id != undefined) {
updateType(form.value).then(response => { updateType(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addType(form.value).then(response => { addType(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
}
} }
} });
});
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const dictIds = row.dictId || ids.value; const arr = row.id || ids.value;
proxy.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除数据项?').then(function () {
return delType(dictIds); return delType(arr);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("system/dict/type/export", { proxy.download("system/dict/type/export", {
...queryParams.value ...queryParams.value
}, `dict_${new Date().getTime()}.xlsx`); }, `dict_${new Date().getTime()}.xlsx`);
} }
/** 刷新缓存按钮操作 */ /** 刷新缓存按钮操作 */
function handleRefreshCache() { function handleRefreshCache() {
refreshCache().then(() => { refreshCache().then(() => {
proxy.$modal.msgSuccess("刷新成功"); proxy.$modal.msgSuccess("刷新成功");
useDictStore().cleanDict(); useDictStore().cleanDict();
}); });
} }
getList(); getList();

@ -43,9 +43,9 @@ export default defineConfig(({ mode, command }) => {
}, },
proxy: { proxy: {
'/dev-api': { '/dev-api': {
// target: 'http://192.168.2.39:8581', target: 'http://192.168.2.39:8581',
// target: 'http://192.168.2.223:8080', // target: 'http://192.168.2.223:8080',
target: 'http://39.100.74.100:8581', // target: 'http://39.100.74.100:8581',
changeOrigin: true, changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '') rewrite: (p) => p.replace(/^\/dev-api/, '')
} }

Loading…
Cancel
Save