public function update_order_finance($id, $order_id = 0)
 {
     // 获取商铺的财务信息
     $company = $this->find($id);
     if (!$company) {
         $this->error = '找不到此商铺信息!';
         return false;
     }
     // 获取目标订单
     if ($order_id <= 0) {
         // 获取商铺所关联的待审核订单
         $orderModel = new \Loan\Model\OrderModel();
         $order_ids = $orderModel->where(['company_id' => $id, 'status' => ['in', [$orderModel::STATUS_UNCONTRACT, $orderModel::STATUS_UNCHECK]]])->getField('id', true);
     } else {
         $order_ids = [$order_id];
     }
     if (!$order_ids) {
         return true;
     }
     foreach ($order_ids as $order_id) {
         // 判断财务打款状态
         $finance = M('loan_order_finance')->where(['order_id' => $order_id])->find();
         if (!$finance) {
             return $this->_error('找不到此订单财务记录!');
         }
         if ($finance['lend_status'] != 0) {
             return $this->_error('财务已打款,禁止修改商家信息!');
         }
         if ($finance['is_allow_lend'] != 0) {
             return $this->_error('财务已同意打款,禁止修改商家信息!');
         }
         M('loan_order_finance')->where(['order_id' => $order_id])->save(['payee_account' => $company['payee_account'], 'payee_name' => $company['payee_name'], 'payee_bank' => $company['payee_bank'], 'payee_bank_id' => $company['payee_bank_id'], 'payee_user_type' => $company['payee_user_type'], 'payee_bank_type' => $company['payee_bank_type']]);
     }
     return true;
 }
 public function index()
 {
     $orderModel = new \Loan\Model\OrderModel();
     // 所属位置:校区或城市
     $where_location = ' ( campus_id in (select campus_id from zj_loan_salesman_scope where uid=' . $this->_user['uid'] . ')';
     $where_location .= ' OR city_id in (select city_id from zj_loan_salesman_scope where uid=' . $this->_user['uid'] . ') )';
     // 特派订单
     $where_salesman = ' id in (select order_id from zj_loan_order_salesman where uid=' . $this->_user['uid'] . ')';
     if ($this->_salesman['type_id'] == 1) {
         $where_base = $where_salesman . ' and created >= ' . strtotime('-3 day');
     } else {
         if ($this->_salesman['type_id'] == 2) {
             $where_base = $where_salesman . ' and created >= ' . strtotime('-7 day');
         } else {
             if ($this->_salesman['type_id'] == 3) {
                 $where_base = $where_salesman;
             } else {
                 $where_base = $where_location . ' and created >= ' . strtotime('-30 day');
             }
         }
     }
     // 可抢单列表
     $this->assign('total_unsales', $orderModel->where(['status' => ['in', [$orderModel::STATUS_UNCONTRACT, $orderModel::STATUS_UNCHECK]], 'id' => ['exp', ' not in (select order_id from zj_loan_order_salesman)'], '_string' => $where_location])->count());
     // 所有特派订单
     $this->assign('total_all', $orderModel->where($where_base)->count());
     // 未审核通过
     $this->assign('total_uncheck', ['my' => $orderModel->where(['check_status' => 0, 'status' => ['neq', $orderModel::STATUS_CLOSED]])->where($where_base . ' and id in (select order_id from zj_loan_order_salesman where uid=' . $this->_user['uid'] . ' and status=0) ')->count(), 'apply' => $orderModel->where(['check_status' => 0, 'status' => ['neq', $orderModel::STATUS_CLOSED]])->where($where_base . ' and id in (select order_id from zj_loan_order_salesman where uid=' . $this->_user['uid'] . ' and status=1)')->count(), 'failure' => $orderModel->where(['status' => $orderModel::STATUS_CHECK_FAILURE])->where($where_base)->count()]);
     // 已审核,等待首付
     $this->assign('total_unpay', $orderModel->where(['status' => $orderModel::STATUS_UNPAY])->where($where_base)->count());
     // 未放款总数
     $this->assign('total_unlend', $orderModel->where(['check_status' => 1, 'lend_status' => 0, 'status' => ['neq', $orderModel::STATUS_CLOSED]])->where($this->_salesman['type_id'] == 4 ? $where_location : $where_salesman)->count());
     // 已放款总数
     $this->assign('total_lended', $orderModel->where(['check_status' => 1, 'lend_status' => ['neq', 0]])->where($where_base)->count());
     $this->assign('total_close', $orderModel->where(['status' => $orderModel::STATUS_CLOSED])->where($where_base)->count());
     $this->display();
 }
 public function detail()
 {
     $orderModel = new \Loan\Model\OrderModel();
     // 商家类型
     $where = ['id' => I('id')];
     if ($this->_salesman['type_id'] == 3) {
         $where['_string'] = ' id in (select order_id from zj_loan_order_salesman where uid=' . $this->_user['uid'] . ') ';
     }
     $order = $orderModel->where($where)->find() or $this->error('找不到此订单信息!');
     int_to_string($order, ['type' => $orderModel->getType(), 'status' => $orderModel->getStatus()]);
     // 检查订单用户认证状态
     $where = ['uid' => $order['uid']];
     if (M('loan_user')->where($where)->count()) {
         $user_auth_text = '个人认证(已通过)';
     } else {
         $contract_status = M('loan_user_contract')->where($where)->getField('status');
         if ($contract_status === null) {
             $user_auth_text = '个人认证(未提交资料)';
         } elseif ($contract_status == 0) {
             // 检查提交资料是否完善
             $user_auth = M('loan_user_contract_auth')->where($where)->getField('auth_id', true);
             if ($user_auth) {
                 $auth_config = M('loan_config_auth')->where('type=1 and status=1 and is_required=1')->getField('id', true);
                 foreach ($auth_config as $key => $id) {
                     if (in_array($id, $user_auth)) {
                         unset($auth_config[$key]);
                     }
                 }
                 if ($auth_config) {
                     $user_auth_text = '个人认证(待完善资料)';
                 } else {
                     $user_auth_text = '个人认证(等待审核)';
                 }
             } else {
                 $user_auth_text = '个人认证(未提交资料)';
             }
         } elseif ($contract_status == 2) {
             $user_auth_text = '个人认证(审核不通过)';
         }
     }
     $this->assign('user_auth_text', $user_auth_text);
     // 检查订单签约状态
     $where = ['order_id' => $order['id']];
     $order_auth = M('loan_order_auth')->where($where)->getField('auth_id', true);
     if ($order_auth) {
         $auth_config = M('loan_config_auth')->where('type=2 and status=1 and is_required=1')->getField('id', true);
         if ($auth_config) {
             foreach ($auth_config as $key => $id) {
                 if (in_array($id, $order_auth)) {
                     unset($auth_config[$key]);
                 }
             }
             $order_auth_text = '订单签约(待完善资料)';
         } else {
             $order_auth_text = '订单签约(等待审核)';
         }
     } else {
         $order_auth_text = '订单签约(未提交资料)';
     }
     $this->assign('order_auth_text', $order_auth_text);
     // 验证特派的状态
     $order_salesman = M('loan_order_salesman')->where(['order_id' => $order['id']])->find();
     if ($order_salesman) {
         $order_salesman['uname'] = get_user($order_salesman['uid'])['uname'];
     }
     $this->assign('order_salesman', $order_salesman);
     $this->assign('order_salesman_status', $order_salesman ? $order_salesman['status'] : -1);
     // 是否允许转派给别人
     $this->assign('allow_special_salesman', $order['type'] == 2 && (!$order_salesman || $order_salesman['uid'] == $this->_user['uid']));
     // 是否允许关闭
     $this->assign('allowClose', false);
     $this->assign('order', $order);
     $this->assign('orderModel', $orderModel);
     $this->display();
 }
