first commit

main
王文龙 2023-11-15 12:59:32 +08:00
commit c380954f7d
1102 changed files with 80360 additions and 0 deletions

28
.gitignore vendored Normal file
View File

@ -0,0 +1,28 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
package-lock.json
pnpm-lock.yaml
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

1
.svn/entries Normal file
View File

@ -0,0 +1 @@
12

1
.svn/format Normal file
View File

@ -0,0 +1 @@
12

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,83 @@
<!-- 品质 -->
<script setup lang="ts">
import HomeHead from '@/views/home/components/HomeHead.vue'
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
import { useDate } from '@/views/home/hooks/useDate'
import { NTimeline, NTimelineItem } from 'naive-ui'
const { day, week } = useDate()
const { push } = useRouter()
const array = ref<any[]>([
{ content1: '抓紧时代变化,利用数字化武器,不断提升工作价值', content2: '時代の変化を掴み、デジタル化を武器にして仕事の価値を高める', year: '2023年' },
{ content1: '以数字化为基石,领先时代的变化,发掘并创造新价值,实现再飞跃', content2: 'デジタルを基盤にし、時代の変化を先取りし、新たな価値を創り出し、次なる躍進へ', year: '2022年' },
{ content1: '', content2: '', year: '2021年' },
{ content1: '', content2: '', year: '2020年' },
{ content1: '', content2: '', year: '2016年' },
{ content1: '', content2: '', year: '2018年' },
{ content1: '', content2: '', year: '2017年' },
{ content1: '', content2: '', year: '2016年' },
{ content1: '', content2: '', year: '2015年' },
]);
</script>
<template>
<HomeHead class="top">
<template #content>
<!-- <HomeHeadSearch /> -->
</template>
</HomeHead>
<div class="h-full relative flex flex-col">
<div class="font-600 flex items-end mt27px">
<div class="text-36px">集团方针</div>
<div class="text-18px ml40px mr25px">{{ day }}</div>
<div class="text-18px">{{ week }}</div>
</div>
<div class="g-wrapper flex-1 mt30px">
<div class="timeline mt35px ml178px">
<NTimeline size="large">
<NTimelineItem class="h92px one" v-for="item in array" :key="item.year">
<div class="flex gap-60px justify-between">
<div class="year absolute">{{ item.year }}</div>
<div class="content1">{{ item.content1 }}</div>
<div class="content2 pr50px">{{ item.content2 }}</div>
</div>
</NTimelineItem>
</NTimeline>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.top {
position: absolute;
right: 30px;
top: -92px;
}
.g-wrapper {
border-radius: 18px;
border: 1px solid #E7EBF5;
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
overflow: hidden;
.timeline {
font-size: 20px;
font-weight: bold;
color: #142142;
.one {
position: relative;
.year{
left: -132px;
top: -14px;
color: #003CB7;
font-size: 26px;
font-weight: normal;
text-align: center;
line-height: 50px;
}
}
}
}
</style>

View File

