Current Path : /www/wwwroot/jsnz.xshop.geekdanceshop.com/app/model/verify/
Upload File :
Current File : /www/wwwroot/jsnz.xshop.geekdanceshop.com/app/model/verify/Verify.php

<?php

/**
 * Niushop商城系统 - 团队十年电商经验汇集巨献!
 * =========================================================
 * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
 * ----------------------------------------------
 * 官方网址: https://www.niushop.com
 * =========================================================
 */

namespace app\model\verify;

use app\model\BaseModel;

/**
 * 核销编码管理
 */
class Verify extends BaseModel
{
    //核销码状态,由于设计上的缺陷,对应is_verify字段
    const STATUS_NOT_VERIFY = 0;
    const STATUS_IS_VERIFY = 1;
    const STATUS_REFUNDED = 2;
    const STATUS_EXPIRED = -1;

    static function getStatus($key = null)
    {
        $arr = [
            [
                'id' => self::STATUS_NOT_VERIFY,
                'name' => '待核销',
            ],
            [
                'id' => self::STATUS_IS_VERIFY,
                'name' => '已核销',
            ],
            [
                'id' => self::STATUS_REFUNDED,
                'name' => '已退款',
            ],
            [
                'id' => self::STATUS_EXPIRED,
                'name' => '已过期',
            ],
        ];
        if(isset($arr[0][$key])){
            $arr = array_column($arr, null, $key);
        }
        return $arr;
    }

    public $verifyFrom = [
        'shop' => '商家后台',
        'store' => '门店后台',
        'mobile' => '手机端',
    ];

    /**
     * 获取核销类型
     */
    public function getVerifyType()
    {
        $verify_type = event("VerifyType", []);
        $type = [
            'pickup' => [
                'name' => '订单自提',
            ],
            'virtualgoods' => [
                'name' => '虚拟商品',
            ]
        ];
        foreach ($verify_type as $k => $v) {
            $type = array_merge($type, $v);
        }
        return $type;
    }

    /**
     * 添加待核销记录
     * @param $type
     * @param $site_id
     * @param $site_name
     * @param $content_array
     * @param int $expire_time
     * @param int $verify_total_count
     * @param int $store_id
     * @param int $member_id
     * @return array
     */
    public function addVerify($type, $site_id, $site_name, $content_array, $expire_time = 0, $verify_total_count = 1, $store_id = 0, $member_id = 0)
    {
        $code = $this->getCode();
        $type_array = $this->getVerifyType();
        $data = [
            'site_id' => $site_id,
            'site_name' => $site_name,
            'verify_code' => $code,
            'verify_type' => $type,
            'verify_type_name' => $type_array[ $type ][ 'name' ],
            'verify_content_json' => json_encode($content_array, JSON_UNESCAPED_UNICODE),
            'create_time' => time(),
            'expire_time' => $expire_time,
            'verify_total_count' => $verify_total_count,
            'store_id' => $store_id,
            'member_id' => $member_id
        ];
        $res = model("verify")->add($data);
        return $this->success([ 'verify_code' => $code, 'verify_id' => $res ]);
    }

    /**
     * 编辑待核销记录
     * @param $data
     * @param $condition
     * @return array
     */
    public function editVerify($data, $condition)
    {

        $res = model("verify")->update($data, $condition);
        return $this->success($res);
    }

    /**
     * 获取code值
     */
    public function getCode()
    {
        return random_keys(12);
    }

