541 行
22 KiB
PHP
可执行文件
541 行
22 KiB
PHP
可执行文件
<?php
|
||
|
||
namespace Common\Model;
|
||
|
||
use Common\Business\ShopCoupon;
|
||
use Common\Business\XcxUser;
|
||
|
||
//[1.8.68]
|
||
|
||
class RetailBillAdvanceModel extends BaseModel
|
||
{
|
||
protected $tableName = 'retail_bill_advance';
|
||
protected $fields = array(
|
||
'bill_id', //主订单bill_order
|
||
'advance_id', //预售活动id
|
||
'goods_id', //商品id
|
||
'sku_id', //规格id
|
||
'all_advance_price', //预售价
|
||
'buy_number', //购买数量
|
||
'all_earnest_price', //定金
|
||
'all_arrive_price', //定金抵现
|
||
'advance_type', //1全额 2定金
|
||
'state', //1成功 0失败
|
||
'uid', //用户id
|
||
'earnest_pay_time', //定金支付时间
|
||
'tail_end_time', //尾款结束时间
|
||
'earnest_pay_order_id', //定金支付pay_order表id
|
||
'tail_pay_order_id', //尾款支付pay_order_id
|
||
'refuse_earnest_price', //退款不退定金 0关闭 1开启
|
||
);
|
||
|
||
/**
|
||
* 支付成功后修改状态
|
||
* @param $pay_order [bill_id=>订单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;
|
||
}
|
||
} |