SignsService.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Laravel框架 [ Laravel ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 Laravel研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: wesmiler <12345678@qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services;
  12. use App\Models\MemberModel;
  13. use App\Models\SignCatesModel;
  14. use App\Models\SignsModel;
  15. use App\Models\SiyuanModel;
  16. use App\Models\TradeModel;
  17. /**
  18. * 打卡签到管理-服务类
  19. * @author wesmiler
  20. * @since 2020/11/11
  21. * Class SignsService
  22. * @package App\Services
  23. */
  24. class SignsService extends BaseService
  25. {
  26. /**
  27. * 构造函数
  28. * @author wesmiler
  29. * @since 2020/11/11
  30. * SignsService constructor.
  31. */
  32. public function __construct()
  33. {
  34. $this->model = new SignsModel();
  35. }
  36. /**
  37. * 获取列表
  38. * @return array
  39. * @since 2020/11/11
  40. * @author wesmiler
  41. */
  42. public function getList()
  43. {
  44. $params = request()->all();
  45. $page = isset($params['pageSize']) ? intval($params['pageSize']) : PAGE;
  46. $pageSize = isset($params['pageSize']) ? intval($params['pageSize']) : PERPAGE;
  47. $dataList = $this->model::from('signs as s')
  48. ->leftJoin('sign_cates as sc', 'sc.id', '=', 's.cate_id')
  49. ->leftJoin('member as m', 'm.id', '=', 's.user_id')
  50. ->where(function ($query) use ($params) {
  51. $query->where('s.mark', 1);
  52. $type = isset($params['type'])? $params['type'] : 0;
  53. if($type>0){
  54. $query->where('s.type', $type);
  55. }
  56. $status = isset($params['status']) ? $params['status'] : 0;
  57. if ($status > 0) {
  58. $query->where('s.status', $status);
  59. } else {
  60. $query->whereIn('s.status', [1, 2]);
  61. }
  62. })
  63. ->where(function ($query) use ($params) {
  64. $keyword = isset($params['keyword']) ? trim($params['keyword']) : '';
  65. if (!empty($keyword)) {
  66. $query->where('m.nickname','like',"%{$keyword}%");
  67. }
  68. })
  69. ->select(['s.id', 's.user_id','s.cate_id', 'sc.name as cate_name', 'm.nickname', 's.sign_at', 's.type', 's.status', 's.create_time', 's.update_time', 's.description'])
  70. ->orderBy('s.sign_at', 'desc')
  71. ->orderBy('s.cate_id')
  72. ->paginate($pageSize);
  73. $dataList = $dataList ? $dataList->toArray() : [];
  74. if ($dataList) {
  75. foreach ($dataList['data'] as &$item) {
  76. $item['create_time'] = $item['create_time'] ? datetime($item['create_time'],'Y-m-d H:i:s') : '';
  77. }
  78. unset($item);
  79. }
  80. return [
  81. 'code' => 0,
  82. 'success'=> true,
  83. 'msg' => '操作成功',
  84. 'count' => isset($dataList['total']) ? $dataList['total'] : 0,
  85. 'data' => isset($dataList['data']) ? $dataList['data'] : 0,
  86. ];
  87. }
  88. /**
  89. * 添加或编辑
  90. * @return array
  91. * @since 2020/11/11
  92. * @author wesmiler
  93. */
  94. public function edit()
  95. {
  96. $data = request()->all();
  97. $data['update_time'] = time();
  98. return parent::edit($data); // TODO: Change the autogenerated stub
  99. }
  100. /**
  101. * 打卡
  102. * @param $userId
  103. * @return array
  104. */
  105. public function submit($userId){
  106. $params = request()->all();
  107. $type = isset($params['type'])? $params['type'] : 0;
  108. $cateId = isset($params['cate_id'])? $params['cate_id'] : 0;
  109. $siyuanId = isset($params['siyuan_id'])? $params['siyuan_id'] : 0;
  110. if(!in_array($type, [1,2])){
  111. return message('打开类型参数错误', false);
  112. }
  113. $cateInfo = SignCatesModel::where(['id'=> $cateId,'mark'=> 1,'status'=> 1])
  114. ->select(['id','name'])
  115. ->first();
  116. if($cateId <=0 || !$cateInfo){
  117. return message('打卡分类参数错误或不存在', false);
  118. }
  119. $siyuanInfo = SiyuanModel::where(['id'=> $siyuanId,'mark'=> 1,'status'=> 1])
  120. ->select(['id','title','status'])
  121. ->first();
  122. if(!$siyuanInfo){
  123. return message('打卡寺院不存在或不可操作', false);
  124. }
  125. // 验证用户是否可操作
  126. $memberInfo = MemberModel::where(['id' => $userId, 'mark' => 1, 'status' => 1])
  127. ->select('id', 'openid', 'nickname','coupon','salary')
  128. ->first();
  129. if (!$memberInfo) {
  130. return message('您的账号已被冻结或不可操作,请联系客服', false);
  131. }
  132. if(time() < strtotime(date('Y-m-d 08:00')) || time() > strtotime(date('Y-m-d 20:00'))){
  133. return message('每天8:00~20:00时间段才可打卡,请联系客服', false);
  134. }
  135. // 验证今天是否签到过
  136. $checkInfo = [];
  137. $where = ['type'=> $type,'user_id'=> $userId, 'siyuan_id'=> $siyuanId,'mark'=> 1,'status'=> 1];
  138. if(in_array($cateId, [1,2])){
  139. $checkInfo = SignsModel::where($where)->whereIn('cate_id',[1,2])
  140. ->where('sign_at','>=', date('Y-m-d'))
  141. ->select(['id','sign_at','cate_id'])
  142. ->orderBy('sign_at','desc')
  143. ->first();
  144. if($checkInfo && $checkInfo->cate_id == $cateId){
  145. return message('您最近已经打过'.$cateInfo->name.'卡,请先联系客服', false);
  146. }
  147. if($cateId == 2 && !$cateInfo){
  148. return message('请先完成上班打卡,才能打下班卡', false);
  149. }
  150. }else if(in_array($cateId, [3,4])){
  151. $checkInfo = SignsModel::where($where)->whereIn('cate_id',[3,4])
  152. ->where('sign_at','>=', date('Y-m-d'))
  153. ->select(['id','sign_at','cate_id'])
  154. ->orderBy('sign_at','desc')
  155. ->first();
  156. if($checkInfo && $checkInfo->cate_id == $cateId){
  157. return message('您最近已经打过'.$cateInfo->name.'卡,请先联系客服', false);
  158. }
  159. if($cateId == 4 && !$cateInfo){
  160. return message('请先完成上课打卡,才能打下课卡', false);
  161. }
  162. }
  163. // 每天同类型打卡最多次数
  164. $signCount = ConfigService::make()->getConfigByCode('sign_count');
  165. $signCount = $signCount>0? $signCount : 1;
  166. $checkCount = SignsModel::where($where)->where('cate_id', $cateId)
  167. ->where('sign_at','>=', date('Y-m-d'))
  168. ->count('id');
  169. if($checkCount >= $signCount){
  170. return message("该类型打卡每天最多{$signCount}次", false);
  171. }
  172. // 打卡处理
  173. $signCheck = ConfigService::make()->getConfigByCode('sign_check');
  174. $signCheck = $signCheck? $signCheck : 1;
  175. \DB::beginTransaction();
  176. $data = [
  177. 'user_id'=> $userId,
  178. 'cate_id'=> $cateId,
  179. 'siyuan_id'=> $siyuanId,
  180. 'sign_at'=> date('Y-m-d H:i'),
  181. 'description'=> isset($params['description'])? trim($params['description']) : '',
  182. 'update_time'=> time(),
  183. 'create_time'=> time(),
  184. 'status'=> in_array($cateId, [1,2])? $signCheck : 1,
  185. ];
  186. if(!$this->model::insertGetId($data)){
  187. \DB::rollBack();
  188. return message('打卡失败', false);
  189. }
  190. // 义工上班结算
  191. $signSettle = ConfigService::make()->getConfigByCode('sign_settle');
  192. $signSettle = $signSettle>0? $signSettle : false;
  193. if($type == 2 && $cateId == 2 && $signSettle){
  194. $yigongSalary = ConfigService::make()->getConfigByCode('yg_salary');
  195. $signStartTime = isset($checkInfo['sign_at']) && $checkInfo['sign_at']? strtotime($checkInfo['sign_at']) : 0;
  196. $signEndTIme = strtotime(date('Y-m-d H:i'));
  197. $signTime = moneyFormat(($signEndTIme - $signStartTime)/3600, 2);
  198. $salary = moneyFormat($signTime * $yigongSalary, 2);
  199. if($salary>0){
  200. if(!MemberModel::where(['id'=> $userId,'mark'=> 1])->increment('salary',$salary)){
  201. \DB::rollBack();
  202. return message('打卡工资结算失败', false);
  203. }
  204. $data = [
  205. 'user_id'=> $userId,
  206. 'type'=> 7,
  207. 'coin_type'=> 2,
  208. 'pay_type'=> 1,
  209. 'money'=> $salary,
  210. 'change_type'=> 1,
  211. 'balance'=> $memberInfo->salary? $memberInfo->salary : 0,
  212. 'create_time'=> time(),
  213. 'remark'=> '打卡工资结算',
  214. 'status'=> 1
  215. ];
  216. if(!TradeModel::insertGetId($data)){
  217. \DB::rollBack();
  218. return message('打卡工资结算处理失败', false);
  219. }
  220. }
  221. }
  222. \DB::commit();
  223. return message('打卡成功', true);
  224. }
  225. }