Просмотр исходного кода

增加BA用户列表,订单列表等

theo 3 лет назад
Родитель
Сommit
fa7a984d45

+ 14 - 1
backendApi/config/menu.php

@@ -58,8 +58,21 @@ return [
 
         ]
     ],
+    'ba' =>[
+        'name'=>'Brand Ambassador', // BA会员管理
+        'class' => '',
+        'icon'=>'el-icon-user',
+        'controller'=>'ba',
+        'action'=>'',
+        'routePath'=>'ba',
+        'show'=>1,
+        'child'=>[
+            ['name'=>'Brand Ambassador List', 'class'=>'', 'icon'=>'', 'controller'=>'ba', 'action'=>'user-list', 'routePath'=>'ba/user-list', 'show'=>1,], // 会员列表
+            ['name'=>'Brand Ambassador Order', 'class'=>'', 'icon'=>'', 'controller'=>'ba', 'action'=>'order-list', 'routePath'=>'ba/order-list', 'show'=>1,], // 会员列表
+        ]
+    ],
     'user'=>[
-        'name'=>'Member management',//会员管理
+        'name'=>'Member management', // 会员管理
         'class' => '',
         'icon'=>'el-icon-user',
         'controller'=>'user',

+ 9 - 0
backendApi/config/urlManagerRules.php

@@ -70,6 +70,15 @@ return [
             'GET flow-remain-pv' => 'flow-remain-pv',
         ],
     ],
