// +---------------------------------------------------------------------- namespace App\Services; use App\Models\ActivityBooksModel; use App\Models\ActivityModel; use App\Models\MemberModel; use App\Models\TradeModel; use Illuminate\Support\Facades\DB; /** * 寺院活动管理-服务类 * @author wesmiler * @since 2020/11/11 * Class ActivityService * @package App\Services */ class ActivityService extends BaseService { protected static $instance = null; /** * 构造函数 * @author wesmiler * @since 2020/11/11 * ActivityService constructor. */ public function __construct() { $this->model = new ActivityModel(); $this->bookModel = new ActivityBooksModel(); $this->memberModel = new MemberModel(); $this->tradeModel = new TradeModel(); } /** * 静态入口 * @return ActivityService()|null */ public static function make(){ if(!self::$instance){ self::$instance = new ActivityService(); } return self::$instance; } /** * 获取友链列表 * @return array * @since 2020/11/11 * @author wesmiler */ public function getDataList() { $params = request()->all(); $page = isset($params['pageSize']) ? intval($params['pageSize']) : PAGE; $pageSize = isset($params['pageSize']) ? intval($params['pageSize']) : PERPAGE; $dataList = $this->model::from('activity as a') ->where(function ($query) use ($params) { $query->where('a.mark', 1); $query->where('a.status',1); }) ->select(['a.id', 'a.address', 'a.price', 'a.thumb', 'a.type', 'a.title', 'a.create_time', 'a.update_time', 'a.description', 'a.status', 'a.publish_start','a.publish_end']) ->orderBy('a.sort', 'desc') ->paginate($pageSize); $dataList = $dataList ? $dataList->toArray() : []; if ($dataList) { foreach ($dataList['data'] as &$item) { $item['thumb'] = $item['thumb'] ? get_image_url($item['thumb']) : ''; $item['create_time'] = $item['create_time'] ? datetime($item['create_time'],'Y-m-d H:i:s') : ''; $publishStart = isset($item['publish_start']) && $item['publish_start']? date('m月d日', strtotime($item['publish_start'])) : ''; $publishEnd = isset($item['publish_end']) && $item['publish_end']? date('m月d日', strtotime($item['publish_end'])) : ''; $item['publish_at'] = $publishStart==$publishEnd? $publishStart : ($publishStart && $publishEnd>$publishStart? $publishStart.'-'.$publishEnd : ''); $item['publish_at_text'] = $item['publish_start'] && $item['publish_end']? $item['publish_start'].'至'.$item['publish_end'] : ''; $bookNum = ActivityBooksModel::where(['aid'=> $item['id'],'status'=> 1])->count('id'); $item['count'] = intval($bookNum); } unset($item); } return [ 'code' => 0, 'success'=> true, 'msg' => '操作成功', 'count' => isset($dataList['total']) ? $dataList['total'] : 0, 'data' => isset($dataList['data']) ? $dataList['data'] : 0, ]; } /** * 详情 * @return array */ public function getInfo(){ // 记录ID $id = request()->input("id", 0); $info = []; if ($id) { $info = $this->model->getInfo($id); } if($info){ if(isset($info['content'])){ $info['content'] = $info['content']? str_replace("\n","
", $info['content']) :''; } } return message(MESSAGE_OK, true, $info); } /** * 添加或编辑 * @return array * @since 2020/11/11 * @author wesmiler */ public function edit() { $data = request()->all(); // 图片处理 $image = trim($data['thumb']); $id = isset($data['id']) ? $data['id'] : 0; if (!$id && !$image) { return message('请上传活动图片', false); } if (strpos($image, "temp")) { $data['thumb'] = save_image($image, 'item'); } else { $data['thumb'] = str_replace(IMG_URL, "", $data['thumb']); } if(isset($data['publish_at_text']) && $data['publish_at_text']){ $times = $data['publish_at_text']; $data['publish_start'] = isset($times[0])? $times[0] : ''; $data['publish_end'] = isset($times[1])? $times[1] : ''; } $data['update_time'] = time(); return parent::edit($data); // TODO: Change the autogenerated stub } /** * 报名处理 * @param $userId 用户ID * @return array */ public function books($userId){ $params = request()->all(); $gdName = isset($params['gd_name'])? trim($params['gd_name']) : ''; $wsName = isset($params['ws_name'])? trim($params['ws_name']) : ''; $couponGive = isset($params['coupon_give'])? intval($params['coupon_give']) : 0; $xyContent = isset($params['xy_content'])? trim($params['xy_content']) : ''; // 验证活动 $aid = isset($params['id'])? intval($params['id']) : 0; $activityInfo = $this->model::where(['id'=> $aid, 'status'=> 1, 'mark'=> 1]) ->select(['id','type','price','status','publish_start','publish_end']) ->first(); $activityInfo = $activityInfo? $activityInfo->toArray() : []; if(empty($activityInfo)){ return message('活动不存在或已取消', false); } $coupon = isset($activityInfo['price'])? $activityInfo['price'] : 0; $publishStart = isset($activityInfo['publish_start'])? $activityInfo['publish_start'] : ''; $publishEnd = isset($activityInfo['publish_end'])? $activityInfo['publish_end'] : ''; $type = isset($activityInfo['type'])? $activityInfo['type'] : 1; $curDate = date('Y-m-d'); if($publishStart && $publishEnd && ($curDate< $publishStart || $curDate > $publishEnd)){ return message('活动已结束', false); } // 是否参加过 if(ActivityBooksModel::where(['user_id'=> $userId,'aid'=> $aid,'mark'=> 1,'status'=> 1])->value('id')){ return message('您已报名参加过', false); } // 验证账户 $couponTotal = intval($couponGive+$coupon); $memberInfo = $this->memberModel::where(['id'=> $userId, 'status'=>1])->select(['id','coupon','nickname'])->first(); if(!$memberInfo){ return message('当前账户已冻结或用户不存在无法操作', false); } $memberCoupon = $memberInfo->coupon; if($memberCoupon < $couponTotal){ return message('您的账户不足,请先充值', false,[],'10003'); } $data = [ 'aid'=> $aid, 'user_id'=> $userId, 'order_sn'=> get_order_num('B'), 'coupon'=> $coupon, 'coupon_give'=> $couponGive, 'gd_name'=> $gdName, 'ws_name'=> $wsName, 'xy_content'=> $xyContent, 'create_time'=> time(), 'status'=> 1, ]; // 扣款和处理 DB::beginTransaction(); if(!$this->memberModel::where(['id'=> $userId, 'status'=>1])->decrement('coupon', $couponTotal)){ DB::rollBack(); return message('账户扣除失败', false); } // 交易明细 $types = [1=>'代订', 2=>'助印',3=>'供奉']; $typeName = isset($types[$type])? $types[$type] : '参加寺院活动'; $tradeData = [ 'user_id'=> $userId, 'type'=> 1, 'money'=> $couponTotal, 'balance'=> $memberCoupon, 'create_time'=> time(), 'remark'=> "{$typeName}消费{$couponTotal}券", ]; if(!$this->tradeModel::insert($tradeData)){ DB::rollBack(); return message('交易处理失败', false); } // 报名记录 if(!$bid = $this->bookModel::insertGetId($data)){ DB::rollBack(); return message('报名处理失败', false); } DB::commit(); return message('活动报名成功', true, ['id'=> $bid]); } }