where('id',$houseId) ->where('del',0)->find(); if(!$info||!$info['owner_id']||$info['enable']==0){ $this->error = '业主不存在或未绑定业主'; return false; } $owner = Db::name('owner')-> where('id',$info['owner_id']) ->where('del',0)->find(); if(!$owner){ $this->error = '业主不存在'; return false; } $this->startTrans(); try{ $data = [ 'org_id' => $orgId, 'last_time' => $lastDate, 'sn' => get_unique_id(), 'status' => 0, 'create_time' => getTime(), 'create_user_id' => $userId, 'money' => 0, 'owner_id' => $info['owner_id'], 'area_id' => $info['area_id'], 'pre_money' => 0, ]; $money = 0; foreach ($order as $k=>$v){ $money += $v['total_price']; } $lastMoney = 0; if($owner['money'] > $money){ $lastMoney = $owner['money'] - $money; $data['money'] = 0; $data['pre_money'] = $money; }else{ $data['money'] = round($money - $owner['money'],2); $data['pre_money'] = $owner['money']; } // 修改业主剩余金额 $res = Db::name('owner') ->where('id',$info['owner_id']) ->update( [ 'money' => $lastMoney, 'update_time'=>getTime() ]); if (!$res) { exception('业主余额修改失败'); } $payid = Db::name('house_pay')->insertGetId($data); if (!$res) { exception('保存记录失败'); } foreach ($order as $k=>$v){ $log = [ 'org_id' => $orgId, 'type' => $v['type'], 'bus_id' => $v['id'], 'fee_id' => $v['fee_id'], 'pay_id' => $payid, 'money' => $v['total_price'], 'start' => $v['start']?$v['start']:null, 'end' => $v['end']?$v['end']:null, 'remark' => $v['remark'] ]; $logid = Db::name('house_pay_log')->insertGetId($log); if (!$logid) { exception('操作失败'); } $months = $v['months']; if($months){ $lms = []; foreach ($months as $kk=>$vv){ $lms[] = [ 'log_id' => $logid, 'month' => $vv['year'].'-'.(strlen($vv['month']) == 1?'0'.$vv['month']:$vv['month']), 'money' => $vv['money'] ]; } $res = Db::name('house_pay_log_money') ->insertAll($lms); if (!$res) { exception('操作失败'); } } } $this->commit(); return $payid; }catch (Exception $e){ $this->error = $e->getmessage(); $this->rollback(); return false; } } public function show_info($id){ $info = $this->where('id',$id) ->where('del',0)->find(); if($info){ $info['pay_data'] = $info['pay_data']?json_decode($info['pay_data'],true):[]; $info['xq_title'] = $this->getTableField('house_areas',['id'=>$info['area_id']],'title'); $info['full_name'] = $this->getTableField('owner',['id'=>$info['owner_id']],'name'); $info['full_money'] = $this->getTableField('owner',['id'=>$info['owner_id']],'money'); $logs = Db::name('house_pay_log') ->where('pay_id',$id)->select(); $titles = []; $ids = []; foreach ($logs as $k=>$v){ $logs[$k]['full_title'] = $this->getTableField('house_view',['id'=>$v['bus_id']],'full_title'); if(!in_array($v['bus_id'],$ids)){ $ids[] = $v['bus_id']; $house = Db::name('house')->where('id',$v['bus_id']) ->find(); if($house && $house['cate'] == 1){ $titles[] = '[住房]'.$house['title']; }else if($house && $house['cate'] == 2){ $titles[] = '[商铺]'.$house['title']; }else if($house && $house['cate'] == 3){ $titles[] = '[营业房]'.$house['title']; }else if($house && $house['cate'] == 4){ $titles[] = '[储藏室]'.$house['title']; }else if($house && $house['cate'] == 5){ $titles[] = '[停车位]'.$house['title']; } } $logs[$k]['cate'] = $this->getTableField('house_view',['id'=>$v['bus_id']],'cate'); $logs[$k]['fee_title'] = $this->getTableField('house_fee',['id'=>$v['fee_id']],'title'); } $info['logs'] = $logs?$logs:[]; $info['titles'] = implode(',',$titles); $info['dx_money'] = $this->convertamounttocn($info['true_money']); } return $info; } public function paysave($post,$userId){ $info = $this ->where('id',$post['id']) ->where('del',0) ->find(); if(!$info){ $this->error = '记录不存在'; return false; } if($info['status'] == 1){ $this->error = '该记录已缴费'; return false; } if($info['create_user_id'] != $userId){ $this->error = '无权限操作'; return false; } if($post['true_money'] < $info['money']){ $this->error = '实收金额必须大于等于总金额'; return false; } $dymoney = $post['true_money'] - $info['money']; // 多余的存入预付款 $premoney = $this->getTableField('owner',['id'=>$info['owner_id']],'money'); // 剩余预付款 $premoney = $premoney?$premoney:0; $lastmoney = round($dymoney + $premoney,2); //当前剩余预付款 $this->startTrans(); try{ $data = [ 'status' => 1, 'remark' => $post['remark'], 'pay_time' => $post['pay_time'], 'pay_type' => $post['pay_type'], 'true_money' => $post['true_money'], 'last_pre_money' => $lastmoney, 'payee' => $post['payee'], 'pay_data' => $post['pay_data'] ]; $ret = $this->where('id',$post['id']) ->update($data); if (!$ret) { exception('操作失败'); } $ret = Db::name('owner')->where('id',$info['owner_id']) ->update( [ 'money' => $lastmoney, 'update_time'=>getTime() ]); if (!$ret) { exception('操作失败'); } $this->commit(); return true; }catch (Exception $e){ $this->error = $e->getmessage(); $this->rollback(); return false; } } // 返销 public function cancel($post,$id,$userId){ $info = $this->where('id',$id)->find(); if(!$info||$info['del'] == 1){ $this->error = '记录不存在'; return false; } if($info['status'] == 2||$info['status'] == 3){ $this->error = '缴费单已返销'; return false; } $ret = $this->checkfinish($id); if($ret){ $this->error = '已扎帐缴费单不能返销'; return false; } $this->startTrans(); try{ $data = [ 'cancel_reason' => isset($post['cancel_reason'])?$post['cancel_reason']:'', ]; if($info['status'] == 0){ //未缴费可直接返销 $data['cancel_user_id'] = $userId; $data['cancel_time'] = getTime(); $data['status'] = 3; $data['is_cancel'] = 2; }else{ // 已缴费需要财务审核返销 $data['status'] = 2; $data['cancel_user_id'] = 0; $data['cancel_time'] = null; $data['is_cancel'] = 1; } $ret = $this->where('id',$id) ->update($data); if (!$ret) { exception('操作失败'); } $this->commit(); return true; }catch (Exception $e){ $this->rollback(); $this->error = $e->getmessage(); return false; } } // 检查是否已扎帐 public function checkFinish($id){ $ret = Db::name('house_lock_pay') ->alias('hlp') ->join('house_lock hl','hl.id = hlp.house_lock_id') ->where('hl.status','in',[0,1]) ->where('hlp.pay_id',$id) ->field('hlp.*') ->find(); return $ret?true:false; // true=已扎帐 } public function show_all_fee($orgId,$searchtext){ if(isset($searchtext['name']) && $searchtext['name'] !=''){ $map1[] = ['name','like','%'.$searchtext['name'].'%']; $user = Db::name('owner') ->where($map1) ->where('del',0) ->where('enable',1) ->column('id'); if(!empty($user)){ $map[] = ['hp.house_id','in',$user]; }else{ $map[] = ['hp.house_id','=',-1]; } } if(isset($searchtext['status']) && $searchtext['status'] !=''){ $map[] = ['hp.status','=',$searchtext['status']]; } $b = isset($searchtext['start'])?$searchtext['start']:''; $e = isset($searchtext['end'])?$searchtext['end']:''; if($b && $e){ if($b <= $e){ $b = date('Y-m-d 00:00:00',strtotime($b)); $e = date('Y-m-d 23:59:59',strtotime($e)); $map[] = ['hp.create_time','>=',$b]; $map[] = ['hp.create_time','<=',$e]; } } if($b && $e==''){ $b = date('Y-m-d 00:00:00',strtotime($b)); $map[] = ['hp.create_time','>=',$b]; } if($b=='' && $e){ $e = date('Y-m-d 23:59:59',strtotime($e)); $map[] = ['hp.create_time','<=',$e]; } $map2 = []; $c = isset($searchtext['wstart'])?$searchtext['wstart']:''; $d = isset($searchtext['wend'])?$searchtext['wend']:''; if($c && $d){ if($c <= $d){ $c = date('Y-m-d',strtotime($c)); $d = date('Y-m-d',strtotime($d)); $map2[] = ['hp.end','>=',$c]; $map2[] = ['hp.start','<=',$d]; } } if($c && $d==''){ $c = date('Y-m-d',strtotime($c)); $map2[] = ['hp.end','>=',$c]; } if($c=='' && $d){ $d = date('Y-m-d',strtotime($d)); $map2[] = ['hp.start','<=',$d]; } if(!empty($map2)){ $logs = Db::name('house_pay_log')->where($map2) ->distinct(true)->column('pay_id'); if($logs){ $map[] = ['hp.id','in',$logs]; }else{ $map[] = ['hp.id','=',-1]; } } $map[] = ['hp.del','=',0]; $map[] = ['hp.org_id','=',$orgId]; $fees = Db::name('house_pay_log') ->alias('hpl') ->join('house_pay hp','hp.id = hpl.pay_id') ->join('house_fee hf','hf.id = hpl.fee_id') ->field('hpl.fee_id,hf.title') ->group('hpl.fee_id') ->distinct(true) ->select(); return $fees; } public function getFeeSearch(){ $sn = input('sn','','trim'); if($sn){ $map[] = ['sn','like','%'.$sn.'%']; } $area_title = input('area_title','','trim'); if($area_title){ $map[] = ['area_title','like','%'.$area_title.'%']; } $title = input('title','','trim'); if($title){ $map[] = ['title','like','%'.$title.'%']; } $name = input('name','','trim');//用户 if($name){ $map[] = ['name','like','%'.$name.'%']; } $cate = input('cate','','trim'); if($cate != ''){ $map[] = ['cate','=',$cate]; } $fee = input('fee','','trim'); if($fee != ''){ $map[] = ['fee_id','=',$fee]; } $status = input('status','','trim'); if($status != ''){ $map[] = ['status','=',$status]; } $c_type = input('c_type','','trim'); if($c_type != ''){ $map[] = ['c_type','=',$c_type]; } $b = input('start','','trim'); $e = input('end','','trim'); if($b){ $b = date('Y-m-d 00:00:00',strtotime($b)); $map[] = ['create_time','>=',$b]; } if($e){ $e = date('Y-m-d 23:59:59',strtotime($e)); $map[] = ['create_time','<=',$e]; } $c = input('wstart','','trim'); $d = input('wend','','trim'); if($c){ $c = date('Y-m-d',strtotime($c)); $map[] = ['end','>=',$c]; } if($d){ $d = date('Y-m-d',strtotime($d)); $map[] = ['start','<=',$d]; } $map[] = ['org_id','=',cur_org_id()]; $map= empty($map) ? true: $map; return $map; } /** * 将数值金额转换为中文大写金额 * @param $amount float 金额(支持到分) * @param $type int 补整类型,0:到角补整;1:到元补整 * @return mixed 中文大写金额 */ public function convertAmountToCn($num, $type = 0) { $c1 = "零壹贰叁肆伍陆柒捌玖"; $c2 = "分角元拾佰仟万拾佰仟亿"; //精确到分后面就不要了,所以只留两个小数位 $num = round($num, 2); //将数字转化为整数 $num = $num * 100; if (strlen($num) > 10) { return "金额太大"; } $i = 0; $c = ""; while (1) { if ($i == 0) { //获取最后一位数字 $n = substr($num, strlen($num)-1, 1); } else { $n = $num % 10; } //每次将最后一位数字转化为中文 $p1 = substr($c1, 3 * $n, 3); $p2 = substr($c2, 3 * $i, 3); if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) { $c = $p1 . $p2 . $c; } else { $c = $p1 . $c; } $i = $i + 1; //去掉数字最后一位了 $num = $num / 10; $num = (int)$num; //结束循环 if ($num == 0) { break; } } $j = 0; $slen = strlen($c); while ($j < $slen) { //utf8一个汉字相当3个字符 $m = substr($c, $j, 6); //处理数字中很多0的情况,每次循环去掉一个汉字“零” if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') { $left = substr($c, 0, $j); $right = substr($c, $j + 3); $c = $left . $right; $j = $j-3; $slen = $slen-3; } $j = $j + 3; } //这个是为了去掉类似23.0中最后一个“零”字 if (substr($c, strlen($c)-3, 3) == '零') { $c = substr($c, 0, strlen($c)-3); } //将处理的汉字加上“整” if (empty($c)) { return "零元整"; }else{ return $c; } } // 退款 public function refund($post,$id,$userId,$orgId=0){ $info = Db::name('house_pay_log')-> where('id',$id)->find(); if(!$info){ $this->error = '记录不存在'; return false; } if($info['status'] != 0){ $this->error = '无权限操作'; return false; } $pInfo =$this ->where('id',$info['pay_id']) ->where('del',0) ->find(); if(!$pInfo){ $this->error = '记录不存在'; return false; } if($pInfo['create_user_id'] != $userId){ $this->error = '无权限操作'; return false; } $refundMoney =Db::name('house_refund_log') ->where('pay_id',$id) ->where('status','in',[1,2]) ->sum('money'); if($post['money'] > $info['money']){ $this->error = '退款金额不能大于实收金额'; return false; } if($post['money']+$refundMoney > $info['money']){ $this->error = '累计退款金额不能大于实收金额'; return false; } $this->startTrans(); try{ $data = [ 'reason' => isset($post['reason'])?$post['reason']:'', 'refund_user_id' => $userId, 'org_id' => $orgId, 'fee_id' => $info['fee_id'], 'bus_id' => $info['bus_id'], 'pay_id' => $id, 'refund_time' => getTime(), 'status' => 1, 'money' => $post['money'], 'refund_account' => $post['refund_account'], 'refund_name' => $post['refund_name'], 'refund_bank' => $post['refund_bank'], ]; $ret = Db::name('house_refund_log') ->insertGetId($data); if (!$ret) { exception('事务失败'); } $this->commit(); return true; }catch (Exception $e){ $this->rollback(); $this->error = $e->getmessage(); return false; } } // 处理待审核返销 public function dealpay($status,$id,$userId){ $info = $this->where('id',$id)->find(); if(!$info||$info['del'] == 1){ $this->error = '记录不存在'; return false; } if($info['status'] != 2){ $this->error = '缴费单不处于审核状态'; return false; } $this->startTrans(); try{ $data = [ 'status' => $status, 'cancel_user_id' => $userId, 'cancel_time' => getTime() ]; $res = $this->where('id',$id)->update($data); if (!$res) { exception('操作失败'); } if($status == 3){ // 同意 $preMoney = $this->getTableField('owner',['id'=>$info['owner_id']],'money'); // 剩余预付款 $dyMoney = $info['true_money'] - $info['money']; // 多余预付款 if($dyMoney > $preMoney){ exception('剩余预付款不能为负值'); } $lastMoney = round($preMoney - $dyMoney,2); $res = Db::name('owner') ->where('id',$info['owner_id']) ->update([ 'money' => $lastMoney, 'update_time' => date('y-m-d h:i:s') ]); if (!$res) { exception('操作失败'); } } $this->commit(); return true; }catch (Exception $e){ $this->rollback(); $this->error = $e->getmessage(); return false; } } public function disagreeRefund($id,$userId){ $info = Db::name('house_refund_log') ->where('id',$id) ->find(); if(!$info){ $this->error = '记录不存在'; return false; } if($info['status'] != 1){ $this->error = '无权限操作'; return false; } $data = [ 'deal_user_id' => $userId, 'deal_time' => getTime(), 'status' => 0 ]; $res = Db::name('house_refund_log') ->where('id',$id) ->update($data); if (!$res) { $this->error = '操作失败'; return false; } return true; } public function agreeRefund($id,$userId,$post){ $info = Db::name('house_refund_log') ->where('id',$id) ->find(); if(!$info){ $this->error = '记录不存在'; return false; } if($info['status'] != 1){ $this->error = '无权限操作'; return false; } $data = [ 'deal_user_id' => $userId, 'deal_time' => getTime(), 'status' => 2, 'voucher' => $post['voucher'], ]; $res = Db::name('house_refund_log') ->where('id',$id) ->update($data); if (!$res) { $this->error = '操作失败'; return false; } return true; } }