+    [
+        'class' => 'yii\rest\UrlRule',
+        'pluralize' => false,
+        'controller' => 'v1/ba',
+        'extraPatterns' => [
+            'GET user-list' => 'user-list',
+            'GET order-list' => 'order-list',
+        ],
+    ],
     [
         'class' => 'yii\rest\UrlRule',
         'pluralize' => false,

+ 399 - 0
backendApi/modules/v1/models/lists/ba/OrderList.php

@@ -0,0 +1,399 @@
+<?php
+namespace backendApi\modules\v1\models\lists\ba;
+
+use common\helpers\Cache;
+use common\helpers\Tool;
+use common\helpers\user\Info;
+use common\libs\dataList\DataListInterface;
+
+use common\models\BaApproachOrder;
+use common\models\BaApproachOrderGoods;
+use common\models\BaOrder;
+use common\models\BaOrderGoods;
+
+use common\models\ShopGoods;
+use common\models\BaUser;
+use common\libs\dataList\column\DateTime;
+use yii\data\Pagination;
+use yii\db\Query;
+
+class OrderList extends \common\libs\dataList\DataList implements DataListInterface
+{
+    /**
+     * 列表名称
+     * @return string
+     */
+    public function getListName(){
+        return 'BA订单列表';
+    }
+
+    /**
+     * 列表筛选到的数据
+     */
+    public function dataHandle()
+    {
+        $orderQuery = BaOrder::find()
+            ->alias('O')
+            ->where($this->condition, $this->params)
+            ->select('O.*,U.REAL_NAME,U.DEC_ID,SG.CATEGORY_TYPE,OG.REAL_PRICE,OG.TAX_RATE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV')
+            ->join('LEFT JOIN', BaUser::tableName() . ' AS U', 'U.ID=O.USER_ID')
+            ->join('LEFT JOIN', BaOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
+            ->join('LEFT JOIN', ShopGoods::tableName() . ' AS SG', 'SG.ID=OG.GOODS_ID')
+            ->orderBy('O.CREATED_AT DESC');
+
+        // 订单中间表只查询待支付和支付失败的订单
+        $this->params[':NOT_PAID'] = \Yii::$app->params['orderStatus']['notPaid']['value'];   // 待支付
+        $this->params[':FAIL_PAID'] = \Yii::$app->params['orderStatus']['failPaid']['value'];   // 支付失败
+        $orderStandardQuery = BaApproachOrder::find()
+            ->alias('O')
+            ->where($this->condition . ' AND (O.STATUS = :NOT_PAID OR O.STATUS = :FAIL_PAID)', $this->params)
+            ->select('O.*,U.REAL_NAME,U.DEC_ID,SG.CATEGORY_TYPE,OG.REAL_PRICE,OG.TAX_RATE,OG.BUY_NUMS,OG.SKU_CODE,OG.GOODS_TITLE,OG.REAL_PV')
+            ->join('LEFT JOIN', BaUser::tableName() . ' AS U', 'U.ID=O.USER_ID')
+            ->join('LEFT JOIN', BaApproachOrderGoods::tableName() . ' AS OG', 'OG.ORDER_SN=O.SN')
+            ->join('LEFT JOIN', ShopGoods::tableName() . ' AS SG', 'SG.ID=OG.GOODS_ID')
+            ->orderBy('O.CREATED_AT DESC');
+
+        $queryAll = $orderQuery->union($orderStandardQuery, true);
+        $query = (new Query())->from(['Q' => $queryAll])->select('Q.*')->distinct()->orderBy(['CREATED_AT' => SORT_DESC]);
+
+        $totalCount = $query->count();
+        $pagination = new Pagination(['totalCount' => $totalCount, 'pageSize' => \Yii::$app->request->get('pageSize')]);
+        $lists = $query->offset($pagination->offset)->limit($pagination->limit)->all();
+
+        $this->listData = [
+            'list' => $lists,
+            'currentPage'=>$pagination->page,
+            'totalPages'=>$pagination->pageCount,
+            'startNum' => $pagination->page * $pagination->pageSize + 1,
+            'totalCount' => $pagination->totalCount,
+            'pageSize' => $pagination->pageSize,
+        ];
+
+        foreach ($this->listData['list'] as $key => $value) {
+            $CREATE_USER_ID = Info::getUserIdByUserName($value['CREATE_USER']);
+            $this->listData['list'][$key]['DEC_USER_NAME'] = Info::getUserNameByUserId($value['DEC_ID']);
+            $this->listData['list'][$key]['CREATE_USER_NAME'] = Info::getUserRealNameByUserId($CREATE_USER_ID);
+//            $this->listData['list'][$key]['GOODS_NO'] = '';
+        }
+    }
+
+    /**
+     * 要展示和导出的所有字段
+     * @return array
+     */
+    public function getColumn(){
+        $regionConfig = Cache::getRegionConfig();
+        if(!$this->columns){
+            $this->columns = [
+                'ID' => null,
+                'DEC_SN' => null,
+                'USER_NAME' => [
+                    'header' => 'Member code',//会员编号
+                    'headerOther' => ['width' => '120'],
+                ],
+                'DEC_USER_NAME' => [
+                    'header' => 'Stockist', // 报单中心
+                    'headerOther' => ['width' => '120'],
+                ],
+                'CREATE_USER' => [
+                    'header' => 'Creator No',//创建人编号
+                    'headerOther' => ['width' => '120'],
+                ],
+                'CREATE_USER_NAME' => [
+                    'header' => 'Stockist Name',//创建人姓名
+                    'headerOther' => ['width' => '120'],
+                ],
+                'SN' => [
+                    'header' => 'Order code',//订单号
+                    'headerOther' => ['width' => '200'],
+                ],
+//                'STATUS' => null,
+                'STATUS' => [
+                    'header' => 'Status',//订单状态
+                    'headerOther' => [
+                        'width' => '110',
+                    ],
+                    'value' => function ($row) {
+                        return \Yii::$app->params['orderStatus'][$row['STATUS']]['label'] ?? '';
+                    },
+                ],
+                'SKU_CODE' => [
+                    'header' => 'Product Code',//存货编码
+                    'headerOther' => ['width' => '150'],
+                ],
+                'GOODS_TITLE' => [
+                    'header' => 'Product Name', // 存货名称
+                    'headerOther' => ['width' => '200'],
+                ],
+                'BUY_NUMS' => [
+                    'header' => 'Qty',//数量
+                    'headerOther' => ['width' => '100'],
+                ],
+                'CONSIGNEE' => [
+                    'header' => 'Recipient',//收货人
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                ],
+                'MOBILE' => [
+                    'header' => 'Contact 1',//联系方式1
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                ],
+                'TEL' => [
+                    'header' => 'Contact 2',//联系方式2
+                ],
+                'PROVINCE' => [
+                    'header' => 'State', // 州
+                    'headerOther' => ['width' => '120'],
+                    'value' => function ($row) use($regionConfig) {
+                        return $regionConfig[$row['PROVINCE']]['REGION_NAME'] ?? '';
+                    },
+                ],
+                'CITY' => [
+                    'header' => 'Local Government Area', // 地方政府
+                    'headerOther' => ['width' => '120'],
+                    'value' => function ($row) use($regionConfig) {
+                        return $regionConfig[$row['CITY']]['REGION_NAME'] ?? '';
+                    },
+                ],
+                'COUNTY' => [
+                    'header' => 'City', // 区
+                    'headerOther' => ['width' => '120'],
+                    'value' => function ($row) use($regionConfig) {
+                        return $regionConfig[$row['COUNTY']]['REGION_NAME'] ?? '';
+                    },
+                ],
+//                'AREA' => [
+//                    'header' => '地区',
+//                    // 用于导出
+//                    'value' => function($row) use($regionConfig) {
+//                        $province = $regionConfig[$row['PROVINCE']]['REGION_NAME'] ?? '';
+//                        $city = $regionConfig[$row['CITY']]['REGION_NAME'] ?? '';
+//                        $county = $regionConfig[$row['COUNTY']]['REGION_NAME'] ?? '';
+//                        return $province.$city.$county;
+//                    },
+//                    // 用于前台显示
+//                    'showValue' => function($row) {
+//                        $province = $regionConfig[$row['PROVINCE']]['REGION_NAME'] ?? '';
+//                        $city = $regionConfig[$row['CITY']]['REGION_NAME'] ?? '';
+//                        $county = $regionConfig[$row['COUNTY']]['REGION_NAME'] ?? '';
+//                        return '<div class="addr" title='.$province.$city.$county.'>'.$province.$city.$county.'</div>';
+//                    },
+//                    'headerOther' => [
+//                        'width' => '200'
+//                    ],
+//                ],
+                'ADDRESS' => [
+                    'header' => 'Detailed address',//详细地址
+                    'headerOther' => [
+                        'width' => '300',
+                    ],
+                ],
+                'PERIOD_NUM' => [
+                    'header' => 'Period',//期数
+                ],
+                'ORDER_TYPE' => [
+                    'header' => 'Order type',//订单类型
+                    'headerOther' => ['width' => '120'],
+                    'value' => function ($row) {
+                        switch ($row['ORDER_TYPE']) {
+                            case 'ZC':
+                                return 'Welcome pack';
+                            case 'FX':
+                                return in_array($row['PAY_TYPE'], ['cash', 'pay_stack']) ? 'Reselling': 'Points'; //'重消' : '积分'
+                        }
+                    },
+                ],
+//                'WAREHOUSE' => [
+//                    'header' => 'Delivery warehouse',//发货仓
+//                ],
+                'CREATED_AT' => [
+                    'header' => 'Creation time',//创建时间
+                    'value' => function ($row) {
+                        return (new DateTime([
+                            'value' => $row['CREATED_AT'],
+                        ]))->result();
+                    },
+                    'headerOther' => ['width' => '190'],
+                ],
+                'PAY_TYPE' => [
+                    'header' => 'Pay type',// 支付方式
+                    'value' => function ($row) {
+                        return ShopGoods::payTypes()[$row['PAY_TYPE']]['name'] ?? ShopGoods::payTypes()['cash']['name'];
+                    },
+                    'headerOther' => ['width' => '190'],
+                ],
+                'PAY_AT' => [
+                    'header' => 'Payment time',//支付时间
+                    'value' => function ($row) {
+                        return (new DateTime([
+                            'value' => $row['PAY_AT'],
+                        ]))->result();
+                    },
+                    'headerOther' => ['width' => '190'],
+                ],
+                'DELIVERY_AT' => [
+                    'header' => 'Delivery time',//发货时间
+                    'value' => function ($row) {
+                        return (new DateTime([
+                            'value' => $row['DELIVERY_AT'],
+                        ]))->result();
+                    },
+                    'headerOther' => ['width' => '190'],
+                ],
+                'REAL_PRICE' => [
+                    'header' => 'Item Pricing',//商品单价
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                    'value' => function ($row) {
+                        return Tool::formatPrice($row['REAL_PRICE']);
+                    },
+                    'valueOther' => function ($row) {
+                        return [
+                            'tag' => ['type' => 'danger', 'size' => 'small', 'class' => 'no-border']
+                        ];
+                    },
+                ],
+                'REAL_PV' => [
+                    'header' => 'Commodity amount',//商品金额
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                    'value' => function ($row) {
+                        return Tool::formatPrice($row['REAL_PV']);
+                    },
+                    'valueOther' => function ($row) {
+                        return [
+                            'tag' => ['type' => 'danger', 'size' => 'small', 'class' => 'no-border']
+                        ];
+                    },
+                ],
+                'PAY_FREIGHT' => [
+                    'header' => 'Freight',//运费
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                    'value' => function ($row) {
+                        return Tool::formatPrice($row['FREIGHT']);
+                    },
+                    'valueOther' => function ($row) {
+                        return [
+                            'tag' => ['type' => 'danger', 'size' => 'small', 'class' => 'no-border']
+                        ];
+                    },
+                ],
+                'TAX_RATE' => [
+                    'header' => 'Tax Rate',//税率
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                    'value' => function ($row) {
+                        return Tool::formatPrice($row['TAX_RATE']);
+                    },
+                    'valueOther' => function ($row) {
+                        return [
+                            'tag' => ['type' => 'danger', 'size' => 'small', 'class' => 'no-border']
+                        ];
+                    },
+                ],
+                'TAX_AMOUNT' => [
+                    'header' => 'Tax',//税额
+                    'headerOther' => [
+                        'width' => '150',
+                    ],
+                    'value' => function ($row) {
+                        return Tool::formatPrice(($row['REAL_PRICE'] - $row['REAL_PRICE'] / (1 + $row['TAX_RATE'] / 100)));
+                    },
+                    'valueOther' => function ($row) {
+                        return [
+                            'tag' => ['type' => 'danger', 'size' => 'small', 'class' => 'no-border']
+                        ];
+                    },
+                ],
+                'EXPRESS_COMPANY' => [
+                    'header' => 'Courier Services Company',//快递公司
+                    'headerOther' => ['width' => '150'],
+                ],
+                'ORDER_TRACK_NO' => [
+                    'header' => 'Courier Number',//快递单号
+                    'headerOther' => ['width' => '200'],
+                ],
+                'EXPRESS_TYPE' => [
+                    'header' => 'Shipping Method',//发货方式
+                    'headerOther' => ['width' => '150'],
+                    'value' => function ($row) {
+                        return $row['EXPRESS_TYPE']==0 ? 'mailing ':' auto pick ';//'邮寄' : '自提'
+                    },
+                ],
+                'FRONT_REMARK' => [
+                    'header' => 'Member Notes',//会员备注
+                    'headerOther' => [
+                        'width' => '200',
+                    ],
+                    'value' => function ($row) {
+                        return $row['FRONT_REMARK'];
+                    },
+                    'showValue' => function ($row) {
+                        return '<div title="'.$row['FRONT_REMARK'].'" style="width:180px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">'.$row['FRONT_REMARK'].'</div>';
+                    },
+                ],
+                'DELIVERY_STATUS' => null,
+                'DELIVERY_STATUS_NAME' => [
+                    'header' => 'Shipment Status',//发货状态
+                    'headerOther' => [
+                        'width' => '110',
+                    ],
+                    'value' => function ($row) {
+                        return \Yii::$app->params['deliveryStatus'][$row['DELIVERY_STATUS']]['label'] ?? '';
+                    },
+                ],
+                'IS_AUTO' => [
+                    'header' => 'Is Auto', // 是否自动
+                    'value' => function ($row) {
+                        return $row['IS_AUTO'] == 1 ? 'Yes' : 'No';
+                    },
+                ],
+            ];
+        }
+        return $this->columns;
+    }
+
+    /**
+     * 前台用于筛选的类型集合
+     * @return mixed
+     */
+    public function getFilterTypes()
+    {
+        if(!$this->filterTypes){
+            $this->filterTypes = [
+                'SN'=> ['name'=> 'Order No'],//订单编号
+                'USER_NAME'=> ['name'=> 'Member code'],//会员编号
+                'MOBILE'=> ['name'=> 'Contact 1'],//联系方式1
+                'ORDER_TYPE'=> ['name'=> 'Order Type'],
+                'PERIOD_NUM'=> ['name'=> 'Number of periods'],//期数
+                'CREATED_AT'=> ['name'=> 'Creation time', 'other'=>'date'],//创建时间
+                'STATUS'=> [
+                    'name'=> 'Status',
+                    'other'=> 'select',
+                    'selectData'=> [
+                        ['id' => \Yii::$app->params['orderStatus']['paid']['value'], 'name' => \Yii::$app->params['orderStatus']['paid']['label']],
+                        ['id' => \Yii::$app->params['orderStatus']['notPaid']['value'], 'name' => \Yii::$app->params['orderStatus']['notPaid']['label']],
+                        ['id' => \Yii::$app->params['orderStatus']['failPaid']['value'], 'name' => \Yii::$app->params['orderStatus']['failPaid']['label']]
+                    ]
+                ],
+                'IS_AUTO' => [
+                    'name'=>'Is Auto',
+                    'other'=> 'select',
+                    'selectData'=> [
+                        ['id'=>1, 'name'=>'YES'],
+                        ['id'=>0, 'name'=>'NO'],
+                    ]
+                ]
+            ];
+        }
+        return $this->filterTypes;
+    }
+}

+ 371 - 0
backendApi/modules/v1/models/lists/ba/UserList.php

@@ -0,0 +1,371 @@
+<?php
+namespace backendApi\modules\v1\models\lists\ba;
+
+use common\helpers\Cache;
+use common\helpers\http\BackendToFrontendApi;
+use common\helpers\user\Info;
+use common\libs\dataList\DataListInterface;
+use common\models\DecRole;
+use common\models\OpenBank;
+use common\models\Region;
+use common\models\BaUser;
+use common\models\BaUserInfo;
+use common\libs\dataList\column\DateTime;
+use common\libs\dataList\column\YesNo;
+use common\models\UserNetwork;
+use common\models\UserSystem;
+use Yii;
+
+class UserList extends \common\libs\dataList\DataList implements DataListInterface
+{
+    /**
+     * 列表名称
+     * @return string
+     */
+    public function getListName(){
+        return 'BA会员列表';
+    }
+
+    /**
+     * 列表筛选到的数据
+     */
+    public function dataHandle()
+    {
+//        $this->condition .= ' AND UN.USER_ID=UI.USER_ID AND UN.PARENT_UID=UI.CON_UID';
+        $this->listData = BaUser::lists($this->condition, $this->params, [
+            'select' => 'U.*,
+                UI.USER_ID, UI.ZC_PV, UI.CON_UID, UI.REC_UID, UI.CON_NUM, UI.REC_NUM, UI.NETWORK_DEEP, 
+                UI.RELATION_DEEP, UI.SYSTEM_ID, UI.IS_GROUP_LEADER, UI.IS_SYSTEM_LEADER, UI.IS_TEAM, UI.IS_BIND, 
+                UI.IS_TEAM_MAIN, UI.IS_BIND_MAIN, UI.IS_AUTO_WITHDRAW, UI.CLOSE_LOGIN, UI.REG_TYPE, UI.SHOULD_REG_TYPE, 
+                UI.REG_NAME, UI.CREDIT_CODE, UI.PREMISES, UI.LEGAL_PERSON, UI.REG_EXPIRES, UI.STORE_TYPE, UI.INVOICE_BALANCE, 
+                UI.HIGHEST_EMP_LV, UI.CLOSE_LOGIN_AT, UI.PULLED_AT, 
+                UI.GROUP_LEADER_AT, UI.ALLOW_TRANSFER, UI.ALLOW_RECONSUME_SMS, UI.ALLOW_RECONSUME_SMS_TO, 
+                UI.HIGHEST_EMP_LV_PERIOD, UI.TRANSFER_PROP, UI.LOGIN_NUMS, UI.FAIL_NUMS, UI.LAST_LOGIN_IP, 
+                CU.USER_NAME CON_USER_NAME,CU.REAL_NAME CON_REAL_NAME,
+                RU.USER_NAME REC_USER_NAME,RU.REAL_NAME REC_REAL_NAME,
+                DU.USER_NAME DEC_USER_NAME
+                ',
+            'orderBy' => 'UI.CREATED_AT DESC, UI.ID DESC',
+            'from' => BaUser::tableName() . ' AS U',
+            'join' => [
+                ['LEFT JOIN', BaUserInfo::tableName() . ' AS UI', 'UI.USER_ID=U.ID'],
+//                ['LEFT JOIN', UserNetwork::tableName() . ' AS UN', 'UI.USER_ID=UN.USER_ID'],
+                ['LEFT JOIN', BaUser::tableName() . ' AS CU', 'UI.CON_UID=CU.ID'],
+                ['LEFT JOIN', BaUser::tableName() . ' AS RU', 'UI.REC_UID=RU.ID'],
+                ['LEFT JOIN', BaUser::tableName() . ' AS DU', 'U.DEC_ID=DU.ID'],
+            ],
+            'page' => $this->page,
+            'pageSize' => $this->pageSize,
+        ]);
+        foreach ($this->listData['list'] as $key => $value) {
+            // 后台访问前台的请求参数
+            if (!$this->isExport && Yii::$app->user->validateAdminAction('user', 'login-to-frontend')) {
+                $urlParams = BackendToFrontendApi::paramsFormat(['id' => $value['USER_ID']]);
+                $urlParamStr = '';
+                foreach ($urlParams as $pKey => $pValue) {
+                    $urlParamStr .= $pKey . '=' . $pValue . '&';
+                }
+                $urlParamStr = substr($urlParamStr, 0, -1);
+                $this->listData['list'][$key]['BTF_URL'] = $urlParamStr;
+            } else {
+                $this->listData['list'][$key]['BTF_URL'] = null;
+            }
+        }
+    }
+
+    /**
+     * 要展示和导出的所有字段
+     * @return array
+     */
+    public function getColumn(){
+//        $decLevelConfig = Cache::getDecLevelConfig();
+//        $empLevelConfig = Cache::getEmpLevelConfig();
+//        $crownLevelConfig = Cache::getStarCrownLevelConfig();
+//        $decRoleConfig = DecRole::getAllData();
+//        $systemConfig = UserSystem::getAllSystems();
+        $openBankConfig = OpenBank::getAllOpenBank();
+        $regionConfig = Cache::getRegionConfig();
+        if(!$this->columns){
+            $this->columns = [
+                'USER_ID' => null, // 这种传输方式主要是用于索引,因为过滤后的字段可能没有这种ID,但是一些功能的操作还需要用这种ID去关联,例如前台会员列表中的勾选批量状态管理,这里需要的就是USER_ID
+                'BTF_URL' => null,
+                'USER_NAME' => [
+                    'header' => 'Member code',//会员编号
+                    'headerOther' => ['width' => '150'],
+                ],
+                'REAL_NAME' => [
+                    'header' => 'Member name',//会员姓名
+                    'headerOther' => [
+                        'width' => '120',
+                    ],
+                    'valueOther' => [
+                        'tag'=>['type'=>'success', 'size' => 'small', 'class'=>'no-border']
+                    ],
+                ],
+                'LOGIN_STATUS_NAME' => [
+                    'header' => 'Login status',//登录状态
+                    'value' => function($row) {
+                        return $row['ALLOW_LOGIN'] == 1 ? 'allow Login': 'prohibit Login';//'允许登录' : '禁止登录'
+                    },
+                    'headerOther' => ['width' => '110'],
+                ],
+                'STATUS' => [
+                    'header' => 'Status',//状态
+                    'value' => function($row) {
+                        return $row['STATUS'] == 1 ? 'activate': 'lock';//'激活' : '锁定'
+                    },
+                    'headerOther' => ['width' => '110'],
+                ],
+                'ALLOW_LOGIN' => ['header' => 'Filter allow login','hidden'=>true],//筛选允许登录
+                'CREATED_AT' => [
+                    'header' => 'Joining Date', // 加入日期
+                    'value' => function($row) {
+                        return (new DateTime([
+                            'value' => $row['CREATED_AT'],
+                        ]))->result();
+                    },
+                    'headerOther' => ['width' => '170'],
+                ],
+//                'PERIOD_AT' => [
+//                    'header' => 'Joining Period',//加入期数
+//                    'headerOther' => ['width' => '180'],
+//                ],
+//                'DEC_LV_NAME' => [
+//                    'header' => 'Real time membership level',//实时会员级别
+//                    'headerOther' => [
+//                        'width' => '120',
+//                    ],
+//                    'value' => function($row) use($decLevelConfig) {
+//                        return $decLevelConfig[$row['DEC_LV']]['LEVEL_NAME'];
+//                    },
+//                    'valueOther' => [
+//                        'tag'=>['type'=>'warning', 'size' => 'small', 'class'=>'no-border']
+//                    ],
+//                ],
+//                'DEC_LV_UPDATED_AT' => [
+//                    'header' => 'Real time adjustment date',//实时调整日期
+//                    'value' => function($row) {
+//                        return (new DateTime([
+//                            'value' => $row['DEC_LV_UPDATED_AT'],
+//                        ]))->result();
+//                    },
+//                    'headerOther' => ['width' => '160'],
+//                ],
+//                'LAST_DEC_LV_NAME' => [
+//                    'header' => 'Member level at settlement',//结算时会员级别
+//                    'headerOther' => [
+//                        'width' => '120',
+//                    ],
+//                    'value' => function($row) use($decLevelConfig) {
+//                        if (!$row['LAST_DEC_LV']) {
+//                            return $decLevelConfig[$row['DEC_LV']]['LEVEL_NAME'];
+//                        } else {
+//                            return $decLevelConfig[$row['LAST_DEC_LV']]['LEVEL_NAME'];
+//                        }
+//                    },
+//                    'valueOther' => [
+//                        'tag'=>['type'=>'warning', 'size' => 'small', 'class'=>'no-border']
+//                    ],
+//                ],
+//                'EMP_LV_NAME' => [
+//                    'header' => 'Real time employment',//实时聘级
+//                    'headerOther' => [
+//                        'width' => '130',
+//                    ],
+//                    'value' => function($row) use($empLevelConfig) {
+//                        return isset($empLevelConfig[$row['EMP_LV']])?$empLevelConfig[$row['EMP_LV']]['LEVEL_NAME']:'';
+//                    },
+//                    'valueOther' => [
+//                        'tag'=>['type'=>'warning', 'size' => 'small', 'class'=>'no-border']
+//                    ],
+//                ],
+//                'CROWN_LV_NAME' => [
+//                    'header' => 'Real time crown', // 实时星级
+//                    'headerOther' => [
+//                        'width' => '130',
+//                    ],
+//                    'value' => function($row) use($crownLevelConfig) {
+//                        return isset($crownLevelConfig[$row['CROWN_LV']])?$crownLevelConfig[$row['CROWN_LV']]['LEVEL_NAME']:'';
+//                    },
+//                    'valueOther' => [
+//                        'tag'=>['type'=>'warning', 'size' => 'small', 'class'=>'no-border']
+//                    ],
+//                ],
+                'REC_USER_NAME' => [
+                    'header' => 'Recommendation No',//推荐编号
+                    'headerOther' => ['width' => '150'],
+                ],
+                'REC_REAL_NAME' => [
+                    'header' => 'Recommended name',//推荐姓名
+                    'headerOther' => ['width' => '100'],
+                ],
+//                'CON_USER_NAME' => [
+//                    'header' => 'Placement No',//安置编号
+//                    'headerOther' => ['width' => '150'],
+//                ],
+//                'CON_REAL_NAME' => [
+//                    'header' => 'Placement Name',//安置姓名
+//                    'headerOther' => ['width' => '100'],
+//                ],
+                'MOBILE' => [
+                    'header' => 'Phone Number',//手机号码
+                    'value' => function($row) {
+                        return "\t".$row['MOBILE'];
+                    },
+                    'headerOther' => ['width' => '120'],
+                ],
+                'TEL' => [
+                    'header' => 'Alternate Phone Number', // 备用手机号码
+                    'value' => function($row) {
+                        return "\t".$row['TEL'];
+                    },
+                    'headerOther' => ['width' => '120'],
+                ],
+                'DEC_USER_NAME' => [
+                    'header' => 'Stockist Code', // 所属报单中心编号
+                    'headerOther' => ['width' => '150'],
+                ],
+//                'IS_DEC' => [
+//                    'header' => 'Declaration center or not',//是否报单中心
+//                    'value' => function($row) {
+//                        return (new YesNo([
+//                            'value' => $row['IS_DEC'],
+//                        ]))->result();
+//                    },
+//                    'headerOther' => function($row) {
+//                        return [
+//                            'width' => '120',
+//                        ];
+//                    },
+//                    'valueOther' => function($row) {
+//                        return [
+//                            'tag'=>['type'=>(isset($row['IS_DEC']) && $row['IS_DEC'] )? 'success' : 'info', 'size' => 'small']
+//                        ];
+//                    },
+//                ],
+//                'IS_ATLAS' => [
+//                    'header' => 'Whether the atlas is displayed',//是否显示图谱
+//                    'value' => function($row) {
+//                        return (new YesNo([
+//                            'value' => $row['IS_ATLAS'],
+//                        ]))->result();
+//                    },
+//                    'headerOther' => function($row) {
+//                        return [
+//                            'width' => '120',
+//                        ];
+//                    },
+//                    'valueOther' => function($row) {
+//                        return [
+//                            'tag'=>['type'=>(isset($row['IS_ATLAS']) && $row['IS_ATLAS'] )? 'success' : 'info', 'size' => 'small']
+//                        ];
+//                    },
+//                ],
+//                'IS_RECHARGE' => [
+//                    'header' => 'Whether to display recharge',//是否显示充值
+//                    'value' => function($row) {
+//                        return (new YesNo([
+//                            'value' => $row['IS_RECHARGE'],
+//                        ]))->result();
+//                    },
+//                    'headerOther' => function($row) {
+//                        return [
+//                            'width' => '120',
+//                        ];
+//                    },
+//                    'valueOther' => function($row) {
+//                        return [
+//                            'tag'=>['type'=>(isset($row['IS_RECHARGE']) && $row['IS_RECHARGE'] )? 'success' : 'info', 'size' => 'small']
+//                        ];
+//                    },
+//                ],
+//                'DEC_ROLE_NAME' => [
+//                    'header' => 'Stockist Level',//报单中心级别
+//                    'headerOther' => ['width' => '110'],
+//                    'value' => function($row) use($decRoleConfig) {
+//                        return $decRoleConfig[$row['DEC_ROLE_ID']]['ROLE_NAME'] ?? '';
+//                    },
+//                ],
+                'OPEN_BANK_NAME' => [
+                    'header' => 'Bank Name',//开户银行
+                    'headerOther' => ['width' => '110'],
+                    'value' => function($row) use($openBankConfig) {
+                        return $openBankConfig[$row['OPEN_BANK']]['BANK_NAME'] ?? '';
+                    },
+                ],
+                'BANK_NO' => [
+                    'header' => 'Bank account number',//银行帐号
+                    'headerOther' => ['width' => '220'],
+                    'value' => function($row) {
+                        return "\t".$row['BANK_NO'];
+                    },
+                ],
+                'AREA' => [
+                    'header' => 'Common address',//常用地址
+                    'value' => function($row) use($regionConfig) {
+                        $province = $regionConfig[$row['PROVINCE']]['REGION_NAME'] ?? '';
+                        $city = $regionConfig[$row['CITY']]['REGION_NAME'] ?? '';
+                        $county = $regionConfig[$row['COUNTY']]['REGION_NAME'] ?? '';
+                        return $province.$city.$county;
+                    },
+                    'showValue' => function($row) {
+                        $province = $regionConfig[$row['PROVINCE']]['REGION_NAME'] ?? '';
+                        $city = $regionConfig[$row['CITY']]['REGION_NAME'] ?? '';
+                        $county = $regionConfig[$row['COUNTY']]['REGION_NAME'] ?? '';
+                        return '<div class="addr" title='.$province.$city.$county.'>'.$province.$city.$county.'</div>';
+                    },
+                    'headerOther' => [
+                        'width' => '200'
+                    ],
+                ],
+//                'ALLOW_TRANSFER' => [
+//                    'header' => 'Enable "Transfer"', // 转账功能开启
+//                    'value' => function($row) {
+//                        return $row['ALLOW_TRANSFER'] == 1 ? 'on': 'off';//'开启' : '关闭'
+//                    },
+//                    'headerOther' => function($row) {
+//                        return [
+//                            'width' => '120',
+//                        ];
+//                    },
+//                    'valueOther' => function($row) {
+//                        return [
+//                            'tag'=>['type'=>(isset($row['ALLOW_TRANSFER']) && $row['ALLOW_TRANSFER']) ? 'success' : 'info', 'size' => 'small']
+//                        ];
+//                    },
+//                ],
+            ];
+        }
+        return $this->columns;
+    }
+
+    /**
+     * 前台用于筛选的类型集合
+     * @return mixed
+     */
+    public function getFilterTypes()
+    {
+        if(!$this->filterTypes){
+            $this->filterTypes = [
+                'USER_NAME'=> ['name'=> 'Member code'], // 会员编号
+                'REAL_NAME'=> ['name'=> 'Member name'], // 会员姓名
+                'CREATED_AT'=> ['name'=> 'Joining Date', 'other'=> 'date'], // 加入日期
+                'PERIOD_AT'=> ['name'=> 'Joining Period'], // 加入期数
+                'DEC_LV_NAME'=> ['name'=> 'Real time membership level', 'other'=> 'decLevel'], // 实时会员级别
+                'EMP_LV_NAME'=> ['name'=> 'Real time employment', 'other'=> 'empLevel'], // 实时聘级
+                'CROWN_LV_NAME'=> ['name'=> 'Real time Crown', 'other'=> 'crownLevel'], // 实时聘级
+                'REC_USER_NAME'=> ['name'=> 'Recommendation No'],//推荐编号
+                'CON_USER_NAME'=> ['name'=> 'Placement No'],//安置编号
+                'ID_CARD'=> ['name'=> 'Identification Number'],//证件号码
+                'MOBILE'=> ['name'=> 'Phone Number'],//手机号码
+                'DEC_USER_NAME'=> ['name'=> 'Stockist Code'], // 所属报单中心编号
+                'IS_DEC'=> ['name'=> 'Declaration center or not', 'other'=> 'yesOrNo'],//是否报单中心
+                'IS_STUDIO'=> ['name'=> 'Studio or not', 'other'=> 'yesOrNo'],//是否工作室
+                'DEC_ROLE_NAME'=> ['name'=> 'Stockist Level', 'other'=> 'decRole'],//报单中心级别
+                'AREA'=> ['name'=> 'Common address', 'other'=> 'area'],//常用地址
+                'STATUS'=> ['name'=> 'Active status', 'other'=> 'select', 'selectData'=> [['id'=> 0, 'name'=> 'locking'],['id'=> 1, 'name'=> 'activation']]],
+            ];
+        }
+        return $this->filterTypes;
+    }
+}

+ 31 - 0
backendEle/src/router/index.js

@@ -179,6 +179,37 @@ export const constantRouterMap = [
       },
     ],
   },
