wesmiler 1 年間 前
コミット
f10db03ab8

+ 0 - 419
addons/dapp/src/views/Account/Index-back.vue

@@ -1,419 +0,0 @@
-<template>
-  <div id="app" class="main" @scroll="handleScroll">
-    <v-header :info="userInfo"></v-header>
-
-    <div class="main-box">
-        <div class="block-box">
-          <div class="label">{{$t('账户明细')}}</div>
-          <div class="row-block">
-            <div class="count">
-              <div class="text">{{$t('USDT余额')}}</div>
-              <div class="num">{{accountInfo.usdt||'0.00'}}</div>
-            </div>
-            <div class="count">
-              <div class="text">{{$t('SBT余额')}}</div>
-              <div class="num">{{accountInfo.sbt||'0.00'}}</div>
-            </div>
-            <div class="count">
-              <div class="text">{{$t('可提收益')}}</div>
-              <div class="num">{{accountInfo.profit||'0.00'}}</div>
-            </div>
-          </div>
-          <div class="row-block">
-            <div class="count">
-              <div class="text">{{$t('累计收益')}}</div>
-              <div class="num">{{accountInfo.profit_total||'0.00'}}</div>
-            </div>
-            <div class="count">
-              <div class="text">{{$t('累计充值')}}</div>
-              <div class="num">{{accountInfo.recharge_total||'0.00'}}</div>
-            </div>
-            <div class="count">
-              <div class="text">{{$t('累计提现')}}</div>
-              <div class="num">{{accountInfo.withdraw_total||'0.00'}}</div>
-            </div>
-          </div>
-          <div class="action-box">
-            <div class="btn recharge" @click="routeTo('/user/recharge')">{{$t('充值')}}</div>
-            <div class="btn withdraw"  @click="routeTo('/user/withdraw')">{{$t('提币')}}</div>
-          </div>
-        </div>
-
-        <div class="account-box">
-          <div class="types">
-            <div :class="['type',params.dataType==1?'selected':'']" @click="switchDataType(1)">
-              <van-popover
-                  classname="account-popover"
-                  v-model="showType"
-                  trigger="click"
-                  placement="bottom-end"
-                  :offset="[20,12]"
-              >
-                <template #reference>
-                  <div class="type-popover" @click.stop="showType=!showType">
-                    <img src="../../../public/images/icon-list.png" alt="">
-                    <span v-if="">{{$t(params.typeName?params.typeName :'账单')}}</span>
-                  </div>
-                </template>
-                <div class="type-box">
-                  <span :class="['text',params.type==v.id?'selected':'']" v-for="(v,k) in typeList" :key="k" @click="switchType(v)">{{$t(v.name)}}</span>
-                </div>
-              </van-popover>
-
-            </div>
-            <div :class="['type',params.dataType==2?'selected':'']" @click="switchDataType(2)">{{$t('质押')}}</div>
-            <div :class="['type',params.dataType==3?'selected':'']" @click="switchDataType(3)">{{$t('收益')}}</div>
-            <div :class="['type',params.dataType==4?'selected':'']" @click="switchDataType(4)">{{$t('提现')}}</div>
-          </div>
-          <div class="account-list" v-if="!accountList || accountList.length<=0">
-            <span class="empty">{{$t('暂无数据')}}</span>
-          </div>
-          <div class="account-list" v-else>
-              <div class="list-item" v-for="(v,k) in accountList" :key="k">
-                 <div class="text-left">
-                   <div class="text" v-if="params.type == 1">{{$t('质押订单',{'round': v.round})}}</div>
-                   <div class="text" v-else>{{$t(v.remark)}}</div>
-                   <div class="time">{{v.time_text}}</div>
-                 </div>
-                <div class="text-right">
-                  <div class="status" v-if="params.type == 4">
-                    <span class="text text2" v-if="v.status==2">{{$t(v.pay_status==20?'已到账':'已审核')}}</span>
-                    <span class="text text3" v-else-if="v.status==3">{{$t('已驳回')}}</span>
-                    <span class="text text1" v-else>{{$t('链上审核中')}}</span>
-                  </div>
-                  <div class="money">{{v.money||'0.00'}} {{(v.coin_type==2?$t('收益'):(v.coin_type==3?'SBT':'USDT'))}}</div>
-                </div>
-              </div>
-          </div>
-        </div>
-
-      <v-upgrade :show="showTips" :upgradeDate="upgradeDate"></v-upgrade>
-    </div>
-  </div>
-</template>
-<script>
-/* eslint-disable */
-import {
-  mapState
-} from "vuex";
-import Config from "@/assets/js/config.js";
-import {encryptDES} from "@/assets/js/utils.js";
-import Header from "../../components/common/Header";
-import Upgrade from "../../components/common/Upgrade";
-export default {
-  name: "Center",
-  components: {
-    [Header.name]: Header,
-    [Upgrade.name]: Upgrade,
-  },
-  computed: {
-    ...mapState(['userInfo'])
-  },
-  data() {
-    return {
-      publicPath: process.env.BASE_URL, //静态路径
-      lang: 'zh',
-      showType: false,
-      showTips: false,
-      upgradeDate: '',
-      accountInfo: {
-        usdt: '0.00',
-        sbt: '0.00',
-        profit: '0.00',
-      },
-      typeList:[
-        {id: 0,name:'账单'},
-        {id: 3,name:'充值'},
-        {id: 2,name:'闪兑'},
-        {id: 5,name:'链上充值'},
-        {id: 6,name:'链上扣除'},
-      ],
-      // 账单列表
-      accountList: [],
-      params: {
-        dataType: 1,
-        type: 0,
-        typeName: '',
-        page: 1,
-        pageSize: 12,
-        loaded: false,
-      }
-    }
-  },
-  created() {
-    let _this = this
-    if (!this.userInfo || this.userInfo.id <= 0) {
-      this.$toast({
-        message: this.$t('登录失效')
-      });
-      setTimeout(function(){
-        _this.routeTo('/')
-      },1200)
-    }else{
-      this.getInfo()
-      this.getAccountList()
-    }
-  },
-  methods: {
-    switchType(row){
-
-      this.params.type = row.id
-      this.params.typeName = row.name
-      this.params.dataType = 1
-      this.params.page = 1
-      this.params.loaded = false
-      this.accountList = [];
-      this.getAccountList()
-    },
-    switchDataType(type){
-      this.params.type = 0
-      this.params.dataType = type
-      this.params.page = 1
-      this.params.loaded = false
-      this.accountList = [];
-      this.getAccountList()
-    },
-    // 加载更多
-    handleScroll(event){
-      const { scrollTop, clientHeight, scrollHeight } = event.target;
-      if (scrollTop + clientHeight >= scrollHeight - 5 && !this.params.loaded) {
-        this.params.page++;
-        this.getAccountList();
-      }
-    },
-    // 用户信息
-    async getInfo() {
-      let _this = this
-      let time = (Date.parse(new Date()) / 1000);
-      let key = '{"ctime":' + time + '}';
-      let sign = encryptDES(key);
-      Config.api('/user/info', {key: sign}, function (res) {
-        if (res.success == true && res.data) {
-          _this.accountInfo = res.data
-        } else if(res.code == 403){
-          _this.$toast({
-            message: _this.$t(res.msg)
-          });
-          setTimeout(function(){
-            location.href = '/'
-          }, 1200);
-        }else if (res.code == 405) {
-          _this.showTips = true
-          _this.upgradeDate = res.data.date
-        } else {
-          _this.$toast({
-            message: _this.$t(res.msg)
-          });
-        }
-      }, 'GET').catch(function (err) {
-        console.log('请求错误:' + err.message)
-      });
-    },
-    // 账单记录
-    getAccountList(){
-      let _this = this
-      let time = (Date.parse(new Date()) / 1000);
-      let key = '{"ctime":' + time + ',"page": '+this.params.page+',"dataType":'+this.params.dataType+',"type":'+this.params.type+',"pageSize":'+this.params.pageSize+'}';
-      console.log(key)
-      let sign = encryptDES(key);
-      Config.api('/account/index', {key: sign}, function (res) {
-        if (res.success == true) {
-            if(_this.params == 1){
-                _this.accountList = res.data.list;
-            }else if (_this.params>1 && res.data.list.length>0){
-              _this.accountList = _this.accountList.concat(res.data.list);
-            }else{
-              _this.params.loaded = true
-            }
-        } else if(res.code == 405){
-          _this.showTips = true
-          _this.upgradeDate = res.data.date
-        } else if(res.code == 403){
-          _this.$toast({
-            message: _this.$t(res.msg)
-          });
-          setTimeout(function(){
-            _this.$router.push('/')
-          }, 1200);
-        } else {
-          _this.$toast({
-            message: _this.$t(res.msg)
-          });
-        }
-      })
-    },
-    routeTo(url) {
-      this.$router.push(url)
-    },
-    gotoPage(url) {
-      location.href = url
-    },
-  }
-};
-</script>
-<style lang="scss" scoped>
-@import "../../assets/css/public.scss";
-
-.main {
-  width: 100%;
-  height: 100%;
-  font-size: 12px;
-
-  .main-box {
-    width: 100%;
-    padding: 0 15px;
-    padding-top: 80px;
-    padding-bottom: 30px;
-    overflow-y: scroll;
-
-    .block-box {
-        background: url('../../../public/images/icon-wallet-card-bg.png') no-repeat;
-        background-size: cover;
-        padding: 20px 20px;
-        border-radius: 4px;
-
-      .label {
-        padding-bottom: 20px;
-        font-size: 16px;
-        font-weight: 600;
-        color: #00feff;
-      }
-
-      .row-block {
-        display: flex;
-        flex-direction: row;
-        align-items: center;
-        justify-content: space-between;
-
-        .count {
-          width: calc(100%/3);
-          display: flex;
-          flex-direction: column;
-          //align-items: center;
-          //justify-content: center;
-          padding-bottom: 15px;
-
-          .text {
-            font-size: 12px;
-            padding-bottom: 6px;
-            color: rgb(139, 145, 159);
-          }
-
-          .num {
-            font-size: 16px;
-          }
-        }
-
-        .count:nth-child(2){
-          padding-left: 15px;
-        }
-
-        .count:nth-child(3){
-          padding-left: 30px;
-        }
-      }
-
-      .action-box {
-        display: flex;
-        flex-direction: row;
-        align-items: center;
-        justify-content: center;
-        padding: 10px 0 0;
-        .btn {
-          width: calc((100% - 20px)/2);
-          padding: 10px 0;
-          background: linear-gradient(to right, #2EBAC7, #B64F9E) !important;
-          border-radius: 4px;
-          text-align: center;
-          font-size: 14px;
-        }
-
-        .btn:first-child {
-          margin-right: 20px;
-        }
-      }
-    }
-
-    .account-box {
-      margin-top: 15px;
-
-      .types {
-        display: flex;
-        flex-direction: row;
-        align-items: center;
-
-        .type {
-          padding: 8px 0;
-          width: calc(100%/4);
-          text-align: center;
-          background: rgba(35, 40, 61, 0.60);
-          margin-right: 4px;
-          border-radius: 2px;
-          display: flex;
-          flex-direction: row;
-          align-items: center;
-          justify-content: center;
-
-          img {
-            width: 18px;
-            margin-right: 4px;
-          }
-        }
-
-        .type.selected {
-          background: #2EBAC7;
-          //background: linear-gradient(to right, #2EBAC7, #B64F9E) !important;
-        }
-
-        .type:last-child {
-          margin-right: 0;
-        }
-
-        .type-popover {
-          display: flex;
-          flex-direction: row;
-          align-items: center;
-          justify-content: center;
-        }
-
-        .type-box {
-          display: flex;
-          flex-direction: column;
-          align-items: center;
-        }
-      }
-
-      .account-list {
-        margin-top: 15px;
-        background: rgba(35, 40, 61, 0.60);
-        border-radius: 4px;
-        min-height: 360px;
-        padding: 10px;
-
-        .empty {
-          line-height: 320px;
-          text-align: center;
-          display: block;
-          color: rgb(104, 111, 129);
-        }
-      }
-    }
-  }
-}
-
-.van-popover {
- .type-box {
-    display: flex;
-    flex-direction: column;
-    padding: 5px 10px;
-   .text {
-     padding: 5px;
-   }
-
-   .text.selected {
-     color: #00feff;
-   }
-  }
-}
-
-</style>

+ 1 - 1
app/Helpers/common.php

@@ -865,7 +865,7 @@ if (!function_exists('get_image_url')) {
         } else {
             $host = request()->header('HOST');
             $https = request()->secure();
-            $host = ($https ? 'https://' : 'http://') . $host . '/uploads';
+            $host = ($https ? 'https://' : '//') . $host . '/uploads';
         }
 
         return strpos($image_url, 'http') === false ? $host . '/' . ltrim($image_url, '/') : $image_url;

+ 7 - 4
app/Http/Controllers/Api/v1/TestController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\v1;
 
 use App\Http\Controllers\Api\webApp;
 use App\Models\MemberModel;
+use App\Models\PledgeOrderModel;
 use App\Services\Api\FinanceService;
 use App\Services\Api\MemberService;
 use App\Services\Api\PledgeOrderService;
@@ -23,10 +24,14 @@ class TestController extends webApp
 
     public function check()
     {
-        $result = CregisPayService::make()->withdraw('58YsXE527EojowwqSFDV1V7tCWUGVFbEqnD1f3TUUALQ', 0.66, 'TS'.date('YmdHis'), '1000', '', '手动测试');
+//        $order = PledgeOrderModel::where(['id'=>29])->first();
+//        $result = FinanceService::make()->settleShareAward(10042,'10001,10034,10035,10036,10037,10038,10039,10040,',$order);
+//        var_dump(make_wallet_token('58YsXE527EojowwqSFDV1V7tCWUGVFbEqnD1f3TUUALQ',10001));
+        $result = CregisPayService::make()->withdraw('58YsXE527EojowwqSFDV1V7tCWUGVFbEqnD1f3TUUALQ', 1, 'TS2024080201010234', '1000', '', '测试');
 //        $result = FinanceService::make()->developerSettle(2,'58YsXE527EojowwqSFDV1V7tCWUGVFbEqnD1f3TUUALQ');
-var_dump(CregisPayService::make()->getError());
+//        $result = MemberService::make()->upgradeUpdate(11056);
         var_dump($result);
+        var_dump(CregisPayService::make()->getError());
 //        $result = CregisPayService::make()->withdraw('58YsXE527EojowwqSFDV1V7tCWUGVFbEqnD1f3TUUALQ',1,'TS'.date('YmdHis'),1000);
 //        $result = MemberService::make()->pledgeUserList();
 //        $result = PledgeOrderService::make()->orderSettle(4,'PD20240729105659045786',10023);
@@ -34,8 +39,6 @@ var_dump(CregisPayService::make()->getError());
 //
 //        $userInfo = MemberModel::where(['id'=> 10023])->first()->toArray();
 //        var_dump($userInfo);
-//        $result = PledgeOrderService::make()->autoMakeOrder($userInfo);
-        var_dump(lang(PledgeOrderService::make()->getError()));
         return message('获取结果', true, $result);
     }
 

+ 46 - 15
app/Services/Api/FinanceService.php

@@ -243,6 +243,7 @@ class FinanceService extends BaseService
         $bonusPerformance = isset($userInfo['bonus_performance']) ? floatval($userInfo['bonus_performance']) : 0;
         DB::beginTransaction();
         try {
+            $logs = [];
             if ($bonusRate > 0 && $bonusRate < 100) {
                 $teamPerformance = TeamService::make()->getTeamPerformanceByType($userId, 2, true);
                 $teamPerformance = round($teamPerformance + $userPerformance, 2); // 用户团队业绩
@@ -292,6 +293,8 @@ class FinanceService extends BaseService
                             $this->error = "用户[{$userId}]质押订单[{$orderNo}]的团队分红结算失败";
                             return false;
                         }
+
+                        $logs[$userId] = ['error'=>"质押用户[{$userId}]团队分红结算成功",'orderNo'=>$orderNo,'bonusUsdt'=>$bonusAwardUsdt,'bonusRate'=>$bonusRate,'log'=>$data];
                     }
 
                 }
