Browse Source

完成调班模块

qin_15
hreenshan112 9 months ago
parent
commit
f59ad4de69
  1. 2
      src/components/DesignForm/public/form/form.vue
  2. 16
      src/layout/components/AppMain.vue
  3. 16
      src/layout/components/Sidebar/Link.vue
  4. 14
      src/layout/components/Sidebar/Logo.vue
  5. 59
      src/layout/components/Sidebar/SidebarItem.vue
  6. 127
      src/layout/components/Sidebar/index.vue
  7. 23
      src/views/hr/teams/anchorPage.vue
  8. 157
      src/views/system/menu/index.vue
  9. 404
      src/views/sysworkflow/lowCodeTasks/index.vue
  10. 1
      src/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue
  11. 47
      src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue

2
src/components/DesignForm/public/form/form.vue

@ -1561,7 +1561,7 @@ const submit = (params = {}) => {
// }) // })
} else { } else {
// //
afterSubmit("validate", fields); // afterSubmit("validate", fields);
} }
}); });
}; };

16
src/layout/components/AppMain.vue

@ -7,17 +7,17 @@ const tagsViewStore = useTagsViewStore();
<template> <template>
<section class="app-main"> <section class="app-main">
<router-view v-slot="{ Component, route }"> <router-view v-slot="{ Component, route }">
<keep-alive :include="tagsViewStore.cachedViews"> <keep-alive :include="tagsViewStore.cachedViews">
<component :is="Component" :key="route.fullPath" /> <component :is="Component" :key="route.fullPath" />
</keep-alive> </keep-alive>
</router-view> </router-view>
</section> </section>
</template> </template>
<style lang="scss"> <style lang="scss">
.app-main { .app-main {
.app-container{ .app-container {
.el-card{ .el-card {
border: none!important; border: none !important;
} }
} }
} }
@ -30,11 +30,9 @@ const tagsViewStore = useTagsViewStore();
height: calc(100vh - 170px); height: calc(100vh - 170px);
overflow: auto; overflow: auto;
// background-color: var(--el-bg-color-page); // background-color: var(--el-bg-color-page);
} }
.fixed-header + .app-main { .fixed-header + .app-main {
// padding-top: 70px; // padding-top: 70px;
} }
</style> </style>

16
src/layout/components/Sidebar/Link.vue

@ -1,9 +1,9 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue'; import { computed } from "vue";
import { isExternal } from '@/utils/index'; import { isExternal } from "@/utils/index";
import { useRouter } from 'vue-router'; import { useRouter } from "vue-router";
import { useAppStore } from '@/store/modules/app'; import { useAppStore } from "@/store/modules/app";
const appStore = useAppStore(); const appStore = useAppStore();
const sidebar = computed(() => appStore.sidebar); const sidebar = computed(() => appStore.sidebar);
@ -12,16 +12,16 @@ const device = computed(() => appStore.device);
const props = defineProps({ const props = defineProps({
to: { to: {
type: String, type: String,
required: true required: true,
} },
}); });
const router = useRouter(); const router = useRouter();
function push() { function push() {
if (device.value === 'mobile' && sidebar.value.opened == true) { if (device.value === "mobile" && sidebar.value.opened == true) {
appStore.closeSideBar(false); appStore.closeSideBar(false);
} }
router.push(props.to).catch(err => { router.push(props.to).catch((err) => {
console.error(err); console.error(err);
}); });
} }

14
src/layout/components/Sidebar/Logo.vue

@ -1,13 +1,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useSettingsStore } from '@/store/modules/settings'; import { useSettingsStore } from "@/store/modules/settings";
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
defineProps({ defineProps({
collapse: { collapse: {
type: Boolean, type: Boolean,
required: true required: true,
} },
}); });
const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href); const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
@ -23,9 +23,7 @@ const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
to="/" to="/"
> >
<img v-if="settingsStore.sidebarLogo" :src="logo" class="w-12 h-12" /> <img v-if="settingsStore.sidebarLogo" :src="logo" class="w-12 h-12" />
<span v-else class="ml-3 text-white text-sm font-bold" <span v-else class="ml-3 text-white text-sm font-bold">数通智联化工云平台</span>
>数通智联化工云平台</span
>
</router-link> </router-link>
<router-link <router-link
@ -35,9 +33,7 @@ const logo = ref(new URL(`../../../assets/logo.png`, import.meta.url).href);
to="/" to="/"
> >
<img v-if="settingsStore.sidebarLogo" :src="logo" class="w-8 h-8" /> <img v-if="settingsStore.sidebarLogo" :src="logo" class="w-8 h-8" />
<span class="ml-3 text-white text font-bold" <span class="ml-3 text-white text font-bold">数通智联化工云平台</span>
>数通智联化工云平台</span
>
</router-link> </router-link>
</transition> </transition>
</div> </div>

59
src/layout/components/Sidebar/SidebarItem.vue

