Notification.php 7.6 KB
<?php

namespace app\admin\controller\groupon;

use app\common\controller\Backend;

/**
 * 消息管理
 *
 * @icon fa fa-circle-o
 */
class Notification extends Backend
{
    
    /**
     * Notification模型对象
     * @var \app\admin\model\groupon\Notification
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\groupon\Notification;
        $this->modelConfig = new \app\admin\model\groupon\notification\Config;

    }
    
    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */
    

    /**
     * 查看
     */
    public function index()
    {
        
    }

    public function config()
    {
        if ($this->request->isAjax()) {
            // 检测队列
            checkEnv('queue');

            // 消息类型
            $notificationType = [
                \addons\groupon\notifications\Refund::class,
                \addons\groupon\notifications\Wallet::class,
                \addons\groupon\notifications\Order::class,
                \addons\groupon\notifications\store\Order::class,
                \addons\groupon\notifications\store\Apply::class
            ];

            // 获取所有要发送的消息
            $fields = [];
            foreach ($notificationType as $key => $class) {
                $currentFields = $class::$returnField;
                if ($currentFields) {
                    $fields = array_merge($fields, $currentFields);
                }
            }

            // 读取数据库相关消息配置项
            $notificationConfig = $this->modelConfig->select();

            // 组合消息类型和设置值
            $newFields = [];
            foreach ($fields as $k => $field) {
                // 组合每个平台的消息默认值和数据库值
                $kConfig = $this->getKconfig($notificationConfig, $k, $field);

                $newFields[] = [
                    'type' => $k,
                    'name' => $field['name'],
                    'wxMiniProgram' => $kConfig['wxMiniProgram'] ?? [],
                    'wxOfficialAccount' => $kConfig['wxOfficialAccount'] ?? [],
                    'sms' => $kConfig['sms'] ?? [],
                    'email' => $kConfig['email'] ?? []
                ];
            }

            $this->success('获取成功', null, $newFields);
        }

        return $this->view->fetch();
    }


    // 配置状态
    public function set_status() {
        $platform = $this->request->post('platform', '');
        $event = $this->request->post('event', '');
        $name = $this->request->post('name', '');
        $status = $this->request->post('status', 0);

        if (!$platform || !$event) {
            $this->error(__('Parameter %s can not be empty', ''));
        }

        $config = $this->modelConfig->where([
            'platform' => $platform,
            'event' => $event
        ])->find();

        if (!$config) {
            $config = $this->modelConfig;
            $config->platform = $platform;
            $config->event = $event;
            $config->name = $name;
        }
        $config->status = intval($status);
        $config->save();

        $this->success('设置成功');
    }


    // 配置模板
    public function set_template()
    {
        $platform = $this->request->post('platform');
        $event = $this->request->post('event');
        $name = $this->request->post('name');
        $content = $this->request->post('content', "");

        if (!$platform || !$event) {
            $this->error(__('Parameter %s can not be empty', ''));
        }

        $config = $this->modelConfig->where([
            'platform' => $platform,
            'event' => $event
        ])->find();

        if (!$config) {
            $config = $this->modelConfig;
            $config->platform = $platform;
            $config->event = $event;
            $config->name = $name;
        }
        $config->content = $content;
        $config->save();

        $this->success('设置成功');
    }



    private function getKConfig($notificationConfig, $k, $field) {
        // 将默认值中追加 template_field  和 value 空字段
        foreach ($field['fields'] as &$f) {
            $f['template_field'] = $f['template_field'] ?? '';
            $f['value'] = $f['value'] ?? '';
        }

        // 初始化defalut
        $kConfig = [
            'wxMiniProgram' => [
                'id' => 0,
                'platform' => 'wxMiniProgram',
                'name' => $field['name'],
                'event' => $k,
                'status' => 0,
                'sendnum' => 0,
                'content_arr' => [
                    'template_id' => '',
                    'fields' => $field['fields']
                ]
            ],
            'wxOfficialAccount' => [
                'id' => 0,
                'platform' => 'wxOfficialAccount',
                'name' => $field['name'],
                'event' => $k,
                'status' => 0,
                'sendnum' => 0,
                'content_arr' => [
                    'template_id' => '',
                    'fields' => $field['fields']
                ]
            ],
            'sms' => [
                'id' => 0,
                'platform' => 'sms',
                'name' => $field['name'],
                'event' => $k,
                'status' => 0,
                'sendnum' => 0,
                'content_arr' => [
                    'template_id' => '',
                    'fields' => $field['fields']
                ]
            ],
            'email' => [
                'id' => 0,
                'platform' => 'email',
                'name' => $field['name'],
                'event' => $k,
                'status' => 0,
                'sendnum' => 0,
                'content_arr' => [
                    'template_id' => '',
                    'fields' => $field['fields']
                ]
            ]
        ];

        // 合并数据库中的设置
        foreach ($notificationConfig as $config) {
            if ($config['event'] == $k) {
                $currentConfig = $config->toArray();
                
                // 如果数据库中有内容
                if ($currentConfig['content_arr']) {
                    $contentArr = $currentConfig['content_arr'];

                    // 合并,数据库和默认 fields 字段(发送类型增加返回字段时候有用)
                    $contentArrFields = [];
                    if (isset($contentArr['fields']) && $contentArr['fields']) {    // 判断数组是否存在 fields 设置
                        $contentArrFields = array_column($contentArr['fields'], null, 'field');
                    }
                    $kConfigFields = array_column($kConfig[$config['platform']]['content_arr']['fields'], null, 'field');
                    $configField = array_merge($kConfigFields, $contentArrFields);

                    $contentArr['fields'] = array_values($configField);

                    $currentConfig['content_arr'] = $contentArr;
                } else {
                    // 数据库有记录,但内容是空,(先开启了开关)
                    $currentConfig['content_arr'] = $kConfig[$config['platform']]['content_arr'];
                }

                $kConfig[$config['platform']] = $currentConfig;
            }
        }

        return $kConfig;
    }
}