+  {
+    path: '/ba',
+    component: layout,
+    redirect: '/ba/index',
+    children: [
+      {
+        path: '/ba/user-list',
+        component: _import('ba/user-list'),
+        name: 'ba_user-list',
+        meta: {
+          title: 'Brand Ambassador List', // 会员列表
+          breadcrumb: [
+            {title: 'Dashboard', path: '/dashboard/index'}, // Dashboard
+            {title: 'Member management', path: '/user/index'} // 会员管理
+          ]
+        }
+      },
+      {
+        path: '/ba/order-list',
+        component: _import('ba/order-list'),
+        name: 'ba_order-list',
+        meta: {
+          title: 'Brand Ambassador Order', // 订单列表
+          breadcrumb: [
+            {title: 'Dashboard', path: '/dashboard/index'}, // Dashboard
+            {title: 'Member management', path: '/user/index'} // 会员管理
+          ]
+        }
+      }
+    ]
+  },
   {
     path: '/user',
     component: layout,

+ 253 - 0
backendEle/src/views/ba/order-list.vue

@@ -0,0 +1,253 @@
+<template>
+  <div v-loading="loading">
+    <div class="white-box">
+      <div class="filter-box">
+        <filter-user :filter-types="filterTypes" @select-value="handleFilterUser"></filter-user>
+      </div>
+      <el-table class="table-box" ref="multipleTable" :data="tableData" stripe style="width: 100%;"
+                @selection-change="handleSelectionChange"
+                :height="tool.getTableHeight()">
+        <el-table-column type="selection" width="70" v-if="tableHeaders"></el-table-column>
+        <el-table-column v-for="(tableHeader, key) in tableHeaders" :key="key" :label="tableHeader.header" :width="tableHeader.other.width ? tableHeader.other.width : ''" :prop="tableHeader.other.prop ? tableHeader.other.prop : null">
+          <template slot-scope="scope">
+            <template v-if="scope.row[tableHeader.index].other.tag" >
+              <el-tag :type="scope.row[tableHeader.index].other.tag.type ? scope.row[tableHeader.index].other.tag.type : null" :size="scope.row[tableHeader.index].other.tag.size ? scope.row[tableHeader.index].other.tag.size : null" :class="scope.row[tableHeader.index].other.tag.class ? scope.row[tableHeader.index].other.tag.class : null" >{{scope.row[tableHeader.index].value}}</el-tag>
+            </template>
+            <template v-else>
+              <div v-html="scope.row[tableHeader.index].value"></div>
+            </template>
+          </template>
+        </el-table-column>
+        <el-table-column fixed="right" label="Action" width="180">&lt;!&ndash; 操作 &ndash;&gt;
+         <template slot-scope="scope">
+            <el-dropdown size="small" trigger="click">
+              <el-button type="primary" size="small" @click.stop="">
+                Action<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="edit" @click.native="handleDel(scope.row)" v-if="permission.hasPermission(`shop/edit`)">Delete order</el-dropdown-item>
+                <!-- <el-dropdown-item command="edit" @click.native="handleEdit(scope.row)" v-if="permission.hasPermission(`shop/edit`)">Edit order&lt;!&ndash; 编辑订单 &ndash;&gt;</el-dropdown-item>
+                <el-dropdown-item command="delivery" @click.native="handleShowDeliveryDialog(scope.row)" v-if="permission.hasPermission(`shop/order-delivery`) && scope.row['STATUS'] === '1' && scope.row['DELIVERY_STATUS'] === '0' ">deliver goods&lt;!&ndash; 发货 &ndash;&gt;</el-dropdown-item>
+                <el-dropdown-item command="refund" @click.native="handleRefund(scope.row.SN)" v-if="permission.hasPermission(`shop/order-delivery`) && scope.row['PAY_TYPE'] === 'pay_stack' && scope.row['STATUS'] === '1' && scope.row['DELIVERY_STATUS'] === '0' ">Refund&lt;!&ndash; 退款 &ndash;&gt;</el-dropdown-item> -->
+              </el-dropdown-menu>
+            </el-dropdown>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="white-box-footer">
+        <el-button type="success" size="small" @click="handleExport" v-show="permission.hasPermission(`shop/order-list-export`)">Export Excel</el-button>
+        <el-button type="primary" size="small" @click="handleExportPDF" v-show="permission.hasPermission(`shop/order-list-export`)">Export PDF</el-button>
+        <pagination :total="totalCount" :page_size="pageSize" @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"></pagination>
+      </div>
+    </div>
+
+    <el-dialog title="deliver goods" :visible.sync="dialogDeliveryVisible"><!-- 发货 -->
+      <el-form :model="deliveryForm" label-width="150px" class="form-dialog">
+        <el-form-item label="Courier Services Company"><!-- 快递公司 -->
+          <el-input v-model="deliveryForm.expressCompany"></el-input>
+        </el-form-item>
+        <el-form-item label="courier number"><!-- 快递单号 -->
+          <el-input v-model="deliveryForm.orderTrackNo"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogDeliveryVisible = false">Cancel<!-- 取 消 --></el-button>
+        <el-button type="primary" @click.native="handleDelivery">deliver goods<!-- 发货 --></el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import network from '@/utils/network'
+import tool from '@/utils/tool'
+import baseInfo from '@/utils/baseInfo'
+import FilterUser from '@/components/FilterUser'
+import permission from '@/utils/permission'
+import Pagination from '@/components/Pagination'
+import filterHelper from '@/utils/filterHelper'
+
+export default {
+  name: 'shop_order-list',
+  components: {FilterUser, Pagination},
+  mounted () {
+    this.getData()
+  },
+  data () {
+    return {
+      tableHeaders: null,
+      tableData: null,
+      tableHeight: window.innerHeight - 310,
+      loading: true,
+      multipleSelection: [],
+      currentPage: 1,
+      totalPages: 1,
+      totalCount: 1,
+      pageSize: 20,
+      tool: tool,
+      permission: permission,
+      filterTypes: null,
+      filterModel: {},
+      dialogDeliveryVisible: false,
+      deliveryForm: {
+        sn: '',
+        expressCompany: '',
+        orderTrackNo: ''
+      }
+    }
+  },
+  methods: {
+    handleSelectionChange (val) {
+      this.multipleSelection = val
+    },
+    handleCurrentChange (page) {
+      this.getData(page, this.pageSize)
+    },
+    handleSizeChange (pageSize) {
+      this.getData(this.currentPage, pageSize)
+    },
+    handleFilterUser (filterData) {
+      filterHelper.handleFilterUser(this, filterData)
+    },
+    getData (page, pageSize) {
+      let filterData = this.filterModel
+      network.getPageData(this, 'ba/order-list', page, pageSize, filterData, response => {
+        this.filterTypes = response.filterTypes
+        this.allData = response
+      })
+    },
+    handleExport () {
+      this.$confirm(`Are you sure you want to export the current data?`, 'Hint', { // `确定要导出当前数据吗?`, '提示'
+        confirmButtonText: 'confirm', // 确定
+        cancelButtonText: 'cancel', // 取消
+        type: 'warning'
+      }).then(() => {
+        return network.getData(`shop/order-list-export`, this.filterModel)
+      }).then(response => {
+        this.$message({
+          message: response,
+          type: 'success'
+        })
+      }).catch(response => {
+
+      })
+    },
+    handleExportPDF () {
+      if (this.multipleSelection.length === 0) {
+        this.$message({
+          message: 'Please select an order to export', // 请选择一条订单导出
+          type: 'error'
+        })
+        return false
+      }
+
+      // 提取订单ID
+      let orderSnList = this.multipleSelection.map((item) => item.SN.value || '')
+      // 去重
+      let orderSnSet = Array.from(new Set(orderSnList))
+      if (orderSnSet.length !== 1) {
+        this.$message({
+          message: 'Only one order can be exported at a time', // 每次只能导出一条订单
+          type: 'error'
+        })
+        return false
+      }
+
+      this.$confirm(`Are you sure you want to export the current data?`, 'Hint', { // `确定要导出当前数据吗?`, '提示'
+        confirmButtonText: 'confirm', // 确定
+        cancelButtonText: 'cancel', // 取消
+        type: 'info'
+      }).then(() => {
+        // 导出时只需要订单ID即可
+        let orderSn = orderSnSet[0]
+        network.getData(`shop/order-list-export-pdf/${orderSn}`).then(response => {
+          this.$message({
+            message: response,
+            type: 'success'
+          })
+        })
+      }).catch(response => {
+        this.$message({
+          message: response,
+          type: 'error'
+        })
+      })
+    },
+    handleEdit () {
+      // 进入修改订单页面
+    },
+    handleDel (row) {
+      let orderSn = row.SN.value // order订单表的编号
+      this.$confirm(`确定要删除订单:${orderSn}吗?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        // 删除订单
+        let postData = {
+          orderSn
+        }
+        return network.postData('shop/delete-order', postData).then(response => {
+          console.log(response)
+          this.$message({
+            message: response,
+            type: 'success'
+          })
+          this.submitButtonStat = false
+          this.$router.go(0)
+        }).catch(() => {
+          this.submitButtonStat = false
+        })
+      }).then(response => {
+
+      }).catch(response => {
+
+      })
+    },
+    // 显示发货对话框
+    handleShowDeliveryDialog (row) {
+      this.dialogDeliveryVisible = true
+      this.deliveryForm.sn = row['SN'].value
+    },
+    // 发货
+    handleDelivery () {
+      network.postData('shop/order-delivery', this.deliveryForm).then(response => {
+        this.$message({
+          message: response,
+          type: 'success'
+        })
+        this.dialogDeliveryVisible = false
+        this.getData(this.currentPage, this.pageSize)
+      }).catch(response => {
+        this.dialogDeliveryVisible = false
+      })
+    },
+    // 退款
+    handleRefund (orderSn) {
+      this.$confirm(`Are you sure you want to refund this order?`, 'Hint', { // `确定要将此订单退款吗?`, '提示',
+        confirmButtonText: 'confirm', // 确定
+        cancelButtonText: 'cancel', // 取消
+        type: 'warning'
+      }).then(() => {
+        return network.postData(`shop/order-refund`, { sn: orderSn.value })
+      }).then(response => {
+        this.$message({
+          message: response,
+          type: 'success'
+        })
+        this.getData(this.currentPage, this.pageSize)
+      }).catch(response => {
+        this.$message({
+          message: response,
+          type: 'error'
+        })
+      })
+    }
+  }
+}
+
+</script>
+
+<style scoped>
+</style>

+ 517 - 0
common/models/BaUser.php

@@ -0,0 +1,517 @@
+<?php
+
+namespace common\models;
+
+use common\helpers\Cache;
+use common\helpers\Tool;
+use common\helpers\user\Info;
+use Yii;
+use yii\helpers\Json;
+use common\libs\logging\operate\valueType\Config as ValueTypeConfig;
+
+/**
+ * This is the model class for table "{{%USER}}".
+ *
+ * @property string $ID
+ * @property string $USER_NAME 帐号
+ * @property string $PASSWORD_HASH 登录密码
+ * @property string $PAY_PASSWORD 支付密码
+ * @property int $NATION 民族
+ * @property string $REAL_NAME 姓名
+ * @property string $ID_CARD 身份证号
+ * @property int $ID_TYPE 证件类型
+ * @property string $MOBILE 手机号
+ * @property string $ADDRESS 身份证地址
+ * @property string $ID_IMAGE 证件图片
+ * @property string $OPEN_BANK 开户行
+ * @property string $BANK_ADDRESS 银行地址
+ * @property string $BANK_NO 银行卡号
+ * @property int $BANK_PROVINCE 银行省份
+ * @property int $BANK_CITY 银行城市
+ * @property int $BANK_COUNTY 银行县区
+ * @property string $SPOUSE_NAME 配偶姓名
+ * @property string $SPOUSE_IDCARD 配偶证件号
+ * @property int $CREATED_AT 创建时间
+ * @property int $UPDATED_AT 更新时间
+ * @property int $STATUS 状态
+ * @property int $DEC_CLOSED 是否关闭报单功能
+ * @property int $DEC_CLOSED_AT 关闭时间
+ * @property string $DEC_LV 报单级别
+ * @property string $EMP_LV 聘级
+ * @property string $CROWN_LV 星级
+ * @property int $PROVINCE 省份
+ * @property int $CITY 城市
+ * @property int $COUNTY 县区
+ * @property string $TEL 座机
+ * @property string $SUB_COM_ID 子公司ID
+ * @property string $AVATAR 头像
+ * @property int $DELETED 是否删除
+ * @property int $DELETED_AT 删除时间
+ * @property int $IS_DEC 是否为报单中心
+ * @property int $IS_ATLAS 是否显示图谱
+ * @property int $IS_RECHARGE 是否显示充值
+ * @property string $DEC_ID 报单中心ID
+ * @property string $BIRTHDAY 生日
+ * @property string $DEC_ROLE_ID 报单中心级别
+ * @property int $PERIOD_AT 期数
+ * @property int $DEC_PROVINCE 报单中心所属的省份
+ * @property int $DEC_CITY 报单中心所属的城市
+ * @property int $DEC_COUNTY 报单中心所属的县区
+ * @property int $IS_UNION 是否为点位合作
+ * @property int $STATUS_AT 状态更改时间
+ * @property int $VERIFIED 是否认证
+ * @property int $VERIFIED_AT 认证时间
+ * @property int $ALLOW_LOGIN 允许登录
+ * @property int $NOT_OPERATING 不运作
+ * @property int $REG_FROM 注册类型
+ * @property string $ID_CARD_PREFIX 身份证前缀
+ * @property string $SEX 性别
+ * @property string $DEC_ACCOUNT_OLD 老系统中的报单中心编号
+ * @property int $BANK_UPDATED_AT 银行信息更新时间
+ * @property int $IS_DIRECT_SELLER 是否为直销员
+ * @property int $DEC_LV_UPDATED_AT 报单级别更新时间
+ * @property int $DEC_LV_UPDATED_PERIOD 报单级别更新期数
+ * @property string $DEC_ADDRESS 报单中心详细地址
+ * @property string $DEC_PHONE 报单中心电话
+ * @property string $GUARANTOR 担保人编号
+ * @property string $GUARANTOR_NAME 担保人姓名
+ * @property int $PART_FUNC_CLOSED 部分功能开启
+ * @property int $LAST_DEC_LV_UPDATED_PERIOD 上次报单级别更新期数
+ * @property string $USER_CREATOR 创建人
+ * @property string $USER_UPDATER 修改人
+ * @property int $LAST_DEC_LV_UPDATED_AT 上次报单级别更新时间
+ * @property int $DEC_CREATED_AT 成为报单中心时间
+ * @property string $PART_FUNC_CLOSED_REMARK 部分功能关闭原因
+ * @property int $DEC_CREATED_PERIOD 成为报单中心期数
+ * @property int $PASSWORD_CHANGED 是否修改过密码
+ * @property int $SUB_COM_LEADER 是否为分公司领导
+ * @property string $ZG_UPGRADE_PV 增购升级PV
+ * @property string $APP_CLIENT_ID APP设备ID
+ * @property int $READ_AGREEMENT 已读协议
+ * @property string $LAST_DEC_LV 上次的报单级别
+ * @property string $BONUS_APP_CLIENT_ID 结算APP设备ID
+ * @property int $IS_FIRST_OPEN 首次开通
+ * @property int $IS_MODIFY_PASSWORD 是否修改密码
+ * @property int $IS_STUDIO 是否是工作室
+ * @property string $EMAIL 邮箱
+ */
+class BaUser extends \common\components\ActiveRecord
+{
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return '{{%BA_USER}}';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['USER_NAME', 'PASSWORD_HASH', 'PAY_PASSWORD', 'REAL_NAME',/* 'ID_CARD',*/ 'AVATAR'], 'required'],
+            [['NATION', 'ID_TYPE', 'BANK_PROVINCE', 'BANK_CITY', 'BANK_COUNTY', 'CREATED_AT', 'UPDATED_AT', 'STATUS', 'DEC_CLOSED', 'DEC_CLOSED_AT', 'PROVINCE', 'CITY', 'COUNTY', 'DELETED', 'DELETED_AT', 'IS_DEC', 'IS_ATLAS', 'IS_RECHARGE','IS_STUDIO',  'PERIOD_AT', 'DEC_PROVINCE', 'DEC_CITY', 'DEC_COUNTY', 'IS_UNION', 'STATUS_AT', 'VERIFIED', 'VERIFIED_AT', 'ALLOW_LOGIN', 'NOT_OPERATING', 'REG_FROM', 'BANK_UPDATED_AT', 'IS_DIRECT_SELLER', 'DEC_LV_UPDATED_AT', 'DEC_LV_UPDATED_PERIOD', 'PART_FUNC_CLOSED', 'LAST_DEC_LV_UPDATED_PERIOD', 'LAST_DEC_LV_UPDATED_AT', 'DEC_CREATED_AT', 'DEC_CREATED_PERIOD', 'PASSWORD_CHANGED', 'SUB_COM_LEADER', 'READ_AGREEMENT', 'IS_FIRST_OPEN', 'IS_MODIFY_PASSWORD'], 'integer'],
+            [['ZG_UPGRADE_PV'], 'number'],
+            [['ID', 'OPEN_BANK', 'BANK_NO', 'DEC_LV', 'EMP_LV', 'CROWN_LV', 'SUB_COM_ID', 'DEC_ID', 'DEC_ROLE_ID', 'ID_CARD_PREFIX', 'SEX', 'DEC_PHONE', 'GUARANTOR', 'USER_CREATOR', 'USER_UPDATER', 'LAST_DEC_LV', 'EMAIL'], 'string', 'max' => 32],
+            [['USER_NAME', 'SPOUSE_NAME', 'TEL'], 'string', 'max' => 16],
+            [['PASSWORD_HASH', 'PAY_PASSWORD', 'ID_IMAGE', 'BANK_ADDRESS', 'AVATAR'], 'string', 'max' => 255],
+            [['REAL_NAME', 'APP_CLIENT_ID', 'BONUS_APP_CLIENT_ID'], 'string', 'max' => 128],
+//            [['ID_CARD', 'SPOUSE_IDCARD'], 'string','min' => 18, 'max' => 18],
+            [['MOBILE'], 'string','min' => 11, 'max' => 11],
+            [['ADDRESS', 'DEC_ADDRESS'], 'string', 'max' => 2000],
+            [['DEC_ACCOUNT_OLD', 'GUARANTOR_NAME'], 'string', 'max' => 64],
+            [['PART_FUNC_CLOSED_REMARK'], 'string', 'max' => 4000],
+            [['USER_NAME'], 'unique'],
+            [['ID'], 'unique'],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'ID' => 'ID',
+            'USER_NAME' => '帐号',
+            'PASSWORD_HASH' => '登录密码',
+            'PAY_PASSWORD' => '支付密码',
+            'NATION' => '民族',
+            'REAL_NAME' => '姓名',
+            'ID_CARD' => '身份证号',
+            'ID_TYPE' => '证件类型',
+            'MOBILE' => '手机号',
+            'ADDRESS' => '身份证地址',
+            'ID_IMAGE' => '证件图片',
+            'OPEN_BANK' => '开户行',
+            'BANK_ADDRESS' => '银行地址',
+            'BANK_NO' => '银行卡号',
+            'BANK_PROVINCE' => '银行省份',
+            'BANK_CITY' => '银行城市',
+            'BANK_COUNTY' => '银行县区',
+            'SPOUSE_NAME' => '配偶姓名',
+            'SPOUSE_IDCARD' => '配偶证件号',
+            'CREATED_AT' => '创建时间',
+            'UPDATED_AT' => '更新时间',
+            'STATUS' => '状态',
+            'DEC_CLOSED' => '是否关闭报单功能',
+            'DEC_CLOSED_AT' => '关闭时间',
+            'DEC_LV' => '报单级别',
+            'EMP_LV' => '聘级',
+            'CROWN_LV' => '星级',
+            'PROVINCE' => '省份',
+            'CITY' => '城市',
+            'COUNTY' => '县区',
+            'TEL' => '座机',
+            'SUB_COM_ID' => '子公司ID',
+            'AVATAR' => '头像',
+            'DELETED' => '是否删除',
+            'DELETED_AT' => '删除时间',
+            'IS_DEC' => '是否为报单中心',
+            'IS_ATLAS' => '是否显示图谱',
+            'IS_RECHARGE' => '是否显示充值',
+            'DEC_ID' => '报单中心ID',
+            'BIRTHDAY' => '生日',
+            'DEC_ROLE_ID' => '报单中心级别',
+            'PERIOD_AT' => '期数',
+            'DEC_PROVINCE' => '报单中心所属的省份',
+            'DEC_CITY' => '报单中心所属的城市',
+            'DEC_COUNTY' => '报单中心所属的县区',
+            'IS_UNION' => '是否为点位合作',
+            'STATUS_AT' => '状态更改时间',
+            'VERIFIED' => '是否认证',
+            'VERIFIED_AT' => '认证时间',
+            'ALLOW_LOGIN' => '允许登录',
+            'NOT_OPERATING' => '不运作',
+            'REG_FROM' => '注册类型',
+            'ID_CARD_PREFIX' => '身份证前缀',
+            'SEX' => '性别',
+            'DEC_ACCOUNT_OLD' => '老系统中的报单中心编号',
+            'BANK_UPDATED_AT' => '银行信息更新时间',
+            'IS_DIRECT_SELLER' => '是否为直销员',
+            'DEC_LV_UPDATED_AT' => '报单级别更新时间',
+            'DEC_LV_UPDATED_PERIOD' => '报单级别更新期数',
+            'DEC_ADDRESS' => '报单中心详细地址',
+            'DEC_PHONE' => '报单中心电话',
+            'GUARANTOR' => '担保人编号',
+            'GUARANTOR_NAME' => '担保人姓名',
+            'PART_FUNC_CLOSED' => '部分功能开启',
+            'LAST_DEC_LV_UPDATED_PERIOD' => '上次报单级别更新期数',
+            'USER_CREATOR' => '创建人',
+            'USER_UPDATER' => '修改人',
+            'LAST_DEC_LV_UPDATED_AT' => '上次报单级别更新时间',
+            'DEC_CREATED_AT' => '成为报单中心时间',
+            'PART_FUNC_CLOSED_REMARK' => '部分功能关闭原因',
+            'DEC_CREATED_PERIOD' => '成为报单中心期数',
+            'PASSWORD_CHANGED' => '是否修改过密码',
+            'SUB_COM_LEADER' => '是否为分公司领导',
+            'ZG_UPGRADE_PV' => '增购升级PV',
+            'APP_CLIENT_ID' => 'APP设备ID',
+            'READ_AGREEMENT' => '已读协议',
+            'LAST_DEC_LV' => '上次的报单级别',
+            'BONUS_APP_CLIENT_ID' => '结算APP设备ID',
+            'IS_FIRST_OPEN' => '首次开通',
+            'IS_MODIFY_PASSWORD' => '是否修改密码',
+            'IS_STUDIO' => '是否是工作室',
+            'EMAIL' => 'Email',
+        ];
+    }
+
+    public function getUserInfo()
+    {
+        return $this->hasOne(UserInfo::class, ['USER_ID' => 'ID']);
+    }
+
+    /**
+     * 获取会员基本信息
+     * @param $userId
+     * @return array|null|\yii\db\ActiveRecord
+     */
+    public static function getBaseInfo($userId){
+        return static::findUseSlaves()->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
+    }
+
+    /**
+     * 获取用户基本信息从redis里面
+     * @param $userId
+     * @return array|null|\yii\db\ActiveRecord
+     */
+    public static function getBaseInfoFromRedis($userId){
+        $userInfo = Yii::$app->redis->hget(Cache::USER_INFO_KEY, $userId);
+        if(!$userInfo){
+            $userInfo = static::find()->select('ID,USER_NAME,NATION,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,CROWN_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY,EMAIL')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
+            Yii::$app->redis->hset(Cache::USER_INFO_KEY, $userId, Json::encode($userInfo));
+        } else {
+            $userInfo = Json::decode($userInfo);
+        }
+        return $userInfo;
+    }
+
+    /**
+     * 更新缓存
+     * @param $userId
+     * @return mixed
+     */
+    public static function updateBaseInfoToRedis($userId){
+        $userInfo = static::find()->select('ID,USER_NAME,NATION,REAL_NAME,ID_CARD,ID_TYPE,MOBILE,ADDRESS,STATUS,DEC_LV,LAST_DEC_LV,EMP_LV,CROWN_LV,DEC_CLOSED,AVATAR,OPEN_BANK,BANK_ADDRESS,BANK_NO,VERIFIED,IS_UNION,IS_DEC,IS_ATLAS,IS_RECHARGE,IS_STUDIO,DEC_ROLE_ID,PROVINCE,CITY,COUNTY,EMAIL')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
+        return Yii::$app->redis->hset(Cache::USER_INFO_KEY, $userId, Json::encode($userInfo));
+    }
+
+    /**
+     * @param $userId
+     * 删除用户信息缓存
+     */
+    public static function deleteBaseInfoFromRedis($userId) {
+        Yii::$app->redis->hdel(Cache::USER_INFO_KEY, $userId);
+    }
+
+    /**
+     *  判断用户是否是观察期
+     *  观望期:自加入算起2个月
+     *  例子:2022年5月14日加入, 观望期至2022年7月31日。
+     *  true为是观察期用户  false为不是观察期用户
+     * @param $addAt 用户的加入时间
+     * @param $month 观察期月份限制 系统初始化为2个月
+     */
+    public static function checkIsObserve($addAt, $month) {
+        if (empty($month)) {
+            // 如果0 代表全站全额升级
+            return false;
+        }
+        $appendMonth = date("Y-m", strtotime("first day of +$month month", $addAt)); // 指定月份
+        $lastDay = date("t", strtotime($appendMonth));  // 获取指定月的最后一天
+        $eTime = strtotime($appendMonth.'-'.$lastDay);
+
+        return time() < $eTime ? true : false;
+    }
+
+    // 获取用户报单PV总和
+    public static function sumDevPvByUserId($userId) {
+        $decOrderPv = DecOrder::find()
+        ->select('SUM(DEC_PV) AS PV_SUM')
+        ->where('TO_USER_ID=:TO_USER_ID  AND IS_DEL=0', 
+            ['TO_USER_ID'=>$userId]
+        )
+        ->asArray()
+        ->one();
+        $decOrderPv = isset($decOrderPv['PV_SUM']) ? $decOrderPv['PV_SUM'] : 0;
+        $orderDecPv = OrderDec::find()
+        ->select('SUM(PAY_PV) AS PV_SUM')
+        ->where('USER_ID=:USER_ID  AND IS_DELETE=0', 
+            [
+                'USER_ID'=>$userId, 
+                
+            ]
+        )
+        ->asArray()
+        ->one();
+        $orderDecPv = isset($orderDecPv['PV_SUM']) ? $orderDecPv['PV_SUM'] : 0;
+        // 还得加上用户在老系统中的所有报单PV之和
+        $originPv = OriginDecPv::find()
+        ->select('SUM(DEC_PV) AS PV_SUM')
+        ->where('USER_ID=:USER_ID', 
+            [
+                'USER_ID'=>$userId, 
+                
+            ]
+        )
+        ->asArray()
+        ->one();
+        $originPv = isset($originPv['PV_SUM']) ? $originPv['PV_SUM'] : 0;
+        $total = $orderDecPv + $decOrderPv + $originPv;
+
+        return $total;
+    }
+
+    /**
+     * 获取会员的部分信息并对敏感信息加密
+     * @param $userId
+     * @return array
+     */
+    public static function getEnCodeInfo($userId){
+        $userInfo = self::getBaseInfoFromRedis($userId);
+        return [
+            'ID' => $userId,
+            'USER_NAME' => $userInfo['USER_NAME'],
+            'NATION' => \Yii::$app->params['nation'][$userInfo['NATION']]['name']??'',
+            'NATION_ID' => \Yii::$app->params['nation'][$userInfo['NATION']]['id']??'',
+            'REAL_NAME' => $userInfo['REAL_NAME'],
+            'ID_CARD' => $userInfo['ID_CARD'],
+//            'ID_CARD' => Tool::hideIdCard($userInfo['ID_CARD']),
+            'MOBILE' => $userInfo['MOBILE'],
+//            'MOBILE' => Tool::hideMobile($userInfo['MOBILE']),
+            'AVATAR' => $userInfo['AVATAR'],
+            'VERIFIED' => $userInfo['VERIFIED'],
+            'IS_UNION' => $userInfo['IS_UNION'],
+            'IS_DEC' => $userInfo['IS_DEC'],
+            'IS_ATLAS' => $userInfo['IS_ATLAS'],
+            'IS_RECHARGE' => $userInfo['IS_RECHARGE'],
+            'IS_STUDIO' => $userInfo['IS_STUDIO'],
+            'DEC_ROLE_ID' => $userInfo['DEC_ROLE_ID'],
+            'OPEN_BANK' => $userInfo['OPEN_BANK'],
+            'BANK_ADDRESS' => $userInfo['BANK_ADDRESS'],
+            'DEC_LV' => $userInfo['DEC_LV'],
+            'EMP_LV' => $userInfo['EMP_LV'],
+            'CROWN_LV' => $userInfo['CROWN_LV'],
+            'PROVINCE' => $userInfo['PROVINCE'],
+            'CITY' => $userInfo['CITY'],
+            'COUNTY' => $userInfo['COUNTY'],
+            'BANK_NO' => $userInfo['BANK_NO'],
+//            'BANK_NO' => Tool::hideBankNo($userInfo['BANK_NO']),
+            'EMAIL' => $userInfo['EMAIL'],
+        ];
+    }
+
+    /**
+     * 验证密码
+     * @param $password
+     * @return bool
+     */
+    public function validatePassword($password) {
+        if( !$this->PASSWORD_HASH ) return false;
+
+        return password_verify($password, $this->PASSWORD_HASH);
+    }
+
+    /**
+     * 验证支付密码
+     * @param $payPassword
+     * @return bool
+     */
+    public function validatePasswordPay($payPassword) {
+        if( !$this->PAY_PASSWORD ) return false;
+
+        return password_verify($payPassword, $this->PAY_PASSWORD);
+    }
+
+    /**
+     * 检验支付密码
+     * @param $userId
+     * @param $password
+     * @return bool
+     */
+    public static function validatePayPassword($userId, $password){
+        $oneUser = static::find()->select('PAY_PASSWORD')->where('ID=:ID', [':ID'=>$userId])->asArray()->one();
+        if($oneUser){
+            return password_verify($password, $oneUser['PAY_PASSWORD']);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 操作日志记录条件
+     * @return array
+     */
+    public function attrLabelsWithLogType(){
+        return [
+            'ID' => 'ID',
+            'USER_NAME' => '帐号',
+            'NATION' => [
+                'label' => '民族',
+                'type' => function($data){
+                    $value = $data['value'];
+                    return \Yii::$app->params['nation'][$value]['name']??'';
+                },
+            ],
+            'REAL_NAME' => '姓名',
+            'ID_CARD' => '身份证号',
+            'ID_TYPE' => [
+                'label' => '证件类型',
+                'type' => function($data){
+                    return '身份证';
+                },
+            ],
+            'MOBILE' => '手机号',
+            'ADDRESS' => '身份证地址',
+            'ID_IMAGE' => '证件图片',
+            'OPEN_BANK' => '开户行',
+            'BANK_ADDRESS' => '银行地址',
+            'BANK_NO' => '银行卡号',
+            'BANK_PROVINCE' => [
+                'label' => '银行省份',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'BANK_CITY' => [
+                'label' => '银行城市',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'BANK_COUNTY' => [
+                'label' => '银行县区',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'SPOUSE_NAME' => '配偶姓名',
+            'SPOUSE_IDCARD' => '配偶证件号',
+            'STATUS' => [
+                'label' => '状态',
+                'type' => ValueTypeConfig::USER_STATUS_TYPE
+            ],
+            'DEC_CLOSED' => [
+                'label' => '是否关闭报单功能',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'DEC_CLOSED_AT' => [
+                'label' => '关闭报单时间',
+                'type' => ValueTypeConfig::DATE_TIME_TYPE,
+            ],
+            'DEC_LV' => [
+                'label' => '报单级别',
+                'type' => ValueTypeConfig::DEC_LV_TYPE,
+            ],
+            'EMP_LV' => [
+                'label' => '聘级',
+                'type' => ValueTypeConfig::EMP_LV_TYPE,
+            ],
+            'CROWN_LV' => [
+                'label' => '星级',
+                'type' => ValueTypeConfig::CROWN_LV_TYPE,
+            ],
+            'LAST_DEC_LV' => [
+                'label' => '上次的报单级别',
+                'type' => ValueTypeConfig::DEC_LV_TYPE,
+            ],
+            'PROVINCE' => [
+                'label' => '省份',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'CITY' => [
+                'label' => '城市',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'COUNTY' => [
+                'label' => '县区',
+                'type' => ValueTypeConfig::REGION_TYPE
+            ],
+            'TEL' => '备用手机号码',
+            'SUB_COM_ID' => '分公司ID',
+            'TRANSFER_PROP' => '转帐比例',
+            'IS_DEC' => [
+                'label' => '是否为报单中心',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'DEC_ROLE_ID' => [
+                'label' => '报单中心级别',
+                'type' => ValueTypeConfig::DEC_ROLE_ID_TYPE,
+            ],
+            'IS_UNION' => [
+                'label' => '是否为点位合作',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'STATUS_AT' => '状态修改时间',
+            'ALLOW_LOGIN' => [
+                'label' => '是否允许商城登录',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'NOT_OPERATING' => [
+                'label' => '不运作',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'BIRTHDAY' => '生日',
+            'SEX' => '性别',
+            'EMAIL' => 'Email'
+        ];
+    }
+
+}

+ 251 - 0
common/models/BaUserInfo.php

@@ -0,0 +1,251 @@
+<?php
+
+namespace common\models;
+
+use common\helpers\user\Info;
+use Yii;
+use common\libs\logging\operate\valueType\Config as ValueTypeConfig;
+
+/**
+ * This is the model class for table "{{%USER_INFO}}".
+ *
+ * @property string $ID
+ * @property string $USER_ID 会员ID
+ * @property string $USER_NAME 会员名
+ * @property string $ZC_PV 注册单PV
+ * @property string $CON_UID 接点人ID
+ * @property string $REC_UID 推荐人ID
+ * @property int $CON_NUM 下级节点数量
+ * @property int $REC_NUM 开拓会员数量
+ * @property int $NETWORK_DEEP 安置网络深度
+ * @property int $RELATION_DEEP 开拓网络深度
+ * @property string $SYSTEM_ID 体系ID
+ * @property int $IS_SYSTEM_LEADER 是否体系领导人
+ * @property int $IS_TEAM 是否点位合作
+ * @property int $IS_BIND 是否点位绑定
+ * @property int $IS_TEAM_MAIN 是否点位合作主点
+ * @property int $IS_BIND_MAIN 是否点位绑定主点
+ * @property int $IS_AUTO_WITHDRAW 是否开启自动提现
+ * @property int $CLOSE_LOGIN 关闭结算系统登录
+ * @property string $REG_TYPE 注册类型
+ * @property string $SHOULD_REG_TYPE 应注册类型
+ * @property string $REG_NAME 注册名称
+ * @property string $CREDIT_CODE 信用代码
+ * @property string $PREMISES 经营场所
+ * @property string $LEGAL_PERSON 法人
+ * @property int $REG_EXPIRES 注册有效期
+ * @property int $STORE_TYPE 店铺类型
+ * @property string $INVOICE_BALANCE 发票余额
+ * @property string $HIGHEST_EMP_LV 历史最高聘级
+ * @property int $CREATED_AT 创建时间
+ * @property int $UPDATED_AT 更新时间
+ * @property int $CLOSE_LOGIN_AT 禁止登录时间
+ * @property int $PULLED_AT 站内信拉取时间
+ * @property int $DELETED 是否删除
+ * @property int $DELETED_AT 删除时间
+ * @property int $ALLOW_TRANSFER 开启转账功能
+ * @property int $ALLOW_RECONSUME_SMS 开启复销短信提醒
+ * @property int $ALLOW_RECONSUME_SMS_TO 开启复销短信提醒有效期
+ * @property int $HIGHEST_EMP_LV_PERIOD 首次达到最高聘级期数
+ * @property int $IS_GROUP_LEADER 是否团队领导人
+ * @property int $GROUP_LEADER_AT 成为团队领导人时间
+ * @property string $TRANSFER_PROP 单笔转账比例
+ * @property int $LOGIN_NUMS 登录次数
+ * @property int $FAIL_NUMS 登录失败次数
+ * @property string $LAST_LOGIN_IP 上次登录IP
+ * @property int $LAST_LOGIN_AT 上次登录时间
+ * @property string $SHOW_EMP_LV 展示聘级
+ * @property string $ZC_AMOUNT 注册单报单金额
+ */
+class BaUserInfo extends \common\components\ActiveRecord
+{
+    const STORE_TYPE_NORMAL = 0;    // 一般会员无店铺标识
+    const STORE_TYPE_GENERAL = 1;   // 店铺
+    const STORE_TYPE_IMAGE = 2;     // 形象店
+    const STORE_TYPE_SERVICE = 3;   // 服务点、具有报单功能的会员
+    const STORE_TYPE_AREA = 4;   // 区级店
+
+    /**
+     * @inheritdoc
+     */
+    public static function tableName()
+    {
+        return '{{%BA_USER_INFO}}';
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function rules()
+    {
+        return [
+            [['USER_ID', 'USER_NAME', 'CON_UID', 'REC_UID', 'CREATED_AT'], 'required'],
+            [['ZC_PV', 'INVOICE_BALANCE', 'TRANSFER_PROP', 'ZC_AMOUNT'], 'number'],
+            [['CON_NUM', 'REC_NUM', 'NETWORK_DEEP', 'RELATION_DEEP', 'IS_SYSTEM_LEADER', 'IS_TEAM', 'IS_BIND', 'IS_TEAM_MAIN', 'IS_BIND_MAIN', 'IS_AUTO_WITHDRAW', 'CLOSE_LOGIN', 'REG_EXPIRES', 'STORE_TYPE', 'CREATED_AT', 'UPDATED_AT', 'CLOSE_LOGIN_AT', 'PULLED_AT', 'DELETED', 'DELETED_AT', 'ALLOW_TRANSFER', 'HIGHEST_EMP_LV_PERIOD', 'IS_GROUP_LEADER', 'GROUP_LEADER_AT', 'ALLOW_RECONSUME_SMS', 'ALLOW_RECONSUME_SMS_TO', 'LOGIN_NUMS', 'FAIL_NUMS', 'LAST_LOGIN_AT'], 'integer'],
+            [['ID','USER_ID', 'CON_UID', 'REC_UID', 'SYSTEM_ID', 'REG_TYPE', 'SHOULD_REG_TYPE', 'HIGHEST_EMP_LV', 'SHOW_EMP_LV'], 'string', 'max' => 32],
+            [['USER_NAME', 'LAST_LOGIN_IP'], 'string', 'max' => 16],
+            [['REG_NAME', 'CREDIT_CODE', 'PREMISES', 'LEGAL_PERSON'], 'string', 'max' => 255],
+            [['USER_ID'], 'unique'],
+        ];
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function attributeLabels()
+    {
+        return [
+            'ID' => 'ID',
+            'USER_ID' => '会员ID',
+            'USER_NAME' => '会员名',
+            'ZC_PV' => '注册单PV',
+            'CON_UID' => '接点人ID',
+            'REC_UID' => '推荐人ID',
+            'CON_NUM' => '下级节点数量',
+            'REC_NUM' => '开拓会员数量',
+            'NETWORK_DEEP' => '安置网络深度',
+            'RELATION_DEEP' => '开拓网络深度',
+            'SYSTEM_ID' => '体系ID',
+            'IS_SYSTEM_LEADER' => '是否体系领导人',
+            'IS_TEAM' => '是否点位合作',
+            'IS_BIND' => '是否点位绑定',
+            'IS_TEAM_MAIN' => '是否点位合作主点',
+            'IS_BIND_MAIN' => '是否点位绑定主点',
+            'IS_AUTO_WITHDRAW' => '是否开启自动提现',
+            'CLOSE_LOGIN' => '关闭结算系统登录',
+            'REG_TYPE' => '注册类型',
+            'SHOULD_REG_TYPE' => '应注册类型',
+            'REG_NAME' => '注册名称',
+            'CREDIT_CODE' => '信用代码',
+            'PREMISES' => '经营场所',
+            'LEGAL_PERSON' => '法人',
+            'REG_EXPIRES' => '注册有效期',
+            'STORE_TYPE' => '店铺类型',
+            'INVOICE_BALANCE' => '发票余额',
+            'HIGHEST_EMP_LV' => '历史最高聘级',
+            'CREATED_AT' => '创建时间',
+            'UPDATED_AT' => '更新时间',
+            'CLOSE_LOGIN_AT' => '禁止登录时间',
+            'PULLED_AT' => '站内信拉取时间',
+            'DELETED' => '是否删除',
+            'DELETED_AT' => '删除时间',
+            'ALLOW_TRANSFER' => '开启转账功能',
+            'ALLOW_RECONSUME_SMS' => '开启复销短信提醒',
+            'ALLOW_RECONSUME_SMS_TO' => '开启复销短信提醒有效期',
+            'HIGHEST_EMP_LV_PERIOD' => '首次达到最高聘级期数',
+            'IS_GROUP_LEADER' => '是否团队领导人',
+            'GROUP_LEADER_AT' => '团队领导人时间',
+            'TRANSFER_PROP' => '单笔转账比例',
+            'LOGIN_NUMS' => '登录次数',
+            'FAIL_NUMS' => '登录失败次数',
+            'LAST_LOGIN_IP' => '上次登录IP',
+            'LAST_LOGIN_AT' => '上次登录时间',
+            'SHOW_EMP_LV' => '展示聘级',
+            'ZC_AMOUNT' => '注册单报单金额',
+        ];
+    }
+
+    /**
+     * 删除会员
+     * @param $userId
+     */
+    public static function deleteUser($userId){
+        static::deleteAll('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
+        UserNetwork::deleteAll('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
+        UserRelation::deleteAll('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
+        UserBonus::deleteAll('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
+        UserPerf::deleteAll('USER_ID=:USER_ID', [':USER_ID'=>$userId]);
+    }
+
+    /**
+     * 获取会员接点人推荐人
+     * @param $userId
+     * @return array|null
+     */
+    public static function getNetByUserId($userId){
+        return static::findOneAsArray('USER_ID=:USER_ID', [':USER_ID' => $userId], 'CON_UID,REC_UID');
+    }
+
+    /**
+     * 操作日志记录条件
+     * @return array
+     */
+    public function attrLabelsWithLogType(){
+        return [
+            'USER_ID' => '会员ID',
+            'USER_NAME' => '会员名',
+            'ZC_PV' => '注册单PV',
+            'CON_UID' => [
+                'label' => '接点人编号',
+                'type' => function($data){
+                    $value = $data['value'];
+                    return Info::getUserNameByUserId($value);
+                },
+            ],
+            'REC_UID' => [
+                'label' => '接点人编号',
+                'type' => function($data){
+                    $value = $data['value'];
+                    return Info::getUserNameByUserId($value);
+                },
+            ],
+            'CON_NUM' => '下级节点数量',
+            'REC_NUM' => '开拓会员数量',
+            'NETWORK_DEEP' => '安置网络深度',
+            'RELATION_DEEP' => '开拓网络深度',
+            'SYSTEM_ID' => '体系ID',
+            'IS_SYSTEM_LEADER' => '是否体系领导人',
+            'IS_TEAM' => '是否点位合作',
+            'IS_BIND' => '是否点位绑定',
+            'IS_TEAM_MAIN' => '是否点位合作主点',
+            'IS_BIND_MAIN' => '是否点位绑定主点',
+            'IS_AUTO_WITHDRAW' => [
+                'label' => '是否开启自动提现',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'CLOSE_LOGIN' => '关闭结算系统登录',
+            'REG_TYPE' => '注册类型',
+            'SHOULD_REG_TYPE' => '应注册类型',
+            'REG_NAME' => '注册名称',
+            'CREDIT_CODE' => '信用代码',
+            'PREMISES' => '经营场所',
+            'LEGAL_PERSON' => '法人',
+            'REG_EXPIRES' => '注册有效期',
+            'STORE_TYPE' => '店铺类型',
+            'INVOICE_BALANCE' => '发票余额',
+            'HIGHEST_EMP_LV' => '历史最高聘级',
+            'CREATED_AT' => '创建时间',
+            'UPDATED_AT' => '更新时间',
+            'CLOSE_LOGIN_AT' => '禁止登录时间',
+            'PULLED_AT' => '站内信拉取时间',
+            'DELETED' => '是否删除',
+            'DELETED_AT' => '删除时间',
+            'ALLOW_TRANSFER' => [
+                'label' => '开启转账功能',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'ALLOW_RECONSUME_SMS' => [
+                'label' => '开启复销短信提醒',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'ALLOW_RECONSUME_SMS_TO' => [
+                'label' => '开启复销短信提醒有效期',
+                'type' => ValueTypeConfig::DATE_TYPE,
+            ],
+            'HIGHEST_EMP_LV_PERIOD' => '首次达到最高聘级期数',
+            'IS_GROUP_LEADER' => [
+                'label' => '是否团队领导人',
+                'type' => ValueTypeConfig::YES_NO_TYPE,
+            ],
+            'GROUP_LEADER_AT' => [
+                'label' => '团队领导人时间',
+                'type' => ValueTypeConfig::DATE_TIME_TYPE,
+            ],
+            'TRANSFER_PROP' => '单笔转账比例',
+            'SHOW_EMP_LV' => [
+                'label' => '前台显示聘级',
+                'type' => ValueTypeConfig::EMP_LV_TYPE,
+            ],
+        ];
+    }
+}

+ 157 - 0
sql/upgrade/1962.sql

@@ -226,3 +226,160 @@ CREATE TABLE `AR_BA_RECEIVE_ADDRESS` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='BA会员收货地址';
 
 INSERT INTO `AR_BA_RECEIVE_ADDRESS` (`ID`, `USER_ID`, `USER_NAME`, `CONSIGNEE`, `MOBILE`, `PROVINCE`, `CITY`, `COUNTY`, `CITY_NAME`, `LGA_NAME`, `ADDRESS`, `IS_DEFAULT`, `CREATED_AT`, `UPDATER`, `UPDATED_AT`) VALUES ('100000000000000000', '300000000000000000', 'D', 'DCONSIGNEE_NAME', '18888888888', 1, 1, 1, '', '', '狮驼岭', 0, 1589064762, '', 0);
+
+CREATE TABLE `AR_BA_USER`  (
+  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '会员ID',
+  `USER_NAME` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '会员编号',
+  `PASSWORD_HASH` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '会员登录密码',
+  `PAY_PASSWORD` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '支付密码',
+  `NATION` tinyint(4) NOT NULL DEFAULT 0,
+  `REAL_NAME` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '会员姓名',
+  `ID_CARD` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '身份证号',
+  `ID_TYPE` tinyint(1) NOT NULL DEFAULT 0,
+  `MOBILE` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '手机号码',
+  `ADDRESS` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '详细地址',
+  `ID_IMAGE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `OPEN_BANK` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '开户行',
+  `BANK_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '开户行地址',
+  `BANK_NO` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '银行卡号',
+  `BANK_PROVINCE` int(11) NULL DEFAULT 0 COMMENT '开户行所在省',
+  `BANK_CITY` int(11) NULL DEFAULT 0 COMMENT '开户行所在市',
+  `BANK_COUNTY` int(11) NULL DEFAULT 0 COMMENT '开户行所在区',
+  `SPOUSE_NAME` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `SPOUSE_IDCARD` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `CREATED_AT` int(11) NOT NULL DEFAULT 0,
+  `UPDATED_AT` int(11) NOT NULL DEFAULT 0,
+  `STATUS` tinyint(1) NOT NULL DEFAULT 1,
+  `DEC_CLOSED` tinyint(1) NOT NULL DEFAULT 0,
+  `DEC_CLOSED_AT` int(11) NOT NULL DEFAULT 0,
+  `DEC_LV` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '会员级别',
+  `EMP_LV` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '荣衔级别',
+  `PROVINCE` int(11) NOT NULL DEFAULT 0 COMMENT '省',
+  `CITY` int(11) NOT NULL DEFAULT 0 COMMENT '市',
+  `COUNTY` int(11) NOT NULL DEFAULT 0 COMMENT '区',
+  `TEL` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `LOGIN_TIMES` int(11) NOT NULL DEFAULT 0,
+  `LOGIN_IP` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `LOGIN_AT` int(11) NOT NULL DEFAULT 0,
+  `PULL_MESSAGE_AT` int(11) NOT NULL DEFAULT 0,
+  `SUB_COM_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `AVATAR` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `DELETED` tinyint(1) NOT NULL DEFAULT 0,
+  `DELETED_AT` int(11) NOT NULL DEFAULT 0,
+  `ALLOW_TRANSFER` tinyint(1) NOT NULL DEFAULT 1,
+  `TRANSFER_PROP` float(10, 2) NOT NULL DEFAULT 0,
+  `PARTITION_DATE` timestamp(0) NOT NULL DEFAULT current_timestamp COMMENT '加入日期',
+  `IS_DEC` tinyint(1) NOT NULL DEFAULT 0,
+  `DEC_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '1',
+  `BIRTHDAY` date NULL DEFAULT '1990-09-09',
+  `DEC_ROLE_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `PERIOD_AT` int(11) NOT NULL DEFAULT 0 COMMENT '加入期数',
+  `DEC_PROVINCE` int(11) NOT NULL DEFAULT 0,
+  `DEC_CITY` int(11) NOT NULL DEFAULT 0,
+  `DEC_COUNTY` int(11) NOT NULL DEFAULT 0,
+  `IS_UNION` tinyint(1) NOT NULL DEFAULT 0,
+  `STATUS_AT` int(11) NOT NULL DEFAULT 0,
+  `VERIFIED` tinyint(1) NOT NULL DEFAULT 0,
+  `VERIFIED_AT` int(11) NOT NULL DEFAULT 0,
+  `ALLOW_LOGIN` tinyint(1) NOT NULL DEFAULT 1,
+  `NOT_OPERATING` tinyint(1) NOT NULL DEFAULT 0,
+  `REG_FROM` tinyint(1) NOT NULL DEFAULT 1,
+  `ID_CARD_PREFIX` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `ALLOW_BONUS_LOGIN` tinyint(1) NOT NULL DEFAULT 1,
+  `SEX` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '性别',
+  `DEC_ACCOUNT_OLD` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `BANK_UPDATED_AT` int(11) NOT NULL DEFAULT 0,
+  `IS_DIRECT_SELLER` tinyint(1) NOT NULL DEFAULT 0,
+  `DEC_LV_UPDATED_AT` int(11) NOT NULL DEFAULT 0,
+  `DEC_LV_UPDATED_PERIOD` int(11) NOT NULL DEFAULT 0,
+  `DEC_ADDRESS` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `DEC_PHONE` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `GUARANTOR` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `GUARANTOR_NAME` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `PART_FUNC_CLOSED` tinyint(1) NOT NULL DEFAULT 0,
+  `LAST_DEC_LV_UPDATED_PERIOD` int(11) NOT NULL DEFAULT 0,
+  `USER_CREATOR` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `USER_UPDATER` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `LAST_DEC_LV_UPDATED_AT` int(11) NOT NULL DEFAULT 0,
+  `DEC_CREATED_AT` int(11) NOT NULL DEFAULT 0,
+  `PART_FUNC_CLOSED_REMARK` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `DEC_CREATED_PERIOD` int(11) NOT NULL DEFAULT 0,
+  `PASSWORD_CHANGED` tinyint(1) NOT NULL DEFAULT 0,
+  `SUB_COM_LEADER` tinyint(1) NOT NULL DEFAULT 0,
+  `LOGIN_FAIL_TIMES` int(11) NOT NULL DEFAULT 0,
+  `ZG_UPGRADE_PV` decimal(16, 2) NOT NULL DEFAULT 0,
+  `APP_CLIENT_ID` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `READ_AGREEMENT` tinyint(1) NOT NULL DEFAULT 1,
+  `LAST_DEC_LV` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `BONUS_APP_CLIENT_ID` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `IS_FIRST_OPEN` tinyint(1) NULL DEFAULT 1,
+  `IS_ATLAS` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
+  `LEADER_ALIAS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '所属领导人',
+  `MEMBER_TYPE_TITLE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '所属荣衔会员',
+  `MANAGE_OF_STUDIO` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '所属工作室店长',
+  `IS_MODIFY_PASSWORD` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '0:关闭,1:开启',
+  `IS_STUDIO` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '工作室',
+  `IS_RECHARGE` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否显示充值',
+  PRIMARY KEY (`ID`) USING BTREE,
+  UNIQUE INDEX `USER_NAME`(`USER_NAME`) USING BTREE,
+  UNIQUE INDEX `ID`(`ID`) USING BTREE,
+  INDEX `DEC_ID`(`DEC_ID`) USING BTREE,
+  INDEX `STATUS`(`STATUS`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户' ROW_FORMAT = Dynamic;
+
+CREATE TABLE `AR_BA_USER_INFO`  (
+  `ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `USER_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `USER_NAME` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `ZC_PV` decimal(16, 3) NOT NULL DEFAULT 0,
+  `CON_UID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `REC_UID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+  `CON_NUM` int(10) NOT NULL DEFAULT 0,
+  `REC_NUM` int(10) NOT NULL DEFAULT 0,
+  `NETWORK_DEEP` int(10) NOT NULL DEFAULT 0,
+  `RELATION_DEEP` int(10) NOT NULL DEFAULT 0,
+  `SYSTEM_ID` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `IS_GROUP_LEADER` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_SYSTEM_LEADER` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_TEAM` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_BIND` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_TEAM_MAIN` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_BIND_MAIN` tinyint(1) NOT NULL DEFAULT 0,
+  `IS_AUTO_WITHDRAW` tinyint(1) NOT NULL DEFAULT 0,
+  `CLOSE_LOGIN` tinyint(1) NOT NULL DEFAULT 0,
+  `REG_TYPE` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '56D9181C0F5D428FA2DBD4CAB263BF2F',
+  `SHOULD_REG_TYPE` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '56D9181C0F5D428FA2DBD4CAB263BF2F',
+  `REG_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `CREDIT_CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `PREMISES` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `LEGAL_PERSON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `REG_EXPIRES` int(10) NULL DEFAULT NULL,
+  `STORE_TYPE` tinyint(1) NOT NULL DEFAULT 0,
+  `INVOICE_BALANCE` decimal(16, 2) NOT NULL DEFAULT 0,
+  `HIGHEST_EMP_LV` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `CREATED_AT` int(10) NOT NULL,
+  `UPDATED_AT` int(10) NOT NULL DEFAULT 0,
+  `CLOSE_LOGIN_AT` int(10) NOT NULL DEFAULT 0,
+  `PULLED_AT` int(10) NOT NULL DEFAULT 0,
+  `DELETED` tinyint(1) NOT NULL DEFAULT 0,
+  `DELETED_AT` int(10) NOT NULL DEFAULT 0,
+  `GROUP_LEADER_AT` int(10) NOT NULL DEFAULT 0,
+  `ALLOW_TRANSFER` tinyint(1) NOT NULL DEFAULT 1,
+  `ALLOW_RECONSUME_SMS` tinyint(1) NOT NULL DEFAULT 0,
+  `ALLOW_RECONSUME_SMS_TO` int(10) NOT NULL DEFAULT 0,
+  `HIGHEST_EMP_LV_PERIOD` int(10) NOT NULL DEFAULT 1,
+  `TRANSFER_PROP` float(10, 2) NOT NULL DEFAULT 100,
+  `LOGIN_NUMS` int(10) NOT NULL DEFAULT 0,
+  `FAIL_NUMS` int(10) NOT NULL DEFAULT 0,
+  `LAST_LOGIN_IP` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0.0.0.0',
+  `LAST_LOGIN_AT` int(10) NOT NULL DEFAULT 0,
+  `SHOW_EMP_LV` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '',
+  `ZC_AMOUNT` decimal(16, 3) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`ID`) USING BTREE,
+  UNIQUE INDEX `USER_ID`(`USER_ID`) USING BTREE,
+  INDEX `USER_NAME_DELETED`(`USER_NAME`, `DELETED`) USING BTREE,
+  INDEX `NETWORK_DEEP`(`NETWORK_DEEP`) USING BTREE,
+  INDEX `RELATION_DEEP`(`RELATION_DEEP`) USING BTREE,
+  INDEX `REC_UID`(`REC_UID`) USING BTREE,
+  INDEX `CON_UID`(`CON_UID`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '会员资料表' ROW_FORMAT = Dynamic;