订单id] * @return array $res */ public function update_bill_advance($pay_order) { $bill_id = $pay_order['bill_id']; $bill_info = D("RetailBillOrder")->getFind(array("id" => $bill_id)); $advance_bill = $this->getFind(array("bill_id" => $bill_id)); if (!$advance_bill) { $res = array('status' => 0, 'msg' => '预售异常,请联系商家'); return $res; } if ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 0) { //支付定金 $save = array('state' => 1, 'earnest_pay_time' => time(), 'earnest_pay_order_id' => $pay_order['id']); } else if ($advance_bill['advance_type'] == 1 || ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 1)) { //支付全款或尾款 $save = array('state' => 2, 'tail_pay_order_id' => $pay_order['id']); } if (empty($save)) { $res = array('status' => 0, 'msg' => '订单出现异常,请联系商家'); return $res; } $save_result = $this->updateOrder(array("bill_id" => $bill_id), $save); if (!$save_result) { $res = array('status' => 0, 'msg' => '订单出现异常,请联系商家'); return $res; } // 打印 //修改优惠券状态 $DiscountModel = D('RetailBillDiscount'); $map = array( "bill_id" => $bill_id ); $billDiscount = $DiscountModel->getFind($map); if ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 0) { //支付定金优惠券使用 if (!empty($billDiscount['coupon_id'])) { $this->couponModify([ 'billDiscount' => $billDiscount, 'bill_info' => $bill_info, 'pay_order' => $pay_order ]); } $res = array('status' => 1, 'msg' => '支付成功'); } else { //支付尾款成功是否是组合支付 if ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 1) { if (($bill_info['pay_type'] == 5 && $pay_order['pay_type'] == 4) || ($bill_info['pay_type'] == 6 && $pay_order['pay_type'] == 6)) { D("RetailBillOrder")->updateOrder(array('id' => $bill_id), array('pay_type' => 8));//修改bill表支付类型 D('RetailSell')->updateOrder(array('bill_id' => $bill_id, 'type' => 1), array('pay_type' => 8));//修改sell表支付类型 } } if ($advance_bill['advance_type'] == 1 || ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 1)) { if (!empty($billDiscount['coupon_id']) && $advance_bill['advance_type'] == 1) { //支付全款优惠券修改 $this->couponModify([ 'billDiscount' => $billDiscount, 'bill_info' => $bill_info, 'pay_order' => $pay_order ]); } A('PayApi/Printer')->linePrinting_v1($bill_info['store_id'], $bill_id); //新版推送 $content = array( 'login_string' => '', 'username' => '', 'type' => 1, 'order_no' => $bill_info['order_no'], 'message' => "您有新的线上订单信息", ); sendSockets($bill_info['store_id'], $content, -1); $res = array('status' => 1, 'msg' => '支付成功'); } } return $res; } /** * 优惠券修改状态 * @param $param * [ * billDiscount * bill_info * pay_order * ] * @return array */ public function couponModify($param) { $billDiscount = $param['billDiscount']; $bill_info = $param['bill_info']; $pay_order = $param['pay_order']; $DiscountModel = D('RetailBillDiscount'); switch ($billDiscount["coupon_type"]) { case 1: //门店优惠券 $CouponLogsModel = D('RetailCouponLogs'); $cSave = array( $CouponLogsModel::STATUS => 2, $CouponLogsModel::USE_TIME => time() ); $CouponLogsModel->updateOrder(array($CouponLogsModel::ID => $billDiscount[$DiscountModel::COUPON_ID]), $cSave); break; case 2: $VipMCouponModel = D('RetailVipMCoupon'); $couponData[$VipMCouponModel::IS_USE] = 2; $couponData[$VipMCouponModel::USE_TIME] = time(); $couponData[$VipMCouponModel::STORE_ID] = $bill_info['store_id']; $couponData[$VipMCouponModel::LESS_MONEY] = $billDiscount["coupon_money"]; $upCoupon = $VipMCouponModel->updateOrder(array($VipMCouponModel::ID => $billDiscount["coupon_id"]), $couponData); break; case 3: //商家券 $xcxUserClass = new XcxUser(); if (!empty($bill_info['uid'])) { $xcxUserModel = new RetailSmallProgramUserModel(); $xcx_info = $xcxUserModel->getFind([ 'id' => $bill_info['uid'] ], "openid,service_openid"); $openid = $xcx_info['openid']; $service_openid = $xcx_info['service_openid']; } else { //通过商家券用户id查询用户openid $xcx_info = $xcxUserClass->basisCouponIdGetOpenid([ 'coupon_id' => $billDiscount['coupon_id'] ]); if (!empty($xcx_info)) { $openid = $xcx_info['data']['xcx_info']['openid']; $service_openid = $xcx_info['data']['xcx_info']['service_openid']; } } $ShopCouponClass = new ShopCoupon(); $ShopCouponClass->verificationCoupon([ 'coupon_id' => $billDiscount['coupon_id'], 'merchant_id' => $bill_info['merchant_id'], 'verification_available_type' => 1, 'verification_store_id' => $bill_info['store_id'], 'bill_id' => $bill_info['id'], 'openid' => $openid ? $openid : '', 'service_openid' => $service_openid ? $service_openid : '', ]); break; } if (C('IS_SET_REDIS')) { $ApiRedis = new \Addons\Api\RedisController(); $coupon_redis_key = 'retail_coupon_store_id_' . $pay_order['store_id'] . '_uid_' . $pay_order['uid'] . '_coupon_type_' . $billDiscount['coupon_type'] . '_coupon_id_' . $billDiscount['coupon_id']; $ApiRedis::$redis->delete($coupon_redis_key); } return [ 'status' => 1, 'message' => '核销成功' ]; } /** * 尾款验证是否满足支付条件 * @param $parameter * @return array */ public function tail_verify($parameter) { if (is_array($parameter)) { $order_no = $parameter['order_no']; $where = array( 'b.order_no' => $order_no, 'b.pay_state' => 2, 'b.refund_status' => 0, 'b.order_type' => 1, 'o.order_genre' => 4, 'a.state' => 1 ); $info = M("retail_bill_order as b") ->join("ls_retail_bill_online as o on b.id=o.bill_id") ->join("ls_retail_bill_advance as a on b.id=a.bill_id") ->where($where) ->field("b.all_money,a.*") ->find(); if (!$info) { $res = array('status' => 0, 'msg' => '未找到待付尾款订单'); return $res; } $advance_active = D("AdvanceGoods")->tail_pay_verify(array("id" => $info['advance_id'])); //验证活动 if ($advance_active['status'] == 0) { return $advance_active; } $res = array( 'status' => 1, 'msg' => '验证成功', 'data' => array( 'bill_info' => $info ) ); } else { $res = array('status' => 0, 'msg' => '参数类型错误'); } return $res; } /** * 列表查询参数 * @param $data [ * order_no=>订单号,status=>订单状态,pickup_type=>[1=>自提,2=>配送], * advance_type=>订单类型, state=>[1=>未付尾款,2=>已付尾款], * order_type=>[1=>正常订单,2=>过期订单], * earnest_pay_time=>定金支付时间, * finish_time=>尾款支付时间 * ] * @return mixed */ public function order_condition($data) { $time = time(); $where = array( 'b.merchant_id' => $data['merchant_id'], 'b.store_id' => $data['store_id'], 'b.pay_state' => array('neq', 0), 'b.type' => 1, 'b.order_type' => 1, 'o.order_genre' => 4, 'a.state' => array('neq', 0) ); if (!empty($data['order_no'])) { $where['b.order_no'] = array('like', '%' . $data['order_no'] . '%'); } // if (!empty($data['status'])) { // if ($data['status'] == 1) { // $where['o.status'] = array('in', '0,1'); // } else { // $where['o.status'] = $data['status']; // } // } // if (!empty($data['pickup_type'])) { // switch ($data['pickup_type']) { // case 1: // $where['o.pickup_type'] = $data['pickup_type']; // break; // case 2: // $where['o.pickup_type'] = array('in', '2,3'); // break; // } // } if (!empty($data['advance_type'])) { $where['a.advance_type'] = $data['advance_type']; if (!empty($data['state']) && $data['advance_type'] == 2) { $where['a.state'] = $data['state']; if (!empty($data['order_type']) && $data['state'] == 1) { switch ($data['order_type']) { case 1: $where['a.tail_end_time'] = array('gt', $time); break; case 2: $where['a.tail_end_time'] = array('lt', $time); break; } } } } if (!empty($data['earnest_pay_time'])) { $start_time = strtotime($data['earnest_pay_time'][0]); $end_time = strtotime($data['earnest_pay_time'][1]); $where['a.earnest_pay_time'] = array('between', array($start_time, $end_time)); } if (!empty($data['finish_time'])) { $start_time = strtotime($data['finish_time'][0]); $end_time = strtotime($data['finish_time'][1]); $where['b.finish_time'] = array('between', array($start_time, $end_time)); } if (isset($data['status']) && $data['status'] !== '') { //ls_retail_bill_online -> status 1未发货 2已发货 3已收货 (自提没有类型2) if ($data['status'] == 4) { //待自提 $where['o.pickup_type'] = 1; $where['o.status'] = 1; } else if ($data['status'] == 5) { //已自提 $where['o.pickup_type'] = 1; $where['o.status'] = 3; } else { $where['o.pickup_type'] = array('in', '2,3'); $where['o.status'] = $data['status']; } } if (isset($data['pickupType']) && $data['pickupType'] !== '') { //ls_retail_bill_online -> pickup_type 是否需要配送 1:自提 2:配送 3快递发货 $where['o.pickup_type'] = $data['pickupType']; } $parameter = array( 'status' => 1, 'msg' => '条件成功', 'data' => array( 'where' => $where, 'page' => $data['page'], 'limit' => $data['limit'] ), ); return $parameter; } /* * 订单列表 */ public function order_list($parameter) { $where = $parameter['where']; $page = $parameter['page'] ? $parameter['page'] : ''; $limit = $parameter['limit'] ? $parameter['limit'] : ''; if (!$page || !$limit) { $order_info = M('retail_bill_order as b') ->join('ls_retail_bill_online as o on b.id=o.bill_id') ->join('ls_retail_bill_discount as d on b.id=d.bill_id') ->join('ls_retail_bill_advance as a on b.id=a.bill_id') ->field("b.id,b.order_no,b.vid,b.uid,b.finish_time,b.all_money,b.order_type,b.refund_status,o.remark,o.pickup_type,o.status,o.cancel_time,o.delivery_type,a.all_earnest_price,a.earnest_pay_time,a.state,a.advance_type,a.tail_pay_order_id,a.refuse_earnest_price,d.pay_coupon_fee") ->where($where) ->order('b.id desc') ->select(); } else { $order_info = M('retail_bill_order as b') ->join('ls_retail_bill_online as o on b.id=o.bill_id') ->join('ls_retail_bill_discount as d on b.id=d.bill_id') ->join('ls_retail_bill_advance as a on b.id=a.bill_id') ->field("b.id,b.order_no,b.vid,b.uid,b.finish_time,b.all_money,b.order_type,b.refund_status,o.remark,o.pickup_type,o.status,o.cancel_time,o.delivery_type,a.all_earnest_price,a.earnest_pay_time,a.state,a.advance_type,a.tail_pay_order_id,a.refuse_earnest_price,d.pay_coupon_fee") ->where($where) ->page($page . ',' . $limit) ->order('b.id desc') ->select(); } return $order_info; } /** * 列表字段转数据 * @param $parameter * @return mixed */ public function order_list_conversion($parameter) { foreach ($parameter as $key => &$val) { $val['index'] = $key + 1; $val['vip_phone'] = '普通用户'; if (!empty($val['vid'])) { $val['vip_phone'] = D("RetailVip")->getFindField(array('id' => $val['vid']), "mobile_phone"); } $val['finish_time'] = $val['finish_time'] ? date("Y-m-d H:i:s", $val['finish_time']) : ''; if ($val['advance_type'] == 1) { $val['advance_name'] = '全额'; $val['pay_state_name'] = '已支付'; $val['all_earnest_price'] = ''; $val['earnest_pay_time'] = ''; } else if ($val['advance_type'] == 2) { $val['advance_name'] = '定金'; $val['all_earnest_price'] = round($val['all_earnest_price'], 2); $val['earnest_pay_time'] = date("Y-m-d H:i:s", $val['earnest_pay_time']); $val['all_money'] = round($val['all_money'] - $val['all_earnest_price'], 2); if (!empty($val['tail_pay_order_id'])) { $val['pay_state_name'] = '已付尾款'; } else { $val['pay_state_name'] = '未付尾款'; } } switch ($val['pickup_type']) { case 1: $val['delivery_name'] = "自提"; break; case 2: $val['delivery_name'] = "配送"; break; case 3: $val['delivery_name'] = "快递收货"; break; } switch ($val['status']) { case 0: case 1: $val['status_name'] = "未发货"; break; case 2: $val['status_name'] = "已发货"; break; case 3: $val['status_name'] = "已收货"; break; } $val['pay_coupon_fee'] = $val['pay_coupon_fee'] > 0 ? floatval($val['pay_coupon_fee']) : ''; } return $parameter; } /** * 统计预售订单数量 * @param $parameter * @return mixed */ public function order_count($parameter) { $where = $parameter['where']; $order_count = M('retail_bill_order as b') ->join('ls_retail_bill_online as o on b.id=o.bill_id') ->join('ls_retail_bill_advance as a on b.id=a.bill_id') ->where($where) ->count(); return $order_count; } /** * 订单详情 * @param $parameter [bill_id=>订单id] * @return mixed */ public function order_info($parameter) { $bill_id = $parameter['bill_id']; $where = array( 'b.id' => $bill_id, 'b.pay_state' => array('neq', 0), 'b.order_type' => 1, 'a.state' => array('neq', 0) ); $order_info = M("retail_bill_order as b") ->join("ls_retail_bill_online as o on b.id=o.bill_id") ->join("ls_retail_bill_discount as d on b.id=d.bill_id") ->join("ls_retail_bill_advance as a on b.id=a.bill_id") ->join("ls_retail_sell as s on b.id=s.bill_id") ->field("b.id,b.order_no,b.all_money,o.user_name,o.user_phone,o.user_address,o.pickup_type,o.remark,o.delivery_fee,s.goods_id,s.sku_json_info,s.num,s.price,s.goods_name,s.goods_img_id,s.company,s.company,d.coupon_money,a.all_arrive_price") ->where($where) ->find(); return $order_info; } /** * 小程序预售订单表详情 */ public function bill_advance($parameter) { $bill_id = $parameter['bill_id']; $info = $this->alias('b') ->join('ls_retail_advance_goods as a on b.advance_id=a.id') ->where(array('b.bill_id' => $bill_id)) ->field('b.*,a.tail_start_time') ->find(); return $info; } /** * 预售订单支付方式(收银机) */ public function payMode($parameter) { $pay_mode = array(); if ($parameter['advance_type'] == 2) { if (!empty($parameter['tail_pay_order_id'])) { $where['id'] = array('in', array($parameter['earnest_pay_order_id'], $parameter['tail_pay_order_id'])); } else { $where['id'] = $parameter['earnest_pay_order_id']; } $pay_order = D("RetailPayOrder")->getSelect($where, "pay_type,trade_amount"); foreach ($pay_order as $key => $val) { if ($key == 0) { $pay_type_name = '定金'; } else { $pay_type_name = '尾款'; } switch ($val['pay_type']) { case 4: $pay_name = '微信'; break; case 6: $pay_name = '会员余额'; break; } $pay_mode[] = array('pay_type_name' => $pay_type_name, 'name' => $pay_name, 'money' => $val['trade_amount']); } } else { $advance_name = '全额'; $pay_order = D("RetailPayOrder")->getOrderFind(array('id' => $parameter['tail_pay_order_id']), "pay_type,trade_amount"); switch ($pay_order['pay_type']) { case 4: $pay_name = '微信'; break; case 6: $pay_name = '会员余额'; break; } $pay_mode[] = array('pay_type_name' => $advance_name, 'name' => $pay_name, 'money' => $pay_order['trade_amount']); } return $pay_mode; } /** * 查询该活动预定的人数(小程序) * @param $parameter * @return array */ public function getUserNum($parameter) { $count = $this->alias('a') ->join('ls_retail_bill_order as b on a.bill_id=b.id') ->where(array('a.advance_id' => $parameter['id'], 'a.state' => array('neq', 0), 'b.order_type' => 1)) ->count(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'msg' => '查询成功', 'data' => array('count' => $count) ); return $res; } }