@@ -299,7 +302,6 @@ class FinanceService extends BaseService
 
 
             // TODO 上级分红结算
-            $logs = [];
             if($parentIds){
                 $lastUserId = $userId;
                 $lastUserInfo = [];
@@ -315,6 +317,7 @@ class FinanceService extends BaseService
                     foreach($parentIds as $pid){
                         $info = isset($parents[$pid])? $parents[$pid] : [];
                         if(empty($info)){
+                            $lastUserId = $pid;
                             $logs[$pid] = ['error'=>"分红用户[{$userId}]上级用户[{$pid}]信息不存在",'orderNo'=>$orderNo,'info'=>$info];
                             continue;
                         }
@@ -323,12 +326,13 @@ class FinanceService extends BaseService
                             $lastUserInfo = $userInfo;
                         }else{
                             $lastUserInfo = isset($parents[$lastUserId])?$parents[$lastUserId] : [];
-                            $lastUserId = isset($lastUserInfo['id'])? $lastUserInfo['id'] : 0;
+//                            $lastUserId = isset($lastUserInfo['id'])? $lastUserInfo['id'] : 0;
                         }
 
                         // 当前节点线下级直推用户
                         if(empty($lastUserInfo)){
-                            $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]直推线用户信息不存在",'orderNo'=>$orderNo,'lastUserId'=>$lastUserId,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
+                            $lastUserId = $pid;
+                            $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]直推线用户信息不存在",'orderNo'=>$orderNo,'lastUserId'=>$lastUserId,'parents'=>$parents,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
                             continue;
                         }
 