Beispiel #4
0
 /**
  * 取消还款
  *
  * @param int $order_id 订单号
  * @param mixed $issue 期数,字符串all表示取消全部还款,其它为数字,表示指定一期
  */
 public function repayCancel($order_id, $issue)
 {
     $user = get_user();
     if (!$user) {
         return $this->_error('无法读取当前操作人信息!');
     }
     // 获取订单并判断状态
     $orderModel = new \Loan\Model\OrderModel();
     $order = $orderModel->find($order_id);
     if (!$order) {
         return $this->_error('订单不存在!');
     }
     // 判断借款人
     $loan_user = get_user($order['uid']);
     if (!$loan_user) {
         return $this->_error('无法读取借款人信息!');
     }
     // 取消提前部分/全部还款
     if ($issue === 'part' || $issue == 'all') {
         $check_status = $issue == 'part' ? [$orderModel::STATUS_DELIVERY, $orderModel::STATUS_REPAY, $orderModel::STATUS_FINISH_SUCCESS] : [$orderModel::STATUS_FINISH_SUCCESS];
         if (!in_array($order['status'], $check_status)) {
             return $this->_error('当前订单状态不允许执行取消还款!');
         }
         $log = M('loan_order_log')->where(['order_id' => $order_id, 'action' => $issue == 'part' ? [['like', '提前部分%'], ['like', '提前全部%期还款'], 'or'] : '提前全部还款'])->order('id desc')->find();
         if (!$log) {
             return $this->_error('找不到还款操作日志!');
         }
         $total_money = explode(':', $log['remark'])[1] + 0;
         if ($total_money <= 0) {
             return $this->_error('无法读取操作的还款金额!');
         }
         // 根据操作时间读取当时操作的账单
         $bills = $this->where(['order_id' => $order_id, 'status' => 2, 'return_time' => $log['created']])->select();
         if (!$bills) {
             return $this->_error('无法读取当初操作的账单!');
         }
         // 判断订单涉及到的总金额
         $total_bill_money = 0;
         $total_money_principal = 0;
         $total_money_fee = 0;
         foreach ($bills as $vo) {
             $total_bill_money += $vo['return_money'];
             $total_money_principal += $vo['money_principal'];
             $total_money_fee += max(0, $vo['return_money'] - $vo['money_principal']);
         }
         if (bccomp($total_bill_money, $total_money, 2) != 0) {
             return $this->_error('账单还款金额[' . $total_bill_money . ']与操作日志金额[' . $total_money . ']不符,请联系技术改进!');
         }
         // 读取资金记录,判断金额
         $last_money_log = M('loan_money')->where(['type' => ['in', '2,3'], 'order_id' => $order_id, 'issue' => 0])->order('id desc')->field('id,money')->find();
         if (!$last_money_log) {
             return $this->_error('找不到资金记录编号!');
         }
         if (bccomp($last_money_log['money'], $total_money, 2) != 0) {
             return $this->_error('日志还款金额[' . $last_money_log['money'] . ']与资金记录金额[' . $total_money . ']不一致!');
         }
         // 开启事务,逐个账单进行处理
         $this->startTrans();
         $now = time();
         // 更新账单信息
         $this->where(['order_id' => $order_id, 'status' => 2, 'return_time' => $log['created']])->save(['status' => 0, 'return_time' => 0, 'return_money' => 0]);
         // 更新用户已归还金额(仅限本金)
         M('loan_user')->where('uid=' . $order['uid'])->setDec('total_money_return', $total_money_principal);
         M('loan_user')->where('uid=' . $order['uid'])->setDec('total_money_remain', $total_money_principal);
         // 更新 - 金额统计
         if ($total_money_fee > 0) {
             $statModel = new \Loan\Model\StatModel();
             $statModel->update($statModel::TYPE_ORDER_MONEY_FEE, $loan_user['university_id'], $total_money_fee * -1, $log['created']);
         }
         // 更新 - 订单最后还款期号和已还款金额
         if (!$orderModel->where(['id' => $order_id, 'status' => $order['status']])->save(['status' => $log['status'], 'last_bill_issue' => ['exp', '(select min(issue) from zj_loan_bill where order_id=id and status in (0,1))'], 'loan_money_return' => ['exp', 'loan_money_return-' . $total_money_principal]])) {
             return $this->_error('更新账单状态失败,请刷新后重试!', true);
         }
         // 新增订单日志
         M('loan_order_log')->add(['order_id' => $order_id, 'created' => $now, 'uid' => $user['uid'], 'uname' => $user['uname'], 'status' => $order['status'], 'action' => '取消' . $log['action'], 'remark' => '共' . count($bills) . '期,原提前还款金额' . $total_money . '元,涉及本金:' . $total_money_principal . '元']);
         // 删除资金记录
         M('loan_money')->where(['id' => $last_money_log['id']])->delete();
         // 删除账单支付记录
         M('loan_bill_pay')->where(['order_id' => $order_id, 'created' => $log['created']])->delete();
         // 订单金融数据
         M('loan_order_finance')->where(['order_id' => $order_id])->setDec('return_money', $total_money);
         // 提交事务
         $this->commit();
         return true;
     }
     // 指定某一期
     $issue = intval($issue);
     if ($issue < 1) {
         return $this->_error('还款期数必需大于0!');
     }
     if (!in_array($order['status'], [$orderModel::STATUS_DELIVERY, $orderModel::STATUS_LEND, $orderModel::STATUS_REPAY, $orderModel::STATUS_BREACH_CONTRACT, $orderModel::STATUS_FINISH_SUCCESS])) {
         return $this->_error('当前订单状态不允许执行取消还款!');
     }
     // 读取账单并判断状态
     $bill = $this->where(['order_id' => $order_id, 'issue' => $issue])->find();
     if (!$bill) {
         return $this->_error('找不到此账单信息!');
     }
     if (!in_array($bill['status'], [0, 2])) {
         return $this->_error('账单状态异常!');
     }
     // 所要取消的金额
     $total_money = $bill['return_money'];
     if ($total_money <= 0) {
         return $this->_error('此账单尚未还款!');
     }
     // 获取需要删除的支付日志
     $pay_logs = M('loan_bill_pay')->where(['order_id' => $order_id, 'issue' => $issue])->select();
     if (count($pay_logs) < 1) {
         return $this->_error('找不到账单支付记录!');
     }
     // 判断账单金额是否正确
     $pay_log_money = 0;
     foreach ($pay_logs as $pay_log) {
         $pay_log_money += $pay_log['money'];
     }
     if (bccomp($pay_log_money, $total_money, 2) != 0) {
         return $this->_error('账单支付日志总金额[' . $pay_log_money . ']与账单已返款金额[' . $total_money . ']不符!');
     }
     // 判断资金流金额是否正确
     $money_logs = M('loan_money')->where(['type' => ['in', '2,3'], 'order_id' => $order_id, 'issue' => $issue])->select();
     if (count($money_logs) < 1) {
         return $this->_error('找不到资金记录!');
     }
     $money_log_money = 0;
     foreach ($money_logs as $money_log) {
         $money_log_money += $money_log['money'];
     }
     if (bccomp($money_log_money, $total_money, 2) != 0) {
         return $this->_error('资金交易总金额[' . $money_log_money . ']与账单已返款金额[' . $total_money . ']不符!');
     }
     $now = time();
     // 更新 - 账单
     $this->startTrans();
     if (!$this->where(['order_id' => $order_id, 'issue' => $issue, 'status' => $bill['status']])->save(['status' => 0, 'return_time' => 0, 'return_money' => 0])) {
         $this->rollback();
         return $this->_error('操作失败,请稍后重试!');
     }
     // 删除支付日志
     M('loan_bill_pay')->where(['order_id' => $order_id, 'issue' => $issue])->delete();
     // 删除资金记录
     M('loan_money')->where(['type' => ['in', '2,3'], 'order_id' => $order_id, 'issue' => $issue])->delete();
     // 获取之前的状态,用于回退状态
     $before_status = M('loan_order_log')->where(['order_id' => $order_id])->order('id desc')->getField('status');
     // 新增订单日志
     M('loan_order_log')->add(['order_id' => $bill['order_id'], 'created' => $now, 'uid' => $user['uid'], 'uname' => $user['uname'], 'status' => $order['status'], 'action' => '取消还款', 'is_system' => 1, 'remark' => '第' . $issue . '期,金额:' . $total_money]);
     // 更新 - 订单状态
     if ($order['status'] == $orderModel::STATUS_FINISH_SUCCESS) {
         if (!$before_status || !$orderModel->where(['id' => $order_id, 'status' => $order['status']])->save(['status' => $before_status])) {
             $this->rollback();
             return $this->_error('更新账单状态失败,请联系技术检查!');
         }
     }
     // 账单从已还款变为未返款
     if ($bill['status'] == 2) {
         // 更新用户已归还金额(仅限本金)
         M('loan_user')->where('uid=' . $order['uid'])->setDec('total_money_return', $bill['money_principal']);
         M('loan_user')->where('uid=' . $order['uid'])->setDec('total_money_remain', $bill['money_principal']);
         // 更新 - 金额统计
         $money_fee = $bill['return_money'] - $bill['money_principal'];
         if ($money_fee > 0) {
             $statModel = new \Loan\Model\StatModel();
             $statModel->update($statModel::TYPE_ORDER_MONEY_FEE, $loan_user['university_id'], $money_fee * -1, $pay_log['created']);
         }
         // 更新 - 订单最后还款期号和已还款金额
         $orderModel->where(['id' => $order_id])->save(['loan_money_return' => ['exp', 'loan_money_return-' . $bill['money_principal']]]);
     }
     // 更新 - 订单最后还款期号
     $orderModel->where(['id' => $order_id])->save(['last_bill_issue' => ['exp', '(select min(issue) from zj_loan_bill where order_id=id and status in (0,1))']]);
     M('loan_order_finance')->where(['order_id' => $order_id])->setDec('return_money', $total_money);
     $this->commit();
     return true;
 }
 public function redPacket()
 {
     $orderModel = new \Loan\Model\OrderModel();
     $order_id = I('id');
     // 判断状态
     $order_status = $orderModel->where(['id' => $order_id])->getField('status') or $this->error('找不到此订单或状态异常!');
     in_array($order_status, [$orderModel::STATUS_FINISH_SUCCESS, $orderModel::STATUS_CLOSED]) and $this->error('此订单状态当前不允许发放红包!');
     // 判断是否已经有人领取了
     $model = M('loan_order_red_packet');
     $model->where(['order_id' => $order_id])->count() && $this->error('此订单已发放过红包!');
     // 判断接收人
     $uid = M('user')->where(['mobile' => I('mobile')])->getField('uid') or $this->error('找不到此手机号用户!');
     // 判断金额
     $money = I('money');
     $money > 0 or $this->error('请输入正确的红包金额!');
     $model->add(['order_id' => $order_id, 'uid' => $uid, 'created' => time(), 'money' => $money, 'status' => 0, 'op_uid' => $this->_user['uid'], 'op_uname' => $this->_user['uname']]);
     // 更新用户记录
     $userRPModel = D('UserRedPacket');
     $userRPModel->unfinish($uid, $money) or $this->error($userRPModel->getError());
     $this->success('发放红包成功!');
 }