|
|
@@ -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);
|
|
|
+ }
|
|
|
}
|