@@ -338,6 +342,7 @@ class FinanceService extends BaseService
                         $parentBonusRate = isset($info['bonus_rate']) ? floatval($info['bonus_rate']) : 0;
                         $realBonusRate = max(0,round($parentBonusRate - $bonusTotalRate));
                         if($realBonusRate <=0 || $realBonusRate >= 100){
+                            $lastUserId = $pid;
                             $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]无实际分红比例",'orderNo'=>$orderNo,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
                             continue;
                         }
@@ -394,7 +399,7 @@ class FinanceService extends BaseService
                                     'coin_type' => 3,
                                     'money' => $bonusAwardUsdt,
                                     'before_money' => $parentProfit,
-                                    'create_time' => time(),
+                                    'create_time' => time()+1,
                                     'action_ip' => get_client_ip(),
                                     'remark' => "团队分红",
                                     'status' => 1,
@@ -407,9 +412,17 @@ class FinanceService extends BaseService
                                     return false;
                                 }
 
-                                $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]团队分红结算成功",'orderNo'=>$orderNo,'bonusUsdt'=>$bonusAwardUsdt,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
+                                $lastUserId = $pid;
+                                $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]团队分红成功",'orderNo'=>$orderNo,'bonusUsdt'=>$bonusAwardUsdt,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
+                                $bonusTotalRate += $realBonusRate;
+                            }else{
+                                $lastUserId = $pid;
+                                $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]团队分红无结算金额",'orderNo'=>$orderNo,'bonusUsdt'=>0,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
                             }
 
