Commit 6399992260b049ec2417167a8c1ddac9f8922c2c
1 parent
ffd6aaca
fix: 修复开单升单逻辑Bug,新增历史开单记录服务,更新集团驾驶舱标题
- 修复UpdateForNoDelete方法中升单字段赋值错误(升医美和升生美字段错位) - 新增历史开单记录服务(LqOrderRecordsService),支持通过会员编号或手机号查询 - 更新集团驾驶舱及相关子页面标题为更专业的名称
Showing
11 changed files
with
351 additions
and
60 deletions
antis-ncc-admin/src/components/kpi-drill/billing-analysis.vue
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | <div class="chart-card trend-card"> |
| 7 | 7 | <div class="chart-title"> |
| 8 | 8 | <i class="el-icon-date"></i> |
| 9 | - 每日开单金额 & 人数 | |
| 9 | + 日度成交趋势 | |
| 10 | 10 | </div> |
| 11 | 11 | <div ref="billingTrendChart" class="chart-mini"></div> |
| 12 | 12 | </div> |
| ... | ... | @@ -15,7 +15,7 @@ |
| 15 | 15 | <div class="table-header"> |
| 16 | 16 | <div class="table-title"> |
| 17 | 17 | <i class="el-icon-document"></i> |
| 18 | - 本月成交明细 | |
| 18 | + 成交明细清单 | |
| 19 | 19 | </div> |
| 20 | 20 | <div class="list-filters inline"> |
| 21 | 21 | <el-select v-model="listFilter.store" size="mini" placeholder="门店" style="width: 180px;" clearable | ... | ... |
antis-ncc-admin/src/components/kpi-drill/consume-analysis.vue
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | <div class="chart-card trend-card"> |
| 7 | 7 | <div class="chart-title"> |
| 8 | 8 | <i class="el-icon-date"></i> |
| 9 | - 每日消耗金额 & 人数 | |
| 9 | + 日度消耗趋势 | |
| 10 | 10 | </div> |
| 11 | 11 | <div ref="consumeTrendChart" class="chart-mini"></div> |
| 12 | 12 | </div> |
| ... | ... | @@ -15,7 +15,7 @@ |
| 15 | 15 | <div class="table-header"> |
| 16 | 16 | <div class="table-title"> |
| 17 | 17 | <i class="el-icon-document"></i> |
| 18 | - 本月消耗明细 | |
| 18 | + 消耗明细清单 | |
| 19 | 19 | </div> |
| 20 | 20 | <div class="list-filters inline"> |
| 21 | 21 | <el-select v-model="listFilter.store" size="mini" placeholder="门店" style="width: 180px;" clearable | ... | ... |
antis-ncc-admin/src/components/kpi-drill/refund-analysis.vue
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | <div class="chart-card"> |
| 7 | 7 | <div class="chart-title"> |
| 8 | 8 | <i class="el-icon-s-data"></i> |
| 9 | - 各门店退卡金额分布(不包含转卡) | |
| 9 | + 门店退卡分布 | |
| 10 | 10 | <el-tooltip content="实际退卡额,且不含转卡:产生了实际现金支出的退款" placement="top"> |
| 11 | 11 | <i class="el-icon-info" style="margin-left: 2px; color: #909399; cursor: help;"></i> |
| 12 | 12 | </el-tooltip> |
| ... | ... | @@ -18,7 +18,7 @@ |
| 18 | 18 | <div class="table-header"> |
| 19 | 19 | <div class="table-title"> |
| 20 | 20 | <i class="el-icon-document"></i> |
| 21 | - 退卡明细 | |
| 21 | + 退卡明细清单 | |
| 22 | 22 | <el-button v-if="selectedStoreName" type="text" size="small" icon="el-icon-refresh" @click="showAllStores" |
| 23 | 23 | style="margin-left: 12px; color: #409EFF;"> |
| 24 | 24 | 显示全部 | ... | ... |
antis-ncc-admin/src/views/extend/annualSummary/dashboard/index.vue
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | <!-- 顶部状态栏 & 筛选器 --> |
| 4 | 4 | <div class="cockpit-header"> |
| 5 | 5 | <div class="header-left"> |
| 6 | - <h1 class="page-title">年度经营统计分析</h1> | |
| 6 | + <h1 class="page-title">年度经营全景报告</h1> | |
| 7 | 7 | </div> |
| 8 | 8 | <div class="header-right"> |
| 9 | 9 | <el-form :inline="true" :model="query" class="search-form-compact"> |
| ... | ... | @@ -29,31 +29,31 @@ |
| 29 | 29 | <!-- 标签页导航 --> |
| 30 | 30 | <el-tabs v-model="activeMenu" @tab-click="handleTabClick" class="dashboard-tabs"> |
| 31 | 31 | <el-tab-pane name="monthly-trend"> |
| 32 | - <span slot="label"><i class="el-icon-data-line"></i> 月度趋势分析</span> | |
| 32 | + <span slot="label"><i class="el-icon-data-line"></i> 月度经营趋势</span> | |
| 33 | 33 | </el-tab-pane> |
| 34 | 34 | <el-tab-pane name="performance-stat"> |
| 35 | - <span slot="label"><i class="el-icon-trophy"></i> 全年门店业绩表</span> | |
| 35 | + <span slot="label"><i class="el-icon-trophy"></i> 年度业绩总览</span> | |
| 36 | 36 | </el-tab-pane> |
| 37 | 37 | <el-tab-pane name="consume-stat"> |
| 38 | - <span slot="label"><i class="el-icon-shopping-cart-2"></i> 全年门店消耗表</span> | |
| 38 | + <span slot="label"><i class="el-icon-shopping-cart-2"></i> 年度消耗总览</span> | |
| 39 | 39 | </el-tab-pane> |
| 40 | 40 | <el-tab-pane name="headcount-stat"> |
| 41 | - <span slot="label"><i class="el-icon-user"></i> 年度门店人头表</span> | |
| 41 | + <span slot="label"><i class="el-icon-user"></i> 年度客流量总览</span> | |
| 42 | 42 | </el-tab-pane> |
| 43 | 43 | <el-tab-pane name="persontime-stat"> |
| 44 | - <span slot="label"><i class="el-icon-user-solid"></i> 年度门店人次表</span> | |
| 44 | + <span slot="label"><i class="el-icon-user-solid"></i> 年度到店频次总览</span> | |
| 45 | 45 | </el-tab-pane> |
| 46 | 46 | <el-tab-pane name="project-stat"> |
| 47 | - <span slot="label"><i class="el-icon-goods"></i> 年度门店项目数表</span> | |
| 47 | + <span slot="label"><i class="el-icon-goods"></i> 年度项目量总览</span> | |
| 48 | 48 | </el-tab-pane> |
| 49 | 49 | <el-tab-pane name="store-indicators"> |
| 50 | - <span slot="label"><i class="el-icon-pie-chart"></i> 门店五项指标统计</span> | |
| 50 | + <span slot="label"><i class="el-icon-pie-chart"></i> 门店综合指标</span> | |
| 51 | 51 | </el-tab-pane> |
| 52 | 52 | <el-tab-pane name="bu-indicators"> |
| 53 | - <span slot="label"><i class="el-icon-s-data"></i> 事业部五项指标统计</span> | |
| 53 | + <span slot="label"><i class="el-icon-s-data"></i> 事业部综合指标</span> | |
| 54 | 54 | </el-tab-pane> |
| 55 | 55 | <el-tab-pane name="bu-summary"> |
| 56 | - <span slot="label"><i class="el-icon-tickets"></i> 事业部内部汇总</span> | |
| 56 | + <span slot="label"><i class="el-icon-tickets"></i> 事业部经营汇总</span> | |
| 57 | 57 | </el-tab-pane> |
| 58 | 58 | </el-tabs> |
| 59 | 59 | |
| ... | ... | @@ -67,7 +67,7 @@ |
| 67 | 67 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 68 | 68 | <div slot="header" class="card-title"> |
| 69 | 69 | <i class="el-icon-trophy"></i> |
| 70 | - <span>业绩走势对比</span> | |
| 70 | + <span>业绩趋势对比</span> | |
| 71 | 71 | </div> |
| 72 | 72 | <div id="perfTrend" class="chart-box"></div> |
| 73 | 73 | </el-card> |
| ... | ... | @@ -76,7 +76,7 @@ |
| 76 | 76 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 77 | 77 | <div slot="header" class="card-title"> |
| 78 | 78 | <i class="el-icon-shopping-cart-2"></i> |
| 79 | - <span>消耗走势对比</span> | |
| 79 | + <span>消耗趋势对比</span> | |
| 80 | 80 | </div> |
| 81 | 81 | <div id="consumeTrend" class="chart-box"></div> |
| 82 | 82 | </el-card> |
| ... | ... | @@ -87,7 +87,7 @@ |
| 87 | 87 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 88 | 88 | <div slot="header" class="card-title"> |
| 89 | 89 | <i class="el-icon-user"></i> |
| 90 | - <span>客头数走势</span> | |
| 90 | + <span>客流量趋势</span> | |
| 91 | 91 | </div> |
| 92 | 92 | <div id="headCountTrend" class="chart-box"></div> |
| 93 | 93 | </el-card> |
| ... | ... | @@ -96,7 +96,7 @@ |
| 96 | 96 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 97 | 97 | <div slot="header" class="card-title"> |
| 98 | 98 | <i class="el-icon-user-solid"></i> |
| 99 | - <span>客次数走势</span> | |
| 99 | + <span>到店频次趋势</span> | |
| 100 | 100 | </div> |
| 101 | 101 | <div id="personTimeTrend" class="chart-box"></div> |
| 102 | 102 | </el-card> |
| ... | ... | @@ -105,7 +105,7 @@ |
| 105 | 105 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 106 | 106 | <div slot="header" class="card-title"> |
| 107 | 107 | <i class="el-icon-goods"></i> |
| 108 | - <span>项目数走势</span> | |
| 108 | + <span>项目量趋势</span> | |
| 109 | 109 | </div> |
| 110 | 110 | <div id="projectCountTrend" class="chart-box"></div> |
| 111 | 111 | </el-card> |
| ... | ... | @@ -115,7 +115,7 @@ |
| 115 | 115 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 116 | 116 | <div slot="header" class="card-title"> |
| 117 | 117 | <i class="el-icon-s-grid"></i> |
| 118 | - <span>月度趋势数据列表</span> | |
| 118 | + <span>月度趋势明细</span> | |
| 119 | 119 | </div> |
| 120 | 120 | <NCC-table v-loading="trendTableLoading" :data="trendTableData" border stripe style="width: 100%"> |
| 121 | 121 | <el-table-column v-for="col in trendTableColumns" :key="col.prop" :prop="col.prop" :label="col.label" |
| ... | ... | @@ -137,7 +137,7 @@ |
| 137 | 137 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 138 | 138 | <div slot="header" class="card-title"> |
| 139 | 139 | <i class="el-icon-data-line"></i> |
| 140 | - <span>业绩走势图</span> | |
| 140 | + <span>业绩趋势图</span> | |
| 141 | 141 | </div> |
| 142 | 142 | <div id="performanceChart" class="chart-box-large"></div> |
| 143 | 143 | </el-card> |
| ... | ... | @@ -145,7 +145,7 @@ |
| 145 | 145 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 146 | 146 | <div slot="header" class="card-title"> |
| 147 | 147 | <i class="el-icon-s-grid"></i> |
| 148 | - <span>业绩数据列表</span> | |
| 148 | + <span>业绩明细表</span> | |
| 149 | 149 | </div> |
| 150 | 150 | <NCC-table v-loading="performanceTableLoading" :data="performanceTableData" border stripe |
| 151 | 151 | style="width: 100%"> |
| ... | ... | @@ -168,7 +168,7 @@ |
| 168 | 168 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 169 | 169 | <div slot="header" class="card-title"> |
| 170 | 170 | <i class="el-icon-data-line"></i> |
| 171 | - <span>消耗走势图</span> | |
| 171 | + <span>消耗趋势图</span> | |
| 172 | 172 | </div> |
| 173 | 173 | <div id="consumeChart" class="chart-box-large"></div> |
| 174 | 174 | </el-card> |
| ... | ... | @@ -176,7 +176,7 @@ |
| 176 | 176 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 177 | 177 | <div slot="header" class="card-title"> |
| 178 | 178 | <i class="el-icon-s-grid"></i> |
| 179 | - <span>消耗数据列表</span> | |
| 179 | + <span>消耗明细表</span> | |
| 180 | 180 | </div> |
| 181 | 181 | <NCC-table v-loading="consumeTableLoading" :data="consumeTableData" border stripe style="width: 100%"> |
| 182 | 182 | <el-table-column v-for="col in consumeTableColumns" :key="col.prop" :prop="col.prop" :label="col.label" |
| ... | ... | @@ -198,7 +198,7 @@ |
| 198 | 198 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 199 | 199 | <div slot="header" class="card-title"> |
| 200 | 200 | <i class="el-icon-data-line"></i> |
| 201 | - <span>人头数走势图</span> | |
| 201 | + <span>客流量趋势图</span> | |
| 202 | 202 | </div> |
| 203 | 203 | <div id="headCountChart" class="chart-box-large"></div> |
| 204 | 204 | </el-card> |
| ... | ... | @@ -206,7 +206,7 @@ |
| 206 | 206 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 207 | 207 | <div slot="header" class="card-title"> |
| 208 | 208 | <i class="el-icon-s-grid"></i> |
| 209 | - <span>人头数据列表</span> | |
| 209 | + <span>客流量明细表</span> | |
| 210 | 210 | </div> |
| 211 | 211 | <NCC-table v-loading="headCountTableLoading" :data="headCountTableData" border stripe style="width: 100%"> |
| 212 | 212 | <el-table-column v-for="col in headCountTableColumns" :key="col.prop" :prop="col.prop" |
| ... | ... | @@ -228,7 +228,7 @@ |
| 228 | 228 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 229 | 229 | <div slot="header" class="card-title"> |
| 230 | 230 | <i class="el-icon-data-line"></i> |
| 231 | - <span>人次走势图</span> | |
| 231 | + <span>到店频次趋势图</span> | |
| 232 | 232 | </div> |
| 233 | 233 | <div id="personTimeChart" class="chart-box-large"></div> |
| 234 | 234 | </el-card> |
| ... | ... | @@ -236,7 +236,7 @@ |
| 236 | 236 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 237 | 237 | <div slot="header" class="card-title"> |
| 238 | 238 | <i class="el-icon-s-grid"></i> |
| 239 | - <span>人次数据列表</span> | |
| 239 | + <span>到店频次明细表</span> | |
| 240 | 240 | </div> |
| 241 | 241 | <NCC-table v-loading="personTimeTableLoading" :data="personTimeTableData" border stripe |
| 242 | 242 | style="width: 100%"> |
| ... | ... | @@ -259,7 +259,7 @@ |
| 259 | 259 | <el-card shadow="hover" class="dashboard-card chart-card"> |
| 260 | 260 | <div slot="header" class="card-title"> |
| 261 | 261 | <i class="el-icon-data-line"></i> |
| 262 | - <span>项目数走势图</span> | |
| 262 | + <span>项目量趋势图</span> | |
| 263 | 263 | </div> |
| 264 | 264 | <div id="projectCountChart" class="chart-box-large"></div> |
| 265 | 265 | </el-card> |
| ... | ... | @@ -267,7 +267,7 @@ |
| 267 | 267 | <el-card shadow="hover" class="dashboard-card table-card"> |
| 268 | 268 | <div slot="header" class="card-title"> |
| 269 | 269 | <i class="el-icon-s-grid"></i> |
| 270 | - <span>项目数据列表</span> | |
| 270 | + <span>项目量明细表</span> | |
| 271 | 271 | </div> |
| 272 | 272 | <NCC-table v-loading="projectCountTableLoading" :data="projectCountTableData" border stripe |
| 273 | 273 | style="width: 100%"> | ... | ... |
antis-ncc-admin/src/views/statisticsList/form9.vue
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | <!-- 顶部状态栏 & 筛选器 --> |
| 4 | 4 | <div class="cockpit-header"> |
| 5 | 5 | <div class="header-left"> |
| 6 | - <h1 class="page-title">集团驾驶舱 <span class="subtitle">本月经营动态监测</span></h1> | |
| 6 | + <h1 class="page-title">战略决策指挥中心 <span class="subtitle">实时经营态势感知</span></h1> | |
| 7 | 7 | </div> |
| 8 | 8 | <div class="header-right"> |
| 9 | 9 | <el-form :inline="true" class="search-form-compact"> |
| ... | ... | @@ -60,7 +60,7 @@ |
| 60 | 60 | <el-col :span="8"> |
| 61 | 61 | <el-card class="dashboard-card member-overview-card" shadow="hover"> |
| 62 | 62 | <div slot="header" class="card-title"> |
| 63 | - <span><i class="el-icon-user-solid"></i> 会员核心指标</span> | |
| 63 | + <span><i class="el-icon-user-solid"></i> 会员资产全景</span> | |
| 64 | 64 | </div> |
| 65 | 65 | <div class="member-overview-grid"> |
| 66 | 66 | <div class="member-stat-item stat-item-1"> |
| ... | ... | @@ -246,7 +246,7 @@ |
| 246 | 246 | <el-col :span="8"> |
| 247 | 247 | <el-card class="dashboard-card member-type-card" shadow="hover"> |
| 248 | 248 | <div slot="header" class="card-title"> |
| 249 | - <span><i class="el-icon-pie-chart"></i> 会员类型分布</span> | |
| 249 | + <span><i class="el-icon-pie-chart"></i> 会员结构洞察</span> | |
| 250 | 250 | </div> |
| 251 | 251 | <div ref="memberTypeChart" class="member-type-chart"></div> |
| 252 | 252 | </el-card> |
| ... | ... | @@ -256,7 +256,7 @@ |
| 256 | 256 | <el-col :span="8"> |
| 257 | 257 | <el-card class="dashboard-card member-category-card" shadow="hover"> |
| 258 | 258 | <div slot="header" class="card-title"> |
| 259 | - <span><i class="el-icon-data-analysis"></i> 会员分类统计</span> | |
| 259 | + <span><i class="el-icon-data-analysis"></i> 会员价值分层</span> | |
| 260 | 260 | </div> |
| 261 | 261 | <div class="member-category-content"> |
| 262 | 262 | <div ref="memberCategoryChart" class="member-category-chart"></div> |
| ... | ... | @@ -294,7 +294,7 @@ |
| 294 | 294 | <el-col :span="16"> |
| 295 | 295 | <el-card class="dashboard-card" shadow="hover"> |
| 296 | 296 | <div slot="header" class="card-title"> |
| 297 | - <span><i class="el-icon-data-line"></i> 营收与服务产出趋势分析</span> | |
| 297 | + <span><i class="el-icon-data-line"></i> 经营效能趋势</span> | |
| 298 | 298 | <el-radio-group v-model="trendType" size="mini" style="float: right" @change="handleTrendTypeChange"> |
| 299 | 299 | <el-radio-button label="month">按月</el-radio-button> |
| 300 | 300 | <el-radio-button label="day">按天</el-radio-button> |
| ... | ... | @@ -308,7 +308,7 @@ |
| 308 | 308 | <el-col :span="8"> |
| 309 | 309 | <el-card class="dashboard-card funnel-card" shadow="hover"> |
| 310 | 310 | <div slot="header" class="card-title"> |
| 311 | - <span><i class="el-icon-filter"></i> 拓客全链路转化漏斗</span> | |
| 311 | + <span><i class="el-icon-filter"></i> 客户获取转化链</span> | |
| 312 | 312 | </div> |
| 313 | 313 | <div id="tkFunnelChart" class="chart-box"></div> |
| 314 | 314 | <div class="funnel-stats"> |
| ... | ... | @@ -324,7 +324,7 @@ |
| 324 | 324 | <!-- 门店排行榜 --> |
| 325 | 325 | <el-col :span="6"> |
| 326 | 326 | <el-card class="dashboard-card" shadow="hover"> |
| 327 | - <div slot="header" class="card-title"><span><i class="el-icon-office-building"></i> 门店业绩琅琊榜</span></div> | |
| 327 | + <div slot="header" class="card-title"><span><i class="el-icon-office-building"></i> 门店卓越榜</span></div> | |
| 328 | 328 | <div class="rank-list"> |
| 329 | 329 | <div class="rank-item" v-for="(item, idx) in storeRanking" :key="idx" @click="openStoreDataAnalysis(item)" |
| 330 | 330 | style="cursor: pointer;"> |
| ... | ... | @@ -339,7 +339,7 @@ |
| 339 | 339 | <el-col :span="12"> |
| 340 | 340 | <el-card class="dashboard-card" shadow="hover"> |
| 341 | 341 | <div slot="header" class="card-title"> |
| 342 | - <span><i class="el-icon-user"></i> 核心员效贡献矩阵</span> | |
| 342 | + <span><i class="el-icon-user"></i> 团队效能矩阵</span> | |
| 343 | 343 | <el-button-group style="float: right"> |
| 344 | 344 | <el-button size="mini" :type="coachRankType === 'billing' ? 'primary' : ''" |
| 345 | 345 | @click="coachRankType = 'billing'">开单榜</el-button> |
| ... | ... | @@ -367,7 +367,7 @@ |
| 367 | 367 | <!-- 金三角排名 --> |
| 368 | 368 | <el-col :span="6"> |
| 369 | 369 | <el-card class="dashboard-card" shadow="hover"> |
| 370 | - <div slot="header" class="card-title"><span><i class="el-icon-medal"></i> 金三角战队协同榜</span></div> | |
| 370 | + <div slot="header" class="card-title"><span><i class="el-icon-medal"></i> 协同作战榜</span></div> | |
| 371 | 371 | <div class="rank-list"> |
| 372 | 372 | <div class="rank-item" v-for="(item, idx) in goldTriangleRankingTop10" :key="idx"> |
| 373 | 373 | <span class="rank-no" :class="'top' + (idx + 1)">{{ idx + 1 }}</span> |
| ... | ... | @@ -384,14 +384,14 @@ |
| 384 | 384 | <!-- 到店频次 --> |
| 385 | 385 | <el-col :span="8"> |
| 386 | 386 | <el-card class="dashboard-card" shadow="hover"> |
| 387 | - <div slot="header" class="card-title"><span><i class="el-icon-view"></i> 会员到店频次分布</span></div> | |
| 387 | + <div slot="header" class="card-title"><span><i class="el-icon-view"></i> 客户活跃度分析</span></div> | |
| 388 | 388 | <div id="visitFreqChart" class="chart-box"></div> |
| 389 | 389 | </el-card> |
| 390 | 390 | </el-col> |
| 391 | 391 | <!-- 消耗品项TOP10 --> |
| 392 | 392 | <el-col :span="8"> |
| 393 | 393 | <el-card class="dashboard-card" shadow="hover"> |
| 394 | - <div slot="header" class="card-title"><span><i class="el-icon-present"></i> 消耗品项 TOP 10</span></div> | |
| 394 | + <div slot="header" class="card-title"><span><i class="el-icon-present"></i> 热门服务品项</span></div> | |
| 395 | 395 | <div class="item-rank"> |
| 396 | 396 | <div class="item-rank-row" v-for="(item, idx) in consumeItemTop10" :key="idx"> |
| 397 | 397 | <span class="item-index">{{ idx + 1 }}</span> |
| ... | ... | @@ -406,7 +406,7 @@ |
| 406 | 406 | <!-- 开单品项TOP10 --> |
| 407 | 407 | <el-col :span="8"> |
| 408 | 408 | <el-card class="dashboard-card" shadow="hover"> |
| 409 | - <div slot="header" class="card-title"><span><i class="el-icon-pie-chart"></i> 开单品项 TOP 10</span></div> | |
| 409 | + <div slot="header" class="card-title"><span><i class="el-icon-pie-chart"></i> 热销产品品项</span></div> | |
| 410 | 410 | <div class="item-rank"> |
| 411 | 411 | <div class="item-rank-row" v-for="(item, idx) in billingItemTop10" :key="idx"> |
| 412 | 412 | <span class="item-index">{{ idx + 1 }}</span> |
| ... | ... | @@ -617,12 +617,12 @@ export default { |
| 617 | 617 | const d = this.kpiData || {} |
| 618 | 618 | const tkCount = (this.tkStatisticsData && this.tkStatisticsData.TkCount) ? this.tkStatisticsData.TkCount : 0 |
| 619 | 619 | return [ |
| 620 | - { tooltip: '本月现金业绩,不包含退款业绩', key: 'billing', label: '本月成交总额', value: this.formatMoney(d.TotalBillingAmount), raw: d.TotalBillingAmount || 0, icon: 'el-icon-wallet', type: 'primary', isMoney: true }, | |
| 621 | - { tooltip: '', key: 'consume', label: '本月消耗金额', value: this.formatMoney(d.TotalConsumeAmount), raw: d.TotalConsumeAmount || 0, icon: 'el-icon-medal', type: 'success', isMoney: true }, | |
| 622 | - { tooltip: '成交总额-退款业绩', key: 'net', label: '完成业绩(净额)', value: this.formatMoney(d.CompletedBillingAmount), raw: d.CompletedBillingAmount || 0, icon: 'el-icon-trophy', type: 'warning', isMoney: true }, | |
| 623 | - { tooltip: '完成业绩(净额)/目标值', key: 'target', label: '开单目标达成', value: d.BillingCompletionRate || 0, raw: d.BillingCompletionRate || 0, icon: 'el-icon-pie-chart', type: 'info', isPercent: true, target: this.formatMoney(d.TargetBillingAmount), targetRaw: d.TargetBillingAmount || 0, status: (d.BillingCompletionRate >= 100) ? 'up' : 'down' }, | |
| 624 | - { tooltip: '', key: 'tk', label: '本月拓客人数', value: tkCount, raw: tkCount, icon: 'el-icon-user-solid', type: 'danger', isPercent: false, target: null, status: null }, | |
| 625 | - { tooltip: '实际退卡金额', key: 'refund', label: '退卡总计', value: this.formatMoney(d.TotalRefundAmount), raw: d.TotalRefundAmount || 0, icon: 'el-icon-warning-outline', type: 'error', isMoney: true } | |
| 620 | + { tooltip: '本月现金业绩,不包含退款业绩', key: 'billing', label: '营收核心指标', value: this.formatMoney(d.TotalBillingAmount), raw: d.TotalBillingAmount || 0, icon: 'el-icon-wallet', type: 'primary', isMoney: true }, | |
| 621 | + { tooltip: '', key: 'consume', label: '服务产出价值', value: this.formatMoney(d.TotalConsumeAmount), raw: d.TotalConsumeAmount || 0, icon: 'el-icon-medal', type: 'success', isMoney: true }, | |
| 622 | + { tooltip: '成交总额-退款业绩', key: 'net', label: '净收益达成', value: this.formatMoney(d.CompletedBillingAmount), raw: d.CompletedBillingAmount || 0, icon: 'el-icon-trophy', type: 'warning', isMoney: true }, | |
| 623 | + { tooltip: '完成业绩(净额)/目标值', key: 'target', label: '目标完成度', value: d.BillingCompletionRate || 0, raw: d.BillingCompletionRate || 0, icon: 'el-icon-pie-chart', type: 'info', isPercent: true, target: this.formatMoney(d.TargetBillingAmount), targetRaw: d.TargetBillingAmount || 0, status: (d.BillingCompletionRate >= 100) ? 'up' : 'down' }, | |
| 624 | + { tooltip: '', key: 'tk', label: '新客增长量', value: tkCount, raw: tkCount, icon: 'el-icon-user-solid', type: 'danger', isPercent: false, target: null, status: null }, | |
| 625 | + { tooltip: '实际退卡金额', key: 'refund', label: '风险管控指标', value: this.formatMoney(d.TotalRefundAmount), raw: d.TotalRefundAmount || 0, icon: 'el-icon-warning-outline', type: 'error', isMoney: true } | |
| 626 | 626 | ] |
| 627 | 627 | }, |
| 628 | 628 | // 健康师排行榜数据切换 |
| ... | ... | @@ -713,12 +713,12 @@ export default { |
| 713 | 713 | } |
| 714 | 714 | // 根据类型设置专业的标题名称 |
| 715 | 715 | const titleMap = { |
| 716 | - billing: '成交数据深度分析', | |
| 717 | - consume: '消耗数据深度分析', | |
| 718 | - net: '净业绩完成度分析', | |
| 719 | - target: '开单目标达成度分析', | |
| 720 | - tk: '拓客数据深度分析', | |
| 721 | - refund: '退卡数据深度分析' | |
| 716 | + billing: '营收洞察报告', | |
| 717 | + consume: '服务价值分析', | |
| 718 | + net: '净收益达成分析', | |
| 719 | + target: '目标达成诊断', | |
| 720 | + tk: '客户增长分析', | |
| 721 | + refund: '风险预警分析' | |
| 722 | 722 | } |
| 723 | 723 | |
| 724 | 724 | this.drillDialog = { | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqOrderRecords/LqOrderRecordsInfoOutput.cs
0 → 100644
| 1 | +using System; | |
| 2 | + | |
| 3 | +namespace NCC.Extend.Entitys.Dto.LqOrderRecords | |
| 4 | +{ | |
| 5 | + /// <summary> | |
| 6 | + /// 历史开单记录详情输出 | |
| 7 | + /// </summary> | |
| 8 | + public class LqOrderRecordsInfoOutput | |
| 9 | + { | |
| 10 | + /// <summary> | |
| 11 | + /// 主键ID | |
| 12 | + /// </summary> | |
| 13 | + public int id { get; set; } | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// 开单号 | |
| 17 | + /// </summary> | |
| 18 | + public string orderNo { get; set; } | |
| 19 | + | |
| 20 | + /// <summary> | |
| 21 | + /// 图片名称 | |
| 22 | + /// </summary> | |
| 23 | + public string imageName { get; set; } | |
| 24 | + | |
| 25 | + /// <summary> | |
| 26 | + /// 会员编号 | |
| 27 | + /// </summary> | |
| 28 | + public string memberNo { get; set; } | |
| 29 | + | |
| 30 | + /// <summary> | |
| 31 | + /// 会员手机号 | |
| 32 | + /// </summary> | |
| 33 | + public string memberPhone { get; set; } | |
| 34 | + | |
| 35 | + /// <summary> | |
| 36 | + /// 会员名称 | |
| 37 | + /// </summary> | |
| 38 | + public string memberName { get; set; } | |
| 39 | + | |
| 40 | + /// <summary> | |
| 41 | + /// 备注 | |
| 42 | + /// </summary> | |
| 43 | + public string remarks { get; set; } | |
| 44 | + | |
| 45 | + /// <summary> | |
| 46 | + /// 创建时间 | |
| 47 | + /// </summary> | |
| 48 | + public DateTime? createdAt { get; set; } | |
| 49 | + | |
| 50 | + /// <summary> | |
| 51 | + /// 更新时间 | |
| 52 | + /// </summary> | |
| 53 | + public DateTime? updatedAt { get; set; } | |
| 54 | + } | |
| 55 | +} | |
| 56 | + | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqOrderRecords/LqOrderRecordsListOutput.cs
0 → 100644
| 1 | +using System; | |
| 2 | + | |
| 3 | +namespace NCC.Extend.Entitys.Dto.LqOrderRecords | |
| 4 | +{ | |
| 5 | + /// <summary> | |
| 6 | + /// 历史开单记录列表输出 | |
| 7 | + /// </summary> | |
| 8 | + public class LqOrderRecordsListOutput | |
| 9 | + { | |
| 10 | + /// <summary> | |
| 11 | + /// 主键ID | |
| 12 | + /// </summary> | |
| 13 | + public int id { get; set; } | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// 开单号 | |
| 17 | + /// </summary> | |
| 18 | + public string orderNo { get; set; } | |
| 19 | + | |
| 20 | + /// <summary> | |
| 21 | + /// 图片名称 | |
| 22 | + /// </summary> | |
| 23 | + public string imageName { get; set; } | |
| 24 | + | |
| 25 | + /// <summary> | |
| 26 | + /// 会员编号 | |
| 27 | + /// </summary> | |
| 28 | + public string memberNo { get; set; } | |
| 29 | + | |
| 30 | + /// <summary> | |
| 31 | + /// 会员手机号 | |
| 32 | + /// </summary> | |
| 33 | + public string memberPhone { get; set; } | |
| 34 | + | |
| 35 | + /// <summary> | |
| 36 | + /// 会员名称 | |
| 37 | + /// </summary> | |
| 38 | + public string memberName { get; set; } | |
| 39 | + | |
| 40 | + /// <summary> | |
| 41 | + /// 备注 | |
| 42 | + /// </summary> | |
| 43 | + public string remarks { get; set; } | |
| 44 | + | |
| 45 | + /// <summary> | |
| 46 | + /// 创建时间 | |
| 47 | + /// </summary> | |
| 48 | + public DateTime? createdAt { get; set; } | |
| 49 | + | |
| 50 | + /// <summary> | |
| 51 | + /// 更新时间 | |
| 52 | + /// </summary> | |
| 53 | + public DateTime? updatedAt { get; set; } | |
| 54 | + } | |
| 55 | +} | |
| 56 | + | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqOrderRecords/LqOrderRecordsListQueryInput.cs
0 → 100644
| 1 | +using NCC.Common.Filter; | |
| 2 | + | |
| 3 | +namespace NCC.Extend.Entitys.Dto.LqOrderRecords | |
| 4 | +{ | |
| 5 | + /// <summary> | |
| 6 | + /// 历史开单记录列表查询输入 | |
| 7 | + /// </summary> | |
| 8 | + public class LqOrderRecordsListQueryInput : PageInputBase | |
| 9 | + { | |
| 10 | + /// <summary> | |
| 11 | + /// 会员编号 | |
| 12 | + /// </summary> | |
| 13 | + public string memberNo { get; set; } | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// 会员手机号 | |
| 17 | + /// </summary> | |
| 18 | + public string memberPhone { get; set; } | |
| 19 | + } | |
| 20 | +} | |
| 21 | + | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_order_records/LqOrderRecordsEntity.cs
0 → 100644
| 1 | +using NCC.Common.Const; | |
| 2 | +using SqlSugar; | |
| 3 | +using System; | |
| 4 | + | |
| 5 | +namespace NCC.Extend.Entitys.lq_order_records | |
| 6 | +{ | |
| 7 | + /// <summary> | |
| 8 | + /// 历史开单记录(从老系统迁移) | |
| 9 | + /// </summary> | |
| 10 | + [SugarTable("lq_order_records")] | |
| 11 | + [Tenant(ClaimConst.TENANT_ID)] | |
| 12 | + public class LqOrderRecordsEntity | |
| 13 | + { | |
| 14 | + /// <summary> | |
| 15 | + /// 主键ID | |
| 16 | + /// </summary> | |
| 17 | + [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)] | |
| 18 | + public int Id { get; set; } | |
| 19 | + | |
| 20 | + /// <summary> | |
| 21 | + /// 开单号 | |
| 22 | + /// </summary> | |
| 23 | + [SugarColumn(ColumnName = "order_no")] | |
| 24 | + public string OrderNo { get; set; } | |
| 25 | + | |
| 26 | + /// <summary> | |
| 27 | + /// 图片名称 | |
| 28 | + /// </summary> | |
| 29 | + [SugarColumn(ColumnName = "image_name")] | |
| 30 | + public string ImageName { get; set; } | |
| 31 | + | |
| 32 | + /// <summary> | |
| 33 | + /// 会员编号 | |
| 34 | + /// </summary> | |
| 35 | + [SugarColumn(ColumnName = "member_no")] | |
| 36 | + public string MemberNo { get; set; } | |
| 37 | + | |
| 38 | + /// <summary> | |
| 39 | + /// 会员手机号 | |
| 40 | + /// </summary> | |
| 41 | + [SugarColumn(ColumnName = "member_phone")] | |
| 42 | + public string MemberPhone { get; set; } | |
| 43 | + | |
| 44 | + /// <summary> | |
| 45 | + /// 会员名称 | |
| 46 | + /// </summary> | |
| 47 | + [SugarColumn(ColumnName = "member_name")] | |
| 48 | + public string MemberName { get; set; } | |
| 49 | + | |
| 50 | + /// <summary> | |
| 51 | + /// 备注 | |
| 52 | + /// </summary> | |
| 53 | + [SugarColumn(ColumnName = "remarks")] | |
| 54 | + public string Remarks { get; set; } | |
| 55 | + | |
| 56 | + /// <summary> | |
| 57 | + /// 创建时间 | |
| 58 | + /// </summary> | |
| 59 | + [SugarColumn(ColumnName = "created_at")] | |
| 60 | + public DateTime? CreatedAt { get; set; } | |
| 61 | + | |
| 62 | + /// <summary> | |
| 63 | + /// 更新时间 | |
| 64 | + /// </summary> | |
| 65 | + [SugarColumn(ColumnName = "updated_at")] | |
| 66 | + public DateTime? UpdatedAt { get; set; } | |
| 67 | + } | |
| 68 | +} | |
| 69 | + | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
| ... | ... | @@ -1192,11 +1192,11 @@ namespace NCC.Extend.LqKdKdjlb |
| 1192 | 1192 | var isMedicalProject = hasMedicalItemInCurrentBilling && await _db.Queryable<LqKdPxmxEntity>().Where(x => x.MemberId == entity.Kdhy && x.IsEffective == StatusEnum.有效.GetHashCode() && x.ItemCategory == "医美" && x.ActualPrice > 0 && x.Px != "61" && x.Glkdbh != id).AnyAsync(); |
| 1193 | 1193 | if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000) |
| 1194 | 1194 | { |
| 1195 | - entity.UpgradeLifeBeauty = "是"; | |
| 1195 | + entity.UpgradeMedicalBeauty = "是"; | |
| 1196 | 1196 | } |
| 1197 | 1197 | else |
| 1198 | 1198 | { |
| 1199 | - entity.UpgradeLifeBeauty = "否"; | |
| 1199 | + entity.UpgradeMedicalBeauty = "否"; | |
| 1200 | 1200 | } |
| 1201 | 1201 | //获取该会员之前开单品项里面是否有科美项目 |
| 1202 | 1202 | var isTechProject = hasTechItemInCurrentBilling && await _db.Queryable<LqKdPxmxEntity>().Where(x => x.MemberId == entity.Kdhy && x.IsEffective == StatusEnum.有效.GetHashCode() && x.ItemCategory == "科美" && x.ActualPrice > 0 && x.Px != "61" && x.Glkdbh != id).AnyAsync(); |
| ... | ... | @@ -1212,11 +1212,11 @@ namespace NCC.Extend.LqKdKdjlb |
| 1212 | 1212 | var isLifeProject = hasLifeItemInCurrentBilling && await _db.Queryable<LqKdPxmxEntity>().Where(x => x.MemberId == entity.Kdhy && x.IsEffective == StatusEnum.有效.GetHashCode() && x.ItemCategory == "生美" && x.ActualPrice > 0 && x.Px != "61" && x.Glkdbh != id).AnyAsync(); |
| 1213 | 1213 | if (isLifeProject) |
| 1214 | 1214 | { |
| 1215 | - entity.UpgradeMedicalBeauty = "是"; | |
| 1215 | + entity.UpgradeLifeBeauty = "是"; | |
| 1216 | 1216 | } |
| 1217 | 1217 | else |
| 1218 | 1218 | { |
| 1219 | - entity.UpgradeMedicalBeauty = "否"; | |
| 1219 | + entity.UpgradeLifeBeauty = "否"; | |
| 1220 | 1220 | } |
| 1221 | 1221 | //计算储扣总金额 |
| 1222 | 1222 | entity.DeductAmount = input.lqKdKdjlbDeductList.Sum(x => x.Amount ?? 0); | ... | ... |
netcore/src/Modularity/Extend/NCC.Extend/LqOrderRecordsService.cs
0 → 100644
| 1 | +using NCC.Common.Core.Manager; | |
| 2 | +using NCC.Common.Filter; | |
| 3 | +using NCC.Dependency; | |
| 4 | +using NCC.DynamicApiController; | |
| 5 | +using NCC.FriendlyException; | |
| 6 | +using Mapster; | |
| 7 | +using Microsoft.AspNetCore.Mvc; | |
| 8 | +using SqlSugar; | |
| 9 | +using System.Threading.Tasks; | |
| 10 | +using NCC.Extend.Entitys.lq_order_records; | |
| 11 | +using NCC.Extend.Entitys.Dto.LqOrderRecords; | |
| 12 | + | |
| 13 | +namespace NCC.Extend | |
| 14 | +{ | |
| 15 | + /// <summary> | |
| 16 | + /// 历史开单记录服务(从老系统迁移) | |
| 17 | + /// </summary> | |
| 18 | + [ApiDescriptionSettings(Tag = "Extend", Name = "LqOrderRecords", Order = 200)] | |
| 19 | + [Route("api/Extend/[controller]")] | |
| 20 | + public class LqOrderRecordsService : IDynamicApiController, ITransient | |
| 21 | + { | |
| 22 | + private readonly ISqlSugarRepository<LqOrderRecordsEntity> _lqOrderRecordsRepository; | |
| 23 | + private readonly SqlSugarScope _db; | |
| 24 | + private readonly IUserManager _userManager; | |
| 25 | + | |
| 26 | + /// <summary> | |
| 27 | + /// 初始化一个<see cref="LqOrderRecordsService"/>类型的新实例 | |
| 28 | + /// </summary> | |
| 29 | + public LqOrderRecordsService( | |
| 30 | + ISqlSugarRepository<LqOrderRecordsEntity> lqOrderRecordsRepository, | |
| 31 | + IUserManager userManager) | |
| 32 | + { | |
| 33 | + _lqOrderRecordsRepository = lqOrderRecordsRepository; | |
| 34 | + _db = _lqOrderRecordsRepository.Context; | |
| 35 | + _userManager = userManager; | |
| 36 | + } | |
| 37 | + | |
| 38 | + /// <summary> | |
| 39 | + /// 获取历史开单记录详情 | |
| 40 | + /// </summary> | |
| 41 | + /// <param name="id">主键ID</param> | |
| 42 | + /// <returns></returns> | |
| 43 | + [HttpGet("{id}")] | |
| 44 | + public async Task<dynamic> GetInfo(int id) | |
| 45 | + { | |
| 46 | + var entity = await _db.Queryable<LqOrderRecordsEntity>().FirstAsync(p => p.Id == id); | |
| 47 | + if (entity == null) | |
| 48 | + { | |
| 49 | + throw NCCException.Oh("未找到该历史开单记录"); | |
| 50 | + } | |
| 51 | + var output = entity.Adapt<LqOrderRecordsInfoOutput>(); | |
| 52 | + return output; | |
| 53 | + } | |
| 54 | + | |
| 55 | + /// <summary> | |
| 56 | + /// 获取历史开单记录列表 | |
| 57 | + /// </summary> | |
| 58 | + /// <param name="input">请求参数</param> | |
| 59 | + /// <returns></returns> | |
| 60 | + [HttpGet("")] | |
| 61 | + public async Task<dynamic> GetList([FromQuery] LqOrderRecordsListQueryInput input) | |
| 62 | + { | |
| 63 | + var sidx = input.sidx == null ? "id" : input.sidx; | |
| 64 | + var sort = input.sort == null ? "desc" : input.sort; | |
| 65 | + | |
| 66 | + var data = await _db.Queryable<LqOrderRecordsEntity>() | |
| 67 | + .WhereIF(!string.IsNullOrEmpty(input.memberNo), p => p.MemberNo.Contains(input.memberNo)) | |
| 68 | + .WhereIF(!string.IsNullOrEmpty(input.memberPhone), p => p.MemberPhone.Contains(input.memberPhone)) | |
| 69 | + .Select(it => new LqOrderRecordsListOutput | |
| 70 | + { | |
| 71 | + id = it.Id, | |
| 72 | + orderNo = it.OrderNo, | |
| 73 | + imageName = it.ImageName, | |
| 74 | + memberNo = it.MemberNo, | |
| 75 | + memberPhone = it.MemberPhone, | |
| 76 | + memberName = it.MemberName, | |
| 77 | + remarks = it.Remarks, | |
| 78 | + createdAt = it.CreatedAt, | |
| 79 | + updatedAt = it.UpdatedAt | |
| 80 | + }) | |
| 81 | + .MergeTable() | |
| 82 | + .OrderBy($"{sidx} {sort}") | |
| 83 | + .ToPagedListAsync(input.currentPage, input.pageSize); | |
| 84 | + | |
| 85 | + return PageResult<LqOrderRecordsListOutput>.SqlSugarPageResult(data); | |
| 86 | + } | |
| 87 | + } | |
| 88 | +} | |
| 89 | + | ... | ... |