diff --git a/ExportFiles/仓库使用记录_20251226210512.xls b/ExportFiles/仓库使用记录_20251226210512.xls new file mode 100644 index 0000000..c3763fa --- /dev/null +++ b/ExportFiles/仓库使用记录_20251226210512.xls diff --git a/ExportFiles/报销表明细_2025年12月.xls b/ExportFiles/报销表明细_2025年12月.xls new file mode 100644 index 0000000..c1b41b2 --- /dev/null +++ b/ExportFiles/报销表明细_2025年12月.xls diff --git a/antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue b/antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue index 24ec00c..4ae9dc8 100644 --- a/antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue +++ b/antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue @@ -8,33 +8,14 @@
- + - - + + @@ -78,478 +59,356 @@
- -
-
- - - -
- - 业绩走势对比 -
-
-
-
- - -
- - 消耗走势对比 -
-
-
-
-
- - - -
- - 客头数走势 -
-
-
-
- - -
- - 客次数走势 -
-
-
-
- - -
- - 项目数走势 -
-
-
-
-
-
- + +
+
+ + +
- - 月度趋势数据列表 + + 业绩走势对比
- - - - - +
-
+ + + +
+ + 消耗走势对比 +
+
+
+
+ + + + +
+ + 客头数走势 +
+
+
+
+ + +
+ + 客次数走势 +
+
+
+
+ + +
+ + 项目数走势 +
+
+
+
+
+
+ +
+ + 月度趋势数据列表 +
+ + + + + +
+
- -
-
- + +
+
+ +
+ + 业绩走势图 +
+
+
+
+
- - 业绩走势图 + + 业绩数据列表
-
+ + + + +
-
- -
- - 业绩数据列表 -
- - - - - -
-
+
- -
-
- + +
+
+ +
+ + 消耗走势图 +
+
+
+
+
- - 消耗走势图 + + 消耗数据列表
-
+ + + + +
-
- -
- - 消耗数据列表 -
- - - - - -
-
+
- -
-
- + +
+
+ +
+ + 人头数走势图 +
+
+
+
+
- - 人头数走势图 + + 人头数据列表
-
+ + + + +
-
- -
- - 人头数据列表 -
- - - - - -
-
+
- -
-
- + +
+
+ +
+ + 人次走势图 +
+
+
+
+
- - 人次走势图 + + 人次数据列表
-
+ + + + +
-
- -
- - 人次数据列表 -
- - - - - -
-
+
- -
-
- + +
+
+ +
+ + 项目数走势图 +
+
+
+
+
- - 项目数走势图 + + 项目数据列表
-
+ + + + +
-
- -
- - 项目数据列表 -
- - - - - -
-
+
- -
-
-
- - - - 总业绩 - - - - 总消耗 - - - - 客头数 - - - - 客次数 - - - - 项目数 - - -
- - - -
- - 各门店指标对比 -
-
-
-
- - -
- - 门店占比分析 -
-
-
-
-
-
- + +
+
+
+ + + + 总业绩 + + + + 总消耗 + + + + 客头数 + + + + 客次数 + + + + 项目数 + + +
+ + +
- - 门店指标数据列表 + + 各门店指标对比
- - - - - +
-
-
-
- - -
-
-
- - - - 总业绩 - - - - 总消耗 - - - - 客头数 - - - - 客次数 - - - - 项目数 - - -
- - - -
- - 事业部贡献占比 -
-
-
-
- - -
- - 事业部增长率分析 -
-
-
-
-
-
- + + +
- - 事业部指标数据列表 + + 门店占比分析
- - - - - +
-
+ + +
+ +
+ + 门店指标数据列表 +
+ + + + + +
+
- -
-
+ +
+
+
+ + + + 总业绩 + + + + 总消耗 + + + + 客头数 + + + + 客次数 + + + + 项目数 + + +
+ + + +
+ + 事业部贡献占比 +
+
+
+
+ + +
+ + 事业部增长率分析 +
+
+
+
+
+
- 事业部汇总数据列表 + 事业部指标数据列表
- - + + @@ -722,7 +604,7 @@ export default { storeName: this.query.storeName || '', type: item.field // type 作为单独的查询参数传递 } - + const res = await getMonthlyTrend(params) if (res && res.data) { // 立即渲染,避免数据被覆盖 @@ -735,10 +617,10 @@ export default { // 加载列表数据(使用当前选中的趋势类型对应的数据) try { - const res = await getMonthlyTrend({ - year: this.query.year, - storeName: this.query.storeName, - type: this.trendField || 'totalperformance' + const res = await getMonthlyTrend({ + year: this.query.year, + storeName: this.query.storeName, + type: this.trendField || 'totalperformance' }) if (res && res.data && res.data.rows) { this.trendTableData = res.data.rows @@ -870,7 +752,7 @@ export default { async loadBuSummary() { this.buSummaryTableLoading = true try { - const res = await getBusinessUnitSummaryStat(this.query) + const res = await getBusinessUnitSummaryStat(this.query) if (res.data && res.data.list) { this.buSummaryTableData = res.data.list this.buildBuSummaryTableColumns() @@ -927,13 +809,13 @@ export default { if (oldChart) { oldChart.dispose() } - + const chart = echarts.init(chartDom) - const months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] - + const months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + // 确保使用传入的 data,而不是共享的数据 const rows = data && data.rows ? data.rows : [] - + const currentYearValues = months.map((m) => { return rows.reduce((sum, row) => { const value = row['month' + m] || 0 @@ -946,22 +828,22 @@ export default { const value = row['lastMonth' + m] || 0 return sum + (typeof value === 'number' ? value : 0) }, 0) - }) + }) - // 获取颜色配置 - const colors = this.getChartColors(name) - - const option = { - tooltip: { - trigger: 'axis', + // 获取颜色配置 + const colors = this.getChartColors(name) + + const option = { + tooltip: { + trigger: 'axis', formatter: function (params) { - let res = params[0].name + '
' + let res = params[0].name + '
' params.forEach((item) => { - res += item.marker + item.seriesName + ': ' + item.value.toLocaleString() + '
' - }) - return res - } - }, + res += item.marker + item.seriesName + ': ' + item.value.toLocaleString() + '
' + }) + return res + } + }, legend: { data: ['本年走势', '上年走势'], top: 10 @@ -981,7 +863,7 @@ export default { yAxis: { type: 'value' }, - series: [ + series: [ { name: '本年走势', type: 'line', @@ -999,9 +881,9 @@ export default { itemStyle: { color: colors.last }, lineStyle: { type: 'dashed', color: colors.last, width: 2 } } - ] - } - chart.setOption(option) + ] + } + chart.setOption(option) }) }, // 渲染月度统计图表 @@ -1021,10 +903,10 @@ export default { return (data.rows || []).reduce((sum, row) => sum + (row['lastMonth' + m] || 0), 0) }) - // 获取颜色配置 - const colors = this.getChartColors(name) + // 获取颜色配置 + const colors = this.getChartColors(name) - const option = { + const option = { tooltip: { trigger: 'axis', formatter: function (params) { @@ -1325,7 +1207,7 @@ export default { buildTrendTableColumns(data) { const columns = [ { label: '事业部', prop: 'businessUnitName', width: 120, align: 'left' }, - { label: '门店', prop: 'storeName', width: 150, align: 'left' } + { label: '门店', prop: 'storeName', align: 'left' } ] for (let i = 1; i <= 12; i++) { @@ -1378,7 +1260,7 @@ export default { buildMonthlyStatTableColumns(data, name) { const columns = [ { label: '事业部', prop: 'businessUnitName', width: 120, align: 'left' }, - { label: '门店', prop: 'storeName', width: 150, align: 'left' } + { label: '门店', prop: 'storeName', align: 'left' } ] for (let i = 1; i <= 12; i++) { @@ -1459,7 +1341,7 @@ export default { buildStoreIndicatorTableColumns() { this.storeIndicatorTableColumns = [ { label: '事业部', prop: 'businessUnitName', width: 120, align: 'left' }, - { label: '门店', prop: 'storeName', width: 150, align: 'left' }, + { label: '门店', prop: 'storeName', align: 'left' }, { label: '本年数值', prop: 'currentYearValue', @@ -1530,7 +1412,7 @@ export default { buildBuSummaryTableColumns() { this.buSummaryTableColumns = [ { label: '事业部', prop: 'businessUnitName', width: 120, align: 'left' }, - { label: '门店', prop: 'storeName', width: 150, align: 'left' }, + { label: '门店', prop: 'storeName', align: 'left' }, { label: '本年业绩', prop: 'currentPerformance', @@ -1858,6 +1740,33 @@ export default { margin-right: 8px; } } + + // 事业部汇总表格特殊样式 + &.bu-summary-card { + &::v-deep .el-card__body { + height: auto !important; + max-height: none !important; + overflow: visible !important; + } + } + } + + // 事业部汇总表格样式 + .bu-summary-table { + height: auto !important; + max-height: none !important; + overflow: visible !important; + + &::v-deep .el-table__body-wrapper { + height: auto !important; + max-height: none !important; + overflow: visible !important; + } + + &::v-deep .el-table { + height: auto !important; + max-height: none !important; + } } .table-section { @@ -1868,7 +1777,7 @@ export default { font-weight: 600; } - .el-table__body tr:hover > td { + .el-table__body tr:hover>td { background-color: #f5f7fa; } } diff --git a/antis-ncc-admin/src/views/lqInventory/export-usage-dialog.vue b/antis-ncc-admin/src/views/lqInventory/export-usage-dialog.vue index 362ebb6..5c4c12e 100644 --- a/antis-ncc-admin/src/views/lqInventory/export-usage-dialog.vue +++ b/antis-ncc-admin/src/views/lqInventory/export-usage-dialog.vue @@ -7,8 +7,10 @@ - - + + + + @@ -19,10 +21,13 @@ format="yyyy-MM-dd HH:mm:ss" style="width: 100%" /> - - - - + + + + + + + @@ -75,11 +80,12 @@ export default { usageBatchId: undefined, usageStartTime: undefined, usageEndTime: undefined, - isApproved: undefined, + approvalStatus: undefined, isReceived: undefined, isEffective: undefined }, - usageTimeRange: null + usageTimeRange: null, + productOptions: [] // 产品选项 } }, methods: { @@ -92,11 +98,33 @@ export default { usageBatchId: undefined, usageStartTime: undefined, usageEndTime: undefined, - isApproved: undefined, + approvalStatus: undefined, isReceived: undefined, isEffective: undefined } this.usageTimeRange = null + // 加载产品选项 + this.initProductOptions() + }, + // 加载产品选项 + initProductOptions() { + request({ + url: '/api/Extend/LqProduct/GetList', + method: 'GET', + data: { + currentPage: 1, + pageSize: 1000, + onShelfStatus: 1 // 只获取上架的产品 + } + }).then(res => { + if (res.code == 200 && res.data && res.data.list) { + this.productOptions = res.data.list.filter(product => product.onShelfStatus === 1) + } else { + this.productOptions = [] + } + }).catch(() => { + this.productOptions = [] + }) }, handleExport() { this.btnLoading = true @@ -109,6 +137,14 @@ export default { exportParams.usageEndTime = this.usageTimeRange[1] } + // 处理布尔值参数(转换为字符串true/false) + if (exportParams.isReceived !== undefined && exportParams.isReceived !== null) { + exportParams.isReceived = exportParams.isReceived === true || exportParams.isReceived === 'true' + } + if (exportParams.isEffective !== undefined && exportParams.isEffective !== null) { + exportParams.isEffective = exportParams.isEffective === true || exportParams.isEffective === 'true' + } + // 移除空值 Object.keys(exportParams).forEach(key => { if (exportParams[key] === undefined || exportParams[key] === null || exportParams[key] === '') { @@ -118,7 +154,14 @@ export default { // 构建查询字符串 const queryString = Object.keys(exportParams) - .map(key => `${key}=${encodeURIComponent(exportParams[key])}`) + .map(key => { + const value = exportParams[key] + // 布尔值转换为字符串 + if (typeof value === 'boolean') { + return `${key}=${value}` + } + return `${key}=${encodeURIComponent(value)}` + }) .join('&') // 调用导出接口 diff --git a/antis-ncc-admin/src/views/lqInventory/index.vue b/antis-ncc-admin/src/views/lqInventory/index.vue index 0df5fc8..cd21a08 100644 --- a/antis-ncc-admin/src/views/lqInventory/index.vue +++ b/antis-ncc-admin/src/views/lqInventory/index.vue @@ -40,6 +40,7 @@ 申请列表 门店领取统计 待领取统计 + 导出使用记录
@@ -131,6 +132,8 @@ + +
@@ -140,9 +143,10 @@ import ProductForm from './product-form.vue' import ProductDetailDialog from './product-detail-dialog.vue' import UsageMultiForm from './usage-multi-form.vue' import InventoryForm from './inventory-form.vue' +import ExportUsageDialog from './export-usage-dialog.vue' export default { - components: { ProductForm, ProductDetailDialog, UsageMultiForm, InventoryForm }, + components: { ProductForm, ProductDetailDialog, UsageMultiForm, InventoryForm, ExportUsageDialog }, data() { return { // 产品相关 @@ -159,11 +163,13 @@ export default { productFormVisible: false, detailDialogVisible: false, usageMultiFormVisible: false, - inventoryFormVisible: false + inventoryFormVisible: false, + storeOptions: [] // 门店选项 } }, created() { this.initProductData() + this.initStoreOptions() }, methods: { // 产品相关方法 @@ -289,6 +295,31 @@ export default { query: {} }) }, + // 导出使用记录 + exportUsageRecords() { + this.$nextTick(() => { + this.$refs.ExportUsageDialog.init() + }) + }, + // 初始化门店选项 + initStoreOptions() { + request({ + url: '/api/Extend/LqMdxx', + method: 'GET', + data: { + currentPage: 1, + pageSize: 1000 + } + }).then(res => { + if (res.data && res.data.list) { + this.storeOptions = res.data.list + } else { + this.storeOptions = [] + } + }).catch(() => { + this.storeOptions = [] + }) + }, // 工具方法 formatMoney(amount) { if (!amount && amount !== 0) return '0.00' diff --git a/antis-ncc-admin/src/views/statisticsList/form20.vue b/antis-ncc-admin/src/views/statisticsList/form20.vue index 2a567c9..8fdba6c 100644 --- a/antis-ncc-admin/src/views/statisticsList/form20.vue +++ b/antis-ncc-admin/src/views/statisticsList/form20.vue @@ -27,58 +27,53 @@ - - -
-
-
- 开单业绩 -
-
¥{{ formatMoney(summaryData.totalOrderAchievement) }}
-
+
+
+
+
- - -
-
-
- 消耗业绩 -
-
¥{{ formatMoney(summaryData.totalConsumeAchievement) }}
-
+
+
开单业绩
+
¥{{ formatMoney(summaryData.totalOrderAchievement) }}
- - -
-
-
- 退卡业绩 -
-
¥{{ formatMoney(summaryData.totalRefundAchievement) }}
-
+
+
+
+
- - -
-
-
- 总人头 -
-
{{ summaryData.totalPersonCount || 0 }}
-
+
+
消耗业绩
+
¥{{ formatMoney(summaryData.totalConsumeAchievement) }}
- - -
-
-
- 手工费 -
-
¥{{ formatMoney(summaryData.totalLaborCost) }}
-
+
+
+
+
- - +
+
退卡业绩
+
¥{{ formatMoney(summaryData.totalRefundAchievement) }}
+
+
+
+
+ +
+
+
总人头
+
{{ summaryData.totalPersonCount || 0 }}
+
+
+
+
+ +
+
+
手工费
+
¥{{ formatMoney(summaryData.totalLaborCost) }}
+
+
+
@@ -99,6 +94,11 @@ {{ scope.row.EmployeeName || '无' }} + + +