فهرست منبع

Merge branch 'develop' of http://16.162.42.175:8014/guanli/ngds into feature/2025-auto-withdraw

theo 3 سال پیش
والد
کامیت
9bc790c3ee

+ 9 - 9
backendApi/modules/v1/models/lists/bonus/FlowBonusList.php

@@ -99,15 +99,15 @@ class FlowBonusList extends \common\libs\dataList\DataList implements DataListIn
                         'tag' => ['type' => 'warning', 'size' => 'small', 'class' => 'no-border']
                     ],
                 ],
-                'LAST_EMP_LV_NAME' => [
-                    'header' => 'Rank',//聘级
-                    'headerOther' => [
-                        'width' => '130',
-                    ],
-                    'valueOther' => [
-                        'tag' => ['type' => 'warning', 'size' => 'small', 'class' => 'no-border']
-                    ],
-                ],
+//                'LAST_EMP_LV_NAME' => [
+//                    'header' => 'Rank',//聘级
+//                    'headerOther' => [
+//                        'width' => '130',
+//                    ],
+//                    'valueOther' => [
+//                        'tag' => ['type' => 'warning', 'size' => 'small', 'class' => 'no-border']
+//                    ],
+//                ],
 //                'LAST_STATUS_NAME' => [
 //                    'header' => '会员状态',
 //                    'headerOther' => ['width' => '110'],

+ 14 - 0
backendEle/src/App.vue

@@ -18,4 +18,18 @@ export default {
     padding: 0;
     background: #f4f6f8;
   }
+  .el-table__body-wrapper::-webkit-scrollbar {
+    width: 12px; /*滚动条宽度*/
+    height: 10px; /*滚动条高度*/
+  }
+  .el-table__body-wrapper::-webkit-scrollbar-track {
+    border-radius: 10px; /*滚动条的背景区域的圆角*/
+    -webkit-box-shadow: inset 0 0 15px rgba(238,238,238, 0.3);
+    background-color: #eeeeee; /*滚动条的背景颜色*/
+  }
+  .el-table__body-wrapper::-webkit-scrollbar-thumb {
+    border-radius: 10px; /*滚动条的圆角*/
+    -webkit-box-shadow: inset 0 0 15px rgba(145, 143, 0143, 0.3);
+    background-color: rgb(145, 143, 143); /*滚动条的背景颜色*/
+  }
 </style>

+ 1 - 1
backendEle/src/views/bonus/cf-lx-audit-list.vue