@ -0,0 +1 @@
.button[data-v-e928f0e8]{display:block;float:right;margin-right:20px}[data-v-e928f0e8]::-webkit-scrollbar{width:1px}.top[data-v-e928f0e8]{position:absolute;right:30px;top:-92px}.date-wrapper[data-v-c5c4f420][data-v-e928f0e8]{line-height:1.5;position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;color:#142142;border:none}.tab div[data-v-e928f0e8]:hover{color:#0036bc}.box[data-v-e928f0e8]{padding:23px 20px 0}.box .box-title[data-v-e928f0e8]{font-size:28px;font-weight:600;position:relative;padding-left:24px;color:#000}.box .box-title[data-v-e928f0e8]:before{content:" ";display:block;width:8px;height:30px;background-color:#003ab5;position:absolute;left:0}.bgStyle[data-v-e928f0e8]{display:flex;width:100%;height:270px;position:relative;padding:0 5px}.bgStyle div[data-v-e928f0e8]{flex:1;border:1px solid #ececec;border-radius:18px}.bgStyle div .title[data-v-e928f0e8]{border-radius:18px 0 50px;color:#f0f8ff;line-height:40px;font-size:24px;font-weight:500;z-index:50;position:absolute}

View File

@ -0,0 +1,206 @@
<script setup lang="ts">
import { RouterView } from 'vue-router'
import { useUserStore } from '@/stores/modules/user'
import { treeDbList,download } from '@/api/daikin/base'
import {databaseld} from "@/stores/modules/database"
const { push } = useRouter()
const store = useUserStore()
const database = databaseld()
const { toggle } = inject<any>('fullscreen')
const activeMenuKey = ref()
let idx = ref(0)
const titles = ref()
function menuHandler(menu: any, index: number) {
console.log(menu)
activeMenuKey.value = menu.id
titles.value = menu.name
idx.value = index;
activeItem.value = menu.id
if (menu.childList&&menu.childList.length>0){
activeItem.value = menu.childList[0].id
}
database.database.id =activeItem.value
}
function goChild(menu: any) {
activeItem.value = menu.id
console.log(menu.id)
database.database.id =menu.id
}
var activeItem = ref()
const tableData = ref()
async function getTree() {
const { data } = await treeDbList({})
tableData.value = data
if(data&&data[0]){
// console.log(data[0])
titles.value = data[0].name
activeMenuKey.value = data[0].id
database.database.id = data[0].id
// if(data[0].childList&&data[0].childList.length>0){
// activeItem.value = data[0].childList[0].id
// activeMenuKey.value = data[0].childList[0].id
// }
}
}
onMounted(() => {
getTree()
})
const onClic = ref(false)
</script>
<template>
<div class="page w-1920px h-1080px flex">
<div class="w350px -mr-1px flex flex-col shrink-0 overflow-auto">
<div class="p30px bg-#000 ">
<!-- @dblclick="toggle" -->
<img src="@/assets/images/logo@2x.png" class="w197px h44px mt14px" />
</div>
<div class="pt30px pb24px flex-1 pl20px bg-#fff">
<div class="nav px36px py24px m10px mr0 rd-32px rd-r-0 flex flex-col text-#000 cursor-pointer"
v-for="(m, index) in tableData" :key="m.id" :class="activeMenuKey === m.id ? (m.childList ? 'actives' : 'active') : ''"
@click="() => menuHandler(m, index)">
<div :class="activeMenuKey === m.id && 'onActive'" class="flex" @click="onClic=!onClic">
<!-- <img v-if="activeMenuKey === m.id" :src="m.icon1" class="w22px h22px mr16px mt--5px" />
<img v-else :src="m.icon" class="w22px h22px mr16px mt--5px" /> -->
<!-- lujinli -->
<!-- <span class="text-17px font-900 relative min-w195px block"> -->
<span class="text-18px font-900 relative min-w195px block">
<span class="truncate"> {{ m.name }} </span>
<span class="text-#000000 absolute right--30px top--5px"><el-icon size="26">
<CaretTop v-if="activeMenuKey === m.id&&onClic" class="text-#4977FC" />
<CaretBottom v-else />
</el-icon></span>
</span>
</div>
<div v-if="m.childList && idx == index" class="pl40px" v-show="idx === index&&onClic?true:false">
<div class="my30px pl10px text-#000 activeChildren" v-for="(item, ind) in m.childList" :key="item.id"
@click.stop="goChild(item)" @click="activeItem = item.id" >
<span class="text-18px flex child font-900 truncate" :class="activeItem === item.id ? 'text-#002fa7' : ''">{{ item.name }}</span>
<div v-if="item.childList && idx == index" class="pl10px">
<div class="my30px pl10px text-#000 " v-for="(ite, ind) in item.childList" :key="item.id"
@click.stop="goChild(ite)" @click="activeItem = ite.id">
<span class="text-18px flex childs font-900 truncate" :class="activeItem === ite.id ? 'text-#002fa7' : ''">{{ ite.name }}</span>
<div v-if="ite.childList && idx == index" class="pl10px">
<div class="my30px pl10px text-#000 " v-for="(it, ind) in ite.childList" :key="item.id"
@click.stop="goChild(it)" @click="activeItem = it.id">
<span class="text-18px flex childs font-900 truncate" :class="activeItem === it.id ? 'text-#002fa7' : ''">{{ it.name }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="main flex-1 pb15px pt0px relative ">
<!-- <Home /> -->
<RouterView :cateId="activeItem" :title="titles"/>
</div>
</div>
</template>
<style scoped lang="less">
.truncate {
display: block;
max-width: 226px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.page {
font-family: 'PingFang SC';
user-select: none;
background-image:none;
background-color: #cacaca;
background-position: 0 0;
background-repeat: no-repeat;
background-size: cover;
// color: #3b3b3b;
color: #000;
line-height: 1;
}
.nav {
&::before {
top: -48px;
}
.child:hover {
text-decoration: underline;
}
.childs:hover {
text-decoration: underline;
}
&::after {
bottom: -49px;
transform: rotate(-90deg);
}
&.active {
color: #002fa7;
background-color: #E6ECFF;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
}
&.actives {
padding: 0px !important;
color: #4977FC;
background-color: #F5F8FF;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
.onActive {
background-color: #E6ECFF;
border-radius: 32px 0 0 32px;
padding: 24px 36px 24px 36px;
}
}
}
.main {
width: 100%;
height: 95%;
background-color: #4877FB;
margin-left: 30px;
}
&::-webkit-scrollbar {
display: none;
scrollbar-width: none
}</style>

View File

@ -0,0 +1,35 @@
<script setup lang="ts">
const { push } = useRouter()
const route = useRoute()
const menus = computed(() => {
return route.matched
.map((i: any) => {
i.title = i.meta.title
return i
})
.filter((i) => i.title)
})
function handleClick(menu: any) {
push(menu.path)
}
</script>
<template>
<div class="absolute text-15px top-18px left-0 font-600 z-99">
<span class="cursor-pointer item" v-for="(item, idx) in menus" :key="item.path">
<span @click="handleClick(item)">{{ item.title }}</span>
<span class="mx8px" v-if="idx < menus.length - 1">></span>
</span>
</div>
</template>
<style scoped lang="less">
.item {
// &::after {
// con
// }
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -0,0 +1,251 @@
<script setup lang="ts">
import { getFootprintList } from "@/api/daikin/base";
import HomeHead from "@/views/home/components/HomeHead.vue";
import { useMessage } from 'naive-ui'
const message = useMessage()
const { push } = useRouter();
const route = useRoute()
const download = async (row)=>{
// console.log(row)
if(!row) return
if(row.isSelect===2){
message.error("没有访问权限")
return
}
let {filePath} = row
if(!filePath) {
message.info("没有可预览文件!")
return
}
srcType.value = getLastSubstring(filePath)
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
// src.value = filePath
// pdfShow.value = true
filePath='https://view.xdocin.com/view?src='+filePath
const screenWidth = window.screen.width;
const screenHeight = window.screen.height;
window.open(filePath, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
}
else{
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'")
}
}
const pageInfo = reactive({
pageNum:1,
pageSize:15,
total:10
})
const tableData = ref()
const getZu=async ()=>{
const {pageNum, pageSize } = pageInfo;
const { rows,total } = await getFootprintList({ pageNum, pageSize, moduleId: "2"});
tableData.value = rows
pageInfo.total = total
}
onMounted(() => {
getZu()
});
const lazyState = computed(() => [pageInfo.pageNum])
watch(
() => unref(lazyState),
async (v) => {
getZu()
},
{ immediate: true, deep: true },
)
const handleSizeChange=(e)=>{
console.log(e)
}
const handleCurrentChange=(e)=>{
console.log(e)
}
const toDetail = (obj) => {
console.log(obj);
if (obj.isSelect === 2) {
message.info("没有访问权限");
return;
} else {
openUrl(obj.filePath[0].url);
}
};
const srcType = ref();
const openUrl = async (url) => {
if (!url) {
message.info("没有可预览文件!");
return;
}
srcType.value = getLastSubstring(url);
if (
["doc", "docx", "ppt", "pptx", "xls", "xlsx", "pdf"].includes(srcType.value)
) {
// src.value = filePath
// pdfShow.value = true
url = "https://view.xdocin.com/view?src=" + url;
const screenWidth = window.screen.width;
const screenHeight = window.screen.height;
window.open(
url,
"",
"width=" +
screenWidth +
",height=" +
screenHeight +
",top=" +
0 +
",left=" +
0
);
} else {
message.error(
"文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'"
);
}
};
function getLastSubstring(str: string): string {
const lastIndex = str.lastIndexOf(".");
if (lastIndex !== -1) {
return str.substring(lastIndex + 1);
} else {
return "";
}
}
</script>
<template>
<HomeHead class="top"></HomeHead>
<div class="page w-full h-full flex bg-#fff rd-20px p30px">
<div class=" relative w-full h-910px">
<table
class="history w-full text-center text-16px border-spacing-0"
>
<thead
style="
background-color: #e7edff;
color: #0a0a0a;
height: 50px;
width: 220px;
border: 1px solid #417bef;
"
>
<tr class="text-20px leading-50px">
<th width="70%">
标题
</th>
<th width="30%">
时间
</th>
</tr>
</thead>
<tbody >
<tr v-if="tableData" v-for="(it, index) in tableData" :key="index">
<td class="h50px"><span class="download text-#000 text-16px" @click="toDetail(it)">{{ it.title}}</span></td>
<td class="h50px"><span class="text-#000 text-16px" >{{ it.createTime}}</span></td>
</tr>
</tbody>
</table>
<div class="float-right absolute bottom-20px right-30px">
<el-pagination v-model:current-page="pageInfo.pageNum" v-model:page-size="pageInfo.pageSize"
layout="prev, pager, next, jumper" :total="pageInfo.total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
</div>
</template>
<style scoped lang="less">
.download {
cursor: pointer;
}
.download:hover {
color: #00E4FF;
}
.top {
position: absolute;
right: 30px;
top: -92px;
}
.download {
cursor: pointer;
}
.download:hover {
color: #00E4FF;
}
.nav {
&::before {
top: -48px;
}
.child:hover {
text-decoration: underline;
}
.childs:hover {
text-decoration: underline;
}
&::after {
bottom: -49px;
transform: rotate(-90deg);
}
&.active {
color: #002fa7;
background-color: #e6ecff;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
}
&.actives {
padding: 0px !important;
color: #002fa7;
background-color: #f5f8ff;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
.onActive {
background-color: #e6ecff;
border-radius: 32px 0 0 32px;
padding: 24px 36px 24px 36px;
}
}
}
.main {
width: 100%;
height: 95%;
background-color: #4877fb;
}
&::-webkit-scrollbar {
display: none;
scrollbar-width: none;
}
</style>

View File

@ -0,0 +1 @@
.news-wrapper .title[data-v-18fb93e8]{font-size:22px;text-align:center}.news-wrapper .sub-title[data-v-18fb93e8]{text-align:center;font-size:16px;color:#808696;margin-top:18px}.container[data-v-18fb93e8]{column-gap:34px;line-height:2;margin-top:32px;font-size:18px;color:#000}.container[data-v-18fb93e8] img{width:100%;border-radius:6px;margin-bottom:24px}.container[data-v-18fb93e8] p{text-indent:2em}.back[data-v-d9d2f02e]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.top[data-v-d9d2f02e]{right:30px;top:0}.page[data-v-d9d2f02e]{width:100%;font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-image:url(/assets/bg-cd5f27e0.jpg);background-color:#000;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#fff;line-height:1}.page .page-wrap[data-v-d9d2f02e]{display:grid;grid-template-columns:1fr 314px;grid-template-rows:repeat(2,1fr);grid-column-gap:30px;grid-row-gap:30px}.page .page-wrap .page-main[data-v-d9d2f02e]{height:830px;grid-area:1 / 1 / 3 / 2}.page .page-wrap .page-side[data-v-d9d2f02e]{height:100%;grid-area:1 / 2 / 2 / 3}.page .page-wrap .page-side[data-v-d9d2f02e]:last-of-type{height:300px;grid-area:2 / 2 / 3 / 3}.main[data-v-d9d2f02e]{background-image:url(/assets/bg-rs-main-5a93bda9.svg);background-position:0 0;background-repeat:repeat-x;background-size:auto}.box[data-v-d9d2f02e]{--title-h: 58px;border:0}.box .box-title[data-v-d9d2f02e]{height:var(--title-h);color:#fff;background-color:#537deb;font-size:18px;font-weight:600;padding:0 24px;cursor:pointer}.box .box-content[data-v-d9d2f02e]{height:100%;max-height:calc(100% - var(--title-h))}.line[data-v-d9d2f02e]{border-bottom:1px solid #eef3fb}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.3.1 -->
<svg width="150" height="160" viewBox="0 0 150 160" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<image id="-4" x="0" y="0" width="150" height="160" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAJYAAACgCAYAAADuIpVSAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAlqADAAQAAAABAAAAoAAAAAA5KgUGAAAIMklEQVR4Ae2dwW4bRRiAZ8axg9uCiARVei4HQOLIqS+R8gJwygGqqpegHqoqQhwq5YIQcOiJJ6B9iT4BUsWhOScCpCDUxIkT7zD/Ko7cNr9d779r7y7filDX//4z42++zoxnY693Czi2t7fDlvt73Q3jeljprGUuvpOqDQuomiqcy4Lzx9nZ6MD1/P6O+2A/9UdWNRhfdQUvt79ejy58GjJ/teq6KH82gSzEQ++y59e2f9mffXbxMyoTKzrnhw/ufXwWRh8Vbx6ZVRFYyTovet//8EcSIHVV+Udl0xFSld9ZZZYo/+Clj8osc7KsSsSS6Y+RahJzPR9LH0lfVdE601R46aI8ix0XwmepsatVNJgySydw4rLsdxf8qMxFfmGxtEV5CGEtyyLrqtL7v7oCQ/Avsiw7mKzBusifeyqURfnJg3uf+Kzz+WXv9GIW1yYbyOP6E7isz6RvpY+lr6XP530Vc4s1a1EeY3x33kZw/nIJTOuzoov8ucR6q0V5CN3lYqL2uQnM6LMii/xLh7i4udkdrPc3XIwb0btbqaE30k9v7gaTMJuA985fa9Ig74fO+z3X7T5z773/tP/Vnafe+9PXX+gbYh09vHs7zak76cSbr5/M3ysg0Flx/sqVCgpeUJE+7HY+vL61+uWdJ5M1XogV0/W8w+zgkXdxa/IEHldMoNdzflUunTb86F/d6X9z/34avfLrkCvjl4NUYxKL/dOHuZa5i23cPLUNDrcGPz+SjG/lf/mIdT79/SZPcCyWgO+naXDl4t/3YiuvoLbO9fUvZFoMslA/X1NVUA1FziTgWzJinb/Q0V9/7qTti27I3/2xUJ/Z/5WdkN4VtuqI2c3Brz9tBNlSaNULa9qLaZtYwv/ffzbC+T5V07qjPe1t2YCVd8zp6S2Z4GXzkwMC5RGI8YaIxY56eUgpKScQe+16S9LEbk1vydt4INayezW20yzEQqxKCCBWJVjnKDRW/hG/ORpT3qmIVR7LYiUhVjFuZE0nEDNGrOmEiBYjMEKsYuDImk4gG02PNzTKGmvZHSfbDS2cDhFr2WJJ/aP2jVqIVQOx4tlZDVpRbhMQq1yexUobIVYxcGRNJyDrrJaNWoxY07t8YdF4+sZH8xZWdxUVIVYVVIuUKSNWi65HI1YRCSrJkemwPaMWYlUiSbFC43BYLLGGWYhVp06RXfiWLOIRq05ipbbE4UnNWlSsOYhVjFt1WbIL34JRC7GqU6RwyfHkuHBuXRIRqy49MdmOdFG66Qt5xJrs0Do9lrVW1tyNLcSqk0yTbUmXeeLJYPKZRj1GrDp3V1rEN3VKRKw6iyVtk4V8A39fC7HqLlZqXzxOU2LDlluI1QCx5FeX4+CwUXIhVhPEkjam6TAeHzWltdzltDE9JQ2VxfxxMzZPGbEaZVZq7OmwEXIhVtPEkvaKXIM0LdZ4QY9YTRRL2izTYo0X9IjVVLGk3bKgP3pZy30uxGqyWNJ22Yo4OqzdDj1iNV2scfvTDn2+7qrJhWvEGndMG/6UdVeaGutwfRGx2iDU5GuQD7/K6HWY1l5JtGUd7bk70LII1rXe/DJQ2pLodJzvrS78RlCIVVcxymqXvHOUPa8ggqWv9F9Jd1ZewN0wEKusDqx7OemjZflvSbh0SSjdxs53k2AV3s4OseouROntS2uw9InrKJ+6lhtEya2DRbA0ZboSb8qJWKV3XIMKzL/l5lwyabaIlqZM1wkuv/Or3Esx/0nPSyz9d3HI5STJz3/S96imb3/Ov6hXvlM1jY6IdUGKB7kk8l1d6aON4o3lYLvBQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAoiloiFgIYBYFnrkqgQQS0VDwEIAsSz0yFUJIJaKhoCFAGJZ6JGrEkAsFQ0BCwHEstAjVyWAWCoaAhYCiGWhR65KALFUNAQsBBDLQo9clQBiqWgIWAggloUeuSoBxFLRELAQQCwLPXJVAiLWUI0SgEAxAkMRa69YLlkQUAnsBR/dMzVMAAIFCIhTwXn/tEAuKRDQCSSnQn9/IGLt6mcRgcBcBHbFqeAfPz71zm3NlcrJEFAIiEviVL7dcOW7H59E53eUc3kaAm9FQBwSl+Tki32sq2HtPnK9FT9OuoSAuCMOjUNp5Hr1OHp493Z0Tkavm69G+BsELiWwK9PfeKQan/GGWBKIm5vdwXp/w8W4Eb27lZ66kX56EuP43xOQDfW9fJsqvfuThbqsqV6n8h8hJddUN0CQZAAAAABJRU5ErkJggg=="/>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1 @@
export const WEEK_ENUM_CN = ['日', '一', '二', '三', '四', '五', '六']

View File

@ -0,0 +1,21 @@
import { defineStore } from 'pinia';
export const useMyStore = defineStore('myStore', {
state: () => ({
data: JSON.parse(localStorage.getItem('myData')) || null,
type: JSON.parse(localStorage.getItem('mType')) || null,
}),
actions: {
setData(data: any) {
this.data = data;
// 将数据保存到本地存储
localStorage.setItem('myData', JSON.stringify(data));
},
setType(data: any) {
this.type = data;
// 将数据保存到本地存储
localStorage.setItem('myType', JSON.stringify(data));
},
},
});

View File

@ -0,0 +1,279 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
const computed: typeof import('vue')['computed']
const computedAsync: typeof import('@vueuse/core')['computedAsync']
const computedEager: typeof import('@vueuse/core')['computedEager']
const computedInject: typeof import('@vueuse/core')['computedInject']
const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
const controlledRef: typeof import('@vueuse/core')['controlledRef']
const createApp: typeof import('vue')['createApp']
const createEventHook: typeof import('@vueuse/core')['createEventHook']
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
const customRef: typeof import('vue')['customRef']
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
const effectScope: typeof import('vue')['effectScope']
const extendRef: typeof import('@vueuse/core')['extendRef']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
const inject: typeof import('vue')['inject']
const isDefined: typeof import('@vueuse/core')['isDefined']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
const onLongPress: typeof import('@vueuse/core')['onLongPress']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
const provide: typeof import('vue')['provide']
const reactify: typeof import('@vueuse/core')['reactify']
const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
const reactive: typeof import('vue')['reactive']
const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
const reactivePick: typeof import('@vueuse/core')['reactivePick']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
const refDebounced: typeof import('@vueuse/core')['refDebounced']
const refDefault: typeof import('@vueuse/core')['refDefault']
const refThrottled: typeof import('@vueuse/core')['refThrottled']
const refWithControl: typeof import('@vueuse/core')['refWithControl']
const resolveComponent: typeof import('vue')['resolveComponent']
const resolveRef: typeof import('@vueuse/core')['resolveRef']
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const syncRef: typeof import('@vueuse/core')['syncRef']
const syncRefs: typeof import('@vueuse/core')['syncRefs']
const templateRef: typeof import('@vueuse/core')['templateRef']
const throttledRef: typeof import('@vueuse/core')['throttledRef']
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
const toRaw: typeof import('vue')['toRaw']
const toReactive: typeof import('@vueuse/core')['toReactive']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
const unref: typeof import('vue')['unref']
const unrefElement: typeof import('@vueuse/core')['unrefElement']
const until: typeof import('@vueuse/core')['until']
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
const useArraySome: typeof import('@vueuse/core')['useArraySome']
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
const useAttrs: typeof import('vue')['useAttrs']
const useBase64: typeof import('@vueuse/core')['useBase64']
const useBattery: typeof import('@vueuse/core')['useBattery']
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
const useCached: typeof import('@vueuse/core')['useCached']
const useClipboard: typeof import('@vueuse/core')['useClipboard']
const useCloned: typeof import('@vueuse/core')['useCloned']
const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useCounter: typeof import('@vueuse/core')['useCounter']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVar: typeof import('@vueuse/core')['useCssVar']
const useCssVars: typeof import('vue')['useCssVars']
const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
const useCycleList: typeof import('@vueuse/core')['useCycleList']
const useDark: typeof import('@vueuse/core')['useDark']
const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
const useDebounce: typeof import('@vueuse/core')['useDebounce']
const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
const useDraggable: typeof import('@vueuse/core')['useDraggable']
const useDropZone: typeof import('@vueuse/core')['useDropZone']
const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
const useElementHover: typeof import('@vueuse/core')['useElementHover']
const useElementSize: typeof import('@vueuse/core')['useElementSize']
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
const useEventBus: typeof import('@vueuse/core')['useEventBus']
const useEventListener: typeof import('@vueuse/core')['useEventListener']
const useEventSource: typeof import('@vueuse/core')['useEventSource']
const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
const useFavicon: typeof import('@vueuse/core')['useFavicon']
const useFetch: typeof import('@vueuse/core')['useFetch']
const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
const useFocus: typeof import('@vueuse/core')['useFocus']
const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
const useFps: typeof import('@vueuse/core')['useFps']
const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
const useGamepad: typeof import('@vueuse/core')['useGamepad']
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
const useIdle: typeof import('@vueuse/core')['useIdle']
const useImage: typeof import('@vueuse/core')['useImage']
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
const useInterval: typeof import('@vueuse/core')['useInterval']
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
const useLink: typeof import('vue-router')['useLink']
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
const useMemoize: typeof import('@vueuse/core')['useMemoize']
const useMemory: typeof import('@vueuse/core')['useMemory']
const useMounted: typeof import('@vueuse/core')['useMounted']
const useMouse: typeof import('@vueuse/core')['useMouse']
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
const useNetwork: typeof import('@vueuse/core')['useNetwork']
const useNow: typeof import('@vueuse/core')['useNow']
const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
const useOnline: typeof import('@vueuse/core')['useOnline']
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
const useParallax: typeof import('@vueuse/core')['useParallax']
const usePermission: typeof import('@vueuse/core')['usePermission']
const usePointer: typeof import('@vueuse/core')['usePointer']
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
const usePrevious: typeof import('@vueuse/core')['usePrevious']
const useRafFn: typeof import('@vueuse/core')['useRafFn']
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
const useRoute: typeof import('vue-router')['useRoute']
const useRouter: typeof import('vue-router')['useRouter']
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
const useScroll: typeof import('@vueuse/core')['useScroll']
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
const useShare: typeof import('@vueuse/core')['useShare']
const useSlots: typeof import('vue')['useSlots']
const useSorted: typeof import('@vueuse/core')['useSorted']
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
const useStepper: typeof import('@vueuse/core')['useStepper']
const useStorage: typeof import('@vueuse/core')['useStorage']
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
const useSupported: typeof import('@vueuse/core')['useSupported']
const useSwipe: typeof import('@vueuse/core')['useSwipe']
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
const useThrottle: typeof import('@vueuse/core')['useThrottle']
const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
const useTimeout: typeof import('@vueuse/core')['useTimeout']
const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
const useTitle: typeof import('@vueuse/core')['useTitle']
const useToNumber: typeof import('@vueuse/core')['useToNumber']
const useToString: typeof import('@vueuse/core')['useToString']
const useToggle: typeof import('@vueuse/core')['useToggle']
const useTransition: typeof import('@vueuse/core')['useTransition']
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
const useVModel: typeof import('@vueuse/core')['useVModel']
const useVModels: typeof import('@vueuse/core')['useVModels']
const useVibrate: typeof import('@vueuse/core')['useVibrate']
const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
const watch: typeof import('vue')['watch']
const watchArray: typeof import('@vueuse/core')['watchArray']
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
const watchEffect: typeof import('vue')['watchEffect']
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
const watchOnce: typeof import('@vueuse/core')['watchOnce']
const watchPausable: typeof import('@vueuse/core')['watchPausable']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
const whenever: typeof import('@vueuse/core')['whenever']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue'
}

View File

@ -0,0 +1,464 @@
<!-- C/D数据 -->
<script setup lang="ts">
import {hisYearData,curYearData , useChart3,defineCompont} from "./CdData";
import { treeList } from '@/api/daikin/base'
import HomeHead from '@/views/home/components/HomeHead.vue'
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
import CDSide from './CDSide.vue'
import { NForm, NFormItem, useMessage, NSelect, NButton } from 'naive-ui'
import develop from '../develop.vue'
import type { FormInst } from 'naive-ui'
const { push } = useRouter()
const message = useMessage()
const radioss = ref(2020)
const { chartRef: chartRef1, option: chartOption1 } = curYearData()
const { chartRef: chartRef2, option: chartOption2 ,state} = hisYearData()
const { chartRef: chart1, option: chartOp1 } = useChart3()
const {clickData, toYearData,hisData} = defineCompont()
const treeData = ref<any>()
async function getData() {
const { data} = await treeList()
const dataList = transformData(data);
console.log(dataList)
treeData.value = dataList
}
function transformData(data, parentKey = "") {
let keyIndex = 1;
return data.map(item => {
const key = parentKey ? `${parentKey}-${keyIndex}` : `${item.id}`;
keyIndex++;
const transformedItem = {
label: item.name,
key: key,
level: parentKey ? parentKey.split('-').length + 1 : 1,
id: item.id,
};
const treeList = transformTreeList(item.treeList, key);
if (treeList.length > 0) {
transformedItem.treeList = treeList;
}
return transformedItem;
});
}
function transformTreeList(treeList, parentKey) {
if (!treeList || treeList.length === 0) {
return [];
}
let keyIndex = 1;
return treeList.map(item => {
const key = `${parentKey.split('-').length + 1}-${keyIndex}`;
keyIndex++;
const transformedItem = {
label: item.name,
key: key,
level: parentKey.split('-').length + 1,
id: item.id,
};
const childTreeList = transformTreeList(item.treeList, key);
if (childTreeList.length > 0) {
transformedItem.treeList = childTreeList;
}
return transformedItem;
});
}
let formValue = ref({
name: '',
age: '',
phone: '',
phone1: ''
})
const formRef = ref<FormInst | null>(null);
const handleValidateClick = (e: MouseEvent) => {
e.preventDefault()
formRef.value?.validate((errors) => {
if (!errors) {
// message.success('Valid')
} else {
console.log(errors)
// message.error('Invalid')
}
})
}
let options = [
{
label: "据点总体",
value: 'song0'
},
{
label: 'DIS',
value: 'song1'
},
]
const checkedValueRef = ref<string | null>(null)
const handleChange = (e: Event) => {
state.cateId= 1
state.yearTime=e
console.log(e)
}
// 获取子组件传过来的值
const handleChild = (id: any) => {
// console.log(data)
clickData.id = id
}
getData()
</script>
<template>
<!-- <develop/> -->
<HomeHead class="top">
</HomeHead>
<div class="h-full relative flex flex-col">
<div class="font-600 text-36px mt29px ">C/D数据</div>
<div class="q-wrapper flex-1 h957.9px mt30px text-#142142 flex flex-col gap-22px bg-#fff">
<div class="data1 flex gap-26px">
<div class="cd_plan flex-1 pl32px pr33px pt25px pb10px">
<div class="title ml19px font-bold text-24px">FY23 中国域各据点 C/D进度</div>
<div class="text-20px mt21px mb17px font-600">发注金额:</div>
<div class="">
<table style="border: 1px solid #EDEDED;"
class="w-full text-center h295px border-spacing-0 text-16px fazhu">
<thead style="background-color: #417BEF;color: #fff;">
<tr class="h41px">
<th rowspan="2" colspan="2">据点</th>
<th colspan="2">据点</th>
<th colspan="2">苏州</th>
<th colspan="2">惠州</th>
</tr>
<tr class="h41px">
<th>FY23</th>
<th>FY22</th>
<th>FY23</th>
<th>FY22</th>
<th>FY23</th>
<th>FY22</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2" class="text-#142142">合计</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
</tr>
<tr>
<td rowspan="2" class="text-#142142">C/D</td>
<td class="text-#142142">交涉</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
</tr>
<tr>
<td class="text-#142142">THEME</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
</tr>
<tr>
<td colspan="2" class="text-#142142">市况</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
</tr>
<tr>
<td colspan="2" class="text-#142142">汇率</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
<td>55.40%</td>
</tr>
</tbody>
</table>
</div>
<div class="flex h55px ">
<n-form ref="formRef" inline :label-width="55" :model="formValue" class="!items-center">
<n-form-item path="name">
<n-select style="width: 148px;" v-model:value="formValue.name" placeholder="请选择"
:options="options" />
</n-form-item>
<n-form-item path="age">
<n-select style="width: 148px;" v-model:value="formValue.age" placeholder="请选择"
:options="options" />
</n-form-item>
<n-form-item path="phone">
<n-select style="width: 148px;" v-model:value="formValue.phone" placeholder="请选择"
:options="options" />
</n-form-item>
<n-form-item path="phone">
<n-select style="width: 148px;" v-model:value="formValue.phone1" placeholder="请选择"
:options="options" />
</n-form-item>
<n-form-item>
<n-button style="background-color: #417BEF;color: #fff;" attr-type="button"
@click="handleValidateClick">
检索
</n-button>
</n-form-item>
</n-form>
</div>
</div>
<div class="amount flex-1 pl32px pr33px pt27px pb0px">
<div class="flex gap-49px">
<div class="flex-1">
<div class="title ml19px font-bold text-24px">发注金额推移</div>
<div class="w330px h199px mt22px">
<img src="./images/fazhuje.png" alt="">
</div>
</div>
<div class="flex-1">
<div class="title ml19px font-bold text-24px">CD堆积</div>
<div class="w330px h199px mt22px">
<img src="./images/cddj.png" alt="">
</div>
</div>
<div class="flex-1">
<div class="title ml19px font-bold text-24px">发注金额推移</div>
<div class="w100% h199px mt22px">
<VChart ref="chart1" :option="chartOp1" autoresize />
</div>
<div class="title ml19px font-bold text-24px !absolute top-0 left-50%">CD堆积</div>
</div>
</div>
<div class="h152px mt20px" style="border: 1px solid #D3D3D3;">
<div class="mt13px ml17px text-16px font-bold">年度重点</div>
<div class="h112px ml17px mt10px mr15px text-14px lh-22px overflow-y-auto">
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点The
年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重点Theme年度重</div>
</div>
</div>
</div>
<div class="data2 flex flex-col">
<div class="flex min-h280px">
<div class="w148px">
<div class="title ml19px font-bold text-24px">按业绩</div>
<div class="max-h-236px overflow-y-auto mt100px">
<CDSide :treeData="treeData" @clickChliden="handleChild"></CDSide>
</div>
</div>
<div class="ml24px w485px">
<div class="ml19px font-bold text-24px">当年度</div>
<table class="dangnian w485px text-center mt23px text-18px border-spacing-0 overflow-auto min-h-100px">
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
<tr class="h41px">
<th colspan="4">FY2023</th>
</tr>
<tr class="h35px">
<th>供方</th>
<th>发注金额</th>
<th>交涉</th>
<th>Theme</th>
</tr>
</thead>
<tbody>
<tr v-for="i in toYearData" key="i" class="!h35px text-16px">
<td>{{ i.supplierName }}</td>
<td>{{ i.publishAmount }}</td>
<td>{{ i.negAmount }}</td>
<td>{{ i.themeRate }}%</td>
</tr>
</tbody>
</table>
</div>
<div class="ml89px flex-1">
<div class="title ml19px font-bold text-24px">历史数据</div>
<div class="flex">
<table class="history w-full text-center mt23px text-18px border-spacing-0 overflow-auto">
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
<tr class="h41px">
<th colspan="3">FY2023</th>
</tr>
<tr class="h41px">
<th>发注</th>
<th>交涉</th>
<th>Theme</th>
</tr>
</thead>
<tbody>
<tr v-for="i in hisData['2023']" key="i" class="!h35px text-16px">
<td>{{ i.publishAmount }}</td>
<td>{{ i.negAmount }}</td>
<td>{{ i.themeRate }}%</td>
</tr>
</tbody>
</table>
<table class="history w-full text-center mt23px text-18px border-spacing-0 overflow-auto">
<thead style="background-color: #417BEF;color: #fff;height: 42px;">
<tr class="h41px">
<th colspan="3">FY2022</th>
</tr>
<tr class="h41px">
<th>发注</th>
<th>交涉</th>
<th>Theme</th>
</tr>
</thead>
<tbody>
<tr v-for="i in hisData['2022']" key="i" class="!h35px text-16px">
<td>{{ i.publishAmount }}</td>
<td>{{ i.negAmount }}</td>
<td>{{ i.themeRate }}%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="flex gap-101px mt29px">
<div class="w634px h243px">
<VChart ref="chartRef1" :option="chartOption1" autoresize />
</div>
<div class="w634px h243px ">
<VChart ref="chartRef2" :option="chartOption2" autoresize/>
<div class=" w634px pl30px h30px">
<el-radio-group v-model="radioss" @change="handleChange">
<el-radio :label="2020">FY2020</el-radio>
<el-radio :label="2021"> FY2021</el-radio>
<el-radio :label="2022">FY2022</el-radio>
</el-radio-group>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="absolute flex flex-col w-full h-full z-200 top-0 left-0 text-center bg-red justify-center items-center" style="background-color: rgba(255,255,255,0.8);">
<img src="@/assets/images/chah.png"/>
<br>
<div class="text-#5683DB text-36px">【做成中,敬请期待】</div>
</div>
</template>
<style scoped lang="less">
.top {
position: absolute;
right: 30px;
top: -92px;
}
.fazhu {
td {
border: 1px solid #E0E0E0;
color: #808696;
}
}
.dangnian {
td {
border: 1px solid #E0E0E0;
color: #808696;
}
}
.history {
td {
border: 1px solid #E0E0E0;
color: #808696;
}
}
.menu {
position: absolute;
background: #fff;
border: 1px solid #333;
}
.menu li {
list-style: none;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
::-webkit-scrollbar {
width: 1px;
}
.q-wrapper {
overflow-y: scroll;
border-radius: 20px;
.cd_plan,
.amount,
.data2 {
border: 1px solid #E7EBF5;
border-radius: 18px;
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
}
.data2 {
// height: 600.9px;
padding: 28px;
}
.title {
position: relative;
&::before {
content: '';
width: 8px;
height: 30px;
background-color: #003AB5;
position: absolute;
left: -15px;
top: -3px;
}
}
}
</style>

View File

@ -0,0 +1 @@
.page[data-v-ddb16f2e]{font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-image:none;background-color:#cacaca;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#3b3b3b;line-height:1}.download[data-v-ddb16f2e]{cursor:pointer}.download[data-v-ddb16f2e]:hover{color:#00e4ff}.nav[data-v-ddb16f2e]:before{top:-48px}.nav .child[data-v-ddb16f2e]:hover,.nav .childs[data-v-ddb16f2e]:hover{text-decoration:underline}.nav[data-v-ddb16f2e]:after{bottom:-49px;transform:rotate(-90deg)}.nav.active[data-v-ddb16f2e]{color:#002fa7;background-color:#e6ecff}.nav.active a[data-v-ddb16f2e]{color:#002fa7}.nav.active[data-v-ddb16f2e]:before,.nav.active[data-v-ddb16f2e]:after{opacity:1}.nav.actives[data-v-ddb16f2e]{padding:0!important;color:#002fa7;background-color:#f5f8ff}.nav.actives a[data-v-ddb16f2e]{color:#002fa7}.nav.actives[data-v-ddb16f2e]:before,.nav.actives[data-v-ddb16f2e]:after{opacity:1}.nav.actives .onActive[data-v-ddb16f2e]{background-color:#e6ecff;border-radius:32px 0 0 32px;padding:24px 36px}.main[data-v-ddb16f2e]{width:100%;height:95%;background-color:#4877fb}[data-v-ddb16f2e]::-webkit-scrollbar{display:none;scrollbar-width:none}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,7 @@
import { WEEK_ENUM_CN } from '@/utils/enums'
export function useDate() {
const day = useDateFormat(useNow(), 'YYYY年MM月DD日')
const week: any = useDateFormat(useNow(), 'd')
return { day, week: `星期${WEEK_ENUM_CN[unref(week)]}` }
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.3.1 -->
<svg width="246" height="26" viewBox="0 0 246 26" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<image id="WHATS-NEWS-" x="0" y="0" width="246" height="26" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAPYAAAAaCAYAAACElKExAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAA9qADAAQAAAABAAAAGgAAAAAQuEK9AAANI0lEQVR4Ae1cUXIbuRHFjJVd5yvMX+JNVcafTirZ8V7A1AlWPoHkE1i+gEX7ArZPYPoEqz2Bqf8kO94k5c/QVbvO/oWfiWNz8t4MQAGNxnAoDymnSqiiBmh0N4BGN9DowSgzV+mTlMBvyslYdmzPmGpeTRYSflW+koCUAHTlKn1qEqBRL032Uvbrvan3AZtJ+FX5SgJSAnu/KicFrLuQFSz/UE1mGnwTWBd/twMV5WT03phS4+twtLovykmZGTOSdbUxix+rSSXhstzVrsNFv+Y/VZO5K2tPbXfV8FKwvv1dNx+UB3gVxmSBLGuTLa6ZZdUly1TfCP+uLEfX994HPFX893vzW1U19+v+Xv6+zPeyaI6MwH1dloXZe1/4tH3zt/70txlxP1Yf1rWX4k+61Nw4HftgcuhqLeRQV9DfeZeukv6dMWM3p+Dxi2XDyyyMqV+1fa6rz7Dg+97cXm6yo6UxJy1C+BcKu5/qcIiZLl0z5j52n2Mdo/4l4TRqbYdq69K7FAb4BAMdE89PUOQZyvs+TMv/x+RHoH+i1TkY5HOK/F1X1p6pvmu4Gkz21yqBRK0kgOV24hv5HrZGHWNhjAZ9NFAQc6OcTN9Wk3sxVhrSGPUy9iAkRZZ/iGSVZ/kTND6WuCZfPgJssoLnyyOzzFQ9XOGkM7APg2Z0fbBkDU6axfoazNNzyLhUMDk3t31463Xl99+Z+oBwzkGcWuiN8tECuX3NwNsNL/vG0aIPPq+GN7ljbhfg8+xtdTIhLgy7nmHSVYHWJi+I5KcvysdHtakLH+by5CUXgnZ10QZ1+edFCPPQ9T39rA9oPP5qmMYdpgb9GklOgM0kzBr1S8BLWZcqa3Oawt0Ujlk+4O5+u6oWm9IOgQ8ZnYHPWONFz1F6XjCEiYZL2NLUU4kPsCpnOTe0EdA/x46aYi/hI6w60ZxLpDVl0p9gTIbGvUf3jCu5ljQDBuwEuIWGDyP+EvCZX4dB9xKGT7OLvHVb1b7J9v9r8gPAphK+rTJW5TuQm2T/QgLgcXyTkq/E3VX5ev5hp7IKx1VX3L20BD0vAJ+7Oho68tRlNWUmX6Diqau0+uKKwRMzdeYA7U5No760xDFNcrsTzbVuUMF8OHcIlAsfFuZDI7bCI42Scns+UKp2Azrs2wwWs/t9cYfAU4w1OodRgYA3HqK9IXlkxnw9JL9NeOFIWaXw4ZWO/bo8sfs6nMwsuUl5KS+9QpD128UxioZ1qYm6gYWMKYNAYvcailM01fZPKsDl4QT4XCUxaDV9MMuZWrEjIBatgw2aKjVXbgP63qh2ZxgJgheibKSiinrOJ37ZG/y+rOHm2bksBN7gRbR1ae44XWeeVzEoKT+A6t+Gg83KsByW5JFF814tRRBc7VhsF9A5BMvqM/yaABjpO/Ab9pAnxsM4jwuU2VbbBVQdA2xu1Bg2iNGYOViRnGeK8yzPHeGq59e5PFcLd87uwF8o5xfHYutPBJA41kJpqIIQ5xBiJAsGGYE/wS9KiC3sSyDG/gSwUsLBe4rd4oUPh9IsXBnHGe7Ersjn4jNTP/UBzCfcddZ0Bse4cEheQ5cHd8fzWL7pPjNwGs9fbKjqcWfFVhpcWt7cFNvUuuGuFD5x5r79U3UyD6FtiZsGotorHfBxbEAtCt5iHk/Rp+98XJfHMaI1bL4KgSI6ePD0DRVKD/ckULoAl4VQgCn8Jmod0e4Q8LXWFgT1Ai7YHOM8UOoPAZsocPVVx6/Lx4x0KujZmx+qk5lS0YAwC3f8OvCYbhK4A72qII6nFnl1dUM90QfKdzoUP/c6qx+/ZmeL5k8aKsrlOn6+l5bCxwyfrePD+usd8zL0JkcdbnZs7rCMpmkpNNT1wghdltCVP+cfuRXnVSIHt+IQfRsLsC2m+OvYhNpI8pGGgZdCp59jAhLBxIK73bYNIzfLZ+gbf03CBFUu3+eJxekY/eQy/a3znPrQXRQny7KqrkO9gLJfmjve9ZbHGSqfGO9o3Zghe+LNW53R8bkpruPD+ne4cIRo+TMeQYcwZMj4fqpd3r1oDNsisIOlRHaGagdXyHpZpsviwSJ+rKPwPZw12cYFXoPTv7qNcEMscaqcwG+Uj091d64R5r2YdDhIX2PEDnKGVsdayzRujPC4PW9mswxG/mP1cKrhfixsWRt4ObHeDOmOv/7qD+qEtX3PHt36y/cTNw4uhImF2ThDxVFI1UvHwz3tUXLWFVvy56trgwRPXB6qn+NIh7sEj3jWnn3AAu50zrXZ54mj5HN4lUcaLuYeC8fJHGN0icGWODlDTQxuISmcy9J1lvOFIem3XaYHoLWBcb5wcBqCy4dP1UUPUXZU6rk4jrhAUaGgTP/C8eB46O5lebNjzSVfyFA97ki8octdb3nOYz5q4CzS5fboaQwvDGn9pBFJuAaTOCjDyLNjGPk/MCcvrQehoMUgzOMkZdTAXnxuls15fGXYcLlfxWzAwkbGz4USYK1cRg86al+L6cIAXuXh7jRLAWI8Y61RuuEO/jMv72D2ObKBNwHefbFdHJtbcX0bZ2T8Sbva9yXphwcljfQAW2zjjvfjMDTWeUAr5NxGxtHfOyG8KUVjwKJYsCZ+9dXgw/OM3XDAHrS1/f5SH2Hg33VthI5Ta1fJd++4VlrfdPGYlWF3nBWKljEDYWHi7RxAopWOu7tz4UOKZqGYSdiuyjayrTW3csNZ2QonZTS5uuNrTLcNe1s9vAvFeLpZO9kRA6Kb0XRjZ8t8tSj6mNYd90E7yusxHBcvgsxK0ZE5YNoYGjxHJ2gYGj2TMMZgwOs24HNZ11Ee8TpsR31TZS9KKWj1FEa974yaCCvD7nKPW0WIdjr7yip2R+i6JFZFNvlK6dmuQCmjHNEl8n9YreXk2z62V0x31eF17UCRHmCBvQl5P8Bvtg6f9anjSB9aDYcffjCIJusuyx1PHVNgcGO7M47CvmaVDYouQrj7sCTS/QYNcozGzArywrXOm9Chu/hNAZrj15nYt3UuubZZcs559983ajbkB89YZkdLZvxk3fCRD8PeO2vL8euF1nXJirY+/LvpxRRMUvJDFBoiBRK2oJc4oVhhC73W0EVP1UUku75iGnVAAGwA5inAT22Qc4xd5n5KNqkdSLDdqIjI+DMQPPeJIO+DLG+i5j74AvnsUZIojy86dQXQYAgHkhf6eUYY6rjbjv16Dd/WBxdTfBqXh8GdIs9f8+WZ5cVo9ogwmVxwT8K7yuhv03eJIwy7ua1USiSU2RmRWneHqyMM/ySsbISndf7SLqZg8pQxhL3uW8LKSV7Tvvi7xLMrN5XptCt6OnSf/r28dgrX+7nkK1+Fyfo+ZT/q3QefMkCQaQ7cQsGP9MAdQ62RjAVNhN/Wxx6KoAuK1iOosCtPGTQLKnsW7Jdbkz7oK1ecyFjJU25yZKTO3eHqqDQU4bc4bpdXKLYOilfqj2iyuWL6EfQ7IuWV0t0kftGV2d1pNy2uayVpeJFunh9D1TdDET5bxkah7pTrenWR11uSJ132dcG2YMdGRG8Gd0HyUcvOoNesjoJWD2oIpMGLNpKtTtBFG7vWegAPLkr/sXQ4hhzbI88bt8g6BXXuONo4/Nh2NqGHsn8L/INNaPrgvv7qj5NOvGU+lf/ggYYHTe7Tl8rx5pk52OlchfJ0u7xfRbnbL+7QdjbnDTBeFnHGbI2R381fKPkeGHnAK8ECk83+WT3clwwDw6a7QOQeSfzvLV44yY7W0TkFXIc3fD0j2ao4MZF1p3Hyax157mL/7Hmpk3b4cZxzRJ+wULUyd0chN3epCxqOmgrn8kM+6Y7/PP/wBJJG34ZMzafCaYZ772eonPsINDzIxQepechx5ipogB0uvENrnm4R9YF2kxsDNsZxjTpiuFC4eVE10GPARcArBtl2sY5tjLrJBcO6+iuawLAJ5QqgKfKKosmELgtdeNCEKEpJE4aCNiioFUj8UQAbwVhfdN3bJg6uARYY2Zh5kYrwHr2o/YSLULezbXSP7jhuiZ2C99E2+G/Ck7rmDKqbTh4/6cJ3B1JpI908L1S72tk16sQFsQYVy1e0kHJBCZL20j1AQEGexTW3RNKgDIHtPvHfH6Va9S+lpHC6ovhw3Q5TdJ8wHK92tnO9lGOus9StvUuRSA+dk5dM1h8X+9jI5qPt9hw35RcZdp/3zDyL+w312Yl9l8en3XYe7aaML7iUkuqHPR8lFGTQgFyqC0PCeTtpf0iGktfv/vzXU+wgCwm/nHLoWSp9WEgXts9xER7cmcLrwiCcx+/ZV2NJHi6mpSGgP5G8FcOWK1jMSgrDYiSU39FLl8fBt/e0L/xLrQW64Rpcg3Xgjvj/rTSa7cMapV0jc9eLDMZG5Tm5bV+HuYptPafbYrwJX+lZSlrMayS/LgNy9AyyuXz8bG4sLmJ4BJlj03nKy0V9PKh23prLLgEjHgs0e8TiepX+3yXABQwKWchxcCXXJl3iXZW3I4HU1V0uHhddYBkzcuftLj7/A54WDMYEGWElAAAAAElFTkSuQmCC"/>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 MiB

View File

@ -0,0 +1,11 @@
const svgModules: any = import.meta.glob('./*', { eager: true })
export function getImg(name: string) {
const svgs = Object.keys(svgModules).reduce((p, c) => {
const key: string = String(c).split('/').pop() || 'default'
p[key] = svgModules[c].default
return p
}, {} as any)
return svgs[name]
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@ -0,0 +1,191 @@
import { decodedMappings, traceSegment, TraceMap } from '@jridgewell/trace-mapping';
import { GenMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap } from '@jridgewell/gen-mapping';
const SOURCELESS_MAPPING = /* #__PURE__ */ SegmentObject('', -1, -1, '', null);
const EMPTY_SOURCES = [];
function SegmentObject(source, line, column, name, content) {
return { source, line, column, name, content };
}
function Source(map, sources, source, content) {
return {
map,
sources,
source,
content,
};
}
/**
* MapSource represents a single sourcemap, with the ability to trace mappings into its child nodes
* (which may themselves be SourceMapTrees).
*/
function MapSource(map, sources) {
return Source(map, sources, '', null);
}
/**
* A "leaf" node in the sourcemap tree, representing an original, unmodified source file. Recursive
* segment tracing ends at the `OriginalSource`.
*/
function OriginalSource(source, content) {
return Source(null, EMPTY_SOURCES, source, content);
}
/**
* traceMappings is only called on the root level SourceMapTree, and begins the process of
* resolving each mapping in terms of the original source files.
*/
function traceMappings(tree) {
// TODO: Eventually support sourceRoot, which has to be removed because the sources are already
// fully resolved. We'll need to make sources relative to the sourceRoot before adding them.
const gen = new GenMapping({ file: tree.map.file });
const { sources: rootSources, map } = tree;
const rootNames = map.names;
const rootMappings = decodedMappings(map);
for (let i = 0; i < rootMappings.length; i++) {
const segments = rootMappings[i];
for (let j = 0; j < segments.length; j++) {
const segment = segments[j];
const genCol = segment[0];
let traced = SOURCELESS_MAPPING;
// 1-length segments only move the current generated column, there's no source information
// to gather from it.
if (segment.length !== 1) {
const source = rootSources[segment[1]];
traced = originalPositionFor(source, segment[2], segment[3], segment.length === 5 ? rootNames[segment[4]] : '');
// If the trace is invalid, then the trace ran into a sourcemap that doesn't contain a
// respective segment into an original source.
if (traced == null)
continue;
}
const { column, line, name, content, source } = traced;
maybeAddSegment(gen, i, genCol, source, line, column, name);
if (source && content != null)
setSourceContent(gen, source, content);
}
}
return gen;
}
/**
* originalPositionFor is only called on children SourceMapTrees. It recurses down into its own
* child SourceMapTrees, until we find the original source map.
*/
function originalPositionFor(source, line, column, name) {
if (!source.map) {
return SegmentObject(source.source, line, column, name, source.content);
}
const segment = traceSegment(source.map, line, column);
// If we couldn't find a segment, then this doesn't exist in the sourcemap.
if (segment == null)
return null;
// 1-length segments only move the current generated column, there's no source information
// to gather from it.
if (segment.length === 1)
return SOURCELESS_MAPPING;
return originalPositionFor(source.sources[segment[1]], segment[2], segment[3], segment.length === 5 ? source.map.names[segment[4]] : name);
}
function asArray(value) {
if (Array.isArray(value))
return value;
return [value];
}
/**
* Recursively builds a tree structure out of sourcemap files, with each node
* being either an `OriginalSource` "leaf" or a `SourceMapTree` composed of
* `OriginalSource`s and `SourceMapTree`s.
*
* Every sourcemap is composed of a collection of source files and mappings
* into locations of those source files. When we generate a `SourceMapTree` for
* the sourcemap, we attempt to load each source file's own sourcemap. If it
* does not have an associated sourcemap, it is considered an original,
* unmodified source file.
*/
function buildSourceMapTree(input, loader) {
const maps = asArray(input).map((m) => new TraceMap(m, ''));
const map = maps.pop();
for (let i = 0; i < maps.length; i++) {
if (maps[i].sources.length > 1) {
throw new Error(`Transformation map ${i} must have exactly one source file.\n` +
'Did you specify these with the most recent transformation maps first?');
}
}
let tree = build(map, loader, '', 0);
for (let i = maps.length - 1; i >= 0; i--) {
tree = MapSource(maps[i], [tree]);
}
return tree;
}
function build(map, loader, importer, importerDepth) {
const { resolvedSources, sourcesContent } = map;
const depth = importerDepth + 1;
const children = resolvedSources.map((sourceFile, i) => {
// The loading context gives the loader more information about why this file is being loaded
// (eg, from which importer). It also allows the loader to override the location of the loaded
// sourcemap/original source, or to override the content in the sourcesContent field if it's
// an unmodified source file.
const ctx = {
importer,
depth,
source: sourceFile || '',
content: undefined,
};
// Use the provided loader callback to retrieve the file's sourcemap.
// TODO: We should eventually support async loading of sourcemap files.
const sourceMap = loader(ctx.source, ctx);
const { source, content } = ctx;
// If there is a sourcemap, then we need to recurse into it to load its source files.
if (sourceMap)
return build(new TraceMap(sourceMap, source), loader, source, depth);
// Else, it's an an unmodified source file.
// The contents of this unmodified source file can be overridden via the loader context,
// allowing it to be explicitly null or a string. If it remains undefined, we fall back to
// the importing sourcemap's `sourcesContent` field.
const sourceContent = content !== undefined ? content : sourcesContent ? sourcesContent[i] : null;
return OriginalSource(source, sourceContent);
});
return MapSource(map, children);
}
/**
* A SourceMap v3 compatible sourcemap, which only includes fields that were
* provided to it.
*/
class SourceMap {
constructor(map, options) {
const out = options.decodedMappings ? toDecodedMap(map) : toEncodedMap(map);
this.version = out.version; // SourceMap spec says this should be first.
this.file = out.file;
this.mappings = out.mappings;
this.names = out.names;
this.sourceRoot = out.sourceRoot;
this.sources = out.sources;
if (!options.excludeContent) {
this.sourcesContent = out.sourcesContent;
}
}
toString() {
return JSON.stringify(this);
}
}
/**
* Traces through all the mappings in the root sourcemap, through the sources
* (and their sourcemaps), all the way back to the original source location.
*
* `loader` will be called every time we encounter a source file. If it returns
* a sourcemap, we will recurse into that sourcemap to continue the trace. If
* it returns a falsey value, that source file is treated as an original,
* unmodified source file.
*
* Pass `excludeContent` to exclude any self-containing source file content
* from the output sourcemap.
*
* Pass `decodedMappings` to receive a SourceMap with decoded (instead of
* VLQ encoded) mappings.
*/
function remapping(input, loader, options) {
const opts = typeof options === 'object' ? options : { excludeContent: !!options, decodedMappings: false };
const tree = buildSourceMapTree(input, loader);
return new SourceMap(traceMappings(tree), opts);
}
export { remapping as default };
//# sourceMappingURL=remapping.mjs.map

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,601 @@
<script setup lang="ts">
import AppBlock from '@/components/AppBlock.vue'
import HomeHead from '@/views/home/components/HomeHead.vue'
import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
import { useMessage, NModal, NSelect } from 'naive-ui'
import { useUserStore } from '@/stores/modules/user'
import UserList from '@/views/home/intelligence/process/UserPages.vue'
import zhCn from 'element-plus/dist/locale/zh-cn'
import { computed, ref } from 'vue'
import { getHomeList, statDel, getTreeList,statEdit,updateAmount,amountList } from '@/api/daikin/base'
const locale = computed(() => zhCn)
const message = useMessage()
const store = useUserStore()
const header = { 'token': store.user.token }
const dataA = ref([])
const dataB = ref([])
const dataC = ref([])
const editA = ref()
const editB = ref()
const editC = ref()
const shomkA = ref(false)
const shomkB = ref(false)
const shomkC = ref(false)
async function getDataA() {
const {data: dataArr} = await getTreeList({number: 'DIS'})
dataA.value = dataArr.map(item => {
if (item.childList) {
item.childList = item.childList.map(it => {
it.second = true;
return it;
})
}
return item;
})
}
async function getDataB() {
const {data: dataBrr} = await getTreeList({number: 'DSZ'})
dataB.value = dataBrr.map(item => {
if (item.childList) {
item.childList = item.childList.map(it => {
it.second = true;
return it;
})
}
return item;
})
}
async function getDataC() {
const {data: dataCrr} = await getTreeList({number: 'DISH'})
dataC.value = dataCrr.map(item => {
if (item.childList) {
item.childList = item.childList.map(it => {
it.second = true;
return it;
})
}
return item;
})
}
const dataDIS = ref()
const dataDSZ = ref()
const dataDISH = ref()
onMounted(async () => {
getDataA();
getDataB();
getDataC();
getFazhu()
})
const getFazhu=async ()=>{
const { data:fazhu} = await amountList()
fazhu.forEach((i: { number: string; amount: any }) => {
if(i.number=='DIS'){
dataDIS.value = i.amount
}
if(i.number=='DSZ'){
dataDSZ.value = i.amount
}
if(i.number=='DISH'){
dataDISH.value = i.amount
}
});
}
function computedName(title) {
let index = title.indexOf(".");
if (index > -1) {
return title.slice(0, index - 1);
}
return title;
}
async function onSubmitA(row) {
var { code, msg } = await statEdit({
number: "DIS",
...row
})
if (code === 200) { message.success("修改成功!") }
else { message.error(msg) }
shomkA.value = false
getDataA();
}
async function onSubmitB(row) {
var { code, msg } = await statEdit({
number: "Cu",
...row
})
if (code === 200) { message.success("修改成功!") }
else { message.error(msg) }
shomkB.value = false
getDataB();
}
async function onSubmitC(row) {
var { code, msg } = await statEdit({
number: "Al",
...row
})
if (code === 200) { message.success("修改成功!") }
else { message.error(msg) }
shomkC.value = false
getDataC()
}
const handleEditA = (type: string, row: any) => {
editA.value = {
type: type,
number: "DIS",
id: "",
pid: undefined,
stDate: undefined,
themeValue: undefined,
marketValue: undefined,
weitiValue: undefined,
}
shomkA.value = true
if (!row) return
if (type === "edit") {
for (let key in row) {
editA.value[key] = row[key];
}
}
else {
editA.value.pid = row.id;
}
if (type === "edit") {
if (row.stDate.length === 4) editA.value.type = "addYear";
else editA.value.type = "add";
}
}
const handleEditB = (type: string, row: any) => {
editB.value = {
type: type,
number: "DSZ",
id: "",
pid: undefined,
stDate: undefined,
themeValue: undefined,
marketValue: undefined,
weitiValue: undefined,
}
shomkB.value = true
if (!row) return
if (type === "edit") {
for (let key in row) {
editB.value[key] = row[key];
}
}
else {
editB.value.pid = row.id;
}
if (type === "edit") {
if (row.stDate.length === 4) editB.value.type = "addYear";
else editB.value.type = "add";
}
}
const handleEditC = (type: string, row: any) => {
editC.value = {
type: type,
number: "DISH",
id: "",
pid: undefined,
stDate: undefined,
themeValue: undefined,
marketValue: undefined,
weitiValue: undefined,
}
shomkC.value = true
if (!row) return
if (type === "edit") {
for (let key in row) {
editC.value[key] = row[key];
}
}
else {
editC.value.pid = row.id;
}
if (type === "edit") {
if (row.stDate.length === 4) editC.value.type = "addYear";
else editC.value.type = "add";
}
}
async function handleDeleteA(index: number, row: any) {
const { id } = row
if (!id) return
const { code, msg } = await statDel({ id })
if (code === 200) { message.success("删除成功!") }
else { message.error(msg) }
getDataA();
}
async function handleDeleteB(index: number, row: any) {
const { id } = row
if (!id) return
const { code, msg } = await statDel({ id })
if (code === 200) { message.success("删除成功!") }
else { message.error(msg) }
getDataB();
}
async function handleDeleteC(index: number, row: any) {
const { id } = row
if (!id) return
const { code, msg } = await statDel({ id })
if (code === 200) { message.success("删除成功!") }
else { message.error(msg) }
getDataC()
}
const activeName = ref("DIS")
const userList = ref()
const showModal = ref(false)
const flg = ref()
const setUserList =ref()
async function getUser(moduleId: any) {
showModal.value = !showModal.value
flg.value = moduleId
const {data: userArr} = await getBPCUser({moduleId})
setUserList.value = userArr
}
// 获取子组件传过来的值
const handleChild = (data: any) => {
console.log(data, 444);
const { showModal: show, multipleSelection } = data
showModal.value = unref(show)
// userList.value = multipleSelection
let userIdList: any[] =[]
multipleSelection.value.forEach((i: { userId: any })=>{
// console.log(dataList.value)
userIdList.push(i.userId)
})
BPCSaveUser({
moduleId: flg.value,
userIdList: userIdList
})
}
const CloseThiss = (data: boolean)=>{
showModal.value = data
}
const shomkD =ref(false)
const fazhus = ref()
const numbers = ref()
const fazhu= (str: any,number: any ) =>{
numbers.value = str
fazhus.value = number
shomkD.value = true
}
const submitFazhu=async()=>{
const number = numbers.value
const amount = fazhus.value
console.log(typeof(number),typeof(amount))
const {code,msg} = await updateAmount({number,amount})
if (code === 200) {
shomkD.value = false
message.success("修改成功")
getFazhu()
}
else message.warning(msg)
}
</script>
<template>
<HomeHead class="top">
<template #content>
<!-- <HomeHeadSearch /> -->
</template>
</HomeHead>
<AppBlock class="w-full h950px p30px text-#000">
<div class="font-600 flex items-center">
<!-- <img src="./images/logo.svg" class="h56px mr21px" /> -->
<div class="text-36px text-#000">数据平台管理</div>
</div>
<el-tabs type="card" v-model="activeName" class="demo-tabs mt30px text-20px" @tab-click="handleClick">
<el-tab-pane name="DIS">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">DIS</span>
</span>
</template>
<div class=" cont relative w100% h800px overflow-y-auto">
<el-button type="primary" @click="handleEditA('addYear')" class="my20px">新增</el-button>
<span class="text-18px ml-20px"> 发注金额:{{dataDIS||0}} 百万元</span>
<el-button type="primary" @click="fazhu('DIS',dataDIS)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
<!-- <el-button type="primary" @click="getUser(1)" > 查看范围</el-button> -->
<el-table :data="dataA" style="width: 95%"
row-key="id"
border
:tree-props="{ children: 'childList' }"
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
:cell-style="{ 'text-align': 'center'}">
<el-table-column label="时间" prop="stDate" />
<el-table-column label="C/D-交涉(%)" prop="negValue" />
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
<el-table-column label="市况(%)" prop="marketValue" />
<el-table-column label="为替(%)" prop="weitiValue" />
<el-table-column label="操作" width="260px">
<template #default="scope">
<el-button size="small" type="primary" @click="handleEditA('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
<el-button size="small" @click="handleEditA('edit', scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteA(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane name="DSZ">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">DSZ</span>
</span>
</template>
<div>
<el-button type="primary" @click="handleEditB('addYear')" class="my20px">新增</el-button>
<span class="text-18px ml-20px"> 发注金额:{{dataDSZ||0}} 百万元</span>
<el-button type="primary" @click="fazhu('DSZ',dataDSZ)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
<!-- <el-button type="primary" @click="getUser(2)" > 查看范围</el-button> -->
<el-table :data="dataB" style="width: 95%"
row-key="id"
border
:tree-props="{ children: 'childList' }"
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
:cell-style="{ 'text-align': 'center'}">
<el-table-column label="时间" prop="stDate" />
<el-table-column label="C/D-交涉(%)" prop="negValue" />
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
<el-table-column label="市况(%)" prop="marketValue" />
<el-table-column label="为替(%)" prop="weitiValue" />
<el-table-column label="操作" width="260px">
<template #default="scope">
<el-button size="small" type="primary" @click="handleEditB('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
<el-button size="small" @click="handleEditB('edit', scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteB(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane name="DISH">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">DISH</span>
</span>
</template>
<div>
<el-button type="primary" @click="handleEditC('addYear')" class="my20px">新增</el-button>
<span class="text-18px ml-20px"> 发注金额:{{dataDISH||0}} 百万元</span>
<el-button type="primary" @click="fazhu('DISH',dataDISH)" class="my20px ml-10px">{{activeName}}发注金额修改</el-button>
<!-- <el-button type="primary" @click="getUser(3)" > 查看范围</el-button> -->
<el-table :data="dataC" style="width: 95%"
row-key="id"
border
:tree-props="{ children: 'childList' }"
:header-cell-style="{ background:'#2A7BF7',color:'#fff',height:'60px',textAlign: 'center','font-size':'24px'}"
:cell-style="{ 'text-align': 'center'}">
<el-table-column label="时间" prop="stDate" />
<el-table-column label="C/D-交涉(%)" prop="negValue" />
<el-table-column label="C/D-THEME(%)" prop="themeValue" />
<el-table-column label="市况(%)" prop="marketValue" />
<el-table-column label="为替(%)" prop="weitiValue" />
<el-table-column label="操作" width="260px">
<template #default="scope">
<el-button size="small" type="primary" @click="handleEditC('add', scope.row)" v-if="!scope.row.second">新增数据</el-button>
<el-button size="small" @click="handleEditC('edit', scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteC(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
</el-tabs>
<el-form-item>
</el-form-item>
</AppBlock>
<n-modal v-model:show="shomkA">
<div class="bg-#FFF p30px">
<el-form :model="editA" label-width="120px" :inline="true">
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
<template #append>%</template>
</el-input> -->
<el-form-item :label="editA.type === 'add' ? '月份' : '年份'" >
<el-config-provider :locale="locale">
<el-date-picker
v-model="editA.stDate"
:value-format="editA.type === 'add' ? 'YYYY-MM' : 'YYYY'"
:type="editA.type === 'add' ? 'month' : 'year'"
:placeholder="editA.type === 'add' ? '选择月份' : '选择年份'"
/>
</el-config-provider>
</el-form-item>
<br>
<el-form-item label="C/D-交涉">
<el-input type="number" v-model="editA.negValue" >
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="C/D-THEME">
<el-input type="number" v-model="editA.themeValue">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="市况">
<el-input v-model="editA.marketValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="为替">
<el-input v-model="editA.weitiValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-button class="flex-center" type="primary" @click="onSubmitA(editA)">确认</el-button>
</div>
</n-modal>
<n-modal v-model:show="shomkB">
<div class="bg-#FFF p30px">
<el-form :model="editB" label-width="120px" :inline="true">
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
<template #append>%</template>
</el-input> -->
<el-form-item :label="editB.type === 'add' ? '月份' : '年份'" >
<el-config-provider :locale="locale">
<el-date-picker
v-model="editB.stDate"
:value-format="editB.type === 'add' ? 'YYYY-MM' : 'YYYY'"
:type="editB.type === 'add' ? 'month' : 'year'"
:placeholder="editB.type === 'add' ? '选择月份' : '选择年份'"
/>
</el-config-provider>
</el-form-item>
<br>
<el-form-item label="C/D-交涉">
<el-input type="number" v-model="editB.negValue" >
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="C/D-THEME">
<el-input type="number" v-model="editB.themeValue">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="市况">
<el-input v-model="editB.marketValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="为替">
<el-input v-model="editB.weitiValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-button class="flex-center" type="primary" @click="onSubmitB(editB)">确认</el-button>
</div>
</n-modal>
<n-modal v-model:show="shomkC">
<div class="bg-#FFF p30px">
<el-form :model="editC" label-width="120px" :inline="true">
<!-- <el-input type="number" style="position: absolute; left: 0; top: 0; clip: rect(0, 0, 0, 0)" >
<template #append>%</template>
</el-input> -->
<el-form-item :label="editC.type === 'add' ? '月份' : '年份'" >
<el-config-provider :locale="locale">
<el-date-picker
v-model="editC.stDate"
:value-format="editC.type === 'add' ? 'YYYY-MM' : 'YYYY'"
:type="editC.type === 'add' ? 'month' : 'year'"
:placeholder="editC.type === 'add' ? '选择月份' : '选择年份'"
/>
</el-config-provider>
</el-form-item>
<br>
<el-form-item label="C/D-交涉">
<el-input type="number" v-model="editC.negValue" >
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="C/D-THEME">
<el-input type="number" v-model="editC.themeValue">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="市况">
<el-input v-model="editC.marketValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
<el-form-item label="为替">
<el-input v-model="editC.weitiValue" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<br>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-button class="flex-center" type="primary" @click="onSubmitC(editC)">确认</el-button>
</div>
</n-modal>
<n-modal v-model:show="showModal">
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
</n-modal>
<n-modal v-model:show="shomkD">
<div class="bg-#FFF p30px">
<el-form label-width="120px" :inline="true">
<el-form-item label="发注金额">
<el-input v-model="fazhus" type="number"> </el-input>
</el-form-item>
<br>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-button class="flex-center" type="primary" @click="submitFazhu">确认</el-button>
</div>
</n-modal>
</template>
<style lang="less">
.demo-tabs > .el-tabs__content {
color: #6b778c;
font-size: 32px;
font-weight: 600;
}
.top {
position: absolute;
right: 30px;
top: -92px;
}
.flex-center {
display: flex;
justify-content: center;
margin: 0 auto;
}
</style>

View File

@ -0,0 +1 @@
const e="/assets/bejqt3-af2905ee.png",t=Object.freeze(Object.defineProperty({__proto__:null,default:e},Symbol.toStringTag,{value:"Module"}));export{t as _,e as a};

View File

@ -0,0 +1,49 @@
/** https://www.npmjs.com/package/axios
*/
import axios from "axios";
export function createAxios(options?: any) {
const { beforeRequest, afterResponse, afterError, ...axiosOptions } =
options || {};
console.log('options',options)
const service = axios.create(
Object.assign(
{
// baseURL: 'http://admin.echo.mteam01.com/openApi/',
timeout: 20000,
},
axiosOptions
)
);
// 请求拦截
service.interceptors.request.use(
(config: any) => {
console.log(config)
beforeRequest && beforeRequest(config);
return config;
},
(error: any) => Promise.reject(error)
);
// 响应拦截
service.interceptors.response.use(
async (res: { config: any; data: any; headers: any; status: any }) => {
const reductResult = afterResponse && (await afterResponse(res));
return reductResult ? reductResult : res;
},
async (err: {
config: any;
message: any;
response: { status: any };
code: string;
}) => {
// =====》 通用错误处理
console.error("> Request error: \n", err);
afterError && (await afterError({ err, status }));
return Promise.reject(err);
}
);
return service;
}
export default createAxios();

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

View File

@ -0,0 +1,278 @@
<script setup lang="ts">
import { RouterView } from "vue-router";
import { useUserStore } from "@/stores/modules/user";
import { getCateTreePage, download, getActCateFileList, getBPCActList } from "@/api/daikin/base";
import { databaseld } from "@/stores/modules/database";
import DataBaseHead from "./components/DataBaseHead.vue";
import { useMessage } from 'naive-ui'
const message = useMessage()
const { push } = useRouter();
const store = useUserStore();
const database = databaseld();
const activeMenuKey = ref();
const route = useRoute()
let idx = ref(0);
const rowData = ref();
const tableData = ref([]);
const srcType = ref()
let subTitle = ref();
let type = ref();
function getLastSubstring(str: string): string {
const lastIndex = str.lastIndexOf('.');
if (lastIndex !== -1) {
return str.substring(lastIndex + 1);
} else {
return '';
}
}
const getId = async (id) => {
const { rows } = await getActCateFileList({ cateId: id })
console.log(rows);
rowData.value = rows
}
const showDetail = (row) => {
sessionStorage.setItem("title", row.title);
console.log(row.content);
sessionStorage.setItem("content", row.content)
push({name: "bcpDetail"})
}
const download = async (row, key)=>{
// console.log(row)
if(!row) return
if(row.isSelect===2){
message.error("没有访问权限")
return
}
let filePath = row[key]
if(!filePath) {
message.info("没有可预览文件!")
return
}
srcType.value = getLastSubstring(filePath)
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
// src.value = filePath
// pdfShow.value = true
filePath='https://view.xdocin.com/view?src='+filePath
const screenWidth = window.screen.width;
const screenHeight = window.screen.height;
window.open(filePath, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
}
else{
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'")
}
}
function getFileName(url) {
if (!url) return "";
let lastSplashIndex = url.lastIndexOf("/");
let lastDotIndex = url.lastIndexOf(".");
return url.slice(lastSplashIndex + 1, lastDotIndex);
}
// const {currentPage,pageSize} = pageInfo
// if(!prop.cateId) return
// const {rows,total} = await cateFileList({cateId:prop.cateId,pageNum:currentPage,pageSize})
// pageInfo.total =total
// tableData.value = rows
const getList = async (obj) => {
const {currentPage,pageSize} = pageInfo
const {rows, total} = await getBPCActList({...obj, pageNum:currentPage,pageSize});
tableData.value = rows;
pageInfo.total = total
}
const pageInfo = reactive({
currentPage:1,
pageSize:13,
total:10
})
onMounted(() => {
subTitle.value = route.query.title;
console.log(subTitle.value,9999999999999)
type.value = route.query.type;
getList({moduleId: 1})
});
const lazyState = computed(() => [pageInfo.currentPage])
watch(
() => unref(lazyState),
async (v) => {
getList({moduleId: 1})
},
{ immediate: true, deep: true },
)
const handleSizeChange=(e)=>{
console.log(e)
}
const handleCurrentChange=(e)=>{
console.log(e)
}
function unescapeHTML(html: string) {
if (!html) return "";
const doc = new DOMParser().parseFromString(html, "text/html");
return doc.documentElement.textContent;
}
</script>
<template>
<div class="page w-1920px h-1080px flex">
<div class="main flex-1 pb15px pt0px relative">
<DataBaseHead :subTitle="subTitle" />
<div class="w-full h-1px bg-#507FFD mt50px rd-b-20px"></div>
<div class="w-full h-95%">
<div class="bg-#fff rd-15px px30px pt30px w-full h930px">
<div
class="rd-15px w-full h870px"
style="box-shadow: 1px 2px 26px -3px #cdcccc"
>
<div class="p30px relative h790px">
<table
class="history w-full text-center text-16px border-spacing-0"
>
<thead
style="
background-color: #e7edff;
color: #0a0a0a;
height: 50px;
width: 220px;
border: 1px solid #417bef;
"
>
<tr class="text-20px leading-50px">
<th>
日期
</th>
<th class="wrap">
情报内容
</th>
<th>
风险评估
</th>
<!-- <th>
上传时间
</th> -->
</tr>
</thead>
<tbody >
<tr v-for="(it, index) in tableData" :key="index">
<td
>
<span :title="it.createTime" @click="showDetail(it)"> {{ it.createTime }}</span>
</td>
<td class="wrap h50px">
<div :title="unescapeHTML(it.content )" class="download wrap" @click="download(it, 'filePath')">{{unescapeHTML(it.content )}}</div>
</td>
<td class="h50px"><span class="download" @click="download(it, 'briefingPath')">{{it.riskEstimation}}</span></td>
<td
>
<!-- <span > {{ it.createTime }}</span> -->
</td>
</tr>
</tbody>
</table>
<div class="float-right absolute bottom-20px right-30px">
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
layout="prev, pager, next, jumper" :total="pageInfo.total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.page {
font-family: "PingFang SC";
user-select: none;
background-image: none;
background-color: #cacaca;
background-position: 0 0;
background-repeat: no-repeat;
background-size: cover;
color: #3b3b3b;
line-height: 1;
}
.download {
cursor: pointer;
}
.download:hover {
color: #00E4FF;
}
.nav {
&::before {
top: -48px;
}
.child:hover {
text-decoration: underline;
}
.childs:hover {
text-decoration: underline;
}
&::after {
bottom: -49px;
transform: rotate(-90deg);
}
&.active {
color: #002fa7;
background-color: #e6ecff;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
}
&.actives {
padding: 0px !important;
color: #002fa7;
background-color: #f5f8ff;
a {
color: #002fa7;
}
&::before,
&::after {
opacity: 1;
}
.onActive {
background-color: #e6ecff;
border-radius: 32px 0 0 32px;
padding: 24px 36px 24px 36px;
}
}
}
.main {
width: 100%;
height: 95%;
background-color: #4877fb;
}
&::-webkit-scrollbar {
display: none;
scrollbar-width: none;
}
.wrap{
width: 420px; //设置需要固定的宽度
white-space: nowrap; //不换行
text-overflow: ellipsis; //超出部分用....代替
overflow: hidden; //超出隐藏
}
</style>

View File

@ -0,0 +1 @@
const e="/assets/bejqt1-942c3a37.png",t=Object.freeze(Object.defineProperty({__proto__:null,default:e},Symbol.toStringTag,{value:"Module"}));export{t as _,e as a};

View File

@ -0,0 +1,41 @@
#!/usr/bin/env pwsh
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
$exe=""
$pathsep=":"
$env_node_path=$env:NODE_PATH
$new_node_path="C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\bin\npm-run-all\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules\npm-run-all\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\npm-run-all@4.1.5\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules"
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
# Fix case when both the Windows and Linux builds of Node
# are installed in the same directory
$exe=".exe"
$pathsep=";"
} else {
$new_node_path="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/bin/npm-run-all/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules/npm-run-all/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/npm-run-all@4.1.5/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules"
}
if ([string]::IsNullOrEmpty($env_node_path)) {
$env:NODE_PATH=$new_node_path
} else {
$env:NODE_PATH="$new_node_path$pathsep$env_node_path"
}
$ret=0
if (Test-Path "$basedir/node$exe") {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "$basedir/node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
} else {
& "$basedir/node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
}
$ret=$LASTEXITCODE
} else {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
} else {
& "node$exe" "$basedir/../npm-run-all/bin/npm-run-all/index.js" $args
}
$ret=$LASTEXITCODE
}
$env:NODE_PATH=$env_node_path
exit $ret

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1 @@
.top[data-v-b3926438]{position:absolute;right:30px;top:-92px}.g-wrapper[data-v-b3926438]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:hidden}.g-wrapper .timeline[data-v-b3926438]{font-size:20px;font-weight:700;color:#142142}.g-wrapper .timeline .one[data-v-b3926438]{position:relative}.g-wrapper .timeline .one .year[data-v-b3926438]{left:-132px;top:-14px;color:#003cb7;font-size:26px;font-weight:400;text-align:center;line-height:50px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,221 @@
<script setup lang="ts">
import HomeHead from '@/views/home/components/HomeHead.vue'
import { useDate } from '@/views/home/hooks/useDate'
import { updateFootprint,getFootprintList,saveFootprintUser,delFootprint} from '@/api/daikin/base'
import {useMessage} from 'naive-ui'
const { day, week } = useDate()
const { push } = useRouter()
const message = useMessage()
const pageInfo = reactive({
currentPage: 1,
pageSize: 4,
total:10
})
const listData = ref()
async function getPageList(){
const {rows,total} = await getFootprintList({pageNum:pageInfo.currentPage,pageSize:pageInfo.pageSize,moduleId:'1'});
pageInfo.total =total
listData.value = rows
}
const handleSizeChange=(e)=>{
console.log(e)
}
const handleCurrentChange=(e)=>{
console.log(e)
}
const lazyState = computed(() => [pageInfo.currentPage])
watch(
() => unref(lazyState),
async (v) => {
getPageList()
},
{ immediate: true, deep: true },
)
const back=()=>{
history.back()
}
const srcType = ref()
const openUrl = async (url)=>{
if(!url) {
message.info("没有可预览文件!")
return
}
srcType.value = getLastSubstring(url)
if(['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'].includes(srcType.value)){
// src.value = filePath
// pdfShow.value = true
url='https://view.xdocin.com/view?src='+url
const screenWidth = window.screen.width;
const screenHeight = window.screen.height;
window.open(url, '', 'width=' + screenWidth + ',height=' + screenHeight + ',top=' + 0 + ',left=' + 0)
}
else{
message.error("文件格式不是 'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx','pdf'")
}
}
function getLastSubstring(str: string): string {
const lastIndex = str.lastIndexOf('.');
if (lastIndex !== -1) {
return str.substring(lastIndex + 1);
} else {
return '';
}
}
const toDetail = (obj)=>{
console.log(obj)
if (obj.isSelect === 2) {
message.info("没有访问权限")
return
}
else{
openUrl(obj.filePath.url)
}
}
const redFrd=(ite)=>{
// console.log(ite)
const {url} = ite
openUrl(url)
}
const down=(ite)=>{
const {url} = ite
window.open(url)
}
</script>
<template>
<HomeHead class="tops">
</HomeHead>
<div class="backs" @click="back">返回</div>
<div class="h-90% relative flex flex-col">
<div class="font-600 flex items-end mt30px text-#fff">
<div class="text-36px">列表</div>
<div class="text-18px ml40px mr25px">{{ day }}</div>
<div class="text-18px">{{ week }}</div>
</div>
<div class="q-wrapper flex-1 mt30px text-#142142 flex flex-col bg-#fff p30px">
<!-- <div v-if="listData&&listData.length>0" v-for="i in listData" :key="i"
class="mt8px cursor-pointer flex items-center p15px pl20px text-18px max-w-1205px">
<span class="truncate flex-1 w0 text-#142142 hover:underline w600px max-w600px min-w600px" @click="toDetail(i)">
<img :src="i.imgUrl" class="max-w200px mr20px"/>
<a class="no-underline text-#142142">
{{ i.title }}
</a>
</span>
<span class="shrink-0 ml90px text-#808696 w-200px">{{ i.createTime }}</span>
</div>
<div v-else class="w-full h-hull">
<el-empty :image-size="200" />
</div> -->
<el-table :data="listData" style="width: 100%; margin-bottom: 20px" row-key="id" border
default-expand-all :header-cell-style="{textAlign: 'center',
background: '#2A7BF7', color: '#fff',
height: '60px', 'font-size': '24px'
}" :cell-style="{ 'overflow-y': 'auto' }"
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
<el-table-column prop="title" label="标题" align="center"/>
<el-table-column prop="imgUrl" label="图片" align="center">
<template #default="scope">
<div style="display: grid;grid-template-columns: repeat(3,1fr);grid-template-rows: masonry;grid-gap: 2px;">
<img v-if="scope.row.imgUrl" v-for="i in scope.row.imgUrl" :src="i.url" alt="" class="w-full">
</div>
</template>
</el-table-column>
<el-table-column prop="filePath" label="文件列表" align="center">
<template #default="scope">
<span v-if="scope.row.filePath" v-for="i in scope.row.filePath" class="flex py5px">
<img src="../../../assets/images/lvbiao@2x.png" class="mr-5px w-20px"/>
<span class="truncate">{{i.originalFileName}}</span>
<span class="py3px px-10px rd-5px bg-#2A7BF7 text-#fff" @click="redFrd(i)">预览</span>
<!-- <span class="py3px px-10px rd-5px bg-#2A7BF7 text-#fff ml-5px" @click="down(i)">下载</span> -->
<br>
</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="float-right absolute bottom-20px right-30px">
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
layout="prev, pager, next, jumper" :total="pageInfo.total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</div>
</template>
<style scoped lang="less">
.backs{
position: absolute;
top: 25px;
left: 25px;
color: #fff;
// z-index: 500;
font-size: 25px;
font-weight: bold;
text-align: center;
justify-content: center;
}
.truncate {
display: block;
max-width: 226px;
min-width:250px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: left;
}
.tops {
right: 30px;
top: -92px;
}
::-webkit-scrollbar {
width: 1px;
}
.q-wrapper {
border-radius: 18px;
border: 1px solid #E7EBF5;
box-shadow: inset 1px 2px 12px rgba(14, 86, 221, 0.32);
overflow: auto;
&::after {
content: ' ';
background-image: url('@/assets/images/bg-card.svg');
pointer-events: none;
display: block;
width: 100%;
height: 127px;
background-repeat: no-repeat; /* 阻止图片平铺 */
background-position: right top;
position: absolute;
left: 0;
top: 0;
}
}</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,71 @@
<template>
<vue3-tinymce v-model="content" :setting="state.setting" @change="handleChange" @paste_preprocess="handlePastePreprocess"/>
</template>
<style scoped></style>
<script lang="ts" setup>
import Vue3Tinymce from '@jsdawn/vue3-tinymce';
import { useUserStore } from '@/stores/modules/user'
import { useMessage } from 'naive-ui'
const message = useMessage()
const props = defineProps(["content"]);
const emit = defineEmits(['getChildData']);
const store = useUserStore()
const content = ref()
onMounted(() => {
console.log(props.content)
content.value = props.content ? unescapeHTML(props.content) : '';
});
function unescapeHTML(html: string) {
const doc = new DOMParser().parseFromString(html, 'text/html');
return doc.documentElement.textContent;
}
watch(() => props.content, () => {
const center = unescapeHTML(props.content)
// console.log(center)
content.value = center
});
// // // 给父组件传值
const handleChange = (val: any) => {
console.log(val)
emit('getChildData', val)
}
const header = { 'token': store.user.token }
const state = {
setting: {
height: 800,
width: '100%',
resize: false,
toolbar:
" fullscreen | blocks alignleft aligncenter alignright alignjustify | link unlink | numlist bullist | image table | fontsize forecolor backcolor | bold italic underline strikethrough | indent outdent | superscript subscript | removeformat |",
toolbar_mode: "sliding",
quickbars_selection_toolbar:
"removeformat | bold italic underline strikethrough | fontsize forecolor backcolor",
plugins: "link image table lists fullscreen quickbars preview",
font_size_formats: "12px 14px 16px 18px 20px 22px 24px 26px 28px 30px 34px 38px 42px 46px",
link_default_target: "_blank",
link_title: false,
relative_urls: false,
convert_urls: false,
nonbreaking_force_tab: true,
block_unsupported_drop:true,
branding: false,
// 以中文简体为例
language: "zh-Hans",
custom_images_upload: true,
images_file_types: 'jpeg,jpg,jpe,png,gif,xlsx,xls,pdf,ppt,doc,docx',
// 复用 图片上传 api 地址
images_upload_url: '/test-api/common/upload',
// 上传成功回调函数return 图片地址。默认 response.location
custom_images_upload_callback: (response: { url: any; }) => response.url,
// 上传 api 请求头
custom_images_upload_header: header,
language_url:
"https://procurement.daikin.net.cn/hpserver/zh-Hans.js",//https://unpkg.com/@jsdawn/vue3-tinymce@2.0.2/dist/tinymce/langs/zh-Hans.js
}
}
</script>

View File

@ -0,0 +1,12 @@
@SETLOCAL
@IF NOT DEFINED NODE_PATH (
@SET "NODE_PATH=C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules"
) ELSE (
@SET "NODE_PATH=C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\bin\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules\vite\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\vite@4.4.8_@types+node@18.17.1_less@4.1.3\node_modules;C:\Users\ljl\Desktop\dajin\node_modules\.pnpm\node_modules;%NODE_PATH%"
)
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\..\vite\bin\vite.js" %*
) ELSE (
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\..\vite\bin\vite.js" %*
)

View File

@ -0,0 +1,17 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -z "$NODE_PATH" ]; then
export NODE_PATH="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules"
else
export NODE_PATH="/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/bin/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules/vue-demi/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/vue-demi@0.14.5_vue@3.3.4/node_modules:/mnt/c/Users/ljl/Desktop/dajin/node_modules/.pnpm/node_modules:$NODE_PATH"
fi
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../vue-demi/bin/vue-demi-switch.js" "$@"
else
exec node "$basedir/../vue-demi/bin/vue-demi-switch.js" "$@"
fi

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,397 @@
<!-- CSR 碳中和 -->
<script setup lang="ts">
import * as echarts from 'echarts';
import AppBlock from '@/components/AppBlock.vue'
import { NModal } from 'naive-ui';
import { charData, pieData1, pieData2, liQuid, liQuids } from './CSRData'
import { getCSRDetail, getCsrActList } from '@/api/daikin/base'
import Modify from './modify.vue'
import ModifyB from './modifyB.vue'
import { message } from '@/utils/message';
import { useUserStore } from '@/stores/modules/user'
const store = useUserStore()
const userCode = ['admin','csr_dandang','tech_service'].includes(store.user.roleCode)
const { chartRef, option } = charData()
const { chartRef: chartRefP1, option: optionP1 } = pieData1()
const { chartRef: chartRefP2, option: optionP2 } = pieData2()
const { chartRef: chartRefli, option: optionli } = liQuid()
const { chartRef: chartReflis, option: optionlis } = liQuids()
const container = ref(null);
const startType = ref(40)
// 导入 ECharts
const shomk = ref(false)
const shomkB = ref(false)
const shomks = () => {
shomk.value = shomk.value === false ? true : false
console.log(shomk.value)
}
const shomksB = () => {
shomkB.value = shomkB.value === false ? true : false
console.log(shomkB.value)
}
const form = ref({
lable1:{
name: '大金集团碳减排目标',
year: 'F25',
date: '14%',
title1:'',
title2:'',
},
lable2:{
name: 'CN调达本部碳减排目标',
year: 'F25',
date: '14%',
title1:'',
title2:'',
},
lable3:{
name: 'CN调达本部碳减排目标',
year: 'F23',
date: '14%',
title1:'',
title2:'',
},
lable4:{
name: '2020实绩, 2021实绩, 2022实绩, 2023, 2024, 2025',
year: '120, 200, 150, 80, 70, 110',
date: '0, 0, 0, 80, 70, 110',
title1:'',
title2:'',
},
lable5:{
name: '30%碳减排课题收集整体情况:',
year: '60',
date: '14%',
title1:'原材料: 15.5%',
title2:'能源消耗: 1.7%',
},
lable6:{
name: 'FY23碳减排实施完成情况:',
year: '0.6',
data:'',
title1:'原材料',
title2:'整体目标10%',
},
lable7:{
name:'',
data:'',
year: '0.6',
title1:'能源消耗',
title2:'整体目标5%',
},
lable8:{
name:'【FY20原材料构成数据】',
data:{
data1:{
name:'Search Engine',
value:'1048'
},
data2:{
name:'Direct',
value:'735'
}
,
data3:{
name:'Email',
value:'580'
}
,
data4:{
name:'',
value:''
},
data5:{
name:'',
value:''
}
}
},
lable9:{
name:'【FY20能源消耗构成数据】',
data:{
data1:{
name:'Search Engine',
value:'1048'
},
data2:{
name:'Direct',
value:'735'
}
,
data3:{
name:'Email',
value:'580'
}
,
data4:{
name:'Union Ads',
value:'484'
},
data5:{
name:'Video Ads',
value:'300'
}
}
},
})
onBeforeMount(async () => {
const { data: { content: { dataList } } } = await getCSRDetail()
//
if(dataList){
form.value = dataList
}
const { data } = await getCsrActList()
dog.value = data
})
const dog = ref()
const handleCommand = (command: string | number | object) => {
console.log(command)
downloadFile(command)
}
async function downloadFile(data) {
const url = data.int.url
try {
const response = await fetch(url);
const blob = await response.blob();
const downloadUrl = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = downloadUrl;
link.download = data.int.originalFileName; // 替换为你要保存的文件名
link.click();
URL.revokeObjectURL(downloadUrl);
} catch (error) {
message.error('下载文件出错:', error);
}
}
</script>
<template>
<AppBlock class="h-full flex-1 box">
<div class="h-full relative">
<el-button v-if="userCode" type="primary" class="button" @click="shomks">管理</el-button>
<!-- 123 -->
<div class="text-32px font-700 h85px flex items-center justify-center line">
{{ `<CSR 碳中和>` }}
</div>
<div class="flex p10px" v-if="form">
<div class="flex-1 cart">
<p>{{ form.lable1.name }}</p>
<div>
{{ form.lable1.year }}<el-icon>
<CaretTop />
</el-icon>{{ form.lable1.date }}%
</div>
</div>
<div class="flex-1 cart">
<p>{{ form.lable2.name }}</p>
<div>
{{ form.lable2.year }}<el-icon>
<CaretTop />
</el-icon>{{ form.lable2.date }}%
</div>
</div>
<div class="flex-1 cart">
<p>{{ form.lable3.name }}</p>
<div>
{{ form.lable3.year }}<el-icon>
<CaretTop />
</el-icon>{{ form.lable3.date }}%
</div>
</div>
</div>
<div class="flex " v-if="form">
<div>
<div class="w88% h400px py30px pl30px border-solid border-color-#f1f1f1 border-width-1px">
<VChart ref="chartRef" :option="option" autoresize />
</div>
<div class="flex">
<div class="w60%">
<div class="pl30px ">
<div class="py20px text-24px font-extrabold">{{ form.lable5.name }}</div>
<el-progress :percentage="form.lable5.year" :text-inside="false" color="#00B3D8" status="exception"
:stroke-width="50" class="w100% !rounded-0">
<el-button text></el-button>
</el-progress>
<div class="text-center text-#00BDD3 text-18px my20px"><el-icon>
<CaretTop />
</el-icon>{{ form.lable5.date }}</div>
</div>
<div class="text-#6288FB flex px30px text-18px">
<div class="ditt">
<img src="./images/ycail@2x.png">
{{ form.lable5.title1 }}
</div>
<div class="ditt ml20px">
<img src="./images/nenh@2x.png">
{{ form.lable5.title2 }}
</div>
</div>
</div>
<div class="w39% flex flex-wrap">
<div class="w300px h30px text-22px font-extrabold">{{ form.lable6.name }}</div>
<div class="w150px h200px">
<VChart ref="chartRefli" :option="optionli"></VChart>
</div>
<div class="w150px h200px ml10px">
<VChart ref="chartReflis" :option="optionlis"></VChart>
</div>
</div>
</div>
</div>
<div class="w480px border-solid border-color-#f1f1f1 border-width-1px">
<div class="w100% h230px">
<VChart ref="chartRefP1" :option="optionP1"></VChart>
</div>
<div class="w100% h250px">
<VChart ref="chartRefP2" :option="optionP2"></VChart>
</div>
<div class="flex-1 w100% h195px px20px py5px border-solid border-color-#f1f1f1 border-width-1px">
<div v-if="dog" class="text-22px mb-20px font-extrabold">碳减排非PLUS活动信息: <el-button type="primary"
class="ml25px" v-if="userCode" @click="shomksB">管理</el-button></div>
<div class="my20px flex w330px h20px" v-for="i in dog">
<div class="max-w300px min-100px">{{ i.title }}</div>
<div>
<el-dropdown max-height="100px" @command="handleCommand">
<span class="el-dropdown-link">
<el-icon color="#097BC2" class="el-icon--right"><CaretBottom /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-if="i.filePathList" v-for="int in i.filePathList" :command="{int}">{{int.originalFileName}}</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
</div>
</div>
</div>
</AppBlock>
<n-modal v-model:show="shomk">
<Modify class="w90% mt30px"></Modify>
</n-modal>
<n-modal v-model:show="shomkB">
<ModifyB class="w90% mt30px"></ModifyB>
</n-modal>
</template>
<style scoped lang="less">
.button {
position: absolute;
top: 20px;
right: 20px;
z-index: 500;
}
.ditt {
background-color: #F6F8FF;
border-radius: 30px;
padding: 8px;
font-size: 20px;
height: 45px;
overflow: hidden;
img {
width: 30px;
height: 30px;
}
}
/deep/.el-progress-bar__outer,
/deep/.el-progress-bar__inner {
border-radius: 0 !important;
}
/deep/.el-progress-bar__inner {
background-color: #00B3D8;
}
@border-line: 1px solid #e7ebf5;
.cart {
background-color: #F4F8FF;
// background-color: #6c90ce;
height: 100px;
margin-left: 5px;
text-align: center;
justify-content: center;
p {
font-size: 20px;
font-weight: bold;
line-height: 40px;
margin-top: 20px;
margin-bottom: 5px;
}
.el-icon {
color: #0049E0;
}
}
.line {
border: @border-line;
}
// img {
// width: 100%;
// height: 100%;
// user-select: none;
// user-drag: none;
// -webkit-user-drag: none;
// }
.box {
// height: calc(100% - 85px);
&::after {
display: none;
}
.box-1 {
height: 435px;
border-right: @border-line;
border-bottom: @border-line;
}
.box-2 {
flex: 1;
border-right: @border-line;
}
.box-3 {
height: 506px;
border-bottom: @border-line;
}
.box-4 {
flex: 1;
}
}</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

View File

@ -0,0 +1 @@
var u=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function f(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function l(e){if(e.__esModule)return e;var r=e.default;if(typeof r=="function"){var t=function o(){return this instanceof o?Reflect.construct(r,arguments,this.constructor):r.apply(this,arguments)};t.prototype=r.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}),t}export{l as a,u as c,f as g};

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

View File

@ -0,0 +1 @@
.top[data-v-c4cb7a09]{position:absolute;right:30px;top:-92px}.g-wrapper[data-v-c4cb7a09]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:hidden}.g-wrapper .timeline[data-v-c4cb7a09]{font-size:20px;font-weight:700;color:#142142}.g-wrapper .timeline .one[data-v-c4cb7a09]{position:relative}.g-wrapper .timeline .one .year[data-v-c4cb7a09]{left:-132px;top:-14px;color:#003cb7;font-size:26px;font-weight:400;text-align:center;line-height:50px}

View File

@ -0,0 +1 @@
.backs[data-v-e3f7e37a]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.truncate[data-v-e3f7e37a]{display:block;max-width:226px;min-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.tops[data-v-e3f7e37a]{right:30px;top:-92px}[data-v-e3f7e37a]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-e3f7e37a]{border-radius:18px;border:1px solid #E7EBF5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-e3f7e37a]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}

View File

@ -0,0 +1,135 @@
<!-- 战略企画 -->
<script setup lang="ts">
import AppBlock from '@/components/AppBlock.vue'
import AppNewsBox from '@/components/AppNewsBox.vue'
import HomeHead from '@/views/home/components/HomeHead.vue'
// import HomeHeadSearch from '@/views/home/components/HomeHeadSearch.vue'
import { useDate } from '@/views/home/hooks/useDate'
const { day, week } = useDate()
const { push } = useRouter()
const Items = [
{
key: '0',
title: '调达研究院',
children: [
{ label: '调达本部HP', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: 'CSR-碳中和', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '中国地区连携强化 ', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '工作模式变更 ', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '差别化', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
],
},
{
key: '1',
title: '调达中心',
children: [
{ label: 'Database推进', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '市况', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '汇率', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: 'BCP', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '全球连携强化', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
{ label: '高品质高品位', items: [{ content: 'FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来' }] },
],
},
]
</script>
<template>
<HomeHead class="top">
<template #title>
</template>
<template #content>
<!-- <HomeHeadSearch /> -->
</template>
</HomeHead>
<div class="h-full relative flex flex-col">
<div class="font-600 flex items-center mt27px">
<div class="text-36px">调达本部重点课题 11 项目</div>
<div class="ml40px bg-#fff/20 b-1px b-solid b-#fff rd-8px inline-flex items-center px12px py9px cursor-pointer">
<span class="inline-block rotate-45 mr8px">✕</span> <span>上传</span>
</div>
</div>
<div class="flex-1 mt30px text-#142142">
<!-- <div class="flex w-full h-full gap-30px">
<AppBlock class="flex-1 box max-h-848px !overflow-y-auto" v-for="item in Items" :key="item.title">
<div class="box-title">{{ item.title }}</div>
<div class="mt30px" v-for="news in item.children" :key="news.label">
<div class="inline-flex items-center pl18px pr28px py8px rd-22px bg-#003cb7 text-#fff text-18px">
<img src="@/assets/images/icon-tag.svg" class="w30px h30px mr16px" />
<span>{{ news.label }}</span>
</div>
<div class="flex items-center py22px news-item" v-for="n in 2" :key="n">
<AppNewsBox class="flex-1" text="中国在2023年首次统一碳排放规则规则规就则房地产需业稳定市场需业稳定市场需业稳定市场需求增高" date="2023-05-22" />
<div class="flex-shrink flex">
<div class="btn primary ml36px">预览</div>
<div class="btn default ml10px">下载</div>
</div>
</div>
</div>
</AppBlock>
</div> -->
<img src="@/assets/images/bejqt3.png" class="w100%"/>
</div>
</div>
<div class="absolute flex flex-col w-full h-full z-200 top-0 left-0 text-center bg-red justify-center items-center" style="background-color: rgba(255,255,255,0.8);">
<img src="@/assets/images/chah.png"/>
<br>
<div class="text-#5683DB text-36px">【做成中,敬请期待】</div>
</div>
</template>
<style scoped lang="less">
.top{
position: absolute;
right: 30px;
top: -92px;
}
.box {
padding: 23px 45px;
.box-title {
font-size: 28px;
font-weight: 600;
position: relative;
padding-left: 24px;
&::before {
content: ' ';
display: block;
width: 8px;
height: 30px;
background-color: #003ab5;
position: absolute;
left: 0;
}
}
}
.news-item {
cursor: pointer;
border-bottom: 1px solid #eef3fb;
}
.btn {
--color-primary: #3870e5;
padding: 10px 22px;
border-radius: 5px;
cursor: pointer;
user-select: none;
&.default {
border: 1px solid var(--color-primary);
color: var(--color-primary);
}
&.primary {
background-color: var(--color-primary);
color: #fff;
}
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

View File

@ -0,0 +1 @@
.notice[data-v-cd94285f]{position:absolute;top:52px;left:-3px;width:200px;background:#ffffff;max-height:520px;z-index:500;font-size:18px;border-radius:15px;padding:10px;color:#1a1919;box-shadow:1px 1px 5px 1px #d9d5d5}.notice .box[data-v-cd94285f]:hover{background:#e5e5e5;border-radius:5px;color:#1836c3}.notice .box:hover span[data-v-cd94285f]{color:#fff;background:red}.notice span[data-v-cd94285f]{color:#1836c3;padding:2px 7px;border-radius:50px}.popover-grid[data-v-cd94285f]{display:grid;grid-template-columns:auto auto auto auto auto;grid-gap:12px;justify-content:center;align-items:center}

View File

@ -0,0 +1,517 @@
<template>
<DataBaseHead />
<div class="w-full h-1px bg-#507FFD mt50px rd-b-20px"></div>
<div class="bg-#fff rd-15px px30px pt30px w-full h920px ">
<el-tabs v-model="activeName" class="demo-tabs">
<div class="float-right px20px py10px z-200 bg-#f5f5f5" @click="goBacks"> <el-icon class="text-red"><ArrowLeftBold size="18"/></el-icon> 返回</div>
<el-tab-pane label="分类管理" name="first">
<el-button type="primary" @click="editClickA('add')" class="mb-20px">
新增
</el-button>
<div class="w100% h750px overflow-auto">
<el-table :data="tableData" style="width: 100%; margin-bottom: 20px" row-key="id" border
default-expand-all :header-cell-style="{textAlign: 'center',
background: '#2A7BF7', color: '#fff',
height: '60px', 'font-size': '24px'
}" :cell-style="{ 'overflow-y': 'auto' }"
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
<el-table-column prop="name" label="标题名称" align="left"/>
<el-table-column prop="sort" label="排序" align="center"/>
<el-table-column prop="address" label="操作" align="center">
<template #default="scope">
<el-button type="primary" @click="editClickA('edit', scope.row)" class="mb-20px">
编辑</el-button>
<el-button type="success" v-if="scope.row.level === 1||scope.row.level === 2||scope.row.level === 3" @click="editClickA('add', scope.row)"
class="mb-20px"> 新增{{scope.row.level===1?'二':scope.row.level===2?'三':'四'}}级</el-button>
<el-button type="danger" @click="deleteClickA(scope.row)" class="mb-20px"> 删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane label="内容管理" name="second">
<el-button type="primary" @click="editClickB('add')" class="mb-20px"> 新增</el-button>
<el-button type="primary" @click="getAll" class="mb-20px"> 查看所有</el-button>
<div class="w100% h750px overflow-auto" >
<el-table class="tableClass" :data="infoData" style="width: 100%; margin-bottom: 20px" row-key="id" border
default-expand-all :header-cell-style="{
background: '#2A7BF7', color: '#fff',
height: '60px', textAlign: 'center', 'font-size': '24px'
}" :cell-style="{ 'text-align': 'center', 'overflow-y': 'auto' }"
:tree-props="{ children: 'childList', hasChildren: 'hasChildren'}">
<el-table-column prop="cateName" label="所属分类" show-overflow-tooltip>
<!-- <template #default="scope">
<span v-if="scope.row.cateId==="></span>
</template> -->
</el-table-column>
<el-table-column prop="title" label="标题名称" show-overflow-tooltip/>
<!-- <el-table-column prop="deptName" label="排序" /> -->
<el-table-column label="文件列表" prop="filePath" show-overflow-tooltip/>
<el-table-column label="排序" prop="sort" show-overflow-tooltip/>
<el-table-column label="查看范围" prop="userIdList" :show-overflow-tooltip="true">
<template #default="scope">
<!-- <el-button type="primary" class="button" @click="getUser(scope.row)">查看范围</el-button> -->
<!-- <span class="descStyle" v-if="scope.row.userList" v-for="it in scope.row.userList"> &nbsp;&nbsp; {{it.nickName}}</span> -->
<span v-if="scope.row.userList" v-for="it in scope.row.userList">
<el-tooltip :content="it.nickName" placement="top">
<p class="descStyle">{{ it.nickName }}</p>
</el-tooltip>
</span>
</template>
</el-table-column>
<el-table-column prop="address" label="操作" show-overflow-tooltip>
<template #default="scope">
<div>
<el-button type="primary" @click="editClickB('edit', scope.row)" class="mb-20px w45px">
编辑</el-button>
<el-button type="danger" @click="deleteClickB(scope.row)" class="mb-20px w45px"> 删除</el-button>
<div style="float: right;" v-if="scope.$index !== 0 && scope.$index !==infoData.length-1">
<el-button style="color: #000;width: 45px;height: 33px;" @click="onUpload(scope.row)">
<el-icon><Upload /></el-icon>
</el-button>
<el-button style="color: #000;width: 45px;height: 33px;" @click="ondownloads(scope.row)">
<el-icon><Download /></el-icon>
</el-button>
</div>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="float-right absolute bottom-0px right-30px z-2000 bg-#fff">
<el-pagination v-model:current-page="pageInfo.currentPage" v-model:page-size="pageInfo.pageSize"
layout="prev, pager, next, jumper" :total="pageInfo.total"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</el-tab-pane>
</el-tabs>
</div>
<NModal v-model:show="shomkA">
<div class="bg-#FFF p30px">
<el-form :model="editA" label-width="120px" :inline="true">
<el-form-item label="标题">
<el-input v-model="editA.name" />
</el-form-item>
<br />
<el-form-item label="排序">
<el-input type="number" v-model="editA.sort" />
</el-form-item>
<br />
<div class="text-center">
<el-button type="primary" @click="addClickA(editA)" class="mb-20px"> 确认</el-button>
</div>
</el-form>
</div>
</NModal>
<NModal v-model:show="shomkB">
<div class="bg-#FFF p30px">
<el-form :model="editB" label-width="120px" :inline="true">
<!-- <el-form-item label="标题" v-if="editB.type!='add'"> -->
<el-form-item label="标题">
<el-input v-model="editB.title" />
</el-form-item>
<br />
<el-form-item label="排序">
<el-input v-model="editB.sort" type="number" />
</el-form-item>
<br />
<el-form-item label="所属类别">
<el-cascader v-model="editB.cateId" :options="tableData" @change="handleChange"
:props="{ children: 'childList', label: 'name', value: 'id' }" />
</el-form-item>
<br />
<el-form-item label="查看范围">
<el-button class="button" @click="getUser" :type="userData?'success':''" :icon="userData?'Check':''">{{userData?'已设置':'设置'}}</el-button>
</el-form-item>
<br/>
<el-form-item label="文件">
<el-upload v-model:file-list="editB.fileList" class="upload-demo" :headers="header"
action="/test-api/common/upload" :on-exceed="handOnExceed" multiple="true">
<el-button type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
<br />
<div class="text-center">
<el-button type="primary" @click="addClickB(editB)" class="mb-20px"> 确认</el-button>
</div>
</el-form>
</div>
</NModal>
<n-modal v-model:show="showModal">
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
</n-modal>
</template>
<script setup lang="ts">
import DataBaseHead from "@/views/home/components/DataBaseHead.vue";
import { useUserStore } from '@/stores/modules/user'
import { cateAdd, cateUpdate, treeDbList, cateInfo, cateDel, cateFileUpdate, cateFileDel, cateFileList, download, dragFile } from '@/api/daikin/base'
import { NModal, useMessage, NSelect } from "naive-ui";
import UserList from '@/views/home/intelligence/process/UserPages.vue'
import {databaseld} from "@/stores/modules/database"
const database = databaseld()
const message = useMessage()
const tableData = ref()
const infoData = ref()
const shomkA = ref()
const editA = ref()
const shomkB = ref()
const editB = ref()
const activeName = ref('first')
const pageInfo = reactive({
currentPage:1,
pageSize:10,
total:10
})
async function getTree() {
const { data } = await treeDbList({})
tableData.value = data
}
let cateIds = ref()
watchEffect(()=>{
cateIds.value = database.database.id
console.log(database.database.id)
if(database.database.id){
getInfo(database.database.id)
}
})
async function getInfo(cateId: string | undefined) {
const { rows,total } = await cateFileList({ cateId:cateIds.value, pageNum: pageInfo.currentPage, pageSize: pageInfo.pageSize })
infoData.value = rows
pageInfo.total = total
if(rows&&rows.length>0){
rows.map((item: { filePath: any; })=>Object.assign(item,{
fileList: item.filePath
}))
}
}
const store = useUserStore()
const deptId = ref()
onMounted(() => {
// getTree()
// getInfo('')
deptId.value = store.user.deptId
})
const editClickA = (edit: any, obj: any) => {
console.table(obj)
if (edit === 'add' && obj && obj.id) {
editA.value = {
name: '',
sort: '',
pid: obj.id,
type: edit
}
}
else if (obj && obj.id) {
editA.value = obj
}
else {
editA.value = {
name: '',
sort: '',
pid: '0',
type: edit
}
}
console.log(editA.value)
shomkA.value = true
}
const deleteClickA = async (row: any) => {
if (row && row.id) {
const { code, msg } = await cateDel({ id: row.id })
if (code === 200) { message.success("删除成功") }
else message.warning(msg)
}
getTree()
}
async function addClickA(row: any) {
if (!row) return
if (row.type === 'add') {
const { code, msg } = await cateAdd(row)
if (code === 200) { message.success("新增成功") }
else message.warning(msg)
}
else {
const { code, msg } = await cateUpdate(row)
if (code === 200) { message.success("修改成功") }
else message.warning(msg)
}
shomkA.value = false
getTree()
}
const editClickB = (edit: any, obj: any) => {
console.log(obj)
if (edit === 'add' && obj && obj.id) {
editB.value = {
title: '',
cateId: '',
deptId: deptId.value,
filePath:[],
fileList: [],
type:edit,
userList:[],
sort:0
}
if(obj.filePath){
editB.value.fileList = [{
name: obj.title,
originalFilename: obj.title,
url: obj.filePath,
}]
}
setUserList.value =obj.userList
}
else if (obj && obj.id) {
editB.value = obj
if(obj.filePath){
editB.value.fileList = [{
name: obj.title,
originalFilename: obj.title,
url: obj.filePath,
}]
}
setUserList.value =obj.userList
}
else {
editB.value = {
cateId: '',
deptId: deptId.value,
title: '',
filePath: [],
fileList: [],
type:edit,
userList:[],
sort:0
}
setUserList.value = []
}
userData.value = false
console.log(editB.value)
shomkB.value = true
}
const deleteClickB = async (row: any) => {
if (row && row.id) {
const { code, msg } = await cateFileDel({ id: row.id })
if (code === 200) { message.success("删除成功") }
else message.warning(msg)
}
getInfo('')
}
async function addClickB(row: any) {
console.log(row,deptId.value)
if (!row) return
let url: any[] =[]
if(row.fileList&&row.fileList.length>0){
row.fileList.forEach((index)=>{
if(index.response){
url.push(index.response.url)
}
else{
url.push(index.url)
}
})
row.filePath = url
// console.log(url, row.filePath )
}
let list: any[] =[]
if(row.userList&&row.userList.length>0){
console.log(row.userList&&row.userList.length>0)
row.userList.forEach((index) => {
list.push(index.userId)
})
row.userIdList =list
}
if(!row.cateId){
message.error("所属类别不能为空!")
return
}
if (row.type === 'add') {
const { code, msg } = await cateFileUpdate(row)
if (code === 200) { message.success("新增成功") }
else message.warning(msg)
}
else {
const { code, msg } = await cateFileUpdate(row)
if (code === 200) { message.success("修改成功") }
else message.warning(msg)
}
shomkB.value = false
getInfo('')
}
const handleChange = (e: string | any[]) => {
// console.log(e.length)
if (e && e.length == 1) {
// console.log(e, editB.value)
editB.value.cateId = e[0]
}
else if(e && e.length == 2){
editB.value.cateId = e[1]
}
else if(e && e.length == 3){
editB.value.cateId = e[2]
}
else if(e && e.length == 4){
editB.value.cateId = e[3]
}
else {
editB.value.cateId = e[0]
}
// console.log(e,editB.value.cateId,99999)
}
const handOnExceed: UploadProps['onExceed'] = (uploadFile: any, uploadFiles: any) => {
message.warning("最多只能上传一个文件!")
}
const header = { 'token': store.user.token }
const goBacks=(e)=>{
// console.log(444)
history.back()
}
const showModal = ref(false)
const flg = ref()
const setUserList =ref()
async function getUser(row: { id: any; userList: any; }) {
console.log(row)
showModal.value = !showModal.value
flg.value = row
if(row.id&&row.userList){
setUserList.value = row.userList
}
// const {data: userArr} = await getBPCUser({moduleId})
// setUserList.value = userArr
}
// 获取子组件传过来的值
const userData = ref(false)
const handleChild = (data: any) => {
console.log(data, 444);
const { showModal: show, multipleSelection } = data
showModal.value = unref(show)
let userIdList: any[] =[]
multipleSelection.value.forEach((i: { userId: any })=>{
userIdList.push(i.userId)
})
if(flg.value.id){
flg.value.userIdList = userIdList
// marketPreADD(flg.value)
// getDataA();
console.log(flg.value)
}
editB.value.userIdList = userIdList
if(userIdList.length>0){
userData.value = true
console.log(userIdList,8888)
}
else userData.value = false
}
const CloseThiss = (data: boolean)=>{
showModal.value = data
}
const getAll=()=>{
// cateIds.value = ''
getInfo()
}
const lazyState = computed(() => [pageInfo.currentPage])
watch(
() => unref(lazyState),
async (v) => {
getTree()
},
{ immediate: true, deep: true },
)
const handleSizeChange=(e)=>{
console.log(e)
}
const handleCurrentChange=(e)=>{
console.log(e)
}
// 上移
async function onUpload(it){
console.log(infoData);
// 当前数据的索引
let index = infoData._rawValue.findIndex((value :any) => value.id === it.id);
index -= 1;
const onUploaddate = await dragFile({
cateId:it.cateId,
curId:it.id,
lastId:infoData._rawValue[index].id,
});
getInfo();
console.log(infoData);
console.log(it.cateId,"分类id");
console.log(it.id, "当前位置的id");
console.log(infoData._rawValue[index].id,"上移位置的id");
// console.log(tableData._rawValue);
}
// 下移
async function ondownloads(it){
// 当前数据的索引
let index = infoData._rawValue.findIndex((value) => value.id === it.id);
index += 1;
// const {rows,total} = await cateFileList({cateId:prop.cateId,pageNum:currentPage,pageSize})
const ondownloads = await dragFile({
cateId:it.cateId,
curId:it.id,
lastId:infoData._rawValue[index].id,
});
getInfo();
console.log(ondownloads);
}
</script>
<style lang="less">
::-webkit-scrollbar {
width: 1px;
}
.tableClass .cell{
padding: 0!important;
height: 50px;
line-height: 25px !important;
text-align: center;
}
.descStyle {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
display: -webkit-box;
-webkit-line-clamp: 3; //行数
-webkit-box-orient: vertical;
}
</style>

View File

@ -0,0 +1 @@
.top[data-v-6d963082]{position:absolute;right:30px;top:-92px}[data-v-6d963082]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-6d963082]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated by Pixelmator Pro 3.2.3 -->
<svg width="21" height="20" viewBox="0 0 21 20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<image id="-7" x="0" y="0" width="21" height="20" xlink:href="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAFaADAAQAAAABAAAAFAAAAAA1ezu+AAAC4ElEQVQ4EZ1UT0hUYRCf+d7btbCkpCCFQEow2tzn2kHCoCAIT9axg6379lIEXaJDEN6CggLBm5Xupl6KDkWXvBT0jwzRfStFUUSnqIggpaz2fd/XzPu7q/Z3YHdmfjPz45s/uwh/kvbCNgPhHCDuAsBXqOWAW87ficpShU3w1H4X+WRgtbPMTo+0GWjMEZ6ojiGIHtfJThrWlREA3Uc0Wen0Xw1zRGgs00QoUDwmPCDUXPSd8zSo22ZHsZusNnKTpHsYD2Vl0sxIM73wCQKu8xIRjkjHPiSE2B0Wag0PyN7CPrU7H+Ksl5NmRjcK6b2wgRPoVSdkKXeR7cpsdhq07mU7kCZPI/wIAda1pF0TDUKJGUTczEENMKCc/GAiPdppWMXXwiocl2X7FgUOcDwSjW5kkxEvaudwQrh1swSkOIEIzygnNwCZ0e2GEiWC/NkiHpSl/puGVThM5WOcS/JWKr0P5uzn7Pgv3XvXFG6SZugTkh70CDsKLUQ4TXnx9rW+YaSLvTTjccLzTELSbAicAspnx3sptcZDp22y6GEqOAq8LOWdU6OP136jgj3uXO4ej4QWOhRE30shOxGtwqQA3B+ARenkbEhdbjRM8wVhG2qpaj1E1e2W8o9EungSEc4H0TciIkS47hG2DtURIc/wt4RMoLV4mEyP7VDl3AWt8XRA2oKJ9FiXEsryziZ1LWkkvj6jLW0NEv5GLUrUFpTslzRGGzQueDMNK4VVnCEgE/r/oBekFq1Qzn7gmvhOd443/Sch86w1QbWzwWL6ir4rWtItVMiKz8cPLtCRfIryQPMvbX3sB5ZQiyEWk/oI3fwSQZigYz8WonRCp+iEzob+Sjpuf6UoYQi65ndNwLdfpEZwTJpAg9ClrdMhIP21VYmGVVVebEoRdR2TmviFMmquwavQuCau5M3i6mo/tBHjjmLSqb55urFLlESLiT/U/sewkLUC/FwdD+z7lfp6h+MsPwEu3OQvRFOVMQAAAABJRU5ErkJggg=="/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
.page[data-v-9089cc21]{font-family:PingFang SC;-webkit-user-select:none;user-select:none;background-position:0 0;background-repeat:no-repeat;background-size:cover;color:#fff;line-height:1}.nav[data-v-9089cc21]{position:relative}.nav[data-v-9089cc21]:before{top:-48px}.nav .activeChildren:hover a[data-v-9089cc21],.nav .activeChildren:hover span[data-v-9089cc21]{text-decoration:underline}.nav[data-v-9089cc21]:after{bottom:-49px;transform:rotate(-90deg)}.nav.active[data-v-9089cc21]{color:#002fa7;background-color:#fff}.nav.active a[data-v-9089cc21]{color:#002fa7}.nav.active[data-v-9089cc21]:before,.nav.active[data-v-9089cc21]:after{opacity:1}.nav.actives[data-v-9089cc21]{padding:0!important;color:#002fa7;background-color:#ffffff4d}.nav.actives a[data-v-9089cc21]{color:#002fa7}.nav.actives[data-v-9089cc21]:before,.nav.actives[data-v-9089cc21]:after{opacity:1}.nav.actives .onActive[data-v-9089cc21]{background-color:#fff;border-radius:32px 0 0 32px;padding:24px 36px}.main[data-v-9089cc21]{background-image:url(/assets/bg-rs-main-5a93bda9.svg);background-position:0 0;background-repeat:repeat-x;background-size:auto}[data-v-9089cc21]::-webkit-scrollbar{display:none;scrollbar-width:none}

View File

@ -0,0 +1 @@
.top[data-v-605d84d7]{position:absolute;right:30px;top:-92px}[data-v-605d84d7]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-605d84d7]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-605d84d7]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 192 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,828 @@
<template>
<HomeHead class="top"></HomeHead>
<div class="flex w-full h-full">
<AppBlock class="w-full p30px text-#000">
<div class="font-600 flex items-center">
<!-- <img src="./images/logo.svg" class="h56px mr21px" /> -->
<div class="text-36px text-#000">差别化云空间</div>
</div>
<el-tabs type="card" v-model="activeName" class="menu_styl h50px mt30px text-20px" @tab-click="handleClick">
<el-tab-pane name="first" class="menu_styl">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px my40px ">顶部列表</span>
</span>
</template>
<div class="p30px cont relative w100% h800px overflow-y-auto mb-80px">
<div v-for="item in dataC" class="my20px bg-#f5f5f5 rounded-15px items-center flex w-full min-h200px">
<img :src="item.url" class="max-w250px max-h350px min-w250px" />
<span class="ml40px text-20px min-w845px max-w845px">
<span>标&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题: {{ item.title }}</span><br><br><br>
<span>相关文件: <span v-if="item.fileList[0]">{{ item.fileList[0].name}}</span></span>
</span>
<div class="w200px ml30px">
<el-button size="small" type="primary" @click="handleEditC(item)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteC(item)">删除</el-button>
</div>
</div>
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
<el-button type="primary" @click="handleEditC(editC)" >新增列表内容</el-button>
<el-button type="primary" @click="getUser(1)" > 查看范围</el-button>
</div>
</div>
</el-tab-pane>
<el-tab-pane name="niandu" class="menu_styl">
<template #label>
<span class="custom-tabs-label ">
<span class="text-20px ">大标题1</span>
</span>
</template>
<div class="p30px cont relative w100% h800px overflow-y-auto">
<div v-for="item in dataA" class="my20px bg-#f5f5f5 rounded-15px flex w-full ">
<div>
<img :src="item.url" class="max-w180px max-h350px min-w180px" />
</div>
<div class="min-w600px mt50px text-18px">
<span class="ml40px text-20px ">底部大标题: {{ item.titles }}</span>
<br><br> <br><br>
<span class="ml40px text-20px mt40px">标&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题: {{ item.title }}</span>
<br><br> <br><br>
<span class="ml40px text-20px mt40px">位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;置: {{ item.indexId ==='1'?'左边内容':'右边内容' }}</span>
</div>
<div class="max-w100px min-w100px mt120px">
<span class=" text-18px ">文件列表:</span>
</div>
<div class="max-w250px min-w250px mt25px flex items-center">
<sapn v-if="item.fileList" v-for="i in item.fileList" ><span class="mt5px">{{i.name}}</span><br><br></sapn>
</div>
<div class="w160px ml30px mt120px">
<el-button size="small" type="primary" @click="handleEditA(item)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteA(item)">删除</el-button>
</div>
</div>
<!-- <el-button type="primary" @click="handleEditA(editA)" class="my20px fixed bottom-30px left-20% z-2000">新增年度内容</el-button> -->
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
<el-button type="primary" @click="handleEditA(editA)" >新增列表内容</el-button>
<el-button type="primary" @click="getUser(2)" @CloseThis="CloseThiss" > 查看范围</el-button>
</div>
</div>
</el-tab-pane>
<el-tab-pane name="second" class="menu_styl">
<template #label>
<span class="custom-tabs-label ">
<span class="text-20px ">大标题2</span>
</span>
</template>
<div class="p30px cont relative w100% h800px overflow-y-auto">
<div v-for="item in dataB" class="my20px bg-#f5f5f5 rounded-15px flex w-full ">
<div>
<img :src="item.url" class="max-w180px max-h350px min-w180px" />
</div>
<div class="min-w600px mt50px">
<span class="ml40px text-20px ">底部大标题: {{ item.titles }}</span>
<br><br> <br><br>
<span class="ml40px text-20px mt40px">标&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题: {{ item.title }}</span>
<br><br> <br><br>
<span class="ml40px text-20px mt40px">位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;置: {{ item.indexId ==='1'?'左边内容':'右边内容' }}</span>
</div>
<div class="max-w100px min-w100px mt120px">
<span class=" text-20px ">文件列表:</span>
</div>
<div class="max-w250px min-w250px mt20px flex items-center">
<sapn v-if="item.fileList" v-for="i in item.fileList" ><span class="mt5px">{{i.name}}</span><br><br></sapn>
</div>
<div class="w120px ml30px mt120px">
<el-button size="small" type="primary" @click="handleEditB(item)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDeleteB(item)">删除</el-button>
</div>
</div>
<div class="my20px fixed bottom-25px left-20% z-2000 h50px w-full">
<el-button type="primary" @click="handleEditB(editB)" >新增列表内容</el-button>
<el-button type="primary" @click="getUser(3)" > 查看范围</el-button>
</div>
</div>
</el-tab-pane>
<el-tab-pane name="fourth" class="menu_styl">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">研究方向</span>
</span>
</template>
<div class="p30px cont relative w100% h800px overflow-y-auto">
<Modify></Modify>
<!-- <el-button type="primary" @click="handleEditC(editC)" class="my20px absolute bottom-0px left-0px">新增列表内容</el-button> -->
</div>
</el-tab-pane>
<el-tab-pane name="pro" class="menu_styl">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">PRO成员</span>
</span>
</template>
<ModifyPor/>
</el-tab-pane>
<el-tab-pane name="list" class="menu_styl">
<template #label>
<span class="custom-tabs-label">
<span class="text-20px">解决方案列表</span>
</span>
</template>
<ModifyList/>
</el-tab-pane>
</el-tabs>
</AppBlock>
</div>
<n-modal v-model:show="shomkC">
<div class="bg-#FFF p30px">
<el-form :model="editC" label-width="120px" :inline="true">
<el-form-item label="标题">
<el-input v-model="editC.title" />
</el-form-item>
<br>
<!-- <el-form-item label="所属类型">
<n-select class="min-w220px" size="large" v-if="options" v-model:value="editC.catId" :options="options" label-field="cateName" value-field="id" />
</el-form-item> -->
<br>
<el-form-item label="图片">
<el-upload v-model:file-list="editC.files" :headers="header" action="/test-api/common/upload"
list-type="picture-card" :on-success="handlePreview" :on-remove="handleRemove"
:before-upload="onUpload" :limit="1">
<el-icon>
<Plus />
</el-icon>
</el-upload>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</el-form-item>
<br>
<el-form-item label="文件" v-if="editC.fileList">
<el-upload v-model:file-list="editC.fileList" class="upload-demo" :headers="header"
action="/test-api/common/upload" :limit="1">
<el-button type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-form-item>
<el-button type="primary" @click="onSubmitC(editC)">确认</el-button>
</el-form-item>
</div>
</n-modal>
<n-modal v-model:show="shomkB">
<div class="bg-#FFF p30px">
<el-form :model="editC" label-width="120px" :inline="true">
<el-form-item label="名字">
<el-input v-model="fuckList.title" />
</el-form-item>
<br>
<el-form-item label="照片">
<el-upload v-model:file-list="fuckList.files" :headers="header" action="/test-api/common/upload"
list-type="picture-card" :on-success="handlePreviews" :on-remove="handleRemove" :on-error="handErro"
:on-exceed="handOnExceed" :limit="1">
<el-icon>
<Plus />
</el-icon>
</el-upload>
<br>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</el-form-item>
<br>
<el-form-item label="职位">
<el-input v-model="fuckList.time" />
</el-form-item>
<br>
<el-form-item label="研究方向">
<el-input v-model="fuckList.dowhat" />
</el-form-item>
<br>
<el-form-item label="文件">
<el-upload v-model:file-list="fuckList.fileList" class="upload-demo" :before-upload="beforeUpload"
:headers="header" action="/test-api/common/upload">
<el-button type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-form-item>
<el-button type="primary" @click="onSubmits(fuckList)">确认</el-button>
</el-form-item>
</div>
</n-modal>
<n-modal v-model:show="shomkA">
<div class="bg-#FFF p30px">
<el-form :model="editA" label-width="120px" :inline="true">
<el-form-item label="底部大标题">
<el-input v-model="editA.titles" />
</el-form-item>
<br />
<el-form-item label="标题">
<el-input v-model="editA.title" />
</el-form-item>
<br>
<!-- <el-form-item label="编辑模块">
<el-radio-group v-model="editA.indexId" class="ml-4">
<el-radio label="1" size="large">左侧内容</el-radio>
<el-radio label="2" size="large">解决方案创造</el-radio>
<el-radio label="2" size="large">右侧内容</el-radio>
</el-radio-group>
</el-form-item>
<br> -->
<el-form-item label="封面图">
<el-upload v-model:file-list="editA.files" :headers="header" action="/test-api/common/upload"
list-type="picture-card" :on-success="handlePreview1" :on-remove="handleRemove" :on-error="handErro"
:on-exceed="handOnExceed" :limit="1">
<el-icon>
<Plus />
</el-icon>
</el-upload>
<br>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</el-form-item>
<br>
<el-form-item label="文件">
<el-upload v-model:file-list="editA.fileList" class="upload-demo" :headers="header"
action="/test-api/common/upload" :on-change="handleChange">
<el-button type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-form-item class="">
<el-button type="primary" class="w88px justify-center" @click="onSubmitA(editA)">确认</el-button>
</el-form-item>
</div>
</n-modal>
<n-modal v-model:show="shomkD">
<div class="bg-#FFF p30px">
<el-form :model="editB" label-width="120px" :inline="true">
<el-form-item label="底部大标题标题">
<el-input v-model="editB.titles" />
</el-form-item>
<br />
<el-form-item label="标题">
<el-input v-model="editB.title" />
</el-form-item>
<br>
<el-form-item label="封面图">
<el-upload v-model:file-list="editB.files" :headers="header" action="/test-api/common/upload"
list-type="picture-card" :on-success="handlePreview2" :on-remove="handleRemove" :on-exceed="handOnExceed"
:limit="1">
<el-icon>
<Plus />
</el-icon>
</el-upload>
<br>
<el-dialog v-model="dialogVisible">
<img w-full :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
</el-form-item>
<br>
<el-form-item label="文件">
<el-upload v-model:file-list="editB.fileList" class="upload-demo" :headers="header"
action="/test-api/common/upload" :on-change="handleChange">
<el-button type="primary">选择文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<hr class="mb15px border-#f1f1f1">
<el-form-item>
<el-button type="primary" @click="onSubmitB(editB)">确认</el-button>
</el-form-item>
</div>
</n-modal>
<n-modal v-model:show="showModal">
<UserList :userDataList="setUserList" @clickChild="handleChild" @CloseThis="CloseThiss"/>
</n-modal>
</template>
<script setup lang="ts">
import AppBlock from '@/components/AppBlock.vue'
import { useMessage, NModal, NSelect, NSpace } from 'naive-ui'
import HomeHead from '@/views/home/components/HomeHead.vue'
import { Plus } from '@element-plus/icons-vue'
import type { UploadProps, UploadUserFile } from 'element-plus'
import { useUserStore } from '@/stores/modules/user'
import { getLabActList, getLabCsrActList, addLab, getCateList } from '@/api/daikin/base'
import Modify from './modifys.vue'
import ModifyPor from './modify.vue'
import ModifyList from './component/modify.vue'
import UserList from '@/views/home/intelligence/process/UserPages.vue'
const ids = ref('')
const { push } = useRouter()
const store = useUserStore()
const message = useMessage()
const header = { 'token': store.user.token }
const dialogImageUrl = ref('')
const dialogVisible = ref(false)
const dataA = ref([])
const dataB = ref([])
const dataC = ref([])
const dataD = ref([])
const dataE = ref([])
const options = ref([])
const editC = ref()
const editD = ref()
const editA = ref()
const editB = ref()
const shomkA = ref(false)
const shomkB = ref(false)
const shomkC = ref(false)
const shomkD = ref(false)
const handleClick = (tab: TabsPaneContext, event: Event) => {
// console.log(tab, event)
}
const activeName = ref('first')
/**"memberContentIsSelect": 1, //成员是否有权限 1是 2否
* "bannerContentIsSelect": 2, //banner是否有权限 1是 2否
* "leftContentIsSelect": 1, //左大是否有权限 1是 2否
* "rightContentIsSelect": 1, //右大是否有权限 1是 2否
* "actTopIsSelect": 2, //基础研究方向 第一条分类 是否有权限 1是 2否
"actMidIsSelect": 2, //基础研究方向 第二条分类 是否有权限 1是 2否
"actDownIsSelect": 2 //基础研究方向 第三条分类 是否有权限 1是 2否
*/
const memberUserLists =ref()
const leftUserLists =ref()
const rightUserLists =ref()
const bannerUserLists =ref()
const bannerContentUserLists = ref()
const leftContentUserLists = ref()
const rightContentUserLists = ref()
onMounted(async () => {
getData();
})
async function getData() {
// const { data: datas } = await getLabCsrActList()
const { data } = await getLabActList()
const {id,memberContent,bannerContent,leftContent,rightContent,leftUserList,rightUserList,memberUserList,bannerUserList,bannerContentUserList,leftContentUserList,rightContentUserList} = data
// const { data: dataBot } = await getCateList({ indexId: 1 })
memberUserLists.value = memberUserList
leftUserLists.value = leftUserList
rightUserLists.value = rightUserList
bannerUserLists.value = bannerUserList
bannerContentUserLists.value = bannerContentUserList
leftContentUserLists.value = leftContentUserList
rightContentUserLists.value = rightContentUserList
// options.value = dataBot
ids.value = id
// console.log(dataBot,options.value)
if (leftContent && leftContent.length > 0) {
dataA.value = leftContent.map((obj: any, indx: number) => ({
...obj,
id: indx + 1
}))
}
// dataB.value = B
if (rightContent && rightContent.length > 0) {
dataB.value = rightContent.map((obj: any, indx: number) => ({
...obj,
id: indx + 1
}))
}
// dataC.value = bannerContent
// dataD.value = D
if (bannerContent && bannerContent.length > 0) {
dataC.value = bannerContent.map((obj: any, indx: number) => ({
...obj,
id: indx + 1
}))
}
if (memberContent) {
dataD.value = memberContent
}
userList.value =data.userIdList
// console.log( fuckList.value)
}
async function modify(objA: any,objB: any,objC: any,objD: any,objE: any,objF: any,objG: any,objH: any) {
const leftContent = unref(objA)
const rightContent = unref(objB)
const bannerContent = unref(objC)
const memberContent = unref(objD)
const bannerUserList =unref(objE)
const leftUserList =unref(objF)
const rightUserList =unref(objG)
const memberUserList =unref(objH)
const id = ids.value
// if(!userList.value){
// message.info("请选择通知范围")
// return
// }
const userIdList = userList.value
console.log(bannerContent)
const { code, msg } = await addLab({ id,bannerUserList,leftUserList,rightUserList,memberUserList, memberContent,bannerContent,rightContent,leftContent })
if (code === 200) { message.success("修改成功") }
else message.warning(msg)
// window.location.reload();
getData();
}
// async function onSubmitD(row: { id: number; url: any; title: string; time: string; files: never[]; fileList: never[] }) {
// console.log(swiperList.value, row.id)
// swiperList.value.map(obj => {
// obj.id === row.id ? { ...obj, ...row } : obj
// // console.log(i.id)
// })
// const existingIds = swiperList.value.map(obj => obj.id);
// if (!existingIds.includes(row.id)) {
// if (row.id === '') {
// row.id = Math.floor(Math.random() * 100)
// }
// if (!row.catId) {
// message.error("所属类型必选!")
// return
// }
// swiperList.value.push(row);
// }
// shomkB.value = false
// console.log(swiperList.value)
// }
async function onSubmitA(row: { id: string | number; indexId: any }) {
dataA.value.map(obj=>{
obj.id === row.id ? { ...obj, ...row } : obj
// console.log(i.id)
})
const existingIds = dataA.value.map(obj => obj.id);
if (!existingIds.includes(row.id)) {
if(row.id===''){
row.id = Math.floor(Math.random() * 100)
}
if(!row.indexId){
message.error("所属类型必选!")
return
}
dataA.value.push(row);
}
shomkA.value = false
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
}
async function onSubmitB(row: { id: number; url: any; title: string; time: string; files: never[]; fileList: never[] }) {
// console.log(dataB.value, row.id)
dataB.value.map(obj => {
obj.id === row.id ? { ...obj, ...row } : obj
// console.log(i.id)
})
const existingIds = dataB.value.map(obj => obj.id);
if (!existingIds.includes(row.id)) {
if (row.id === '') {
row.id = Math.floor(Math.random() * 100)
}
dataB.value.push(row);
}
shomkD.value = false
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
}
async function onSubmitC(row: any) {
// console.log(row)
dataC.value.map(obj=>{
obj.id === row.id ? { ...obj, ...row } : obj
// console.log(i.id)
})
const existingIds = dataC.value.map(obj => obj.id);
if (!existingIds.includes(row.id)) {
if(row.id===''){
row.id = Math.floor(Math.random() * 100)
}
// if(!row.catId){
// message.error("所属类型必选!")
// return
// }
dataC.value.push(row);
}
shomkC.value = false
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
// console.log(dataC.value)
}
const handleEditC = (row: any) => {
// console.log(row)
if (row && row.url) {
// console.log(row.files.length)
if (row.files.length <= 0) {
row.files.push({ url: row.url });
}
else {
row.files.map(i => {
i.url = i.response.url
})
}
}
else {
editC.value = {
id: '',
url: '',
title: '',
time: '',
createTime:date,
files: [],
fileList: [],
}
}
shomkC.value = true
if (!row) return
editC.value = row
console.log(editC.value)
}
const date = new Date()
const handleEditA = (row: any) => {
// console.log(row)
if (row && row.url) {
// console.log(row.files.length)
if (row.files.length <= 0) {
row.files.push({ url: row.url });
}
else {
row.files.map(i => {
i.url = i.response.url
})
}
}
else {
editA.value = {
id: '',
url: '',
title: '',
titles: '',
indexId:'1',
files: [],
fileList: []
}
}
shomkA.value = true
if (!row) return
editA.value = row
// console.log(editA.value)
}
const handleEditB = (row: any) => {
// console.log(row)
if (row && row.url) {
// console.log(row.files.length)
if (row.files.length <= 0) {
row.files.push({ url: row.url });
}
else {
row.files.map(i => {
i.url = i.response.url
})
}
}
else {
editB.value = {
id: '',
url: '',
titles: '',
title: '',
time: '',
files: [],
fileList: [],
show: false,
}
}
shomkD.value = true
if (!row) return
editB.value = row
// console.log(editB.value)
}
const handleDeleteA = (row: any) => {
// console.log(dataA.value, row)
dataA.value = dataA.value.filter(item => item.id !== row.id);
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
}
const handleDeleteB = (row: any) => {
// console.log(dataB.value, row)
dataB.value = dataB.value.filter(item => item.id !== row.id);
}
const handleDeleteC = (row: any) => {
dataC.value = dataC.value.filter(item => item.id !== row.id);
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
}
const handleRemove: UploadProps['onRemove'] = (uploadFile: any, uploadFiles: any) => {
// console.log(uploadFile, uploadFiles)
}
const handOnExceed: UploadProps['onExceed'] = (uploadFile: any, uploadFiles: any) => {
message.warning("最多只能上传一张图片!")
}
const handlePreview: UploadProps['onSuccess'] = (uploadFile: any) => {
// console.log(uploadFile.url)
if(uploadFile.code ===200){
editC.value.url = uploadFile.url
}
else{
message.warning(uploadFile.msg)
return
}
}
const handlePreview1: UploadProps['onSuccess'] = (uploadFile: any) => {
// console.log("++++++++++++++++++++++++++++")
// console.log(uploadFile,editA.value)
if(uploadFile.code ===200){
editA.value.url = uploadFile.url
}
else{
message.warning(uploadFile.msg)
return
}
}
const handlePreview2: UploadProps['onSuccess'] = (uploadFile: any) => {
// console.log("++++++++++++++++++++++++++++")
if(uploadFile.code ===200){
editB.value.url = uploadFile.url
}
else{
message.warning(uploadFile.msg)
return
}
}
const beforeUpload=(file: { type: string })=> {
// Validate the file type before uploading
const isPDF = file.type === 'application/pdf';
if (!isPDF) {
message.error('仅支持PDF文件上传');
}
return isPDF;
}
const onUpload: UploadProps['onUpload'] = (uploadFile: any) => {
// console.log("++++++++++++++++++++++++++++")
// message.warning(uploadFile)
// dataB.value.url = uploadFile.url
}
const userList = ref()
const showModal = ref(false)
const flg = ref()
const setUserList =ref()
const getUser=(id: any)=>{
showModal.value = !showModal.value
flg.value = id
if(id===1){
setUserList.value = bannerContentUserLists.value
}
else if(id===2){
setUserList.value = leftContentUserLists.value
}
else if(id===3){
setUserList.value = rightContentUserLists.value
}
}
// 获取子组件传过来的值
const handleChild = (data: any) => {
const { showModal: show, multipleSelection } = data
showModal.value = unref(show)
// userList.value = multipleSelection
let userIdList: any[] =[]
multipleSelection.value.forEach((i: { userId: any })=>{
// console.log(dataList.value)
userIdList.push(i.userId)
})
if(flg.value===1){
bannerUserLists.value= userIdList
}
else if(flg.value===2){
leftUserLists.value = userIdList
}
else if(flg.value===3){
rightUserLists.value = userIdList
}
modify(dataA.value,dataB.value,dataC.value,dataD.value,bannerUserLists.value,leftUserLists.value,rightUserLists.value,memberUserLists.value)
}
const CloseThiss = (data: boolean)=>{
showModal.value = data
}
</script>
<style lang="less">
.el-form-item__content{
justify-content: center;
}
::-webkit-scrollbar{
width: 1px;
}
.demo-tabs > .el-tabs__content {
padding: 32px;
color: #6b778c;
font-size: 32px;
font-weight: 600;
}
.cont {
img {
background-color: antiquewhite;
}
}
.custom-tabs-label {
padding: 30px;
}
.top {
position: absolute;
right: 30px;
top: -92px;
}
</style>

View File

@ -0,0 +1 @@
const i='a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])',a=t=>getComputedStyle(t).position==="fixed"?!1:t.offsetParent!==null,c=t=>Array.from(t.querySelectorAll(i)).filter(e=>u(e)&&a(e)),u=t=>{if(t.tabIndex>0||t.tabIndex===0&&t.getAttribute("tabIndex")!==null)return!0;if(t.disabled)return!1;switch(t.nodeName){case"A":return!!t.href&&t.rel!=="ignore";case"INPUT":return!(t.type==="hidden"||t.type==="file");case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}},d=t=>!t.getAttribute("aria-owns"),l=(t,e,s)=>{const{parentNode:n}=t;if(!n)return null;const r=n.querySelectorAll(s),o=Array.prototype.indexOf.call(r,t);return r[o+e]||null},f=t=>{t&&(t.focus(),!d(t)&&t.click())};export{f,l as g,d as i,c as o};

View File

@ -0,0 +1,799 @@
<script setup lang="ts">
import VChart from 'vue-echarts'
import { useChart1, useChart22, useChart21, useChart3, useChart23 } from './HomeData'
import AppHeadUserInfo from '@/components/AppHeadUserInfo.vue'
import { NSelect } from 'naive-ui'
import News from './components/New.vue'
import { homePageMarket, homePageRate, report, getHomeList ,amountList} from '@/api/daikin/base'
import { useUserStore } from "@/stores/modules/user";
const store = useUserStore();
const isUpPwds =ref(false)
const userCode =ref(false)
watchEffect(()=>{
userCode.value = ['admin', 'cd_dandang', 'tech_service'].includes(store.user.roleCode)
isUpPwds.value = store.user.isUpPwd ===2?true:false
})
const activeCard5NavKey = ref('DIS')
const Card5Navs = [
{ key: 'DIS', name: 'DIS' },
{ key: 'DSZ', name: 'DSZ' },
{ key: 'DISH', name: 'DISH' },
]
const ailists = ref()
const culists = ref()
const itemLists = ref()
const timeA = ref()
const timeB = ref()
const disList = ref([{}, {}, {}, {}]);
const dszList = ref([{}, {}, {}, {}]);
const dishList = ref([{}, {}, {}, {}]);
const month_1 = ref();
const month_2 = ref();
let now = (new Date()).getMonth() + 13;
month_2.value = (now - 2) % 12;
month_1.value = (now - 1) % 12;
const dataDIS = ref()
const dataDSZ = ref()
const dataDISH = ref()
const addDSZ1 = ref()
const addDIS1 = ref()
const addDISH1 = ref()
const addDSZ2 = ref()
const addDIS2 = ref()
const addDISH2 = ref()
const addDSZ3 = ref()
const addDIS3 = ref()
const addDISH3 = ref()
onMounted(async () => {
const { data: { ailist, culist, lastUTime } } = await homePageMarket() //市况
const { data: { itemList, lastUTime: _lastUTime } } = await homePageRate() //汇率
const { data: _disList } = await getHomeList({number: "DIS"}) //汇率
const { data: _dszList } = await getHomeList({number: "DSZ"}) //汇率
const { data: _dishList } = await getHomeList({number: "DISH"}) //汇率
const { data:fazhu} = await amountList()
fazhu.forEach((i: { number: string; amount: any }) => {
if(i.number=='DIS'){
dataDIS.value = i.amount
}
if(i.number=='DSZ'){
dataDSZ.value = i.amount
}
if(i.number=='DISH'){
dataDISH.value = i.amount
}
});
ailists.value = ailist
culists.value = culist
itemLists.value = itemList
timeA.value = lastUTime
timeB.value = _lastUTime
disList.value = _disList
dszList.value = _dszList
dishList.value = _dishList
addDIS1.value = _disList.reduce((previousValue: any, currentValue: { budget: any }) => {
const sum =parseFloat (currentValue.budget) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDSZ1.value = _dszList.reduce((previousValue: any, currentValue: { budget: any }) => {
const sum = parseFloat(currentValue.budget) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDISH1.value = _dishList.reduce((previousValue: any, currentValue: { budget: any }) => {
const sum = parseFloat(currentValue.budget) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDIS2.value = _disList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDSZ2.value = _dszList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDISH2.value = _dishList.reduce((previousValue: any, currentValue: { monthOne: any }) => {
const sum = parseFloat(currentValue.monthOne) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDIS3.value = _disList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDSZ3.value = _dszList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
addDISH3.value = _dishList.reduce((previousValue: any, currentValue: { monthTwo: any }) => {
const sum = parseFloat(currentValue.monthTwo) +parseFloat(previousValue)
return sum>0 ? sum.toFixed(2):0
}, 0)
if(isUpPwds.value){
ElMessageBox.alert('为了您的帐号安全,首次登录必须更改初始密码', '重要提醒',
{
confirmButtonText: 'OK',
showClose:false,
showCancelButton:false,
}).then(()=>{
push({ name: 'modifys' })
})
}
})
const { push } = useRouter()
const route = useRoute()
const timeNow = useDateFormat(useNow(), 'YYYY-MM-DD')
const { chartRef: chartRef1, option: chartOption1 } = useChart1()
const { chartRef: chartRef2, option: chartOption2,state } = useChart21()
const { chartRef: chartRef22, option: chartOption22 } = useChart22()
const { chartRef: chartRef23, option: chartOption23 } = useChart23()
const { chartRef: chartRef3, option: chartOption3 } = useChart3()
const displayDiffValue = (diffValue: number) => {
if (diffValue > 0) {
return `+${diffValue} %`;
} else if (diffValue < 0) {
return `-${Math.abs(diffValue)} %`;
} else {
return `${diffValue} %`;
}
}
async function setModule(codes: any, names: any) {
const moduleCode = codes
console.log(codes, names)
push({ name: names })
const { code } = await report({ moduleCode })
}
const selectData = ref("原材料")
const option = [{
label: '全部数据',
value: 'quanbu'
},{
label: '原材料',
value: 'yuancailiao'
},
{
label: '加工品',
value: 'jiagongping'
},
{
label: '机能部品',
value: 'jineng'
},]
const thisSelect = (e) => {
console.log(e)
state.title = e
}
</script>
<template>
<div class="top flex items-center text-20px">
<div class="flex-1 font-800 text-30px"></div>
<AppHeadUserInfo />
</div>
<div class="page-wrapper h-full flex-1 flex flex-col flex-wrap">
<div class="font-800 text-30px mt39px">FY23年度调达本部方针创新实干勇毅前行以综合实力挑战变革提升存在感</div>
<div class="mt30px flex-1 flex flex-wrap justify-between">
<News></News>
<div class="card cursor-pointer">
<div class="card_title" @click="setModule('App_Market', 'Market')">市况汇率 每日更新</div>
<div class="card_nav card_nav2 !top--3px !right--1px">
<div class=" !text-14px w260px top--4px text-right leading-18px">
出处:市况-SMM/LME<br />
汇率-外汇管理局
</div>
</div>
<!-- <div class="card_sub-title">责任者:调达中心 Device变革T/原材料变革T</div> -->
<div class="card_content">
<!-- <VChart :option="chartOption1" autoresize /> -->
<div class="flex pl15px pr10px pt15px text-#898F9F">
<div class="">
<span class="icoT ">市况</span>
<span class="ml15px text-12px">更新时间:{{ timeA }}</span>
<div class="h150px overflow-auto">
<table class="history w-full text-center mt18px text-16px border-spacing-0 w219px">
<thead
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
<tr class="h41px">
<th>铜</th>
<th>最新</th>
<th>前日差</th>
</tr>
</thead>
<tbody v-if="culists">
<tr class="h45px" v-for="(it, index) in culists" :key="index"
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
<td class=" text-12px">{{ it.channel }}</td>
<td class="text-12px">{{ it.negAmount }}</td>
<td class=" text-12px" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
{{ displayDiffValue(it.diffValue) }}</td>
</tr>
</tbody>
</table>
</div>
<div class="h150px overflow-auto">
<table class="history w-full text-center mt15px text-16px border-spacing-0 overflow-auto w219px">
<thead
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
<tr class="h41px">
<th>铝</th>
<th>最新</th>
<th>前日差</th>
</tr>
</thead>
<tbody v-if="ailists">
<tr class="h45px" v-for="(it, index) in ailists" :key="index"
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
<td class=" text-12px">{{ it.channel }}</td>
<td class="text-12px">{{ it.negAmount }}</td>
<td class=" text-12px" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
{{ displayDiffValue(it.diffValue) }}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="ml10px">
<span class="icoT">汇率</span>
<span class="ml15px text-12px">更新时间:{{ timeB }}</span>
<div class="h282px pt18px">
<table class="history w-full text-center text-16px border-spacing-0 w219px ">
<thead
style="background-color: #417BEF;color: #fff;height: 42px;width: 220px; border: 1px solid #417BEF;">
<tr class="h41px">
<th class="w75px ">币种</th>
<th>最新</th>
<th class="w65px">前日差</th>
</tr>
</thead>
<tbody v-if="itemLists" class="h238px overflow-auto absolute">
<tr class="h60px !text-12px" v-for="(it, index) in itemLists" :key="index"
:class="index % 2 !== 0 ? 'bg-#f9f9f9' : ''">
<td class=" w75px text-center">{{ it.currencyNameFrom }}-{{ it.currencyNameTo }}</td>
<td class=" w85px text-center">{{ it.negAmount }}</td>
<td class=" w65px text-center" :class="it.diffValue < 0 ? 'text-#63BF8D' : 'text-red'">
{{ displayDiffValue(it.diffValue) }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card_title cursor-pointer" @click="setModule('App_data_platform', 'CD')">数据平台</div>
<!-- <div class="card_sub-title">责任者:调达中心 企画变革T</div> -->
<div class="card_nav card_nav1">
<div class="card_nav_item" :class="activeCard5NavKey === i.key && 'active'" v-for="i in Card5Navs" :key="i.name"
@click="() => (activeCard5NavKey = i.key)">
{{ i.name }}
</div>
</div>
<div class="table-container">
<el-button v-if="userCode" type="primary" class="button abs-top" @click="push({ name: 'dataPlatform' })">数据管理</el-button>
<table class="data-table" border v-if="activeCard5NavKey === 'DIS'">
<colgroup>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
<tr class="header">
<th rowspan="2" colspan="2">拠点</th>
<td colspan="3">
<div class="tab-header">
<div class="tb-title">DIS</div>
<div class="tb-subtitle">发注金额:{{dataDIS}}百万元</div>
</div>
</td>
</tr>
<tr class="header">
<td>年初予算</td>
<!-- <td>{{month_2}}月</td> -->
<td>改订</td>
<td>{{month_1}}月</td>
</tr>
<tr>
<th colspan="2">合计</th>
<td>{{addDIS1}}%</td>
<td>{{addDIS2}}%</td>
<td>{{addDIS3}}%</td>
</tr>
<tr>
<th rowspan="2">C/D</th>
<th>交涉</th>
<td :rowspan="disList[0].budget ==disList[1].budget?'2':''">{{disList[0].budget}}%</td>
<td :rowspan="disList[0].monthOne ==disList[1].monthOne?'2':''">{{disList[0].monthOne}}%</td>
<td :rowspan="disList[0].budget ==disList[1].budget?'2':''">{{disList[0].monthTwo}}%</td>
</tr>
<tr>
<th>THEME</th>
<td v-if="disList[1].budget !=disList[0].budget">{{disList[1].budget}}%</td>
<td v-if="disList[1].monthOne !=disList[0].monthOne">{{disList[1].monthOne}}%</td>
<td v-if="disList[1].monthTwo !=disList[0].monthTwo">{{disList[1].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">市况</th>
<td>{{disList[2].budget}}%</td>
<td>{{disList[2].monthOne}}%</td>
<td>{{disList[2].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">為替レート</th>
<td>{{disList[3].budget}}%</td>
<td>{{disList[3].monthOne}}%</td>
<td>{{disList[3].monthTwo}}%</td>
</tr>
</table>
<table class="data-table" border v-if="activeCard5NavKey === 'DSZ'">
<colgroup>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
<tr class="header">
<th rowspan="2" colspan="2">抛点</th>
<td colspan="3">
<div class="tab-header">
<div class="tb-title">DSZ</div>
<div class="tb-subtitle">发注金额:{{dataDSZ}}百万元</div>
</div>
</td>
</tr>
<tr class="header">
<td>年初予算</td>
<!-- <td>{{month_2}}月</td> -->
<td>改订</td>
<td>{{month_1}}月</td>
</tr>
<tr>
<th colspan="2">合计</th>
<td>{{addDSZ1}}%</td>
<td>{{addDSZ2}}%</td>
<td>{{addDSZ3}}%</td>
</tr>
<tr>
<th rowspan="2">C/D</th>
<th>交涉</th>
<td :rowspan="dszList[0].budget ==dszList[1].budget?'2':''">{{dszList[0].budget}}%</td>
<td :rowspan="dszList[0].monthOne ==dszList[1].monthOne?'2':''">{{dszList[0].monthOne}}%</td>
<td :rowspan="dszList[0].monthTwo ==dszList[1].monthTwo?'2':''">{{dszList[0].monthTwo}}%</td>
</tr>
<tr>
<th>THEME</th>
<td v-if="dszList[1].budget !=dszList[0].budget">{{dszList[1].budget}}%</td>
<td v-if="dszList[1].monthOne !=dszList[0].monthOne">{{dszList[1].monthOne}}%</td>
<td v-if="dszList[1].monthTwo !=dszList[0].monthTwo">{{dszList[1].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">市况</th>
<td>{{dszList[2].budget}}%</td>
<td>{{dszList[2].monthOne}}%</td>
<td>{{dszList[2].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">為替レート</th>
<td>{{dszList[3].budget}}%</td>
<td>{{dszList[3].monthOne}}%</td>
<td>{{dszList[3].monthTwo}}%</td>
</tr>
</table>
<table class="data-table" border v-if="activeCard5NavKey === 'DISH'">
<colgroup>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
<tr class="header">
<th rowspan="2" colspan="2">抛点</th>
<td colspan="3">
<div class="tab-header">
<div class="tb-title">DISH</div>
<div class="tb-subtitle">发注金额:{{dataDISH}}百万元</div>
</div>
</td>
</tr>
<tr class="header">
<td>年初予算</td>
<!-- <td>{{month_2}}月</td> -->
<td>改订</td>
<td>{{month_1}}月</td>
</tr>
<tr>
<th colspan="2">合计</th>
<td>{{addDISH1}}%</td>
<td>{{addDISH2}}%</td>
<td>{{addDISH3}}%</td>
</tr>
<tr>
<th rowspan="2">C/D</th>
<th>交涉</th>
<td :rowspan="dishList[0].budget ==dishList[1].budget?'2':''">{{dishList[0].budget}}%</td>
<td :rowspan="dishList[0].monthOne ==dishList[1].monthOne?'2':''">{{dishList[0].monthOne}}%</td>
<td :rowspan="dishList[0].monthTwo ==dishList[1].monthTwo?'2':''">{{dishList[0].monthTwo}}%</td>
</tr>
<tr>
<th>THEME</th>
<td v-if="dishList[1].budget !=dishList[0].budget">{{dishList[1].budget}}%</td>
<td v-if="dishList[1].monthOne !=dishList[0].monthOne">{{dishList[1].monthOne}}%</td>
<td v-if="dishList[1].monthTwo !=dishList[0].monthTwo">{{dishList[1].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">市况</th>
<td>{{dishList[2].budget}}%</td>
<td>{{dishList[2].monthOne}}%</td>
<td>{{dishList[2].monthTwo}}%</td>
</tr>
<tr>
<th colspan="2">為替レート</th>
<td>{{dishList[3].budget}}%</td>
<td>{{dishList[3].monthOne}}%</td>
<td>{{dishList[3].monthTwo}}%</td>
</tr>
</table>
<!-- <img src="@/assets/images/xiaogouzi1.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DSZ'"/>
<img src="@/assets/images/xiaogouzi2.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DISH'"/> -->
<!-- <img src="@/assets/images/xiaogouzi3.jpg" class="w-full h-full cover" v-if="activeCard5NavKey === 'DIS'"/> -->
</div>
<!-- <div class="card_content">
<VChart ref="chartRef3" :option="chartOption3" autoresize />
</div> -->
</div>
<div class="card cursor-pointer" @click="setModule('App_BCP', 'BCP')">
<div class="card_title">调达BCP管理</div>
<div class="card_sub-title">责任者:调达中心 加工品变革T</div>
<div class="card_content">
<img src="@/assets/images/img-11.png" class="w-full h-full object-cover" />
</div>
</div>
<div class="card cursor-pointer relative">
<!-- <img src="@/assets/images/img-42.png" class="absolute top-10px right-0" /> -->
<div class="card_title" @click="setModule('App_CSR', 'CSR')">SCM碳中和活动</div>
<div class="card_sub-title" @click="setModule('App_CSR', 'CSR')">责任者:调达研究院 调达机能研究T</div>
<div class="card_content px20px" @click="setModule('App_CSR', 'CSR')">
<img src="../../assets/images/scmtzh@2x.png" class="w-full h-96% cover"/>
<!-- <div class="flex text-center">
<div class="bg-#F4F8FF text-#000 h30px w-full pt5px font-bold">F25碳减排目标 <el-icon class="!text-#004DE1">
<CaretTop />
</el-icon>30%</div>
<div class="bg-#F4F8FF text-#000 h30px w-full pt5px font-bold">F23碳减排目标 <el-icon class="!text-#004DE1">
<CaretTop />
</el-icon>15%</div>
</div>
<div class="flex text-center">
<div class=" text-#677BB2 h30px w-full pt5px font-500">供方碳排放推移表</div>
<div class=" text-#677BB2 h30px w-full pt5px font-500 flex"><span>重点供方碳排放情况</span>
<n-select v-model:value="selectData" :options="option" class="w80px !text-12px h20px mt--4px" :show-checkmark="false" size="tiny"
@update:value="thisSelect" />
</div>
</div>
<div class="flex w-full h-full">
<div class="w150px h-full">
<VChart :option="chartOption1" />
</div>
<div class="w280px h275px overflow-y-auto">
<VChart :option="chartOption2" />
</div>
</div> -->
<!-- <div class="mt25px text-#142142"> -->
<!-- <img src="@/assets/images/tiad@2x.png" class="w100% h96%" /> -->
<!-- <div class="text-#002fa7 text-18px">大金中国调达本部紧扣大金集团2050愿景中CO2“零”排放目标展开调达碳中和活动</div>
<AppNewsBox class="mt10px" text="脱碳素供应链管理(原材料排放,部品加工·部品运输过程中的排放)
空调解决方案(部品碳足迹管理,贩促活动,案例情报共享)" date="2023-05-22" /> -->
<!-- </div> -->
<!-- <div class="mt25px text-#142142">
<div class="text-#002fa7 text-18px">人材育成</div>
<AppNewsBox class="mt10px" text="FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来" date="2023-05-22" />
</div>
<div class="mt25px text-#142142">
<div class="text-#002fa7 text-18px">工作模式变革</div>
<AppNewsBox class="mt10px" text="FY22年度集团新年方针:领先时代的变化开创崭新的未来变化开 创崭新的未来" date="2023-05-22" />
</div> -->
</div>
</div>
<div class="card topics">
<div class="card_title">重点Theme取组</div>
<div class="card_content p20px pt10px">
<div class="w-full h-full flex flex-wrap content-between justify-between text-18px font-bold">
<div class="item !h-188px cursor-pointer" @click="setModule('App_Quality', 'Quality')">
<div class="item_title">品质</div>
<div class="item_sub-title">责任者:调达中心 加工品变革T</div>
<!-- <img src="@/assets/images/img-45.svg" class="item_img pb13px pr20px" /> -->
<img src="@/assets/images/img-41.png" class="item_img b !bottom--20px" />
</div>
<div class="item !h-188px cursor-pointer" @click="setModule('App_Lab', 'Diffspace')">
<div class="item_title">AI差别化LAB</div>
<div class="item_sub-title">责任者:调达研究院</div>
<div class="item_sub-title">差别化研究T</div>
<img src="@/assets/images/img-43.png" class="item_img" />
</div>
<div class="item !w-full flex flex-col cursor-pointer" @click="push({ name: 'StrategicPlanning' })">
<div class="item_title">战略企划</div>
<div class="item_sub-title">责任者:调达本部 管理G</div>
<!-- <img src="./images/home-1.svg" /> -->
<div class="flex mt20px items-center justify-center">
<div class="bg-#0038BE w210px px15px py7px rounded-30px">
<img src="@/assets/images/biaoq2@2x.png" class="w25px h21px">
重点Theme管理
</div>
<span class="text-#000 font-thin underline-text mx23px">调达研究院</span>
<span class="text-#000 font-thin underline-text">调达中心</span>
<!-- <VChart :option="chartOption2" autoresize /> -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.tab-header {
display: flex;
.tb-title {
margin: 0 auto;
}
.tb-subtitle {
margin-right: 8px;
font-size: 0.75em;
}
}
.table-container {
padding: 0 36px;
padding-top: 40px;
position: relative;
}
.data-table {
width: 100%;
color: #808696;
border-collapse: collapse;
line-height: 2.3rem;
text-align: center;
border-color: #e0e0e0;
background: white;
}
.table-container .abs-top {
position: absolute;
left: 36px;
top: 4px;
}
.data-table tr:nth-child(2n + 1) {
background: #f9f9f9;
}
.data-table th {
background: #f4f5ff;
color: #142142;
}
.data-table tr.header, .data-table tr.header th{
background: #417BEF;
color: white;
}
::-webkit-scrollbar {
width: 1px;
}
::v-deep .n-base-select .n-base-select-option {
font-size: 12px; /* 设置字体大小 */
}
.naive-select .n-select-dropdown {
font-size: 12px; /* 设置字体大小 */
}
.underline-text {
border-bottom: 1px solid black;
padding-bottom: 2px;
}
.icoT {
padding: 5px;
color: #fff;
background-color: #002AAE;
border-radius: 5px;
}
.top {
position: absolute;
right: 30px;
top: -70px;
}
.page-wrapper {
.card {
// width: 480px;
// height: 428px;
width: 480px;
height: 395px;
border-radius: 18px;
overflow: hidden;
background-color: #fff;
// border: 1px solid #e7ebf5;
box-shadow: 1px 2px 12px rgba(14, 86, 221, 0.32);
position: relative;
display: flex;
flex-direction: column;
position: relative;
&::after {
content: ' ';
background-image: url('@/assets/images/bg-card.svg');
pointer-events: none;
display: block;
width: 100%;
height: 127px;
background-size: cover;
position: absolute;
left: 0;
top: -1px;
}
.card_title {
flex-shrink: 0;
font-size: 28px;
color: #142142;
padding: 20px;
padding-bottom: 0;
}
.card_sub-title {
color: rgba(128, 134, 150, 0.8);
font-size: 16px;
padding: 0 20px;
padding-bottom: 0;
margin-top: 10px;
}
.card_nav1 {
background-image: url('@/assets/images/bg-card-nav.svg');
}
.card_nav2 {
background-image: url('@/assets/images/youj@2x.png');
}
.card_nav {
position: absolute;
top: 0;
right: 0;
width: 276px;
height: 66px;
background-position: top right;
background-repeat: no-repeat;
background-size: contain;
font-size: 20px;
color: #fff;
display: flex;
justify-content: space-between;
align-items: flex-end;
padding-left: 38px;
padding-right: 22px;
padding-bottom: 20px;
.card_nav_item {
width: 80px;
height: 36px;
text-align: center;
padding-top: 8px;
cursor: pointer;
&.active {
color: #032fa0;
background-image: url('@/assets/images/bg-card-nav-item.svg');
background-position: bottom;
background-repeat: no-repeat;
background-size: contain;
}
}
}
.card_content {
flex: 1;
margin-top: 10px;
}
}
.topics {
.item {
border-radius: 8px;
width: 210px;
height: 155px;
box-shadow: inset 1.4px 1.4px 0px 0px rgba(255, 255, 255, 0.004);
overflow: hidden;
background-image: url('@/assets/images/bg-card4.svg');
background-position: -2px -2px;
background-repeat: no-repeat;
background-size: 215px 165px;
position: relative;
.item_title {
padding-left: 16px;
padding-top: 22px;
color: #002fa7;
position: relative;
// z-index: 9;
}
.item_sub-title {
color: rgba(128, 134, 150, 0.8);
font-size: 12px;
font-weight: normal;
padding: 0 16px;
padding-bottom: 0;
margin-top: 10px;
z-index: 9;
}
.item_img {
position: absolute;
bottom: -10px;
right: 0;
// z-index: 5;
transition: transform 0.3s;
&:hover {
transform: scale(1.2);
}
}
}
}
.news {
.card_content {
padding: 20px;
padding-top: 0;
}
.news_card {
// width: 442px;
height: 180px;
padding: 16px;
font-size: 14px;
background-repeat: no-repeat;
background-size: 100% 100%;
position: relative;
}
}
}</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,279 @@
import type { EChartsOption } from 'echarts'
import * as echarts from 'echarts'
import { toYearDataList, hisYearDataStat, curYearDataStat, hisDataList, treeList } from '@/api/daikin/base'
export function defineCompont() {
const clickData = reactive<any>({
id: 3
})
const toYearData = ref<any>()
const hisData = ref<any>()
const treeData = ref<any>()
async function getData() {
const { id: cateId } = clickData
const { data } = await toYearDataList({ cateId })
toYearData.value = data
const {data:da2} =await hisDataList({cateId})
hisData.value = da2
}
const ss = computed(() => [clickData.id])
watch(() => unref(ss),
async (v) => {
getData()
},
{ immediate: true, deep: true },
)
return { clickData, toYearData,hisData, getData }
}
export function curYearData() {
const chartRef = ref();
let allData = ref<any[]>([]);
let seriesList = ref<any[]>([]);
const optionRef = ref<any>({});
async function getDataList() {
const { data } = await curYearDataStat({ cateId: 1 })
// 提取所有不重复的name
const uniqueNames = [...new Set(data.flatMap(item => item.data.map(dataItem => dataItem.name)))];
// 运算得到结果
allData = uniqueNames.map(name => {
const values = data.map(item => {
const foundData = item.data.find(dataItem => dataItem.name === name);
return foundData ? parseFloat(foundData.value) : 0;
});
return [name, ...values];
});
seriesList = data.map((item: { name: string }) => {
if (item.name === "柱状图") {
return { type: 'bar' , barWidth: 30,};
} else if (item.name === "折线图") {
return { type: 'line' };
}
});
// console.log(seriesList,allData)
const option = {
width: '528px', // 设置图表宽度为 800 像素
height: '160px', // 设置图表高度为 400 像素
legend: { right: 30 },
title: [
{ text: '数据', left: 12, top: 0, textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 800 } },
],
tooltip: {},
dataset: {
source: allData
},
xAxis: { type: 'category' },
yAxis: [
{
type: 'value',
min: 0,
max: 1000,
},
{
type: 'value',
min: 0,
max: 100,
axisLabel: {
formatter: '{value} %'
}
}
],
series: seriesList
};
optionRef.value = option;
}
getDataList();
watchEffect(() => {
// 在回调函数中使用 optionRef
const option = optionRef.value;
// 更新图表选项
optionRef.value = option;
});
return { chartRef, option: optionRef };
}
export function hisYearData() {
const chartRef = ref();
let allData = ref<any[]>([]);
let seriesList = ref<any[]>([]);
const optionRef = ref<any>({});
const state = reactive<any>({
cateId: 1,
yearTime:'2020'
})
async function getDataList() {
const {cateId,yearTime} = state
const { data } = await hisYearDataStat({ cateId,yearTime})
// 提取所有不重复的name
const uniqueNames = [...new Set(data.flatMap(item => item.data.map(dataItem => dataItem.name)))];
// 运算得到结果
allData = uniqueNames.map(name => {
const values = data.map(item => {
const foundData = item.data.find(dataItem => dataItem.name === name);
return foundData ? parseFloat(foundData.value) : 0;
});
return [name, ...values];
});
seriesList = data.map((item: { name: string }) => {
if (item.name === "柱状图") {
return { type: 'bar' , barWidth: 30,};
} else if (item.name === "折线图") {
return { type: 'line' };
}
});
// console.log(seriesList,allData)
const option = {
width: '528px', // 设置图表宽度为 800 像素
height: '150px', // 设置图表高度为 400 像素
legend: { right: 30, data: ['交涉', 'Theme'],},
title: [
{ text: '数据', left: 12, top: 0, textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 800 } },
],
tooltip: {},
dataset: {
source: allData
},
xAxis: { type: 'category' },
yAxis: [
{
type: 'value',
min: 0,
max: 1000,
},
{
type: 'value',
min: 0,
max: 100,
axisLabel: {
formatter: '{value} %'
}
}
],
series: seriesList
};
optionRef.value = option;
}
/**
* cateId: 1,
yearTime:'2020'
*/
const ss = computed(() => [state.cateId, state.yearTime])
watch(() => unref(ss),
async (v) => {
getDataList()
},
{ immediate: true, deep: true },
)
watchEffect(() => {
const option = optionRef.value;
optionRef.value = option;
});
return {state, chartRef, option: optionRef,getDataList };
}
const axisLine = { show: true, lineStyle: { color: '#e4e6eb' } }
const hidden = { show: false }
export function useChart3() {
const chartRef = ref()
const option = ref<EChartsOption>({
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
grid: [
{ top: '35', width: '300px', bottom: 14, left: 14, containLabel: true },
{ top: '35', width: '300px', bottom: 14, right: 14, containLabel: true },
],
xAxis: [
{
gridIndex: 1,
type: 'category',
splitLine: hidden,
axisTick: hidden,
axisLabel: { show: true, color: '#808696', fontSize: 12 },
axisLine,
data: ['0313', '0314', '0315', '0316'],
boundaryGap: false,
},
{
gridIndex: 0,
type: 'category',
splitLine: hidden,
axisTick: hidden,
axisLabel: { show: true, color: '#808696', fontSize: 12 },
axisLine,
data: ['0313', '0314', '0315', '0316'],
},
],
yAxis: [
{
gridIndex: 1,
type: 'value',
max: 100,
axisLine,
axisTick: hidden,
axisLabel: { show: true, color: '#808696', fontSize: 12 },
splitLine: hidden,
},
{
gridIndex: 0,
type: 'value',
max: 100,
axisLine,
axisTick: hidden,
axisLabel: { show: true, color: '#808696', fontSize: 12 },
splitLine: hidden,
},
],
// title: [
// { text: 'CD堆积', left: 8, top: '', textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 500 } },
// { text: '发注金额推移', left: '50%', top: '', textAlign: 'left', textStyle: { color: '#142142', fontSize: 16, fontWeight: 500 } },
// ],
// graphic: {
// elements: [
// { type: 'image', left: 25, top: -5, style: pieBg },
// { type: 'image', right: 26, top: -5, style: pieBg },
// ],
// },
series: [
{
xAxisIndex: 1,
yAxisIndex: 1,
type: 'bar',
data: [12, 31, 35, 47],
showBackground: true,
backgroundStyle: { color: '#f4f6fa' },
itemStyle: {
borderRadius: 2,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#70b8f0' },
{ offset: 1, color: '#2b7ff9' },
]),
},
},
{ type: 'line', smooth: true, data: [32, 21, 75, 57] },
{ type: 'line', smooth: true, data: [12, 31, 35, 47] },
],
})
return { chartRef, option }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

View File

@ -0,0 +1,10 @@
<script setup lang="ts"></script>
<template>
<div class="b-1px b-solid b-#fff rd-12px inline-flex items-center w-269px h-52px px12px cursor-pointer overflow-hidden relative">
<img src="@/assets/images/icon-search.svg" class="w22px h22px absolute left-10px top-50% -translate-y-50%" />
<input type="text" placeholder="检索..." class="h-full w-full text-#fff text-18px pl30px pr54px placeholder-#fff" />
</div>
</template>
<style scoped lang="less"></style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,12 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
}
]
}

View File

@ -0,0 +1,155 @@
<!-- 情报列表 -->
<script setup lang="ts">
import AppBlock from '@/components/AppBlock.vue'
import Layout from './components/Layout.vue'
import { getImg } from './images'
import AppAlert from '@/components/AppAlert.vue'
import AppNewsBox from '@/components/AppNewsBox.vue'
import AppPagination from '@/components/AppPagination.vue'
import { Navs, useData } from './ListPageData'
import { NEmpty } from 'naive-ui'
import { message } from '@/utils/message'
const { push } = useRouter()
const route = useRoute()
const { state, list } = useData()
// cate 分类 1-外部环境 2-竞争对手 3-供方动向 4-大金集团 5-中国据点 6-调达本部
const Type1 = [
{ key: '1', name: '外部环境', route: 'IntelligenceOutside', icon: getImg('icon-1.svg') },
{ key: '2', name: '竞争对手', route: 'IntelligenceOutside', icon: getImg('icon-2.svg') },
{ key: '3', name: '供方动向', route: 'IntelligenceOutside', icon: getImg('icon-3.svg') },
]
const Type2 = [
{ key: '4', name: '大金集团', route: 'IntelligenceWithin', icon: getImg('icon-4.svg') },
{ key: '5', name: '中国据点', route: 'IntelligenceWithin', icon: getImg('icon-5.svg') },
{ key: '6', name: '调达本部', route: 'IntelligenceWithin', icon: getImg('icon-6.svg') },
]
const firstNew = ref<any>({})
const restNews = ref<any[]>([])
watchEffect(() => {
// const [first, ...rest] = unref(list)
// firstNew.value = first
restNews.value = unref(list)
})
// const toDetail =()=>{
// console.log(route.name,firstNew.id)
// push(`${route.path.replace('/Home','')}/${firstNew.id}`)
// // push({name:route.name,params:{id:firstNew.id}})
// }
const toDetail2 =(item: { id: any })=>{
console.log(route,route.path,item.id)
// push(`${route.path}/${item.id}`)
if(item.isSelect===1){
push(`${route.path.replace('/Home','')}/${item.id}`)
}
else{
message.error("没有访问权限")
}
}
</script>
<template>
<Layout>
<AppBlock class="flex w-full h-full">
<section class="px44px flex navs">
<div class="flex-1" v-for="item in Navs" :key="item.key">
<div :class="`navs-item max-w-4em active`">
{{ item.name }}
</div>
</div>
</section>
<section class="px44px flex mt24px">
<div class="flex-1 flex">
<div
class="cursor-pointer mr36px w100px h100px rd-20px flex-shrink flex flex-col justify-center items-center text-#fff"
v-for="item in Type1"
:key="item.name"
:style="{ backgroundColor: item.key == state.cate ? '#63bfb2' : '#c2c2c2' }"
@click="state.cate = item.key"
>
<img :src="item.icon" />
<span class="mt14px">{{ item.name }}</span>
</div>
</div>
<div class="flex-1 flex">
<div
class="cursor-pointer mr36px w100px h100px rd-20px flex-shrink flex flex-col justify-center items-center text-#fff"
v-for="item in Type2"
:key="item.name"
:style="{ backgroundColor: item.key == state.cate ? '#63bfb2' : '#c2c2c2' }"
@click="state.cate = item.key"
>
<img :src="item.icon" />
<span class="mt14px">{{ item.name }}</span>
</div>
</div>
</section>
<section class="px44px mt44px">
<!-- <AppAlert v-if="firstNew?.title" @click="push(`${route.path.replace('/Home','')}/${firstNew.id}`)">{{ firstNew.title }}</AppAlert> -->
<div class="mt12px news-wrap max-h-467px mb32px overflow-y-auto">
<div class="news-item" v-for="item in restNews" :key="item.id" @click="toDetail2(item)">
<AppNewsBox class="!lh-2em" :isRead="item.isRead" :top="item.isTop" :labelText="item.tag" labelColor="#2cba06" :size="item.tag==='New'?'h20px':'h30px'" :text="item.title" :date="item.publishTime" />
</div>
</div>
<div class="text-center mt32px" v-if="state.total">
<AppPagination v-model:current="state.pageNum" v-model:total="state.total" />
</div>
<NEmpty v-else description="暂无数据">
<template #icon></template>
</NEmpty>
</section>
</AppBlock>
</Layout>
</template>
<style scoped lang="less">
.navs {
font-size: 28px;
color: #999;
font-weight: 600;
margin-top: 10px;
border-bottom: 1px solid #eef3fb;
.navs-item {
cursor: pointer;
padding: 14px 18px;
margin-right: 22px;
transition: all 0.1s;
border-bottom: 4px solid transparent;
&.active {
color: #003ab5;
border-color: #003ab5;
}
}
}
.items-content {
margin-top: 12px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
line-height: 1.7;
overflow: hidden;
text-overflow: ellipsis;
}
.news-wrap {
display: grid;
grid-template-columns: 1fr 1fr;
grid-column-gap: 68px;
.news-item {
cursor: pointer;
padding: 16px 0;
border-bottom: 1px solid #eef3fb;
}
}
</style>

View File

@ -0,0 +1,198 @@
<template>
<!-- <div style="border: 1px solid #ccc">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default"
ref="toolbar" />
<Editor style="height: 300px; overflow-y: hidden;" v-model="valueHtml" :defaultConfig="editorConfig" mode="default"
@onCreated="handleCreated" @onChange="handleChange" />
</div> -->
<div style="border: 1px solid #ccc">
<quill-editor
ref="myQuillEditor"
content-type='html'
class="min-h180px"
v-model:content='content'
:options='editorOption'
@update:content ="handleChange($event)"
/>
<input type="file" hidden accept=".gif,.jpg,.jpeg,.png" ref="fileBtn" @change="handleUpload" />
</div>
</template>
<script lang="ts" setup>
import { upload } from '@/api/daikin/base';
import{useMessage} from 'naive-ui'
// import { onBeforeUnmount, shallowRef, onMounted, watch, defineProps, defineEmits } from 'vue';
// import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
// import '@wangeditor/editor/dist/css/style.css';
const message = useMessage()
const props = defineProps(["content"]);
const emit = defineEmits(['getChildData']);
// const editorRef = shallowRef();
// const valueHtml = ref('');
onMounted(() => {
content.value = props.content;
});
const HandleCustomMatcher = (node: any, Delta: { ops: any[]; })=>{
let ops: any[] = []
Delta.ops.forEach((op) => {
// 如果粘贴了图片,这里会是一个对象,所以可以这样处理
if (op.insert && typeof op.insert === "string") {
ops.push({
insert: op.insert, // 文字内容
attributes: op.attributes, //文字样式(包括背景色和文字颜色等)
});
} else {
//判断图片是否是base64
if (op.insert && op.insert.image && op.insert.image.indexOf("base64") > -1) {
message.error("图片格式不能为base64");
}
else {
// console.log(op)
ops.push({
insert:op.insert,
attributes:op.attributes,
})
// handleUpload(File)
}
// message.error("禁止粘贴图片,请使用上传方式!");
}
});
Delta.ops = ops;
return Delta;
}
// const toolbarConfig = {};
// const editorConfig = {
// placeholder: '请输入内容...',
// MENU_CONF: {
// uploadImage: {
// server: 'http://admin.echo.mteam01.com/openApi/common/upload',
// fieldName: 'file',
// customInsert(res: { url: any; fileName: any; }, insertFn: (arg0: any, arg1: any) => void) {
// let url = res.url;
// insertFn(url,res.fileName);
// },
// accept: 'image/*',
// },
// }
// };
// onBeforeUnmount(() => {
// const editor = editorRef.value;
// if (editor == null) return;
// editor.destroy();
// });
function unescapeHTML(html: string) {
const doc = new DOMParser().parseFromString(html, 'text/html');
return doc.documentElement.textContent;
}
watch(() => props.content, () => {
const center =unescapeHTML(props.content)
// console.log(center)
myQuillEditor.value.setHTML(center)
});
// const handleCreated = (editor: { setHtml: (arg0: any) => void; }) => {
// editorRef.value = editor;
// editor.setHtml(props.content);
// };
// // 给父组件传值
const handleChange = (val: any) => {
// console.log(val)
emit('getChildData',val)
}
/************************************************** */
const content = ref('')
const editorOption = {
modules: {
clipboard: {
// 粘贴版,处理粘贴时候的自带样式
matchers: [[Node.ELEMENT_NODE, HandleCustomMatcher]],
},
toolbar: [
['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
[{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
[{ align: [] }], // 对齐方式
[{ size: ['small', false, 'large', 'huge'] }], // 字体大小
[{ font: [] }], // 字体种类
[{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题
[{ direction: 'ltl' }], // 文本方向
[{ direction: 'rtl' }], // 文本方向
[{ indent: '-1' }, { indent: '+1' }], // 缩进
[{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
[{ script: 'sub' }, { script: 'super' }], // 上标/下标
['blockquote', 'code-block'], // 引用 代码块
['clean'], // 清除文本格式
['link', 'image', 'video'], // 链接、图片、视频
],
},
ImageDrop: true,
imageResize: {
displayStyles: {
backgroundColor: 'black',
border: 'none',
color: 'white',
},
modules: ['Resize', 'DisplaySize', 'Toolbar'],
},
placeholder: '请输入内容...',
};
const myQuillEditor = ref()
const fileBtn = ref()
onMounted(() => {
let quill = toRaw(myQuillEditor.value).getQuill()
if (myQuillEditor.value) {
quill.getModule("toolbar").addHandler("image", imgHandler);
}
})
const imgHandler = (state: any) => {
if (state) {
fileBtn.value.click()
}
}
const handleUpload = (e: { target: { files: any; }; }) => {
const files = Array.prototype.slice.call(e.target.files);
// console.log(files, "files")
if (!files) {
return
}
let formdata = new FormData();
formdata.append("file", files[0]);
upload(formdata,{headers: { 'Content-Type': 'application/form-data' }})
.then(res => {
if (res.url) {
let quill = toRaw(myQuillEditor.value).getQuill()
let length = quill.getSelection().index;
// 插入图片res为服务器返回的图片链接地址
quill.insertEmbed(length, "image", res.url);
// 调整光标到最后
quill.setSelection(length + 1);
}
})
}
</script>
<style lang="scss" scoped></style>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 546 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.truncate[data-v-0ff58a60]{max-width:395px;min-width:100px;overflow:hidden;padding:10px 0 10px 10px;line-height:30px;text-overflow:ellipsis;white-space:nowrap}.back[data-v-0ff58a60]{position:absolute;top:25px;left:25px;color:#fff;font-size:25px;font-weight:700;text-align:center;justify-content:center}.top[data-v-0ff58a60]{right:30px;top:0}[data-v-0ff58a60]::-webkit-scrollbar{width:1px}.q-wrapper[data-v-0ff58a60]{border-radius:18px;border:1px solid #e7ebf5;box-shadow:inset 1px 2px 12px #0e56dd52;overflow:auto}.q-wrapper[data-v-0ff58a60]:after{content:" ";background-image:url(/assets/bg-card-cf2a9f09.svg);pointer-events:none;display:block;width:100%;height:127px;background-repeat:no-repeat;background-position:right top;position:absolute;left:0;top:0}

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

View File

@ -0,0 +1,135 @@
// 格式化浮点数
export function formatFloat(number: string | number, precision = 2) {
number = parseFloat(number);
if (isNaN(number) && !number) return number;
return number.toFixed(precision);
}
export function fixFloat(number: number, digit = 2) {
const m = 10 ** digit;
return (Math.round(number * m, 10) / m).toFixed(digit);
}
export function toMoney(num: string | number) {
num = fixFloat(num);
if (isNaN(num)) return num;
const [i, f] = String(num).split('.');
return `${parseFloat(i).toLocaleString()}.${f}`;
}
// 格式化日期
export function formatDate(date: string | number | Date, fmt = 'yyyy-MM-dd hh:mm:ss') {
const that = new Date(date);
const o = {
'M+': that.getMonth() + 1, // 月份
'd+': that.getDate(), // 日
'h+': that.getHours(), // 小时
'm+': that.getMinutes(), // 分
's+': that.getSeconds(), // 秒
'q+': Math.floor((that.getMonth() + 3) / 3), // 季度
S: that.getMilliseconds(), // 毫秒
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (`${that.getFullYear()}`).substr(4 - RegExp.$1.length));
}
for (const k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((`00${o[k]}`).substr((`${o[k]}`).length)));
}
}
return fmt;
}
export function calculateDateIntervals(StartTime1: string | number | Date, EndTime2: string | number | Date) {
const currentDate = new Date();
let startDate, endDate;
const dateNow = currentDate.getDate();
if (!StartTime1 && !EndTime2) {
startDate = new Date(currentDate.getFullYear(), currentDate.getMonth() - 11, dateNow);
endDate = currentDate;
const monthList = [];
const type = 2;
for (let month = 0; month <=11; month++) {
const date = new Date(currentDate.getFullYear(), currentDate.getMonth() - month, dateNow);
monthList.push(date.toISOString().slice(0, 7));
}
const reversedArray = [];
for (let i = monthList.length - 1; i >= 0; i--) {
reversedArray.push(monthList[i]);
}
// console.log(reversedArray)
return { type, list: reversedArray };
} else {
startDate = new Date(StartTime1);
endDate = new Date(EndTime2);
}
const timeDiff = endDate.getTime() - startDate.getTime();
const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
const daysDiff = Math.floor(timeDiff / oneDay);
if (daysDiff < 15) {
const dateList = [];
const type = 3;
for (let i = 0; i <= daysDiff; i++) {
const day = new Date(startDate.getTime() + i * oneDay);
dateList.push(day.toISOString().split('T')[0]);
}
return { type, list: dateList };
} else if (daysDiff <= 365) {
const monthList = [];
const type = 2;
const startYear = startDate.getFullYear();
const endYear = endDate.getFullYear();
const startMonth = startDate.getMonth();
const endMonth = endDate.getMonth();
for (let year = startYear; year <= endYear; year++) {
const monthStart = (year === startYear) ? startMonth : 0;
const monthEnd = (year === endYear) ? endMonth : 11;
for (let month = monthStart; month <= monthEnd; month++) {
monthList.push(`${year}-${String(month + 1).padStart(2, '0')}`);
}
}
// const reversedArray = [];
// for (let i = monthList.length - 1; i >= 0; i--) {
// reversedArray.push(monthList[i]);
// }
console.log(monthList)
return { type, list: monthList };
} else {
const yearList = [];
const type = 1;
for (let year = startDate.getFullYear(); year <= endDate.getFullYear(); year++) {
yearList.push(year.toString());
}
return { type, list: yearList };
}
}
export function getPreviousMonths() {
const currentDate = new Date();
const previousMonths = [];
for (let i = 0; i < 5; i++) {
const previousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() - (i+2), 1);
previousMonths.push(previousMonth.toLocaleString('default', { month: 'long', year: 'numeric' }));
}
return previousMonths.reverse();
}

View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -0,0 +1 @@
.text-ellipsis[data-v-d2131841]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.title[data-v-d2131841]{background:linear-gradient(0deg,#466CCD,#5C87F5);border-radius:10px;opacity:.52}.more[data-v-d2131841]{position:relative}.more[data-v-d2131841]:after{content:"";width:20px;height:20px;position:absolute;right:15px;top:10px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAehJREFUOE+VlT1IUGEUhp/XwSjCfuhvcZeMIGkyQiQSQg2L9oaksfAHCVsMQgu0WpzchCTFRSGkqAh1SCNQBxtEMHLRwSEqI6oTJ78b1+v9wbNc+L5znnM433vOFSlmZoeA68Bl4AxwEDBgDZgBRoERST+T4YofmFkJcBvoAsrSksXOPgG3JI3H/f4DzWwvMAw0FoC21QA8kNQZHf4Dmpl/x3YJi4O7JN3zgwjYCvSlVDYHtAPPgCM5lf8BaiVNKjzASkrPFoHzkjbM7DTwCjiaA/0g6awD/RGepDhuAk2SXoa2nAJeA8dyoNUO9ICLGU4OvSLpRYBWBujxDP9uB7q28rL+AK5KmgjQkwF6IgX63IG/Addfnjm0TtJUgFYA74H9iaAZB7rzngLgJFAv6WsA3gfupsRMOfAj4Bmz7C3QIOlbgPUAdzKcBx04ADRnOLxxsUv6HmAPgY6c5DcdWAt4YNLmgeoYrBdoy4G5IsqjSZkGziWcf/nGkTRkZo+AloI+P5bUGgFdX7PAvkSQK8B1eqkAtgxUSfoS3zZNYduUFgQnr9fDHPuobi2HyMzsAvAUyJqEJGwBuCZpKbrYBgwveTho7AZwIKPaVcD72p/c2juAsWp94daEX4BX7P38HHr9TpKvrB32F34jsBJrv6jPAAAAAElFTkSuQmCC);background-size:contain}.dots .dot[data-v-d2131841]{display:inline-block;width:13px;height:9px;background-color:#ffffff4d;border-radius:0;margin-left:8px}.dots .dot.active[data-v-d2131841]{background-color:#fff}.items .bg-red[data-v-d2131841]{background-color:#e60e0e}.items .bg-green[data-v-d2131841]{background-color:#2cba06}.items .items-content[data-v-d2131841]{margin-top:12px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-height:1.7;overflow:hidden;text-overflow:ellipsis}.box[data-v-822baba1]{padding:23px 45px 0}.box .box-title[data-v-822baba1]{font-size:28px;font-weight:600;position:relative;padding-left:24px}.box .box-title[data-v-822baba1]:before{content:" ";display:block;width:8px;height:30px;background-color:#003ab5;position:absolute;left:0}

View File

@ -0,0 +1 @@
const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAUCAYAAABiS3YzAAACLElEQVQ4jZ2UPWgUURSFvxsTf0AXFfzJQiCooCghmEZMBAsLrdRGtLHQxjRpHGyEdApBmAloZUQQtREsFBstFJQIMUhMVESICDaiIoIZlmjUORbz3ubt7mSJHhjmnTv3fdz73t21SqVCkbIsQxLANjMbAnYD74BB4JH7hpltjOP4U7i3pZA4r61m9hI4BKwHeoGHwH4HvAp8iKLoaFOomVWBwBjQ5vwt4Kdb3zezPpezFDhQA5Xk20SSb7sMjAOrXd4p4BiwJ9g7Cmxy65nCSj08y7J1WZaNASUzQ9JpSSMu7TlwMNjf7t5zzdovARNm1uH8oJkNm1kP8B4YAO6Rn3Go36GxNE39ug14AexwlZ9z0O3AJPNnexi4CxwHrrvYR0n7kiR5G1baKmncA4Fh8tHpdC17IMAddwQ3JJ10sbKZPYuiqDOsdBTocwmXgX6gDLwC1lKsvcATSQNmdtHFPgM9LZIeeKCka5L6HWiqCRDgMdCbJMkl4IyLbQCeWpqmcoHbwBFJy8xsGugoABWpK47j11EUnQXO+/Z3Ad3ACPkgvwE2LxKIpFkz647jeDqKohNAGt4+wASwc7HAQKmkLUmSfIHaOW3/TyDAKjPr8qY1+PAH+EXt+ACkwLfAl4A1BeBZv6j/RYlG3SSfV/9caFpzAbRIc3X+x79Al9DYOuQTEWr5AqzqUYbQCmCNuays8ysWgFY7Ci9qBrhC/r8Z6mud/05+eaEmJU158xcIHsDvmVLL5AAAAABJRU5ErkJggg==",e=Object.freeze(Object.defineProperty({__proto__:null,default:A},Symbol.toStringTag,{value:"Module"}));export{e as _,A as a};

Some files were not shown because too many files have changed in this diff Show More