Commit e2c7c95410807eab21192b0057a7750890eac9cc

Authored by 李宇
2 parents ca55440e d7925aaa

Merge branch 'master' of http://39.98.150.180/antissoft/lvqianmeiye_ERP

Showing 25 changed files with 1540 additions and 400 deletions
antis-ncc-admin/src/api/extend/salaryCalculation.js
... ... @@ -26,3 +26,21 @@ export function saveTechPerformanceStatistics(statisticsMonth) {
26 26 data: { statisticsMonth }
27 27 })
28 28 }
  29 +
  30 +// 保存门店耗卡业绩统计数据
  31 +export function saveStoreConsumePerformanceStatistics(statisticsMonth) {
  32 + return request({
  33 + url: '/api/Extend/LqStatistics/save-store-consume-performance-stats',
  34 + method: 'POST',
  35 + data: { statisticsMonth }
  36 + })
  37 +}
  38 +
  39 +// 保存个人消耗业绩统计数据
  40 +export function saveDepartmentConsumePerformanceStatistics(statisticsMonth) {
  41 + return request({
  42 + url: '/api/Extend/LqStatistics/save-department-consume-performance-stats',
  43 + method: 'POST',
  44 + data: { statisticsMonth }
  45 + })
  46 +}
... ...
antis-ncc-admin/src/views/salaryCalculation/index.vue
1 1 <template>
2 2 <div class="salary-calculation-container">
3   - <!-- 页面头部 -->
4   - <div class="header-card">
5   - <h1 class="title">工资计算与统计系统</h1>
6   - <p class="subtitle">智能生成各类业绩统计数据,一键完成工资计算</p>
7   - </div>
8   -
9   - <!-- 月份选择区域 -->
10   - <el-card class="box-card month-selector-card">
11   - <div slot="header" class="clearfix">
12   - <span><i class="el-icon-date"></i> 选择统计月份</span>
13   - <el-button style="float: right; padding: 3px 0" type="text" @click="resetMonth">重置</el-button>
14   - </div>
15   - <div class="month-picker-wrapper">
16   - <el-date-picker
17   - v-model="statisticsMonth"
18   - type="month"
19   - placeholder="选择月份"
20   - format="yyyy年MM月"
21   - value-format="yyyyMM"
22   - :clearable="false"
23   - class="month-picker"
24   - >
25   - </el-date-picker>
26   - </div>
27   - </el-card>
28   -
29 3 <!-- 主要内容区域 - 左右布局 -->
30 4 <div class="main-content">
31 5 <!-- 左侧:统计操作区域 -->
32 6 <div class="left-panel">
33   - <!-- 一键计算工资 -->
34   - <el-card class="box-card calculate-card">
35   - <div slot="header" class="clearfix">
36   - <span><i class="el-icon-cpu"></i> 一键计算工资</span>
37   - </div>
38   - <div class="calculate-content">
39   - <p class="calculate-desc">按顺序执行所有统计方法,生成完整的工资数据</p>
40   - <el-button
41   - type="primary"
42   - size="large"
43   - :loading="isCalculating"
44   - @click="handleCalculateSalary"
45   - class="calculate-button"
46   - :disabled="!statisticsMonth"
47   - >
48   - <i class="el-icon-magic-stick"></i>
49   - {{ isCalculating ? '计算中...' : '一键计算工资' }}
50   - </el-button>
51   - <div v-if="calculationProgress.length > 0" class="progress-info">
52   - <div class="progress-title">计算进度:</div>
53   - <div v-for="(step, index) in calculationProgress" :key="index" class="progress-step">
54   - <i :class="getProgressIcon(step.status)" :style="{ color: getProgressColor(step.status) }"></i>
55   - <span :class="{ 'completed': step.status === 'completed', 'failed': step.status === 'failed' }">
56   - {{ step.name }}
57   - </span>
58   - </div>
  7 + <!-- 顶部控制区域 - 同一行显示 -->
  8 + <div class="top-controls-row">
  9 + <!-- 月份选择区域 -->
  10 + <el-card class="box-card month-selector-card">
  11 + <div slot="header" class="clearfix">
  12 + <span><i class="el-icon-date"></i> 选择统计月份</span>
  13 + <el-button style="float: right; padding: 3px 0" type="text" @click="resetMonth">重置</el-button>
59 14 </div>
60   - </div>
61   - </el-card>
  15 + <div class="month-picker-wrapper">
  16 + <el-date-picker
  17 + v-model="statisticsMonth"
  18 + type="month"
  19 + placeholder="选择月份"
  20 + format="yyyy年MM月"
  21 + value-format="yyyyMM"
  22 + :clearable="false"
  23 + class="month-picker"
  24 + >
  25 + </el-date-picker>
  26 + </div>
  27 + </el-card>
  28 +
  29 + <!-- 一键计算工资 -->
  30 + <el-card class="box-card calculate-card">
  31 + <div slot="header" class="clearfix">
  32 + <span><i class="el-icon-cpu"></i> 一键计算工资</span>
  33 + </div>
  34 + <div class="calculate-content">
  35 + <p class="calculate-desc">按顺序执行所有统计方法,生成完整的工资数据</p>
  36 + <el-button
  37 + type="primary"
  38 + size="large"
  39 + :loading="isCalculating"
  40 + @click="handleCalculateSalary"
  41 + class="calculate-button"
  42 + :disabled="!statisticsMonth"
  43 + >
  44 + <i class="el-icon-magic-stick"></i>
  45 + {{ isCalculating ? '计算中...' : '一键计算工资' }}
  46 + </el-button>
  47 + </div>
  48 + </el-card>
  49 + </div>
62 50  
63 51 <!-- 单独统计操作 -->
64 52 <el-card class="box-card statistics-card">
... ... @@ -114,6 +102,38 @@
114 102 </el-button>
115 103 </div>
116 104  
  105 + <div class="stat-item purple-item">
  106 + <div class="stat-header">
  107 + <i class="el-icon-s-shop"></i>
  108 + <span>门店耗卡业绩</span>
  109 + </div>
  110 + <el-button
  111 + type="info"
  112 + :loading="loadingStates.storeConsumePerformance"
  113 + @click="handleStoreConsumePerformanceStatistics"
  114 + class="stat-button"
  115 + :disabled="!statisticsMonth"
  116 + >
  117 + 立即统计
  118 + </el-button>
  119 + </div>
  120 +
  121 + <div class="stat-item teal-item">
  122 + <div class="stat-header">
  123 + <i class="el-icon-user-solid"></i>
  124 + <span>个人消耗业绩</span>
  125 + </div>
  126 + <el-button
  127 + type="primary"
  128 + :loading="loadingStates.departmentConsumePerformance"
  129 + @click="handleDepartmentConsumePerformanceStatistics"
  130 + class="stat-button"
  131 + :disabled="!statisticsMonth"
  132 + >
  133 + 立即统计
  134 + </el-button>
  135 + </div>
  136 +
117 137 <!-- 预留位置,用于未来添加更多统计方法 -->
118 138 <div class="stat-item placeholder-item">
119 139 <div class="stat-header">
... ... @@ -134,17 +154,27 @@
134 154  
135 155 <!-- 右侧:结果显示区域 -->
136 156 <div class="right-panel">
  157 + <!-- 计算进度区域 -->
  158 + <el-card class="box-card progress-card" v-if="calculationProgress.length > 0">
  159 + <div slot="header" class="clearfix">
  160 + <span><i class="el-icon-time"></i> 计算进度</span>
  161 + </div>
  162 + <div class="progress-content">
  163 + <div v-for="(step, index) in calculationProgress" :key="index" class="progress-step">
  164 + <i :class="getProgressIcon(step.status)" :style="{ color: getProgressColor(step.status) }"></i>
  165 + <span :class="{ 'completed': step.status === 'completed', 'failed': step.status === 'failed' }">
  166 + {{ step.name }}
  167 + </span>
  168 + </div>
  169 + </div>
  170 + </el-card>
  171 +
137 172 <el-card class="box-card result-card">
138 173 <div slot="header" class="clearfix">
139 174 <span><i class="el-icon-document"></i> 统计结果</span>
140   - <div class="header-actions">
141   - <el-button type="text" @click="exportResults" :disabled="results.length === 0">
142   - <i class="el-icon-download"></i> 导出
143   - </el-button>
144   - <el-button type="text" @click="clearResults">
145   - <i class="el-icon-delete"></i> 清空
146   - </el-button>
147   - </div>
  175 + <el-button type="text" @click="clearResults">
  176 + <i class="el-icon-delete"></i> 清空
  177 + </el-button>
