// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model\member; use app\common\enum\member\Action; use app\common\enum\member\AuditStatus; use app\common\model\member\DeductionManual as DeductionManualModel; use app\common\model\member\MemberCardsAction as MemberCardsActionModel; use app\store\model\User; /** * 金米粒手工扣减模型 * Class Service */ class DeductionManual extends DeductionManualModel { /** * 获取列表记录 * @param array $param * @return \think\Paginator * @throws \think\db\exception\DbException */ public function getList(array $param = []) { return $this->with(['user']) ->where($this->getFilter($param)) ->order(['audit_status'=>'asc','id'=>'desc']) ->paginate(); } /** * 获取查询条件 * @param array $param * @return array */ private function getFilter(array $param = []) { // 默认查询参数 $params = $this->setQueryDefaultValue($param, [ 'number' => '', 'betweenTime' => [], // 起止时间 'userId' => 0, 'auditStatus' => -1, ]); // 检索查询条件 $filter = []; //扣减单号 if(isset($params['number']) && !empty($params['number'])){ $filter[] = ['number', 'like', "%{$params['number']}%"]; } //申请时间 if (!empty($params['betweenTime'])) { $times = between_time_format($params['betweenTime']); $filter[] = ['create_time', '>=', $times['start_time']]; $filter[] = ['create_time', '<', $times['end_time']]; } //会员ID if(isset($params['userId']) && $params['userId']>0){ $filter[] = ['user_id', '=', $params['userId']]; } //审核状态 if(isset($params['auditStatus']) && $params['auditStatus']>-1){ $filter[] = ['audit_status', '=', $params['auditStatus']]; } return $filter; } /** * 新增记录 * @param array $data * @return false|int */ public function add(array $data) { $user = User::find($data['user_id']); if($user['gold_rice']<$data['score']){ $this->error = '金米粒不足'; return false; } //事物处理 $this->transaction(function () use ($data,$user) { //新增手工扣减记录 $this->save($data); // 新增操作行为日志 $actionData = [ 'target_type' => Action::DEDUCTION_MANUAL, 'audit_status' => AuditStatus::AUDIT_WAIT, 'audit_reason' => $data['audit_reason']??'', 'audit_user' => $data['audit_user'], 'audit_admin_id' => $data['audit_admin_id'], ]; MemberCardsActionModel::add($this['id'], $actionData); //冻结用户金米粒 $user['gold_rice_frozen'] += $data['score']; $user['gold_rice'] -= $data['score']; $user->save(); }); return true; } /** * 更新记录 * @param array $data * @return bool|int */ public function edit(array $data) { //判断合法性 if($this->audit_status!=AuditStatus::AUDIT_NO_PASS){ $this->error = '当前状态不能编辑'; return false; } $user = User::find($this['user_id']); if($user['gold_rice']<$data['score']){ $this->error = '金米粒不足'; return false; } //事物处理 $this->transaction(function () use ($data,$user) { //新增手工扣减记录 $this->save($data); // 新增操作行为日志 $actionData = [ 'target_type' => Action::DEDUCTION_MANUAL, 'audit_status' => $data['audit_status'], 'audit_reason' => $data['audit_reason']??'', 'audit_user' => $data['audit_user'], 'audit_admin_id' => $data['audit_admin_id'], ]; MemberCardsActionModel::add($data['id'], $actionData); //冻结用户金米粒 $user['gold_rice_frozen'] += $data['score']; $user['gold_rice'] -= $data['score']; $user->save(); }); return true; } /** * 审核记录 * @param array $data * @return bool|int */ public function audit(array $data) { //申请不处于待审核 if($this->audit_status!=AuditStatus::AUDIT_WAIT){ $this->error = '当前状态不能审核'; return false; } //事物处理 $this->transaction(function () use ($data) { //新增手工扣减记录 $this->save($data); // 新增操作行为日志 $actionData = [ 'target_type' => Action::DEDUCTION_MANUAL, 'audit_status' => $data['audit_status'], 'audit_reason' => $data['audit_reason']??'', 'audit_user' => $data['audit_user'], 'audit_admin_id' => $data['audit_admin_id'], ]; MemberCardsActionModel::add($data['id'], $actionData); if($data['audit_status']==AuditStatus::AUDIT_NO_PASS){//审核不通过 //归还冻结的用户金米粒 User::setIncDecByField($this['user_id'],['gold_rice'=>$this['score']],['gold_rice_frozen'=>$this['score']]); } if($data['audit_status']==AuditStatus::AUDIT_PASS){//审核通过 //扣除冻结的用户金米粒 User::setDecByField($this['user_id'],'gold_rice_frozen',$this['score']); //写金米粒出账记录 GoldRice::add($this['user_id'],$this['number'],'手工扣减',(int)$this['score'],0); } }); return true; } }