@@ -118,7 +118,7 @@
       handleMuli(command) {
         if (this.multipleSelection.length < 1) {
           this.$message({
-            message: '请选择要操作的记录',
+            message: 'Select the record to operate on', // '请选择要操作的记录',
             type: 'warning'
           })
           return;

+ 1 - 1
backendEle/src/views/bonus/resend-qy-audit-list.vue

@@ -98,7 +98,7 @@ export default {
     handleMuli(command) {
       if (this.multipleSelection.length < 1) {
         this.$message({
-          message: '请选择要操作的记录',
+          message: 'Select the record to operate on', // '请选择要操作的记录',
           type: 'warning'
         })
         return;

+ 19 - 1
backendEle/src/views/config/emp-level-edit.vue

@@ -1,7 +1,7 @@
 <template>
   <div v-loading="loading">
     <div class="white-box">
-      <el-form ref="form" :model="form" label-width="100px" style="width:500px;">
+      <el-form ref="form" :model="form" label-width="200px" style="width:500px;">
         <el-form-item label="级别名称">
           <el-input v-model="form.levelName" :disabled="true"></el-input>
         </el-form-item>
@@ -46,6 +46,18 @@
           </el-slider>
         </el-form-item>
 
+        <el-form-item label="推荐会员达标数" v-show="otherPerfShow">
+          <el-input-number v-model="form.achieveMemberNum" :min="1" :max="10"></el-input-number>
+        </el-form-item>
+
+        <el-form-item label="邀请会员数不足时达标业绩BV" v-show="otherPerfShow">
+          <el-input v-model="form.achievePv"></el-input>
+        </el-form-item>
+
+        <el-form-item label="邀请会员数满足时达标业绩BV" v-show="otherPerfShow">
+          <el-input v-model="form.achievePerfPv"></el-input>
+        </el-form-item>
+
         <el-form-item>
           <el-button type="primary" @click="onSubmit" :loading="submitButtonStat">保存</el-button>
         </el-form-item>
@@ -77,6 +89,9 @@ export default {
         this.form.iconNum = parseInt(response.ICON_NUM)
         this.form.otherDepartPerf = parseFloat(response.OTHER_DEPART_PERF)
         this.allEmployLevel = response.allLevel
+        this.form.achieveMemberNum = parseInt(response.ACHIEVE_MEMBER_NUM)
+        this.form.achievePv = parseInt(response.ACHIEVE_PV)
+        this.form.achievePerfPv = parseInt(response.ACHIEVE_PERF_PV)
         this.loading = false
         if ( response.SORT === '1' ) {
           this.otherPerfShow = true;
@@ -101,6 +116,9 @@ export default {
         iconType: 0,
         iconNum: 0,
         otherDepartPerf:0,
+        achieveMemberNum: 0,
+        achievePv: 0,
+        achievePerfPv: 0,
       },
       allEmployLevel: [],
       loading: true,

+ 1 - 1
backendEle/src/views/finance/perf-audit-list.vue

@@ -216,7 +216,7 @@
       handleMuli(command) {
         if (this.multipleSelection.length < 1) {
           this.$message({
-            message: '请选择要操作的记录',
+            message: 'Select the record to operate on', // '请选择要操作的记录',
             type: 'warning'
           })
           return;

+ 25 - 24
backendEle/src/views/finance/withdraw.vue

@@ -74,9 +74,9 @@
                   Return <!-- 设为提现退回 -->
                 </el-dropdown-item>
                 <el-dropdown-item command="status"
-                                  @click.native="handleStatusShow(scope.row, 7, '该会员已提供发票,请确认是否处理提现退回?', 'Note on withdrawal return')"
+                                  @click.native="handleStatusShow(scope.row, 7, 'The member has provided the invoice, please confirm whether to process the withdrawal return?', 'Note on withdrawal return')"
                                   v-show="(scope.row.AUDIT_STATUS === '1'||scope.row.AUDIT_STATUS === '2'||scope.row.AUDIT_STATUS === '3') && permission.hasPermission(`finance/withdraw-status`)"><!-- 提现退回备注 -->
-                  Return <!-- 设为提现退回 -->
+                  Return <!-- 该会员已提供发票,请确认是否处理提现退回 --> <!-- 设为提现退回 -->
                 </el-dropdown-item>
               </el-dropdown-menu>
             </el-dropdown>
@@ -95,26 +95,26 @@
             <el-dropdown-item command="7">Batch return</el-dropdown-item> <!-- 批量退回 -->
           </el-dropdown-menu>
           <el-dropdown-menu v-else-if="filterStatus==='2'" slot="dropdown">
-            <el-dropdown-item command="3">批量设为待付款</el-dropdown-item>
+            <el-dropdown-item command="3">Batch set to be paid</el-dropdown-item><!-- 批量设为待付款 -->
           </el-dropdown-menu>
           <el-dropdown-menu v-else-if="filterStatus==='3'" slot="dropdown">
-            <el-dropdown-item command="6">批量设为已付款</el-dropdown-item>
-            <el-dropdown-item command="7">批量退回</el-dropdown-item>
+            <el-dropdown-item command="6">Batch set paid</el-dropdown-item><!--批量设为已付款-->
+            <el-dropdown-item command="7">Batch return</el-dropdown-item><!--批量退回-->
           </el-dropdown-menu>
           <el-dropdown-menu v-else-if="filterStatus==='6'" slot="dropdown">
-            <el-dropdown-item command="4">批量设为付款失败</el-dropdown-item>
+            <el-dropdown-item command="4">Batch set payment failure</el-dropdown-item><!--批量设为付款失败-->
           </el-dropdown-menu>
           <el-dropdown-menu v-else-if="filterStatus==='4'" slot="dropdown">
-            <el-dropdown-item command="3">批量设为待付款</el-dropdown-item>
+            <el-dropdown-item command="3">Batch set to be paid</el-dropdown-item><!-- 批量设为待付款 -->
           </el-dropdown-menu>
         </el-dropdown>
 
         <el-button type="success" size="small" @click="handleExport"
                    v-show="permission.hasPermission(`finance/transfer-list-export`)">Export Excel
         </el-button>
-        <pagination :total="totalCount" :page_size="pageSize" @size-change="handleSizeChange"
+        <pagination :total="totalCount" :page_size="pageSize" :page_sizes="pageSizes" @size-change="handleSizeChange"
                     @current-change="handleCurrentChange"></pagination>
-        <el-dialog title="修改提现信息" :visible.sync="dialogEditFormVisible">
+        <el-dialog title="modify the withdrawal information" :visible.sync="dialogEditFormVisible">
           <el-form :model="form" label-width="150px" style="width:500px;" v-loading="dialogEditLoading">
             <el-form-item label="会员编号">
               <el-input v-model="form.baseInfo.USER_NAME" :disabled="true"></el-input>
@@ -134,7 +134,7 @@
             <el-form-item label="提现金额">
               <el-input v-model="form.amount" :disabled="true"></el-input>
             </el-form-item>
-            <el-form-item label="Estimated date of payment"> <!-- 预计付款日期 -->
+            <el-form-item label="Estimated date of payment" label-width="180"> <!-- 预计付款日期 -->
               <el-date-picker
                       v-model="form.planPaidAt"
                       type="date"
@@ -152,13 +152,13 @@
             <el-button @click="dialogEditFormVisible = false">Cancel<!-- 取 消 --></el-button>
             <el-button type="primary" @click.native="handleEdit">Edit<!-- 修 改 --></el-button>
           </div>
-        </el-dialog>
+        </el-dialog><!--修改提现信息-->
         <el-dialog title="Review withdrawal info" :visible.sync="dialogAuditFormVisible"> <!-- 审核提现信息 -->
           <el-alert
                   :title="auditForm.auditTips"
                   type="warning" :closable="false">
           </el-alert>
-          <el-form :model="auditForm" label-width="150px" style="width:500px;" v-loading="dialogAuditLoading">
+          <el-form :model="auditForm" label-width="180px" style="width:500px;" v-loading="dialogAuditLoading">
             <el-form-item label="Estimated date of payment" v-show="filterStatus==='2' || filterStatus==='4'"> <!-- 预计付款日期 -->
               <el-date-picker
                       v-model="auditForm.planPaidAt"
@@ -219,6 +219,7 @@ export default {
       totalPages: 1,
       totalCount: 1,
       pageSize: 20,
+      pageSizes:  [1, 2, 5, 10, 20, 50, 100],
       tool: tool,
       permission: permission,
       regTypes: baseInfo.regTypes(),
@@ -318,7 +319,7 @@ export default {
     handleMuli (command) {
       if (this.multipleSelection.length < 1) {
         this.$message({
-          message: '请选择要操作的记录',
+          message: 'Select the record to operate on', // 请选择要操作的记录
           type: 'warning'
         })
         return;
@@ -328,15 +329,15 @@ export default {
     handleAudit (row = null, status) {
       let title = ''
       if (status === '2') {
-        title = '确定要通过审核?备注:'
+        title = 'Be sure to pass the review?Note:'// 确定要通过审核?备注:
       }else if(status === '3') {
-        title = '确定要设为待付款?备注:'
+        title = 'Be sure to unpaid the review?Note:'// 确定要设为待付款?备注:
       }else if(status === '4') {
-        title = '确定要设为付款失败?备注:'
+        title = 'Be sure to payment failure the review?Note:'// 确定要设为付款失败?备注:
       }else if(status === '6') {
-        title = '确定要设为已付款?备注:'
+        title = 'Be sure to paid the review?Note:'// 确定要设为已付款?备注:
       }else if(status === '7') {
-        title = '确定要设为已退回?备注:'
+        title = 'Be sure to return the review?Note:'//确定要设为已退回?备注:
       }
       this.handleStatusShow(row,status,title);
     },
@@ -354,8 +355,8 @@ export default {
         filterData.selectedIds = selectedIds
       }
       this.$confirm('Are you sure you want to export the current data?', 'Hint', {
-        confirmButtonText: 'confirm', // 确定
-        cancelButtonText: 'cancel', // 取消
+        confirmButtonText: 'Confirm', // 确定
+        cancelButtonText: 'Cancel', // 取消
         type: 'warning'
       }).then(() => {
         return network.getData('finance/withdraw-export', filterData)
@@ -388,7 +389,7 @@ export default {
     handleEdit () {
       this.dialogEditFormVisible = false
       this.$message({
-        message: '正在修改数据',
+        message: 'Modifying data',//正在修改数据
         type: 'info'
       })
       this.loading = true
@@ -420,7 +421,7 @@ export default {
       }
       if (this.auditForm.selectedIds.length === 0) {
         this.$message({
-          message: '请选择数据',
+          message: 'Select the record to operate on',// 请选择数据
           type: 'warning'
         })
         return
@@ -434,8 +435,8 @@ export default {
       network.postData('finance/mult-point', {opType: 2}).then(response => {
         this.auditForm.withdrawAudit = response.withdrawAudit
         this.$confirm('Are you sure to change the state of the selected data?', 'Hint', { // 确定要对所选数据修改状态吗?
-          confirmButtonText: 'confirm', // 确定
-          cancelButtonText: 'cancel', // 取消
+          confirmButtonText: 'Confirm', // 确定
+          cancelButtonText: 'Cancel', // 取消
           type: 'warning'
         }).then(() => {
           return network.postData('finance/withdraw-status', this.auditForm)

+ 1 - 1
backendEle/src/views/reconsume/change-audit-list.vue

@@ -204,7 +204,7 @@
       handleMuli(command) {
         if (this.multipleSelection.length < 1) {
           this.$message({
-            message: '请选择要操作的记录',
+            message: 'Select the record to operate on', // '请选择要操作的记录',
             type: 'warning'
           })
           return;

+ 1 - 1
backendEle/src/views/user/reg-info-audit.vue

@@ -401,7 +401,7 @@
       handleMuli(command) {
         if (this.multipleSelection.length < 1) {
           this.$message({
-            message: '请选择要操作的记录',
+            message: 'Select the record to operate on', // '请选择要操作的记录',
             type: 'warning'
           })
           return;

+ 1 - 1
backendEle/src/views/user/status-audit-list.vue

@@ -158,7 +158,7 @@
       handleMuli(command) {
         if (this.multipleSelection.length < 1) {
           this.$message({
-            message: '请选择要操作的记录',
+            message: 'Select the record to operate on', // '请选择要操作的记录',
             type: 'warning'
           })
           return;

+ 79 - 27
common/helpers/bonus/BonusCalc.php

@@ -307,12 +307,12 @@ class BonusCalc extends BaseObject {
 
             $this->calcBonusVilla();
             $t22 = microtime(true);
-            echo('计算房奖' . ($this->_sysConfig['openVilla']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t22 - $t21, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL . PHP_EOL);
+            echo('计算房奖' . ($this->_sysConfig['openVilla']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t22 - $t21, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(69);
 
             $this->calcBonusGarage();
             $t23 = microtime(true);
-            echo('计算车奖' . ($this->_sysConfig['openGarage']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t23 - $t22, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL . PHP_EOL);
+            echo('计算车奖' . ($this->_sysConfig['openGarage']['VALUE'] ? '完成' : '关闭').',耗时:' . round($t23 - $t22, 3) . ',内存使用:' . (round(memory_get_usage() / 1024 / 1024, 3)) . 'MB' . PHP_EOL);
             $this->_updatePercent(69);
 
             // 计算季度奖
@@ -1258,15 +1258,15 @@ class BonusCalc extends BaseObject {
                 //扣除相应的复消积分和管理费
                 $deductData = $this->deduct($userId, $teamBonus);
 
-                // 把对碰后的奖金存入缓存中
-                CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $teamBonus, $deductData);
-
-                // TODO:取小腿值
+                // 取小腿值
                 $payLeg = min([$perfArr['SURPLUS_1L'], $perfArr['SURPLUS_2L']]);
                 // 计算荣衔星级
                 $starCrown = StarCrownLevel::getStarCrown($payLeg);
-                // 星级放入缓存
-                CalcCache::addUserStarCrown($userId, $periodNum, $starCrown['ID']);
+
+                // 是否活跃
+                $isActive = $this->_isPerfActive($userId);
+                $oriBonus = $isActive ? $teamBonus : 0;
+                $lastCrownLv = $isActive ? $starCrown['ID'] : StarCrownLevel::getDefaultLevelId();
 
                 //团队奖流水
                 $insertBonusData[] = [
@@ -1275,10 +1275,10 @@ class BonusCalc extends BaseObject {
                     'ORI_CAPPED_BONUS_QY' => $capBonusQy,
                     'LAST_DEC_LV' => $userBaseInfo['DEC_LV'],
                     'LAST_EMP_LV' => $userBaseInfo['EMP_LV'],
-                    'LAST_CROWN_LV' => $starCrown['ID'],
+                    'LAST_CROWN_LV' => $lastCrownLv,
                     'LAST_STATUS' => $userBaseInfo['STATUS'],
                     'AMOUNT' => $deductData['surplus'],
-                    'ORI_BONUS' => $teamBonus,
+                    'ORI_BONUS' => $oriBonus,
                     'RECONSUME_POINTS' => $deductData['reConsumePoints'],
                     'MANAGE_TAX' => $deductData['manageTax'],
                     'PERIOD_NUM' => $this->_periodNum,
@@ -1293,8 +1293,18 @@ class BonusCalc extends BaseObject {
                         'nowDecLevelConfig' => $nowDecLevelConfig,
                         'decLevel' => $userBaseInfo['DEC_LV'],
                     ]),
+                    'IS_ACTIVE' => (int)$isActive,
+                    'HOPE_CROWN_LV' => $starCrown['ID'],
+                    'HOPE_BONUS' => $teamBonus,
                 ];
 
+                // 星级放入缓存
+                CalcCache::addUserStarCrown($userId, $periodNum, $lastCrownLv);
+                if ($oriBonus > 0) {
+                    // 把对碰后的奖金存入缓存中
+                    CalcCache::bonus($userId, $periodNum, 'BONUS_QY', $oriBonus, $deductData);
+                }
+
                 unset($perfData, $pervSurplusPerf, $perfArr, $oriPerfArr, $touchPerfArr, $userBaseInfo, $decLevelConfig, $touchBonusArr, $userId, $nowDecLevelConfig, $teamBonus, $deductData);
             }
             CalcBonusQY::batchInsert($insertBonusData);
@@ -2097,19 +2107,35 @@ class BonusCalc extends BaseObject {
                 $manageTax = $deductData['manageTax']; // 管理费
                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
 
+                // 是否活跃会员
+                $isActive = $this->_isPerfActive($user['USER_ID']);
+                $oriBonus = $isActive ? $user['ORI_BONUS_MNT'] : 0;
+                $lastEmpLv = $isActive ? $user['LEVEL_ID'] : EmployLevel::getDefaultLevelId();
+
                 // 管理奖钻卡发放
 //                if (in_array($user['LAST_DEC_LV'], $minDecLevel)) {
+                if ($oriBonus > 0) {
                     // 把对碰后的奖金存入缓存中
-                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_MNT', $user['ORI_BONUS_MNT'], $deductData);
+                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_MNT', $oriBonus, $deductData);
                     // 加入月奖的会员
                     CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                }
 //                }
 
                 // 更新蓝星奖金存储过程的实发金额数据
-                CalcBonusBS::updateAll([
-                    'RECONSUME_POINTS' => $point,
-                    'AMOUNT_MNT' => $realBonusBs,
-                    'MANAGE_TAX_MNT' => $manageTax],
+                CalcBonusBS::updateAll(
+                    [
+                        'ORI_BONUS' => $user['ORI_BONUS'] + $oriBonus,
+                        'RECONSUME_POINTS' => $point,
+                        'AMOUNT_MNT' => $realBonusBs,
+                        'MANAGE_TAX_MNT' => $manageTax,
+                        'IS_ACTIVE' => (int)$isActive,
+                        'HOPE_BONUS' => $user['ORI_BONUS_MNT'] + $user['HOPE_BONUS_ABBR'],
+                        'HOPE_EMP_LV' => $user['LEVEL_ID'],
+                        'HOPE_BONUS_MNT' => $user['ORI_BONUS_MNT'],
+                        'ORI_BONUS_MNT' => $oriBonus,
+                        'LEVEL_ID' => $lastEmpLv,
+                    ],
                 'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM', 
                 [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
             }
@@ -2150,20 +2176,36 @@ class BonusCalc extends BaseObject {
                 $manageTax = $deductData['manageTax']; // 管理费
                 $point = $deductData['reConsumePoints'] + $user['RECONSUME_POINTS'];// 复消积分
 
+                // 是否活跃会员
+                $isActive = $this->_isPerfActive($user['USER_ID']);
+                $oriBonus = $isActive ? $user['ORI_BONUS_ABBR'] : 0;
+                $lastEmpLv = $isActive ? $user['LEVEL_ID'] : EmployLevel::getDefaultLevelId();
+
                 // 业绩奖金卡、钻卡发放
 //                if (in_array($user['LAST_DEC_LV'], $minDecLevel)) {
                     // 把对碰后的奖金存入缓存中
-                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_ABBR', $user['ORI_BONUS_ABBR'], $deductData);
-                    // 加入月奖的会员
-                    CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                    CalcCache::bonus($user['USER_ID'], $this->_periodNum, 'BONUS_BS_ABBR', $oriBonus, $deductData);
+                    if ($oriBonus > 0) {
+                        // 加入月奖的会员
+                        CalcCache::addHasMonthBonusUsers($user['USER_ID'], $this->_periodNum);
+                    }
 //                }
 
                 // 更新蓝星业绩奖金存储过程的实发金额数据
-                CalcBonusBS::updateAll([
-                    'AMOUNT_ABBR' => $realBonusBs,
-                    'MANAGE_TAX_ABBR' => $manageTax,
-                    'RECONSUME_POINTS' => $point],
-            'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
+                CalcBonusBS::updateAll(
+                    [
+                        'ORI_BONUS' => $oriBonus,
+                        'AMOUNT_ABBR' => $realBonusBs,
+                        'MANAGE_TAX_ABBR' => $manageTax,
+                        'RECONSUME_POINTS' => $point,
+                        'IS_ACTIVE' => (int)$isActive,
+                        'HOPE_BONUS' => $user['ORI_BONUS_ABBR'],
+                        'HOPE_EMP_LV' => $user['LEVEL_ID'],
+                        'HOPE_BONUS_ABBR' => $user['ORI_BONUS_ABBR'],
+                        'ORI_BONUS_ABBR' => $oriBonus,
+                        'LEVEL_ID' => $lastEmpLv,
+                    ],
+        'USER_ID=:USER_ID AND PERIOD_NUM=:PERIOD_NUM',
                     [':USER_ID' => $user['USER_ID'], ':PERIOD_NUM' => $this->_periodNum]);
             }
             return $this->calcBonusBsYJ($offset + $this->_limit);
@@ -4079,16 +4121,26 @@ class BonusCalc extends BaseObject {
     // 判断是否满足月最低消费
     public function _isMonthPerfLimit($userId) {
         $userMonthTotal = PerfMonth::find()->where(
-            'USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH', 
+            'USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH',
             ['USER_ID'=>$userId, 'CALC_MONTH'=>$this->_calcYearMonth]
         )
-        ->asArray()
-        ->one();
+            ->asArray()
+            ->one();
         $fxPvStatus = false;
         if (isset($userMonthTotal['PV_PCS']) && $userMonthTotal['PV_PCS'] >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE']) {
             $fxPvStatus = true;
         }
-        
+
         return $fxPvStatus;
     }
+
+    // 判断会员是否活跃
+    public function _isPerfActive($userId): bool
+    {
+        $pv = PerfPeriod::find()->where('USER_ID=:USER_ID AND CALC_MONTH=:CALC_MONTH AND PERIOD_NUM<=:PERIOD_NUM',
+            ['USER_ID'=>$userId, 'CALC_MONTH'=>$this->_calcYearMonth, 'PERIOD_NUM'=>$this->_periodNum])
+            ->SUM('PV_PCS');
+
+        return $pv >= $this->_sysConfig['monthPcsPvFxCondition']['VALUE'];
+    }
 }

+ 5 - 3
common/helpers/user/Balance.php

@@ -269,8 +269,9 @@ class Balance {
             $periodNum = $params['PERIOD_NUM'];
         }
         $calcYearMonth = $period->getYearMonth($periodNum);
-        // 汇率
-        $exchangeRate = floatval(Cache::getSystemConfig()['exchangeRate']['VALUE'] ?? 0);
+        // TODO: 汇率
+//        $exchangeRate = floatval(Cache::getSystemConfig()['exchangeRate']['VALUE'] ?? 0);
+        $exchangeRate = 1;
         // redis加锁(防止并发余额数值不准确出错)
         switch ($type) {
             case 'BONUS':
@@ -435,9 +436,10 @@ class Balance {
             } else {
                 $paramData = [
                     'USER_ID'=>$userId,
-                    $type=>$amount,
+                    $type=>$issueBonus ? $amount * $exchangeRate : $amount,
                     'CREATED_AT'=>Date::nowTime()
                 ];
+
                 if (isset($params['QY'])) {
 //                    $paramData['QY_TOTAL'] = new Expression('QY_TOTAL + '.$params['QY']);
                     $paramData['QY_TOTAL'] =  ($issueBonus ? $params['QY'] * $exchangeRate : $params['QY']);

+ 3 - 0
common/models/CalcBonusBS.php

@@ -24,6 +24,9 @@ use Yii;
  * @property string $LOGS 日志
  * @property $ORI_BONUS 原奖金
  * @property $MANAGE_TAX 管理费
+ * @property int $IS_ACTIVE 是否活跃
+ * @property string $HOPE_CROWN_LV 应有starCrown级别
+ * @property string $HOPE_BONUS 应得奖金
  */
 class CalcBonusBS extends \common\components\ActiveRecord
 {

+ 3 - 0
common/models/CalcBonusQY.php

@@ -21,6 +21,9 @@ use Yii;
  * @property $ORI_BONUS 原奖金
  * @property $RECONSUME_POINTS 重复消费积分
  * @property $MANAGE_TAX 管理费
+ * @property int $IS_ACTIVE 是否活跃
+ * @property string $HOPE_CROWN_LV 应有starCrown级别
+ * @property string $HOPE_BONUS 应得奖金
  */
 class CalcBonusQY extends \common\components\ActiveRecord
 {

+ 3 - 0
common/models/EmployLevel.php

@@ -34,6 +34,9 @@ use yii\helpers\Json;
  * @property string $UPGRADE_SCORE 升级分数
  * @property string $TOURISM_PERCENT 旅游奖比例
  * @property string $GARAGE_PERCENT 车房奖比例
+ * @property int $ACHIEVE_MEMBER_NUM 推荐会员达标数
+ * @property string $ACHIEVE_PV 邀请会员数不足时达标业绩PV
+ * @property string $ACHIEVE_PERF_PV 邀请会员数满足时达标业绩PV
  */
 class EmployLevel extends \common\components\ActiveRecord
 {

+ 1 - 1
common/models/Withdraw.php

@@ -134,7 +134,7 @@ class Withdraw extends \common\components\ActiveRecord {
             'CREATED_AT' => '创建时间',
             'UPDATED_AT' => '修改时间',
             'AUDITED_AT' => '审核时间',
-            'PLAN_PAID_AT' => '预计付款时间',
+            'PLAN_PAID_AT' => 'Estimated time of payment',  // 预计付款时间
             'PAID_AT' => '付款时间',
             'PAID_FAIL_REMARK' => '付款失败备注',
             'PAID_FAIL_AT' => '付款失败时间',

+ 7 - 1
common/models/forms/EmployLevelForm.php

@@ -24,6 +24,9 @@ class EmployLevelForm extends Model {
     public $iconType;               // 等级排序
     public $iconNum;               // 等级排序
     public $otherDepartPerf;       // 其它部门的累计推荐业绩
+    public $achieveMemberNum;   // 当月邀请会员数
+    public $achievePv;          // 邀请会员数不及格后获奖BV值
+    public $achievePerfPv;      // 邀请会员数及格后获奖BV值
 
     public function init() {
         parent::init();
@@ -37,7 +40,7 @@ class EmployLevelForm extends Model {
      */
     public function rules() {
         return [
-            [['id', 'levelName', 'locationNum', 'locationPerf', 'newPerf', 'minEmployLevel', 'sort', 'iconType', 'iconNum', 'otherDepartPerf'], 'trim', 'on' => ['add', 'edit']],
+            [['id', 'levelName', 'locationNum', 'locationPerf', 'newPerf', 'minEmployLevel', 'sort', 'iconType', 'iconNum', 'otherDepartPerf', 'achieveMemberNum', 'achievePv', 'achievePerfPv'], 'trim', 'on' => ['add', 'edit']],
             [['id'], 'required', 'on' => 'edit'],
             [['id'], 'exist', 'targetClass' => EmployLevel::class, 'targetAttribute' => 'ID'],
             [['levelName', 'locationNum', 'locationPerf', 'newPerf', 'sort'], 'required'],
@@ -97,6 +100,9 @@ class EmployLevelForm extends Model {
         $model->ICON_TYPE = $this->iconType;
         $model->ICON_NUM = $this->iconNum;
         $model->OTHER_DEPART_PERF = $this->otherDepartPerf;
+        $model->ACHIEVE_MEMBER_NUM = $this->achieveMemberNum ?? 0;
+        $model->ACHIEVE_PV = $this->achievePv ?? 0;
+        $model->ACHIEVE_PERF_PV = $this->achievePerfPv ?? 0;
         if ($model->save()) {
             return $model;
         } else {

+ 1 - 1
frontendApi/config/menu.php

@@ -83,7 +83,7 @@ return [
            // ['name'=>'房产积分', 'class'=>'', 'icon'=>'', 'controller'=>'bonus', 'action'=>'fc-point', 'routePath'=>'bonus/fc-point', 'show'=>1,],
 //            ['name'=>'报单中心补助明细查询', 'class'=>'', 'icon'=>'', 'controller'=>'bonus', 'action'=>'flow-bt', 'routePath'=>'bonus/flow-bt', 'show'=>1,],
 //            ['name'=>'报单中心货补追溯', 'class'=>'', 'icon'=>'', 'controller'=>'bonus', 'action'=>'trace-fl', 'routePath'=>'bonus/trace-fl', 'show'=>1,],
-            ['name'=>'Withdrawal details', 'class'=>'', 'icon'=>'', 'controller'=>'finance', 'action'=>'withdraw', 'routePath'=>'finance/withdraw', 'show'=>1,],//提现明细
+            ['name'=>'Withdrawal details', 'class'=>'', 'icon'=>'', 'controller'=>'finance', 'action'=>'withdraw', 'routePath'=>'finance/withdraw', 'show'=>0,],//提现明细
             ['name'=>'申请提现', 'class'=>'', 'icon'=>'', 'controller'=>'finance', 'action'=>'withdraw-add', 'routePath'=>'finance/withdraw-add', 'show'=>0,],
             ['name'=>'Recharge details', 'class'=>'', 'icon'=>'', 'controller'=>'finance', 'action'=>'recharge', 'routePath'=>'finance/recharge', 'show'=>1,],//充值明细
             ['name'=>'Apply for recharge', 'class'=>'', 'icon'=>'', 'controller'=>'finance', 'action'=>'recharge-add', 'routePath'=>'finance/recharge-add', 'show'=>0,], // 申请充值

+ 1 - 1
frontendApi/modules/v1/controllers/DashboardController.php

@@ -123,7 +123,7 @@ class DashboardController extends BaseController
             'slides'=>Ad::findUseSlaves()->select('ID,IMAGE,LID,TITLE,CONTENT,TYPE')->where('LID=:LID AND STATUS=1', [':LID'=>'7EFF6260A16C3CC7E053693418AC03E4'])->orderBy('SORT ASC')->asArray()->all(),
             'news'=>$news,
 //            'periodNum'=>'Period '.$periodNum.' ,'.$curYM['CALC_MONTH'].'月第'.$wkrd.'周,共'.$weeks.'周',
-            'periodNum'=>$periodNum.' ,'.$wkrd.' period  of '. $monthArray[$curYM['CALC_MONTH']],
+            'periodNum'=>$periodNum.' ,'.$wkrd.' PC of '. $monthArray[$curYM['CALC_MONTH']],
             'myRemainPv'=>$totalRemainPv,
             'activeEnd'=>$activeEnd
         ]);

+ 14 - 0
frontendEle/src/App.vue

@@ -18,4 +18,18 @@ export default {
     padding: 0;
     background: #f4f6f8;
   }
+  .el-table__body-wrapper::-webkit-scrollbar {
+    width: 12px; /*滚动条宽度*/
+    height: 10px; /*滚动条高度*/
+  }
+  .el-table__body-wrapper::-webkit-scrollbar-track {
+    border-radius: 10px; /*滚动条的背景区域的圆角*/
+    -webkit-box-shadow: inset 0 0 15px rgba(238,238,238, 0.3);
+    background-color: #eeeeee; /*滚动条的背景颜色*/
+  }
+  .el-table__body-wrapper::-webkit-scrollbar-thumb {
+    border-radius: 10px; /*滚动条的圆角*/
+    -webkit-box-shadow: inset 0 0 15px rgba(145, 143, 0143, 0.3);
+    background-color: rgb(145, 143, 143); /*滚动条的背景颜色*/
+  }
 </style>

+ 1 - 1
frontendEle/src/views/dashboard/index.vue

@@ -17,7 +17,7 @@
                   :key="key" v-if="myEmpLv['ICON_TYPE']>0">-->
               </el-col><!--聘级-->
               <el-col :xs="24" :sm="24" :md="24" :lg="4" :xl="12">Member Level:{{decLvName}}</el-col><!--会员级别-->
-              <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="12">Current Period:{{periodNum}}</el-col><!--当前业绩期-->
+              <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="12">Current Pay Cycle:{{periodNum}}</el-col><!--当前业绩期-->
               <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="12">Remain BV:{{myRemainPv}}</el-col><!--剩余的PV-->
               <el-col :xs="24" :sm="24" :md="24" :lg="8" :xl="12">Active Deadline Date:{{activeEnd}}</el-col><!--活跃日期截止-->
             </el-row>

+ 522 - 0
sql/upgrade/1988.sql

@@ -0,0 +1,522 @@
+-- 总监级别表增加推荐会员相关属性
+ALTER TABLE `AR_EMPLOY_LEVEL` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数' AFTER `ACHIEVE_PV`;
+ALTER TABLE `AR_EMPLOY_LEVEL` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV' AFTER `ACHIEVE_MEMBER_NUM`;
+
+UPDATE `AR_EMPLOY_LEVEL` SET `ACHIEVE_MEMBER_NUM` = 3, `ACHIEVE_PERF_PV` = 1000 WHERE ID = 'E121497617216708615';
+
+-- 蓝星管理奖增加推荐会员相关属性
+ALTER TABLE `AR_BS_BONUS_103_CALC` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_BS_BONUS_103_CALC` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+ALTER TABLE `AR_BS_BONUS_103_TEST` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_BS_BONUS_103_TEST` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `ACHIEVE_MEMBER_NUM` INT NOT NULL DEFAULT '0' COMMENT '推荐会员达标数';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `ACHIEVE_PERF_PV` decimal(10, 2) NOT NULL DEFAULT '0.00' COMMENT '推荐会员及格后晋级达标业绩PV';
+
+
+
+-- 蓝星管理奖存储过程修改
+CREATE DEFINER=`black_tea_0309`@`%` PROCEDURE `CALCINIT`(IN `PCPID` INT, IN `PCALCMONTH` TINYINT, IN `PCALCYEAR` INT)
+BEGIN
+
+    DECLARE
+        AC_USER_NO INT;     -- 邀请会员达标数
+    DECLARE
+        MLIMITPV,   -- 邀请会员不及格达标PV
+        AC_PERF_PV DECIMAL ( 10, 2 );   -- 邀请会员及格达标PV
+
+    -- 查询第一个级别的邀请会员数、达标PV值以及等奖比例
+    SELECT
+        T.ACHIEVE_PV,
+        T.ACHIEVE_PERF_PV,
+        T.ACHIEVE_MEMBER_NUM
+    INTO MLIMITPV, AC_PERF_PV, AC_USER_NO
+    FROM
+        AR_EMPLOY_LEVEL T
+    WHERE
+        T.ID = 'E121497617216708615';
+
+    INSERT INTO AR_BS_BONUS_103_CALC (
+        LAST_DEC_LV,
+        LAST_EMP_LV,
+        LAST_STATUS,
+        USER_ID,
+        INTRODUCER_ID,
+        LAYER,
+        PV,
+        GPV10,
+        GPV,
+        GPV_4_CALC,
+        USER_TYPE10,
+        USER_TYPE,
+        BONUS10,
+        BONUS20,
+        BONUS30,
+        BONUS40,
+        BONUS50,
+        BONUS60,
+        BONUS70,
+        BONUS80,
+        BONUS90,
+        BONUS100,
+        BONUS110,
+        BONUS,
+        PRODUCT_POINT,
+        CALC_PERIOD_ID,
+        ACHIEVE_MEMBER_NUM,
+        ACHIEVE_PERF_PV
+    ) SELECT
+          AU.LAST_DEC_LV,
+          AU.EMP_LV,
+          AU.STATUS,
+          AU.ID,
+          IFNULL( AURN.PARENT_UID, 0 ),
+          AURN.TOP_DEEP,
+          IFNULL( AO.PV, 0 ),
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          0,
+          PCPID,
+          IFNULL(DO.ACHIEVE_MEMBER_NUM, 0) AS ACHIEVE_NUM,
+          IF(DO.ACHIEVE_MEMBER_NUM >= AC_USER_NO, AC_PERF_PV, MLIMITPV) AS ACHIEVE_PV
+    FROM
+        AR_USER AU
+    INNER JOIN AR_USER_RELATION_NEW AURN ON AU.ID = AURN.USER_ID
+    LEFT JOIN (
+        SELECT
+            USER_ID,
+            SUM( PV ) PV
+        FROM
+            AR_PERF_ORDER
+        WHERE
+                PERIOD_NUM IN ( SELECT PERIOD_NUM FROM AR_PERIOD WHERE CALC_YEAR = PCALCYEAR AND CALC_MONTH = PCALCMONTH )
+        GROUP BY
+            USER_ID
+    ) AO ON AO.USER_ID = AU.ID
+    LEFT JOIN (
+        SELECT
+            R.PARENT_UID,
+            COUNT(O.USER_ID) AS ACHIEVE_MEMBER_NUM,
+            GROUP_CONCAT(CONCAT(O.USER_ID, '_', U.USER_NAME, '_', O.PERIOD_NUM) separator ' | ') AS ACHIEVE_MEMBER
+        FROM
+            AR_PERF_ORDER O
+                INNER JOIN AR_USER_RELATION_NEW R ON O.USER_ID = R.USER_ID
+                INNER JOIN AR_USER U ON O.USER_ID = U.ID
+        WHERE
+                O.CALC_MONTH = PCALCMONTH AND O.DEC_TYPE = 'ZC'
+        GROUP BY R.PARENT_UID
+    ) DO ON DO.PARENT_UID = AU.ID
+    WHERE
+            AU.DELETED = 0;
+
+END
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` PROCEDURE `CALC10`(IN `PCPID` INT)
+BEGIN
+    DECLARE
+        MLAYER,
+        MMAXLAYER INT;
+    DECLARE
+        MRATE,
+        MLIMITPV DECIMAL ( 10, 2 );-- 查询第一个级别的限制以及等奖比例
+    SELECT
+        T.ACHIEVE_PV,
+        T.BS_PERCENT / 100 INTO MLIMITPV,
+        MRATE
+    FROM
+        AR_EMPLOY_LEVEL T
+    WHERE
+            T.ID = 'E121497617216708615';
+    SELECT
+        MAX( LAYER ) INTO MLAYER
+    FROM
+        AR_BS_BONUS_103_CALC
+    WHERE
+            PV > 0;
+
+    SET MMAXLAYER := MLAYER;
+    WHILE
+            MLAYER >= 0 DO
+            IF
+                ( MLAYER < MMAXLAYER ) THEN-- 向上累计
+                UPDATE AR_BS_BONUS_103_CALC T1
+                    INNER JOIN (
+                        SELECT
+                            INTRODUCER_ID,
+                            SUM( GPV10 ) GPV10
+                        FROM
+                            AR_BS_BONUS_103_CALC
+                        WHERE
+                                LAYER = MLAYER + 1
+                          AND USER_TYPE10 = 0
+                          AND GPV10 > 0
+                        GROUP BY
+                            INTRODUCER_ID
+                    ) T2 ON T1.USER_ID = T2.INTRODUCER_ID
+                        AND T1.LAYER = MLAYER
+                SET T1.GPV10 = T2.GPV10;-- 没有升级的会员需要将自己的小组业绩清零
+                UPDATE AR_BS_BONUS_103_CALC T
+                SET T.GPV10 = 0
+                WHERE
+                        T.GPV10 < T.ACHIEVE_PERF_PV AND T.LAYER = MLAYER + 1 AND USER_TYPE10 = 0 AND T.GPV10 > 0;
+
+            END IF;
+            UPDATE AR_BS_BONUS_103_CALC T1
+            SET T1.GPV10 = T1.GPV10 + T1.PV
+            WHERE
+                    T1.LAYER = MLAYER
+              AND T1.PV > 0;-- 是否达标 如果达标
+            UPDATE AR_BS_BONUS_103_CALC T
+            SET T.USER_TYPE10 = 10
+            WHERE
+                    T.GPV10 >= T.ACHIEVE_PERF_PV
+              AND T.LAYER = MLAYER
+              AND T.USER_TYPE10 = 0;
+            IF
+                ( MLAYER > 0 ) THEN-- 升级为蓝星A
+                CALL CALCUPGARDE ( MLAYER );
+
+            END IF;
+
+            SET MLAYER := MLAYER - 1;
+
+        END WHILE;
+    UPDATE AR_BS_BONUS_103_CALC T
+    SET T.BONUS10 = T.GPV10 * MRATE
+    WHERE
+            T.USER_TYPE10 = 10
+      AND T.GPV10 > 0;
+    UPDATE AR_BS_BONUS_103_CALC
+    SET USER_TYPE = 0;
+
+    INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, ORI_BONUS, PV, RATE,PERIOD_NUM )
+    SELECT USER_ID, NULL, 10, GPV10 * MRATE, GPV10, MRATE ,PCPID FROM AR_BS_BONUS_103_CALC WHERE USER_TYPE10 = 10
+                                                                                             AND GPV10 > 0;
+END
+
+
+
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` PROCEDURE `CALC20`(IN `PCPID` INT)
+BEGIN
+    DECLARE
+        MLAYER,
+        MMAXLAYER,
+        MCOUNT INT;
+    DECLARE
+        MRATE,
+        MLIMITPV DECIMAL ( 10, 2 );
+    START TRANSACTION;-- 第一个级别的限制
+    SELECT
+        T.ACHIEVE_PV INTO MLIMITPV
+    FROM
+        AR_EMPLOY_LEVEL T
+    WHERE
+            T.ID = 'E121497617216708615';-- 第二个级别得奖的比例
+    SELECT
+            T.BS_PERCENT / 100 INTO MRATE
+    FROM
+        AR_EMPLOY_LEVEL T
+    WHERE
+            T.ID = '67BE5FE7857C216AE055736AECE8644D';
+    SELECT
+        MAX( LAYER ) INTO MLAYER
+    FROM
+        AR_BS_BONUS_103_CALC
+    WHERE
+            PV > 0;
+
+    SET MMAXLAYER := MLAYER;
+    WHILE
+            MLAYER >= 0 DO
+            IF
+                ( MLAYER < MMAXLAYER ) THEN-- 向上累计
+                UPDATE AR_BS_BONUS_103_CALC T1
+                    INNER JOIN (
+                        SELECT
+                            INTRODUCER_ID,
+                            SUM( GPV ) GPV
+                        FROM
+                            AR_BS_BONUS_103_CALC
+                        WHERE
+                                LAYER = MLAYER + 1
+                          AND USER_TYPE = 0
+                          AND GPV > 0
+                        GROUP BY
+                            INTRODUCER_ID
+                    ) T2 ON T1.USER_ID = T2.INTRODUCER_ID
+                        AND T1.LAYER = MLAYER
+                SET T1.GPV = T2.GPV;-- 没有升级的会员需要将自己的小组业绩清零
+                UPDATE AR_BS_BONUS_103_CALC T
+                SET T.GPV = 0
+                WHERE
+                        T.GPV < T.ACHIEVE_PERF_PV AND T.LAYER = MLAYER + 1 AND GPV > 0;
+
+            END IF;
+            UPDATE AR_BS_BONUS_103_CALC T1
+            SET T1.GPV = T1.GPV + T1.PV
+            WHERE
+                    T1.LAYER = MLAYER;-- 是否达标 如果达标
+            UPDATE AR_BS_BONUS_103_CALC T
+            SET T.USER_TYPE = 10
+            WHERE
+                    T.GPV >= T.ACHIEVE_PERF_PV
+              AND T.LAYER = MLAYER;
+
+            SET MLAYER := MLAYER - 1;
+
+        END WHILE;
+    UPDATE AR_BS_BONUS_103_CALC
+    SET GPV = 0
+    WHERE
+            USER_TYPE = 0
+      AND GPV > 0;
+    SELECT
+        MAX( LAYER ) INTO MLAYER
+    FROM
+        AR_BS_BONUS_103_CALC
+    WHERE
+            USER_TYPE > 0;
+
+    SET MMAXLAYER := MLAYER;-- 添加至新网体页面
+    INSERT INTO AR_BS_BONUS_103_CALC_NET ( USER_ID, INTRODUCER_ID, CALC_PERIOD_ID, USER_TYPE, GPV, DIRECTLY_UNDER, LAYER, TEAM_GPV ) SELECT
+                                                                                                                                         USER_ID,
+                                                                                                                                         INTRODUCER_ID,
+                                                                                                                                         CALC_PERIOD_ID,
+                                                                                                                                         USER_TYPE,
+                                                                                                                                         GPV,
+                                                                                                                                         0,
+                                                                                                                                         LAYER,
+                                                                                                                                         0
+    FROM
+        AR_BS_BONUS_103_CALC
+    WHERE
+            LAYER <= MLAYER; -- 处理新的网体
+    DELETE FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = MLAYER AND USER_TYPE = 0; SET MLAYER := MLAYER - 1; WHILE MLAYER >= 0 DO-- 计算直属宽度
+    UPDATE AR_BS_BONUS_103_CALC_NET T1
+        INNER JOIN ( SELECT INTRODUCER_ID, COUNT( * ) SONS FROM AR_BS_BONUS_103_CALC_NET WHERE LAYER = MLAYER + 1 GROUP BY INTRODUCER_ID ) T2 ON T1.USER_ID = T2.INTRODUCER_ID
+            AND T1.LAYER = MLAYER
+    SET T1.DIRECTLY_UNDER = T2.SONS;-- 本人达标并且下属满足一个及以上的达标数升级为第二个级别
+    UPDATE AR_BS_BONUS_103_CALC_NET T1
+    SET T1.USER_TYPE = 20
+    WHERE
+            T1.LAYER = MLAYER
+      AND USER_TYPE = 10
+      AND DIRECTLY_UNDER >= 1;-- 计算本层达标人员
+    SELECT
+        COUNT( * ) INTO MCOUNT
+    FROM
+        AR_BS_BONUS_103_CALC_NET C
+    WHERE
+            C.DIRECTLY_UNDER >= 2
+      AND C.USER_TYPE = 0
+      AND LAYER = MLAYER;
+    IF
+        ( MCOUNT > 0 ) THEN
+        CALL CALC20_0 ( MLAYER, PCPID );
+
+    END IF;-- 删除未达标人员
+    CALL CALCDELNET ( MLAYER );
+
+    SET MLAYER := MLAYER - 1;
+
+        END WHILE;-- 计算GPV_4_CALC,会员级别
+    UPDATE AR_BS_BONUS_103_CALC C1
+        INNER JOIN AR_BS_BONUS_103_CALC_NET C2 ON C1.USER_ID = C2.USER_ID
+    SET C1.GPV_4_CALC = C2.GPV,
+        C1.USER_TYPE = C2.USER_TYPE;-- 计算见习奖金
+    UPDATE AR_BS_BONUS_103_CALC C1
+        INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV ) ALL_GPV FROM AR_BS_BONUS_103_CALC_NET GROUP BY INTRODUCER_ID ) C2 ON C1.USER_ID = C2.INTRODUCER_ID
+            AND C1.USER_TYPE = 20
+    SET C1.BONUS20 = C2.ALL_GPV * MRATE;
+    COMMIT;
+    INSERT INTO AR_CALC_BONUS_BS_DETAIL_BONUS ( USER_ID, INTRODUCER_ID, LAST_EMP_LV, ORI_BONUS, PV, RATE, PERIOD_NUM ) SELECT
+                                                                                                                           C1.USER_ID,
+                                                                                                                           NULL,
+                                                                                                                           20,
+                                                                                                                           C2.ALL_GPV * MRATE,
+                                                                                                                           C2.ALL_GPV,
+                                                                                                                           MRATE,
+                                                                                                                           PCPID
+    FROM
+        AR_BS_BONUS_103_CALC C1
+            INNER JOIN ( SELECT INTRODUCER_ID, SUM( GPV ) ALL_GPV FROM AR_BS_BONUS_103_CALC_NET GROUP BY INTRODUCER_ID ) C2 ON C1.USER_ID = C2.INTRODUCER_ID
+            AND C1.USER_TYPE = 20
+            AND ALL_GPV > 0;
+
+END
+
+
+
+
+CREATE DEFINER=`black_tea_0309`@`%` PROCEDURE `CALCKEEP`(IN PCALCYEAR int, IN PCALCMONTH int)
+BEGIN
+    INSERT INTO AR_BS_BONUS_103_TEST SELECT
+        *
+    FROM
+        AR_BS_BONUS_103_CALC;
+    INSERT INTO AR_BS_BONUS_103_TEST_NET SELECT
+        *
+    FROM
+        AR_BS_BONUS_103_CALC_NET;
+    INSERT INTO AR_CALC_BONUS_BS (
+        USER_ID,
+        INTRODUCER_ID,
+        LAST_DEC_LV,
+        LAST_EMP_LV,
+        LAST_STATUS,
+        LEVEL_ID,
+        ORI_BONUS,
+        MANAGE_TAX,
+        AMOUNT,
+        PRODUCT_POINT,
+        PERIOD_NUM,
+        CALC_YEAR,
+        CALC_MONTH,
+        P_CALC_MONTH,
+        CREATED_AT,
+        ORI_BONUS_MNT,
+        MANAGE_TAX_MNT,
+        AMOUNT_MNT,
+        ORI_BONUS_ABBR,
+        MANAGE_TAX_ABBR,
+        AMOUNT_ABBR,
+        ACHIEVE_MEMBER_NUM,
+        ACHIEVE_PERF_PV
+    ) SELECT
+          A.USER_ID,
+          A.INTRODUCER_ID,
+          A.LAST_DEC_LV,
+          A.LAST_EMP_LV,
+          A.LAST_STATUS,
+          B.ID,
+          IFNULL( A.BONUS, 0 ),
+          0,
+          IFNULL( A.BONUS, 0 ),
+          IFNULL( A.PRODUCT_POINT, 0 ),
+          CALC_PERIOD_ID,
+          PCALCYEAR,
+          PCALCYEAR*100+PCALCMONTH,
+          NOW(),
+          UNIX_TIMESTAMP(
+                  NOW()),
+          IFNULL( A.BONUS_MNT, 0 ),
+          0,
+          IFNULL( A.BONUS_MNT, 0 ),
+          IFNULL( A.BONUS_ABBR, 0 ),
+          0,
+          IFNULL( A.BONUS_ABBR, 0 ),
+          A.ACHIEVE_MEMBER_NUM,
+          A.ACHIEVE_PERF_PV
+    FROM
+        AR_BS_BONUS_103_CALC A
+            LEFT JOIN AR_EMPLOY_LEVEL B ON A.USER_TYPE = B.SORT * 10
+    WHERE
+            A.BONUS > 0
+       OR A.PRODUCT_POINT > 0;
+    INSERT INTO AR_CALC_BONUS_BS_DETAIL (
+        USER_ID,
+        INTRODUCER_ID,
+        LAST_DEC_LV,
+        LAST_EMP_LV,
+        LAST_STATUS,
+        LEVEL_ID,
+        ORI_BONUS,
+        MANAGE_TAX,
+        AMOUNT,
+        PRODUCT_POINT,
+        PERIOD_NUM,
+        LAYER,
+        PV,
+        GPV10,
+        GPV,
+        GPV_4_CALC,
+        USER_TYPE10,
+        USER_TYPE,
+        BONUS10,
+        BONUS20,
+        BONUS30,
+        BONUS40,
+        BONUS50,
+        BONUS60,
+        BONUS70,
+        BONUS80,
+        BONUS90,
+        BONUS100,
+        BONUS110,
+        CALC_YEAR,
+        CALC_MONTH,
+        P_CALC_MONTH,
+        CREATED_AT,
+        ORI_BONUS_MNT,
+        MANAGE_TAX_MNT,
+        AMOUNT_MNT,
+        ORI_BONUS_ABBR,
+        MANAGE_TAX_ABBR,
+        AMOUNT_ABBR
+    ) SELECT
+          USER_ID,
+          INTRODUCER_ID,
+          LAST_DEC_LV,
+          LAST_EMP_LV,
+          LAST_STATUS,
+          B.ID,
+          IFNULL( BONUS, 0 ),
+          0,
+          IFNULL( BONUS, 0 ),
+          IFNULL( PRODUCT_POINT, 0 ),
+          CALC_PERIOD_ID,
+          LAYER,
+          PV,
+          GPV10,
+          GPV,
+          GPV_4_CALC,
+          USER_TYPE10,
+          USER_TYPE,
+          BONUS10,
+          BONUS20,
+          BONUS30,
+          BONUS40,
+          BONUS50,
+          BONUS60,
+          BONUS70,
+          BONUS80,
+          BONUS90,
+          BONUS100,
+          BONUS110,
+          PCALCYEAR,
+          PCALCYEAR*100+PCALCMONTH,
+          NOW(),
+          UNIX_TIMESTAMP(
+                  NOW()),
+          IFNULL( A.BONUS_MNT, 0 ),
+          0,
+          IFNULL( A.BONUS_MNT, 0 ),
+          IFNULL( A.BONUS_ABBR, 0 ),
+          0,
+          IFNULL( A.BONUS_ABBR, 0 )
+    FROM
+        AR_BS_BONUS_103_CALC A
+            LEFT JOIN ( SELECT ID, SORT FROM AR_EMPLOY_LEVEL ) B ON A.USER_TYPE = B.SORT * 10;
+
+END

+ 9 - 0
sql/upgrade/2022_09_05_1969.sql

@@ -0,0 +1,9 @@
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `IS_ACTIVE` TINYINT NOT NULL DEFAULT '0' COMMENT '是否活跃: 0否 1是';
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `HOPE_CROWN_LV` varchar(32) COLLATE utf8mb4_bin DEFAULT '' COMMENT '应有starCrown级别';
+ALTER TABLE `AR_CALC_BONUS_QY` ADD COLUMN `HOPE_BONUS` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得奖金';
+
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `IS_ACTIVE` TINYINT NOT NULL DEFAULT '0' COMMENT '是否活跃: 0否 1是';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_EMP_LV` varchar(32) COLLATE utf8mb4_bin DEFAULT '' COMMENT '应有starDir级别';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得奖金';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS_MNT` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得管理奖金';
+ALTER TABLE `AR_CALC_BONUS_BS` ADD COLUMN `HOPE_BONUS_ABBR` decimal(16,3) NOT NULL DEFAULT 0.000 COMMENT '应得绩效奖金';