    /**
     * 执行核销
     * @param $verifier_info
     * @param $code
     * @return array|mixed|void
     */
    public function verify($verifier_info, $code)
    {
        $verifier_info[ 'store_id' ] = $verifier_info[ 'store_id' ] ?? 0;

        model('verify')->startTrans();

        try {
            $verify_info = model("verify")->getInfo([ [ 'verify_code', '=', $code ] ], 'id, site_id, verify_code, verify_type, verify_type_name, verify_content_json, verifier_id, verifier_name, is_verify, expire_time, verify_total_count, verify_use_num, store_id');
            if (empty($verify_info)) {
                model('verify')->rollback();
                return $this->error();
            }
            if ($verify_info[ 'is_verify' ] == 0) {
                if ($verify_info[ 'expire_time' ] > 0 && $verify_info[ 'expire_time' ] < time()) {
                    model('verify')->rollback();
                    return $this->error('', '核销码已过期');
                }
                $check_store_res = $this->checkStore($verify_info, $verifier_info['store_id']);
                if($check_store_res['code'] < 0){
                    model('verify')->rollback();
                    return $check_store_res;
                }
                $verify_total_count = $verify_info[ 'verify_total_count' ];
                $verify_use_num = $verify_info[ 'verify_use_num' ];
                $now_verify_use_num = $verify_use_num + 1;

                //开始核销
                $data_verify = [
                    'verifier_id' => $verifier_info[ "verifier_id" ],
                    'verifier_name' => $verifier_info[ 'verifier_name' ],
                    'verify_from' => $verifier_info['verify_from'] ?? '',
                    'verify_remark' => $verifier_info['verify_remark'] ?? '',
                    'verify_use_num' => $now_verify_use_num
                ];
                if ($verify_total_count > 0 && $now_verify_use_num >= $verify_total_count) {
                    $data_verify[ 'is_verify' ] = 1;
                    $data_verify[ 'verify_time' ] = time();
                }

                $res = model("verify")->update($data_verify, [ [ 'id', '=', $verify_info[ 'id' ] ] ]);
                $result = event('Verify', [ 'verify_type' => $verify_info[ 'verify_type' ], 'verify_code' => $code, 'verify_id' => $verify_info[ 'id' ], 'store_id' => $verifier_info[ 'store_id' ] ], true);
                if (!empty($result) && $result[ 'code' ] < 0) {
                    model('verify')->rollback();
                    return $result;
                }

                $site_id = $verify_info[ 'site_id' ];
                $verify_record_model = new VerifyRecord();
                $verify_record_data = [
                    'site_id' => $site_id,
                    'verify_code' => $code,
                    'verifier_id' => $verifier_info[ "verifier_id" ],
                    'verifier_name' => $verifier_info[ 'verifier_name' ],
                    'verify_time' => time(),
                    'verify_from' => $verifier_info[ 'verify_from' ] ?? '',
                    'verify_remark' => $verifier_info[ 'verify_remark' ] ?? '',
                    'store_id' => $verifier_info[ 'store_id' ]
                ];
                $verify_record_model->addVerifyRecord($verify_record_data);
            } else {
                model('verify')->rollback();
                return $this->error('', "IS_VERIFYED");
            }

            model('verify')->commit();
            return $this->success();
        } catch (\Exception $e) {
            model('verify')->rollback();
            return $this->error('', $e->getMessage());
        }
    }

    /**
     * 检测门店
     * @param $verify_info
     * @param $store_id
     * @return array|void
     */
    public function checkStore($verify_info, $store_id)
    {
        if($store_id > 0){
            //pickup 自提核销码
            if ($verify_info[ 'store_id' ] > 0) {
                if($verify_info[ 'store_id' ] != $store_id){
                    return $this->error('', '没有核销该核销码的权限');
                }
            }else{
                //cardgoods 卡项核销码 id关联member_goods_card_item中的member_verify_id
                if($verify_info['verify_type'] == 'cardgoods'){
                    $goods_info = model('member_goods_card_item')->getInfo([
                        ['item.member_verify_id', '=', $verify_info['id']],
                    ], 'g.goods_name,g.sale_store', 'item', [
                        ['member_goods_card card', 'card.card_id = item.card_id', 'inner'],
                        ['goods g', 'g.goods_id = card.goods_id', 'inner'],
                    ]);
                }else{
                    //virtualgoods 虚拟核销码 verify_code关联order中的virtual_code
                    $goods_info = model('order')->getInfo([
                        ['o.virtual_code', '=', $verify_info['verify_code']],
                    ], 'g.goods_name,g.sale_store', 'o', [
                        ['order_goods og', 'o.order_id = og.order_id', 'inner'],
                        ['goods g', 'og.goods_id = g.goods_id', 'inner'],
                    ]);
                }
                if(empty($goods_info)){
                    return $this->error('', '核销商品数据缺失');
                }
                if($goods_info['sale_store'] != 'all'){
                    $sale_store = explode(',', trim($goods_info['sale_store'], ','));
                    if(!in_array($store_id, $sale_store)){
                        return $this->error('', '没有核销权限');
                    }
                }
            }
        }
        return $this->success();
    }

    /**
     * 获取核销信息
     * @param $condition
     * @param string $field
     * @return array
     */
    public function getVerifyInfo($condition, $field = '*')
    {
        $res = model('verify')->getInfo($condition, $field);
        //验证是否存在
        if (!empty($res)) {

            if ($res[ 'is_verify' ] == 2) {
                return $this->error([], "订单已退款!");
            }

            $json_array = json_decode($res[ "verify_content_json" ], true); //格式化存储数据

            $res[ "data" ] = $json_array;
            return $this->success($res);
        } else {
            return $this->error([], "找不到核销码信息!");
        }
    }

