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;
 }
示例#2
0
 /**
  * 提前还款 - 部分月份或全部月份(金额由系统固定计算)
  *
  * @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;
 }