@ -1,10 +1,10 @@
<script setup lang="ts"> <script setup lang="ts">
import path from 'path-browserify'; import path from "path-browserify";
import { isExternal } from '@/utils/index'; import { isExternal } from "@/utils/index";
import AppLink from './Link.vue'; import AppLink from "./Link.vue";
import { translateRouteTitleI18n } from '@/utils/i18n'; import { translateRouteTitleI18n } from "@/utils/i18n";
import SvgIcon from '@/components/SvgIcon/index.vue'; import SvgIcon from "@/components/SvgIcon/index.vue";
const props = defineProps({ const props = defineProps({
/** /**
@ -12,7 +12,7 @@ const props = defineProps({
*/ */
item: { item: {
type: Object, type: Object,
required: true required: true,
}, },
/** /**
@ -20,8 +20,8 @@ const props = defineProps({
*/ */
basePath: { basePath: {
type: String, type: String,
required: true required: true,
} },
}); });
const onlyOneChild = ref(); // const onlyOneChild = ref(); //
@ -53,7 +53,7 @@ function hasOneShowingChild(children = [], parent: any) {
// 2, true // 2, true
if (showingChildren.length === 0) { if (showingChildren.length === 0) {
onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }; onlyOneChild.value = { ...parent, path: "", noShowingChildren: true };
return true; return true;
} }
return false; return false;
@ -72,7 +72,18 @@ function resolvePath(routePath: string) {
return props.basePath; return props.basePath;
} }
// = (/level/level_3) + // = (/level/level_3) +
const fullPath = path.resolve(props.basePath, routePath); // let fullPath = path.resolve(props.basePath, routePath); //
// if (props.item.appId != 0) {
// fullPath = fullPath + "?app_id=" + props.item.appId;
// if (props.item.tableId != "0") {
// fullPath = fullPath + "&table_id=" + props.item.tableId;
// }
// }
console.log("路由路径<------------------");
console.log("routePath:", routePath);
console.log("fullPath:", fullPath);
console.log("item:", props.item);
console.log("路由路径------------------>");
return fullPath; return fullPath;
} }
</script> </script>
@ -85,7 +96,27 @@ function resolvePath(routePath: string) {
(!onlyOneChild.children || onlyOneChild.noShowingChildren) (!onlyOneChild.children || onlyOneChild.noShowingChildren)
" "
> >
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <app-link
v-if="onlyOneChild.meta && onlyOneChild.appId != 0 && onlyOneChild.tableId != '0'"
:to="
resolvePath(onlyOneChild.path) +
'?app_id=' +
onlyOneChild.appId +
'&table_id=' +
onlyOneChild.tableId
"
>
<el-menu-item :index="resolvePath(onlyOneChild.path)">
<svg-icon
v-if="onlyOneChild.meta && onlyOneChild.meta.icon"
:icon-class="onlyOneChild.meta.icon"
/>
<template #title>
{{ translateRouteTitleI18n(onlyOneChild.meta.title) }}
</template>
</el-menu-item>
</app-link>
<app-link v-else-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
<el-menu-item :index="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)">
<svg-icon <svg-icon
v-if="onlyOneChild.meta && onlyOneChild.meta.icon" v-if="onlyOneChild.meta && onlyOneChild.meta.icon"
@ -93,7 +124,6 @@ function resolvePath(routePath: string) {
/> />
<template #title> <template #title>
{{ translateRouteTitleI18n(onlyOneChild.meta.title) }} {{ translateRouteTitleI18n(onlyOneChild.meta.title) }}
</template> </template>
</el-menu-item> </el-menu-item>
</app-link> </app-link>
@ -102,10 +132,7 @@ function resolvePath(routePath: string) {
<!-- 包含多个子路由 --> <!-- 包含多个子路由 -->
<el-sub-menu v-else :index="resolvePath(item.path)" teleported> <el-sub-menu v-else :index="resolvePath(item.path)" teleported>
<template #title> <template #title>
<svg-icon <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon" />
v-if="item.meta && item.meta.icon"
:icon-class="item.meta.icon"
/>
<span v-if="item.meta && item.meta.title">{{ <span v-if="item.meta && item.meta.title">{{
translateRouteTitleI18n(item.meta.title) translateRouteTitleI18n(item.meta.title)
}}</span> }}</span>

127
src/layout/components/Sidebar/index.vue

@ -42,126 +42,159 @@ const { sidebarLogo } = storeToRefs(settingsStore);
</div> </div>
</template> </template>
<style lang="scss"> <style lang="scss">
.left-box{ .left-box {
margin: 0 0 0 20px; margin: 0 0 0 20px;
border-radius: 4px; border-radius: 4px;
background-color: #fff; background-color: #fff;
.el-scrollbar{} .el-scrollbar {
}
.el-menu{ .el-menu {
padding: 0 20px 20px 20px; padding: 0 20px 20px 20px;
.el-menu-item, .el-sub-menu, .el-sub-menu__title{ .el-menu-item,
.el-sub-menu,
.el-sub-menu__title {
border-radius: 10px; border-radius: 10px;
line-height: 42px; line-height: 42px;
font-size: 16px; font-size: 16px;
padding: 0; padding: 0;
margin-top: 10px; margin-top: 10px;
&:hover{ &:hover {
color: #fff; color: #fff;
} }
} }
.el-menu-item.is-active{ .el-menu-item.is-active {
background: $menuHover; background: $menuHover;
} }
.el-menu--inline .el-sub-menu>.el-sub-menu__title{ .el-menu--inline .el-sub-menu > .el-sub-menu__title {
padding-left: 40px; padding-left: 40px;
background: $subMenuBg; background: $subMenuBg;
//margin-bottom: 10px; //margin-bottom: 10px;
} }
} }
.el-menu .el-menu{ .el-menu .el-menu {
padding: 0 !important; padding: 0 !important;
} }
.el-menu--collapse{ .el-menu--collapse {
padding: 0; padding: 0;
} }
} }
#app .sidebar-container .nest-menu .el-sub-menu > .el-sub-menu__title, #app .sidebar-container .el-sub-menu .el-menu-item{ #app .sidebar-container .nest-menu .el-sub-menu > .el-sub-menu__title,
#app .sidebar-container .el-sub-menu .el-menu-item {
width: 100% !important; width: 100% !important;
min-width: 100% !important; min-width: 100% !important;
} }
.el-menu--inline{ .el-menu--inline {
padding: 10px 0 !important; padding: 10px 0 !important;
.el-menu-item{ .el-menu-item {
padding-left: 40px !important; padding-left: 40px !important;
margin-bottom: 10px; margin-bottom: 10px;
&.is-active{ &.is-active {
color: $menuHover; color: $menuHover;
} }
&:hover{ &:hover {
color: $menuHover; color: $menuHover;
} }
svg{ svg {
//display: none; //display: none;
} }
} }
.el-sub-menu{ .el-sub-menu {
.el-sub-menu__title{ .el-sub-menu__title {
svg{ svg {
//display: none; //display: none;
} }
} }
} }
} }
#app .sidebar-container .svg-icon{ #app .sidebar-container .svg-icon {
margin-right: 5px; margin-right: 5px;
} }
#app .sidebar-container .el-sub-menu .el-sub-menu .el-menu-item{ #app .sidebar-container .el-sub-menu .el-sub-menu .el-menu-item {
background: none !important; background: none !important;
padding-left: 60px!important; padding-left: 60px !important;
} }
#app .sidebar-container .el-sub-menu .el-sub-menu.is-active>.el-sub-menu__title{ #app .sidebar-container .el-sub-menu .el-sub-menu.is-active > .el-sub-menu__title {
background: $subMenuBg; background: $subMenuBg;
color: $menuHover!important; color: $menuHover !important;
} }
#app .sidebar-container .el-sub-menu .el-sub-menu.is-opened> .el-sub-menu__title:hover{ #app .sidebar-container .el-sub-menu .el-sub-menu.is-opened > .el-sub-menu__title:hover {
background: $subMenuBg !important; background: $subMenuBg !important;
color: $menuHover!important; color: $menuHover !important;
} }
#app .sidebar-container .el-sub-menu .el-menu--inline .el-menu-item:hover{ #app .sidebar-container .el-sub-menu .el-menu--inline .el-menu-item:hover {
color: $menuHover!important; color: $menuHover !important;
} }
#app .sidebar-container .el-sub-menu>.el-menu--inline>div>div>.el-menu-item>svg, #app .sidebar-container .el-sub-menu > .el-menu--inline > div > div > .el-menu-item > svg,
#app .sidebar-container .el-sub-menu>.el-menu>div>.el-sub-menu>.el-sub-menu__title>svg{ #app
.sidebar-container
.el-sub-menu
> .el-menu
> div
> .el-sub-menu
> .el-sub-menu__title
> svg {
display: none; display: none;
} }
#app .sidebar-container .el-sub-menu>.el-menu--inline>div>div>.el-menu-item i svg{ #app
.sidebar-container
.el-sub-menu
> .el-menu--inline
> div
> div
> .el-menu-item
i
svg {
display: inline-block; display: inline-block;
background-color: #ff0; background-color: #ff0;
} }
#app .sidebar-container .el-menu .el-sub-menu .el-menu-item:hover, #app .sidebar-container .el-menu .el-sub-menu .el-menu-item:hover,
#app .sidebar-container .el-sub-menu>.el-menu>div>.el-sub-menu>.el-sub-menu__title:hover{ #app
color: $menuHover!important; .sidebar-container
background-color: $subMenuBg!important; .el-sub-menu
> .el-menu
> div
> .el-sub-menu
> .el-sub-menu__title:hover {
color: $menuHover !important;
background-color: $subMenuBg !important;
} }
#app .sidebar-container .el-sub-menu>.el-menu>div>.el-sub-menu>.el-menu>div>.el-sub-menu>.el-sub-menu__title{ #app
.sidebar-container
.el-sub-menu
> .el-menu
> div
> .el-sub-menu
> .el-menu
> div
> .el-sub-menu
> .el-sub-menu__title {
color: #000; color: #000;
background-color: #fff; background-color: #fff;
border: solid 1px #d9d9d9; border: solid 1px #d9d9d9;
} }
#app .sidebar-container .el-menu .el-sub-menu .el-sub-menu .el-menu-item:hover{ #app .sidebar-container .el-menu .el-sub-menu .el-sub-menu .el-menu-item:hover {
color: $menuHover!important; color: $menuHover !important;
background-color: #fff!important; background-color: #fff !important;
} }
.el-menu--popup .el-menu-item{ .el-menu--popup .el-menu-item {
color: #000; color: #000;
>svg{ > svg {
display: none; display: none;
} }
&:hover{ &:hover {
color: #fff; color: #fff;
} }
} }
.el-menu--popup .el-sub-menu .el-sub-menu__title{ .el-menu--popup .el-sub-menu .el-sub-menu__title {
color: #000; color: #000;
background-color: #fff; background-color: #fff;
>svg{ > svg {
display: none; display: none;
} }
&:hover{ &:hover {
color: #fff; color: #fff;
background-color:$menuHover!important; background-color: $menuHover !important;
} }
} }
</style> </style>

