Przeglądaj źródła

wesmiler 报恩寺项目提交

wesmiler 4 lat temu
rodzic
commit
08e438849c

+ 1 - 1
app/Http/Controllers/Api/v1/SignController.php

@@ -48,6 +48,6 @@ class SignController extends BaseController
      * 打卡签到提交
      */
     public function submit(){
-
+        return $this->service->submit($this->userId);
     }
 }

+ 139 - 0
app/Services/SignsService.php

@@ -11,7 +11,11 @@
 
 namespace App\Services;
 
+use App\Models\MemberModel;
+use App\Models\SignCatesModel;
 use App\Models\SignsModel;
+use App\Models\SiyuanModel;
+use App\Models\TradeModel;
 
 /**
  * 打卡签到管理-服务类
@@ -105,4 +109,139 @@ class SignsService extends BaseService
         return parent::edit($data); // TODO: Change the autogenerated stub
     }
 
+    /**
+     * 打卡
+     * @param $userId
+     * @return array
+     */
+    public function submit($userId){
+        $params = request()->all();
+        $type = isset($params['type'])? $params['type'] : 0;
+        $cateId = isset($params['cate_id'])? $params['cate_id'] : 0;
+        $siyuanId = isset($params['siyuan_id'])? $params['siyuan_id'] : 0;
+        if(!in_array($type, [1,2])){
+            return message('打开类型参数错误', false);
+        }
+
+        $cateInfo = SignCatesModel::where(['id'=> $cateId,'mark'=> 1,'status'=> 1])
+            ->select(['id','name'])
+            ->first();
+        if($cateId <=0 || !$cateInfo){
+            return message('打卡分类参数错误或不存在', false);
+        }
+
+        $siyuanInfo = SiyuanModel::where(['id'=> $siyuanId,'mark'=> 1,'status'=> 1])
+                    ->select(['id','title','status'])
+                    ->first();
+        if(!$siyuanInfo){
+            return message('打卡寺院不存在或不可操作', false);
+        }
+
+        // 验证用户是否可操作
+        $memberInfo = MemberModel::where(['id' => $userId, 'mark' => 1, 'status' => 1])
+            ->select('id', 'openid', 'nickname','coupon','salary')
+            ->first();
+        if (!$memberInfo) {
+            return message('您的账号已被冻结或不可操作,请联系客服', false);
+        }
+
+        if(time() < strtotime(date('Y-m-d 08:00')) || time() > strtotime(date('Y-m-d 20:00'))){
+            return message('每天8:00~20:00时间段才可打卡,请联系客服', false);
+        }
+
+        // 验证今天是否签到过
+        $checkInfo = [];
+        $where = ['type'=> $type,'user_id'=> $userId, 'siyuan_id'=> $siyuanId,'mark'=> 1,'status'=> 1];
+        if(in_array($cateId, [1,2])){
+            $checkInfo = SignsModel::where($where)->whereIn('cate_id',[1,2])
+                ->where('sign_at','>=', date('Y-m-d'))
+                ->select(['id','sign_at','cate_id'])
+                ->orderBy('sign_at','desc')
+                ->first();
+            if($checkInfo && $checkInfo->cate_id == $cateId){
+                return message('您最近已经打过'.$cateInfo->name.'卡,请先联系客服', false);
+            }
+            if($cateId == 2 && !$cateInfo){
+                return message('请先完成上班打卡,才能打下班卡', false);
+            }
+        }else if(in_array($cateId, [3,4])){
+            $checkInfo = SignsModel::where($where)->whereIn('cate_id',[3,4])
+                ->where('sign_at','>=', date('Y-m-d'))
+                ->select(['id','sign_at','cate_id'])
+                ->orderBy('sign_at','desc')
+                ->first();
+            if($checkInfo && $checkInfo->cate_id == $cateId){
+                return message('您最近已经打过'.$cateInfo->name.'卡,请先联系客服', false);
+            }
+            if($cateId == 4 && !$cateInfo){
+                return message('请先完成上课打卡,才能打下课卡', false);
+            }
+        }
+
+        // 每天同类型打卡最多次数
+        $signCount = ConfigService::make()->getConfigByCode('sign_count');
+        $signCount = $signCount>0? $signCount : 1;
+        $checkCount = SignsModel::where($where)->where('cate_id', $cateId)
+            ->where('sign_at','>=', date('Y-m-d'))
+            ->count('id');
+        if($checkCount >= $signCount){
+            return message("该类型打卡每天最多{$signCount}次", false);
+        }
+
+        // 打卡处理
+        $signCheck = ConfigService::make()->getConfigByCode('sign_check');
+        $signCheck = $signCheck? $signCheck : 1;
+        \DB::beginTransaction();
+        $data = [
+            'user_id'=> $userId,
+            'cate_id'=> $cateId,
+            'siyuan_id'=> $siyuanId,
+            'sign_at'=> date('Y-m-d H:i'),
+            'description'=> isset($params['description'])? trim($params['description']) : '',
+            'update_time'=> time(),
+            'create_time'=> time(),
+            'status'=> in_array($cateId, [1,2])? $signCheck : 1,
+        ];
+        if(!$this->model::insertGetId($data)){
+            \DB::rollBack();
+            return message('打卡失败', false);
+        }
+
+        // 义工上班结算
+        $signSettle = ConfigService::make()->getConfigByCode('sign_settle');
+        $signSettle = $signSettle>0? $signSettle : false;
+        if($type == 2 && $cateId == 2 && $signSettle){
+            $yigongSalary = ConfigService::make()->getConfigByCode('yg_salary');
+            $signStartTime = isset($checkInfo['sign_at']) && $checkInfo['sign_at']? strtotime($checkInfo['sign_at']) : 0;
+            $signEndTIme = strtotime(date('Y-m-d H:i'));
+            $signTime = moneyFormat(($signEndTIme - $signStartTime)/3600, 2);
+            $salary = moneyFormat($signTime * $yigongSalary, 2);
+            if($salary>0){
+                if(!MemberModel::where(['id'=> $userId,'mark'=> 1])->increment('salary',$salary)){
+                    \DB::rollBack();
+                    return message('打卡工资结算失败', false);
+                }
+
+                $data = [
+                    'user_id'=> $userId,
+                    'type'=> 7,
+                    'coin_type'=> 2,
+                    'pay_type'=> 1,
+                    'money'=> $salary,
+                    'change_type'=> 1,
+                    'balance'=> $memberInfo->salary? $memberInfo->salary : 0,
+                    'create_time'=> time(),
+                    'remark'=> '打卡工资结算',
+                    'status'=> 1
+                ];
+                if(!TradeModel::insertGetId($data)){
+                    \DB::rollBack();
+                    return message('打卡工资结算处理失败', false);
+                }
+            }
+        }
+
+        \DB::commit();
+        return message('打卡成功', true);
+    }
 }