如果一些复杂的数据查询不好用数组,那就用字符串拼接,灵活方便

/**
 * 查询订单是否过期
 */
public function checkOrderStatus() {
    if (!$group_order_id = $_POST['group_order_id']) {
        $this->json->printOutError('缺少参数', 10001);
    }
    $group_order      = M('group_order');
    $group_order_info = $group_order->where(['id' => $group_order_id])->find();
    if (!$group_order_info) {
        $this->json->printOutError('订单信息不存在', 10002);
    }
    if ((int)$group_order_info['ugroup_inc_id'] === 0) { // 发起团
        $leader_order_id = $group_order_id;
    } else {
        $leader_order_id = $group_order_info['ugroup_inc_id'];
    }
    // 获取相关团的数据
    $capture_group_order = $group_order
        ->where('is_pay = 1 and status = 1 and expired_time < '.time().' and ( id = '.$leader_order_id.' or ugroup_inc_id ='.$leader_order_id.' )')
        ->select();
//        setlog($group_order->getLastSql());

    // todo改造,成功一条,commit一条
    $error_msg_arr = [];
    $success_count = 0;
    $fail_count = 0;
    if ($capture_group_order) {
        $group_purchase = M('group_purchase');
        $group_reward   = M('group_reward');
        vendor('Func.WxPay');
        foreach ($capture_group_order as $k=>$v) {
            M()->startTrans();
            // step1 修改订单状态
            $edit_data = [
                'status' => -2,
                'updatetime' => time()
            ];
            $edit_group_order_flag = $group_order
                ->where(['id'=>$v['id']])
                ->save($edit_data);
            if ($edit_group_order_flag === false) {
                M()->rollback();
                $error_msg_arr[] = date('Y-m-d H:i:s').'-清理过期时间未拼团成功订单:修改状态不成功';
                $fail_count++;
                continue;
            }

            // step2 撤回已占用库存
            $group_flag = $group_purchase->where(['id'=>$v['group_id']])->setDec('buyed_stock');
            if ($group_flag === false) {
                M()->rollback();
                $error_msg_arr[] = date('Y-m-d H:i:s').'-清理未支付订单:修改库存失败';
                $fail_count++;
                continue;
            }

            // step3 撤回已占用惊喜金额
            if ((int)$v['reward_id'] > 0) {
                $reward_edit_data  = [
                    'status' => 1
                ];
                $group_reward_flag = $group_reward->where(['id' => $v['reward_id']])->save($reward_edit_data);
                if ($group_reward_flag === false) {
                    M()->rollback();
                    $error_msg_arr[] = date('Y-m-d H:i:s').'-清理未支付订单:修改惊喜失败';
                    $fail_count++;
                    continue;
                }
            }
            // step4 退回付款金额
            $refund_result = WxPay::refundOrder($v['billno'], $v['payed_price'], $v['payed_price']);
            if ((int)$refund_result['num'] === 1) {
                $refund_order_edit_data = [
                    'refund_transaction_id' => $refund_result['refund_id'],
                    'refund_order_sn'       => $refund_result['refund_no'],
                    'is_refund'             => 1,
                ];
                $refund_order_edit_flag = $group_order->where(['id' => $v['id']])->save($refund_order_edit_data);
                if ($refund_order_edit_flag === false) { // 如果失败,再改一次
                    $refund_order_edit_data = [
                        'is_refund'             => 1,
                    ];
                    $group_order->where(['id' => $v['id']])->save($refund_order_edit_data);
                }
            } else {
                M()->rollback();
                $error_msg_arr[] = date('Y-m-d H:i:s').'-清理未支付订单:退款失败'.$refund_result['desc'];
                $fail_count++;
                continue;
            }
            M()->commit();
            $success_count++;
            $error_msg_arr[] = date('Y-m-d H:i').'-清理未支付订单:订单号,'.$v['billno'].'拼团失败,退款成功';
        }
        $error_msg_arr[] = date('Y-m-d H:i').'-清理过期时间未拼团成功订单:本次共清理'.count($capture_group_order).'个拼团失败订单'.',成功了'.$success_count.',失败了'.$fail_count.'个'.PHP_EOL;
        setlog($_POST,$error_msg_arr,__METHOD__);
        // 再次查询状态
        $group_order_info = $group_order->where(['id' => $group_order_id])->find();
    }
    $this->json->printOutSuccess($group_order_info);
}

多尝试sql拼接,很好的解决复杂的业务问题。记得多打log测试。

原文地址:https://www.cnblogs.com/jiqing9006/p/10945873.html