23
src/views/hr/teams/anchorPage.vue

@ -62,16 +62,16 @@ const closeDialog = () => {
const gaveAllAppList = () => { const gaveAllAppList = () => {
gaveAllApp() gaveAllApp()
.then(({ data }) => { .then(({ data }) => {
console.log(" 获取app列表应用", data); // console.log(" app", data);
appList.value = data; appList.value = data;
}) })
.finally(() => { .finally(() => {
ginTeamRule().then(({ data }) => { ginTeamRule().then(({ data }) => {
console.log(" 获取app列表应用=====>", data); // console.log(" app=====>", data);
if (data.appid != 0) { if (data.appid != 0) {
formContent.appKey = data.appid.toString(); formContent.appKey = data.appid.toString();
} }
formContent.tableKey = data.tableKey; formContent.sdatableKey = data.tableKey.toString();
}); });
}); });
}; };
@ -83,6 +83,7 @@ watch(
appList.value.forEach((iten: any) => { appList.value.forEach((iten: any) => {
if (iten.app_id == val) { if (iten.app_id == val) {
tableList.value = iten.list; tableList.value = iten.list;
// console.log(" app=====>", iten);
} }
}); });
} }
@ -106,7 +107,14 @@ const onSubmitPick = () => {
} }
if (tableList.value && appList.value.length > 0) { if (tableList.value && appList.value.length > 0) {
tableList.value.forEach((iten: any) => { tableList.value.forEach((iten: any) => {
if (iten.table_key == formContent.tableKey) { // console.log(
// " app=====>",
// iten.table_key,
// "---------->",
// formContent.sdatableKey
// );
if (iten.table_key == formContent.sdatableKey) {
sendData.dataBaseName = iten.dataBaseName; sendData.dataBaseName = iten.dataBaseName;
sendData.ip = iten.ip; sendData.ip = iten.ip;
sendData.port = iten.port; sendData.port = iten.port;
@ -120,9 +128,10 @@ const onSubmitPick = () => {
} }
}); });
} }
console.log("提交调班配置表", sendData); // console.log("", sendData);
setupRulerForm(sendData).then((data: any) => { setupRulerForm(sendData).then((data: any) => {
console.log("提交调班配置表===========234===========>", data); // console.log("===========234===========>", data);
closeDialog();
}); });
}; };
@ -149,7 +158,7 @@ onMounted(() => {
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="关联流程表单"> <el-form-item label="关联流程表单">
<el-select v-model="formContent.tableKey" placeholder="请选择关联App"> <el-select v-model="formContent.sdatableKey" placeholder="请选择关联App">
<el-option <el-option
v-for="item in tableList" v-for="item in tableList"
:label="item.table_name" :label="item.table_name"

157
src/views/system/menu/index.vue

@ -16,6 +16,8 @@ import {
import { MenuTypeEnum } from "@/enums/MenuTypeEnum"; import { MenuTypeEnum } from "@/enums/MenuTypeEnum";
import { gaveAllApp, ginTeamRule, setupRulerForm } from "@/api/hr/people/index";
import SvgIcon from "@/components/SvgIcon/index.vue"; import SvgIcon from "@/components/SvgIcon/index.vue";
import IconSelect from "@/components/IconSelect/index.vue"; import IconSelect from "@/components/IconSelect/index.vue";
@ -26,7 +28,8 @@ const loading = ref(false);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
}); });
const appList = ref<any>([]);
const tableList = ref<any>([]);
const queryParams = reactive<MenuQuery>({}); const queryParams = reactive<MenuQuery>({});
const menuList = ref<MenuVO[]>([]); const menuList = ref<MenuVO[]>([]);
@ -37,7 +40,7 @@ const formData = reactive<MenuForm>({
visible: 1, visible: 1,
sort: 1, sort: 1,
type: MenuTypeEnum.MENU, type: MenuTypeEnum.MENU,
outside:1 outside: 1,
}); });
const rules = reactive({ const rules = reactive({
@ -45,9 +48,7 @@ const rules = reactive({
name: [{ required: true, message: "请输入菜单名称", trigger: "blur" }], name: [{ required: true, message: "请输入菜单名称", trigger: "blur" }],
type: [{ required: true, message: "请选择菜单类型", trigger: "blur" }], type: [{ required: true, message: "请选择菜单类型", trigger: "blur" }],
path: [{ required: true, message: "请输入路由路径", trigger: "blur" }], path: [{ required: true, message: "请输入路由路径", trigger: "blur" }],
component: [ component: [{ required: true, message: "请输入组件完整路径", trigger: "blur" }],
{ required: true, message: "请输入组件完整路径", trigger: "blur" },
],
}); });
// ID // ID
@ -105,7 +106,7 @@ function openDialog(parentId?: number, menuId?: number) {
dialog.visible = true; dialog.visible = true;
if (menuId) { if (menuId) {
dialog.title = "编辑菜单"; dialog.title = "编辑菜单";
getMenuForm({id:menuId.toString()}).then(({ data }) => { getMenuForm({ id: menuId.toString() }).then(({ data }) => {
Object.assign(formData, data); Object.assign(formData, data);
menuCacheData.type = data.type; menuCacheData.type = data.type;
menuCacheData.path = data.path ?? ""; menuCacheData.path = data.path ?? "";
@ -114,6 +115,9 @@ function openDialog(parentId?: number, menuId?: number) {
dialog.title = "新增菜单"; dialog.title = "新增菜单";
formData.parentId = parentId; formData.parentId = parentId;
} }
})
.finally(() => {
gaveAllAppList();
}); });
} }
@ -168,7 +172,7 @@ function handleDelete(menuId: number) {
type: "warning", type: "warning",
}) })
.then(() => { .then(() => {
deleteMenu({id:menuId.toString()}).then(() => { deleteMenu({ id: menuId.toString() }).then(() => {
ElMessage.success("删除成功"); ElMessage.success("删除成功");
handleQuery(); handleQuery();
}); });
@ -197,6 +201,42 @@ function resetForm() {
formData.sort = 1; formData.sort = 1;
} }
/**
@ 作者: 秦东
@ 时间: 2025-02-18 10:44:01
@ 功能: 获取app列表应用
*/
const gaveAllAppList = () => {
gaveAllApp()
.then(({ data }) => {
console.log(" 获取app列表应用", data);
appList.value = data;
})
.finally(() => {
ginTeamRule().then(({ data }) => {
console.log(" 获取app列表应用=====>", data);
if (data.appid != 0) {
formData.appKey = data.appid.toString();
}
formData.sdatableKey = data.tableKey;
});
});
};
watch(
() => formData.appKey,
(val: any) => {
if (appList && appList.value.length > 0) {
appList.value.forEach((iten: any) => {
if (iten.app_id == val) {
tableList.value = iten.list;
}
});
}
},
{
deep: true,
}
);
onMounted(() => { onMounted(() => {
handleQuery(); handleQuery();
}); });
@ -208,18 +248,17 @@ onMounted(() => {
<el-row> <el-row>
<el-col :span="16"> <el-col :span="16">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="关键字" prop="keywords"> <el-form-item label="关键字" prop="keywords">
<el-input <el-input
v-model="queryParams.keywords" v-model="queryParams.keywords"
placeholder="菜单名称" placeholder="菜单名称"
clearable clearable
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
</el-form>
</el-form>
</el-col> </el-col>
<el-col :span="8" style="text-align: right;"> <el-col :span="8" style="text-align: right">
<el-button type="primary" @click="handleQuery" <el-button type="primary" @click="handleQuery"
><template #icon><i-ep-search /></template>搜索</el-button ><template #icon><i-ep-search /></template>搜索</el-button
> >
@ -229,16 +268,14 @@ onMounted(() => {
> >
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<div class="glm-btn-box"> <div class="glm-btn-box">
<el-button type="primary" @click="openDialog(0)" v-hasPerm="['121646328009732096']"> <el-button type="primary" @click="openDialog(0)" v-hasPerm="['121646328009732096']">
<template #icon><i-ep-plus /></template> <template #icon><i-ep-plus /></template>
新增</el-button 新增</el-button
> >
</div> </div>
<el-card shadow="never"> <el-card shadow="never">
<el-table <el-table
v-loading="loading" v-loading="loading"
:data="menuList" :data="menuList"
@ -252,9 +289,7 @@ onMounted(() => {
<template #default="scope"> <template #default="scope">
<svg-icon <svg-icon
:icon-class=" :icon-class="
scope.row.type === MenuTypeEnum.BUTTON scope.row.type === MenuTypeEnum.BUTTON ? 'button' : scope.row.icon
? 'button'
: scope.row.icon
" "
/> />
{{ scope.row.name }} {{ scope.row.name }}
@ -263,9 +298,7 @@ onMounted(() => {
<el-table-column label="菜单类型" align="center"> <el-table-column label="菜单类型" align="center">
<template #default="scope"> <template #default="scope">
<el-tag <el-tag v-if="scope.row.class === MenuTypeEnum.CATALOG" type="warning"
v-if="scope.row.class === MenuTypeEnum.CATALOG"
type="warning"
>目录</el-tag >目录</el-tag
> >
<el-tag v-if="scope.row.class === MenuTypeEnum.MENU" type="success" <el-tag v-if="scope.row.class === MenuTypeEnum.MENU" type="success"
@ -279,11 +312,7 @@ onMounted(() => {
> >
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="权限标识" align="center" prop="permcode" />
label="权限标识"
align="center"
prop="permcode"
/>
<el-table-column label="状态" align="center" width="100"> <el-table-column label="状态" align="center" width="100">
<template #default="scope"> <template #default="scope">
@ -298,7 +327,7 @@ onMounted(() => {
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="scope.row.class == 'CATALOG' || scope.row.class == 'MENU'" v-if="scope.row.class == 'CATALOG' || scope.row.class == 'MENU'"
v-hasPerm="['121646328009732096']" v-hasPerm="['121646328009732096']"
type="primary" type="primary"
link link
size="small" size="small"
@ -309,7 +338,7 @@ onMounted(() => {
</el-button> </el-button>
<el-button <el-button
v-hasPerm="['122274485305880576']" v-hasPerm="['122274485305880576']"
type="primary" type="primary"
link link
size="small" size="small"
@ -319,12 +348,12 @@ onMounted(() => {
编辑 编辑
</el-button> </el-button>
<el-button <el-button
v-hasPerm="['122274565337395200']" v-hasPerm="['122274565337395200']"
type="primary" type="primary"
link link
size="small" size="small"
@click.stop="handleDelete(scope.row.id)" @click.stop="handleDelete(scope.row.id)"
> >
<!-- <i-ep-delete /> --> <!-- <i-ep-delete /> -->
删除 删除
</el-button> </el-button>
@ -341,12 +370,7 @@ onMounted(() => {
width="750px" width="750px"
@close="closeDialog" @close="closeDialog"
> >
<el-form <el-form ref="menuFormRef" :model="formData" :rules="rules" label-width="100px">
ref="menuFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form-item label="父级菜单" prop="parentId"> <el-form-item label="父级菜单" prop="parentId">
<el-tree-select <el-tree-select
v-model="formData.parentId" v-model="formData.parentId"
@ -368,14 +392,30 @@ onMounted(() => {
<el-radio label="MENU">菜单</el-radio> <el-radio label="MENU">菜单</el-radio>
<el-radio label="BUTTON">按钮</el-radio> <el-radio label="BUTTON">按钮</el-radio>
<el-radio label="EXTLINK">外链</el-radio> <el-radio label="EXTLINK">外链</el-radio>
<el-radio label="MyApp">绑定自建应用</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-if="formData.type == 'MyApp'" label="自建应用" prop="appKey">
v-if="formData.type == 'EXTLINK'" <el-select v-model="formData.appKey" placeholder="请选择关联App">
label="外链地址" <el-option
prop="path" v-for="item in appList"
> :label="item.app_name"
:value="item.app_id"
/>
</el-select>
</el-form-item>
<el-form-item v-if="formData.type == 'MyApp'" label="应用表单" prop="appTableKey">
<el-select v-model="formData.sdatableKey" placeholder="请选择关联App">
<el-option
v-for="item in tableList"
:label="item.table_name"
:value="item.table_key"
/>
</el-select>
</el-form-item>
<el-form-item v-if="formData.type == 'EXTLINK'" label="外链地址" prop="path">
<el-input v-model="formData.path" placeholder="请输入外链完整路径" /> <el-input v-model="formData.path" placeholder="请输入外链完整路径" />
</el-form-item> </el-form-item>
@ -403,9 +443,7 @@ onMounted(() => {
placeholder="system/user/index" placeholder="system/user/index"
style="width: 95%" style="width: 95%"
> >
<template v-if="formData.parentId != 0" #prepend <template v-if="formData.parentId != 0" #prepend>src/views/</template>
>src/views/</template
>
<template v-if="formData.parentId != 0" #append>.vue</template> <template v-if="formData.parentId != 0" #append>.vue</template>
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -419,19 +457,12 @@ onMounted(() => {
<el-input v-model="formData.perm" placeholder="sys:user:add" /> <el-input v-model="formData.perm" placeholder="sys:user:add" />
</el-form-item> --> </el-form-item> -->
<el-form-item <el-form-item v-if="formData.type !== 'BUTTON'" label="图标" prop="icon">
v-if="formData.type !== 'BUTTON'"
label="图标"
prop="icon"
>
<!-- 图标选择器 --> <!-- 图标选择器 -->
<icon-select v-model="formData.icon" /> <icon-select v-model="formData.icon" />
</el-form-item> </el-form-item>
<el-form-item <el-form-item v-if="formData.type == MenuTypeEnum.CATALOG" label="跳转路由">
v-if="formData.type == MenuTypeEnum.CATALOG"
label="跳转路由"
>
<el-input v-model="formData.redirect" placeholder="跳转路由" /> <el-input v-model="formData.redirect" placeholder="跳转路由" />
</el-form-item> </el-form-item>
@ -441,11 +472,11 @@ onMounted(() => {
<el-radio :label="0">隐藏</el-radio> <el-radio :label="0">隐藏</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="可见范围"> <el-form-item label="可见范围">
<el-radio-group v-model="formData.outside"> <el-radio-group v-model="formData.outside">
<el-radio :label="1">内部使用</el-radio> <el-radio :label="1">内部使用</el-radio>
<el-radio :label="2">外部使用</el-radio> <el-radio :label="2">外部使用</el-radio>
<el-radio :label="3">内外使用</el-radio> <el-radio :label="3">内外使用</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="排序" prop="sort"> <el-form-item label="排序" prop="sort">

404
src/views/sysworkflow/lowCodeTasks/index.vue

@ -0,0 +1,404 @@
<!--
@ 作者: 秦东
@ 时间: 2025-02-19 14:16:18
@ 备注: 接收低代码表单
-->
<script lang="ts" setup>
import { useRoute, useRouter, LocationQuery } from "vue-router";
import {
json2string,
objToStringify,
string2json,
stringToObj,
} from "@/utils/DesignForm/form";
import {
judgeSubmitCancel,
gainAppPageInfo,
getFieldRecord,
} from "@/api/DesignForm/requestapi";
import request from "@/utils/request";
import { Edit, Picture as IconPicture } from "@element-plus/icons-vue";
import { appPageDataInit, appWorkFlow } from "@/api/date/type";
import {
notAsA_BasisForJudgment,
asAnApprovalActionControl,
fixedValueControl,
timeControl,
timeEquation,
submitButton,
afreshSubmitButton,
} from "@/utils/workflow/const";
const route = useRoute();
const queryData = ref("");
const activePage = ref(0); //
const appInitData = ref<appPageDataInit>("");
//app
const stateForm = reactive<any>({
type: 1, // 123 4 5
formData: {
list: [],
form: {},
config: {},
powerstr: {},
},
dict: {},
formId: "1",
id: 0,
formId: 0,
versionId: 0,
loading: true,
});
//
const stateList = reactive({
tableData: {
// tableProps: {}, //
columns: [],
config: {},
controlBtn: [],
operateBtn: [],
},
searchData: [],
loading: false,
attrObj: {},
config: {
pageSize: 10,
searchIsShow: true,
searchFormIsShow: true,
openPageMode: "drawer",
},
tagList: {},
formId: queryData.value.app_id || "",
formList: [], //
name: "",
treeData: {}, //
previewVisible: false,
tabsName: "second",
formFieldList: [], //
formApi: {
type: "1",
addApiUrl: "",
editApiUrl: "",
delApiUrl: "",
lookApiUrl: "",
},
dict: {},
refreshTable: true,
view: {
list: {
status: true,
isClick: false,
form: {
sortWord: "",
sortClass: 1,
title: [],
},
},
date: {
status: false,
isClick: false,
form: {
startTime: "",
endTime: "",
dayType: 1,
title: [],
},
},
time: {
status: false,
isClick: false,
form: {
sortWord: "",
sort: 1,
title: [],
},
},
gantt: {
status: false,
isClick: false,
form: {
startTime: "",
endTime: "",
dayType: 2,
sortWord: "",
sort: 1,
title: [],
},
},
map: {
status: false,
isClick: false,
form: {
mapWord: "",
sortWord: "",
sort: 1,
title: [],
},
},
card: {
status: false,
isClick: false,
form: {
sort: 1,
sortWord: "",
imgWork: "",
imgWidth: 50,
imgHeight: 50,
imgBorderRadius: 5,
imgPadding: 2,
titleWork: "",
describe: "",
ranks: 3,
title: [],
},
},
},
});
const appFormTitle = ref("");
const versionTitle = ref<string>(""); //
const versionId = ref<string>(""); //
const appFlowInfo = ref<appWorkFlow>(""); //
const isFlow = ref(2);
const mastesformjson = ref(""); //
const pickAppMenu = reactive({
type: 2,
id: "",
});
/**
@ 作者: 秦东
@ 时间: 2024-06-03 09:00:10
@ 功能: 初始化数据
*/
const initLoadData = () => {
// console.log("initLoadData",props.pickAppMenu.type,props.pickAppMenu.type != 1)
pickAppMenu.id = queryData.value.table_id;
gainAppPageInfo({ id: queryData.value.table_id }).then((data) => {
// console.log("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",data)
appInitData.value = data.data;
// console.log("---!",appInitData.value)
mastesformjson.value = data.data.appForm.mastesformjson;
isFlow.value = data.data.appForm.flowIsOpen;
if (data.data.page && data.data.pageList && data.data.appFlow) {
activePage.value = 1;
} else if (data.data.page && !data.data.pageList && data.data.appFlow) {
activePage.value = 2;
} else if (!data.data.page && !data.data.pageList && data.data.appFlow) {
activePage.value = 3;
} else if (!data.data.page && data.data.pageList && data.data.appFlow) {
activePage.value = 1;
} else if (data.data.page && !data.data.pageList && !data.data.appFlow) {
activePage.value = 2;
} else {
activePage.value = 1;
}
versionId.value = data.data.appForm.id.toString();
versionTitle.value = data.data.appForm.name;
if (data.data.pageList) {
let stateData = string2json(data.data.appForm.listjson);
console.log("接邂逅的数", stateData);
let holeControlAndConfigStateData = string2json(data.data.appForm.mastesformjson);
if (stateData.tableData.columns && stateData.tableData.columns.length > 0) {
for (let i = 0; i < stateData.tableData.columns.length; i++) {
for (let u = 0; u < holeControlAndConfigStateData.list.length; u++) {
if (
stateData.tableData.columns[i].id ==
holeControlAndConfigStateData.list[u].name
) {
stateData.tableData.columns[i].control =
holeControlAndConfigStateData.list[u].control;
stateData.tableData.columns[i].config =
holeControlAndConfigStateData.list[u].config;
}
}
if (
stateData.tableData.columns[i].config != undefined &&
stateData.tableData.columns[i].control != undefined
) {
// console.log(stateData.tableData.columns[i])
let paramx: string =
"" + stateData.tableData.columns[i].control.optionsValue3Field;
/*
在这里请求后台获取字段
*/
//console.log("runAppForm-----214",paramx)
if (paramx && paramx != "" && paramx != null && paramx != "undefined") {
getFieldRecord(paramx).then(({ data }) => {
stateData.tableData.columns[i].options = data;
if (stateData.searchData.length > 0) {
for (let j = 0; j < stateData.searchData.length; j++) {
// console.log(stateData.searchData[j])
if (stateData.searchData[j].id == stateData.tableData.columns[i].id) {
stateData.searchData[j].options = data;
}
}
}
});
}
if (stateData.searchData && stateData.searchData.length > 0) {
for (let j = 0; j < stateData.searchData.length; j++) {
// console.log(stateData.searchData[j])
if (stateData.searchData[j].id == stateData.tableData.columns[i].id) {
// console.log(stateData.tableData.columns[i])
stateData.searchData[j].control =
stateData.tableData.columns[i].control;
stateData.searchData[j].config = stateData.tableData.columns[i].config;
// console.log(stateData.searchData[j])
}
}
}
}
}
}
stateList.tableData = stateData.tableData;
stateList.searchData = stateData.searchData;
if (stateList.searchData == null) {
stateList.searchData = new Array();
}
stateList.loading = stateData.loading;
stateList.attrObj = stateData.attrObj;
stateList.config = stateData.config;
stateList.tagList = stateData.tagList;
stateList.formList = stateData.formList;
stateList.name = stateData.name;
stateList.treeData = stateData.treeData;
stateList.previewVisible = stateData.previewVisible;
stateList.formFieldList = stateData.formFieldList;
stateList.formApi = stateData.formApi;
stateList.dict = stateData.dict;
stateList.refreshTable = stateData.refreshTable;
if (stateData.view) {
stateList.view = stateData.view;
}
}
if (data.data.page) {
// console.log("data.data.mastesform", data.data)
stateForm.id = data.data.appForm.version.toString();
stateForm.formId = data.data.appForm.cfid.toString();
stateForm.versionId = data.data.appForm.id.toString();
stateForm.formData = stringToObj(data.data.appForm.mastesform);
stateForm.dict = string2json(data.data.appForm.dict);
stateForm.formData.powerstr = string2json(data.data.appForm.powerstr);
// console.log("data.data.mastesform", stateForm.formData)
judgeSubmitCancel({ name: data.data.appForm.mastesformjson }).then(
(datajud: any) => {
if (datajud.code == 0) {
if (datajud.data == 3 || datajud.data == 4) {
stateForm.formData.list.push(submitButton);
}
}
}
);
}
if (data.data.appFlow) {
appFlowInfo.value = data.data.workFlow;
}
});
};
//liwenxuan start
interface Tree {
id?: string;
label: string;
disabled?: boolean;
children?: Tree[];
parentId?: string;
[key: string]: any;
}
const orgAndManTree = ref<Tree[]>();
function getAssociatedFormsOrgAndManTree() {
return request({
url: "/javasys/lowCode/transfer/getOrgAndManTree",
method: "post",
});
}
getAssociatedFormsOrgAndManTree().then(({ data }) => {
let resData = ref(data.children);
orgAndManTree.value = [
{
id: data.id,
//label: data.label,
label: "组织机构",
children: [...resData.value],
},
];
});
//liwenxuan end
function optionsValue3Get3(data: any, fieldName: string) {
console.log("runAppForm", "optionsValue3Get3");
for (let i = 0; i < stateForm.formData.list.length; i++) {
if (stateForm.formData.list[i].name == fieldName) {
stateForm.formData.list[i].options = [];
for (let j = 0; j < data.length; j++) {
stateForm.formData.list[i].options.push(data[j]);
}
}
}
}
onMounted(() => {
const query: LocationQuery = route.query;
queryData.value = query;
nextTick(() => {
initLoadData();
});
});
</script>
<template>
<div class="myAppBox">
<el-scrollbar class="scroBox">
<el-card style="width: 100%" shadow="always">
<AppPageList
v-if="appInitData.pageList"
:data="stateList.tableData"
:search-data="stateList.searchData"
:config="stateList.config"
:form-id="appInitData.appForm.cfid.toString()"
:versionid="appInitData.versionId"
:versiontitle="versionTitle"
:sign-code="appInitData.signCode"
:pickAppMenu="pickAppMenu"
:viewPage="stateList.view"
:form-basic-config="stateForm.formData.form"
:fields-detail-list="stateForm.formData.list"
:org-and-man-tree="orgAndManTree"
/>
<ak-form
v-else
ref="formEl"
:number="queryData.table_id"
:isWorkFlow="isFlow"
:form-data="stateForm.formData"
:type="pickAppMenu"
:mastesformjson="mastesformjson"
:flowkey="appInitData.flowkey"
:groupid="appInitData.groupid"
:sign-code="appInitData.signCode"
:version-id="appInitData.versionId"
add-url="addData"
@optionsValue3Get3="optionsValue3Get3"
/>
</el-card>
</el-scrollbar>
</div>
</template>
<style lang="scss" scoped>
.myAppBox {
display: flex;
width: 100%;
padding: 10px 20px 0 20px;
:deep .el-card__body {
padding: 20px 0px 10px 0;
}
}
.scroBox {
padding: 10 10px;
height: calc(100vh - 180px);
.tispMsg {
margin: 0 auto 15px auto;
}
}
</style>

1
src/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue

@ -486,6 +486,7 @@ let objMastesform: any;
@ 功能: 初始化数据 @ 功能: 初始化数据
*/ */
const initLoadData = () => { const initLoadData = () => {
console.log("获取初始化表单数据-------------->", props.pickAppMenu);
// console.log("initLoadData",props.pickAppMenu.type,props.pickAppMenu.type != 1) // console.log("initLoadData",props.pickAppMenu.type,props.pickAppMenu.type != 1)
if (props.pickAppMenu.type != 1) { if (props.pickAppMenu.type != 1) {
// appFormTitle.value = props.pickAppMenu.label // appFormTitle.value = props.pickAppMenu.label

47
src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue

@ -325,34 +325,33 @@ watch(
} }
); );
//liwenxuan start //liwenxuan start
interface Tree { interface Tree {
id?: string; id?: string;
label: string; label: string;
disabled?: boolean; disabled?: boolean;
children?: Tree[]; children?: Tree[];
parentId?: string; parentId?: string;
[key: string]: any; [key: string]: any;
} }
const orgAndManTree = ref<Tree[]>(); const orgAndManTree = ref<Tree[]>();
function getAssociatedFormsOrgAndManTree() { function getAssociatedFormsOrgAndManTree() {
return request({ return request({
url: "/javasys/lowCode/transfer/getOrgAndManTree", url: "/javasys/lowCode/transfer/getOrgAndManTree",
method: "post", method: "post",
}); });
} }
getAssociatedFormsOrgAndManTree().then(({ data }) => { getAssociatedFormsOrgAndManTree().then(({ data }) => {
let resData = ref(data.children); let resData = ref(data.children);
orgAndManTree.value = [ orgAndManTree.value = [
{ {
id: data.id, id: data.id,
//label: data.label, //label: data.label,
label: "组织机构", label: "组织机构",
children: [...resData.value], children: [...resData.value],
}, },
]; ];
}); });
//liwenxuan end //liwenxuan end
@ -367,8 +366,6 @@ function optionsValue3Get3(data: any, fieldName: string) {
} }
} }
} }
</script> </script>
<template> <template>
<el-row> <el-row>
@ -390,8 +387,8 @@ function optionsValue3Get3(data: any, fieldName: string) {
:pickAppMenu="props.pickAppMenu" :pickAppMenu="props.pickAppMenu"
:viewPage="stateList.view" :viewPage="stateList.view"
:form-basic-config="stateForm.formData.form" :form-basic-config="stateForm.formData.form"
:fields-detail-list="stateForm.formData.list" :fields-detail-list="stateForm.formData.list"
:org-and-man-tree = "orgAndManTree" :org-and-man-tree="orgAndManTree"
/> />
<!-- <AppFormPage <!-- <AppFormPage
v-else v-else

Loading…
Cancel
Save