src/assets/logo/上海郢昱网络科技有限公司.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/logo/南通云从工业互联网有限公司.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/logo/新缆(江苏)数字科技有限公司.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/logo/芯导软件(江苏)有限公司.png | 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/styles/sidebar.scss | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/assets/styles/variables.module.scss | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/components/Breadcrumb/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Navbar.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Sidebar/Logo.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Sidebar/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inventoryManagement/issueManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inventoryManagement/receiptManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/assets/logo/ÉϺ£Û«êÅÍøÂç¿Æ¼¼ÓÐÏÞ¹«Ë¾.png
src/assets/logo/ÄÏÍ¨ÔÆ´Ó¹¤Òµ»¥ÁªÍøÓÐÏÞ¹«Ë¾.png
src/assets/logo/ÐÂÀ£¨½ËÕ£©Êý×ֿƼ¼ÓÐÏÞ¹«Ë¾.png
src/assets/logo/оµ¼Èí¼þ£¨½ËÕ£©ÓÐÏÞ¹«Ë¾.png
src/assets/styles/sidebar.scss
@@ -1,15 +1,14 @@ #app { .main-container { min-height: 100%; transition: margin-left .28s; transition: margin-left 0.28s; margin-left: $base-sidebar-width; position: relative; background: #F5F7FB; background: #f5f7fb; } .sidebarHide { margin-left: 0!important; margin-left: 0 !important; } .sidebar-container { @@ -23,12 +22,13 @@ left: 0; z-index: 1001; overflow: hidden; -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.1); // reset element-ui css .horizontal-collapse-transition { transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; } .scrollbar-wrapper { @@ -69,7 +69,8 @@ width: 100% !important; } .el-menu-item, .menu-title { .el-menu-item, .menu-title { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; @@ -83,31 +84,31 @@ .sub-menu-title-noDropdown, .el-sub-menu__title { &:hover { background-color: rgba(212,221,255,0.56) !important; background-color: rgba(212, 221, 255, 0.8) !important; } } & .theme-light .is-active > .el-sub-menu__title { color: #000000 !important; color: #fff !important; } & .nest-menu .el-sub-menu>.el-sub-menu__title, & .nest-menu .el-sub-menu > .el-sub-menu__title, & .el-sub-menu .el-menu-item { min-width: $base-sidebar-width !important; &:hover { background-color: rgba(212,221,255,0.56) !important; background-color: rgba(212, 221, 255, 0.8) !important; } &.is-active { background-color: rgba(212,221,255,0.56) !important; background-color: #fff !important; } } & .theme-light .nest-menu .el-sub-menu>.el-sub-menu__title, & .theme-light .nest-menu .el-sub-menu > .el-sub-menu__title, & .theme-light .el-sub-menu .el-menu-item { //background-color: transparent; &:hover { background-color: rgba(212,221,255,0.56) !important; background-color: rgba(212, 221, 255, 0.8) !important; } } } @@ -136,27 +137,26 @@ .el-sub-menu { overflow: hidden; &>.el-sub-menu__title { & > .el-sub-menu__title { padding: 0 !important; .svg-icon { margin-left: 20px; } } } .el-menu--collapse { .el-sub-menu { &>.el-sub-menu__title { &>span { & > .el-sub-menu__title { & > span { height: 0; width: 0; overflow: hidden; visibility: hidden; display: inline-block; } &>i { & > i { height: 0; width: 0; overflow: hidden; @@ -179,7 +179,7 @@ } .sidebar-container { transition: transform .28s; transition: transform 0.28s; width: $base-sidebar-width !important; } @@ -193,7 +193,6 @@ } .withoutAnimation { .main-container, .sidebar-container { transition: none; @@ -203,25 +202,25 @@ // when menu collapsed .el-menu--vertical { &>.el-menu { & > .el-menu { .svg-icon { margin-right: 16px; } } .nest-menu .el-sub-menu>.el-sub-menu__title, .nest-menu .el-sub-menu > .el-sub-menu__title, .el-menu-item { &:hover { // you can use $sub-menuHover background-color: rgba(212,221,255,0.56) !important; background-color: rgba(212, 221, 255, 0.56) !important; } &.is-active { background-color: rgba(212,221,255,0.56) !important; background-color: rgba(212, 221, 255, 0.56) !important; } } // the scroll bar appears when the sub-menu is too long >.el-menu--popup { > .el-menu--popup { max-height: 100vh; overflow-y: auto; src/assets/styles/variables.module.scss
@@ -1,12 +1,12 @@ // base color $blue: #324157; $light-blue: #333c46; $red: #C03639; $pink: #E65D6E; $green: #30B08F; $tiffany: #4AB7BD; $yellow: #FEC171; $panGreen: #30B08F; $red: #c03639; $pink: #e65d6e; $green: #30b08f; $tiffany: #4ab7bd; $yellow: #fec171; $panGreen: #30b08f; // é»è®¤ä¸»é¢åé $menuText: #bfcbd9; @@ -15,10 +15,10 @@ $menuHover: #263445; // æµ è²ä¸»é¢theme-light $menuLightBg: #ffffff; $menuLightBg: #002fa7; $menuLightHover: #f0f1f5; $menuLightText: #303133; $menuLightActiveText: #409EFF; $menuLightText: #fff; $menuLightActiveText: #002fa7; // åºç¡åé $base-sidebar-width: 200px; @@ -29,13 +29,13 @@ $base-menu-color-active: #f4f4f5; $base-menu-background: #304156; $base-sub-menu-background: #1f2d3d; $base-sub-menu-hover: #001528; $base-sub-menu-hover: #fff; // ç»ä»¶åé $--color-primary: #409EFF; $--color-success: #67C23A; $--color-warning: #E6A23C; $--color-danger: #F56C6C; $--color-primary: #409eff; $--color-success: #67c23a; $--color-warning: #e6a23c; $--color-danger: #f56c6c; $--color-info: #909399; :export { @@ -71,13 +71,12 @@ --sidebar-bg: #{$menuBg}; --sidebar-text: #{$menuText}; --menu-hover: #{$menuHover}; --navbar-bg: #ffffff; --navbar-text: #303133; /* splitpanes default-theme åé */ --splitpanes-default-bg: #ffffff; } // æé»æ¨¡å¼åé @@ -119,7 +118,7 @@ --blockquote-bg: #1d1e1f; --blockquote-border: #303030; --blockquote-text: #d0d0d0; /* Cron æ¶é´è¡¨è¾¾å¼ 模å¼åé */ --cron-border: #303030; @@ -127,11 +126,12 @@ --splitpanes-default-bg: #141414; /* ä¾§è¾¹æ èåè¦ç */ .sidebar-container { .el-menu-item, .menu-title { .sidebar-container { .el-menu-item, .menu-title { color: var(--el-text-color-regular); } & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title, & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, & .theme-dark .el-sub-menu .el-menu-item { background-color: var(--el-bg-color) !important; } @@ -180,9 +180,10 @@ --el-table-border-color: var(--el-border-color-light) !important; --el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important; .el-table__header-wrapper, .el-table__fixed-header-wrapper { .el-table__header-wrapper, .el-table__fixed-header-wrapper { th { background-color: var(--el-bg-color-overlay, #F0F1F5) !important; background-color: var(--el-bg-color-overlay, #f0f1f5) !important; color: var(--el-text-color-regular, #515a6e); } } @@ -199,9 +200,10 @@ background-color: var(--el-bg-color-overlay); } } /* 䏿èåæ ·å¼è¦ç */ .el-dropdown-menu__item:not(.is-disabled):focus, .el-dropdown-menu__item:not(.is-disabled):hover{ .el-dropdown-menu__item:not(.is-disabled):focus, .el-dropdown-menu__item:not(.is-disabled):hover { background-color: var(--navbar-hover) !important; } @@ -211,11 +213,9 @@ border-left-color: var(--blockquote-border) !important; color: var(--blockquote-text) !important; } /* æ¶é´è¡¨è¾¾å¼æ 颿 ·å¼è¦ç */ .popup-result .title { background: var(--cron-border); } } src/components/Breadcrumb/index.vue
@@ -2,7 +2,8 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span> <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span> <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> </el-breadcrumb-item> </transition-group> @@ -91,7 +92,7 @@ margin-left: 8px; .no-redirect { color: #97a8be; color: #002FA7; cursor: text; } } src/layout/components/Navbar.vue
@@ -1,23 +1,22 @@ <template> <div class="navbar"> <div> <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" /> </div> <!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />--> <!-- <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />--> <div class="center-menu"> <span class="label">{{userStore.currentFactoryName}}</span> <span class="label">{{ userStore.currentFactoryName }}</span> <el-dropdown @command="handleFactoryChange" class="right-menu-item hover-effect" trigger="click"> <div> <el-icon size="20"><Switch /></el-icon> <el-icon size="20"> <Switch /> </el-icon> </div> <template #dropdown> <el-dropdown-menu > <el-dropdown-item v-for="item in factoryList" :key="item.deptId" :command="item" > <el-dropdown-menu> <el-dropdown-item v-for="item in factoryList" :key="item.deptId" :command="item"> {{ item.deptName }} </el-dropdown-item> </el-dropdown-menu> @@ -114,12 +113,12 @@ } function getUserLoginFacotryList() { if(userStore.id){ userLoginFacotryList({userId:userStore.id}).then(res => { if (userStore.id) { userLoginFacotryList({ userId: userStore.id }).then(res => { console.log('res', res) factoryList.value = res.data }) }else { } else { factoryList.value = [] } } @@ -129,7 +128,7 @@ handleLogin(command.deptId); } function handleLogin(currentFatoryId){ function handleLogin(currentFatoryId) { const loginForm = { username: Cookies.get("username"), password: Cookies.get("password") === undefined ? null : decrypt(Cookies.get("password")), @@ -157,6 +156,7 @@ position: relative; background: var(--navbar-bg); box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); .center-menu { line-height: 50px; position: absolute; @@ -164,6 +164,7 @@ transform: translateX(-50%); display: flex; align-items: center; .label { font-weight: bold; font-size: 18px; src/layout/components/Sidebar/Logo.vue
@@ -2,21 +2,21 @@ <div class="sidebar-logo-container" :class="{ 'collapse': collapse }"> <transition name="sidebarLogoFade"> <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/"> <img v-if="logo" :src="logo" class="sidebar-logo" /> <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="å ¬å¸Logo" /> <h1 v-else class="sidebar-title">{{ title }}</h1> </router-link> <router-link v-else key="expand" class="sidebar-logo-link" to="/"> <img v-if="logo" :src="logo" class="sidebar-logo" /> <h1 class="sidebar-title">{{ title }}</h1> <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="å ¬å¸Logo" /> <h1 v-else class="sidebar-title">{{ title }}</h1> </router-link> </transition> </div> </template> <script setup> import logo from '@/assets/logo/logo.png' import useSettingsStore from '@/store/modules/settings' import variables from '@/assets/styles/variables.module.scss' import { ref, computed, onMounted, watch } from 'vue' import useUserStore from '@/store/modules/user' import defaultLogo from '@/assets/logo/logo.png' // å¯¼å ¥é»è®¤logo defineProps({ collapse: { @@ -26,24 +26,53 @@ }) const title = import.meta.env.VITE_APP_TITLE const settingsStore = useSettingsStore() const sideTheme = computed(() => settingsStore.sideTheme) const userStore = useUserStore() // è·åLogoèæ¯è² const getLogoBackground = computed(() => { if (settingsStore.isDark) { return 'var(--sidebar-bg)' } return sideTheme.value === 'theme-dark' ? variables.menuBg : variables.menuLightBg // å¤çå·¥ååç§°ï¼çæåæ³çæä»¶å const cleanFactoryName = computed(() => { if (!userStore.currentFactoryName) return '' return userStore.currentFactoryName.trim() }) // è·åLogoæåé¢è² const getLogoTextColor = computed(() => { if (settingsStore.isDark) { return 'var(--sidebar-text)' // 卿logoè·¯å¾ const logoUrl = ref('') // æ£æ¥logoæ¯å¦åå¨å¹¶è®¾ç½®url const updateLogoUrl = () => { if (!cleanFactoryName.value) { logoUrl.value = defaultLogo return } return sideTheme.value === 'theme-dark' ? '#fff' : variables.menuLightText // 使ç¨Viteçå¨æå¯¼å ¥ try { const dynamicLogo = import.meta.glob('/src/assets/logo/*.png', { eager: true }) const logoPath = `/src/assets/logo/${cleanFactoryName.value}.png` if (dynamicLogo[logoPath]) { logoUrl.value = dynamicLogo[logoPath].default } else { logoUrl.value = defaultLogo } } catch (error) { console.error('å 载工åLogo失败:', error) logoUrl.value = defaultLogo } } // åå§ååçå¬åå onMounted(() => { updateLogoUrl() // çå¬å·¥ååç§°åå watch(() => userStore.currentFactoryName, updateLogoUrl) }) // å¾çå è½½é误å¤ç const handleImageError = (event) => { console.warn('Logoå 载失败ï¼ä½¿ç¨é»è®¤Logo') logoUrl.value = defaultLogo } </script> <style lang="scss" scoped> @@ -63,7 +92,7 @@ width: 100%; height: 50px; line-height: 50px; background: v-bind(getLogoBackground); background: #fff; text-align: center; overflow: hidden; @@ -72,8 +101,9 @@ width: 100%; & .sidebar-logo { width: 32px; height: 32px; width: 100%; height: 100%; // height: 32px; vertical-align: middle; margin-right: 12px; } src/layout/components/Sidebar/index.vue
@@ -2,23 +2,11 @@ <div :class="{ 'has-logo': showLogo }" class="sidebar-container"> <logo v-if="showLogo" :collapse="isCollapse" /> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="getMenuBackground" :text-color="getMenuTextColor" :unique-opened="true" :active-text-color="theme" :collapse-transition="false" mode="vertical" :class="sideTheme" > <sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route" :base-path="route.path" /> <el-menu :default-active="activeMenu" :collapse="isCollapse" :background-color="getMenuBackground" :text-color="getMenuTextColor" :unique-opened="true" :active-text-color="theme" :collapse-transition="false" mode="vertical" :class="sideTheme"> <sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route" :base-path="route.path" /> </el-menu> </el-scrollbar> </div> @@ -42,6 +30,7 @@ const sideTheme = computed(() => settingsStore.sideTheme) const theme = computed(() => settingsStore.theme) const isCollapse = computed(() => !appStore.sidebar.opened) console.log(44444, settingsStore.isDark, sideTheme.value) // è·åèåèæ¯è² const getMenuBackground = computed(() => { @@ -71,7 +60,7 @@ <style lang="scss" scoped> .sidebar-container { background-color: v-bind(getMenuBackground); .scrollbar-wrapper { background-color: v-bind(getMenuBackground); } @@ -80,8 +69,9 @@ border: none; height: 100%; width: 100% !important; .el-menu-item, .el-sub-menu__title { .el-menu-item, .el-sub-menu__title { &:hover { background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important; } @@ -89,7 +79,7 @@ .el-menu-item { color: v-bind(getMenuTextColor); &.is-active { color: var(--menu-active-text, #409eff); background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important; src/views/index.vue
@@ -9,21 +9,21 @@ <div class="card-group"> <div class="info-card"> <div class="info-message"> <div class="info-number">{{contractAmount}}</div> <div class="info-number">{{ contractAmount }}</div> <div class="info-title">ååéé¢(å )</div> </div> <img src="@/assets/images/icon1.png" alt="" style="width: 63px;height: 63px"> </div> <div class="info-card1"> <div class="info-message"> <div class="info-number">{{invoiceAmount}}</div> <div class="info-number">{{ invoiceAmount }}</div> <div class="info-title">å¼ç¥¨éé¢(å )</div> </div> <img src="@/assets/images/icon2.png" alt="" style="width: 63px;height: 63px"> </div> <div class="info-card2"> <div class="info-message"> <div class="info-number">{{receiptAmount}}</div> <div class="info-number">{{ receiptAmount }}</div> <div class="info-title">忬¾éé¢(å )</div> </div> <img src="@/assets/images/icon%203.png" alt="" style="width: 63px;height: 63px"> @@ -38,20 +38,18 @@ <div class="card-group"> <div class="pie-group"> <div style="margin-right: 80px"> <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStyle" :series="materialPieSeries" :tooltip="pieTooltip"></Echarts> <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStyle" :series="materialPieSeries" :tooltip="pieTooltip"></Echarts> </div> <div class="info-message2"> <div class="info-message1"> <div class="pie-title">æ¬æåæ¬¾éé¢</div> <div class="pie-info"><span class="pie-number">{{receiveAmount}}</span>å <span class="pie-number">{{receiveAmountPercentage}}</span>%</div> <div class="pie-info"><span class="pie-number">{{ receiveAmount }}</span>å <span class="pie-number">{{ receiveAmountPercentage }}</span>%</div> </div> <div class="info-message1"> <div class="pie-title">åºæ¶æ¬¾éé¢</div> <div class="pie-info"><span class="pie-number">{{contractAmountMonth}}</span>å </div> <div class="pie-info"><span class="pie-number">{{ contractAmountMonth }}</span>å </div> </div> </div> </div> @@ -59,21 +57,18 @@ <div class="card-group"> <div class="pie-group"> <div style="margin-right: 80px"> <Echarts ref="chart" :options="options" :legend="pieLegend" :chartStyle="chartStyle" :series="materialPieSeries1" :tooltip="pieTooltip1"></Echarts> <Echarts ref="chart" :options="options" :legend="pieLegend" :chartStyle="chartStyle" :series="materialPieSeries1" :tooltip="pieTooltip1"></Echarts> </div> <div class="info-message2"> <div class="info-message1"> <div class="pie-title1">æ¬æä»æ¬¾éé¢</div> <div class="pie-info"><span class="pie-number1">{{paymentAmount}}</span>å <span class="pie-number1">{{payableAmountPercentage}}</span>%</div> <div class="pie-info"><span class="pie-number1">{{ paymentAmount }}</span>å <span class="pie-number1">{{ payableAmountPercentage }}</span>%</div> </div> <div class="info-message1"> <div class="pie-title1">åºä»æ¬¾éé¢</div> <div class="pie-info"><span class="pie-number1">{{payableAmount}}</span>å </div> <div class="pie-info"><span class="pie-number1">{{ payableAmount }}</span>å </div> </div> </div> </div> @@ -87,15 +82,8 @@ <span style="font-weight: bold">客æ·ååéé¢TOP5ç»è®¡</span> </div> <div> <Echarts ref="chart" :chartStyle="chartStyle1" :grid="grid" :legend="barLegend" :series="barSeries" :tooltip="tooltip" :xAxis="xAxis1" :yAxis="yAxis1" style="height: 42vh;"></Echarts> <Echarts ref="chart" :chartStyle="chartStyle1" :grid="grid" :legend="barLegend" :series="barSeries" :tooltip="tooltip" :xAxis="xAxis1" :yAxis="yAxis1" style="height: 42vh;"></Echarts> </div> </div> </div> @@ -107,15 +95,8 @@ <span style="font-weight: bold">忬¾ãå¼ç¥¨è¿åå¹´èµ°å¿å¾</span> </div> <div> <Echarts ref="chart" :chartStyle="chartStyle1" :grid="grid" :legend="barLegend" :series="lineSeries" :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 27vh;"></Echarts> <Echarts ref="chart" :chartStyle="chartStyle1" :grid="grid" :legend="barLegend" :series="lineSeries" :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 27vh;"></Echarts> </div> </div> </div> @@ -190,10 +171,10 @@ borderWidth: 2 }, label: { show:false show: false }, data: [ { value: 0, name: 'æ¬æåæ¬¾éé¢', itemStyle: { color: '#2D99FF' } }, { value: 0, name: 'æ¬æåæ¬¾éé¢', itemStyle: { color: '#2D99FF' } }, { value: 0, name: 'åºæ¶æ¬¾éé¢', itemStyle: { color: '#D4DDFF' } }, ] } @@ -208,10 +189,10 @@ borderWidth: 2 }, label: { show:false show: false }, data: [ { value: 0, name: 'æ¬æä»æ¬¾éé¢', itemStyle: { color: '#1EBFAC' } }, { value: 0, name: 'æ¬æä»æ¬¾éé¢', itemStyle: { color: '#1EBFAC' } }, { value: 0, name: 'åºä»æ¬¾éé¢', itemStyle: { color: '#D0EFE1' } }, ] } @@ -264,22 +245,22 @@ ]) const barLegend = reactive({}) const barSeries = ref([ { type: 'bar', data: [], label: { show: true }, { type: 'bar', data: [], label: { show: true }, }, ]) const lineSeries = ref([ { type: 'line', data: [], label: { show: true }, { type: 'line', data: [], label: { show: true }, }, ]) // ååéé¢ const getContractAmountNum = () => { @@ -330,7 +311,7 @@ customerName.push(item.customerName) totalAmount.push(item.totalAmount) }) // æ£ç¡®ååºå¼èµå¼ï¼å建æ°ç xAxis å series 对象 // æ£ç¡®ååºå¼èµå¼ï¼å建æ°ç xAxis å series 对象 xAxis1.value = [ { type: 'category', @@ -369,7 +350,7 @@ receiptAmount.push(item.receiptAmount) invoiceAmount.push(item.invoiceAmount) }) // æ£ç¡®ååºå¼èµå¼ï¼å建æ°ç xAxis å series 对象 // æ£ç¡®ååºå¼èµå¼ï¼å建æ°ç xAxis å series 对象 xAxis2.value = [ { type: 'category', @@ -458,6 +439,7 @@ width: 56vw; margin-bottom: 20px; } .card-top-right { padding: 16px; background: #fff; @@ -466,6 +448,7 @@ margin-bottom: 20px; margin-left: 20px; } .card-bottom { padding: 16px; background: #fff; @@ -473,6 +456,7 @@ width: 85.2vw; margin-bottom: 20px; } .title { position: relative; font-size: 18px; @@ -481,6 +465,7 @@ padding-left: 10px; margin-bottom: 26px; } .title::before { position: absolute; left: 0; @@ -488,12 +473,14 @@ content: ''; width: 4px; height: 18px; background-color: #3A7BFA; background-color: #002FA7; border-radius: 2px; } .card-group { display: flex; } .info-card { width: 300px; height: 126px; @@ -503,6 +490,7 @@ justify-content: space-around; align-items: center; } .info-card1 { width: 300px; height: 126px; @@ -513,6 +501,7 @@ justify-content: space-around; align-items: center; } .info-card2 { width: 300px; height: 126px; @@ -522,12 +511,14 @@ justify-content: space-around; align-items: center; } .info-message { display: flex; flex-direction: column; justify-content: center; align-items: center; } .info-message1 { font-weight: bold; display: flex; @@ -535,6 +526,7 @@ justify-content: center; align-items: flex-start; } .info-message2 { font-weight: bold; display: flex; @@ -542,25 +534,30 @@ align-items: center; justify-content: space-around; } .info-number { font-weight: bold; font-size: 32px; color: #FFFFFF; margin-bottom: 10px; } .info-title { font-weight: bold; font-size: 18px; color: #FFFFFF; } .pie { display: flex; flex-direction: row; justify-content: space-around; } .pie-group { display: flex; } .pie-title { font-size: 14px; line-height: 24px; @@ -568,16 +565,24 @@ padding-left: 16px; position: relative; } .pie-title::before { content: ''; width: 6px; /* èç¹ç宽度 */ height: 6px; /* èç¹çé«åº¦ */ background-color: #2853FD; /* èç¹çé¢è² */ border-radius: 50%; /* å°æ£æ¹å½¢å为åå½¢ */ width: 6px; /* èç¹ç宽度 */ height: 6px; /* èç¹çé«åº¦ */ background-color: #2853FD; /* èç¹çé¢è² */ border-radius: 50%; /* å°æ£æ¹å½¢å为åå½¢ */ position: absolute; left: 0; /* å®ä½å°å·¦è¾¹ */ top: 9px; /* åç´å± ä¸å¯¹é½ï¼æ ¹æ®è¡é«è°æ´ */ left: 0; /* å®ä½å°å·¦è¾¹ */ top: 9px; /* åç´å± ä¸å¯¹é½ï¼æ ¹æ®è¡é«è°æ´ */ } .pie-title1 { font-size: 14px; line-height: 24px; @@ -585,26 +590,35 @@ padding-left: 16px; position: relative; } .pie-title1::before { content: ''; width: 6px; /* èç¹ç宽度 */ height: 6px; /* èç¹çé«åº¦ */ background-color: #1EBFAC; /* èç¹çé¢è² */ border-radius: 50%; /* å°æ£æ¹å½¢å为åå½¢ */ width: 6px; /* èç¹ç宽度 */ height: 6px; /* èç¹çé«åº¦ */ background-color: #1EBFAC; /* èç¹çé¢è² */ border-radius: 50%; /* å°æ£æ¹å½¢å为åå½¢ */ position: absolute; left: 0; /* å®ä½å°å·¦è¾¹ */ top: 9px; /* åç´å± ä¸å¯¹é½ï¼æ ¹æ®è¡é«è°æ´ */ left: 0; /* å®ä½å°å·¦è¾¹ */ top: 9px; /* åç´å± ä¸å¯¹é½ï¼æ ¹æ®è¡é«è°æ´ */ } .pie-info { padding-left: 16px; font-size: 14px; line-height: 24px; } .pie-number { color: #2853FD; } .pie-number1 { color: #1EBFAC; } </style> src/views/inventoryManagement/issueManagement/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,359 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="åºåºæ¶é´" prop="salesContractNo" width="180" show-overflow-tooltip /> <el-table-column label="åºåºæ¹æ¬¡" prop="customerContractNo" width="180" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="customerName" width="300" show-overflow-tooltip /> <el-table-column label="产å大类" prop="salesman" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="projectName" width="180" show-overflow-tooltip /> <el-table-column label="åä½" prop="contractAmount" width="180" show-overflow-tooltip /> <el-table-column label="åºåºæ°é" prop="entryPersonName" width="100" show-overflow-tooltip /> <el-table-column label="å«ç¨åä»·" prop="entryDate" width="120" show-overflow-tooltip /> <el-table-column label="å«ç¨æ»ä»·" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="ç¨ç" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="åºåºäºº" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢å ¥åº' : 'ç¼è¾å ¥åº'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¾åºååç§°ï¼" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产å大类ï¼" prop="salesman"> <el-select v-model="form.salesman" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="è§æ ¼åå·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å ¥åºæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºæ¹æ¬¡ï¼" prop="entryPerson"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å ¥åºæ°éï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å«ç¨åä»·ï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å«ç¨æ»ä»·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¸å«ç¨æ»ä»·ï¼" prop="entryDate"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºäººï¼" prop="entryPerson"> <el-select v-model="form.entryPerson" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import { userListNoPage } from "@/api/system/user.js"; import { ledgerListPage, customerList, addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger } from "@/api/salesManagement/salesLedger.js"; const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const userList = ref([]) const customerOption = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 100, }) const total = ref(0) const fileList = ref([]) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { customerName: '', }, form: { salesContractNo: '', salesman: '', customerContractNo: '', customerId: '', projectName: '', entryPerson: '', entryDate: '', maintenanceTime: '', productData: [], executionDate: '' }, rules: { salesman: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerContractNo: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], customerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], entryPerson: [{ required: true, message: "è¯·éæ©", trigger: "change" }], entryDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], executionDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList() } const getList = () => { tableLoading.value = true ledgerListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.records tableData.value.map(item => { item.children = [] }) total.value = res.total }).catch(() => { tableLoading.value = false }) } const findNodeById = (nodes, productId) => { for (let i = 0; i < nodes.length; i++) { if (nodes[i].value === productId) { return nodes[i].label; // æ¾å°èç¹ï¼è¿å该èç¹ } if (nodes[i].children && nodes[i].children.length > 0) { const foundNode = findNodeById(nodes[i].children, productId); if (foundNode) { return foundNode.label; // å¨åèç¹ä¸æ¾å°ï¼è¿å该èç¹ } } } return null; // æ²¡ææ¾å°èç¹ï¼è¿ånull }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.children !== undefined); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type form.value = {} productData.value = [] let userLists = await userListNoPage() userList.value = userLists.data customerList().then(res => { customerOption.value = res }) console.log('userStore.id', userStore.id) form.value.entryPerson = userStore.id if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { form.value = { ...res } form.value.entryPerson = Number(res.entryPerson) productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles }) } // let userAll = await userStore.getInfo() // userList.value.forEach(element => { // if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) { // form.value.entryPerson = userAll.user.userId // 设置é»è®¤ä¸å¡å为å½åç¨æ· // } // }); form.value.entryDate = getCurrentDate() // 设置é»è®¤å½å ¥æ¥æä¸ºå½åæ¥æ dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { if (productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value) } else { proxy.$modal.msgWarning('请添å 产åä¿¡æ¯') return } let tempFileIds = [] if (fileList.value.length > 0) { tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds form.value.type = 1 addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/sales/ledger/export", {}, 'å ¥åºå°è´¦.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } // å é¤ const handleDelete = () => { let ids = [] if (selectedRows.value.length > 0) { ids = selectedRows.value.map(item => item.id); } else { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); // æä»½ä»0å¼å§ const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } onMounted(() => { getList() }) </script> <style scoped lang="scss"></style> src/views/inventoryManagement/receiptManagement/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,359 @@ <template> <div class="app-container"> <div class="search_form"> <div> <span class="search_title">ä¾åºååç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> <el-button @click="handleOut">导åº</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="å ¥åºæ¶é´" prop="salesContractNo" width="180" show-overflow-tooltip /> <el-table-column label="å ¥åºæ¹æ¬¡" prop="customerContractNo" width="180" show-overflow-tooltip /> <el-table-column label="ä¾åºååç§°" prop="customerName" width="300" show-overflow-tooltip /> <el-table-column label="产å大类" prop="salesman" width="100" show-overflow-tooltip /> <el-table-column label="è§æ ¼åå·" prop="projectName" width="180" show-overflow-tooltip /> <el-table-column label="åä½" prop="contractAmount" width="180" show-overflow-tooltip /> <el-table-column label="å ¥åºæ°é" prop="entryPersonName" width="100" show-overflow-tooltip /> <el-table-column label="å«ç¨åä»·" prop="entryDate" width="120" show-overflow-tooltip /> <el-table-column label="å«ç¨æ»ä»·" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="ç¨ç" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="ä¸å«ç¨æ»ä»·" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column label="å ¥åºäºº" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢å ¥åº' : 'ç¼è¾å ¥åº'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¾åºååç§°ï¼" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产å大类ï¼" prop="salesman"> <el-select v-model="form.salesman" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="è§æ ¼åå·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å ¥åºæ¶é´ï¼" prop="projectName"> <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºæ¹æ¬¡ï¼" prop="entryPerson"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å ¥åºæ°éï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å«ç¨åä»·ï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å«ç¨æ»ä»·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¨çï¼" prop="customerId"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="ä¸å«ç¨æ»ä»·ï¼" prop="entryDate"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å ¥åºäººï¼" prop="entryPerson"> <el-select v-model="form.entryPerson" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确认</el-button> <el-button @click="closeDia">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import { userListNoPage } from "@/api/system/user.js"; import { ledgerListPage, customerList, addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger } from "@/api/salesManagement/salesLedger.js"; const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) const productData = ref([]) const selectedRows = ref([]) const userList = ref([]) const customerOption = ref([]) const tableLoading = ref(false) const page = reactive({ current: 1, size: 100, }) const total = ref(0) const fileList = ref([]) // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® const operationType = ref('') const dialogFormVisible = ref(false) const data = reactive({ searchForm: { customerName: '', }, form: { salesContractNo: '', salesman: '', customerContractNo: '', customerId: '', projectName: '', entryPerson: '', entryDate: '', maintenanceTime: '', productData: [], executionDate: '' }, rules: { salesman: [{ required: true, message: "è¯·éæ©", trigger: "change" }], customerContractNo: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], customerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], projectName: [{ required: true, message: "请è¾å ¥", trigger: "blur" }], entryPerson: [{ required: true, message: "è¯·éæ©", trigger: "change" }], entryDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], executionDate: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { searchForm, form, rules } = toRefs(data) // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1 getList() } const paginationChange = (obj) => { page.current = obj.page; page.size = obj.limit; getList() } const getList = () => { tableLoading.value = true ledgerListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.records tableData.value.map(item => { item.children = [] }) total.value = res.total }).catch(() => { tableLoading.value = false }) } const findNodeById = (nodes, productId) => { for (let i = 0; i < nodes.length; i++) { if (nodes[i].value === productId) { return nodes[i].label; // æ¾å°èç¹ï¼è¿å该èç¹ } if (nodes[i].children && nodes[i].children.length > 0) { const foundNode = findNodeById(nodes[i].children, productId); if (foundNode) { return foundNode.label; // å¨åèç¹ä¸æ¾å°ï¼è¿å该èç¹ } } } return null; // æ²¡ææ¾å°èç¹ï¼è¿ånull }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.children !== undefined); console.log('selection', selectedRows.value) } const expandedRowKeys = ref([]) // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; // æå¼å¼¹æ¡ const openForm = async (type, row) => { operationType.value = type form.value = {} productData.value = [] let userLists = await userListNoPage() userList.value = userLists.data customerList().then(res => { customerOption.value = res }) console.log('userStore.id', userStore.id) form.value.entryPerson = userStore.id if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { form.value = { ...res } form.value.entryPerson = Number(res.entryPerson) productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles }) } // let userAll = await userStore.getInfo() // userList.value.forEach(element => { // if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) { // form.value.entryPerson = userAll.user.userId // 设置é»è®¤ä¸å¡å为å½åç¨æ· // } // }); form.value.entryDate = getCurrentDate() // 设置é»è®¤å½å ¥æ¥æä¸ºå½åæ¥æ dialogFormVisible.value = true } // æäº¤è¡¨å const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { if (productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value) } else { proxy.$modal.msgWarning('请添å 产åä¿¡æ¯') return } let tempFileIds = [] if (fileList.value.length > 0) { tempFileIds = fileList.value.map(item => item.tempId) } form.value.tempFileIds = tempFileIds form.value.type = 1 addOrUpdateSalesLedger(form.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeDia() getList() }) } }) } // å ³éå¼¹æ¡ const closeDia = () => { proxy.resetForm("formRef") dialogFormVisible.value = false } // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/sales/ledger/export", {}, 'å ¥åºå°è´¦.xlsx') }).catch(() => { proxy.$modal.msg("已忶") }) } // å é¤ const handleDelete = () => { let ids = [] if (selectedRows.value.length > 0) { ids = selectedRows.value.map(item => item.id); } else { proxy.$modal.msgWarning('è¯·éæ©æ°æ®') return } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") getList() }) }).catch(() => { proxy.$modal.msg("已忶") }) } // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); // æä»½ä»0å¼å§ const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } onMounted(() => { getList() }) </script> <style scoped lang="scss"></style> src/views/salesManagement/salesLedger/index.vue
@@ -3,14 +3,8 @@ <div class="search_form"> <div> <span class="search_title">客æ·åç§°ï¼</span> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <el-input v-model="searchForm.customerName" style="width: 240px" placeholder="请è¾å ¥" @change="handleQuery" clearable prefix-icon="Search" /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> </div> <div> @@ -20,64 +14,59 @@ </div> </div> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)"> <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)"> <el-table-column align="center" type="selection" width="55" /> <el-table-column type="expand"> <template #default="props"> <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable"> <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="产å大类" prop="productCategory" /> <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"/> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber"/> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber"/> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> </el-table> </template> </el-table-column> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="éå®ååå·" prop="salesContractNo" width="180" show-overflow-tooltip/> <el-table-column label="客æ·ååå·" prop="customerContractNo" width="180" show-overflow-tooltip/> <el-table-column label="客æ·åç§°" prop="customerName" width="300" show-overflow-tooltip/> <el-table-column label="ä¸å¡å" prop="salesman" width="100" show-overflow-tooltip/> <el-table-column label="项ç®åç§°" prop="projectName" width="180" show-overflow-tooltip/> <el-table-column label="ååéé¢(å )" prop="contractAmount" width="180" show-overflow-tooltip :formatter="formattedNumber"/> <el-table-column label="å½å ¥äºº" prop="entryPersonName" width="100" show-overflow-tooltip/> <el-table-column label="å½å ¥æ¥æ" prop="entryDate" width="120" show-overflow-tooltip/> <el-table-column label="ç¾è®¢æ¥æ" prop="executionDate" width="120" show-overflow-tooltip/> <el-table-column label="éå®ååå·" prop="salesContractNo" width="180" show-overflow-tooltip /> <el-table-column label="客æ·ååå·" prop="customerContractNo" width="180" show-overflow-tooltip /> <el-table-column label="客æ·åç§°" prop="customerName" width="300" show-overflow-tooltip /> <el-table-column label="ä¸å¡å" prop="salesman" width="100" show-overflow-tooltip /> <el-table-column label="项ç®åç§°" prop="projectName" width="180" show-overflow-tooltip /> <el-table-column label="ååéé¢(å )" prop="contractAmount" width="180" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="å½å ¥äºº" prop="entryPersonName" width="100" show-overflow-tooltip /> <el-table-column label="å½å ¥æ¥æ" prop="entryDate" width="120" show-overflow-tooltip /> <el-table-column label="ç¾è®¢æ¥æ" prop="executionDate" width="120" show-overflow-tooltip /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢éå®å°è´¦é¡µé¢' : 'ç¼è¾éå®å°è´¦é¡µé¢'" width="70%" @close="closeDia"> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢éå®å°è´¦é¡µé¢' : 'ç¼è¾éå®å°è´¦é¡µé¢'" width="70%" @close="closeDia"> <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="éå®ååå·ï¼" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="èªå¨çæ" clearable disabled/> <el-input v-model="form.salesContractNo" placeholder="èªå¨çæ" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ä¸å¡åï¼" prop="salesman"> <el-select v-model="form.salesman" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" /> </el-select> </el-form-item> </el-col> @@ -85,14 +74,14 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="客æ·ååå·ï¼" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable/> <el-input v-model="form.customerContractNo" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="客æ·åç§°ï¼" prop="customerId"> <el-select v-model="form.customerId" placeholder="è¯·éæ©" clearable> <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"> {{item.customerName + 'ââ' + item.taxpayerIdentificationNumber}} {{ item.customerName + 'ââ' + item.taxpayerIdentificationNumber }} </el-option> </el-select> </el-form-item> @@ -101,13 +90,13 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="项ç®åç§°ï¼" prop="projectName"> <el-input v-model="form.projectName" placeholder="请è¾å ¥" clearable/> <el-input v-model="form.projectName" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å½å ¥äººï¼" prop="entryPerson"> <el-select v-model="form.entryPerson" placeholder="è¯·éæ©" clearable @change="changs" disabled> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> </el-select> </el-form-item> </el-col> @@ -115,29 +104,14 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="å½å ¥æ¥æï¼" prop="entryDate"> <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable disabled /> <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç¾è®¢æ¥æï¼" prop="executionDate"> <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> @@ -147,7 +121,8 @@ <el-button plain type="danger" @click="deleteProduct">å é¤</el-button> </el-form-item> </el-row> <el-table :data="productData" border @selection-change="productSelected" show-summary :summary-method="summarizeMainTable"> <el-table :data="productData" border @selection-change="productSelected" show-summary :summary-method="summarizeMainTable"> <el-table-column align="center" type="selection" width="55" /> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="产å大类" prop="productCategory" /> @@ -155,9 +130,9 @@ <el-table-column label="åä½" prop="unit" /> <el-table-column label="æ°é" prop="quantity" /> <el-table-column label="ç¨ç(%)" prop="taxRate" /> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"/> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber"/> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber"/> <el-table-column label="å«ç¨åä»·(å )" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> <el-table-column label="å«ç¨æ»ä»·(å )" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> <el-table-column label="ä¸å«ç¨æ»ä»·(å )" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row);">ç¼è¾</el-button> @@ -167,25 +142,16 @@ <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="夿³¨Â·ï¼" prop="remark"> <el-input v-model="form.remark" placeholder="请è¾å ¥" clearable type="textarea" :rows="2"/> <el-input v-model="form.remark" placeholder="请è¾å ¥" clearable type="textarea" :rows="2" /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove" > <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove"> <el-button type="primary">ä¸ä¼ </el-button> <template #tip> <div class="el-upload__tip"> @@ -204,27 +170,17 @@ </div> </template> </el-dialog> <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? 'æ°å¢äº§å' : 'ç¼è¾äº§å'" width="40%" @close="closeProductDia"> <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef"> <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? 'æ°å¢äº§å' : 'ç¼è¾äº§å'" width="40%" @close="closeProductDia"> <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef"> <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="产å大类ï¼" prop="productCategory"> <!-- <el-select v-model="productForm.productCategory" placeholder="è¯·éæ©" clearable> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> </el-select> --> <el-tree-select v-model="productForm.productCategory" placeholder="è¯·éæ©" clearable check-strictly @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" /> <el-tree-select v-model="productForm.productCategory" placeholder="è¯·éæ©" clearable check-strictly @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" /> </el-form-item> </el-col> @@ -233,7 +189,7 @@ <el-col :span="24"> <el-form-item label="è§æ ¼åå·ï¼" prop="productModelId"> <el-select v-model="productForm.productModelId" placeholder="è¯·éæ©" clearable @change="getProductModel"> <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/> <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" /> </el-select> </el-form-item> </el-col> @@ -241,12 +197,13 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="åä½ï¼" prop="unit"> <el-input v-model="productForm.unit" placeholder="请è¾å ¥" clearable/> <el-input v-model="productForm.unit" placeholder="请è¾å ¥" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ°éï¼" prop="quantity"> <el-input type="number" :step="0.1" :min="0" v-model="productForm.quantity" placeholder="请è¾å ¥" clearable @change="mathNum" /> <el-input type="number" :step="0.1" :min="0" v-model="productForm.quantity" placeholder="请è¾å ¥" clearable @change="mathNum" /> </el-form-item> </el-col> </el-row> @@ -258,10 +215,10 @@ </el-col> <el-col :span="12"> <el-form-item label="ç¨ç(%)ï¼" prop="taxRate"> <el-select v-model="productForm.taxRate" placeholder="è¯·éæ©" clearable @change="mathNum"> <el-option label="1" value="1"/> <el-option label="6" value="6"/> <el-option label="13" value="13"/> <el-select v-model="productForm.taxRate" placeholder="è¯·éæ©" clearable @change="mathNum"> <el-option label="1" value="1" /> <el-option label="6" value="6" /> <el-option label="13" value="13" /> </el-select> </el-form-item> </el-col> @@ -282,8 +239,8 @@ <el-col :span="12"> <el-form-item label="å票类åï¼" prop="invoiceType"> <el-select v-model="productForm.invoiceType" placeholder="è¯·éæ©" clearable> <el-option label="墿®ç¥¨" value="墿®ç¥¨"/> <el-option label="å¢ä¸ç¥¨" value="å¢ä¸ç¥¨"/> <el-option label="墿®ç¥¨" value="墿®ç¥¨" /> <el-option label="å¢ä¸ç¥¨" value="å¢ä¸ç¥¨" /> </el-select> </el-form-item> </el-col> @@ -303,9 +260,9 @@ import { getToken } from "@/utils/auth" import pagination from '@/components/PIMTable/Pagination.vue' import { ref } from 'vue' import {ElMessageBox } from "element-plus"; import { ElMessageBox } from "element-plus"; import useUserStore from '@/store/modules/user' import {userListNoPage} from "@/api/system/user.js"; import { userListNoPage } from "@/api/system/user.js"; import { ledgerListPage, productList, @@ -313,7 +270,7 @@ addOrUpdateSalesLedger, getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile } from "@/api/salesManagement/salesLedger.js"; import {modelList, productTreeList} from "@/api/basicData/product.js"; import { modelList, productTreeList } from "@/api/basicData/product.js"; const userStore = useUserStore() const { proxy } = getCurrentInstance() const tableData = ref([]) @@ -349,7 +306,7 @@ entryDate: '', maintenanceTime: '', productData: [], executionDate:'' executionDate: '' }, rules: { salesman: [{ required: true, message: "è¯·éæ©", trigger: "change" }], @@ -411,7 +368,7 @@ } const getList = () => { tableLoading.value = true ledgerListPage({...searchForm.value, ...page}).then(res => { ledgerListPage({ ...searchForm.value, ...page }).then(res => { tableLoading.value = false tableData.value = res.records tableData.value.map(item => { @@ -432,13 +389,13 @@ return parseFloat(cellValue).toFixed(2); }; // è·åtreeåæ°æ® const getModels =(value) => { const getModels = (value) => { productForm.value.productCategory = findNodeById(productOptions.value, value) modelList({id: value}).then(res => { modelList({ id: value }).then(res => { modelOptions.value = res }) } const getProductModel =(value) => { const getProductModel = (value) => { console.log('value', value) const index = modelOptions.value.findIndex(item => item.id === value); if (index !== -1) { @@ -482,7 +439,7 @@ // è¿æ»¤æåæ°æ® selectedRows.value = selection.filter(item => item.children !== undefined); console.log('selection',selectedRows.value) console.log('selection', selectedRows.value) } const productSelected = (selectedRows) => { productSelectedRows.value = selectedRows @@ -493,13 +450,13 @@ if (expandedRows.length > 0) { expandedRowKeys.value = [] try { productList({salesLedgerId: row.id, type: 1}).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res; } expandedRowKeys.value.push(row.id) }) productList({ salesLedgerId: row.id, type: 1 }).then(res => { const index = tableData.value.findIndex(item => item.id === row.id); if (index > -1) { tableData.value[index].children = res; } expandedRowKeys.value.push(row.id) }) } catch (error) { console.log(error) } @@ -509,7 +466,7 @@ } // 主表åè®¡æ¹æ³ const summarizeMainTable = (param) => { return proxy.summarizeTable(param, ['contractAmount','taxInclusiveTotalPrice','taxExclusiveTotalPrice']); return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); }; // å表åè®¡æ¹æ³ const summarizeChildrenTable = (param) => { @@ -525,12 +482,12 @@ customerList().then(res => { customerOption.value = res }) console.log('userStore.id',userStore.id) console.log('userStore.id', userStore.id) form.value.entryPerson = userStore.id if (type === 'edit') { currentId.value = row.id; getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => { form.value = {...res} getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => { form.value = { ...res } form.value.entryPerson = Number(res.entryPerson) productData.value = form.value.productData fileList.value = form.value.salesLedgerFiles @@ -545,7 +502,7 @@ form.value.entryDate = getCurrentDate() // 设置é»è®¤å½å ¥æ¥æä¸ºå½åæ¥æ dialogFormVisible.value = true } function changs(val){ function changs(val) { console.log(val); } // ä¸ä¼ åæ ¡æ£ @@ -575,7 +532,7 @@ } } // ç§»é¤æä»¶ function handleRemove (file) { function handleRemove(file) { if (operationType.value === 'edit') { let ids = [] ids.push(file.id) @@ -619,7 +576,7 @@ productForm.value = {} proxy.resetForm("productFormRef") if (type === 'edit') { productForm.value = {...row} productForm.value = { ...row } } productFormVisible.value = true getProductOptions() @@ -631,7 +588,7 @@ if (operationType.value === "edit") { submitProductEdit() } else { productData.value.push({...productForm.value}) productData.value.push({ ...productForm.value }) closeProductDia() } } @@ -642,7 +599,7 @@ addOrUpdateSalesLedgerProduct(productForm.value).then(res => { proxy.$modal.msgSuccess("æäº¤æå") closeProductDia() getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => { getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(res => { productData.value = res.productData }) }) @@ -666,17 +623,17 @@ ids = productSelectedRows.value.map(item => item.id); } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delProduct(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") closeProductDia() getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => { getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(res => { productData.value = res.productData }) }) @@ -694,12 +651,12 @@ // å¯¼åº const handleOut = () => { ElMessageBox.confirm( 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } 'éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { proxy.download("/sales/ledger/export", {}, 'éå®å°è´¦.xlsx') }).catch(() => { @@ -716,12 +673,12 @@ return } ElMessageBox.confirm( 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } 'éä¸çå 容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', '导åº', { confirmButtonText: '确认', cancelButtonText: 'åæ¶', type: 'warning', } ).then(() => { delLedger(ids).then(res => { proxy.$modal.msgSuccess("å 餿å") @@ -741,16 +698,16 @@ } const mathNum = () => { console.log('productForm.value',productForm.value) if(!productForm.value.taxInclusiveUnitPrice){ console.log('productForm.value', productForm.value) if (!productForm.value.taxInclusiveUnitPrice) { return } if(!productForm.value.quantity){ if (!productForm.value.quantity) { return } // å«ç¨æ»ä»·è®¡ç® productForm.value.taxInclusiveTotalPrice = proxy.calculateTaxIncludeTotalPrice(productForm.value.taxInclusiveUnitPrice, productForm.value.quantity) if(productForm.value.taxRate){ if (productForm.value.taxRate) { // ä¸å«ç¨æ»ä»·è®¡ç® productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(productForm.value.taxInclusiveTotalPrice, productForm.value.taxRate) } @@ -758,6 +715,4 @@ getList() </script> <style scoped lang="scss"> </style> <style scoped lang="scss"></style>