public function assign($order_id, $uid) { $field = 'u.uid,u.mobile,u.uname,u.realname,u.status,s.status salesman_status'; $user = M()->table('zj_loan_salesman s')->where(['s.uid' => $uid])->join('zj_user u on u.uid=s.uid')->field($field)->find(); if (!$user) { return $this->_error('找不到此业务员信息!'); } if ($user['status'] != 1) { return $this->_error('此账号已被禁用!'); } $order = M('loan_order')->field('id,title')->find($order_id); if (!$user) { return $this->_error('找不到此订单信息!'); } // 解除订单的指派人 $history = $this->where(['order_id' => $order_id])->find(); if ($history) { if ($history['uid'] == $uid) { return $this->_error('禁止重复指派!'); } if ($history['is_lend'] > 0) { return $this->_error('已放款,禁止指派!'); } $this->where(['order_id' => $order_id])->delete(); } $this->add(['created' => time(), 'order_id' => $order_id, 'uid' => $user['uid']]); $message = '有新待审订单,请及时处理:' . $order['id'] . ',' . $order['title']; sms($user['mobile'], $message, '指尖分期'); app_push($user['uid'], ['order_id' => $order_id, 'title' => '有新待审订单,请及时处理!', 'content' => $order['id'] . ',' . $order['title']], 'zjsd'); $login_user = get_user(); M('loan_order_remark')->add(['order_id' => $order_id, 'created' => time(), 'uid' => $login_user ? $login_user['uid'] : 0, 'uname' => $login_user ? $login_user['uname'] : '', 'content' => '指派业务员:' . $user['realname'] ?: $user['uname']]); return true; }
/** * 提前还款 - 部分月份或全部月份(金额由系统固定计算) * * @param string $order_id 订单编号 * @param int $month 还款期数(默认为为0,表示全部) * @param int $money 还款金额(用于验证还款金额是否正确,默认为null,表示返回应还款金额) * @param int $pay_type 还款类型:0(默认)管理员手工;1系统自动-来自支付宝;2系统自动-来自桂林银行 * @param string $pay_trade_no 支付交易单号 */ public function repayAll($order_id, $month = 0, $money = null, $pay_type = 0, $pay_trade_no = '') { $user = $pay_type > 0 ? ['uid' => 0, 'uname' => '系统'] : get_user(); if (!$user) { return $this->_error('无法读取当前操作人信息!'); } // 获取订单并判断状态 $orderModel = new \Loan\Model\OrderModel(); $order = $orderModel->find($order_id); if (!$order) { return $this->_error('订单不存在!'); } if (!in_array($order['status'], $orderModel->allowRepayStatus($pay_type == 0))) { return $this->_error('当前订单状态不允许执行还款!'); } if ($order['is_allow_prepayment'] < 1) { return $this->_error('此订单不允许提前还款!'); } // 获取正常手续费 $money_fee = $order['month_fee']; $time_limit = strtotime(date('Y-m-d 00:00:00')); // 获取所有未还的账单 $bills = $this->where(['order_id' => $order_id, 'issue' => ['gt', 0], 'status' => ['in', '0,1']])->order('issue')->select(); if (!$bills) { return $this->_error('找不到账单信息!'); } $max_month = count($bills); // 如果为0,则表示一次性还款 if ($month <= 0) { $month = $max_month; } // 判断还款期数是否超出限制 if ($month > $max_month) { return $this->_error('操作期数大于最大未还期数:' . count($bills)); } // 判断应急包业务,若在第一期到期日之前一次性还款,则免收任何费用 $is_payee_user = $order['type'] == 2 && $month == $max_month && time() < $this->where(['order_id' => $order_id, 'issue' => ['gt', 0]])->min('return_limit_time'); // 计算应还款金额 $need_repay_money = 0; $have_repay_fee = false; foreach ($bills as $pos => $bill) { // 应急包一次性还款类型,仅算本金 if ($is_payee_user) { $need_repay_money += $bill['money_principal'] - $bill['return_money']; continue; } if ($bill['return_limit_time'] < $time_limit) { // 已到期,收取:本金、手续费、滞纳金 $need_repay_money += $bill['money_total'] - $bill['return_money']; } else { // 未到期 if (APP_STATUS != 'product' && $order['created'] >= strtotime('2015-12-09')) { // 非生产环境,且创建时间大于某个标准,则采用新标准 $need_repay_money += $bill['money_principal'] - $bill['return_money']; $fee_rate = $month == $max_month ? 0.3 : 0.5; $need_repay_money += $bill['money_fee'] * $fee_rate; } else { // 旧版标准,收取:本金 + 一笔手续费 $need_repay_money += $bill['money_principal'] - $bill['return_money']; if (!$have_repay_fee) { $need_repay_money += $money_fee; $have_repay_fee = true; } } } if ($pos + 1 >= $month) { break; } } // 只想获取金额 if ($money === null) { return $need_repay_money; } // 正式开始处理还款 if (bccomp($money, $need_repay_money) != 0 || $money <= 0) { return $this->_error("还款金额有误!"); } // 确认是要还款,算一下这次一共要花多少钱,并验证输入的$money是否与实际符合 $have_repay_money = 0; $have_repay_fee = false; // 开启事务,逐个账单进行处理 $this->startTrans(); $now = time(); // 新增订单日志 M('loan_order_log')->add(['order_id' => $order_id, 'created' => $now, 'uid' => $user['uid'], 'uname' => $user['uname'], 'status' => $order['status'], 'action' => '提前' . ($month < $max_month ? '部分' : '全部') . $month . '期还款', 'remark' => $this->_payTypeName($pay_type) . '还款:' . number_format($money, 2, '.', '')]); // 处理每一个账单 foreach ($bills as $pos => $bill) { // 验证统计字段 if (bccomp($bill['money_total'], $bill['money_principal'] + $bill['money_fee'] + $bill['money_delay'], 2) != 0) { $this->rollback(); system_warn('检测到账单money_total字段异常!'); return $this->_error('检测money_total字段存在异常,请检查!'); } if ($is_payee_user) { $bill_repay_money = $bill['money_principal'] - $bill['return_money']; } else { if ($bill['return_limit_time'] < $time_limit) { // 已逾期,把服务费/滞纳金一起算上 $bill_repay_money = $bill['money_total'] - $bill['return_money']; } else { // 未到期 if (APP_STATUS != 'product' && $order['created'] >= strtotime('2015-12-09')) { // 非生产环境,且创建时间大于某个标准,则采用新标准 $bill_repay_money = $bill['money_principal'] - $bill['return_money']; $fee_rate = $month == $max_month ? 0.3 : 0.5; $bill_repay_money += $bill['money_fee'] * $fee_rate; } else { // 旧版标准,收取:本金 + 一笔手续费 $bill_repay_money = $bill['money_principal'] - $bill['return_money']; if (!$have_repay_fee) { $bill_repay_money += $money_fee; $have_repay_fee = true; } } } } if ($this->where(['order_id' => $order_id, 'issue' => $bill['issue'], 'return_money' => $bill['return_money'], 'status' => $bill['status']])->save(['status' => 2, 'return_time' => $now, 'return_money' => $bill['return_money'] + $bill_repay_money]) != 1) { $this->rollback(); return $this->_error('更新账单操作失败,请稍后重试!'); } // 新增支付日志 M('loan_bill_pay')->add(['order_id' => $order_id, 'issue' => $bill['issue'], 'created' => $now, 'type' => $pay_type, 'trade_no' => $pay_trade_no, 'money' => $bill_repay_money]); // 还款完成后续操作 $bill['return_money'] += $bill_repay_money; if (!$this->_finish($user, $order, $bill)) { $this->rollback(); return false; } // 增加本次所用金额 $have_repay_money += $bill_repay_money; // 判断是否已处理完 if ($pos + 1 >= $month) { break; } } if (bccomp($have_repay_money, $money, 2) != 0) { $this->rollback(); return $this->_error("提交金额[{$money}]与实际扣除金额[{$have_repay_money}]不符!"); } // 更新资金流 $orderModel->moneyFlow(2, $order_id, 0, $money, $user, $pay_trade_no); // 提交事务 $this->commit(); // 提醒短信 if ($pay_type == 0) { $this->_sms($order['uid'], $money); } $content = '您的账单' . $order['id'] . ',' . $order['title'] . ',第'; $content .= $bills[0]['issue'] . '-' . ($bills[0]['issue'] + $month - 1); $content .= '期账款' . number_format($money, 2) . '元已确认还款,感谢您对我们的支持。'; app_push($order['uid'], ['title' => '您已成功还款!', 'content' => $content]); // 还款完成后处理 $orderModel->where(['id' => $order_id, 'status' => $orderModel::STATUS_FINISH_SUCCESS])->count() && $this->_after_success($order); return true; }