+                        }else{
+                            $lastUserId = $pid;
+                            $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]团队分红业绩不足",'orderNo'=>$orderNo,'teamPerformance'=>$teamPerformance,'bonusTeamPerformance'=>$bonusTeamPerformance,'bonusUsdt'=>0,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
                         }
                     }
                 }
@@ -588,6 +601,7 @@ class FinanceService extends BaseService
                                 }
 
                                 $logs[$pid] = ['error'=>"质押用户[{$userId}]上级用户[{$pid}]工作室分红结算成功",'orderNo'=>$orderNo,'bonusUsdt'=>$bonusAwardUsdt,'bonusRateTotal'=>$bonusTotalRate,'info'=>$info];
+                                $bonusTotalRate += $realBonusRate;
                             }
 
                         }
@@ -910,7 +924,7 @@ class FinanceService extends BaseService
         }
 
         $parentIds = get_parents($parentIds);
-        $parentIds = array_slice($parentIds, 0, 10);
+//        $parentIds = array_slice($parentIds, 0, 10);
         if (empty($parentIds)) {
             $this->error = lang(4511, ['uid' => $userId, 'order_no' => $orderNo]);
             return true;
@@ -920,20 +934,33 @@ class FinanceService extends BaseService
         try {
             $count = 0;
             $logs = [];
+            $floor = 0;
             $shareRates = InstitutionalService::make()->getAwardByFloor();
             DB::beginTransaction();
             foreach ($parentIds as $key => $pid) {
-                $floor = $key + 1;
-                $rateInfo = isset($shareRates[$floor]) ? $shareRates[$floor] : [];
+                if($floor>7){
+                    $logs[$pid] = ['error' => "该推荐人[{$pid}]超过结算层级,不结算", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor, 'rate' => $rate];
+                    continue;
+                }
+
+                // 验证用户是否有效
+                if (!PledgeOrderService::make()->checHasPledge($pid)) {
+                    $logs[$pid] = ['error' => "该推荐人[{$pid}]是无效用户,不计算奖励不计算层级", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1, 'rate' => $rate];
+                    continue;
+                }
+
+                $rateInfo = isset($shareRates[$floor+1]) ? $shareRates[$floor+1] : [];
                 $rate = isset($rateInfo['value']) && $rateInfo['value'] > 0 && $rateInfo['value'] < 100 ? floatval($rateInfo['value']) : 0;
                 if (empty($rateInfo) || $rate <= 0) {
-                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐收益比例参数未配置", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor];
+                    $floor++;
+                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐收益比例参数未配置,算层级不结算", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1];
                     continue;
                 }
 
                 $shareAwardUsdt = moneyFormat($pledgeUsdt * $rate / 100, 2);
                 if ($shareAwardUsdt <= 0) {
-                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐无推荐收益", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor, 'rate' => $rate];
+                    $floor++;
+                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐无推荐收益,算层级不结算", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1, 'rate' => $rate];
                     continue;
                 }
 
@@ -943,13 +970,14 @@ class FinanceService extends BaseService
                 $userInfo = $userInfo ? $userInfo->toArray() : [];
                 $userProfit = isset($userInfo['profit']) ? $userInfo['profit'] : 0;
                 if (empty($userInfo) || $pid <= 0) {
-                    $logs[$pid] = ['error' => "该推荐人[{$pid}]信息不存在", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor, 'rate' => $rate];
+                    $logs[$pid] = ['error' => "该推荐人[{$pid}]信息不存在,不算层级", 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1, 'rate' => $rate];
                     continue;
                 }
 
                 // 验证是否结算过
                 if ($logId = AccountLogModel::where(['user_id' => $pid, 'order_no' => $orderNo, 'type' => 8, 'status' => 1, 'mark' => 1])->value('id')) {
-                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐奖励已结算过", 'logId' => $logId, 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor, 'rate' => $rate];
+                    $floor++;
+                    $logs[$pid] = ['error' => "该层推荐人[{$pid}]推荐奖励已结算过,算层级", 'logId' => $logId, 'orderNo' => $orderNo, 'uid' => $userId, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1, 'rate' => $rate];
                     continue;
                 }
 
@@ -979,18 +1007,19 @@ class FinanceService extends BaseService
                     'before_money' => $userProfit,
                     'create_time' => time(),
                     'action_ip' => get_client_ip(),
-                    'remark' => "{$floor}层推荐奖励",
+                    'remark' => ($floor+1)."层推荐奖励",
                     'status' => 1,
                     'mark' => 1,
                 ];
 
                 if (!AccountLogModel::insertGetId($data)) {
                     DB::rollBack();
-                    $this->error = "用户[{$userId}]质押订单[{$orderNo}]的[{$floor}]层推荐人[{$pid}]推荐收益[{$shareAwardUsdt}]结算错误";
+                    $this->error = "用户[{$userId}]质押订单[{$orderNo}]的[".($floor+1)."]层推荐人[{$pid}]推荐收益[{$shareAwardUsdt}]结算错误";
                     return false;
                 }
-                $logs[$pid] = ['error' => "推荐人[{$pid}]奖励结算成功", 'orderNo' => $orderNo, 'uid' => $userId, 'profit' => $userProfit, 'awardUsdt' => $shareAwardUsdt, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor, 'rate' => $rate];
+                $logs[$pid] = ['error' => "推荐人[{$pid}]奖励结算成功", 'orderNo' => $orderNo, 'uid' => $userId, 'profit' => $userProfit, 'awardUsdt' => $shareAwardUsdt, 'pledgeUsdt' => $pledgeUsdt, 'floor' => $floor+1, 'rate' => $rate];
                 $count++;
+                $floor++;
             }
 
             DB::commit();
@@ -1024,6 +1053,7 @@ class FinanceService extends BaseService
         $info = $info? $info->toArray() : [];
         $userId = isset($info['user_id'])? intval($info['user_id']) : 0;
         $userProfit = isset($info['profit'])? floatval($info['profit']) : 0;
+        $profitRate = isset($info['maintenance_rate'])? floatval($info['maintenance_rate']) : 0;
         if(empty($info) || $userId<=0){
             $this->error = 2001;
             return false;
@@ -1049,6 +1079,7 @@ class FinanceService extends BaseService
             // 结算比例
             $settleRate = ConfigService::make()->getConfigByCode('developer_settle_rate', 3);
             $settleRate = $settleRate>0 && $settleRate <= 20? $settleRate : 3;
+            $settleRate = $profitRate>0 && $profitRate< 50? $profitRate : $settleRate;
 
             $settleMoney = round($pledgeTotal * $settleRate/100, 2);
             if($settleMoney>0){

+ 15 - 14
app/Services/Api/MemberService.php

@@ -644,18 +644,19 @@ class MemberService extends BaseService
             DB::beginTransaction();
             RedisService::set($cacheKey . '_lock', date('Y-m-d H:i:s'), rand(3,5));
             if ($coinType == 1) {
-                $maxUsdtRate = ConfigService::make()->getConfigByCode('usdt_withdraw_max_rate', 0);
-                $withdrawTotal = BalanceLogService::make()->getCountByType($userId, 2, 1, 0);
-                $maxWithdrawMoney = ($withdrawTotal + $userUsdt);
-                $maxWithdrawMoney = $maxUsdtRate > 0 && $maxUsdtRate < 100 ? moneyFormat($maxWithdrawMoney * $maxUsdtRate / 100, 2) : $maxWithdrawMoney;
-                if (($withdrawTotal + floatval($money)) >= $maxWithdrawMoney) {
+                if($money>$userUsdt){
                     DB::rollBack();
-                    $this->error = 2026; // 可提金额超出
-                    $this->errorData = ['money' => moneyFormat($maxWithdrawMoney - $withdrawTotal, 2)];
+                    $this->error = 2026; // 本金余额不足
+                    $this->errorData = ['money' => $userUsdt];
                     RedisService::clear($cacheKey . '_lock');
                     return false;
                 }
 
+                $maxUsdtRate = ConfigService::make()->getConfigByCode('usdt_withdraw_max_rate', 0);
+                $maxUsdtRate = $maxUsdtRate>0 && $maxUsdtRate<100? floatval($maxUsdtRate) : 0;
+                $fee = round($money * $maxUsdtRate/100, 2);
+                $actualMoney = moneyFormat($money - $fee, 2);
+
                 // 提现处理
                 $updateData = ['usdt' => DB::raw("usdt - {$money}"), 'update_time' => time()];
                 if (!$this->model->where(['id' => $userId])->update($updateData)) {
@@ -673,8 +674,8 @@ class MemberService extends BaseService
                     'user_type' => 1,
                     'coin_type' => 1,
                     'money' => $money,
-                    'actual_money' => $money,
-                    'fee' => 0,
+                    'actual_money' => $actualMoney,
+                    'fee' => $fee,
                     'pay_type' => 10,
                     'pay_status' => 10,
                     'wallet_url' => $info['wallet_url'],
@@ -1048,21 +1049,21 @@ class MemberService extends BaseService
             ->value('id');
         $nextLevel = $nextLevel>0? intval($nextLevel) : 0;
         // 是否只升不降
-        if ($$upgradeStatus==2 && $nextLevel<=$memberLevel) {
+        if ($upgradeStatus==2 && $nextLevel<=$memberLevel) {
             RedisService::clear($cacheKey);
             $this->error = lang(4302, ['uid' => $userId]);
             return false;
         }
 
         // 更新等级
-        if (!$this->model->where(['id' => $userId])->update(['member_level' => $nextLevel, 'old_level' => $memberLevel,'upgrade_at'=>date('Y-m-d H:i:s'), 'update_time' => time()])) {
+        if (!$this->model->where(['id' => $userId])->update(['member_level' => $nextLevel, 'old_level' => $memberLevel,'upgrade_at'=>date('Y-m-d H:i:s'),'upgrade_remark'=>"团队业绩[{$teamPerformance}]等级[S{$memberLevel}]自动升级为[S{$nextLevel}]", 'update_time' => time()])) {
             RedisService::clear($cacheKey);
-            $this->error = lang(4302, ['uid' => $userId, 'level' => $nextLevel]);
+            $this->error = lang(4304, ['uid' => $userId,'old'=>$memberLevel, 'level' => $nextLevel]);
             return false;
         }
 
-        $this->error = lang(4302, ['uid' => $userId, 'level' => $nextLevel, 'old' => $memberLevel]);
-        RedisService::set($cacheKey, ['level' => $nextLevel, 'old' => $memberLevel, 'date' => date('Y-m-d H:i:s')], rand(30, 60));
+        $this->error = lang(4305, ['uid' => $userId, 'level' => $nextLevel, 'old' => $memberLevel]);
+        RedisService::set($cacheKey, ['level' => $nextLevel, 'old' => $memberLevel, 'date' => date('Y-m-d H:i:s')], rand(300, 600));
         return ['msg' => '更新成功', 'uid' => $userId, 'level' => $nextLevel, 'old' => $memberLevel];
     }
 

+ 12 - 5
app/Services/Api/PledgeOrderService.php

@@ -375,18 +375,25 @@ class PledgeOrderService extends BaseService
             // 质押轮次奖励
             FinanceService::make()->pledgeAward($userId, $round, $order);
 
-            // 团队分红结算
-            FinanceService::make()->settleTeamBonus($userId, $parentIds, $order);
+            // TODO 是否结算动态收益
+            if($settleStatus==1) {
+                // 团队分红结算
+                if(!FinanceService::make()->settleTeamBonus($userId, $parentIds, $order)){
+                    RedisService::set("caches:pledgeOrder:team_bonus_{$order['order_no']}", ['uid'=>$userId,'parentIds'=>$parentIds,'order'=>$order,'error'=>FinanceService::make()->getError()], 600);
+                }
 
-            // 工作室分红结算
-            FinanceService::make()->settleRoomBonus($userId, $parentIds, $order);
+                // 工作室分红结算
+                if(!FinanceService::make()->settleRoomBonus($userId, $parentIds, $order)){
+                    RedisService::set("caches:pledgeOrder:room_bonus_{$order['order_no']}", ['uid'=>$userId,'parentIds'=>$parentIds,'order'=>$order,'error'=>FinanceService::make()->getError()], 600);
+                }
+            }
 
             $this->error =  $this->error = lang(4109,['uid'=> $userId,'round'=>$round]);
             RedisService::clear("caches:pledge:lock_{$userId}_{$round}");
             RedisService::clear("caches:pledgeOrder:total_{$userId}");
             RedisService::clear("caches:pledge:check_{$userId}");
             RedisService::clear("caches:pledge:counts_{$userId}");
-            return ['user_id'=>$userId,'round'=>$round,'money'=>$pledgeUsdt,'msg'=>'自动质押成功'];
+            return ['user_id'=>$userId,'round'=>$round,'money'=>$pledgeUsdt,'settleStatus'=>$settleStatus,'msg'=>'自动质押成功'];
         } catch (\Exception $exception){
             DB::rollBack();
             $this->error = lang(4110,['uid'=> $userId,'round'=>$round,'error'=> $exception->getMessage()]);

+ 2 - 2
app/Services/Api/TeamService.php

@@ -142,8 +142,8 @@ class TeamService extends BaseService
         ];
 
         if($type == 1){
-            $info['share_count'] = $this->getTeamUserCountByType($userId, 2); //
-            $info['today_share_count'] = $this->getTeamUserCountByType($userId, 3);
+            $info['team_count'] = $this->getTeamUserCountByType($userId, 2); //
+            $info['share_count'] = $this->getTeamUserCountByType($userId, 1);
 
             // 下一等级业绩,团队业绩
             $nextLevelData = MemberService::make()->getLevelData($info['member_level'], 2);

+ 11 - 3
app/Services/Common/MemberService.php

@@ -157,9 +157,10 @@ class MemberService extends BaseService
         try {
             // 判断团队分红比例
             $uid = isset($data['id'])? $data['id'] : 0;
-            $info = $this->model->where(['id'=> $uid,'mark'=>1])->select(['id','parent_ids','bonus_rate','room_bonus_rate'])->first();
+            $info = $this->model->where(['id'=> $uid,'mark'=>1])->select(['id','member_level','parent_ids','bonus_rate','room_bonus_rate'])->first();
             $info = $info? $info->toArray() : [];
             $userParentId = isset($info['parent_id'])? $info['parent_id'] : 0;
+            $memberLevel = isset($info['member_level'])? $info['member_level'] : 0;
             $userParentIds = isset($info['parent_ids'])? $info['parent_ids'] : '';
 
             // 最大设置比例
@@ -224,6 +225,14 @@ class MemberService extends BaseService
                         }
                     }
                 }
+                ActionLogModel::setTitle("修改用户推荐人");
+                ActionLogModel::record();
+            }
+
+            $level = isset($data['member_level'])? intval($info['member_level']) : 0;
+            if($level != $memberLevel){
+                ActionLogModel::setTitle("修改用户等级为[S{$level}]");
+                ActionLogModel::record();
             }
 
 
@@ -240,7 +249,6 @@ class MemberService extends BaseService
                 return $result;
             }
 
-
             ActionLogModel::setTitle("修改会员信息");
             ActionLogModel::record();
             RedisService::keyDel("caches:member:list*");
@@ -278,7 +286,7 @@ class MemberService extends BaseService
             })
             ->where(function($query) use($keyword){
                 if($keyword){
-                    $query->where('nickname','like',"{$keyword}%")->orWhere('wallet_url','like',"{$keyword}%");
+                    $query->where('nickname','like',"%{$keyword}%")->orWhere('wallet_url','like',"%{$keyword}%");
                 }
             })
             ->select(['id','wallet_url','code','nickname','status'])

+ 1 - 1
app/Services/Common/MenuService.php

@@ -298,7 +298,7 @@ class MenuService extends BaseService
             // 其他角色
             $menuModel = new MenuModel();
             $permissionList = $menuModel::from("menu as m")
-                ->select('m.permission')
+                ->select(['m.permission','m.pid','m.sort'])
                 ->join('role_menu as rm', 'rm.menu_id', '=', 'm.id')
                 ->join('user_role as ur', 'ur.role_id', '=', 'rm.role_id')
                 ->distinct(true)

+ 7 - 4
app/Services/Common/UserService.php

@@ -108,12 +108,15 @@ class UserService extends BaseService
 
         // 头像处理
         $avatar = isset($data['avatar']) ? trim($data['avatar']) : '';
-        if (strpos($avatar, "temp")) {
-            $data['avatar'] = save_image($avatar, 'user');
-        } else {
-            $data['avatar'] = str_replace(IMG_URL, "", $data['avatar']);
+        if($avatar){
+            if (strpos($avatar, "temp")) {
+                $data['avatar'] = save_image($avatar, 'user');
+            } else {
+                $data['avatar'] = str_replace(IMG_URL, "", $data['avatar']);
+            }
         }
 
+
         // 验证绑定谷歌验证码
         if(isset($data['google_code']) && $data['google_code']){
             $googleKey = $this->model->where(['username'=> $username])->value('google_key');

+ 1 - 1
app/Services/CregisPayService.php

@@ -109,7 +109,7 @@ class CregisPayService extends BaseService
     public function createAddress($mainCoinType = '1000')
     {
         try {
-            $callback = env('APP_URL').'/'.trim(self::$rechargeNotifyUrl,'/');
+            $callback = trim(env('APP_URL'),'/').'/'.trim(self::$rechargeNotifyUrl,'/');
             $result = $this->dispatch->createAddress(self::$config['project_no'], $mainCoinType, '', $callback);
             $code = isset($result['code']) ? trim($result['code']) : 0;
             $address = isset($result['data']['address']) ? trim($result['data']['address']) : '';

+ 2 - 0
resources/lang/zh-cn/api.php

@@ -131,6 +131,8 @@ return [
     '4301'=>'升级用户[:uid]信息不存在',
     '4302'=>'升级用户[:uid]没有可更新的等级',
     '4303'=>'升级用户[:uid]短时间内已更新过等级',
+    '4304'=>'升级用户[:uid]等级[:old]更新到[:level]失败',
+    '4305'=>'升级用户[:uid]等级[:old]更新到[:level]成功',
 
     '4310'=>'用户[:uid]质押订单[:order_no]退本已处理过',
     '4311'=>'用户[:uid]质押订单[:order_no]退本订单信息不存在',

+ 1 - 0
routes/api.php

@@ -65,6 +65,7 @@ Route::prefix('v1')->group(function() {
     // cregis支付回调
     Route::any('/wallet-api/cregisCallback', [\App\Http\Controllers\Api\v1\NotifyController::class, 'cregisCallback']);
     Route::any('/wallet-api/rechargeCallback', [\App\Http\Controllers\Api\v1\NotifyController::class, 'rechargeCallback']);
+
 });
 
 // 测试