148 178 </div>
149 179 <div class="result-list" ref="resultList">
150 180 <div v-if="results.length === 0" class="no-results">
... ... @@ -171,7 +201,9 @@
171 201 import {
172 202 saveGoldTriangleStatistics,
173 203 savePersonalPerformanceStatistics,
174   - saveTechPerformanceStatistics
  204 + saveTechPerformanceStatistics,
  205 + saveStoreConsumePerformanceStatistics,
  206 + saveDepartmentConsumePerformanceStatistics
175 207 } from '@/api/extend/salaryCalculation'
176 208  
177 209 export default {
... ... @@ -182,7 +214,9 @@ export default {
182 214 loadingStates: {
183 215 goldTriangle: false,
184 216 personalPerformance: false,
185   - techPerformance: false
  217 + techPerformance: false,
  218 + storeConsumePerformance: false,
  219 + departmentConsumePerformance: false
186 220 },
187 221 results: [], // 存储统计结果,最多保留10条
188 222 isCalculating: false, // 一键计算状态
... ... @@ -220,14 +254,6 @@ export default {
220 254 }
221 255 return json
222 256 },
223   - exportResults() {
224   - if (this.results.length === 0) {
225   - this.$message.warning('没有可导出的结果')
226   - return
227   - }
228   - // 这里可以实现导出功能
229   - this.$message.success('导出功能开发中...')
230   - },
231 257  
232 258 // 一键计算工资
233 259 async handleCalculateSalary() {
... ... @@ -256,6 +282,16 @@ export default {
256 282 name: '科技部开单业绩统计',
257 283 method: 'handleTechPerformanceStatistics',
258 284 type: 'tech-performance'
  285 + },
  286 + {
  287 + name: '门店耗卡业绩统计',
  288 + method: 'handleStoreConsumePerformanceStatistics',
  289 + type: 'store-consume-performance'
  290 + },
  291 + {
  292 + name: '个人消耗业绩统计',
  293 + method: 'handleDepartmentConsumePerformanceStatistics',
  294 + type: 'department-consume-performance'
259 295 }
260 296 ]
261 297  
... ... @@ -428,6 +464,62 @@ export default {
428 464 } finally {
429 465 this.loadingStates.techPerformance = false
430 466 }
  467 + },
  468 +
  469 + // 门店耗卡业绩统计
  470 + async handleStoreConsumePerformanceStatistics() {
  471 + this.loadingStates.storeConsumePerformance = true
  472 + try {
  473 + const response = await saveStoreConsumePerformanceStatistics(this.statisticsMonth)
  474 + this.addResult({
  475 + type: 'store-consume-performance',
  476 + title: '门店耗卡业绩统计',
  477 + success: true,
  478 + data: response.data,
  479 + time: new Date().toLocaleString()
  480 + })
  481 + this.$message.success('门店耗卡业绩统计完成')
  482 + } catch (error) {
  483 + this.addResult({
  484 + type: 'store-consume-performance',
  485 + title: '门店耗卡业绩统计',
  486 + success: false,
  487 + data: error.message || '统计失败',
  488 + time: new Date().toLocaleString()
  489 + })
  490 + this.$message.error('门店耗卡业绩统计失败')
  491 + throw error
  492 + } finally {
  493 + this.loadingStates.storeConsumePerformance = false
  494 + }
  495 + },
  496 +
  497 + // 个人消耗业绩统计
  498 + async handleDepartmentConsumePerformanceStatistics() {
  499 + this.loadingStates.departmentConsumePerformance = true
  500 + try {
  501 + const response = await saveDepartmentConsumePerformanceStatistics(this.statisticsMonth)
  502 + this.addResult({
  503 + type: 'department-consume-performance',
  504 + title: '个人消耗业绩统计',
  505 + success: true,
  506 + data: response.data,
  507 + time: new Date().toLocaleString()
  508 + })
  509 + this.$message.success('个人消耗业绩统计完成')
  510 + } catch (error) {
  511 + this.addResult({
  512 + type: 'department-consume-performance',
  513 + title: '个人消耗业绩统计',
  514 + success: false,
  515 + data: error.message || '统计失败',
  516 + time: new Date().toLocaleString()
  517 + })
  518 + this.$message.error('个人消耗业绩统计失败')
  519 + throw error
  520 + } finally {
  521 + this.loadingStates.departmentConsumePerformance = false
  522 + }
431 523 }
432 524 }
433 525 }
... ... @@ -440,27 +532,6 @@ export default {
440 532 min-height: calc(100vh - 50px);
441 533 font-family: 'Arial', sans-serif;
442 534  
443   - .header-card {
444   - background: linear-gradient(135deg, #409EFF, #79BBFF);
445   - color: #fff;
446   - padding: 30px;
447   - border-radius: 15px;
448   - margin-bottom: 20px;
449   - text-align: center;
450   - box-shadow: 0 8px 20px rgba(0, 123, 255, 0.2);
451   -
452   - .title {
453   - font-size: 2.5em;
454   - margin-bottom: 10px;
455   - font-weight: bold;
456   - }
457   -
458   - .subtitle {
459   - font-size: 1.1em;
460   - opacity: 0.9;
461   - }
462   - }
463   -
464 535 .box-card {
465 536 border-radius: 10px;
466 537 margin-bottom: 20px;
... ... @@ -480,115 +551,92 @@ export default {
480 551 }
481 552 }
482 553  
483   - .month-selector-card {
484   - .month-picker-wrapper {
485   - display: flex;
486   - justify-content: center;
487   - align-items: center;
488   - }
489   - .month-picker {
490   - width: 100%;
491   - max-width: 300px;
492   - }
493   - }
494   -
495   - // 主要内容区域 - 左右布局
496   - .main-content {
  554 + // 顶部控制区域 - 同一行显示两个卡片
  555 + .top-controls-row {
497 556 display: flex;
498 557 gap: 20px;
499   - min-height: 600px;
500   -
501   - .left-panel {
502   - flex: 1;
503   - min-width: 0; // 防止flex子项溢出
504   - }
  558 + margin-bottom: 20px;
505 559  
506   - .right-panel {
  560 + .month-selector-card, .calculate-card {
507 561 flex: 1;
508 562 min-width: 0;
509 563 }
510   - }
511   -
512   - // 一键计算工资卡片
513   - .calculate-card {
514   - margin-bottom: 20px;
515   - background: linear-gradient(135deg, #67C23A, #85CE61);
516   - color: white;
517   -
518   - ::v-deep .el-card__header {
519   - background: rgba(255, 255, 255, 0.1);
520   - color: white;
521   - border-bottom: 1px solid rgba(255, 255, 255, 0.2);
522   - }
523 564  
524   - .calculate-content {
525   - text-align: center;
526   -
527   - .calculate-desc {
528   - color: rgba(255, 255, 255, 0.9);
529   - margin-bottom: 20px;
530   - font-size: 1.1em;
  565 + .month-selector-card {
  566 + .month-picker-wrapper {
  567 + display: flex;
  568 + justify-content: flex-start;
  569 + align-items: center;
531 570 }
532   -
533   - .calculate-button {
  571 + .month-picker {
534 572 width: 100%;
535   - height: 60px;
536   - font-size: 1.3em;
537   - font-weight: bold;
538   - border-radius: 10px;
539   - background: rgba(255, 255, 255, 0.2);
540   - border: 2px solid rgba(255, 255, 255, 0.3);
541   - color: white;
  573 + max-width: 200px;
  574 + }
  575 + }
542 576  
543   - &:hover:not(:disabled) {
544   - background: rgba(255, 255, 255, 0.3);
545   - border-color: rgba(255, 255, 255, 0.5);
546   - }
  577 + .calculate-card {
  578 + background: linear-gradient(135deg, #67C23A, #85CE61);
  579 + color: white;
547 580  
548   - &:disabled {
549   - opacity: 0.6;
550   - }
  581 + ::v-deep .el-card__header {
  582 + background: rgba(255, 255, 255, 0.1);
  583 + color: white;
  584 + border-bottom: 1px solid rgba(255, 255, 255, 0.2);
551 585 }
552 586  
553   - .progress-info {
554   - margin-top: 20px;
555   - text-align: left;
  587 + .calculate-content {
  588 + text-align: center;
556 589  
557   - .progress-title {
558   - font-weight: bold;
559   - margin-bottom: 10px;
  590 + .calculate-desc {
560 591 color: rgba(255, 255, 255, 0.9);
  592 + margin-bottom: 15px;
  593 + font-size: 0.95em;
  594 + line-height: 1.4;
561 595 }
562 596  
563   - .progress-step {
564   - display: flex;
565   - align-items: center;
566   - margin-bottom: 8px;
567   - font-size: 0.95em;
  597 + .calculate-button {
  598 + width: 100%;
  599 + height: 40px;
  600 + font-size: 1em;
  601 + font-weight: bold;
  602 + border-radius: 6px;
  603 + background: rgba(255, 255, 255, 0.2);
  604 + border: 2px solid rgba(255, 255, 255, 0.3);
  605 + color: white;
568 606  
569   - i {
570   - margin-right: 8px;
571   - font-size: 1.1em;
  607 + &:hover:not(:disabled) {
  608 + background: rgba(255, 255, 255, 0.3);
  609 + border-color: rgba(255, 255, 255, 0.5);
572 610 }
573 611  
574   - span {
575   - color: rgba(255, 255, 255, 0.9);
576   -
577   - &.completed {
578   - color: #fff;
579   - font-weight: bold;
580   - }
581   -
582   - &.failed {
583   - color: #ffeb3b;
584   - font-weight: bold;
585   - }
  612 + &:disabled {
  613 + opacity: 0.6;
586 614 }
587 615 }
588 616 }
589 617 }
590 618 }
591 619  
  620 + // 主要内容区域 - 左右布局
  621 + .main-content {
  622 + display: flex;
  623 + gap: 20px;
  624 + min-height: 600px;
  625 +
  626 + .left-panel {
  627 + flex: 1;
  628 + min-width: 0; // 防止flex子项溢出
  629 + }
  630 +
  631 + .right-panel {
  632 + flex: 1;
  633 + min-width: 0;
  634 + display: flex;
  635 + flex-direction: column;
  636 + }
  637 + }
  638 +
  639 +
592 640 // 统计操作卡片
593 641 .statistics-card {
594 642 .statistics-grid {
... ... @@ -648,6 +696,16 @@ export default {
648 696 .stat-header i { color: #E6A23C; }
649 697 }
650 698  
  699 + &.purple-item {
  700 + border-color: #909399;
  701 + .stat-header i { color: #909399; }
  702 + }
  703 +
  704 + &.teal-item {
  705 + border-color: #17A2B8;
  706 + .stat-header i { color: #17A2B8; }
  707 + }
  708 +
651 709 &.placeholder-item {
652 710 border-color: #C0C4CC;
653 711 background: #f5f7fa;
... ... @@ -657,17 +715,64 @@ export default {
657 715 }
658 716 }
659 717  
  718 + // 进度卡片
  719 + .progress-card {
  720 + margin-bottom: 20px;
  721 + background: linear-gradient(135deg, #E6F7FF, #BAE7FF);
  722 + border: 1px solid #91D5FF;
  723 +
  724 + .progress-content {
  725 + .progress-step {
  726 + display: flex;
  727 + align-items: center;
  728 + margin-bottom: 12px;
  729 + padding: 8px 12px;
  730 + background: rgba(255, 255, 255, 0.7);
  731 + border-radius: 6px;
  732 + font-size: 0.95em;
  733 +
  734 + &:last-child {
  735 + margin-bottom: 0;
  736 + }
  737 +
  738 + i {
  739 + margin-right: 10px;
  740 + font-size: 1.1em;
  741 + }
  742 +
  743 + span {
  744 + color: #333;
  745 + font-weight: 500;
  746 +
  747 + &.completed {
  748 + color: #67C23A;
  749 + font-weight: bold;
  750 + }
  751 +
  752 + &.failed {
  753 + color: #F56C6C;
  754 + font-weight: bold;
  755 + }
  756 + }
  757 + }
  758 + }
  759 + }
  760 +
660 761 // 结果显示卡片
661 762 .result-card {
662   - height: 100%;
  763 + flex: 1;
  764 + display: flex;
  765 + flex-direction: column;
663 766  
664   - .header-actions {
  767 + ::v-deep .el-card__body {
  768 + flex: 1;
665 769 display: flex;
666   - gap: 10px;
  770 + flex-direction: column;
  771 + padding: 20px;
667 772 }
668 773  
669 774 .result-list {
670   - max-height: 500px;
  775 + flex: 1;
671 776 overflow-y: auto;
672 777 padding-right: 10px;
673 778  
... ... @@ -701,6 +806,10 @@ export default {
701 806 background-color: #f9f9f9;
702 807 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
703 808  
  809 + &:last-child {
  810 + margin-bottom: 0;
  811 + }
  812 +
704 813 &.success-item {
705 814 border-color: #67C23A;
706 815 }
... ... @@ -764,14 +873,13 @@ export default {
764 873 padding: 10px;
765 874 }
766 875  
767   - .header-card {
768   - padding: 20px;
769   - .title {
770   - font-size: 1.8em;
771   - }
772   - .subtitle {
773   - font-size: 0.9em;
774   - }
  876 + .top-controls-row {
  877 + flex-direction: column;
  878 + gap: 15px;
  879 + }
  880 +
  881 + .month-selector-card, .calculate-card {
  882 + width: 100%;
775 883 }
776 884  
777 885 .statistics-grid {
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqKdKdjlb/LqKdKdjlbListOutput.cs
... ... @@ -11,52 +11,52 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
11 11 /// 开单编号
12 12 /// </summary>
13 13 public string id { get; set; }
14   -
  14 +
15 15 /// <summary>
16 16 /// 单据门店
17 17 /// </summary>
18 18 public string djmd { get; set; }
19   -
  19 +
20 20 /// <summary>
21 21 /// 金三角
22 22 /// </summary>
23 23 public string jsj { get; set; }
24   -
  24 +
25 25 /// <summary>
26 26 /// 开单日期
27 27 /// </summary>
28 28 public DateTime? kdrq { get; set; }
29   -
  29 +
30 30 /// <summary>
31 31 /// 顾客类型
32 32 /// </summary>
33 33 public string gjlx { get; set; }
34   -
  34 +
35 35 /// <summary>
36 36 /// 合作机构
37 37 /// </summary>
38 38 public string hgjg { get; set; }
39   -
  39 +
40 40 /// <summary>
41 41 /// 整单业绩
42 42 /// </summary>
43 43 public decimal zdyj { get; set; }
44   -
  44 +
45 45 /// <summary>
46 46 /// 实付业绩
47 47 /// </summary>
48 48 public decimal sfyj { get; set; }
49   -
  49 +
50 50 /// <summary>
51 51 /// 欠款
52 52 /// </summary>
53 53 public decimal qk { get; set; }
54   -
  54 +
55 55 /// <summary>
56 56 /// 储扣方式
57 57 /// </summary>
58 58 public string ckfs { get; set; }
59   -
  59 +
60 60 /// <summary>
61 61 /// 储扣总金额
62 62 /// </summary>
... ... @@ -66,76 +66,80 @@ namespace NCC.Extend.Entitys.Dto.LqKdKdjlb
66 66 /// 付款方式
67 67 /// </summary>
68 68 public string fkfs { get; set; }
69   -
  69 +
70 70 /// <summary>
71 71 /// 付款医院
72 72 /// </summary>
73 73 public string fkyy { get; set; }
74   -
  74 +
75 75 /// <summary>
76 76 /// 付款判断
77 77 /// </summary>
78 78 public string fkpd { get; set; }
79   -
  79 +
80 80 /// <summary>
81 81 /// 客户来源
82 82 /// </summary>
83 83 public string khly { get; set; }
84   -
  84 +
85 85 /// <summary>
86 86 /// 推荐人
87 87 /// </summary>
88 88 public string tjr { get; set; }
89   -
  89 +
90 90 /// <summary>
91 91 /// 是否首开订单
92 92 /// </summary>
93 93 public string sfskdd { get; set; }
94   -
  94 +
95 95 /// <summary>
96 96 /// 简介
97 97 /// </summary>
98 98 public string jj { get; set; }
99   -
  99 +
100 100 /// <summary>
101 101 /// 备注
102 102 /// </summary>
103 103 public string bz { get; set; }
104   -
  104 +
105 105 /// <summary>
106 106 /// 开单会员
107 107 /// </summary>
108 108 public string kdhy { get; set; }
109   -
  109 +
110 110 /// <summary>
111 111 /// 开单会员名称
112 112 /// </summary>
113 113 public string kdhyc { get; set; }
114   -
  114 +
115 115 /// <summary>
116 116 /// 开单会员手机号
117 117 /// </summary>
118 118 public string kdhysjh { get; set; }
119   -
  119 +
120 120 /// <summary>
121 121 /// 健康师业绩
122 122 /// </summary>
123 123 public string jksyj { get; set; }
124   -
  124 +
125 125 /// <summary>
126 126 /// 科技部老师业绩
127 127 /// </summary>
128 128 public string kjblsyj { get; set; }
129   -
  129 +
130 130 /// <summary>
131 131 /// 品项信息
132 132 /// </summary>
133 133 public string pxxx { get; set; }
134   -
  134 +
135 135 /// <summary>
136 136 /// 方案其他
137 137 /// </summary>
138 138 public string F_FIleUrl { get; set; }
139   -
  139 +
  140 + /// <summary>
  141 + /// 是否有效
  142 + /// </summary>
  143 + public int IsEffective { get; set; }
140 144 }
141 145 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatistics/DepartmentInfo/DepartmentInfo.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatistics.DepartmentInfo
  4 +{
  5 + /// <summary>
  6 + /// 部门信息
  7 + /// </summary>
  8 + public class DepartmentInfo
  9 + {
  10 + /// <summary>
  11 + /// 部门ID
  12 + /// </summary>
  13 + public string DepartmentId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 部门名称
  17 + /// </summary>
  18 + public string DepartmentName { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 父部门ID
  22 + /// </summary>
  23 + public string ParentId { get; set; }
  24 + }
  25 +}
0 26 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsDepartmentConsumePerformance/LqStatisticsDepartmentConsumePerformanceInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsDepartmentConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 个人消耗业绩统计详情输出
  7 + /// </summary>
  8 + public class LqStatisticsDepartmentConsumePerformanceInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键ID
  12 + /// </summary>
  13 + public string Id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 岗位类型(健康师, 科技部老师)
  17 + /// </summary>
  18 + public string DepartmentType { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 用户ID
  22 + /// </summary>
  23 + public string UserId { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 用户账号
  27 + /// </summary>
  28 + public string UserCode { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 用户姓名
  32 + /// </summary>
  33 + public string UserName { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 门店ID
  37 + /// </summary>
  38 + public string StoreId { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 门店编码
  42 + /// </summary>
  43 + public string StoreCode { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 门店名称
  47 + /// </summary>
  48 + public string StoreName { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 统计月份(YYYYMM格式)
  52 + /// </summary>
  53 + public string StatisticsMonth { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 消耗业绩
  57 + /// </summary>
  58 + public decimal ConsumePerformance { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 消耗数量
  62 + /// </summary>
  63 + public decimal ConsumeQuantity { get; set; }
  64 +
  65 + /// <summary>
  66 + /// 手工费
  67 + /// </summary>
  68 + public decimal ManualFee { get; set; }
  69 +
  70 + /// <summary>
  71 + /// 创建时间
  72 + /// </summary>
  73 + public DateTime? CreateTime { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 更新时间
  77 + /// </summary>
  78 + public DateTime? UpdateTime { get; set; }
  79 + }
  80 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsDepartmentConsumePerformance/LqStatisticsDepartmentConsumePerformanceListOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsDepartmentConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 个人消耗业绩统计列表输出
  7 + /// </summary>
  8 + public class LqStatisticsDepartmentConsumePerformanceListOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键ID
  12 + /// </summary>
  13 + public string Id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 岗位类型(健康师, 科技部老师)
  17 + /// </summary>
  18 + public string DepartmentType { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 用户ID
  22 + /// </summary>
  23 + public string UserId { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 用户账号
  27 + /// </summary>
  28 + public string UserCode { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 用户姓名
  32 + /// </summary>
  33 + public string UserName { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 门店ID
  37 + /// </summary>
  38 + public string StoreId { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 门店编码
  42 + /// </summary>
  43 + public string StoreCode { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 门店名称
  47 + /// </summary>
  48 + public string StoreName { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 统计月份(YYYYMM格式)
  52 + /// </summary>
  53 + public string StatisticsMonth { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 消耗业绩
  57 + /// </summary>
  58 + public decimal ConsumePerformance { get; set; }
  59 +
  60 + /// <summary>
  61 + /// 消耗数量
  62 + /// </summary>
  63 + public decimal ConsumeQuantity { get; set; }
  64 +
  65 + /// <summary>
  66 + /// 手工费
  67 + /// </summary>
  68 + public decimal ManualFee { get; set; }
  69 +
  70 + /// <summary>
  71 + /// 创建时间
  72 + /// </summary>
  73 + public DateTime? CreateTime { get; set; }
  74 +
  75 + /// <summary>
  76 + /// 更新时间
  77 + /// </summary>
  78 + public DateTime? UpdateTime { get; set; }
  79 + }
  80 +}
0 81 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsDepartmentConsumePerformance/LqStatisticsDepartmentConsumePerformanceListQueryInput.cs 0 → 100644
  1 +using NCC.Common.Filter;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsDepartmentConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 个人消耗业绩统计列表查询输入
  7 + /// </summary>
  8 + public class LqStatisticsDepartmentConsumePerformanceListQueryInput : PageInputBase
  9 + {
  10 + /// <summary>
  11 + /// 岗位类型(健康师, 科技部老师)
  12 + /// </summary>
  13 + public string DepartmentType { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 用户ID
  17 + /// </summary>
  18 + public string UserId { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 用户账号
  22 + /// </summary>
  23 + public string UserCode { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 用户姓名
  27 + /// </summary>
  28 + public string UserName { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 门店ID
  32 + /// </summary>
  33 + public string StoreId { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 门店编码
  37 + /// </summary>
  38 + public string StoreCode { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 门店名称
  42 + /// </summary>
  43 + public string StoreName { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 统计月份(YYYYMM格式)
  47 + /// </summary>
  48 + public string StatisticsMonth { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 开始月份(YYYYMM格式)
  52 + /// </summary>
  53 + public string StartMonth { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 结束月份(YYYYMM格式)
  57 + /// </summary>
  58 + public string EndMonth { get; set; }
  59 + }
  60 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsStoreConsumePerformance/LqStatisticsStoreConsumePerformanceInfoOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsStoreConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 门店耗卡业绩统计详情输出
  7 + /// </summary>
  8 + public class LqStatisticsStoreConsumePerformanceInfoOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键ID
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 门店ID
  17 + /// </summary>
  18 + public string storeId { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 门店编码
  22 + /// </summary>
  23 + public string storeCode { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店名称
  27 + /// </summary>
  28 + public string storeName { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 统计月份(YYYYMM格式)
  32 + /// </summary>
  33 + public string statisticsMonth { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 消耗业绩
  37 + /// </summary>
  38 + public decimal consumePerformance { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 消耗数量
  42 + /// </summary>
  43 + public decimal consumeQuantity { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 手工费
  47 + /// </summary>
  48 + public decimal manualFee { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 创建时间
  52 + /// </summary>
  53 + public DateTime? createTime { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 更新时间
  57 + /// </summary>
  58 + public DateTime? updateTime { get; set; }
  59 + }
  60 +}
0 61 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsStoreConsumePerformance/LqStatisticsStoreConsumePerformanceListOutput.cs 0 → 100644
  1 +using System;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsStoreConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 门店耗卡业绩统计列表输出
  7 + /// </summary>
  8 + public class LqStatisticsStoreConsumePerformanceListOutput
  9 + {
  10 + /// <summary>
  11 + /// 主键ID
  12 + /// </summary>
  13 + public string id { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 门店ID
  17 + /// </summary>
  18 + public string storeId { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 门店编码
  22 + /// </summary>
  23 + public string storeCode { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 门店名称
  27 + /// </summary>
  28 + public string storeName { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 统计月份(YYYYMM格式)
  32 + /// </summary>
  33 + public string statisticsMonth { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 消耗业绩
  37 + /// </summary>
  38 + public decimal consumePerformance { get; set; }
  39 +
  40 + /// <summary>
  41 + /// 消耗数量
  42 + /// </summary>
  43 + public decimal consumeQuantity { get; set; }
  44 +
  45 + /// <summary>
  46 + /// 手工费
  47 + /// </summary>
  48 + public decimal manualFee { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 创建时间
  52 + /// </summary>
  53 + public DateTime? createTime { get; set; }
  54 +
  55 + /// <summary>
  56 + /// 更新时间
  57 + /// </summary>
  58 + public DateTime? updateTime { get; set; }
  59 + }
  60 +}
0 61 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqStatisticsStoreConsumePerformance/LqStatisticsStoreConsumePerformanceListQueryInput.cs 0 → 100644
  1 +using NCC.Common.Filter;
  2 +
  3 +namespace NCC.Extend.Entitys.Dto.LqStatisticsStoreConsumePerformance
  4 +{
  5 + /// <summary>
  6 + /// 门店耗卡业绩统计列表查询输入
  7 + /// </summary>
  8 + public class LqStatisticsStoreConsumePerformanceListQueryInput : PageInputBase
  9 + {
  10 + /// <summary>
  11 + /// 门店ID
  12 + /// </summary>
  13 + public string storeId { get; set; }
  14 +
  15 + /// <summary>
  16 + /// 门店编码
  17 + /// </summary>
  18 + public string storeCode { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 门店名称
  22 + /// </summary>
  23 + public string storeName { get; set; }
  24 +
  25 + /// <summary>
  26 + /// 统计月份(YYYYMM格式)
  27 + /// </summary>
  28 + public string statisticsMonth { get; set; }
  29 +
  30 + /// <summary>
  31 + /// 开始月份(YYYYMM格式)
  32 + /// </summary>
  33 + public string startMonth { get; set; }
  34 +
  35 + /// <summary>
  36 + /// 结束月份(YYYYMM格式)
  37 + /// </summary>
  38 + public string endMonth { get; set; }
  39 + }
  40 +}
0 41 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhHyhk/LqXhHyhkListQueryInput.cs
... ... @@ -23,66 +23,56 @@ namespace NCC.Extend.Entitys.Dto.LqXhHyhk
23 23 /// 耗卡编号
24 24 /// </summary>
25 25 public string id { get; set; }
26   -
  26 +
27 27 /// <summary>
28 28 /// 门店
29 29 /// </summary>
30 30 public string md { get; set; }
31   -
  31 +
32 32 /// <summary>
33 33 /// 门店编号
34 34 /// </summary>
35 35 public string mdbh { get; set; }
36   -
  36 +
37 37 /// <summary>
38 38 /// 门店名称
39 39 /// </summary>
40 40 public string mdmc { get; set; }
41   -
  41 +
42 42 /// <summary>
43 43 /// 会员
44 44 /// </summary>
45 45 public string hy { get; set; }
46   -
  46 +
47 47 /// <summary>
48 48 /// 会员账号
49 49 /// </summary>
50 50 public string hyzh { get; set; }
51   -
  51 +
52 52 /// <summary>
53 53 /// 会员名称
54 54 /// </summary>
55 55 public string hymc { get; set; }
56   -
  56 +
57 57 /// <summary>
58 58 /// 顾客类型
59 59 /// </summary>
60 60 public string gklx { get; set; }
61   -
62   - /// <summary>
63   - /// 消费金额
64   - /// </summary>
65   - public string xfje { get; set; }
66   -
67   - /// <summary>
68   - /// 手工费用
69   - /// </summary>
70   - public string sgfy { get; set; }
71   -
  61 +
72 62 /// <summary>
73 63 /// 是否有科技部
74 64 /// </summary>
75 65 public string sfykjb { get; set; }
76   -
  66 +
77 67 /// <summary>
78 68 /// 耗卡时间
79 69 /// </summary>
80 70 public string hksj { get; set; }
81   -
  71 +
82 72 /// <summary>
83 73 /// 操作人员
84 74 /// </summary>
85 75 public string czry { get; set; }
86   -
  76 +
87 77 }
88 78 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhJksyj/LqXhJksyjCrInput.cs
... ... @@ -11,31 +11,31 @@ namespace NCC.Extend.Entitys.Dto.LqXhJksyj
11 11 /// 业绩编号
12 12 /// </summary>
13 13 public string id { get; set; }
14   -
  14 +
15 15 /// <summary>
16 16 /// 关联开单编号
17 17 /// </summary>
18 18 public string glkdbh { get; set; }
19   -
  19 +
20 20 /// <summary>
21 21 /// 健康师
22 22 /// </summary>
23 23 public string jks { get; set; }
24   -
  24 +
25 25 /// <summary>
26 26 /// 健康师姓名
27 27 /// </summary>
28 28 public string jksxm { get; set; }
29   -
  29 +
30 30 /// <summary>
31 31 /// 健康师账号
32 32 /// </summary>
33 33 public string jkszh { get; set; }
34   -
  34 +
35 35 /// <summary>
36 36 /// 健康师业绩
37 37 /// </summary>
38   - public string jksyj { get; set; }
  38 + public decimal jksyj { get; set; }
39 39  
40 40 /// <summary>
41 41 /// 业绩时间
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhKjbsyj/LqXhKjbsyjCrInput.cs
... ... @@ -35,7 +35,7 @@ namespace NCC.Extend.Entitys.Dto.LqXhKjbsyj
35 35 /// <summary>
36 36 /// 科技部老师业绩
37 37 /// </summary>
38   - public string kjblsyj { get; set; }
  38 + public decimal kjblsyj { get; set; }
39 39  
40 40 /// <summary>
41 41 /// 业绩时间
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Dto/LqXhPxmx/LqXhPxmxInfoOutput.cs
... ... @@ -56,11 +56,6 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
56 56 public int? projectNumber { get; set; }
57 57  
58 58 /// <summary>
59   - /// 是否有效
60   - /// </summary>
61   - public int? isEnabled { get; set; }
62   -
63   - /// <summary>
64 59 /// 来源类型(开卡/赠送/其他)
65 60 /// </summary>
66 61 public string sourceType { get; set; }
... ... @@ -71,6 +66,11 @@ namespace NCC.Extend.Entitys.Dto.LqXhPxmx
71 66 public decimal totalPrice { get; set; }
72 67  
73 68 /// <summary>
  69 + /// 是否有效
  70 + /// </summary>
  71 + public int? isEffective { get; set; }
  72 +
  73 + /// <summary>
74 74 /// 健康师业绩列表
75 75 /// </summary>
76 76 public List<LqXhJksyjInfoOutput> lqXhJksyjList { get; set; }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_department_consume_performance/LqStatisticsDepartmentConsumePerformanceEntity.cs 0 → 100644
  1 +using System;
  2 +using NCC.Common.Const;
  3 +using SqlSugar;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_statistics_department_consume_performance
  6 +{
  7 + /// <summary>
  8 + /// 个人消耗业绩统计
  9 + /// </summary>
  10 + [SugarTable("lq_statistics_department_consume_performance")]
  11 + [Tenant(ClaimConst.TENANT_ID)]
  12 + public class LqStatisticsDepartmentConsumePerformanceEntity
  13 + {
  14 + /// <summary>
  15 + /// 主键ID
  16 + /// </summary>
  17 + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
  18 + public string Id { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 岗位类型(健康师, 科技部老师)
  22 + /// </summary>
  23 + [SugarColumn(ColumnName = "F_DepartmentType")]
  24 + public string DepartmentType { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 用户ID
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "F_UserId")]
  30 + public string UserId { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 用户账号
  34 + /// </summary>
  35 + [SugarColumn(ColumnName = "F_UserCode")]
  36 + public string UserCode { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 用户姓名
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "F_UserName")]
  42 + public string UserName { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 门店ID
  46 + /// </summary>
  47 + [SugarColumn(ColumnName = "F_StoreId")]
  48 + public string StoreId { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 门店编码
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "F_StoreCode")]
  54 + public string StoreCode { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 门店名称
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_StoreName")]
  60 + public string StoreName { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 统计月份(YYYYMM格式)
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_StatisticsMonth")]
  66 + public string StatisticsMonth { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 消耗业绩
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_ConsumePerformance")]
  72 + public decimal ConsumePerformance { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 消耗数量
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_ConsumeQuantity")]
  78 + public decimal ConsumeQuantity { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 手工费
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_ManualFee")]
  84 + public decimal ManualFee { get; set; }
  85 +
  86 + /// <summary>
  87 + /// 创建时间
  88 + /// </summary>
  89 + [SugarColumn(ColumnName = "F_CreateTime")]
  90 + public DateTime? CreateTime { get; set; }
  91 +
  92 + /// <summary>
  93 + /// 更新时间
  94 + /// </summary>
  95 + [SugarColumn(ColumnName = "F_UpdateTime")]
  96 + public DateTime? UpdateTime { get; set; }
  97 + }
  98 +}
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_statistics_store_consume_performance/LqStatisticsStoreConsumePerformanceEntity.cs 0 → 100644
  1 +using System;
  2 +using NCC.Common.Const;
  3 +using SqlSugar;
  4 +
  5 +namespace NCC.Extend.Entitys.lq_statistics_store_consume_performance
  6 +{
  7 + /// <summary>
  8 + /// 门店耗卡业绩统计
  9 + /// </summary>
  10 + [SugarTable("lq_statistics_store_consume_performance")]
  11 + [Tenant(ClaimConst.TENANT_ID)]
  12 + public class LqStatisticsStoreConsumePerformanceEntity
  13 + {
  14 + /// <summary>
  15 + /// 主键ID
  16 + /// </summary>
  17 + [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
  18 + public string Id { get; set; }
  19 +
  20 + /// <summary>
  21 + /// 门店ID
  22 + /// </summary>
  23 + [SugarColumn(ColumnName = "F_StoreId")]
  24 + public string StoreId { get; set; }
  25 +
  26 + /// <summary>
  27 + /// 门店编码
  28 + /// </summary>
  29 + [SugarColumn(ColumnName = "F_StoreCode")]
  30 + public string StoreCode { get; set; }
  31 +
  32 + /// <summary>
  33 + /// 门店名称
  34 + /// </summary>
  35 + [SugarColumn(ColumnName = "F_StoreName")]
  36 + public string StoreName { get; set; }
  37 +
  38 + /// <summary>
  39 + /// 统计月份(YYYYMM格式)
  40 + /// </summary>
  41 + [SugarColumn(ColumnName = "F_StatisticsMonth")]
  42 + public string StatisticsMonth { get; set; }
  43 +
  44 + /// <summary>
  45 + /// 消耗业绩
  46 + /// </summary>
  47 + [SugarColumn(ColumnName = "F_ConsumePerformance")]
  48 + public decimal ConsumePerformance { get; set; }
  49 +
  50 + /// <summary>
  51 + /// 消耗数量
  52 + /// </summary>
  53 + [SugarColumn(ColumnName = "F_ConsumeQuantity")]
  54 + public decimal ConsumeQuantity { get; set; }
  55 +
  56 + /// <summary>
  57 + /// 手工费
  58 + /// </summary>
  59 + [SugarColumn(ColumnName = "F_ManualFee")]
  60 + public decimal ManualFee { get; set; }
  61 +
  62 + /// <summary>
  63 + /// 创建时间
  64 + /// </summary>
  65 + [SugarColumn(ColumnName = "F_CreateTime")]
  66 + public DateTime? CreateTime { get; set; }
  67 +
  68 + /// <summary>
  69 + /// 更新时间
  70 + /// </summary>
  71 + [SugarColumn(ColumnName = "F_UpdateTime")]
  72 + public DateTime? UpdateTime { get; set; }
  73 + }
  74 +}
0 75 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_hyhk/LqXhHyhkEntity.cs
... ... @@ -63,13 +63,13 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk
63 63 /// 消费金额
64 64 /// </summary>
65 65 [SugarColumn(ColumnName = "xfje")]
66   - public string Xfje { get; set; }
  66 + public decimal? Xfje { get; set; }
67 67  
68 68 /// <summary>
69 69 /// 手工费用
70 70 /// </summary>
71 71 [SugarColumn(ColumnName = "sgfy")]
72   - public string Sgfy { get; set; }
  72 + public decimal? Sgfy { get; set; }
73 73  
74 74 /// <summary>
75 75 /// 是否有科技部
... ... @@ -77,23 +77,6 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk
77 77 [SugarColumn(ColumnName = "sfykjb")]
78 78 public string Sfykjb { get; set; }
79 79  
80   - /// <summary>
81   - /// 健康师业绩
82   - /// </summary>
83   - [SugarColumn(ColumnName = "jksyj")]
84   - public string Jksyj { get; set; }
85   -
86   - /// <summary>
87   - /// 科技部业绩
88   - /// </summary>
89   - [SugarColumn(ColumnName = "kjbyj")]
90   - public string Kjbyj { get; set; }
91   -
92   - /// <summary>
93   - /// 品项信息
94   - /// </summary>
95   - [SugarColumn(ColumnName = "pxxx")]
96   - public string Pxxx { get; set; }
97 80  
98 81 /// <summary>
99 82 /// 耗卡时间
... ... @@ -108,15 +91,27 @@ namespace NCC.Extend.Entitys.lq_xh_hyhk
108 91 public string Czry { get; set; }
109 92  
110 93 /// <summary>
  94 + /// 签名文件
  95 + /// </summary>
  96 + [SugarColumn(ColumnName = "F_SignatureFile")]
  97 + public string SignatureFile { get; set; }
  98 +
  99 + /// <summary>
111 100 /// 创建时间
112 101 /// </summary>
113 102 [SugarColumn(ColumnName = "F_CreateTime")]
114   - public DateTime CreateTime { get; set; }
  103 + public DateTime? CreateTime { get; set; }
115 104  
116 105 /// <summary>
117 106 /// 修改时间
118 107 /// </summary>
119 108 [SugarColumn(ColumnName = "F_UpdateTime")]
120   - public DateTime UpdateTime { get; set; }
  109 + public DateTime? UpdateTime { get; set; }
  110 +
  111 + /// <summary>
  112 + /// 是否有效
  113 + /// </summary>
  114 + [SugarColumn(ColumnName = "F_IsEffective")]
  115 + public int? IsEffective { get; set; } = 1;
121 116 }
122 117 }
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_jksyj/LqXhJksyjEntity.cs
... ... @@ -16,65 +16,71 @@ namespace NCC.Extend.Entitys.lq_xh_jksyj
16 16 /// </summary>
17 17 [SugarColumn(ColumnName = "F_Id", IsPrimaryKey = true)]
18 18 public string Id { get; set; }
19   -
  19 +
20 20 /// <summary>
21 21 /// 关联开单编号
22 22 /// </summary>
23   - [SugarColumn(ColumnName = "glkdbh")]
  23 + [SugarColumn(ColumnName = "glkdbh")]
24 24 public string Glkdbh { get; set; }
25   -
  25 +
26 26 /// <summary>
27 27 /// 健康师
28 28 /// </summary>
29   - [SugarColumn(ColumnName = "jks")]
  29 + [SugarColumn(ColumnName = "jks")]
30 30 public string Jks { get; set; }
31   -
  31 +
32 32 /// <summary>
33 33 /// 健康师姓名
34 34 /// </summary>
35   - [SugarColumn(ColumnName = "jksxm")]
  35 + [SugarColumn(ColumnName = "jksxm")]
36 36 public string Jksxm { get; set; }
37   -
  37 +
38 38 /// <summary>
39 39 /// 健康师账号
40 40 /// </summary>
41   - [SugarColumn(ColumnName = "jkszh")]
  41 + [SugarColumn(ColumnName = "jkszh")]
42 42 public string Jkszh { get; set; }
43   -
  43 +
44 44 /// <summary>
45 45 /// 健康师业绩
46 46 /// </summary>
47   - [SugarColumn(ColumnName = "jksyj")]
48   - public string Jksyj { get; set; }
49   -
  47 + [SugarColumn(ColumnName = "jksyj")]
  48 + public decimal? Jksyj { get; set; }
  49 +
50 50 /// <summary>
51 51 /// 业绩时间
52 52 /// </summary>
53   - [SugarColumn(ColumnName = "yjsj")]
  53 + [SugarColumn(ColumnName = "yjsj")]
54 54 public DateTime? Yjsj { get; set; }
55 55  
56 56 /// <summary>
57 57 /// 金三角id
58 58 /// </summary>
59   - [SugarColumn(ColumnName = "F_jsjid")]
  59 + [SugarColumn(ColumnName = "F_jsjid")]
60 60 public string JsjId { get; set; }
61 61  
62 62 /// <summary>
63 63 /// 耗卡品项id
64 64 /// </summary>
65   - [SugarColumn(ColumnName = "F_kdpxid")]
  65 + [SugarColumn(ColumnName = "F_kdpxid")]
66 66 public string Kdpxid { get; set; }
67 67  
68 68 /// <summary>
69 69 /// 手工费
70 70 /// </summary>
71   - [SugarColumn(ColumnName = "F_LaborCost")]
  71 + [SugarColumn(ColumnName = "F_LaborCost")]
72 72 public decimal? LaborCost { get; set; }
73 73  
74 74 /// <summary>
75 75 /// 耗卡品项次数
76 76 /// </summary>
77   - [SugarColumn(ColumnName = "F_kdpxNumber")]
  77 + [SugarColumn(ColumnName = "F_kdpxNumber")]
78 78 public decimal? KdpxNumber { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 是否有效
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_IsEffective")]
  84 + public int? IsEffective { get; set; } = 1;
79 85 }
80 86 }
81 87 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_kjbsyj/LqXhKjbsyjEntity.cs
... ... @@ -45,7 +45,7 @@ namespace NCC.Extend.Entitys.lq_xh_kjbsyj
45 45 /// 科技部老师业绩
46 46 /// </summary>
47 47 [SugarColumn(ColumnName = "kjblsyj")]
48   - public string Kjblsyj { get; set; }
  48 + public decimal? Kjblsyj { get; set; }
49 49  
50 50 /// <summary>
51 51 /// 业绩时间
... ... @@ -70,5 +70,11 @@ namespace NCC.Extend.Entitys.lq_xh_kjbsyj
70 70 /// </summary>
71 71 [SugarColumn(ColumnName = "F_hdpxNumber")]
72 72 public decimal? HdpxNumber { get; set; }
  73 +
  74 + /// <summary>
  75 + /// 是否有效
  76 + /// </summary>
  77 + [SugarColumn(ColumnName = "F_IsEffective")]
  78 + public int? IsEffective { get; set; } = 1;
73 79 }
74 80 }
75 81 \ No newline at end of file
... ...
netcore/src/Modularity/Extend/NCC.Extend.Entitys/Entity/lq_xh_pxmx/LqXhPxmxEntity.cs
... ... @@ -66,12 +66,6 @@ namespace NCC.Extend.Entitys.lq_xh_pxmx
66 66 public int ProjectNumber { get; set; }
67 67  
68 68 /// <summary>
69   - /// 是否有效
70   - /// </summary>
71   - [SugarColumn(ColumnName = "F_IsEnabled")]
72   - public int? IsEnabled { get; set; }
73   -
74   - /// <summary>
75 69 /// 来源类型
76 70 /// </summary>
77 71 [SugarColumn(ColumnName = "F_SourceType")]
... ... @@ -82,5 +76,11 @@ namespace NCC.Extend.Entitys.lq_xh_pxmx
82 76 /// </summary>
83 77 [SugarColumn(ColumnName = "F_TotalPrice")]
84 78 public decimal TotalPrice { get; set; }
  79 +
  80 + /// <summary>
  81 + /// 是否有效
  82 + /// </summary>
  83 + [SugarColumn(ColumnName = "F_IsEffective")]
  84 + public int? IsEffective { get; set; } = 1;
85 85 }
86 86 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs
... ... @@ -234,7 +234,7 @@ namespace NCC.Extend.LqKdKdjlb
234 234 jksyj = it.Jksyj,
235 235 kjblsyj = it.Kjblsyj,
236 236 pxxx = it.Pxxx,
237   - F_FIleUrl = it.F_FIleUrl,
  237 + IsEffective = it.IsEffective,
238 238 })
239 239 .MergeTable()
240 240 .OrderBy(sidx + " " + input.sort)
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMdXdbhsjService.cs
... ... @@ -28,7 +28,7 @@ namespace NCC.Extend.LqMdXdbhsj
28 28 /// <summary>
29 29 /// 门店新店保护时间服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "Extend", Name = "LqMdXdbhsj", Order = 201)]
  31 + [ApiDescriptionSettings(Tag = "绿纤门店信息服务", Name = "LqMdXdbhsj", Order = 201)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqMdXdbhsjService : ILqMdXdbhsjService, IDynamicApiController, ITransient
34 34 {
... ... @@ -46,6 +46,7 @@ namespace NCC.Extend.LqMdXdbhsj
46 46 _userManager = userManager;
47 47 }
48 48  
  49 + #region 门店新店保护时间信息
49 50 /// <summary>
50 51 /// 获取门店新店保护时间信息
51 52 /// </summary>
... ... @@ -58,7 +59,9 @@ namespace NCC.Extend.LqMdXdbhsj
58 59 var output = entity.Adapt<LqMdXdbhsjInfoOutput>();
59 60 return output;
60 61 }
  62 + #endregion
61 63  
  64 + #region 门店新店保护时间列表
62 65 /// <summary>
63 66 /// 获取门店新店保护时间列表
64 67 /// </summary>
... ... @@ -88,7 +91,9 @@ namespace NCC.Extend.LqMdXdbhsj
88 91 .ToPagedListAsync(input.currentPage, input.pageSize);
89 92 return PageResult<LqMdXdbhsjListOutput>.SqlSugarPageResult(data);
90 93 }
  94 + #endregion
91 95  
  96 + #region 新建门店新店保护时间
92 97 /// <summary>
93 98 /// 新建门店新店保护时间
94 99 /// </summary>
... ... @@ -105,7 +110,7 @@ namespace NCC.Extend.LqMdXdbhsj
105 110 // 验证时间逻辑
106 111 if (entity.Bhkssj >= entity.Bhjssj)
107 112 {
108   - throw NCCException.Oh(ErrorCode.COM1000, "保护开始时间必须早于保护结束时间");
  113 + throw NCCException.Oh("保护开始时间必须早于保护结束时间");
109 114 }
110 115  
111 116 // 检查是否存在重叠的保护时间
... ... @@ -118,14 +123,16 @@ namespace NCC.Extend.LqMdXdbhsj
118 123  
119 124 if (exists)
120 125 {
121   - throw NCCException.Oh(ErrorCode.COM1000, "该门店在指定时间段内已存在保护时间设置");
  126 + throw NCCException.Oh("该门店在指定时间段内已存在保护时间设置");
122 127 }
123 128  
124 129 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
125 130 if (!(isOk > 0))
126 131 throw NCCException.Oh(ErrorCode.COM1000);
127 132 }
  133 + #endregion
128 134  
  135 + #region 更新门店新店保护时间
129 136 /// <summary>
130 137 /// 更新门店新店保护时间
131 138 /// </summary>
... ... @@ -161,7 +168,9 @@ namespace NCC.Extend.LqMdXdbhsj
161 168 if (!(isOk > 0))
162 169 throw NCCException.Oh(ErrorCode.COM1001);
163 170 }
  171 + #endregion
164 172  
  173 + #region 删除门店新店保护时间
165 174 /// <summary>
166 175 /// 删除门店新店保护时间
167 176 /// </summary>
... ... @@ -175,7 +184,9 @@ namespace NCC.Extend.LqMdXdbhsj
175 184 if (!(isOk > 0))
176 185 throw NCCException.Oh(ErrorCode.COM1002);
177 186 }
  187 + #endregion
178 188  
  189 + #region 获取门店新店保护时间下拉选择数据
179 190 /// <summary>
180 191 /// 获取门店新店保护时间下拉选择数据
181 192 /// </summary>
... ... @@ -194,7 +205,9 @@ namespace NCC.Extend.LqMdXdbhsj
194 205 .ToListAsync();
195 206 return new { list = list };
196 207 }
  208 + #endregion
197 209  
  210 + #region 根据门店ID获取当前有效的保护时间
198 211 /// <summary>
199 212 /// 根据门店ID获取当前有效的保护时间
200 213 /// </summary>
... ... @@ -205,7 +218,6 @@ namespace NCC.Extend.LqMdXdbhsj
205 218 {
206 219 var now = DateTime.Now;
207 220 var entity = await _db.Queryable<LqMdXdbhsjEntity>().Where(p => p.Mdid == mdid && p.Sfqy == 1).Where(p => p.Bhkssj <= now && p.Bhjssj >= now).FirstAsync();
208   -
209 221 if (entity == null)
210 222 {
211 223 return new { hasProtection = false, message = "该门店当前无保护时间设置" };
... ... @@ -214,5 +226,6 @@ namespace NCC.Extend.LqMdXdbhsj
214 226 var output = entity.Adapt<LqMdXdbhsjInfoOutput>();
215 227 return new { hasProtection = true, data = output };
216 228 }
  229 + #endregion
217 230 }
218 231 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqMdxxService.cs
... ... @@ -28,7 +28,7 @@ namespace NCC.Extend.LqMdxx
28 28 /// <summary>
29 29 /// 门店信息服务
30 30 /// </summary>
31   - [ApiDescriptionSettings(Tag = "绿纤门店信息服务",Name = "LqMdxx", Order = 200)]
  31 + [ApiDescriptionSettings(Tag = "绿纤门店信息服务", Name = "LqMdxx", Order = 200)]
32 32 [Route("api/Extend/[controller]")]
33 33 public class LqMdxxService : ILqMdxxService, IDynamicApiController, ITransient
34 34 {
... ... @@ -39,15 +39,14 @@ namespace NCC.Extend.LqMdxx
39 39 /// <summary>
40 40 /// 初始化一个<see cref="LqMdxxService"/>类型的新实例
41 41 /// </summary>
42   - public LqMdxxService(
43   - ISqlSugarRepository<LqMdxxEntity> lqMdxxRepository,
44   - IUserManager userManager)
  42 + public LqMdxxService(ISqlSugarRepository<LqMdxxEntity> lqMdxxRepository, IUserManager userManager)
45 43 {
46   - _lqMdxxRepository = lqMdxxRepository;
  44 + _lqMdxxRepository = lqMdxxRepository;
47 45 _db = _lqMdxxRepository.Context;
48 46 _userManager = userManager;
49 47 }
50 48  
  49 + #region 门店信息
51 50 /// <summary>
52 51 /// 获取门店信息
53 52 /// </summary>
... ... @@ -60,12 +59,14 @@ namespace NCC.Extend.LqMdxx
60 59 var output = entity.Adapt<LqMdxxInfoOutput>();
61 60 return output;
62 61 }
  62 + #endregion
63 63  
  64 + #region 门店信息列表
64 65 /// <summary>
65   - /// 获取门店信息列表
66   - /// </summary>
67   - /// <param name="input">请求参数</param>
68   - /// <returns></returns>
  66 + /// 获取门店信息列表
  67 + /// </summary>
  68 + /// <param name="input">请求参数</param>
  69 + /// <returns></returns>
69 70 [HttpGet("")]
70 71 public async Task<dynamic> GetList([FromQuery] LqMdxxListQueryInput input)
71 72 {
... ... @@ -90,37 +91,39 @@ namespace NCC.Extend.LqMdxx
90 91 .WhereIF(!string.IsNullOrEmpty(input.gsmc), p => p.Gsmc.Contains(input.gsmc))
91 92 .WhereIF(!string.IsNullOrEmpty(input.fr), p => p.Fr.Contains(input.fr))
92 93 .WhereIF(!string.IsNullOrEmpty(input.ywsb), p => p.Ywsb.Equals(input.ywsb))
93   - .Select(it=> new LqMdxxListOutput
  94 + .Select(it => new LqMdxxListOutput
94 95 {
95 96 id = it.Id,
96   - mdbm=it.Mdbm,
97   - djmdbh=it.Djmdbh,
98   - djmd=it.Djmd,
99   - dm=it.Dm,
100   - cs=it.Cs,
101   - dz=it.Dz,
102   - xm=it.Xm,
103   - dhhm=it.Dhhm,
104   - zj=it.Zj,
105   - kysj=it.Kysj,
106   - zxzt=it.Zxzt,
107   - gsmc=it.Gsmc,
108   - fr=it.Fr,
109   - ywsb=it.Ywsb,
110   - jyb=it.Jyb,
111   - kjb=it.Kjb,
112   - dxmb=it.Dxmb,
113   - syb=it.Syb,
114   - xsyj=it.Xsyj,
115   - xhyj=it.Xhyj,
116   - xms=it.Xms,
117   - rt1=it.Rt1,
118   - rt2=it.Rt2,
119   - rc=it.Rc,
120   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
121   - return PageResult<LqMdxxListOutput>.SqlSugarPageResult(data);
  97 + mdbm = it.Mdbm,
  98 + djmdbh = it.Djmdbh,
  99 + djmd = it.Djmd,
  100 + dm = it.Dm,
  101 + cs = it.Cs,
  102 + dz = it.Dz,
  103 + xm = it.Xm,
  104 + dhhm = it.Dhhm,
  105 + zj = it.Zj,
  106 + kysj = it.Kysj,
  107 + zxzt = it.Zxzt,
  108 + gsmc = it.Gsmc,
  109 + fr = it.Fr,
  110 + ywsb = it.Ywsb,
  111 + jyb = it.Jyb,
  112 + kjb = it.Kjb,
  113 + dxmb = it.Dxmb,
  114 + syb = it.Syb,
  115 + xsyj = it.Xsyj,
  116 + xhyj = it.Xhyj,
  117 + xms = it.Xms,
  118 + rt1 = it.Rt1,
  119 + rt2 = it.Rt2,
  120 + rc = it.Rc,
  121 + }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
  122 + return PageResult<LqMdxxListOutput>.SqlSugarPageResult(data);
122 123 }
  124 + #endregion
123 125  
  126 + #region 新建门店信息
124 127 /// <summary>
125 128 /// 新建门店信息
126 129 /// </summary>
... ... @@ -135,7 +138,9 @@ namespace NCC.Extend.LqMdxx
135 138 var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
136 139 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
137 140 }
  141 + #endregion
138 142  
  143 + #region 获取门店信息无分页列表
139 144 /// <summary>
140 145 /// 获取门店信息无分页列表
141 146 /// </summary>
... ... @@ -165,27 +170,29 @@ namespace NCC.Extend.LqMdxx
165 170 .WhereIF(!string.IsNullOrEmpty(input.gsmc), p => p.Gsmc.Contains(input.gsmc))
166 171 .WhereIF(!string.IsNullOrEmpty(input.fr), p => p.Fr.Contains(input.fr))
167 172 .WhereIF(!string.IsNullOrEmpty(input.ywsb), p => p.Ywsb.Equals(input.ywsb))
168   - .Select(it=> new LqMdxxListOutput
  173 + .Select(it => new LqMdxxListOutput
169 174 {
170 175 id = it.Id,
171   - mdbm=it.Mdbm,
172   - djmdbh=it.Djmdbh,
173   - djmd=it.Djmd,
174   - dm=it.Dm,
175   - cs=it.Cs,
176   - dz=it.Dz,
177   - xm=it.Xm,
178   - dhhm=it.Dhhm,
179   - zj=it.Zj,
180   - kysj=it.Kysj,
181   - zxzt=it.Zxzt,
182   - gsmc=it.Gsmc,
183   - fr=it.Fr,
184   - ywsb=it.Ywsb,
185   - }).MergeTable().OrderBy(sidx+" "+input.sort).ToListAsync();
186   - return data;
  176 + mdbm = it.Mdbm,
  177 + djmdbh = it.Djmdbh,
  178 + djmd = it.Djmd,
  179 + dm = it.Dm,
  180 + cs = it.Cs,
  181 + dz = it.Dz,
  182 + xm = it.Xm,
  183 + dhhm = it.Dhhm,
  184 + zj = it.Zj,
  185 + kysj = it.Kysj,
  186 + zxzt = it.Zxzt,
  187 + gsmc = it.Gsmc,
  188 + fr = it.Fr,
  189 + ywsb = it.Ywsb,
  190 + }).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync();
  191 + return data;
187 192 }
  193 + #endregion
188 194  
  195 + #region 导出门店信息
189 196 /// <summary>
190 197 /// 导出门店信息
191 198 /// </summary>
... ... @@ -205,7 +212,7 @@ namespace NCC.Extend.LqMdxx
205 212 {
206 213 exportData = await this.GetNoPagingList(input);
207 214 }
208   - List<ParamsModel> paramList = "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店编码\",\"field\":\"mdbm\"},{\"value\":\"单据门店编号\",\"field\":\"djmdbh\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"店名\",\"field\":\"dm\"},{\"value\":\"城市\",\"field\":\"cs\"},{\"value\":\"地址\",\"field\":\"dz\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"电话号码\",\"field\":\"dhhm\"},{\"value\":\"座机\",\"field\":\"zj\"},{\"value\":\"开业时间\",\"field\":\"kysj\"},{\"value\":\"最新状态\",\"field\":\"zxzt\"},{\"value\":\"工商名称\",\"field\":\"gsmc\"},{\"value\":\"法人\",\"field\":\"fr\"},{\"value\":\"有无社保\",\"field\":\"ywsb\"},]".ToList<ParamsModel>();
  215 + List<ParamsModel> paramList = "[{\"value\":\"主键\",\"field\":\"id\"},{\"value\":\"门店编码\",\"field\":\"mdbm\"},{\"value\":\"单据门店编号\",\"field\":\"djmdbh\"},{\"value\":\"单据门店\",\"field\":\"djmd\"},{\"value\":\"店名\",\"field\":\"dm\"},{\"value\":\"城市\",\"field\":\"cs\"},{\"value\":\"地址\",\"field\":\"dz\"},{\"value\":\"姓名\",\"field\":\"xm\"},{\"value\":\"电话号码\",\"field\":\"dhhm\"},{\"value\":\"座机\",\"field\":\"zj\"},{\"value\":\"开业时间\",\"field\":\"kysj\"},{\"value\":\"最新状态\",\"field\":\"zxzt\"},{\"value\":\"工商名称\",\"field\":\"gsmc\"},{\"value\":\"法人\",\"field\":\"fr\"},{\"value\":\"有无社保\",\"field\":\"ywsb\"},]".ToList<ParamsModel>();
209 216 ExcelConfig excelconfig = new ExcelConfig();
210 217 excelconfig.FileName = "门店信息.xls";
211 218 excelconfig.HeadFont = "微软雅黑";
... ... @@ -231,7 +238,9 @@ namespace NCC.Extend.LqMdxx
231 238 };
232 239 return output;
233 240 }
  241 + #endregion
234 242  
  243 + #region 批量删除门店信息
235 244 /// <summary>
236 245 /// 批量删除门店信息
237 246 /// </summary>
... ... @@ -248,7 +257,7 @@ namespace NCC.Extend.LqMdxx
248 257 //开启事务
249 258 _db.BeginTran();
250 259 //批量删除门店信息
251   - await _db.Deleteable<LqMdxxEntity>().In(d => d.Id,ids).ExecuteCommandAsync();
  260 + await _db.Deleteable<LqMdxxEntity>().In(d => d.Id, ids).ExecuteCommandAsync();
252 261 //关闭事务
253 262 _db.CommitTran();
254 263 }
... ... @@ -260,7 +269,9 @@ namespace NCC.Extend.LqMdxx
260 269 }
261 270 }
262 271 }
  272 + #endregion
263 273  
  274 + #region 更新门店信息
264 275 /// <summary>
265 276 /// 更新门店信息
266 277 /// </summary>
... ... @@ -275,7 +286,9 @@ namespace NCC.Extend.LqMdxx
275 286 var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
276 287 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
277 288 }
  289 + #endregion
278 290  
  291 + #region 更新门店目标字段
279 292 /// <summary>
280 293 /// 更新门店目标字段
281 294 /// </summary>
... ... @@ -286,8 +299,8 @@ namespace NCC.Extend.LqMdxx
286 299 public async Task UpdateTargets(string id, [FromBody] LqMdxxTargetUpdateInput input)
287 300 {
288 301 var isOk = await _db.Updateable<LqMdxxEntity>()
289   - .SetColumns(it => new LqMdxxEntity
290   - {
  302 + .SetColumns(it => new LqMdxxEntity
  303 + {
291 304 Xsyj = input.xsyj,
292 305 Xhyj = input.xhyj,
293 306 Xms = input.xms,
... ... @@ -299,7 +312,9 @@ namespace NCC.Extend.LqMdxx
299 312 .ExecuteCommandAsync();
300 313 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
301 314 }
  315 + #endregion
302 316  
  317 + #region 删除门店信息
303 318 /// <summary>
304 319 /// 删除门店信息
305 320 /// </summary>
... ... @@ -312,7 +327,9 @@ namespace NCC.Extend.LqMdxx
312 327 var isOk = await _db.Deleteable<LqMdxxEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
313 328 if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
314 329 }
  330 + #endregion
315 331  
  332 + #region 获取门店下拉选择数据
316 333 /// <summary>
317 334 /// 获取门店下拉选择数据
318 335 /// </summary>
... ... @@ -325,6 +342,6 @@ namespace NCC.Extend.LqMdxx
325 342 .ToListAsync();
326 343 return new { list = list };
327 344 }
328   -
  345 + #endregion
329 346 }
330 347 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqStatisticsService.cs
... ... @@ -13,7 +13,10 @@ using NCC.Dependency;
13 13 using NCC.DynamicApiController;
14 14 using NCC.Extend.Entitys.Dto.LqMdxx;
15 15 using NCC.Extend.Entitys.Dto.LqStatistics;
  16 +using NCC.Extend.Entitys.Dto.LqStatistics.DepartmentInfo;
  17 +using NCC.Extend.Entitys.Dto.LqStatisticsStoreConsumePerformance;
16 18 using NCC.Extend.Entitys.Dto.LqStatisticsTechPerformance;
  19 +using NCC.Extend.Entitys.Dto.LqStatisticsDepartmentConsumePerformance;
17 20 using NCC.Extend.Entitys.Dto.LqYcsdJsj;
18 21 using NCC.Extend.Entitys.lq_hytk_kjbsyj;
19 22 using NCC.Extend.Entitys.lq_jinsanjiao_user;
... ... @@ -26,7 +29,9 @@ using NCC.Extend.Entitys.lq_ycsd_jsj;
26 29 using NCC.Extend.Entitys.lq_yjmxb;
27 30 using NCC.Extend.Entitys.lq_statistics_gold_triangle;
28 31 using NCC.Extend.Entitys.lq_statistics_personal_performance;
  32 +using NCC.Extend.Entitys.lq_statistics_store_consume_performance;
29 33 using NCC.Extend.Entitys.lq_statistics_tech_performance;
  34 +using NCC.Extend.Entitys.lq_statistics_department_consume_performance;
30 35 using NCC.Extend.Entitys.lq_xmzl;
31 36 using NCC.Extend.Entitys.Dto.LqStatisticsPersonalPerformance;
32 37 using NCC.Extend.Entitys.v_tech_teacher_flow;
... ... @@ -1882,26 +1887,386 @@ namespace NCC.Extend.LqStatistics
1882 1887  
1883 1888 #endregion
1884 1889  
  1890 + #region 门店耗卡业绩统计
  1891 +
  1892 + /// <summary>
  1893 + /// 【4】保存门店耗卡业绩统计数据
  1894 + /// </summary>
  1895 + /// <remarks>
  1896 + /// 统计指定月份各门店的耗卡业绩数据,包括消耗业绩、消耗数量、手工费
  1897 + ///
  1898 + /// 示例请求:
  1899 + /// ```json
  1900 + /// {
  1901 + /// "statisticsMonth": "202501"
  1902 + /// }
  1903 + /// ```
  1904 + ///
  1905 + /// 参数说明:
  1906 + /// - statisticsMonth: 统计月份,格式为YYYYMM
  1907 + /// </remarks>
  1908 + /// <param name="input">统计月份输入参数</param>
  1909 + /// <returns>保存结果</returns>
  1910 + /// <response code="200">成功保存统计数据</response>
  1911 + /// <response code="400">参数错误</response>
  1912 + /// <response code="500">服务器错误</response>
  1913 + [HttpPost("save-store-consume-performance-stats")]
  1914 + public async Task<dynamic> SaveStoreConsumePerformanceStatistics([FromBody] SalaryStatisticsInput input)
  1915 + {
  1916 + if (input == null || string.IsNullOrEmpty(input.StatisticsMonth) || input.StatisticsMonth.Length != 6)
  1917 + {
  1918 + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式");
  1919 + }
  1920 +
  1921 + var statisticsMonth = input.StatisticsMonth;
  1922 +
  1923 + try
  1924 + {
  1925 + _logger.LogInformation($"开始统计门店耗卡业绩数据,月份:{statisticsMonth}");
  1926 +
  1927 + // 使用数据库聚合方式,直接在数据库中完成所有统计计算
  1928 + var sql = @"
  1929 + SELECT
  1930 + hyhk.md AS StoreId,
  1931 + mdxx.mdbm AS StoreCode,
  1932 + hyhk.mdmc AS StoreName,
  1933 + @statisticsMonth AS StatisticsMonth,
  1934 + COALESCE(SUM(pxmx.F_TotalPrice), 0) AS ConsumePerformance,
  1935 + COALESCE(SUM(pxmx.F_ProjectNumber), 0) AS ConsumeQuantity,
  1936 + COALESCE(SUM(hyhk.sgfy), 0) AS ManualFee
  1937 + FROM lq_xh_hyhk hyhk
  1938 + LEFT JOIN lq_xh_pxmx pxmx ON hyhk.F_Id = pxmx.F_ConsumeInfoId AND pxmx.F_IsEffective = 1
  1939 + LEFT JOIN lq_mdxx mdxx ON hyhk.md = mdxx.F_Id
  1940 + WHERE hyhk.F_IsEffective = 1
  1941 + AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
  1942 + GROUP BY hyhk.md, hyhk.mdmc, mdxx.mdbm
  1943 + HAVING ConsumePerformance > 0 OR ConsumeQuantity > 0 OR ManualFee > 0
  1944 + ORDER BY ConsumePerformance DESC";
  1945 +
  1946 + // 执行SQL查询
  1947 + var statisticsData = await _db.Ado.SqlQueryAsync<dynamic>(sql, new { statisticsMonth });
  1948 +
  1949 + if (!statisticsData.Any())
  1950 + {
  1951 + return new
  1952 + {
  1953 + Success = true,
  1954 + Message = $"未找到 {statisticsMonth} 月份的门店耗卡业绩统计数据",
  1955 + SavedCount = 0
  1956 + };
  1957 + }
  1958 +
  1959 + // 转换为实体对象
  1960 + var entities = statisticsData.Select(data => new LqStatisticsStoreConsumePerformanceEntity
  1961 + {
  1962 + Id = YitIdHelper.NextId().ToString(),
  1963 + StoreId = data.StoreId?.ToString() ?? "",
  1964 + StoreCode = data.StoreCode?.ToString() ?? "",
  1965 + StoreName = data.StoreName?.ToString() ?? "",
  1966 + StatisticsMonth = data.StatisticsMonth?.ToString() ?? statisticsMonth,
  1967 + ConsumePerformance = Convert.ToDecimal(data.ConsumePerformance ?? 0),
  1968 + ConsumeQuantity = Convert.ToDecimal(data.ConsumeQuantity ?? 0),
  1969 + ManualFee = Convert.ToDecimal(data.ManualFee ?? 0),
  1970 + CreateTime = DateTime.Now,
  1971 + UpdateTime = DateTime.Now
  1972 + }).ToList();
  1973 +
  1974 + // 使用事务确保数据一致性
  1975 + var result = await _db.Ado.UseTranAsync(async () =>
  1976 + {
  1977 + // 先删除该月份的历史数据
  1978 + await _db.Deleteable<LqStatisticsStoreConsumePerformanceEntity>()
  1979 + .Where(x => x.StatisticsMonth == statisticsMonth)
  1980 + .ExecuteCommandAsync();
  1981 +
  1982 + // 批量插入新数据
  1983 + return await _db.Insertable(entities).ExecuteCommandAsync();
  1984 + });
  1985 +
  1986 + var savedCount = result.IsSuccess ? result.Data : 0;
  1987 + _logger.LogInformation($"成功保存门店耗卡业绩统计数据 - 月份: {statisticsMonth}, 记录数: {savedCount}");
  1988 +
  1989 + return new
  1990 + {
  1991 + Success = true,
  1992 + Message = $"成功保存 {savedCount} 条门店耗卡业绩统计数据",
  1993 + SavedCount = savedCount,
  1994 + StatisticsMonth = statisticsMonth
  1995 + };
  1996 + }
  1997 + catch (Exception ex)
  1998 + {
  1999 + _logger.LogError(ex, $"保存门店耗卡业绩统计数据失败 - 月份: {statisticsMonth}");
  2000 + throw NCCException.Oh($"保存门店耗卡业绩统计数据失败: {ex.Message}");
  2001 + }
  2002 + }
  2003 +
  2004 + /// <summary>
  2005 + /// 查询门店耗卡业绩统计数据
  2006 + /// </summary>
  2007 + /// <remarks>
  2008 + /// 分页查询门店耗卡业绩统计数据,支持按门店、月份等条件筛选
  2009 + ///
  2010 + /// 示例请求:
  2011 + /// ```
  2012 + /// GET /api/Extend/LqStatistics/get-store-consume-performance-stats?currentPage=1&amp;pageSize=10&amp;statisticsMonth=202501
  2013 + /// ```
  2014 + ///
  2015 + /// 参数说明:
  2016 + /// - currentPage: 当前页码
  2017 + /// - pageSize: 每页大小
  2018 + /// - statisticsMonth: 统计月份筛选
  2019 + /// - storeId: 门店ID筛选
  2020 + /// - storeName: 门店名称筛选
  2021 + /// </remarks>
  2022 + /// <param name="input">查询参数</param>
  2023 + /// <returns>分页的门店耗卡业绩统计数据</returns>
  2024 + /// <response code="200">成功返回统计数据</response>
  2025 + /// <response code="400">参数错误</response>
  2026 + /// <response code="500">服务器错误</response>
  2027 + [HttpGet("get-store-consume-performance-stats")]
  2028 + public async Task<SqlSugarPagedList<LqStatisticsStoreConsumePerformanceEntity>> GetStoreConsumePerformanceStatistics([FromQuery] LqStatisticsStoreConsumePerformanceListQueryInput input)
  2029 + {
  2030 + try
  2031 + {
  2032 + var query = _db.Queryable<LqStatisticsStoreConsumePerformanceEntity>()
  2033 + .WhereIF(!string.IsNullOrEmpty(input.storeId), x => x.StoreId.Contains(input.storeId))
  2034 + .WhereIF(!string.IsNullOrEmpty(input.storeCode), x => x.StoreCode.Contains(input.storeCode))
  2035 + .WhereIF(!string.IsNullOrEmpty(input.storeName), x => x.StoreName.Contains(input.storeName))
  2036 + .WhereIF(!string.IsNullOrEmpty(input.statisticsMonth), x => x.StatisticsMonth == input.statisticsMonth)
  2037 + .WhereIF(!string.IsNullOrEmpty(input.startMonth), x => string.Compare(x.StatisticsMonth, input.startMonth) >= 0)
  2038 + .WhereIF(!string.IsNullOrEmpty(input.endMonth), x => string.Compare(x.StatisticsMonth, input.endMonth) <= 0)
  2039 + .OrderBy(x => x.StatisticsMonth, OrderByType.Desc)
  2040 + .OrderBy(x => x.StoreName, OrderByType.Asc);
  2041 +
  2042 + var result = await query.ToPagedListAsync(input.currentPage, input.pageSize);
  2043 + return result;
  2044 + }
  2045 + catch (Exception ex)
  2046 + {
  2047 + _logger.LogError(ex, "查询门店耗卡业绩统计数据失败");
  2048 + throw NCCException.Oh($"查询门店耗卡业绩统计数据失败: {ex.Message}");
  2049 + }
  2050 + }
  2051 +
  2052 + #endregion
  2053 +
  2054 + #region 个人消耗业绩统计
  2055 +
  2056 + /// <summary>
  2057 + /// 【5】保存个人消耗业绩统计数据
  2058 + /// </summary>
  2059 + /// <remarks>
  2060 + /// 统计健康师和科技部老师的消耗业绩数据
  2061 + ///
  2062 + /// 示例请求:
  2063 + /// ```json
  2064 + /// {
  2065 + /// "statisticsMonth": "202501"
  2066 + /// }
  2067 + /// ```
  2068 + ///
  2069 + /// 参数说明:
  2070 + /// - statisticsMonth: 统计月份(YYYYMM格式)
  2071 + /// </remarks>
  2072 + /// <param name="input">统计输入参数</param>
  2073 + /// <returns>保存结果</returns>
  2074 + /// <response code="200">成功保存个人消耗业绩统计数据</response>
  2075 + /// <response code="400">参数错误</response>
  2076 + /// <response code="500">服务器错误</response>
  2077 + [HttpPost("save-department-consume-performance-stats")]
  2078 + public async Task<dynamic> SaveDepartmentConsumePerformanceStatistics([FromBody] SalaryStatisticsInput input)
  2079 + {
  2080 + try
  2081 + {
  2082 + if (input == null || string.IsNullOrEmpty(input.StatisticsMonth) || input.StatisticsMonth.Length != 6)
  2083 + {
  2084 + throw NCCException.Oh("统计月份格式错误,请使用YYYYMM格式");
  2085 + }
  2086 +
  2087 + var statisticsMonth = input.StatisticsMonth;
  2088 + var allStatisticsData = new List<LqStatisticsDepartmentConsumePerformanceEntity>();
  2089 +
  2090 + // 1. 统计健康师消耗业绩
  2091 + var healthCoachSql = @"
  2092 + SELECT
  2093 + '健康师' as F_DepartmentType,
  2094 + jksyj.jkszh as F_UserId,
  2095 + jksyj.jkszh as F_UserCode,
  2096 + jksyj.jksxm as F_UserName,
  2097 + hyhk.md as F_StoreId,
  2098 + md.mdbm as F_StoreCode,
  2099 + md.dm as F_StoreName,
  2100 + @statisticsMonth as F_StatisticsMonth,
  2101 + COALESCE(SUM(jksyj.jksyj), 0) as F_ConsumePerformance,
  2102 + COALESCE(SUM(jksyj.F_kdpxNumber), 0) as F_ConsumeQuantity,
  2103 + COALESCE(SUM(jksyj.F_LaborCost), 0) as F_ManualFee
  2104 + FROM lq_xh_jksyj jksyj
  2105 + INNER JOIN lq_xh_hyhk hyhk ON jksyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
  2106 + LEFT JOIN lq_mdxx md ON hyhk.md = md.F_Id
  2107 + WHERE jksyj.F_IsEffective = 1
  2108 + AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
  2109 + GROUP BY jksyj.jkszh, jksyj.jksxm, hyhk.md, md.mdbm, md.dm";
  2110 +
  2111 + var healthCoachData = await _db.Ado.SqlQueryAsync<dynamic>(healthCoachSql, new { statisticsMonth });
  2112 + foreach (var item in healthCoachData)
  2113 + {
  2114 + allStatisticsData.Add(new LqStatisticsDepartmentConsumePerformanceEntity
  2115 + {
  2116 + Id = YitIdHelper.NextId().ToString(),
  2117 + DepartmentType = item.F_DepartmentType?.ToString(),
  2118 + UserId = item.F_UserId?.ToString(),
  2119 + UserCode = item.F_UserCode?.ToString(),
  2120 + UserName = item.F_UserName?.ToString(),
  2121 + StoreId = item.F_StoreId?.ToString(),
  2122 + StoreCode = item.F_StoreCode?.ToString(),
  2123 + StoreName = item.F_StoreName?.ToString(),
  2124 + StatisticsMonth = statisticsMonth,
  2125 + ConsumePerformance = Convert.ToDecimal(item.F_ConsumePerformance ?? 0),
  2126 + ConsumeQuantity = Convert.ToDecimal(item.F_ConsumeQuantity ?? 0),
  2127 + ManualFee = Convert.ToDecimal(item.F_ManualFee ?? 0),
  2128 + CreateTime = DateTime.Now
  2129 + });
  2130 + }
  2131 +
  2132 + // 2. 统计科技部老师消耗业绩
  2133 + var techTeacherSql = @"
  2134 + SELECT
  2135 + '科技部老师' as F_DepartmentType,
  2136 + kjbsyj.kjblszh as F_UserId,
  2137 + kjbsyj.kjblszh as F_UserCode,
  2138 + kjbsyj.kjblsxm as F_UserName,
  2139 + hyhk.md as F_StoreId,
  2140 + md.mdbm as F_StoreCode,
  2141 + md.dm as F_StoreName,
  2142 + @statisticsMonth as F_StatisticsMonth,
  2143 + COALESCE(SUM(kjbsyj.kjblsyj), 0) as F_ConsumePerformance,
  2144 + COALESCE(SUM(kjbsyj.F_hdpxNumber), 0) as F_ConsumeQuantity,
  2145 + COALESCE(SUM(kjbsyj.F_LaborCost), 0) as F_ManualFee
  2146 + FROM lq_xh_kjbsyj kjbsyj
  2147 + INNER JOIN lq_xh_hyhk hyhk ON kjbsyj.glkdbh = hyhk.F_Id AND hyhk.F_IsEffective = 1
  2148 + LEFT JOIN lq_mdxx md ON hyhk.md = md.F_Id
  2149 + WHERE kjbsyj.F_IsEffective = 1
  2150 + AND DATE_FORMAT(hyhk.hksj, '%Y%m') = @statisticsMonth
  2151 + GROUP BY kjbsyj.kjblszh, kjbsyj.kjblsxm, hyhk.md, md.mdbm, md.dm";
  2152 +
  2153 + var techTeacherData = await _db.Ado.SqlQueryAsync<dynamic>(techTeacherSql, new { statisticsMonth });
  2154 + foreach (var item in techTeacherData)
  2155 + {
  2156 + allStatisticsData.Add(new LqStatisticsDepartmentConsumePerformanceEntity
  2157 + {
  2158 + Id = YitIdHelper.NextId().ToString(),
  2159 + DepartmentType = item.F_DepartmentType?.ToString(),
  2160 + UserId = item.F_UserId?.ToString(),
  2161 + UserCode = item.F_UserCode?.ToString(),
  2162 + UserName = item.F_UserName?.ToString(),
  2163 + StoreId = item.F_StoreId?.ToString(),
  2164 + StoreCode = item.F_StoreCode?.ToString(),
  2165 + StoreName = item.F_StoreName?.ToString(),
  2166 + StatisticsMonth = statisticsMonth,
  2167 + ConsumePerformance = Convert.ToDecimal(item.F_ConsumePerformance ?? 0),
  2168 + ConsumeQuantity = Convert.ToDecimal(item.F_ConsumeQuantity ?? 0),
  2169 + ManualFee = Convert.ToDecimal(item.F_ManualFee ?? 0),
  2170 + CreateTime = DateTime.Now
  2171 + });
  2172 + }
  2173 +
  2174 + // 3. 使用事务保存数据
  2175 + var result = await _db.Ado.UseTranAsync(async () =>
  2176 + {
  2177 + // 删除当月已存在的数据
  2178 + await _db.Deleteable<LqStatisticsDepartmentConsumePerformanceEntity>()
  2179 + .Where(x => x.StatisticsMonth == statisticsMonth)
  2180 + .ExecuteCommandAsync();
  2181 +
  2182 + // 批量插入新数据
  2183 + if (allStatisticsData.Any())
  2184 + {
  2185 + await _db.Insertable(allStatisticsData).ExecuteCommandAsync();
  2186 + }
  2187 +
  2188 + return allStatisticsData.Count;
  2189 + });
  2190 +
  2191 + var savedCount = result.IsSuccess ? result.Data : 0;
  2192 +
  2193 + return new
  2194 + {
  2195 + Success = true,
  2196 + Message = $"成功保存 {savedCount} 条个人消耗业绩统计数据",
  2197 + SavedCount = savedCount,
  2198 + StatisticsMonth = statisticsMonth
  2199 + };
  2200 + }
  2201 + catch (Exception ex)
  2202 + {
  2203 + _logger.LogError(ex, "保存个人消耗业绩统计数据失败");
  2204 + throw NCCException.Oh($"保存个人消耗业绩统计数据失败: {ex.Message}");
  2205 + }
  2206 + }
  2207 +
1885 2208 /// <summary>
1886   - /// 部门信息
  2209 + /// 查询个人消耗业绩统计数据
1887 2210 /// </summary>
1888   - public class DepartmentInfo
  2211 + /// <remarks>
  2212 + /// 支持按部门类型、用户、门店、月份等条件查询个人消耗业绩统计数据
  2213 + ///
  2214 + /// 示例请求:
  2215 + /// ```
  2216 + /// GET /api/Extend/LqStatistics/get-department-consume-performance-stats?departmentType=健康师&amp;statisticsMonth=202501&amp;currentPage=1&amp;pageSize=10
  2217 + /// ```
  2218 + ///
  2219 + /// 参数说明:
  2220 + /// - departmentType: 部门类型(健康师, 科技部老师)
  2221 + /// - userId: 用户ID
  2222 + /// - userCode: 用户账号
  2223 + /// - userName: 用户姓名
  2224 + /// - storeId: 门店ID
  2225 + /// - storeCode: 门店编码
  2226 + /// - storeName: 门店名称
  2227 + /// - statisticsMonth: 统计月份(YYYYMM格式)
  2228 + /// - startMonth: 开始月份(YYYYMM格式)
  2229 + /// - endMonth: 结束月份(YYYYMM格式)
  2230 + /// - currentPage: 当前页码
  2231 + /// - pageSize: 每页大小
  2232 + /// </remarks>
  2233 + /// <param name="input">查询参数</param>
  2234 + /// <returns>分页查询结果</returns>
  2235 + /// <response code="200">查询成功</response>
  2236 + /// <response code="400">参数错误</response>
  2237 + /// <response code="500">服务器错误</response>
  2238 + [HttpGet("get-department-consume-performance-stats")]
  2239 + public async Task<SqlSugarPagedList<LqStatisticsDepartmentConsumePerformanceEntity>> GetDepartmentConsumePerformanceStatistics([FromQuery] LqStatisticsDepartmentConsumePerformanceListQueryInput input)
1889 2240 {
1890   - /// <summary>
1891   - /// 部门ID
1892   - /// </summary>
1893   - public string DepartmentId { get; set; }
1894   -
1895   - /// <summary>
1896   - /// 部门名称
1897   - /// </summary>
1898   - public string DepartmentName { get; set; }
1899   -
1900   - /// <summary>
1901   - /// 父部门ID
1902   - /// </summary>
1903   - public string ParentId { get; set; }
  2241 + try
  2242 + {
  2243 + var query = _db.Queryable<LqStatisticsDepartmentConsumePerformanceEntity>()
  2244 + .WhereIF(!string.IsNullOrEmpty(input.DepartmentType), x => x.DepartmentType.Contains(input.DepartmentType))
  2245 + .WhereIF(!string.IsNullOrEmpty(input.UserId), x => x.UserId.Contains(input.UserId))
  2246 + .WhereIF(!string.IsNullOrEmpty(input.UserCode), x => x.UserCode.Contains(input.UserCode))
  2247 + .WhereIF(!string.IsNullOrEmpty(input.UserName), x => x.UserName.Contains(input.UserName))
  2248 + .WhereIF(!string.IsNullOrEmpty(input.StoreId), x => x.StoreId.Contains(input.StoreId))
  2249 + .WhereIF(!string.IsNullOrEmpty(input.StoreCode), x => x.StoreCode.Contains(input.StoreCode))
  2250 + .WhereIF(!string.IsNullOrEmpty(input.StoreName), x => x.StoreName.Contains(input.StoreName))
  2251 + .WhereIF(!string.IsNullOrEmpty(input.StatisticsMonth), x => x.StatisticsMonth == input.StatisticsMonth)
  2252 + .WhereIF(!string.IsNullOrEmpty(input.StartMonth), x => string.Compare(x.StatisticsMonth, input.StartMonth) >= 0)
  2253 + .WhereIF(!string.IsNullOrEmpty(input.EndMonth), x => string.Compare(x.StatisticsMonth, input.EndMonth) <= 0)
  2254 + .OrderBy(x => x.StatisticsMonth, OrderByType.Desc)
  2255 + .OrderBy(x => x.DepartmentType, OrderByType.Asc)
  2256 + .OrderBy(x => x.UserName, OrderByType.Asc);
  2257 +
  2258 + var result = await query.ToPagedListAsync(input.currentPage, input.pageSize);
  2259 + return result;
  2260 + }
  2261 + catch (Exception ex)
  2262 + {
  2263 + _logger.LogError(ex, "查询个人消耗业绩统计数据失败");
  2264 + throw NCCException.Oh($"查询个人消耗业绩统计数据失败: {ex.Message}");
  2265 + }
1904 2266 }
1905 2267  
  2268 + #endregion
  2269 +
  2270 +
1906 2271 }
1907 2272 }
... ...
netcore/src/Modularity/Extend/NCC.Extend/LqXhHyhkService.cs
... ... @@ -128,9 +128,9 @@ namespace NCC.Extend.LqXhHyhk
128 128 memberId = pxmx.MemberId,
129 129 createTime = pxmx.CreateTIme,
130 130 projectNumber = pxmx.ProjectNumber,
131   - isEnabled = pxmx.IsEnabled,
132 131 sourceType = pxmx.SourceType,
133 132 totalPrice = pxmx.TotalPrice,
  133 + isEffective = pxmx.IsEffective,
134 134 };
135 135  
136 136 // 关联该品项的健康师业绩
... ... @@ -183,8 +183,9 @@ namespace NCC.Extend.LqXhHyhk
183 183 .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh))
184 184 .WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc))
185 185 .WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Equals(input.gklx))
186   - .WhereIF(!string.IsNullOrEmpty(input.xfje), p => p.Xfje.Contains(input.xfje))
187   - .WhereIF(!string.IsNullOrEmpty(input.sgfy), p => p.Sgfy.Contains(input.sgfy))
  186 + // 注意:xfje 和 sgfy 现在是 decimal 类型,不支持字符串模糊查询
  187 + // .WhereIF(!string.IsNullOrEmpty(input.xfje), p => SqlFunc.ToString(p.Xfje).Contains(input.xfje))
  188 + // .WhereIF(!string.IsNullOrEmpty(input.sgfy), p => SqlFunc.ToString(p.Sgfy).Contains(input.sgfy))
188 189 .WhereIF(!string.IsNullOrEmpty(input.sfykjb), p => p.Sfykjb.Equals(input.sfykjb))
189 190 .WhereIF(queryHksj != null, p => p.Hksj >= new DateTime(startHksj.ToDate().Year, startHksj.ToDate().Month, startHksj.ToDate().Day, 0, 0, 0))
190 191 .WhereIF(queryHksj != null, p => p.Hksj <= new DateTime(endHksj.ToDate().Year, endHksj.ToDate().Month, endHksj.ToDate().Day, 23, 59, 59))
... ... @@ -199,8 +200,8 @@ namespace NCC.Extend.LqXhHyhk
199 200 hyzh = it.Hyzh,
200 201 hymc = it.Hymc,
201 202 gklx = it.Gklx,
202   - xfje = it.Xfje,
203   - sgfy = it.Sgfy,
  203 + xfje = SqlFunc.ToString(it.Xfje),
  204 + sgfy = SqlFunc.ToString(it.Sgfy),
204 205 sfykjb = it.Sfykjb,
205 206 hksj = it.Hksj,
206 207 czry = it.Czry,
... ... @@ -285,7 +286,6 @@ namespace NCC.Extend.LqXhHyhk
285 286 BillingItemId = item.billingItemId,
286 287 CreateTIme = DateTime.Now,
287 288 MemberId = entity.Hy,
288   - IsEnabled = 0,
289 289 ProjectNumber = item.projectNumber ?? 1,
290 290 TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)),
291 291 Px = item.px,
... ... @@ -346,7 +346,18 @@ namespace NCC.Extend.LqXhHyhk
346 346 // 批量插入品项明细
347 347 if (allPxmxEntities.Any())
348 348 {
349   - await _db.Insertable(allPxmxEntities).ExecuteCommandAsync();
  349 + // 分别处理插入和更新
  350 + var existingEntities = allPxmxEntities.Where(e => !string.IsNullOrEmpty(e.Id)).ToList();
  351 + var newEntities = allPxmxEntities.Where(e => string.IsNullOrEmpty(e.Id)).ToList();
  352 +
  353 + if (existingEntities.Any())
  354 + {
  355 + await _db.Updateable(existingEntities).ExecuteCommandAsync();
  356 + }
  357 + if (newEntities.Any())
  358 + {
  359 + await _db.Insertable(newEntities).ExecuteCommandAsync();
  360 + }
350 361 }
351 362 // 批量插入健康师业绩
352 363 if (allJksyjEntities.Any())
... ... @@ -394,8 +405,6 @@ namespace NCC.Extend.LqXhHyhk
394 405 .WhereIF(!string.IsNullOrEmpty(input.hyzh), p => p.Hyzh.Contains(input.hyzh))
395 406 .WhereIF(!string.IsNullOrEmpty(input.hymc), p => p.Hymc.Contains(input.hymc))
396 407 .WhereIF(!string.IsNullOrEmpty(input.gklx), p => p.Gklx.Equals(input.gklx))
397   - .WhereIF(!string.IsNullOrEmpty(input.xfje), p => p.Xfje.Contains(input.xfje))
398   - .WhereIF(!string.IsNullOrEmpty(input.sgfy), p => p.Sgfy.Contains(input.sgfy))
399 408 .WhereIF(!string.IsNullOrEmpty(input.sfykjb), p => p.Sfykjb.Equals(input.sfykjb))
400 409 .WhereIF(queryHksj != null, p => p.Hksj >= new DateTime(startHksj.ToDate().Year, startHksj.ToDate().Month, startHksj.ToDate().Day, 0, 0, 0))
401 410 .WhereIF(queryHksj != null, p => p.Hksj <= new DateTime(endHksj.ToDate().Year, endHksj.ToDate().Month, endHksj.ToDate().Day, 23, 59, 59))
... ... @@ -410,8 +419,8 @@ namespace NCC.Extend.LqXhHyhk
410 419 hyzh = it.Hyzh,
411 420 hymc = it.Hymc,
412 421 gklx = it.Gklx,
413   - xfje = it.Xfje,
414   - sgfy = it.Sgfy,
  422 + xfje = SqlFunc.ToString(it.Xfje),
  423 + sgfy = SqlFunc.ToString(it.Sgfy),
415 424 sfykjb = it.Sfykjb,
416 425 hksj = it.Hksj,
417 426 czry = it.Czry,
... ... @@ -510,7 +519,7 @@ namespace NCC.Extend.LqXhHyhk
510 519  
511 520 #region 更新会员耗卡
512 521 /// <summary>
513   - /// 更新会员耗卡
  522 + /// 更新会员耗卡,不会删除品项明细,只会更新或新增
514 523 /// </summary>
515 524 /// <param name="id">主键</param>
516 525 /// <param name="input">参数</param>
... ... @@ -531,8 +540,8 @@ namespace NCC.Extend.LqXhHyhk
531 540 await _db.Deleteable<LqXhJksyjEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
532 541 await _db.Deleteable<LqXhKjbsyjEntity>().Where(u => u.Glkdbh == id).ExecuteCommandAsync();
533 542  
534   - //清空原有数据
535   - await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync();
  543 + // 注意:品项明细表不做删除操作,只更新或新增
  544 + // await _db.Deleteable<LqXhPxmxEntity>().Where(u => u.ConsumeInfoId == id).ExecuteCommandAsync();
536 545  
537 546 // 收集所有需要插入的实体,然后批量插入
538 547 var allPxmxEntities = new List<LqXhPxmxEntity>();
... ... @@ -544,22 +553,43 @@ namespace NCC.Extend.LqXhHyhk
544 553 {
545 554 foreach (var item in input.lqXhPxmxList)
546 555 {
547   - // 创建品项明细实体
548   - var lqXhPxmxEntity = new LqXhPxmxEntity
  556 + // 检查品项明细是否已存在
  557 + var existingPxmx = await _db.Queryable<LqXhPxmxEntity>()
  558 + .Where(p => p.Id == item.id)
  559 + .FirstAsync();
  560 +
  561 + LqXhPxmxEntity lqXhPxmxEntity;
  562 + if (existingPxmx != null)
549 563 {
550   - Id = YitIdHelper.NextId().ToString(),
551   - ConsumeInfoId = entity.Id,
552   - BillingItemId = item.billingItemId,
553   - CreateTIme = DateTime.Now,
554   - MemberId = entity.Hy,
555   - IsEnabled = 0,
556   - ProjectNumber = item.projectNumber ?? 1,
557   - TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)),
558   - Px = item.px,
559   - Pxmc = item.pxmc,
560   - Pxjg = item.pxjg,
561   - SourceType = item.sourceType,
562   - };
  564 + // 更新现有记录
  565 + lqXhPxmxEntity = existingPxmx;
  566 + // 注意:LqXhPxmxEntity 没有 UpdateTime 字段
  567 + lqXhPxmxEntity.MemberId = entity.Hy;
  568 + lqXhPxmxEntity.ProjectNumber = item.projectNumber ?? 1;
  569 + lqXhPxmxEntity.TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1));
  570 + lqXhPxmxEntity.Px = item.px;
  571 + lqXhPxmxEntity.Pxmc = item.pxmc;
  572 + lqXhPxmxEntity.Pxjg = item.pxjg;
  573 + lqXhPxmxEntity.SourceType = item.sourceType;
  574 + }
  575 + else
  576 + {
  577 + // 创建新记录
  578 + lqXhPxmxEntity = new LqXhPxmxEntity
  579 + {
  580 + Id = YitIdHelper.NextId().ToString(),
  581 + ConsumeInfoId = entity.Id,
  582 + BillingItemId = item.billingItemId,
  583 + CreateTIme = DateTime.Now,
  584 + MemberId = entity.Hy,
  585 + ProjectNumber = item.projectNumber ?? 1,
  586 + TotalPrice = (decimal)(item.pxjg * (item.projectNumber ?? 1)),
  587 + Px = item.px,
  588 + Pxmc = item.pxmc,
  589 + Pxjg = item.pxjg,
  590 + SourceType = item.sourceType,
  591 + };
  592 + }
563 593 allPxmxEntities.Add(lqXhPxmxEntity);
564 594  
565 595 // 收集该品项关联的健康师业绩
... ... @@ -614,7 +644,18 @@ namespace NCC.Extend.LqXhHyhk
614 644 // 批量插入品项明细
615 645 if (allPxmxEntities.Any())
616 646 {
617   - await _db.Insertable(allPxmxEntities).ExecuteCommandAsync();
  647 + // 分别处理插入和更新
  648 + var existingEntities = allPxmxEntities.Where(e => !string.IsNullOrEmpty(e.Id)).ToList();
  649 + var newEntities = allPxmxEntities.Where(e => string.IsNullOrEmpty(e.Id)).ToList();
  650 +
  651 + if (existingEntities.Any())
  652 + {
  653 + await _db.Updateable(existingEntities).ExecuteCommandAsync();
  654 + }
  655 + if (newEntities.Any())
  656 + {
  657 + await _db.Insertable(newEntities).ExecuteCommandAsync();
  658 + }
618 659 }
619 660 // 批量插入健康师业绩
620 661 if (allJksyjEntities.Any())
... ...