    /**
     * 获取核销列表
     * @param array $condition
     * @param string $field
     * @param string $order
     * @param null $limit
     * @return array
     */
    public function getVerifyList($condition = [], $field = '*', $order = '', $limit = null)
    {

        $list = model('verify')->getList($condition, $field, $order, '', '', '', $limit);
        return $this->success($list);
    }

    /**
     * 获取核销分页列表
     * @param array $condition
     * @param int $page
     * @param int $page_size
     * @param string $order
     * @param string $field
     * @return array
     */
    public function getVerifyPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = 'a', $join = [])
    {
        $list = model('verify')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
        //组装数据
        $order_no_array = [];
        $member_id_array = [];
        $member_verify_id_array = [];

        foreach ($list[ "list" ] as $k => $v) {
            $temp = json_decode($v[ 'verify_content_json' ], true);
            $member_id_array[] = $v[ 'member_id' ];
            if ($v[ 'verify_type' ] == 'pickup' || $v[ 'verify_type' ] == 'virtualgoods') {
                $order_no_array[] = $temp[ 'remark_array' ][ 1 ][ 'value' ];
            } else {
                $list[ 'list' ][ $k ][ 'sku_image' ] = $temp[ "item_array" ][ 0 ][ 'img' ];
                $list[ 'list' ][ $k ][ 'sku_name' ] = $temp[ "item_array" ][ 0 ][ 'name' ];
                $member_verify_id_array[] = $v[ 'id' ];
            }
        }

        $order_nos = implode(",", array_unique($order_no_array));
        $order_list = [];
        if (!empty($order_nos)) {
            $order_list = model('order')->getList([ [ 'order_no', 'in', $order_nos ] ], 'order_id,order_no,member_id,name,order_name');
            if (!empty($order_list)) {
                $key = array_column($order_list, 'order_no');
                $order_list = array_combine($key, $order_list);
            }
        }

        $member_ids = implode(",", array_unique($member_id_array));
        $member_list = [];
        if (!empty($member_ids)) {
            $member_list = model('member')->getList([ [ 'member_id', 'in', $member_ids ] ], 'member_id,username,mobile,nickname');
            if (!empty($member_list)) {
                $key = array_column($member_list, 'member_id');
                $member_list = array_combine($key, $member_list);
            }
        }

        $member_verify_ids = implode(",", array_unique($member_verify_id_array));
        $member_verify_list = [];
        if (!empty($member_verify_ids)) {
            $member_verify_list = model('member_goods_card_item')->getList([ [ 'mgci.member_verify_id', 'in', $v[ 'id' ] ] ], 'mgci.member_verify_id,m.username', '', 'mgci', [ [ 'member m', 'm.member_id = mgci.member_id', 'left' ] ]);
            if (!empty($member_verify_list)) {
                $key = array_column($member_verify_list, 'member_verify_id');
                $member_verify_list = array_combine($key, $member_verify_list);
            }
        }

        $status_list = self::getStatus('id');
        foreach ($list[ "list" ] as $k => $v) {
            $temp = json_decode($v[ 'verify_content_json' ], true);
            $list[ "list" ][ $k ][ "item_array" ] = $temp[ "item_array" ];
            $list[ "list" ][ $k ][ "remark_array" ] = $temp[ "remark_array" ];
            if ($v[ 'verify_type' ] == 'pickup' || $v[ 'verify_type' ] == 'virtualgoods') {
                $list[ "list" ][ $k ][ 'order_no' ] = $temp[ 'remark_array' ][ 1 ][ 'value' ];
                $list[ 'list' ][ $k ][ 'order_info' ] = $order_list[ $temp[ 'remark_array' ][ 1 ][ 'value' ] ] ?? [];
                $list[ 'list' ][ $k ][ 'name' ] = $member_list[ $v[ 'member_id' ] ][ 'username' ] ?? '';
                $list[ 'list' ][ $k ][ 'sku_image' ] = "";
                if ($v[ 'verify_type' ] == "virtualgoods") {
                    $list[ 'list' ][ $k ][ 'sku_image' ] = $temp[ "item_array" ][ 0 ][ 'img' ] ?? '';
                }
            } else {
                $list[ 'list' ][ $k ][ 'sku_image' ] = $temp[ "item_array" ][ 0 ][ 'img' ];
                $list[ 'list' ][ $k ][ 'sku_name' ] = $temp[ "item_array" ][ 0 ][ 'name' ];
                $list[ 'list' ][ $k ][ 'name' ] = $member_verify_list[ $v[ 'id' ] ][ 'username' ] ?? '';
            }
            $list[ 'list' ][ $k ][ 'member_info' ] = $member_list[ $v[ 'member_id' ] ] ?? null;
            unset($list[ "list" ][ $k ][ "verify_content_json" ]);
            $list[ 'list' ][ $k ][ 'verifyFrom' ] = $this->verifyFrom[ $v[ 'verify_from' ] ?? '' ] ?? '';
            $list[ 'list' ][ $k ]['is_verify_info'] = $status_list[$v['is_verify']] ?? null;
        }

        return $this->success($list);
    }

    /**
     * 验证数据详情
     * @param $item_array
     * @param $remark_array
     * @return array
     */
    public function getVerifyJson($item_array, $remark_array)
    {
        $json_array = array (
            "item_array" => $item_array,
            "remark_array" => $remark_array,
        );
        return $json_array;
    }

    /**
     * 检测会员是否具备当前核销码的核销权限
     * @param $member_id
     * @param $verify_code
     * @return array
     */
    public function checkMemberVerify($member_id, $verify_code)
    {
        $verify_info = model("verify")->getInfo([ [ "verify_code", "=", $verify_code ] ]);
        if (empty($verify_info))
            return $this->error([], "当前核销码不存在!");

        $site_id = $verify_info[ "site_id" ];
        //验证核销员身份
        $condition = array (
            [ "member_id", "=", $member_id ],
            [ "site_id", "=", $site_id ]
        );
        $verifier_info = model("verifier")->getInfo($condition, "verifier_id,verifier_name,store_id,verifier_type");
        if (empty($verifier_info))
            return $this->error([], "没有店铺" . $verify_info[ "site_name" ] . "的核销权限!");

        //权限验证
        switch ( $verify_info[ 'verify_type' ] ) {
            case 'virtualgoods':
                //虚拟订单权限
                if ($verifier_info[ 'verifier_type' ] != 0) {
                    return $this->error([], "没有该订单的核销权限!");
                }
                break;
            case 'pickup':
                //门店自提权限
                if ($verifier_info[ 'verifier_type' ] != 0) {
                    $condition = array (
                        [ 'delivery_store_id', '=', $verifier_info[ 'store_id' ] ],
                        [ 'delivery_code', '=', $verify_code ],
                        [ 'site_id', '=', $site_id ]
                    );
                    $order_count = model('order')->getCount($condition, "order_id");
                    if (empty($order_count)) return $this->error([], "没有该门店的核销权限!");
                }
                break;
        }

        $temp = json_decode($verify_info[ 'verify_content_json' ], true);
        $verify_info[ "item_array" ] = $temp[ "item_array" ];
        $verify_info[ "remark_array" ] = $temp[ "remark_array" ];
        unset($verify_info[ "verify_content_json" ]);

        $data = array (
            "verify" => $verify_info,
            "verifier" => $verifier_info,
        );
        return $this->success($data);
    }

    /**
     * 生成核销码二维码
     * @param $code
     * @param $app_type
     * @param $verify_type
     * @param $site_id
     * @param string $type
     * @return array
     */
    public function qrcode($code, $app_type, $verify_type, $site_id, $type = 'create')
    {
        $page = '/pages_tool/verification/detail';
        $params = [
            'site_id' => $site_id,
            'data' => [
                "code" => $code
            ],
            'page' => $page,
            'app_type' => $app_type,
            'promotion_type' => '',
            'h5_path' => $page . '?code=' . $code,
            'qrcode_path' => 'upload/qrcode/' . $verify_type,
            'qrcode_name' => $verify_type . '_' . $code . '_' . $site_id
        ];
        $solitaire = event('PromotionQrcode', $params, true);
        return $this->success($solitaire);
    }

    /**
     * 获取核销码字段和
     * @param $condition
     * @param $field
     * @return array
     */
    public function getVerifySum($condition, $field)
    {
        $res = model('verify')->getSum($condition, $field);
        return $this->success($res);
    }

    /**
     * 获取核销码数量
     * @param $condition
     * @param $field
     * @return array
     */
    public function getVerifyCount($condition, $field)
    {
        $res = model('verify')->getCount($condition, $field);
        return $this->success($res);
    }
}
金穗农资
captcha