作者 郭文星

123

正在显示 59 个修改的文件 包含 6528 行增加0 行删除
  1 +{"files":["application\\admin\\controller\\wechat\\Autoreply.php","application\\admin\\controller\\wechat\\Config.php","application\\admin\\controller\\wechat\\Menu.php","application\\admin\\controller\\wechat\\Response.php","application\\admin\\lang\\zh-cn\\wechat\\autoreply.php","application\\admin\\lang\\zh-cn\\wechat\\config.php","application\\admin\\lang\\zh-cn\\wechat\\response.php","application\\admin\\model\\WechatAutoreply.php","application\\admin\\model\\WechatCaptcha.php","application\\admin\\model\\WechatConfig.php","application\\admin\\model\\WechatContext.php","application\\admin\\model\\WechatResponse.php","application\\admin\\view\\wechat\\autoreply\\add.html","application\\admin\\view\\wechat\\autoreply\\edit.html","application\\admin\\view\\wechat\\autoreply\\index.html","application\\admin\\view\\wechat\\config\\add.html","application\\admin\\view\\wechat\\config\\edit.html","application\\admin\\view\\wechat\\config\\index.html","application\\admin\\view\\wechat\\menu\\index.html","application\\admin\\view\\wechat\\response\\add.html","application\\admin\\view\\wechat\\response\\edit.html","application\\admin\\view\\wechat\\response\\index.html","application\\admin\\view\\wechat\\response\\select.html","public\\assets\\js\\backend\\wechat\\autoreply.js","public\\assets\\js\\backend\\wechat\\config.js","public\\assets\\js\\backend\\wechat\\menu.js","public\\assets\\js\\backend\\wechat\\response.js","public\\assets\\addons\\wechat\\css\\menu.css","public\\assets\\addons\\wechat\\images\\mobile_footer_bg.png","public\\assets\\addons\\wechat\\images\\mobile_header_bg.png","public\\assets\\addons\\wechat\\images\\mobile_index.png","public\\assets\\addons\\wechat\\images\\weixin_icon.png"],"license":"regular","licenseto":"56052","licensekey":"z43Dir5MYRb7LdKm 5dY2yLiHBuRzRCkDrrhR3w==","domains":[],"licensecodes":[],"validations":[],"menus":["wechat","wechat\/autoreply","wechat\/autoreply\/index","wechat\/autoreply\/add","wechat\/autoreply\/edit","wechat\/autoreply\/del","wechat\/autoreply\/multi","wechat\/config","wechat\/config\/index","wechat\/config\/add","wechat\/config\/edit","wechat\/config\/del","wechat\/config\/multi","wechat\/menu","wechat\/menu\/index","wechat\/menu\/add","wechat\/menu\/edit","wechat\/menu\/del","wechat\/menu\/remote","wechat\/menu\/sync","wechat\/menu\/multi","wechat\/response","wechat\/response\/index","wechat\/response\/add","wechat\/response\/edit","wechat\/response\/del","wechat\/response\/select","wechat\/response\/multi"]}
  1 +<?php
  2 +
  3 +namespace addons\wechat;
  4 +
  5 +use app\common\library\Menu;
  6 +use think\Addons;
  7 +
  8 +/**
  9 + * 微信插件
  10 + */
  11 +class Wechat extends Addons
  12 +{
  13 +
  14 + /**
  15 + * 插件安装方法
  16 + * @return bool
  17 + */
  18 + public function install()
  19 + {
  20 + $menu = [
  21 + [
  22 + 'name' => 'wechat',
  23 + 'title' => '微信管理',
  24 + 'icon' => 'fa fa-wechat',
  25 + 'sublist' => [
  26 + [
  27 + 'name' => 'wechat/autoreply',
  28 + 'title' => '自动回复管理',
  29 + 'icon' => 'fa fa-reply-all',
  30 + 'sublist' => [
  31 + ['name' => 'wechat/autoreply/index', 'title' => '查看'],
  32 + ['name' => 'wechat/autoreply/add', 'title' => '添加'],
  33 + ['name' => 'wechat/autoreply/edit', 'title' => '修改'],
  34 + ['name' => 'wechat/autoreply/del', 'title' => '删除'],
  35 + ['name' => 'wechat/autoreply/multi', 'title' => '批量更新'],
  36 + ]
  37 + ],
  38 + [
  39 + 'name' => 'wechat/config',
  40 + 'title' => '配置管理',
  41 + 'icon' => 'fa fa-cog',
  42 + 'sublist' => [
  43 + ['name' => 'wechat/config/index', 'title' => '查看'],
  44 + ['name' => 'wechat/config/add', 'title' => '添加'],
  45 + ['name' => 'wechat/config/edit', 'title' => '修改'],
  46 + ['name' => 'wechat/config/del', 'title' => '删除'],
  47 + ['name' => 'wechat/config/multi', 'title' => '批量更新'],
  48 + ]
  49 + ],
  50 + [
  51 + 'name' => 'wechat/menu',
  52 + 'title' => '菜单管理',
  53 + 'icon' => 'fa fa-list',
  54 + 'sublist' => [
  55 + ['name' => 'wechat/menu/index', 'title' => '查看'],
  56 + ['name' => 'wechat/menu/add', 'title' => '添加'],
  57 + ['name' => 'wechat/menu/edit', 'title' => '修改'],
  58 + ['name' => 'wechat/menu/del', 'title' => '删除'],
  59 + ['name' => 'wechat/menu/remote', 'title' => '加载远程菜单'],
  60 + ['name' => 'wechat/menu/sync', 'title' => '同步'],
  61 + ['name' => 'wechat/menu/multi', 'title' => '批量更新'],
  62 + ]
  63 + ],
  64 + [
  65 + 'name' => 'wechat/response',
  66 + 'title' => '资源管理',
  67 + 'icon' => 'fa fa-list-alt',
  68 + 'sublist' => [
  69 + ['name' => 'wechat/response/index', 'title' => '查看'],
  70 + ['name' => 'wechat/response/add', 'title' => '添加'],
  71 + ['name' => 'wechat/response/edit', 'title' => '修改'],
  72 + ['name' => 'wechat/response/del', 'title' => '删除'],
  73 + ['name' => 'wechat/response/select', 'title' => '选择'],
  74 + ['name' => 'wechat/response/multi', 'title' => '批量更新'],
  75 + ]
  76 + ]
  77 + ]
  78 + ]
  79 + ];
  80 + Menu::create($menu);
  81 + return true;
  82 + }
  83 +
  84 + /**
  85 + * 插件卸载方法
  86 + * @return bool
  87 + */
  88 + public function uninstall()
  89 + {
  90 + Menu::delete('wechat');
  91 + return true;
  92 + }
  93 +
  94 + /**
  95 + * 插件启用方法
  96 + */
  97 + public function enable()
  98 + {
  99 + Menu::enable('wechat');
  100 + }
  101 +
  102 + /**
  103 + * 插件禁用方法
  104 + */
  105 + public function disable()
  106 + {
  107 + Menu::disable('wechat');
  108 + }
  109 +
  110 +}
  1 +<?php
  2 +
  3 +return [
  4 + [
  5 + 'name' => 'app_id',
  6 + 'title' => 'app_id',
  7 + 'type' => 'string',
  8 + 'content' => [],
  9 + 'value' => 'wxb7dd0c03865a94e0',
  10 + 'rule' => 'required',
  11 + 'msg' => '',
  12 + 'tip' => '',
  13 + 'ok' => '',
  14 + 'extend' => '',
  15 + ],
  16 + [
  17 + 'name' => 'secret',
  18 + 'title' => 'secret',
  19 + 'type' => 'string',
  20 + 'content' => [],
  21 + 'value' => '6af75a6fb8211da45631630e34769f82',
  22 + 'rule' => 'required',
  23 + 'msg' => '',
  24 + 'tip' => '',
  25 + 'ok' => '',
  26 + 'extend' => '',
  27 + ],
  28 + [
  29 + 'name' => 'token',
  30 + 'title' => 'token',
  31 + 'type' => 'string',
  32 + 'content' => [],
  33 + 'value' => 'Fdc2022666fdC',
  34 + 'rule' => 'required',
  35 + 'msg' => '',
  36 + 'tip' => '',
  37 + 'ok' => '',
  38 + 'extend' => '',
  39 + ],
  40 + [
  41 + 'name' => 'aes_key',
  42 + 'title' => 'aes_key',
  43 + 'type' => 'string',
  44 + 'content' => [],
  45 + 'value' => 'vfVRWaOmV7B19NqjE6zPBHaBTEDgv71plzhEGr8SxiQ',
  46 + 'rule' => 'required',
  47 + 'msg' => '',
  48 + 'tip' => '',
  49 + 'ok' => '',
  50 + 'extend' => '',
  51 + ],
  52 + [
  53 + 'name' => 'debug',
  54 + 'title' => '调试模式',
  55 + 'type' => 'radio',
  56 + 'content' => [
  57 + '否',
  58 + '是',
  59 + ],
  60 + 'value' => '1',
  61 + 'rule' => 'required',
  62 + 'msg' => '',
  63 + 'tip' => '',
  64 + 'ok' => '',
  65 + 'extend' => '',
  66 + ],
  67 + [
  68 + 'name' => 'log_level',
  69 + 'title' => '日志记录等级',
  70 + 'type' => 'select',
  71 + 'content' => [
  72 + 'debug' => 'debug',
  73 + 'info' => 'info',
  74 + 'notice' => 'notice',
  75 + 'warning' => 'warning',
  76 + 'error' => 'error',
  77 + 'critical' => 'critical',
  78 + 'alert' => 'alert',
  79 + 'emergency' => 'emergency',
  80 + ],
  81 + 'value' => 'info',
  82 + 'rule' => 'required',
  83 + 'msg' => '',
  84 + 'tip' => '生产环境日志记录等级',
  85 + 'ok' => '',
  86 + 'extend' => '',
  87 + ],
  88 + [
  89 + 'name' => 'oauth_callback',
  90 + 'title' => '登录回调',
  91 + 'type' => 'string',
  92 + 'content' => [],
  93 + 'value' => 'https://fdc.xp.yn.cn/',
  94 + 'rule' => 'required',
  95 + 'msg' => '',
  96 + 'tip' => '',
  97 + 'ok' => '',
  98 + 'extend' => '',
  99 + ],
  100 +];
  1 +<?php
  2 +
  3 +namespace addons\wechat\controller;
  4 +
  5 +use addons\wechat\library\Wechat;
  6 +use addons\wechat\model\WechatCaptcha;
  7 +use fast\Http;
  8 +
  9 +/**
  10 + * 微信验证码验证接口
  11 + */
  12 +class Captcha extends \think\addons\Controller
  13 +{
  14 +
  15 + /**
  16 + * 验证码检测接口
  17 + */
  18 + public function check()
  19 + {
  20 + $captcha = $this->request->post("captcha");
  21 + $event = $this->request->post("event");
  22 + $result = WechatCaptcha::check($captcha, $event);
  23 + if ($result) {
  24 + $this->success("验证码正确");
  25 + } else {
  26 + $this->error("验证码错误");
  27 + }
  28 + }
  29 +
  30 + /**
  31 + * 验证码发送接口
  32 + */
  33 + public function send()
  34 + {
  35 + $ip = $this->request->ip();
  36 + $event = $this->request->post("event");
  37 + if (!$event) {
  38 + $this->error("参数错误");
  39 + }
  40 + $captch = WechatCaptcha::where('ip', $ip)
  41 + ->where('event', $event)
  42 + ->whereTime('createtime', '-2 minutes')
  43 + ->find();
  44 + if ($captch) {
  45 + $this->error("获取频繁,请稍后重试");
  46 + }
  47 + $token = Wechat::getAccessToken();
  48 + if (!$token) {
  49 + $this->error("发送失败,请稍后重试");
  50 + }
  51 + $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";
  52 + $params = [
  53 + 'expire_seconds' => 120,
  54 + 'action_name' => 'QR_STR_SCENE',
  55 + 'action_info' => [
  56 + 'scene' => [
  57 + 'scene_str' => "captcha_" . $event . "_" . $ip,
  58 + ]
  59 + ],
  60 + ];
  61 + //获取验证码
  62 + $result = Http::sendRequest($url, json_encode($params));
  63 + if ($result['ret']) {
  64 + $msg = (array)json_decode($result['msg'], true);
  65 + if (isset($msg['ticket']) && isset($msg['url'])) {
  66 + $this->success("", null, ['image' => "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" . urlencode($msg['ticket']), 'url' => $msg['url']]);
  67 + }
  68 + }
  69 + $this->error("获取失败!请稍后重试");
  70 + }
  71 +
  72 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\controller;
  4 +
  5 +use addons\wechat\library\Config;
  6 +use addons\wechat\model\WechatAutoreply;
  7 +use addons\wechat\model\WechatCaptcha;
  8 +use addons\wechat\model\WechatContext;
  9 +use addons\wechat\model\WechatResponse;
  10 +use addons\wechat\model\WechatConfig;
  11 +
  12 +use app\common\library\Menu;
  13 +use EasyWeChat\Factory;
  14 +use addons\wechat\library\Wechat as WechatService;
  15 +use addons\wechat\library\Config as ConfigService;
  16 +use think\Log;
  17 +use think\Db;
  18 +use fast\Date;
  19 +use fast\Random;
  20 +use fast\Http;
  21 +use addons\third\model\Third;
  22 +use think\Session;
  23 +
  24 +/**
  25 + * 微信接口
  26 + */
  27 +class Index extends \think\addons\Controller
  28 +{
  29 +
  30 + public $app = null;
  31 +
  32 + public function _initialize()
  33 + {
  34 + parent::_initialize();
  35 + $this->app = Factory::officialAccount(Config::load());
  36 + }
  37 +
  38 + /**
  39 + *
  40 + */
  41 + public function index()
  42 + {
  43 +
  44 + $menu = [
  45 + [
  46 + 'name' => 'wechat',
  47 + 'title' => '微信管理',
  48 + 'icon' => 'fa fa-wechat',
  49 + 'sublist' => [
  50 + [
  51 + 'name' => 'wechat/autoreply',
  52 + 'title' => '自动回复管理',
  53 + 'icon' => 'fa fa-reply-all',
  54 + 'sublist' => [
  55 + ['name' => 'wechat/autoreply/index', 'title' => '查看'],
  56 + ['name' => 'wechat/autoreply/add', 'title' => '添加'],
  57 + ['name' => 'wechat/autoreply/edit', 'title' => '修改'],
  58 + ['name' => 'wechat/autoreply/del', 'title' => '删除'],
  59 + ['name' => 'wechat/autoreply/multi', 'title' => '批量更新'],
  60 + ]
  61 + ],
  62 + [
  63 + 'name' => 'wechat/config',
  64 + 'title' => '配置管理',
  65 + 'icon' => 'fa fa-cog',
  66 + 'sublist' => [
  67 + ['name' => 'wechat/config/index', 'title' => '查看'],
  68 + ['name' => 'wechat/config/add', 'title' => '添加'],
  69 + ['name' => 'wechat/config/edit', 'title' => '修改'],
  70 + ['name' => 'wechat/config/del', 'title' => '删除'],
  71 + ['name' => 'wechat/config/multi', 'title' => '批量更新'],
  72 + ]
  73 + ],
  74 + [
  75 + 'name' => 'wechat/menu',
  76 + 'title' => '菜单管理',
  77 + 'icon' => 'fa fa-list',
  78 + 'sublist' => [
  79 + ['name' => 'wechat/menu/index', 'title' => '查看'],
  80 + ['name' => 'wechat/menu/add', 'title' => '添加'],
  81 + ['name' => 'wechat/menu/edit', 'title' => '修改'],
  82 + ['name' => 'wechat/menu/del', 'title' => '删除'],
  83 + ['name' => 'wechat/menu/remote', 'title' => '加载远程菜单'],
  84 + ['name' => 'wechat/menu/sync', 'title' => '同步'],
  85 + ['name' => 'wechat/menu/multi', 'title' => '批量更新'],
  86 + ]
  87 + ],
  88 + [
  89 + 'name' => 'wechat/response',
  90 + 'title' => '资源管理',
  91 + 'icon' => 'fa fa-list-alt',
  92 + 'sublist' => [
  93 + ['name' => 'wechat/response/index', 'title' => '查看'],
  94 + ['name' => 'wechat/response/add', 'title' => '添加'],
  95 + ['name' => 'wechat/response/edit', 'title' => '修改'],
  96 + ['name' => 'wechat/response/del', 'title' => '删除'],
  97 + ['name' => 'wechat/response/select', 'title' => '选择'],
  98 + ['name' => 'wechat/response/multi', 'title' => '批量更新'],
  99 + ]
  100 + ]
  101 + ]
  102 + ]
  103 + ];
  104 + Menu::create($menu);
  105 + return true;
  106 + }
  107 +
  108 + /**
  109 + * 微信API对接接口
  110 + */
  111 + public function api()
  112 + {
  113 + $this->app->server->push(function ($message) {
  114 + $wechatService = new WechatService;
  115 +
  116 + $matches = null;
  117 + $openid = $message['FromUserName'];
  118 + $to_openid = $message['ToUserName'];
  119 + //file_put_contents("pcl_wct.log", date("Y-m-d H:i:s") . "1-::" . json_encode($message, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  120 +
  121 + $unknownMessage = WechatConfig::getValue('default.unknown.message');
  122 + $unknownMessage = $unknownMessage ? $unknownMessage : "";
  123 +
  124 + switch ($message['MsgType']) {
  125 + case 'event': //事件消息
  126 + $event = $message['Event'];
  127 + $eventkey = $message['EventKey'] ? $message['EventKey'] : $message['Event'];
  128 + //验证码消息
  129 + if (in_array($event, ['subscribe', 'SCAN']) && preg_match("/^captcha_([a-zA-Z0-9]+)_([0-9\.]+)/", $eventkey, $matches)) {
  130 + return WechatCaptcha::send($openid, $matches[1], $matches[2]);
  131 + }
  132 + switch ($event) {
  133 + case 'subscribe'://添加关注
  134 + $subscribeMessage = WechatConfig::getValue('default.subscribe.message');
  135 + //$subscribeMessage = $subscribeMessage ? $subscribeMessage : "欢迎关注惠蒙房地产交易综合服务大厅!";
  136 + $subscribeMessage = '欢迎关注蒙自市房地产交易综合服务大厅,<a data-miniprogram-appid="wx0a5edd82c146e6f4" data-miniprogram-path="pages/home/mine1/mine1" href="https://fdc.xp.yn.cn" data-miniprogram-type="text">点击链接注册成为物业经理</a>';
  137 + //获得access_token
  138 + $getAccessToken = $this->getAccessToken();
  139 + //获得用户信息
  140 + $params = [];
  141 + $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $getAccessToken . "&openid=" . $openid . "&lang=zh_CN";
  142 + $userInfo = Http::sendRequest($url, $params, 'GET');
  143 + //根据UnionID判断用户是否已注册
  144 +
  145 + $u_info_data = json_decode($userInfo['msg'], true);
  146 +
  147 + $ucks = Db::name('wct_user')
  148 + ->where(['unionid' => $u_info_data['unionid']])
  149 + ->find();
  150 +
  151 + if (empty($ucks)) {
  152 + $useradd['unionid'] = $u_info_data['unionid'];
  153 + $useradd['wx_openid'] = $openid;
  154 + $useradd['loginip'] = request()->ip();
  155 + $useradd['createtime'] = time();
  156 + Db::name('wct_user')->insertGetId($useradd);
  157 + }
  158 +
  159 + file_put_contents("pcl_wct.log", date("Y-m-d H:i:s") . "::3-" . json_encode($userInfo['msg'], JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  160 + return $subscribeMessage;
  161 +
  162 + case 'unsubscribe'://取消关注
  163 + return '';
  164 + case 'LOCATION'://获取地理位置
  165 + return '';
  166 + case 'VIEW': //跳转链接,eventkey为链接
  167 + return '';
  168 + case 'SCAN': //扫码
  169 + return '';
  170 + default:
  171 + break;
  172 + }
  173 +
  174 + $wechatResponse = WechatResponse::where(["eventkey" => $eventkey, 'status' => 'normal'])->find();
  175 + if ($wechatResponse) {
  176 + $responseContent = (array)json_decode($wechatResponse['content'], true);
  177 + $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
  178 + $data = ['eventkey' => $eventkey, 'command' => '', 'refreshtime' => time(), 'openid' => $openid];
  179 + if ($wechatContext) {
  180 + $wechatContext->save($data);
  181 + } else {
  182 + $wechatContext = WechatContext::create($data, true);
  183 + }
  184 + $result = $wechatService->response($this, $openid, '', $responseContent, $wechatContext);
  185 + if ($result) {
  186 + return $result;
  187 + }
  188 + }
  189 + return $unknownMessage;
  190 + case 'text': //文字消息
  191 + case 'image': //图片消息
  192 + case 'voice': //语音消息
  193 + case 'video': //视频消息
  194 + case 'location': //坐标消息
  195 + case 'link': //链接消息
  196 + default: //其它消息
  197 +
  198 + //自动回复处理
  199 + if ($message['MsgType'] == 'text') {
  200 + $autoreply = null;
  201 + $autoreplyList = WechatAutoreply::where('status', 'normal')->cache(true)->order('weigh DESC,id DESC')->select();
  202 + foreach ($autoreplyList as $index => $item) {
  203 + //完全匹配和正则匹配
  204 + if ($item['text'] == $message['Content'] || (in_array(mb_substr($item['text'], 0, 1), ['#', '~', '/']) && preg_match($item['text'], $message['Content'], $matches))) {
  205 + $autoreply = $item;
  206 + break;
  207 + }
  208 + }
  209 +
  210 + if ($autoreply) {
  211 + $wechatResponse = WechatResponse::where(["eventkey" => $autoreply['eventkey'], 'status' => 'normal'])->find();
  212 + if ($wechatResponse) {
  213 + $responseContent = (array)json_decode($wechatResponse['content'], true);
  214 + $wechatContext = WechatContext::where(['openid' => $openid])->order('id', 'desc')->find();
  215 + $result = $wechatService->response($this, $openid, $message['Content'], $responseContent, $wechatContext, $matches);
  216 + if ($result) {
  217 + return $result;
  218 + }
  219 + }
  220 + }
  221 + }
  222 + return $unknownMessage;
  223 + }
  224 + return ""; //SUCCESS
  225 + });
  226 +
  227 + $response = $this->app->server->serve();
  228 + //file_put_contents("pcl_wct.log", date("Y-m-d H:i:s") . "::4-" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  229 + // 将响应输出
  230 + $response->send();
  231 + return;
  232 + }
  233 +
  234 + /**
  235 + * 登录回调
  236 + */
  237 + public function callback()
  238 + {
  239 +
  240 +
  241 + }
  242 +
  243 + /**
  244 + * 支付回调
  245 + */
  246 + public function notify()
  247 + {
  248 + Log::record(file_get_contents('php://input'), "notify");
  249 + $response = $this->app->handlePaidNotify(function ($message, $fail) {
  250 + // 你的逻辑
  251 + return true;
  252 + // 或者错误消息
  253 + $fail('Order not exists.');
  254 + });
  255 +
  256 + $response->send();
  257 + return;
  258 + }
  259 +
  260 + /**
  261 + * 获取Token
  262 + */
  263 + public static function getAccessToken()
  264 + {
  265 + $token = Session::get('wechat_access_token');
  266 + if (!$token) {
  267 + $config = get_addon_config('wechat');
  268 + $params = [
  269 + 'grant_type' => 'client_credential',
  270 + 'appid' => $config['app_id'],
  271 + 'secret' => $config['secret'],
  272 + ];
  273 + $url = "https://api.weixin.qq.com/cgi-bin/token";
  274 + $result = Http::sendRequest($url, $params, 'GET');
  275 + if ($result['ret']) {
  276 + $msg = (array)json_decode($result['msg'], true);
  277 + if (isset($msg['access_token'])) {
  278 + $token = $msg['access_token'];
  279 + Session::set('wechat_access_token', $token, $msg['expires_in'] - 1);
  280 + }
  281 + }
  282 + }
  283 + return $token;
  284 + }
  285 +
  286 + /**
  287 + * 根据Openid获取用户信息
  288 + * @param string $openid 微信OpenID
  289 + * @return User|null
  290 + */
  291 + public static function getUserByOpenid($openid)
  292 + {
  293 + $third = Third::where('platform', 'wechat')->where('openid', $openid)->find();
  294 + if ($third && $third->user_id) {
  295 + return User::get($third->user_id);
  296 + }
  297 + return null;
  298 + }
  299 +
  300 +}
  1 +name = wechat
  2 +title = 微信管理
  3 +intro = 在线管理微信公众号插件
  4 +author = FastAdmin
  5 +website = https://www.fastadmin.net
  6 +version = 1.2.0
  7 +state = 1
  8 +url = /addons/wechat
  9 +license = regular
  10 +licenseto = 56052
  1 +
  2 +CREATE TABLE IF NOT EXISTS `__PREFIX__wechat_autoreply` (
  3 + `id` int(10) NOT NULL AUTO_INCREMENT,
  4 + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '标题',
  5 + `text` varchar(100) NOT NULL DEFAULT '' COMMENT '触发文本',
  6 + `eventkey` varchar(50) NOT NULL DEFAULT '' COMMENT '响应事件',
  7 + `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  8 + `weigh` int(10) NOT NULL DEFAULT '0' COMMENT '权重',
  9 + `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
  10 + `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  11 + `status` varchar(30) NOT NULL DEFAULT '' COMMENT '状态',
  12 + PRIMARY KEY (`id`),
  13 + KEY `eventkey` (`eventkey`)
  14 +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='微信自动回复表';
  15 +
  16 +BEGIN;
  17 +INSERT INTO `__PREFIX__wechat_autoreply`(`id`, `title`, `text`, `eventkey`, `remark`, `weigh`, `createtime`, `updatetime`, `status`) VALUES (1, '输入hello', 'hello', '58c7d908c4570', '', 1, 1493366855, 1493366855, 'normal');
  18 +INSERT INTO `__PREFIX__wechat_autoreply`(`id`, `title`, `text`, `eventkey`, `remark`, `weigh`, `createtime`, `updatetime`, `status`) VALUES (2, '输入你好', '你好', '58fdfaa9e1965', '', 2, 1493704976, 1493704976, 'normal');
  19 +COMMIT;
  20 +
  21 +CREATE TABLE IF NOT EXISTS `__PREFIX__wechat_captcha` (
  22 + `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  23 + `event` varchar(100) DEFAULT '' COMMENT '事件',
  24 + `openid` varchar(255) DEFAULT NULL COMMENT '用户openid',
  25 + `context` varchar(20) DEFAULT NULL COMMENT '上下文',
  26 + `code` varchar(30) DEFAULT NULL COMMENT '验证码',
  27 + `times` int(10) unsigned DEFAULT '0' COMMENT '验证次数',
  28 + `ip` varchar(50) DEFAULT '' COMMENT 'IP',
  29 + `createtime` int(10) DEFAULT NULL COMMENT '创建时间',
  30 + PRIMARY KEY (`id`),
  31 + KEY `ip` (`ip`,`event`) USING BTREE,
  32 + KEY `openid` (`openid`(191),`event`)
  33 +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='微信公众号验证码';
  34 +
  35 +CREATE TABLE IF NOT EXISTS `__PREFIX__wechat_config` (
  36 + `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  37 + `name` varchar(50) NOT NULL DEFAULT '' COMMENT '配置名称',
  38 + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '配置标题',
  39 + `value` text NOT NULL COMMENT '配置值',
  40 + `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  41 + `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  42 + PRIMARY KEY (`id`),
  43 + UNIQUE KEY `name` (`name`) USING BTREE
  44 +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='微信配置表';
  45 +
  46 +BEGIN;
  47 +INSERT INTO `__PREFIX__wechat_config` VALUES ('1', 'menu', '微信菜单', '[{\"name\":\"FastAdmin\",\"sub_button\":[{\"name\":\"官网\",\"type\":\"view\",\"url\":\"http:\\/\\/www.fastadmin.net\"},{\"name\":\"在线演示\",\"type\":\"click\",\"key\":\"\"},{\"name\":\"文档\",\"type\":\"view\",\"url\":\"http:\\/\\/doc.fastadmin.net\"}]},{\"name\":\"在线客服\",\"type\":\"click\",\"key\":\"58cb852984970\"},{\"name\":\"关于我们\",\"type\":\"click\",\"key\":\"58bf944aa0777\"}]', '1497398820', '1500538185'), ('2', 'service', '客服配置', '{\"onlinetime\":\"09:00-18:00\",\"offlinemsg\":\"请在工作时间联系客服!\",\"nosessionmsg\":\"当前没有客服在线!请稍后重试!\",\"waitformsg\":\"请问有什么可以帮到您?\"}', '1497429674', '1497429674'), ('3', 'signin', '连续登录配置', '{\"s1\":\"100\",\"s2\":\"200\",\"s3\":\"300\",\"sn\":\"500\"}', '1497429711', '1497429711');
  48 +COMMIT;
  49 +
  50 +CREATE TABLE IF NOT EXISTS `__PREFIX__wechat_context` (
  51 + `id` int(10) NOT NULL AUTO_INCREMENT,
  52 + `openid` varchar(64) NOT NULL DEFAULT '',
  53 + `type` varchar(30) NOT NULL DEFAULT '' COMMENT '类型',
  54 + `eventkey` varchar(64) NOT NULL DEFAULT '',
  55 + `command` varchar(64) NOT NULL DEFAULT '',
  56 + `message` varchar(255) NOT NULL DEFAULT '' COMMENT '内容',
  57 + `refreshtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后刷新时间',
  58 + `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  59 + `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  60 + PRIMARY KEY (`id`),
  61 + KEY `openid` (`openid`,`eventkey`) USING BTREE
  62 +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='微信上下文表';
  63 +
  64 +CREATE TABLE IF NOT EXISTS `__PREFIX__wechat_response` (
  65 + `id` int(10) NOT NULL AUTO_INCREMENT,
  66 + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '资源名',
  67 + `eventkey` varchar(128) NOT NULL DEFAULT '' COMMENT '事件',
  68 + `type` enum('text','image','news','voice','video','music','link','app') NOT NULL DEFAULT 'text' COMMENT '类型',
  69 + `content` text NOT NULL COMMENT '内容',
  70 + `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
  71 + `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  72 + `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  73 + `status` varchar(30) NOT NULL DEFAULT '' COMMENT '状态',
  74 + PRIMARY KEY (`id`),
  75 + UNIQUE KEY `eventkey` (`eventkey`) USING BTREE
  76 +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='微信资源表';
  77 +
  78 +BEGIN;
  79 +INSERT INTO `__PREFIX__wechat_response` VALUES ('1', '签到送积分', '58adaf7876aab', 'app', '{\"app\":\"signin\"}', '', '1487777656', '1487777656', 'normal'), ('2', '关于我们', '58bf944aa0777', 'app', '{\"app\":\"page\",\"id\":\"1\"}', '', '1488950346', '1488950346', 'normal'), ('3', '自动回复1', '58c7d908c4570', 'text', '{\"content\":\"world\"}', '', '1489492232', '1489492232', 'normal'), ('5', '自动回复2', '58fdfaa9e1965', 'text', '{\"content\":\"我是FastAdmin!\"}', '', '1493039785', '1493039785', 'normal');
  80 +COMMIT;
  81 +
  1 +<?php
  2 +
  3 +namespace addons\wechat\library;
  4 +
  5 +/**
  6 + * 微信配置类
  7 + */
  8 +class Config
  9 +{
  10 +
  11 + public static function load()
  12 + {
  13 + $config = get_addon_config('wechat');
  14 +
  15 + return [
  16 + /**
  17 + * 账号基本信息,请从微信公众平台/开放平台获取
  18 + */
  19 + 'app_id' => $config['app_id'], // AppID
  20 + 'secret' => $config['secret'], // AppSecret
  21 + 'token' => $config['token'], // Token
  22 + 'aes_key' => $config['aes_key'], // EncodingAESKey,安全模式下请一定要填写!!!
  23 +
  24 + /**
  25 + * 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
  26 + * 使用自定义类名时,构造函数将会接收一个 `EasyWeChat\Kernel\Http\Response` 实例
  27 + */
  28 + 'response_type' => 'array',
  29 +
  30 + /**
  31 + * 日志配置
  32 + *
  33 + * level: 日志级别, 可选为:debug/info/notice/warning/error/critical/alert/emergency
  34 + * path:日志文件位置(绝对路径!!!),要求可写权限
  35 + */
  36 + 'log' => [
  37 + 'default' => 'dev', // 默认使用的 channel,生产环境可以改为下面的 prod
  38 + 'channels' => [
  39 + // 测试环境
  40 + 'dev' => [
  41 + 'driver' => 'single',
  42 + 'path' => ROOT_PATH . '/runtime/log/easywechat.log',
  43 + 'level' => 'debug',
  44 + ],
  45 + // 生产环境
  46 + 'prod' => [
  47 + 'driver' => 'daily',
  48 + 'path' => ROOT_PATH . '/runtime/log/easywechat.log',
  49 + 'level' => $config['log_level'],
  50 + ],
  51 + ],
  52 + ],
  53 +
  54 + /**
  55 + * 接口请求相关配置,超时时间等,具体可用参数请参考:
  56 + * http://docs.guzzlephp.org/en/stable/request-config.html
  57 + *
  58 + * - retries: 重试次数,默认 1,指定当 http 请求失败时重试的次数。
  59 + * - retry_delay: 重试延迟间隔(单位:ms),默认 500
  60 + * - log_template: 指定 HTTP 日志模板,请参考:https://github.com/guzzle/guzzle/blob/master/src/MessageFormatter.php
  61 + */
  62 + 'http' => [
  63 + 'max_retries' => 1,
  64 + 'retry_delay' => 500,
  65 + 'timeout' => 5.0,
  66 + // 'base_uri' => 'https://api.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
  67 + ],
  68 +
  69 + /**
  70 + * OAuth 配置
  71 + *
  72 + * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
  73 + * callback:OAuth授权完成后的回调页地址
  74 + */
  75 + 'oauth' => [
  76 + 'scopes' => ['snsapi_userinfo'],
  77 + 'callback' => $config['oauth_callback'],
  78 + ],
  79 + ];
  80 + }
  81 +
  82 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\library;
  4 +
  5 +use addons\signin\model\Signin;
  6 +use addons\third\model\Third;
  7 +use app\common\model\User;
  8 +use EasyWeChat\Kernel\Messages\News;
  9 +use EasyWeChat\Kernel\Messages\NewsItem;
  10 +use fast\Date;
  11 +use fast\Http;
  12 +use fast\Random;
  13 +use think\Session;
  14 +use think\Config;
  15 +
  16 +/**
  17 + * 微信服务类
  18 + */
  19 +class Wechat
  20 +{
  21 + public static function appConfig()
  22 + {
  23 + return array(
  24 + 'signin' => array(
  25 + 'name' => '签到送积分',
  26 + 'config' => array()
  27 + ),
  28 + 'blog' => array(
  29 + 'name' => '关联博客',
  30 + 'config' => array(
  31 + array(
  32 + 'type' => 'text',
  33 + 'caption' => '日志ID',
  34 + 'field' => 'post_id',
  35 + 'rule' => '',
  36 + 'extend' => 'class="form-control selectpage" data-source="blog/post/index" data-field="title"',
  37 + 'options' => '',
  38 + ),
  39 + array(
  40 + 'type' => 'radio',
  41 + 'caption' => '开启搜索日志',
  42 + 'field' => 'searchpost',
  43 + 'rule' => '',
  44 + 'extend' => '',
  45 + 'options' => [
  46 + '1' => '是',
  47 + '0' => '否',
  48 + ],
  49 + ),
  50 + array(
  51 + 'type' => 'text',
  52 + 'caption' => '正则搜索匹配索引',
  53 + 'field' => 'searchregexindex',
  54 + 'rule' => '',
  55 + 'defaultvalue' => '1',
  56 + 'extend' => '',
  57 + 'options' => [],
  58 + )
  59 + )
  60 + ),
  61 + 'cms' => array(
  62 + 'name' => '关联CMS',
  63 + 'config' => array(
  64 + array(
  65 + 'type' => 'text',
  66 + 'caption' => '文章ID',
  67 + 'field' => 'archives_id',
  68 + 'rule' => '',
  69 + 'extend' => 'class="form-control selectpage" data-source="cms/archives/index" data-field="title"',
  70 + 'options' => ''
  71 + ),
  72 + array(
  73 + 'type' => 'text',
  74 + 'caption' => '单页ID',
  75 + 'field' => 'page_id',
  76 + 'rule' => '',
  77 + 'extend' => 'class="form-control selectpage" data-source="cms/page/index" data-field="title"',
  78 + 'options' => ''
  79 + ),
  80 + array(
  81 + 'type' => 'text',
  82 + 'caption' => '专题ID',
  83 + 'field' => 'special_id',
  84 + 'rule' => '',
  85 + 'extend' => 'class="form-control selectpage" data-source="cms/special/index" data-field="title"',
  86 + 'options' => ''
  87 + ),
  88 + array(
  89 + 'type' => 'radio',
  90 + 'caption' => '开启搜索文章',
  91 + 'field' => 'searcharchives',
  92 + 'rule' => '',
  93 + 'extend' => '',
  94 + 'options' => [
  95 + '1' => '是',
  96 + '0' => '否',
  97 + ],
  98 + ),
  99 + array(
  100 + 'type' => 'radio',
  101 + 'caption' => '开启搜索单页',
  102 + 'field' => 'searchpage',
  103 + 'rule' => '',
  104 + 'extend' => '',
  105 + 'options' => [
  106 + '1' => '是',
  107 + '0' => '否',
  108 + ],
  109 + ),
  110 + array(
  111 + 'type' => 'radio',
  112 + 'caption' => '开启搜索专题',
  113 + 'field' => 'searchspecial',
  114 + 'rule' => '',
  115 + 'extend' => '',
  116 + 'options' => [
  117 + '1' => '是',
  118 + '0' => '否',
  119 + ],
  120 + ),
  121 + array(
  122 + 'type' => 'text',
  123 + 'caption' => '正则搜索匹配索引',
  124 + 'field' => 'searchregexindex',
  125 + 'rule' => '',
  126 + 'defaultvalue' => '1',
  127 + 'extend' => '',
  128 + 'options' => [],
  129 + )
  130 + )
  131 + ),
  132 + 'ask' => array(
  133 + 'name' => '关联问答',
  134 + 'config' => array(
  135 + array(
  136 + 'type' => 'text',
  137 + 'caption' => '问题ID',
  138 + 'field' => 'question_id',
  139 + 'extend' => 'class="form-control selectpage" data-source="ask/question/index" data-field="title"',
  140 + 'options' => ''
  141 + ),
  142 + array(
  143 + 'type' => 'text',
  144 + 'caption' => '文章ID',
  145 + 'field' => 'article_id',
  146 + 'extend' => 'class="form-control selectpage" data-source="ask/article/index" data-field="title"',
  147 + 'options' => ''
  148 + ),
  149 + array(
  150 + 'type' => 'radio',
  151 + 'caption' => '开启搜索问题',
  152 + 'field' => 'searchquestion',
  153 + 'rule' => '',
  154 + 'extend' => '',
  155 + 'options' => [
  156 + '1' => '是',
  157 + '0' => '否',
  158 + ],
  159 + ),
  160 + array(
  161 + 'type' => 'radio',
  162 + 'caption' => '开启搜索文章',
  163 + 'field' => 'searcharticle',
  164 + 'rule' => '',
  165 + 'extend' => '',
  166 + 'options' => [
  167 + '1' => '是',
  168 + '0' => '否',
  169 + ],
  170 + ),
  171 + array(
  172 + 'type' => 'text',
  173 + 'caption' => '正则搜索匹配索引',
  174 + 'field' => 'searchregexindex',
  175 + 'rule' => '',
  176 + 'defaultvalue' => '1',
  177 + 'extend' => '',
  178 + 'options' => [],
  179 + )
  180 + )
  181 + ),
  182 + 'vote' => array(
  183 + 'name' => '关联投票',
  184 + 'config' => array(
  185 + array(
  186 + 'type' => 'text',
  187 + 'caption' => '投票主题ID',
  188 + 'field' => 'subject_id',
  189 + 'extend' => 'class="form-control selectpage" data-source="vote/subject/index" data-field="title"',
  190 + 'rule' => '',
  191 + 'options' => ''
  192 + ),
  193 + array(
  194 + 'type' => 'text',
  195 + 'caption' => '参赛人员ID',
  196 + 'field' => 'player_id',
  197 + 'rule' => '',
  198 + 'extend' => 'class="form-control selectpage" data-source="vote/player/index" data-field="nickname"',
  199 + 'options' => ''
  200 + ),
  201 + array(
  202 + 'type' => 'radio',
  203 + 'caption' => '开启搜索主题',
  204 + 'field' => 'searchsubject',
  205 + 'rule' => '',
  206 + 'extend' => '',
  207 + 'options' => [
  208 + '1' => '是',
  209 + '0' => '否',
  210 + ],
  211 + ),
  212 + array(
  213 + 'type' => 'radio',
  214 + 'caption' => '开启搜索参赛人员',
  215 + 'field' => 'searchplayer',
  216 + 'rule' => '',
  217 + 'extend' => '',
  218 + 'options' => [
  219 + '1' => '是',
  220 + '0' => '否',
  221 + ],
  222 + ),
  223 + array(
  224 + 'type' => 'text',
  225 + 'caption' => '正则搜索匹配索引',
  226 + 'field' => 'searchregexindex',
  227 + 'rule' => '',
  228 + 'defaultvalue' => '1',
  229 + 'extend' => '',
  230 + 'options' => [],
  231 + )
  232 + )
  233 + ),
  234 + );
  235 + }
  236 +
  237 + /**
  238 + * 应用交互
  239 + * @return array|bool|mixed|string
  240 + */
  241 + public function response($obj, $openid, $message, $content, $context, $matches = null)
  242 + {
  243 + $response = false;
  244 + if (isset($content['app'])) {
  245 + $entry = null;
  246 + $keyword = isset($content['searchregexindex']) && $content['searchregexindex'] > -1 && $matches && isset($matches[$content['searchregexindex']])
  247 + ? $matches[$content['searchregexindex']] : $message;
  248 + switch ($content['app']) {
  249 + case 'signin':
  250 + $signinInfo = get_addon_info('signin');
  251 + if (!$signinInfo || !$signinInfo['state']) {
  252 + return "请先在后台管理安装并启用《会员签到》插件";
  253 + }
  254 + $thirdInfo = get_addon_info('third');
  255 + if (!$thirdInfo || !$thirdInfo['state']) {
  256 + return "请先在后台管理安装并启用《第三方登录》插件";
  257 + }
  258 + $user = self::getUserByOpenid($openid);
  259 + if (!$user) {
  260 + return "请先在会员中心绑定微信登录,<a href='" . addon_url('third/index/connect', [':platform' => 'wechat'], true, true) . "'>点击这里绑定</a>";
  261 + }
  262 + $config = get_addon_config('signin');
  263 + $signdata = $config['signinscore'];
  264 + $lastdata = Signin::where('user_id', $user->id)->order('id', 'desc')->find();
  265 + $successions = $lastdata && $lastdata['createtime'] > Date::unixtime('day', -1) ? $lastdata['successions'] : 0;
  266 + $signin = Signin::where('user_id', $user->id)->whereTime('createtime', 'today')->find();
  267 + if ($signin) {
  268 + return '今天已签到,请明天再来!';
  269 + } else {
  270 + $successions++;
  271 + Signin::create(['user_id' => $user->id, 'successions' => $successions, 'createtime' => time()]);
  272 + $score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn'];
  273 +
  274 + $user->setInc('score', $score);
  275 + User::score($score, $user->id, "连续签到{$successions}天");
  276 + return '签到成功!连续签到' . $successions . '天!获得' . $score . '积分,';
  277 + }
  278 + break;
  279 + case 'blog':
  280 + $blogInfo = get_addon_info('blog');
  281 + if (!$blogInfo || !$blogInfo['state']) {
  282 + return "请先在后台管理安装并启用《简单博客》插件";
  283 + }
  284 + $entry = \addons\blog\model\Post::get($content['post_id']);
  285 + if ($entry) {
  286 + $entry['image'] = $entry['thumb'];
  287 + }
  288 + if (!$entry && $content['searchpost']) {
  289 + $entry = \addons\blog\model\Post::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  290 + }
  291 + if (!$entry) {
  292 + return "未搜索到任何匹配信息$keyword" . json_encode($matches);
  293 + }
  294 + break;
  295 + case 'cms':
  296 + $cmsInfo = get_addon_info('cms');
  297 + if (!$cmsInfo || !$cmsInfo['state']) {
  298 + return "请先在后台管理安装并启用《CMS内容管理系统》插件";
  299 + }
  300 + if (isset($content['archives_id']) && $content['archives_id']) {
  301 + $entry = \addons\cms\model\Archives::get($content['archives_id']);
  302 + } elseif (isset($content['page_id']) && $content['page_id']) {
  303 + $entry = \addons\cms\model\Page::get($content['page_id']);
  304 + } elseif (isset($content['special_id']) && $content['special_id']) {
  305 + $entry = \addons\cms\model\Special::get($content['special_id']);
  306 + }
  307 + if (!$entry && $content['searcharchives']) {
  308 + $entry = \addons\cms\model\Archives::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  309 + }
  310 + if (!$entry && $content['searchpage']) {
  311 + $entry = \addons\cms\model\Page::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  312 + }
  313 + if (!$entry && $content['searchspecial']) {
  314 + $entry = \addons\cms\model\Special::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  315 + }
  316 + if (!$entry) {
  317 + return "未搜索到任何匹配信息";
  318 + }
  319 + break;
  320 + case 'ask':
  321 + $blogInfo = get_addon_info('ask');
  322 + if (!$blogInfo || !$blogInfo['state']) {
  323 + return "请先在后台管理安装并启用《知识付费问答》插件";
  324 + }
  325 +
  326 + if (isset($content['question_id']) && $content['question_id']) {
  327 + $entry = \addons\ask\model\Question::get($content['question_id']);
  328 + } elseif (isset($content['article_id']) && $content['article_id']) {
  329 + $entry = \addons\ask\model\Article::get($content['article_id']);
  330 + }
  331 +
  332 + if (!$entry && $content['searchquestion']) {
  333 + $entry = \addons\ask\model\Question::where("title", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  334 + }
  335 + if (!$entry && $content['searcharticle']) {
  336 + $entry = \addons\ask\model\Article::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  337 + }
  338 + if (!$entry) {
  339 + return "未搜索到任何匹配信息";
  340 + }
  341 + break;
  342 + case 'vote':
  343 + $blogInfo = get_addon_info('vote');
  344 + if (!$blogInfo || !$blogInfo['state']) {
  345 + return "请先在后台管理安装并启用《在线投票系统》插件";
  346 + }
  347 + if (isset($content['subject_id']) && $content['subject_id']) {
  348 + $entry = \addons\vote\model\Subject::all($content['subject_id']);
  349 + } elseif (isset($content['player_id']) && $content['player_id']) {
  350 + $entry = \addons\vote\model\Player::all($content['player_id']);
  351 + }
  352 +
  353 + if (!$entry && $content['searchsubject']) {
  354 + $entry = \addons\vote\model\Subject::where("title|description", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  355 + }
  356 + if (!$entry && $content['searchplayer']) {
  357 + $entry = \addons\vote\model\Player::where("nickname", 'like', "%{$keyword}%")->where('status', 'normal')->find();
  358 + }
  359 +
  360 + if (!$entry) {
  361 + return "未搜索到任何匹配信息";
  362 + }
  363 + break;
  364 + default:
  365 + break;
  366 + }
  367 + if (isset($entry) && $entry) {
  368 + $items = [
  369 + new NewsItem([
  370 + 'title' => isset($entry['title']) ? $entry['title'] : (isset($entry['nickname']) ? $entry['nickname'] : ''),
  371 + 'description' => isset($entry['description']) ? $entry['description'] : '',
  372 + 'url' => $entry['fullurl'],
  373 + 'image' => cdnurl($entry['image'], true),
  374 + ]),
  375 + ];
  376 + $news = new News($items);
  377 +
  378 + $response[] = $news;
  379 + }
  380 + } else {
  381 + $response = isset($content['content']) ? $content['content'] : $response;
  382 + }
  383 + return $response;
  384 + }
  385 +
  386 + /**
  387 + * 获取Token
  388 + */
  389 + public static function getAccessToken()
  390 + {
  391 + $token = Session::get('wechat_access_token');
  392 + if (!$token) {
  393 + $config = get_addon_config('wechat');
  394 + $params = [
  395 + 'grant_type' => 'client_credential',
  396 + 'appid' => $config['app_id'],
  397 + 'secret' => $config['secret'],
  398 + ];
  399 + $url = "https://api.weixin.qq.com/cgi-bin/token";
  400 + $result = Http::sendRequest($url, $params, 'GET');
  401 + if ($result['ret']) {
  402 + $msg = (array)json_decode($result['msg'], true);
  403 + if (isset($msg['access_token'])) {
  404 + $token = $msg['access_token'];
  405 + Session::set('wechat_access_token', $token, $msg['expires_in'] - 1);
  406 + }
  407 + }
  408 + }
  409 + return $token;
  410 + }
  411 +
  412 + /**
  413 + * 根据Openid获取用户信息
  414 + * @param string $openid 微信OpenID
  415 + * @return User|null
  416 + */
  417 + public static function getUserByOpenid($openid)
  418 + {
  419 + $third = Third::where('platform', 'wechat')->where('openid', $openid)->find();
  420 + if ($third && $third->user_id) {
  421 + return User::get($third->user_id);
  422 + }
  423 + return null;
  424 + }
  425 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatAutoreply extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\model;
  4 +
  5 +use fast\Random;
  6 +use think\Model;
  7 +
  8 +class WechatCaptcha extends Model
  9 +{
  10 +
  11 + // 表名
  12 + protected $name = 'wechat_captcha';
  13 + // 自动写入时间戳字段
  14 + protected $autoWriteTimestamp = 'int';
  15 + // 定义时间戳字段名
  16 + protected $createTime = 'createtime';
  17 + protected $updateTime = '';
  18 + // 追加属性
  19 + protected $append = [
  20 + ];
  21 +
  22 + /**
  23 + * 发送验证码
  24 + * @param $openid string 用户OpenID
  25 + * @param $event string 事件
  26 + * @param $ip string IP地址
  27 + * @return string
  28 + */
  29 + public static function send($openid, $event, $ip)
  30 + {
  31 + $captcha = self::where(['openid' => $openid, 'event' => $event])->whereTime('createtime', '-2 minutes')->find();
  32 + if ($captcha) {
  33 + return "验证码发送速度过快,请稍后重试";
  34 + }
  35 + $code = Random::alnum(4);
  36 + $data = [
  37 + 'event' => $event,
  38 + 'openid' => $openid,
  39 + 'code' => $code,
  40 + 'ip' => $ip,
  41 + ];
  42 + self::create($data);
  43 + return "你的验证码是:{$code},2分钟内输入有效";
  44 + }
  45 +
  46 + /**
  47 + * 检测验证码
  48 + * @param $code string 验证码
  49 + * @param $event string 事件
  50 + * @param $ip string IP
  51 + * @return bool
  52 + */
  53 + public static function check($code, $event, $ip = null)
  54 + {
  55 + $ip = is_null($ip) ? request()->ip() : $ip;
  56 + $captcha = self::where(['ip' => $ip, 'event' => $event])->whereTime('createtime', '-2 minutes')->find();
  57 + if ($captcha && $captcha->code == $code && $captcha->times < 10) {
  58 + $captcha->setInc("times");
  59 + return true;
  60 + }
  61 + //验证大于10次或超时
  62 + if ($captcha && ($captcha->times >= 10 || time() - $captcha->createtime > 120)) {
  63 + $captcha->delete();
  64 + }
  65 +
  66 + return false;
  67 + }
  68 +
  69 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatConfig extends Model
  8 +{
  9 +
  10 + // 表名,不含前缀
  11 + public $name = 'wechat_config';
  12 + // 自动写入时间戳字段
  13 + protected $autoWriteTimestamp = 'int';
  14 + // 定义时间戳字段名
  15 + protected $createTime = 'createtime';
  16 + protected $updateTime = 'updatetime';
  17 + // 追加属性
  18 + protected $append = [
  19 + ];
  20 +
  21 + /**
  22 + * 读取指定配置名称的值
  23 + * @param string $name
  24 + * @return string
  25 + */
  26 + public static function getValue($name)
  27 + {
  28 + $item = self::get(['name' => $name]);
  29 + return $item ? $item->value : '';
  30 + }
  31 +
  32 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatContext extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<?php
  2 +
  3 +namespace addons\wechat\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatResponse extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 用户信用管理
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Agentcredit extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Agentcredit模型对象
  18 + * @var \app\admin\model\agent\Agentcredit
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Agentcredit;
  26 + $this->view->assign("acTypeList", $this->model->getAcTypeList());
  27 + $this->view->assign("acStuList", $this->model->getAcStuList());
  28 + $actype = $this->request->param('actype', 0);//分类
  29 + //选择的企业id
  30 + $agentListIds = $this->request->param('ids', 0);
  31 + if ($actype == 0) {
  32 + $ginfo = Db::name('agent_list')
  33 + ->where(['id' => $agentListIds])
  34 + ->find();
  35 + } else {
  36 + $ginfo = [];
  37 + }
  38 + //门店信息
  39 + if ($actype == 1) {
  40 + $sinfo = Db::name('agent_shop')
  41 + ->where(['id' => $agentListIds])
  42 + ->find();
  43 + //门店所属企业信息
  44 + $ginfo = Db::name('agent_list')
  45 + ->where(['id' => $sinfo['agent_list_id']])
  46 + ->find();
  47 + } else {
  48 + $sinfo = [];
  49 + }
  50 + //经纪人信息
  51 + if ($actype == 2) {
  52 + $jinfo = Db::name('agent_users')
  53 + ->where(['id' => $agentListIds])
  54 + ->find();
  55 + //所属企业信息
  56 + $ginfo = Db::name('agent_list')
  57 + ->where(['id' => $jinfo['agent_list_id']])
  58 + ->find();
  59 + //所属门店
  60 + $sinfo = Db::name('agent_shop')
  61 + ->where(['id' => $jinfo['agent_shop_id']])
  62 + ->find();
  63 + } else {
  64 + $jinfo = [];
  65 + }
  66 + $this->view->assign("ginfo", $ginfo);
  67 + $this->view->assign("sinfo", $sinfo);
  68 + $this->view->assign("jinfo", $jinfo);
  69 + $this->view->assign('actype', $actype);
  70 + }
  71 +
  72 +
  73 + /**
  74 + * 查看
  75 + */
  76 + public function index()
  77 + {
  78 + //当前是否为关联查询
  79 + $this->relationSearch = false;
  80 + //设置过滤方法
  81 + $this->request->filter(['strip_tags', 'trim']);
  82 + if ($this->request->isAjax()) {
  83 + $actype = $this->request->param('actype', 0);//分类
  84 + $ids = $this->request->param('ids', 0);
  85 + if ($actype == 0) {
  86 + $wh['agent_list_id'] = ['=', $ids];
  87 + }
  88 + if ($actype == 1) {
  89 + $wh['agent_shop_id'] = ['=', $ids];
  90 + }
  91 + if ($actype == 2) {
  92 + $wh['agent_user_id'] = ['=', $ids];
  93 + }
  94 + //如果发送的来源是Selectpage,则转发到Selectpage
  95 + if ($this->request->request('keyField')) {
  96 + return $this->selectpage();
  97 + }
  98 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  99 +
  100 + $list = $this->model
  101 + ->where($where)
  102 + ->where($wh)
  103 + ->order($sort, $order)
  104 + ->paginate($limit);
  105 +
  106 + $rows = $list->items();
  107 + foreach ($rows as $kk => $vv) {
  108 + //关联企业、门店、经纪人信息
  109 + $ginfo = Db::name('agent_list')
  110 + ->where(['id' => $vv['agent_list_id']])
  111 + ->field('id,agent_name')
  112 + ->find();
  113 + $rows[$kk]['agent_name'] = $ginfo['agent_name'] ? $ginfo['agent_name'] : '-';
  114 +
  115 + $sinfo = Db::name('agent_shop')
  116 + ->where(['id' => $vv['agent_shop_id']])
  117 + ->field('id,shop_name')
  118 + ->find();
  119 + $rows[$kk]['shop_name'] = $sinfo['shop_name'] ? $sinfo['shop_name'] : '-';
  120 + $jinfo = Db::name('agent_users')
  121 + ->where(['id' => $vv['agent_user_id']])
  122 + ->field('id,jjr_name')
  123 + ->find();
  124 + $rows[$kk]['jjr_name'] = $jinfo['jjr_name'] ? $jinfo['jjr_name'] : '-';
  125 + }
  126 +
  127 + $result = array("total" => $list->total(), "rows" => $rows);
  128 +
  129 + return json($result);
  130 + }
  131 + return $this->view->fetch();
  132 + }
  133 +
  134 + /**
  135 + * 添加
  136 + */
  137 + public function add()
  138 + {
  139 + if ($this->request->isPost()) {
  140 + $params = $this->request->post("row/a");
  141 + if ($params) {
  142 + $params = $this->preExcludeFields($params);
  143 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  144 + $params[$this->dataLimitField] = $this->auth->id;
  145 + }
  146 + $result = false;
  147 + Db::startTrans();
  148 + try {
  149 + //是否采用模型验证
  150 + if ($this->modelValidate) {
  151 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  152 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  153 + $this->model->validateFailException(true)->validate($validate);
  154 + }
  155 + $params['admin'] = $this->auth->id;
  156 + //计算之前和之后的信用分数
  157 + if ($params['ac_type'] == 0) {
  158 + if (empty($params['agent_list_id'])) {
  159 + $this->error('请选择企业信息');
  160 + }
  161 + //企业原信用分
  162 + $ginfo = Db::name('agent_list')
  163 + ->where(['id' => $params['agent_list_id']])
  164 + ->find();
  165 + $params['change_before'] = $ginfo['credit'];
  166 + $params['change_after'] = $ginfo['credit'] + $params['change_num'];
  167 + }
  168 + //门店的
  169 + if ($params['ac_type'] == 1) {
  170 + if (empty($params['agent_list_id'])) {
  171 + $this->error('请选择企业信息');
  172 + }
  173 + if (empty($params['agent_shop_id'])) {
  174 + $this->error('请选择门店信息');
  175 + }
  176 + //原信用分
  177 + $sinfo = Db::name('agent_shop')
  178 + ->where(['id' => $params['agent_shop_id']])
  179 + ->find();
  180 + $params['change_before'] = $sinfo['credit'];
  181 + $params['change_after'] = $sinfo['credit'] + $params['change_num'];
  182 + }
  183 + //经纪人的
  184 + if ($params['ac_type'] == 2) {
  185 + if (empty($params['agent_user_id'])) {
  186 + $this->error('请选择经纪人信息');
  187 + }
  188 + //原信用分
  189 + $jinfo = Db::name('agent_users')
  190 + ->where(['id' => $params['agent_user_id']])
  191 + ->find();
  192 + $params['change_before'] = $jinfo['credit'];
  193 + $params['change_after'] = $jinfo['credit'] + $params['change_num'];
  194 + }
  195 + $result = $this->model->allowField(true)->save($params);
  196 + //更新企业、门店、经纪人表的信用分数
  197 + $agentnum['credit'] = $params['change_after'];
  198 + $agentnum['updatetime'] = time();
  199 + if ($params['ac_type'] == 0) {
  200 + Db::name('agent_list')
  201 + ->where(['id' => $params['agent_list_id']])
  202 + ->update($agentnum);
  203 + }
  204 + if ($params['ac_type'] == 1) {
  205 + Db::name('agent_shop')
  206 + ->where(['id' => $params['agent_shop_id']])
  207 + ->update($agentnum);
  208 + }
  209 + if ($params['ac_type'] == 2) {
  210 + Db::name('agent_users')
  211 + ->where(['id' => $params['agent_user_id']])
  212 + ->update($agentnum);
  213 + }
  214 + Db::commit();
  215 + } catch (ValidateException $e) {
  216 + Db::rollback();
  217 + $this->error($e->getMessage());
  218 + } catch (PDOException $e) {
  219 + Db::rollback();
  220 + $this->error($e->getMessage());
  221 + } catch (Exception $e) {
  222 + Db::rollback();
  223 + $this->error($e->getMessage());
  224 + }
  225 + if ($result !== false) {
  226 + $this->success();
  227 + } else {
  228 + $this->error(__('No rows were inserted'));
  229 + }
  230 + }
  231 + $this->error(__('Parameter %s can not be empty', ''));
  232 + }
  233 + return $this->view->fetch();
  234 + }
  235 +
  236 + /**
  237 + * 编辑
  238 + */
  239 + public function edit($ids = null)
  240 + {
  241 + $row = $this->model->get($ids);
  242 + if (!$row) {
  243 + $this->error(__('No Results were found'));
  244 + }
  245 + $adminIds = $this->getDataLimitAdminIds();
  246 + if (is_array($adminIds)) {
  247 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  248 + $this->error(__('You have no permission'));
  249 + }
  250 + }
  251 + if ($this->request->isPost()) {
  252 + $params = $this->request->post("row/a");
  253 + if ($params) {
  254 + $params = $this->preExcludeFields($params);
  255 +
  256 + $result = false;
  257 + Db::startTrans();
  258 + try {
  259 + //是否采用模型验证
  260 + if ($this->modelValidate) {
  261 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  262 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  263 + $row->validateFailException(true)->validate($validate);
  264 + }
  265 + $result = $row->allowField(true)->save($params);
  266 + Db::commit();
  267 + } catch (ValidateException $e) {
  268 + Db::rollback();
  269 + $this->error($e->getMessage());
  270 + } catch (PDOException $e) {
  271 + Db::rollback();
  272 + $this->error($e->getMessage());
  273 + } catch (Exception $e) {
  274 + Db::rollback();
  275 + $this->error($e->getMessage());
  276 + }
  277 + if ($result !== false) {
  278 + $this->success();
  279 + } else {
  280 + $this->error(__('No rows were updated'));
  281 + }
  282 + }
  283 + $this->error(__('Parameter %s can not be empty', ''));
  284 + }
  285 + $this->view->assign("row", $row);
  286 + return $this->view->fetch();
  287 + }
  288 +
  289 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +use app\api\controller\v1\WxXcxQrcode;
  8 +use think\Exception;
  9 +use think\exception\PDOException;
  10 +use think\exception\ValidateException;
  11 +
  12 +/**
  13 + * 企业管理
  14 + *
  15 + * @icon fa fa-circle-o
  16 + */
  17 +class Agentlist extends Backend
  18 +{
  19 + protected $noNeedRight = ['index'];
  20 + /**
  21 + * Agentlist模型对象
  22 + * @var \app\admin\model\agent\Agentlist
  23 + */
  24 + protected $model = null;
  25 + protected $dataLimit = 'auth'; //默认基类中为false,表示不启用,可额外使用auth和personal两个值
  26 + protected $dataLimitField = 'admin_id'; //数据关联字段,当前控制器对应的模型表中必须存在该字段
  27 + protected $isSup = 0;
  28 +
  29 + public function _initialize()
  30 + {
  31 + parent::_initialize();
  32 + $this->model = new \app\admin\model\agent\Agentlist;
  33 + $this->view->assign("agentStuList", $this->model->getAgentStuList());
  34 + $this->view->assign("payStuList", $this->model->getPayStuList());
  35 + //判断是否是超级管理员
  36 + if (in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  37 + $this->isSup = 1;
  38 + } else {
  39 + $this->isSup = 0;
  40 + }
  41 + $this->view->assign("isSup", $this->isSup);
  42 + }
  43 +
  44 + public function import()
  45 + {
  46 + parent::import();
  47 + }
  48 +
  49 +
  50 + /**
  51 + * 查看
  52 + */
  53 + public function index()
  54 + {
  55 + //当前是否为关联查询
  56 + $this->relationSearch = true;
  57 + //设置过滤方法
  58 + $this->request->filter(['strip_tags', 'trim']);
  59 + if ($this->request->isAjax()) {
  60 + //如果发送的来源是Selectpage,则转发到Selectpage
  61 + if ($this->request->request('keyField')) {
  62 + return $this->selectpage();
  63 + }
  64 + list($where, $sort, $order, $offset, $limit) = $this->buildparamsAdm();
  65 +
  66 + $list = $this->model
  67 + ->with(['user', 'agentcategory'])
  68 + ->where($where)
  69 + ->order($sort, $order)
  70 + ->paginate($limit);
  71 +
  72 + foreach ($list as $row) {
  73 + $row->visible(['id', 'user_id', 'agent_name', 'head_image', 'createtime', 'fr_name', 'fr_mobile', 'fzr_name', 'fzr_mobile', 'address', 'latitude', 'longitude', 'add_day', 'yeji', 'year_pays', 'pay_amount', 'card_image', 'cert_images', 'cert_desc', 'agent_content', 'agent_stu', 'start_pay_time', 'end_pay_time', 'pay_stu', 'credit']);
  74 + $row->visible(['user', 'agentcategory']);
  75 + $row->getRelation('user')->visible(['username', 'nickname']);
  76 + $row->getRelation('agentcategory')->visible(['catname']);
  77 + }
  78 +
  79 + $result = array("total" => $list->total(), "rows" => $list->items());
  80 +
  81 + return json($result);
  82 + }
  83 + return $this->view->fetch();
  84 + }
  85 +
  86 + /**
  87 + * 添加
  88 + */
  89 + public function add()
  90 + {
  91 + if ($this->request->isPost()) {
  92 + $params = $this->request->post("row/a");
  93 + if ($params) {
  94 + $params = $this->preExcludeFields($params);
  95 +
  96 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  97 + $params[$this->dataLimitField] = $this->auth->id;
  98 + }
  99 + $result = false;
  100 +
  101 + Db::startTrans();
  102 + try {
  103 + //是否采用模型验证
  104 + if ($this->modelValidate) {
  105 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  106 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  107 + $this->model->validateFailException(true)->validate($validate);
  108 + }
  109 + $result = $this->model->allowField(true)->save($params);
  110 +
  111 +
  112 + Db::commit();
  113 + } catch (ValidateException $e) {
  114 + Db::rollback();
  115 + $this->error($e->getMessage());
  116 + } catch (PDOException $e) {
  117 + Db::rollback();
  118 + $this->error($e->getMessage());
  119 + } catch (Exception $e) {
  120 + Db::rollback();
  121 + $this->error($e->getMessage());
  122 + }
  123 + if ($result !== false) {
  124 + if ($params['agent_stu'] == "1") {
  125 + //审核通过;生成小程序二维码
  126 + $qrcode_api = new WxXcxQrcode();
  127 + $path = '/pages/home/company/detail?id=' . $this->model->id;
  128 + $qrcode = $qrcode_api->qrcode($this->model->id, $path, true);
  129 + if (!empty($qrcode)) {
  130 + Db::name("agent_list")->where("id", $this->model->id)->update(["qrcode" => $qrcode, 'updatetime' => time()]);
  131 + }
  132 + }
  133 + $this->success();
  134 + } else {
  135 + $this->error(__('No rows were inserted'));
  136 + }
  137 + }
  138 + $this->error(__('Parameter %s can not be empty', ''));
  139 + }
  140 + return $this->view->fetch();
  141 + }
  142 +
  143 + /**
  144 + * 编辑
  145 + */
  146 + public function edit($ids = null)
  147 + {
  148 + $row = $this->model->get($ids);
  149 + if (!$row) {
  150 + $this->error(__('No Results were found'));
  151 + }
  152 + $adminIds = $this->getDataLimitAdminIds();
  153 + /*if (is_array($adminIds)) {
  154 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  155 + $this->error(__('You have no permission'));
  156 + }
  157 + }*/
  158 + if (!in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  159 + if (is_array($adminIds)) {
  160 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  161 + $this->error(__('You have no permission'));
  162 + }
  163 + }
  164 + }
  165 + if ($this->request->isPost()) {
  166 + $params = $this->request->post("row/a");
  167 + if ($params) {
  168 + $params = $this->preExcludeFields($params);
  169 + if ($this->isSup == 0) {
  170 + $params['agent_stu'] = 0;
  171 + }
  172 + $result = false;
  173 + Db::startTrans();
  174 + try {
  175 + //是否采用模型验证
  176 + if ($this->modelValidate) {
  177 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  178 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  179 + $row->validateFailException(true)->validate($validate);
  180 + }
  181 + if ($params['agent_stu'] == "1") {
  182 + //审核通过;生成小程序二维码
  183 + $qrcode_api = new WxXcxQrcode();
  184 + $path = '/pages/home/company/detail?id=' . $row->id;
  185 + $params['qrcode'] = $qrcode_api->qrcode($row->id, $path, true);
  186 +
  187 + //用法人手机号创建管理员和角色组
  188 + $rr = add_group_and_admin($params['fr_mobile'], $params['agent_name']);
  189 + if ($rr['back_falg'] == true) {
  190 + //更新admin_id
  191 + $params['admin_id'] = $rr['uid'];
  192 + }
  193 +
  194 + }
  195 + $result = $row->allowField(true)->save($params);
  196 + Db::commit();
  197 + } catch (ValidateException $e) {
  198 + Db::rollback();
  199 + $this->error($e->getMessage());
  200 + } catch (PDOException $e) {
  201 + Db::rollback();
  202 + $this->error($e->getMessage());
  203 + } catch (Exception $e) {
  204 + Db::rollback();
  205 + $this->error($e->getMessage());
  206 + }
  207 + if ($result !== false) {
  208 + //推送公众号消息给入驻人
  209 + if ($params['agent_stu'] == '1' || $params['agent_stu'] == '2') {
  210 + if ($params['agent_stu'] == '1') {
  211 + $desctit = "企业入驻审核通过";
  212 + $remark = '审核通过';
  213 + }
  214 + if ($params['agent_stu'] == '2') {
  215 + $desctit = "企业入驻审核不通过";
  216 + $remark = '不通过原因:' . $params['remark'];
  217 + }
  218 + //获得入驻人openid
  219 + $openid = Db::name('user')
  220 + ->alias('u')
  221 + ->join('wct_user wct', 'u.unionid=wct.unionid')
  222 + ->where(['u.id' => $params['user_id']])
  223 + ->field('wct.id,wct.wx_openid')
  224 + ->find();
  225 + if (!empty($openid['wx_openid'])) {
  226 + //推送公众号模板信息给企业管理人
  227 + $this->senWxmsgToAgentUser($desctit, $openid['wx_openid'], $remark);
  228 + }
  229 + }
  230 +
  231 + $this->success();
  232 + } else {
  233 + $this->error(__('No rows were updated'));
  234 + }
  235 + }
  236 + $this->error(__('Parameter %s can not be empty', ''));
  237 + }
  238 + $this->view->assign("row", $row);
  239 + return $this->view->fetch();
  240 + }
  241 +
  242 + /***
  243 + * 公众号推送审核信息给经纪人
  244 + */
  245 + private function senWxmsgToAgentUser($titdesc, $wxopenid, $remark)
  246 + {
  247 + $sendInfo = array(
  248 + 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  249 + 'keyword1' => array('value' => urlencode(date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  250 + 'keyword2' => array('value' => urlencode('企业入驻'), 'color' => '#173177'),
  251 + 'remark' => array('value' => urlencode($remark), 'color' => '#173177'),
  252 + );
  253 + if ($wxopenid) {
  254 + $config = get_addon_config('wechat');
  255 + $tourl = 'https://fdc.xp.yn.cn/h5/';
  256 + $ywt_appid = 'wx9f73637c6b8f2c47';
  257 + $pagepath = 'pages/home/index';
  258 + $res = sendAstuWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  259 + //file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  260 + }
  261 + }
  262 +
  263 + /**
  264 + * 删除
  265 + */
  266 + public function del($ids = "")
  267 + {
  268 + if (!$this->request->isPost()) {
  269 + $this->error(__("Invalid parameters"));
  270 + }
  271 + $ids = $ids ? $ids : $this->request->post("ids");
  272 + if ($ids) {
  273 + $pk = $this->model->getPk();
  274 + $adminIds = $this->getDataLimitAdminIds();
  275 + if (is_array($adminIds)) {
  276 + $this->model->where($this->dataLimitField, 'in', [1, 2, 26, 32, 37]);
  277 + }
  278 + $list = Db::name('agent_list')->where($pk, 'in', $ids)->select();
  279 +
  280 + $count = 0;
  281 + Db::startTrans();
  282 + try {
  283 + foreach ($list as $k => $v) {
  284 + //获得企业下门店信息
  285 + $shoplist = Db::name('agent_shop')
  286 + ->where(['agent_list_id' => $v['id']])
  287 + ->select();
  288 + $list[$k]['shop_list'] = $shoplist;
  289 + //先生成数据日志
  290 + $logs['admin_id'] = $this->auth->id;
  291 + $logs['type'] = 'del';
  292 + $logs['tablename'] = 'agent_list';
  293 + $logs['content'] = json_encode($list[$k], JSON_UNESCAPED_UNICODE);
  294 + $logs['createtime'] = time();
  295 + Db::name('agent_admin_dologs')->insertGetId($logs);
  296 + //禁用企业后台管理员账号
  297 + if ($v['admin_id'] > 2 && $v['admin_id'] != $this->auth->id) {
  298 + $adminadm['status'] = 'hidden';
  299 + $adminadm['updatetime'] = time();
  300 + Db::name('admin')
  301 + ->where(['id' => $v['admin_id']])
  302 + ->update($adminadm);
  303 + }
  304 + if ($shoplist) {
  305 + //删除企业的门店信息
  306 + Db::name('agent_shop')
  307 + ->where(['agent_list_id' => $v['id']])
  308 + ->delete();
  309 + }
  310 + //删除企业信息
  311 +
  312 + $count = Db::name('agent_list')->where(['id' => $v['id']])->delete();
  313 + }
  314 + Db::commit();
  315 + } catch (PDOException $e) {
  316 + Db::rollback();
  317 + $this->error($e->getMessage());
  318 + } catch (Exception $e) {
  319 + Db::rollback();
  320 + $this->error($e->getMessage());
  321 + }
  322 + if ($count) {
  323 + $this->success();
  324 + } else {
  325 + $this->error(__('No rows were deleted'));
  326 + }
  327 + }
  328 + $this->error(__('Parameter %s can not be empty', 'ids'));
  329 + }
  330 +
  331 +
  332 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +use app\api\controller\v1\WxXcxQrcode;
  8 +
  9 +/**
  10 + * 企业门店管理
  11 + *
  12 + * @icon fa fa-circle-o
  13 + */
  14 +class Agentshop extends Backend
  15 +{
  16 + protected $noNeedRight = ['index'];
  17 + /**
  18 + * Agentshop模型对象
  19 + * @var \app\admin\model\agent\Agentshop
  20 + */
  21 + protected $model = null;
  22 + protected $dataLimit = 'auth';
  23 + protected $dataLimitField = 'admin_id';
  24 +
  25 + public function _initialize()
  26 + {
  27 + parent::_initialize();
  28 + $this->model = new \app\admin\model\agent\Agentshop;
  29 + $this->view->assign("agentStuList", $this->model->getAgentStuList());
  30 + $this->view->assign("payStuList", $this->model->getPayStuList());
  31 + //选择的企业id
  32 + $agentListIds = $this->request->param('ids', 0);
  33 + $ginfo = Db::name('agent_list')
  34 + ->where(['id' => $agentListIds])
  35 + ->find();
  36 + $this->view->assign("ginfo", $ginfo);
  37 + //判断是否是超级管理员
  38 + if (in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  39 + $isSup = 1;
  40 + } else {
  41 + $isSup = 0;
  42 + }
  43 + $this->view->assign("isSup", $isSup);
  44 + }
  45 +
  46 + public function import()
  47 + {
  48 + parent::import();
  49 + }
  50 +
  51 + /**
  52 + * 查看
  53 + */
  54 + public function index()
  55 + {
  56 + //当前是否为关联查询
  57 + $this->relationSearch = true;
  58 + //设置过滤方法
  59 + $this->request->filter(['strip_tags', 'trim']);
  60 + if ($this->request->isAjax()) {
  61 + $ids = $this->request->param('ids');
  62 + //如果发送的来源是Selectpage,则转发到Selectpage
  63 + if ($this->request->request('keyField')) {
  64 + return $this->selectpage();
  65 + }
  66 + list($where, $sort, $order, $offset, $limit) = $this->buildparamsAdm();
  67 +
  68 + $list = $this->model
  69 + ->with(['agentlist'])
  70 + ->where(['agent_list_id' => $ids])
  71 + ->where($where)
  72 + ->order($sort, $order)
  73 + ->paginate($limit);
  74 +
  75 + foreach ($list as $row) {
  76 + $row->visible(['id', 'agent_list_id', 'shop_name', 'head_image', 'createtime', 'updatetime', 'shop_fr_name', 'shop_fr_mobile', 'shop_fzr_name', 'shop_fzr_mobile', 'address', 'latitude', 'longitude', 'add_day', 'card_image', 'cert_images', 'cert_desc', 'agent_content', 'agent_stu', 'credit']);
  77 + $row->visible(['agentlist']);
  78 + $row->getRelation('agentlist')->visible(['agent_name']);
  79 + }
  80 +
  81 + $result = array("total" => $list->total(), "rows" => $list->items());
  82 +
  83 + return json($result);
  84 + }
  85 + return $this->view->fetch();
  86 + }
  87 +
  88 + /**
  89 + * 添加
  90 + */
  91 + public function add()
  92 + {
  93 + if ($this->request->isPost()) {
  94 + $params = $this->request->post("row/a");
  95 + if ($params) {
  96 + $params = $this->preExcludeFields($params);
  97 + $params['admin_id'] = agent_list_admin_id($params['agent_list_id']);
  98 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  99 + $params[$this->dataLimitField] = $this->auth->id;
  100 + }
  101 + $result = false;
  102 +
  103 + Db::startTrans();
  104 + try {
  105 + //是否采用模型验证
  106 + if ($this->modelValidate) {
  107 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  108 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  109 + $this->model->validateFailException(true)->validate($validate);
  110 + }
  111 + $result = $this->model->allowField(true)->save($params);
  112 +
  113 +
  114 + Db::commit();
  115 + } catch (ValidateException $e) {
  116 + Db::rollback();
  117 + $this->error($e->getMessage());
  118 + } catch (PDOException $e) {
  119 + Db::rollback();
  120 + $this->error($e->getMessage());
  121 + } catch (Exception $e) {
  122 + Db::rollback();
  123 + $this->error($e->getMessage());
  124 + }
  125 + if ($result !== false) {
  126 + if ($params['agent_stu'] == "1") {
  127 + //审核通过;生成小程序二维码
  128 + $qrcode_api = new WxXcxQrcode();
  129 + $path = '/pages/home/company/storeDetail?id=' . $this->model->id;
  130 + $qrcode = $qrcode_api->qrcode($this->model->id, $path, true);
  131 + if (!empty($qrcode)) {
  132 + Db::name("agent_shop")->where("id", $this->model->id)->update(["qrcode" => $qrcode, 'updatetime' => time()]);
  133 + }
  134 + }
  135 + $this->success();
  136 + } else {
  137 + $this->error(__('No rows were inserted'));
  138 + }
  139 + }
  140 + $this->error(__('Parameter %s can not be empty', ''));
  141 + }
  142 + return $this->view->fetch();
  143 + }
  144 +
  145 + /**
  146 + * 编辑
  147 + */
  148 + public function edit($ids = null)
  149 + {
  150 + $row = $this->model->get($ids);
  151 + if (!$row) {
  152 + $this->error(__('No Results were found'));
  153 + }
  154 + $adminIds = $this->getDataLimitAdminIds();
  155 + /*if (is_array($adminIds)) {
  156 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  157 + $this->error(__('You have no permission'));
  158 + }
  159 + }*/
  160 + if (!in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  161 + if (is_array($adminIds)) {
  162 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  163 + $this->error(__('You have no permission'));
  164 + }
  165 + }
  166 + }
  167 + if ($this->request->isPost()) {
  168 + $params = $this->request->post("row/a");
  169 + if ($params) {
  170 + $params = $this->preExcludeFields($params);
  171 + $params['admin_id'] = agent_list_admin_id($params['agent_list_id']);
  172 + $result = false;
  173 + Db::startTrans();
  174 + try {
  175 + //是否采用模型验证
  176 + if ($this->modelValidate) {
  177 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  178 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  179 + $row->validateFailException(true)->validate($validate);
  180 + }
  181 + if ($params['agent_stu'] == "1") {
  182 + //审核通过;生成小程序二维码
  183 + $qrcode_api = new WxXcxQrcode();
  184 + $path = '/pages/home/company/storeDetail?id=' . $row->id;
  185 + $params['qrcode'] = $qrcode_api->qrcode($row->id, $path, true);
  186 + }
  187 + $result = $row->allowField(true)->save($params);
  188 + Db::commit();
  189 + } catch (ValidateException $e) {
  190 + Db::rollback();
  191 + $this->error($e->getMessage());
  192 + } catch (PDOException $e) {
  193 + Db::rollback();
  194 + $this->error($e->getMessage());
  195 + } catch (Exception $e) {
  196 + Db::rollback();
  197 + $this->error($e->getMessage());
  198 + }
  199 + if ($result !== false) {
  200 + $this->success();
  201 + } else {
  202 + $this->error(__('No rows were updated'));
  203 + }
  204 + }
  205 + $this->error(__('Parameter %s can not be empty', ''));
  206 + }
  207 + $this->view->assign("row", $row);
  208 + return $this->view->fetch();
  209 + }
  210 +
  211 + /**
  212 + * 删除
  213 + */
  214 + public function del($ids = "")
  215 + {
  216 + if (!$this->request->isPost()) {
  217 + $this->error(__("Invalid parameters"));
  218 + }
  219 + $ids = $ids ? $ids : $this->request->post("ids");
  220 + if ($ids) {
  221 + $pk = $this->model->getPk();
  222 + $adminIds = $this->getDataLimitAdminIds();
  223 + if (is_array($adminIds)) {
  224 + $this->model->where($this->dataLimitField, 'in', [1, 2, 26, 32, 37]);
  225 + }
  226 + $list = $this->model->where($pk, 'in', $ids)->select();
  227 +
  228 + $count = 0;
  229 + Db::startTrans();
  230 + try {
  231 + foreach ($list as $k => $v) {
  232 + $count += $v->delete();
  233 + }
  234 + Db::commit();
  235 + } catch (PDOException $e) {
  236 + Db::rollback();
  237 + $this->error($e->getMessage());
  238 + } catch (Exception $e) {
  239 + Db::rollback();
  240 + $this->error($e->getMessage());
  241 + }
  242 + if ($count) {
  243 + $this->success();
  244 + } else {
  245 + $this->error(__('No rows were deleted'));
  246 + }
  247 + }
  248 + $this->error(__('Parameter %s can not be empty', 'ids'));
  249 + }
  250 +
  251 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +use app\api\controller\v1\WxXcxQrcode;
  8 +use PhpOffice\PhpSpreadsheet\Helper\Sample;
  9 +use PhpOffice\PhpSpreadsheet\IOFactory;
  10 +use PhpOffice\PhpSpreadsheet\Spreadsheet;
  11 +use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  12 +use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  13 +use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  14 +use PhpOffice\PhpSpreadsheet\Cell\DataType;
  15 +use PhpOffice\PhpSpreadsheet\Style\Fill;
  16 +use PhpOffice\PhpSpreadsheet\Style\Color;
  17 +use PhpOffice\PhpSpreadsheet\Style\Alignment;
  18 +use PhpOffice\PhpSpreadsheet\Style\Border;
  19 +use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  20 +
  21 +/**
  22 + * 经纪人管理
  23 + *
  24 + * @icon fa fa-circle-o
  25 + */
  26 +class Agentusers extends Backend
  27 +{
  28 +
  29 + /**
  30 + * Agentusers模型对象
  31 + * @var \app\admin\model\agent\Agentusers
  32 + */
  33 + protected $model = null;
  34 + protected $dataLimit = 'auth';
  35 + protected $dataLimitField = 'admin_id';
  36 + protected $relationSearch = true;
  37 + protected $searchFields = 'id,jjr_name,agentlist,jjr_mobile';
  38 + protected $selectpageFields = "id,jjr_name,agentlist,jjr_mobile";
  39 + protected $issupAdm;
  40 +
  41 + public function _initialize()
  42 + {
  43 + parent::_initialize();
  44 + $this->model = new \app\admin\model\agent\Agentusers;
  45 + $this->view->assign("jjrTypeList", $this->model->getJjrTypeList());
  46 + $this->view->assign("jjrAgentStuList", $this->model->getJjrAgentStuList());
  47 + $this->view->assign("jjrPayStuList", $this->model->getJjrPayStuList());
  48 + $this->view->assign("getIndustry", $this->model->getIndustry());
  49 + //判断是否是超级管理员
  50 + if (in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  51 + $isSup = 1;
  52 + } else {
  53 + $isSup = 0;
  54 + }
  55 + $this->issupAdm = $isSup;
  56 + $this->view->assign("isSup", $isSup);
  57 + }
  58 +
  59 +
  60 + /**
  61 + * 查看
  62 + */
  63 + public function index()
  64 + {
  65 + //当前是否为关联查询
  66 + $this->relationSearch = true;
  67 + //设置过滤方法
  68 + $this->request->filter(['strip_tags', 'trim']);
  69 + if ($this->request->isAjax()) {
  70 + //如果发送的来源是Selectpage,则转发到Selectpage
  71 + if ($this->request->request('keyField')) {
  72 + return $this->selectpage();
  73 + }
  74 + list($where, $sort, $order, $offset, $limit) = $this->buildparamsAdm();
  75 +
  76 + if ($this->issupAdm == 1) {
  77 + $list = $this->model
  78 + ->with(['agentusercat', 'agentusereducat', 'agentlist', 'user', 'agentshoplist'])
  79 + ->where($where)
  80 + ->order($sort, $order)
  81 + ->paginate($limit);
  82 + } else {
  83 + $list = $this->model
  84 + ->with(['agentusercat', 'agentusereducat', 'agentlist', 'user', 'agentshoplist'])
  85 + ->where($where)
  86 + ->order($sort, $order)
  87 + ->paginate($limit);
  88 + }
  89 +
  90 + foreach ($list as $row) {
  91 + $row->visible(['id', 'user_id', 'jjr_sex', 'agent_shop_id', 'agent_list_id', 'jjr_type', 'user_cat_id', 'user_educat_id', 'jjr_name', 'jjr_image', 'createtime', 'updatetime', 'jjr_mobile', 'home_address', 'now_address', 'idcard', 'idcard_images', 'jjr_content', 'jjr_agent_stu', 'jjr_start_pay_time', 'jjr_end_pay_time', 'jjr_pay_stu', 'credit', 'addstep', 'jjr_type_uptime', 'is_stu_ok', 'is_test_ok', 'userno','industry']);
  92 + $row->visible(['agentusercat']);
  93 + $row->getRelation('agentusercat')->visible(['catname']);
  94 + $row->visible(['agentusereducat']);
  95 + $row->getRelation('agentusereducat')->visible(['educat_name']);
  96 + $row->visible(['agentlist']);
  97 + $row->getRelation('agentlist')->visible(['agent_name']);
  98 + $row->visible(['agentshoplist']);
  99 + $row->getRelation('agentshoplist')->visible(['shop_name']);
  100 + $row->visible(['user']);
  101 + $row->getRelation('user')->visible(['username', 'nickname']);
  102 + }
  103 + $rows = $list->items();
  104 + $getIndustry = $this->model->getIndustry();
  105 + foreach ($rows as $kk => $vv) {
  106 + //身份证处理
  107 + $rows[$kk]['idcard'] = tyssl_decode($vv['idcard']);
  108 + //判断入驻进度
  109 + if ($vv['jjr_pay_stu'] == '0' && $vv['is_stu_ok'] == '0' && $vv['is_test_ok'] == '0') {
  110 + $rows[$kk]['addstep'] = '未支付年费';
  111 + }
  112 + if ($vv['jjr_pay_stu'] == '1' && $vv['is_stu_ok'] == '0' && $vv['is_test_ok'] == '0') {
  113 + $rows[$kk]['addstep'] = '已支付年费';
  114 + }
  115 + /*
  116 + if ($vv['jjr_pay_stu'] == '1' && $vv['is_stu_ok'] == '1' && $vv['is_test_ok'] == '0') {
  117 + $rows[$kk]['addstep'] = '培训完成,考试中';
  118 + }
  119 + if ($vv['jjr_pay_stu'] == '1' && $vv['is_stu_ok'] == '1' && $vv['is_test_ok'] == '1' && $vv['jjr_type_uptime'] == 0) {
  120 + $rows[$kk]['addstep'] = '考试完成,未选择身份';
  121 + }
  122 + if ($vv['jjr_pay_stu'] == '1' && $vv['is_stu_ok'] == '1' && $vv['is_test_ok'] == '1' && $vv['jjr_type_uptime'] > 0) {
  123 + $rows[$kk]['addstep'] = '已完成';
  124 + }
  125 + */
  126 + //判断入驻考试是否完成
  127 + $testok = getUserGradOk($vv['user_id']);
  128 + if ($testok == 1) {
  129 + $rows[$kk]['userno'] = '未经考试合格暂无工号';
  130 + }
  131 + //从事行业处理
  132 + $rows[$kk]['industry'] = !empty($vv['industry'])?$getIndustry[$vv['industry']]:'';
  133 +
  134 + }
  135 +
  136 + $result = array("total" => $list->total(), "rows" => $rows);
  137 +
  138 + return json($result);
  139 + }
  140 + return $this->view->fetch();
  141 + }
  142 +
  143 +
  144 + /**
  145 + * 添加
  146 + */
  147 + public function add()
  148 + {
  149 + if ($this->request->isPost()) {
  150 + $params = $this->request->post("row/a");
  151 + if ($params) {
  152 + $params = $this->preExcludeFields($params);
  153 + $params['idcard'] = tyssl_encode($params['idcard']);
  154 + //经纪人身份
  155 + $params['jjr_type_uptime'] = time();
  156 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  157 + $params[$this->dataLimitField] = $this->auth->id;
  158 + }
  159 +
  160 + $result = false;
  161 + Db::startTrans();
  162 + try {
  163 + //是否采用模型验证
  164 + if ($this->modelValidate) {
  165 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  166 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  167 + $this->model->validateFailException(true)->validate($validate);
  168 + }
  169 + $result = $this->model->allowField(true)->save($params);
  170 + Db::commit();
  171 + } catch (ValidateException $e) {
  172 + Db::rollback();
  173 + $this->error($e->getMessage());
  174 + } catch (PDOException $e) {
  175 + Db::rollback();
  176 + $this->error($e->getMessage());
  177 + } catch (Exception $e) {
  178 + Db::rollback();
  179 + $this->error($e->getMessage());
  180 + }
  181 + if ($result !== false) {
  182 + //如果选择了企业,添加经纪人归属
  183 + $userup['admin_id'] = 2;
  184 + if ($params['jjr_type'] == '1') {
  185 + $userup['admin_id'] = agent_list_admin_id($params['agent_list_id']);
  186 + }
  187 +
  188 + if ($params['jjr_agent_stu'] == "1") {
  189 + //审核通过;生成小程序二维码
  190 + $qrcode_api = new WxXcxQrcode();
  191 + $path = '/pages/home/broker/broker?id=' . $this->model->id;
  192 + $qrcode = $qrcode_api->qrcode($this->model->id, $path, true);
  193 + if (!empty($qrcode)) {
  194 + $userup['qrcode'] = $qrcode;
  195 + }
  196 + }
  197 + $userup['updatetime'] = time();
  198 + Db::name("agent_users")
  199 + ->where("id", $this->model->id)
  200 + ->update($userup);
  201 + $this->success();
  202 + } else {
  203 + $this->error(__('No rows were inserted'));
  204 + }
  205 + }
  206 + $this->error(__('Parameter %s can not be empty', ''));
  207 + }
  208 + return $this->view->fetch();
  209 + }
  210 +
  211 + /**
  212 + * 编辑
  213 + */
  214 + public function edit($ids = null)
  215 + {
  216 + $row = $this->model->get($ids);
  217 + //处理身份证
  218 + $row['idcard'] = tyssl_decode($row['idcard']);
  219 + if (!$row) {
  220 + $this->error(__('No Results were found'));
  221 + }
  222 + $adminIds = $this->getDataLimitAdminIds();
  223 +
  224 + /*
  225 + if (is_array($adminIds)) {
  226 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  227 + $this->error(__('You have no permission'));
  228 + }
  229 + }*/
  230 + if (!in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  231 + if (is_array($adminIds)) {
  232 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  233 + $this->error(__('You have no permission'));
  234 + }
  235 + }
  236 + }
  237 + if ($this->request->isPost()) {
  238 + $params = $this->request->post("row/a");
  239 + if ($params) {
  240 + $params = $this->preExcludeFields($params);
  241 + $params['idcard'] = tyssl_encode($params['idcard']);
  242 + //处理选择为自由经纪人,清空选择的企业
  243 + if ($params['jjr_type'] == '0') {
  244 + $params['agent_list_id'] = 0;
  245 + $params['agent_shop_id'] = 0;
  246 + }
  247 + //如果选择了企业,添加经纪人归属
  248 + if ($params['jjr_type'] == '1') {
  249 + $params['admin_id'] = agent_list_admin_id($params['agent_list_id']);
  250 + }
  251 + //流程改动:上传职业证书的用户审核通过就不需要进行考试等等流程;直接成为经纪人 20230804 陈程
  252 + if($params['jjr_agent_stu'] == '1' && !empty($params['vocational_certificate'])){
  253 + $time = time();
  254 + $params['is_test_time'] = $time; // 完成考试时间
  255 + $params['is_test_ok'] = '1'; //完成入驻考试,0否,1是
  256 + $params['is_stu_ok'] = '1';//完成培训考试,0否,1是
  257 + $parms['is_stu_time']= $time;//完成培训时间
  258 + $params['jjr_type_uptime'] = $time; // 经济人信息更新 表示绑定为经济人了
  259 + }
  260 + $result = false;
  261 + Db::startTrans();
  262 + try {
  263 + //是否采用模型验证
  264 + if ($this->modelValidate) {
  265 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  266 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  267 + $row->validateFailException(true)->validate($validate);
  268 + }
  269 + if ($params['jjr_agent_stu'] == "1") {
  270 + //审核通过;生成小程序二维码
  271 + $qrcode_api = new WxXcxQrcode();
  272 + $path = '/pages/home/broker/broker?id=' . $row->id;
  273 + $params['qrcode'] = $qrcode_api->qrcode($row->id, $path, true);
  274 + }
  275 + $result = $row->allowField(true)->save($params);
  276 + Db::commit();
  277 + } catch (ValidateException $e) {
  278 + Db::rollback();
  279 + $this->error($e->getMessage());
  280 + } catch (PDOException $e) {
  281 + Db::rollback();
  282 + $this->error($e->getMessage());
  283 + } catch (Exception $e) {
  284 + Db::rollback();
  285 + $this->error($e->getMessage());
  286 + }
  287 + if ($result !== false) {
  288 + //公众号消息推送
  289 + if ($params['jjr_agent_stu'] == '1' || $params['jjr_agent_stu'] == '2') {
  290 + if ($params['jjr_agent_stu'] == '1') {
  291 + $desctit = "经纪人入驻已审核通过";
  292 + $remark = '审核通过';
  293 + }
  294 + if ($params['jjr_agent_stu'] == '2') {
  295 + $desctit = "经纪人入驻审核不通过";
  296 + $remark = '不通过原因:' . $params['remark'];
  297 + }
  298 + //推送公众号模板信息给经纪人
  299 + $this->senWxmsgToAgentUser($desctit, $row->id, $remark);
  300 + }
  301 + $this->success();
  302 + } else {
  303 + $this->error(__('No rows were updated'));
  304 + }
  305 + }
  306 + $this->error(__('Parameter %s can not be empty', ''));
  307 + }
  308 + $this->view->assign("row", $row);
  309 + return $this->view->fetch();
  310 + }
  311 +
  312 + /***
  313 + * 公众号推送审核信息给经纪人
  314 + */
  315 + private function senWxmsgToAgentUser($titdesc, $agent_users_id, $remark)
  316 + {
  317 + $sendInfo = array(
  318 + 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  319 + 'keyword1' => array('value' => urlencode(date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  320 + 'keyword2' => array('value' => urlencode('经纪人入驻'), 'color' => '#173177'),
  321 + 'remark' => array('value' => urlencode($remark), 'color' => '#173177'),
  322 + );
  323 + $wxopenid = getAgetWxOpenid($agent_users_id);
  324 + if ($wxopenid) {
  325 + $config = get_addon_config('wechat');
  326 + $tourl = 'https://fdc.xp.yn.cn/h5/';
  327 + $ywt_appid = 'wx9f73637c6b8f2c47';
  328 + $pagepath = 'pages/home/index';
  329 + $res = sendAstuWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  330 + //file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  331 + }
  332 + }
  333 +
  334 + /***
  335 + * 导出测试
  336 + */
  337 + public function pclexport()
  338 + {
  339 + //当前是否为关联查询
  340 + $this->relationSearch = true;
  341 + //设置过滤方法
  342 + $this->request->filter(['strip_tags', 'trim']);
  343 + if ($this->request->isPost()) {
  344 + set_time_limit(0);
  345 + ini_set('memory_limit', '2048M');
  346 + $search = $this->request->post('search');
  347 + $ids = $this->request->post('ids');
  348 + //搜索条件
  349 + $filter = $this->request->post('filter');
  350 + $op = $this->request->post('op');
  351 + //导出的字段
  352 + $columns = $this->request->post('columns');
  353 +
  354 +
  355 + //查询条件
  356 + $whereIds = $ids == 'all' ? '1=1' : ['agentusers.id' => ['in', explode(',', $ids)]];
  357 + $this->request->get(['search' => $search, 'ids' => $ids, 'filter' => $filter, 'op' => $op]);
  358 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  359 + //获得数据列表:全部字段的内容
  360 + $list = $this->model
  361 + ->with(['agentusercat', 'agentusereducat', 'agentlist', 'user', 'agentshoplist'])
  362 + ->where($where)
  363 + ->where($whereIds)
  364 + ->order($sort, $order)
  365 + ->select();
  366 +
  367 + foreach ($list as $row) {
  368 + $row->visible(['id', 'user_id', 'jjr_sex', 'agent_shop_id', 'agent_list_id', 'jjr_type', 'user_cat_id', 'user_educat_id', 'jjr_name', 'jjr_image', 'createtime', 'updatetime', 'jjr_mobile', 'home_address', 'now_address', 'idcard', 'idcard_images', 'jjr_content', 'jjr_agent_stu', 'jjr_start_pay_time', 'jjr_end_pay_time', 'jjr_pay_stu', 'credit', 'addstep', 'jjr_type_uptime', 'is_stu_ok', 'is_test_ok', 'userno']);
  369 + $row->visible(['agentusercat']);
  370 + $row->getRelation('agentusercat')->visible(['catname']);
  371 + $row->visible(['agentusereducat']);
  372 + $row->getRelation('agentusereducat')->visible(['educat_name']);
  373 + $row->visible(['agentlist']);
  374 + $row->getRelation('agentlist')->visible(['agent_name']);
  375 + $row->visible(['agentshoplist']);
  376 + $row->getRelation('agentshoplist')->visible(['shop_name']);
  377 + $row->visible(['user']);
  378 + $row->getRelation('user')->visible(['username', 'nickname']);
  379 + }
  380 + //对象处理成数组
  381 + $list = json_encode($list);
  382 + $list = json_decode($list, true);
  383 +
  384 + // var_dump($list);
  385 +
  386 + }
  387 + }
  388 +
  389 + /**
  390 + * 删除
  391 + */
  392 + public function del($ids = "")
  393 + {
  394 + if (!$this->request->isPost()) {
  395 + $this->error(__("Invalid parameters"));
  396 + }
  397 + $ids = $ids ? $ids : $this->request->post("ids");
  398 + if ($ids) {
  399 + $pk = $this->model->getPk();
  400 +
  401 + $adminIds = $this->getDataLimitAdminIds();
  402 +
  403 + /*if (!is_array($adminIds)) {
  404 + $this->model->where($this->dataLimitField, 'in', [1, 2, 26, 32, 37]);
  405 + }*/
  406 + if (!in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  407 + $this->error(__("Invalid parameters"));
  408 + }
  409 + $list = $this->model->where($pk, 'in', $ids)->select();
  410 +
  411 +
  412 + $count = 0;
  413 + Db::startTrans();
  414 + try {
  415 + foreach ($list as $k => $v) {
  416 + $count += $v->delete();
  417 + }
  418 + Db::commit();
  419 + } catch (PDOException $e) {
  420 + Db::rollback();
  421 + $this->error($e->getMessage());
  422 + } catch (Exception $e) {
  423 + Db::rollback();
  424 + $this->error($e->getMessage());
  425 + }
  426 + if ($count) {
  427 + $this->success();
  428 + } else {
  429 + $this->error(__('No rows were deleted'));
  430 + }
  431 + }
  432 + $this->error(__('Parameter %s can not be empty', 'ids'));
  433 + }
  434 +
  435 +
  436 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 经纪人-从事行业
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Agentusersindustry extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Agentusersindustry模型对象
  17 + * @var \app\admin\model\agent\Agentusersindustry
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\agent\Agentusersindustry;
  25 + $this->view->assign("statusList", $this->model->getStatusList());
  26 + }
  27 +
  28 + public function import()
  29 + {
  30 + parent::import();
  31 + }
  32 +
  33 + /**
  34 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  35 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  36 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  37 + */
  38 +
  39 +
  40 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 用户预约分类管理
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Appointmentcat extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Appointmentcat模型对象
  17 + * @var \app\admin\model\agent\Appointmentcat
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\agent\Appointmentcat;
  25 + $this->view->assign("statusList", $this->model->getStatusList());
  26 + }
  27 +
  28 + public function import()
  29 + {
  30 + parent::import();
  31 + }
  32 +
  33 + /**
  34 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  35 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  36 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  37 + */
  38 +
  39 +
  40 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 用户预约记录
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Appointmentlist extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Appointmentlist模型对象
  18 + * @var \app\admin\model\agent\Appointmentlist
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Appointmentlist;
  26 + $this->view->assign("statusList", $this->model->getStatusList());
  27 + }
  28 +
  29 + /**
  30 + * 查看
  31 + */
  32 + public function index()
  33 + {
  34 + //当前是否为关联查询
  35 + $this->relationSearch = true;
  36 + //设置过滤方法
  37 + $this->request->filter(['strip_tags', 'trim']);
  38 + if ($this->request->isAjax()) {
  39 + //如果发送的来源是Selectpage,则转发到Selectpage
  40 + if ($this->request->request('keyField')) {
  41 + return $this->selectpage();
  42 + }
  43 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  44 +
  45 + $list = $this->model
  46 + ->with(['agentuserappointmentcat', 'user'])
  47 + ->where($where)
  48 + ->order($sort, $order)
  49 + ->paginate($limit);
  50 +
  51 + foreach ($list as $row) {
  52 +
  53 + $row->getRelation('agentuserappointmentcat')->visible(['catname']);
  54 + $row->getRelation('user')->visible(['id', 'username', 'nickname', 'mobile', 'unionid']);
  55 + }
  56 +
  57 + $result = array("total" => $list->total(), "rows" => $list->items());
  58 +
  59 + return json($result);
  60 + }
  61 + return $this->view->fetch();
  62 + }
  63 +
  64 + /**
  65 + * 编辑
  66 + */
  67 + public function edit($ids = null)
  68 + {
  69 + $row = $this->model->get($ids);
  70 + if (!$row) {
  71 + $this->error(__('No Results were found'));
  72 + }
  73 + $adminIds = $this->getDataLimitAdminIds();
  74 + /*if (is_array($adminIds)) {
  75 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  76 + $this->error(__('You have no permission'));
  77 + }
  78 + }*/
  79 + if (!in_array($this->auth->id, [1, 2, 26, 32, 37])) {
  80 + if (is_array($adminIds)) {
  81 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  82 + $this->error(__('You have no permission'));
  83 + }
  84 + }
  85 + }
  86 + if ($this->request->isPost()) {
  87 + $params = $this->request->post("row/a");
  88 + if ($params) {
  89 + $params = $this->preExcludeFields($params);
  90 + $params['asktimes'] = strtotime($params['asktime']);
  91 +
  92 + $result = false;
  93 + Db::startTrans();
  94 + try {
  95 + //是否采用模型验证
  96 + if ($this->modelValidate) {
  97 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  98 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  99 + $row->validateFailException(true)->validate($validate);
  100 + }
  101 +
  102 + $result = $row->allowField(true)->save($params);
  103 + Db::commit();
  104 + } catch (ValidateException $e) {
  105 + Db::rollback();
  106 + $this->error($e->getMessage());
  107 + } catch (PDOException $e) {
  108 + Db::rollback();
  109 + $this->error($e->getMessage());
  110 + } catch (Exception $e) {
  111 + Db::rollback();
  112 + $this->error($e->getMessage());
  113 + }
  114 + if ($result !== false) {
  115 + $this->success();
  116 + } else {
  117 + $this->error(__('No rows were updated'));
  118 + }
  119 + }
  120 + $this->error(__('Parameter %s can not be empty', ''));
  121 + }
  122 + $this->view->assign("row", $row);
  123 + return $this->view->fetch();
  124 + }
  125 +
  126 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 用户投诉分类管理
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Complaincat extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Complaincat模型对象
  18 + * @var \app\admin\model\agent\Complaincat
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Complaincat;
  26 + $this->view->assign("statusList", $this->model->getStatusList());
  27 + }
  28 +
  29 + public function import()
  30 + {
  31 + parent::import();
  32 + }
  33 +
  34 +
  35 + /**
  36 + * 查看
  37 + */
  38 + public function index()
  39 + {
  40 + //当前是否为关联查询
  41 + $this->relationSearch = false;
  42 + //设置过滤方法
  43 + $this->request->filter(['strip_tags', 'trim']);
  44 + if ($this->request->isAjax()) {
  45 + //如果发送的来源是Selectpage,则转发到Selectpage
  46 + if ($this->request->request('keyField')) {
  47 + return $this->selectpage();
  48 + }
  49 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  50 +
  51 + $list = $this->model
  52 + ->where($where)
  53 + ->order($sort, $order)
  54 + ->paginate($limit);
  55 +
  56 + foreach ($list as $row) {
  57 + $row->visible(['id', 'catname', 'createtime', 'weigh', 'status']);
  58 +
  59 + }
  60 +
  61 + $result = array("total" => $list->total(), "rows" => $list->items());
  62 +
  63 + return json($result);
  64 + }
  65 + return $this->view->fetch();
  66 + }
  67 +
  68 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 用户投诉记录
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Complainlist extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Complainlist模型对象
  18 + * @var \app\admin\model\agent\Complainlist
  19 + */
  20 + protected $model = null;
  21 + protected $dataLimit = 'auth';
  22 + protected $dataLimitField = 'admin_id';
  23 +
  24 + public function _initialize()
  25 + {
  26 + parent::_initialize();
  27 + $this->model = new \app\admin\model\agent\Complainlist;
  28 + $this->view->assign("typeList", $this->model->getTypeList());
  29 + $this->view->assign("statusList", $this->model->getStatusList());
  30 + //判断是否是超级管理员
  31 + if (in_array($this->auth->id, [1, 2])) {
  32 + $isSup = 1;
  33 + } else {
  34 + $isSup = 0;
  35 + }
  36 + $this->view->assign("isSup", $isSup);
  37 + }
  38 +
  39 + public function import()
  40 + {
  41 + parent::import();
  42 + }
  43 +
  44 +
  45 + /**
  46 + * 查看
  47 + */
  48 + public function index()
  49 + {
  50 + //当前是否为关联查询
  51 + $this->relationSearch = true;
  52 + //设置过滤方法
  53 + $this->request->filter(['strip_tags', 'trim']);
  54 + if ($this->request->isAjax()) {
  55 + //如果发送的来源是Selectpage,则转发到Selectpage
  56 + if ($this->request->request('keyField')) {
  57 + return $this->selectpage();
  58 + }
  59 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  60 +
  61 + $list = $this->model
  62 + ->with(['agentlist', 'agentshop', 'agentusers', 'complaincat', 'user'])
  63 + ->where($where)
  64 + ->order($sort, $order)
  65 + ->paginate($limit);
  66 +
  67 + foreach ($list as $row) {
  68 + $row->visible(['id', 'user_id', 'agent_list_id', 'agent_shop_id', 'agent_user_id', 'type', 'askcat', 'asktit', 'createtime', 'status']);
  69 + $row->visible(['agentlist']);
  70 + $row->getRelation('agentlist')->visible(['agent_name']);
  71 + $row->visible(['agentshop']);
  72 + $row->getRelation('agentshop')->visible(['shop_name']);
  73 + $row->visible(['agentusers']);
  74 + $row->getRelation('agentusers')->visible(['jjr_name']);
  75 + $row->visible(['complaincat']);
  76 + $row->getRelation('complaincat')->visible(['catname']);
  77 + $row->visible(['user']);
  78 + $row->getRelation('user')->visible(['nickname']);
  79 + }
  80 +
  81 + $result = array("total" => $list->total(), "rows" => $list->items());
  82 +
  83 + return json($result);
  84 + }
  85 + return $this->view->fetch();
  86 + }
  87 +
  88 + /**
  89 + * 编辑
  90 + */
  91 + public function edit($ids = null)
  92 + {
  93 + $row = $this->model->get($ids);
  94 + if (!$row) {
  95 + $this->error(__('No Results were found'));
  96 + }
  97 + $adminIds = $this->getDataLimitAdminIds();
  98 + if (is_array($adminIds)) {
  99 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  100 + $this->error(__('You have no permission'));
  101 + }
  102 + }
  103 + if ($this->request->isPost()) {
  104 + $params = $this->request->post("row/a");
  105 + if ($params) {
  106 + $params = $this->preExcludeFields($params);
  107 + $result = false;
  108 + Db::startTrans();
  109 + try {
  110 + //是否采用模型验证
  111 + if ($this->modelValidate) {
  112 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  113 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  114 + $row->validateFailException(true)->validate($validate);
  115 + }
  116 +
  117 + $result = $row->allowField(true)->save($params);
  118 + Db::commit();
  119 + } catch (ValidateException $e) {
  120 + Db::rollback();
  121 + $this->error($e->getMessage());
  122 + } catch (PDOException $e) {
  123 + Db::rollback();
  124 + $this->error($e->getMessage());
  125 + } catch (Exception $e) {
  126 + Db::rollback();
  127 + $this->error($e->getMessage());
  128 + }
  129 + if ($result !== false) {
  130 + //审核通过,生成统计表
  131 + if ($params['status'] == '1') {
  132 + //判断分类
  133 + if ($params['type'] == '1') {
  134 + $wh['agent_list_id'] = ['=', $params['agent_list_id']];
  135 + $ctall['agent_list_id'] = $params['agent_list_id'];
  136 + }
  137 + if ($params['type'] == '2') {
  138 + $wh['agent_shop_id'] = ['=', $params['agent_shop_id']];
  139 + $ctall['agent_shop_id'] = $params['agent_shop_id'];
  140 + }
  141 + if ($params['type'] == '3') {
  142 + $wh['agent_user_id'] = ['=', $params['agent_user_id']];
  143 + $ctall['agent_user_id'] = $params['agent_user_id'];
  144 + }
  145 + $cks = Db::name('agent_user_complain_ctall')
  146 + ->where($wh)
  147 + ->find();
  148 + $cmpAll = Db::name('agent_user_complain_list')
  149 + ->where($wh)
  150 + ->where(['status' => '1'])
  151 + ->count();
  152 + if (empty($cks)) {
  153 + //生成统计信息
  154 + $ctall['type'] = $params['type'];
  155 + $ctall['compall'] = $cmpAll ? $cmpAll : 1;
  156 + $ctall['createtime'] = time();
  157 + $ctall['admin_id'] = $this->auth->id;
  158 + Db::name('agent_user_complain_ctall')->insertGetId($ctall);
  159 + } else {
  160 + //更新统计信息
  161 + $upall['compall'] = $cmpAll;
  162 + $upall['updatetime'] = time();
  163 + Db::name('agent_user_complain_ctall')
  164 + ->where($wh)
  165 + ->update($upall);
  166 + }
  167 + }
  168 + $this->success();
  169 + } else {
  170 + $this->error(__('No rows were updated'));
  171 + }
  172 + }
  173 + $this->error(__('Parameter %s can not be empty', ''));
  174 + }
  175 + $this->view->assign("row", $row);
  176 + return $this->view->fetch();
  177 + }
  178 +
  179 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use app\admin\library\Auth;
  7 +use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  8 +use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
  9 +use PhpOffice\PhpSpreadsheet\Reader\Xls;
  10 +use PhpOffice\PhpSpreadsheet\Reader\Csv;
  11 +use think\Db;
  12 +use think\Exception;
  13 +use think\exception\PDOException;
  14 +use think\exception\ValidateException;
  15 +use app\common\helper\HttpHelper;
  16 +use app\api\controller\v4\notary\Index;
  17 +
  18 +/**
  19 + *
  20 + *
  21 + * @icon fa fa-circle-o
  22 + */
  23 +class Order extends Backend
  24 +{
  25 +
  26 + /**
  27 + * Order模型对象
  28 + * @var \app\admin\model\agent\Order
  29 + */
  30 + protected $model = null;
  31 + protected $dataLimit = 'auth';
  32 + protected $dataLimitField = 'admin_id';
  33 +
  34 + public function _initialize()
  35 + {
  36 + parent::_initialize();
  37 + $this->model = new \app\admin\model\agent\Order;
  38 + $this->view->assign("statusList", $this->model->getStatusList());
  39 + $this->view->assign("userNeedTypeList", $this->model->getUserNeedTypeList());
  40 + $this->view->assign("recoveryStateList", $this->model->getRecoveryStateList());
  41 +
  42 + }
  43 +
  44 + /**
  45 + * 查看
  46 + */
  47 + public function index()
  48 + {
  49 + //设置过滤方法
  50 + $this->request->filter(['strip_tags', 'trim']);
  51 + if ($this->request->isAjax()) {
  52 + //如果发送的来源是Selectpage,则转发到Selectpage
  53 + if ($this->request->request('keyField')) {
  54 + return $this->selectpage();
  55 + }
  56 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  57 +
  58 + $list = $this->model
  59 + ->with(['type'])
  60 + ->where($where)
  61 + ->order($sort, $order)
  62 + ->paginate($limit);
  63 +
  64 + $rows = $list->items();
  65 + foreach ($rows as $kk => $vv) {
  66 + //关联经纪人
  67 + if ($vv['agent_users_id'] > 0) {
  68 + $agent = Db::name('agent_users')
  69 + ->where(['id' => $vv['agent_users_id']])
  70 + ->field('id,jjr_name,jjr_mobile')
  71 + ->find();
  72 + $rows[$kk]['jjr_name'] = $agent['jjr_name'] . '[' . $agent['jjr_mobile'] . ']';
  73 + } else {
  74 + $rows[$kk]['jjr_name'] = '-';
  75 + }
  76 + if ($vv['ia_pay'] == '1') {
  77 + $rows[$kk]['pay_times'] = setdateTimes($vv['pay_time']);
  78 + } else {
  79 + $rows[$kk]['pay_times'] = '-';
  80 + }
  81 + //关联贷款分类
  82 + if ($vv['loan_cat_id'] > 0) {
  83 + $loncat = Db::name('loan_cat')
  84 + ->where(['id' => $vv['loan_cat_id']])
  85 + ->find();
  86 + $rows[$kk]['loan_cat'] = $loncat['catname'];
  87 + } else {
  88 + $rows[$kk]['loan_cat'] = '-';
  89 + }
  90 + //关联住房性质
  91 + if ($vv['house_cat_id'] > 0) {
  92 + $housecat = Db::name('house_cat')
  93 + ->where(['id' => $vv['house_cat_id']])
  94 + ->find();
  95 + $rows[$kk]['house_cat'] = $housecat['catname'];
  96 + } else {
  97 + $rows[$kk]['house_cat'] = '-';
  98 + }
  99 + //关联当前推送到公证处状态
  100 + $step = Db::name('agent_order_send_logs')
  101 + ->where(['agent_order_id' => $vv['id']])
  102 + ->order('id', 'desc')
  103 + ->find();
  104 + if (empty($step)) {
  105 + $sendname = '-';
  106 + } else {
  107 + if ($step['step'] == 1 && $step['send_stu'] == '0') {
  108 + $sendname = '用户需求推送失败';
  109 + }
  110 + if ($step['step'] == 1 && $step['send_stu'] == '1') {
  111 + $sendname = '用户需求推送成功';
  112 + }
  113 + if ($step['step'] == 2 && $step['send_stu'] == '0') {
  114 + $sendname = '不动产信息推送失败';
  115 + }
  116 + if ($step['step'] == 2 && $step['send_stu'] == '1') {
  117 + $sendname = '不动产信息推送成功';
  118 + }
  119 + if ($step['step'] == 3 && $step['send_stu'] == '0') {
  120 + $sendname = '查档报告推送失败';
  121 + }
  122 + if ($step['step'] == 3 && $step['send_stu'] == '1') {
  123 + $sendname = '查档报告推送成功';
  124 + }
  125 + if ($step['step'] == 4 && $step['send_stu'] == '0') {
  126 + $sendname = '完税报告推送失败';
  127 + }
  128 + if ($step['step'] == 4 && $step['send_stu'] == '1') {
  129 + $sendname = '完税报告推送成功';
  130 + }
  131 + if ($step['step'] == 5 && $step['send_stu'] == '0') {
  132 + $sendname = '复盘报告推送失败';
  133 + }
  134 + if ($step['step'] == 5 && $step['send_stu'] == '1') {
  135 + $sendname = '复盘报告推送成功';
  136 + }
  137 + }
  138 +
  139 + $rows[$kk]['sendname'] = $sendname;
  140 + $rows[$kk]['types'] = $vv['types'] > '0' ? $vv['types'] : '-';
  141 + $rows[$kk]['agent_user'] = $vv['agent_user'] > '0' ? $vv['agent_user'] : '-';
  142 + $rows[$kk]['mobile'] = $vv['mobile'] > '0' ? $vv['mobile'] : '-';
  143 + $rows[$kk]['content'] = $vv['content'] > '0' ? $vv['content'] : '';
  144 + $rows[$kk]['remark'] = $vv['remark'] > '0' ? $vv['remark'] : '';
  145 + }
  146 +
  147 + $result = array("total" => $list->total(), "rows" => $rows);
  148 +
  149 + return json($result);
  150 + }
  151 + return $this->view->fetch();
  152 + }
  153 +
  154 + /**
  155 + * 添加
  156 + */
  157 + public function add()
  158 + {
  159 + if ($this->request->isPost()) {
  160 + $params = $this->request->post("row/a");
  161 + if ($params) {
  162 + $params = $this->preExcludeFields($params);
  163 + $params['order_nunber'] = getOrderSn();
  164 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  165 + $params[$this->dataLimitField] = $this->auth->id;
  166 + }
  167 + //判断是否选择了经纪人,选择了经纪人,添加工单所属企业
  168 + if ($params['agent_users_id'] > 0) {
  169 + $params['admin_id'] = agent_users_admin_id($params['agent_users_id']);
  170 + }
  171 + //获得企业名称
  172 + if ($params['agent_order_type_id'] == '1' && $params['agent_name'] > 0) {
  173 + $agent = Db::name('agent_list')
  174 + ->where(['id' => $params['agent_name']])
  175 + ->field('id,agent_name')
  176 + ->find();
  177 + $params['agent_name'] = $agent['agent_name'];
  178 + }
  179 +
  180 + $result = false;
  181 + Db::startTrans();
  182 + try {
  183 + //是否采用模型验证
  184 + if ($this->modelValidate) {
  185 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  186 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  187 + $this->model->validateFailException(true)->validate($validate);
  188 + }
  189 + $result = $this->model->allowField(true)->save($params);
  190 + Db::commit();
  191 + } catch (ValidateException $e) {
  192 + Db::rollback();
  193 + $this->error($e->getMessage());
  194 + } catch (PDOException $e) {
  195 + Db::rollback();
  196 + $this->error($e->getMessage());
  197 + } catch (Exception $e) {
  198 + Db::rollback();
  199 + $this->error($e->getMessage());
  200 + }
  201 + if ($result !== false) {
  202 + //审核通过并指定了经纪人
  203 + if (($params['status'] == '1' || $params['status'] == '3') && $params['agent_users_id'] > 0) {
  204 + //获得工单分类名称
  205 + $ordertype = Db::name('agent_order_type')
  206 + ->where(['id' => $params['agent_order_type_id']])
  207 + ->find();
  208 + $jjr_name = Db::name('agent_users')
  209 + ->where(['id' => $params['agent_users_id']])
  210 + ->value('jjr_name');
  211 + $titdesc = '系统指派工单[' . $ordertype['title'] . ']';
  212 + $sendInfo = array(
  213 + 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  214 + 'keyword1' => array('value' => urlencode($params['order_nunber']), 'color' => '#173177'),
  215 + 'keyword2' => array('value' => urlencode('已指派,待处理'), 'color' => '#173177'),
  216 + 'keyword3' => array('value' => urlencode($jjr_name), 'color' => '#173177'),
  217 + 'remark' => array('value' => urlencode('处理时间:' . date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  218 + );
  219 + $wxopenid = getAgetWxOpenid($params['agent_users_id']);
  220 + if ($wxopenid) {
  221 + $config = get_addon_config('wechat');
  222 + $tourl = 'https://fdc.xp.yn.cn/h5/';
  223 + $ywt_appid = 'wxe1355bcf5af1bea3';
  224 + $pagepath = 'pages/home/wait/kind?id=' . $this->model->id . '&type=' . $params['agent_order_type_id'] . '&index=1';
  225 + $res = sendWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  226 + file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-1-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  227 + }
  228 + }
  229 + $this->success();
  230 + } else {
  231 + $this->error(__('No rows were inserted'));
  232 + }
  233 + }
  234 + $this->error(__('Parameter %s can not be empty', ''));
  235 + }
  236 + return $this->view->fetch();
  237 + }
  238 +
  239 + /***
  240 + * 编辑(old)
  241 + *
  242 + */
  243 +// public function edit($ids = null)
  244 +// {
  245 +// $row = $this->model->get($ids);
  246 +// $row['types'] = $row['types'] > '0' ? $row['types'] : '';
  247 +// $row['agent_user'] = $row['agent_user'] > '0' ? $row['agent_user'] : '';
  248 +// $row['mobile'] = $row['mobile'] > '0' ? $row['mobile'] : '';
  249 +// $row['content'] = $row['content'] > '0' ? $row['content'] : '';
  250 +// $row['remark'] = $row['remark'] > '0' ? $row['remark'] : '';
  251 +// if (!$row) {
  252 +// $this->error(__('No Results were found'));
  253 +// }
  254 +// $adminIds = $this->getDataLimitAdminIds();
  255 +// if (is_array($adminIds)) {
  256 +// if (!in_array($row[$this->dataLimitField], $adminIds)) {
  257 +// $this->error(__('You have no permission'));
  258 +// }
  259 +// }
  260 +// if ($this->request->isPost()) {
  261 +// $params = $this->request->post("row/a");
  262 +// if ($params) {
  263 +// $params = $this->preExcludeFields($params);
  264 +// //判断是否选择了经纪人,选择了经纪人,添加工单所属企业
  265 +// if ($params['agent_users_id'] > 0) {
  266 +// $params['admin_id'] = agent_users_admin_id($params['agent_users_id']);
  267 +// }
  268 +// $result = false;
  269 +// Db::startTrans();
  270 +// try {
  271 +// //是否采用模型验证
  272 +// if ($this->modelValidate) {
  273 +// $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  274 +// $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  275 +// $row->validateFailException(true)->validate($validate);
  276 +// }
  277 +// if ($params['status'] == 1 && $params['agent_users_id'] > 0) {
  278 +// $params['status'] = 3;
  279 +// }
  280 +//
  281 +// $result = $row->save($params);
  282 +// if ($params['status'] == 1) {
  283 +// $str = '工单通过审核';
  284 +// }
  285 +// if ($params['status'] == 2) {
  286 +// $str = '工单未通过审核';
  287 +// }
  288 +// if ($params['status'] == 3) {
  289 +// $str = '工单已指派';
  290 +// }
  291 +// if ($params['status'] == 8) {
  292 +// $str = '工单不通过,退款金额原路返回';
  293 +// }
  294 +//
  295 +// Db::name('agent_order_log')->insert([
  296 +// 'agent_order_id' => $ids,
  297 +// 'admin_id' => $this->auth->id,
  298 +// 'content' => $str,
  299 +// 'createtime' => time(),
  300 +// 'step' => 2,
  301 +// 'agent_user_id' => $params['agent_users_id'] ? $params['agent_users_id'] : 0,
  302 +// ]);
  303 +//
  304 +// //判断是否已支付,已支付则退款
  305 +// if ($params['status'] == 8 && $row['ia_pay'] == '1') {
  306 +// //支付金额
  307 +// $paylog = Db::name('workorder_userpay')
  308 +// ->where(['work_id' => $row['id'], 'ordersn' => $row['order_nunber']])
  309 +// ->find();
  310 +// if (!empty($paylog)) {
  311 +// //退款处理
  312 +// $pay_fee = $paylog['price'];
  313 +// $refund_fee = $pay_fee;
  314 +// $order_sn = $paylog['ordersn'];
  315 +// $pay_type = 'wechat';
  316 +// $reason = '工单审核不通过,退回保证金';
  317 +// $notifyurl = 'https://fdc.xp.yn.cn/api/index/refundNotifyx';//退款回调地址
  318 +// //直接调用退款方法传参即可
  319 +// $response = \addons\epay\library\Service::submitRefund($pay_fee, $refund_fee, $order_sn, getRefundSn($paylog['user_id']), $pay_type, $reason, $notifyurl, '', 'miniapp');
  320 +// $response = json_encode($response);
  321 +// $response = json_decode($response, true);
  322 +// file_put_contents("pcl_repay_fdc_v2.log", date("Y-m-d H:i:s") . "::" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  323 +// if (!empty($response['return_code'] == 'SUCCESS')) {
  324 +// //退款成功,更新退款记录
  325 +// $addtime = time();
  326 +// $relogs['uptime'] = $addtime;
  327 +// $relogs['is_refund'] = 1;
  328 +// $relogs['out_refund_no'] = $response['out_refund_no'];
  329 +// $relogs['refund_id'] = $response['refund_id'];
  330 +// $relogs['refund_fee'] = $response['refund_fee'];
  331 +// $relogs['refund_time'] = $addtime;
  332 +// $relogs['admin'] = $this->auth->id;
  333 +// Db::name('workorder_userpay')
  334 +// ->where(['work_id' => $row['id'], 'ordersn' => $row['order_nunber']])
  335 +// ->update($relogs);
  336 +// //更新工单表
  337 +// $order['is_refund'] = 1;
  338 +// $order['refund_time'] = $addtime;
  339 +// Db::name('agent_order')
  340 +// ->where(['id' => $row['id']])
  341 +// ->update($order);
  342 +// } else {
  343 +// $this->error('退款失败');
  344 +// }
  345 +// }
  346 +// }
  347 +//
  348 +// Db::commit();
  349 +// } catch (ValidateException $e) {
  350 +// Db::rollback();
  351 +// $this->error($e->getMessage());
  352 +// } catch (PDOException $e) {
  353 +// Db::rollback();
  354 +// $this->error($e->getMessage());
  355 +// } catch (Exception $e) {
  356 +// Db::rollback();
  357 +// $this->error($e->getMessage());
  358 +// }
  359 +// if ($result !== false) {
  360 +// //审核通过并指定了经纪人
  361 +// if (($params['status'] == '1' || $params['status'] == '3') && $params['agent_users_id'] > 0) {
  362 +// //获得工单分类名称
  363 +// $ordertype = Db::name('agent_order_type')
  364 +// ->where(['id' => $params['agent_order_type_id']])
  365 +// ->find();
  366 +// $jjr_name = Db::name('agent_users')
  367 +// ->where(['id' => $params['agent_users_id']])
  368 +// ->value('jjr_name');
  369 +// $titdesc = '系统指派工单[' . $ordertype['title'] . ']';
  370 +// $sendInfo = array(
  371 +// 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  372 +// 'keyword1' => array('value' => urlencode($row['order_nunber']), 'color' => '#173177'),
  373 +// 'keyword2' => array('value' => urlencode('已指派,待处理'), 'color' => '#173177'),
  374 +// 'keyword3' => array('value' => urlencode($jjr_name), 'color' => '#173177'),
  375 +// 'remark' => array('value' => urlencode('处理时间:' . date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  376 +// );
  377 +// $wxopenid = getAgetWxOpenid($params['agent_users_id']);
  378 +// if ($wxopenid) {
  379 +// $config = get_addon_config('wechat');
  380 +// $tourl = 'https://fdc.xp.yn.cn/h5/';
  381 +// $ywt_appid = 'wxe1355bcf5af1bea3';
  382 +// $pagepath = 'pages/home/wait/kind?id=' . $row['id'] . '&type=' . $params['agent_order_type_id'] . '&index=1';
  383 +// $res = sendWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  384 +// file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  385 +// }
  386 +// }
  387 +// $this->success();
  388 +// } else {
  389 +// $this->error(__('No rows were updated'));
  390 +// }
  391 +// }
  392 +// $this->error(__('Parameter %s can not be empty', ''));
  393 +// }
  394 +// $this->view->assign("row", $row);
  395 +// return $this->view->fetch();
  396 +// }
  397 +
  398 + /***
  399 + * 编辑
  400 + *
  401 + */
  402 + public function edit($ids = null)
  403 + {
  404 + $row = $this->model->get($ids);
  405 + $row['types'] = $row['types'] > '0' ? $row['types'] : '';
  406 + $row['agent_user'] = $row['agent_user'] > '0' ? $row['agent_user'] : '';
  407 + $row['mobile'] = $row['mobile'] > '0' ? $row['mobile'] : '';
  408 + $row['content'] = $row['content'] > '0' ? $row['content'] : '';
  409 + $row['remark'] = $row['remark'] > '0' ? $row['remark'] : '';
  410 + //获得推送公证处状态
  411 + $step = Db::name('agent_order_send_logs')
  412 + ->where(['agent_order_id' => $row['id']])
  413 + ->order('id', 'desc')
  414 + ->find();
  415 +
  416 + if (!$row) {
  417 + $this->error(__('No Results were found'));
  418 + }
  419 + $adminIds = $this->getDataLimitAdminIds();
  420 + if (is_array($adminIds)) {
  421 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  422 + $this->error(__('You have no permission'));
  423 + }
  424 + }
  425 + if ($this->request->isPost()) {
  426 + $params = $this->request->post("row/a");
  427 + if ($params) {
  428 + $params = $this->preExcludeFields($params);
  429 + //判断是否选择了经纪人,选择了经纪人,添加工单所属企业
  430 + if ($params['agent_users_id'] > 0) {
  431 + $params['admin_id'] = agent_users_admin_id($params['agent_users_id']);
  432 + }
  433 + if (isset($params['pclOfficeSendv2'])) {
  434 + $pclOfficeSendv2 = $params['pclOfficeSendv2'];
  435 + unset($params['pclOfficeSendv2']);
  436 + }
  437 + if (isset($params['pclOfficeSendv3'])) {
  438 + $pclOfficeSendv3 = $params['pclOfficeSendv3'];
  439 + unset($params['pclOfficeSendv3']);
  440 + }
  441 + if (isset($params['pclOfficeSendv4'])) {
  442 + $pclOfficeSendv4 = $params['pclOfficeSendv4'];
  443 + unset($params['pclOfficeSendv4']);
  444 + }
  445 + if (isset($params['pclOfficeSendv5'])) {
  446 + $pclOfficeSendv5 = $params['pclOfficeSendv5'];
  447 + unset($params['pclOfficeSendv5']);
  448 + }
  449 + $result = false;
  450 + Db::startTrans();
  451 + try {
  452 + //是否采用模型验证
  453 + if ($this->modelValidate) {
  454 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  455 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  456 + $row->validateFailException(true)->validate($validate);
  457 + }
  458 +
  459 + $result = $row->save($params);
  460 + $statusList = $this->model->getStatusList();
  461 + $str = $statusList[$params['status']];
  462 +
  463 + $step_id = 0;
  464 + $step = Db::name("agent_order_log")->where("agent_order_id", $ids)->order("step desc,id desc")->value("step");
  465 + if ($step) {
  466 + $step_id = $step + 1;
  467 + }
  468 +
  469 + Db::name('agent_order_log')->insert([
  470 + 'agent_order_id' => $ids,
  471 + 'content' => $str,
  472 + 'user_id' => $row['user_id'],
  473 + 'createtime' => time(),
  474 + 'admin_id' => agent_users_admin_id($params['agent_users_id']),
  475 + 'step' => $step_id,
  476 + 'write_status' => $params['status'],
  477 + 'agent_user_id' => $params['agent_users_id'] ? $params['agent_users_id'] : 0,
  478 + ]);
  479 +
  480 + //判断是否已支付,已支付则退款
  481 +// if ($params['status'] == 8 && $row['ia_pay'] == '1') {
  482 +// //支付金额
  483 +// $paylog = Db::name('workorder_userpay')
  484 +// ->where(['work_id' => $row['id'], 'ordersn' => $row['order_nunber']])
  485 +// ->find();
  486 +// if (!empty($paylog)) {
  487 +// //退款处理
  488 +// $pay_fee = $paylog['price'];
  489 +// $refund_fee = $pay_fee;
  490 +// $order_sn = $paylog['ordersn'];
  491 +// $pay_type = 'wechat';
  492 +// $reason = '工单审核不通过,退回保证金';
  493 +// $notifyurl = 'https://fdc.xp.yn.cn/api/index/refundNotifyx';//退款回调地址
  494 +// //直接调用退款方法传参即可
  495 +// $response = \addons\epay\library\Service::submitRefund($pay_fee, $refund_fee, $order_sn, getRefundSn($paylog['user_id']), $pay_type, $reason, $notifyurl, '', 'miniapp');
  496 +// $response = json_encode($response);
  497 +// $response = json_decode($response, true);
  498 +// file_put_contents("pcl_repay_fdc_v2.log", date("Y-m-d H:i:s") . "::" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  499 +// if (!empty($response['return_code'] == 'SUCCESS')) {
  500 +// //退款成功,更新退款记录
  501 +// $addtime = time();
  502 +// $relogs['uptime'] = $addtime;
  503 +// $relogs['is_refund'] = 1;
  504 +// $relogs['out_refund_no'] = $response['out_refund_no'];
  505 +// $relogs['refund_id'] = $response['refund_id'];
  506 +// $relogs['refund_fee'] = $response['refund_fee'];
  507 +// $relogs['refund_time'] = $addtime;
  508 +// $relogs['admin'] = $this->auth->id;
  509 +// Db::name('workorder_userpay')
  510 +// ->where(['work_id' => $row['id'], 'ordersn' => $row['order_nunber']])
  511 +// ->update($relogs);
  512 +// //更新工单表
  513 +// $order['is_refund'] = 1;
  514 +// $order['refund_time'] = $addtime;
  515 +// Db::name('agent_order')
  516 +// ->where(['id' => $row['id']])
  517 +// ->update($order);
  518 +// } else {
  519 +// $this->error('退款失败');
  520 +// }
  521 +// }
  522 +// }
  523 +
  524 + Db::commit();
  525 + } catch (ValidateException $e) {
  526 + Db::rollback();
  527 + $this->error($e->getMessage());
  528 + } catch (PDOException $e) {
  529 + Db::rollback();
  530 + $this->error($e->getMessage());
  531 + } catch (Exception $e) {
  532 + Db::rollback();
  533 + $this->error($e->getMessage());
  534 + }
  535 + if ($result !== false) {
  536 + //获得工单信息
  537 + $orders = Db::name('agent_order')->where(['id' => $row['id']])->find();
  538 + $titdesc = $orders['order_nunber'];
  539 + if ($params['status'] == '1') {
  540 + $titdesc = '工单审核通过';
  541 + }
  542 + if ($params['status'] == '2') {
  543 + $titdesc = '工单审核被拒绝';
  544 + }
  545 +
  546 +
  547 + //第1步 用户需求信息审核成功,调用接口推给公证处
  548 + $Office = new Index();
  549 + if ($params['status'] == '1') {
  550 + $titdesc = '工单审核通过,公证处办理中';
  551 + //判断是否推送过了,推送日志表agent_order_send_logs
  552 + $cks_send = Db::name('agent_order_send_logs')
  553 + ->where(['agent_order_id' => $row['id'], 'send_stu' => 1, 'step' => 1])
  554 + ->find();
  555 + if (empty($cks_send)) {
  556 + //1获得token
  557 + $token = $Office->getOfficeToken();
  558 + while (empty($token)) {
  559 + $token = $Office->getOfficeToken();
  560 + }
  561 + //获得推送数据
  562 + $sendData = $Office->notifyNewOrder($row['id']);
  563 +
  564 + $url = "https://gz.hxgzc.cn:34443/capitalManage/services/createOrder";
  565 + if (!empty($token) && !empty($sendData)) {
  566 + $res = HttpHelper::curl($url, 'POST', $sendData, [], $token);
  567 + $resArr = json_decode(stripslashes($res), true);
  568 +
  569 + if ($resArr['succeed'] == true) {
  570 + $slogs['send_stu'] = 1;
  571 + } else {
  572 + $slogs['send_stu'] = 0;
  573 + }
  574 + $slogs['agent_order_id'] = $row['id'];
  575 + $slogs['createtime'] = time();
  576 + $slogs['step'] = 1;
  577 + $slogs['reback_msg'] = $res;
  578 +
  579 + $logs = Db::name('agent_order_send_logs')->insertGetId($slogs);
  580 +
  581 + }
  582 + }
  583 + }
  584 + //2、不动产信息审核通过,推送公证处
  585 + if ($pclOfficeSendv2 == 1) {
  586 + $titdesc = '不动产信息审核通过,公证处办理中';
  587 + //1获得token
  588 + $token = $Office->getOfficeToken();
  589 + while (empty($token)) {
  590 + $token = $Office->getOfficeToken();
  591 + }
  592 + //获得推送数据
  593 + $sendData = $Office->realEstateUpdate($row['id']);
  594 +
  595 + $url = "https://gz.hxgzc.cn:34443/capitalManage/services/realEstateUpdate";
  596 + if (!empty($token) && !empty($sendData)) {
  597 + $res = HttpHelper::curl($url, 'POST', $sendData, [], $token);
  598 + $resArr = json_decode(stripslashes($res), true);
  599 +
  600 + if ($resArr['succeed'] == true) {
  601 + $slogs['send_stu'] = 1;
  602 + } else {
  603 + $slogs['send_stu'] = 0;
  604 + }
  605 + $slogs['agent_order_id'] = $row['id'];
  606 + $slogs['createtime'] = time();
  607 + $slogs['step'] = 2;
  608 + $slogs['reback_msg'] = $res;
  609 +
  610 + $logs = Db::name('agent_order_send_logs')->insertGetId($slogs);
  611 +
  612 + }
  613 + }
  614 + //3、推送查档报告
  615 + if ($pclOfficeSendv3 == 1) {
  616 + $titdesc = '查档报告审核通过,公证处办理中';
  617 + //1获得token
  618 + $token = $Office->getOfficeToken();
  619 + while (empty($token)) {
  620 + $token = $Office->getOfficeToken();
  621 + }
  622 + //获得推送数据
  623 + $sendData = $Office->checkReportUpdate($row['id']);
  624 +
  625 + $url = "https://gz.hxgzc.cn:34443/capitalManage/services/checkReportUpdate";
  626 + if (!empty($token) && !empty($sendData)) {
  627 + $res = HttpHelper::curl($url, 'POST', $sendData, [], $token);
  628 + $resArr = json_decode(stripslashes($res), true);
  629 +
  630 + if ($resArr['succeed'] == true) {
  631 + $slogs['send_stu'] = 1;
  632 + } else {
  633 + $slogs['send_stu'] = 0;
  634 + }
  635 + $slogs['agent_order_id'] = $row['id'];
  636 + $slogs['createtime'] = time();
  637 + $slogs['step'] = 3;
  638 + $slogs['reback_msg'] = $res;
  639 +
  640 + $logs = Db::name('agent_order_send_logs')->insertGetId($slogs);
  641 +
  642 + }
  643 + }
  644 + //4、推送完税报告
  645 + if ($pclOfficeSendv4 == 1) {
  646 + $titdesc = '完税报告审核通过,公证处办理中';
  647 + //1获得token
  648 + $token = $Office->getOfficeToken();
  649 + while (empty($token)) {
  650 + $token = $Office->getOfficeToken();
  651 + }
  652 + //获得推送数据
  653 + $sendData = $Office->taxPaidReportUpdate($row['id']);
  654 +
  655 + $url = "https://gz.hxgzc.cn:34443/capitalManage/services/taxPaidReportUpdate";
  656 + if (!empty($token) && !empty($sendData)) {
  657 + $res = HttpHelper::curl($url, 'POST', $sendData, [], $token);
  658 + $resArr = json_decode(stripslashes($res), true);
  659 +
  660 + if ($resArr['succeed'] == true) {
  661 + $slogs['send_stu'] = 1;
  662 + } else {
  663 + $slogs['send_stu'] = 0;
  664 + }
  665 + $slogs['agent_order_id'] = $row['id'];
  666 + $slogs['createtime'] = time();
  667 + $slogs['step'] = 4;//
  668 + $slogs['reback_msg'] = $res;
  669 +
  670 + $logs = Db::name('agent_order_send_logs')->insertGetId($slogs);
  671 +
  672 + }
  673 + }
  674 + //5、推送复盘报告
  675 + if ($pclOfficeSendv5 == 1) {
  676 + $titdesc = '复盘信息审核通过,公证处办理中';
  677 + //1获得token
  678 + $token = $Office->getOfficeToken();
  679 + while (empty($token)) {
  680 + $token = $Office->getOfficeToken();
  681 + }
  682 + //获得推送数据
  683 + $sendData = $Office->orderMatchReportUpdate($row['id']);
  684 +
  685 + $url = "https://gz.hxgzc.cn:34443/capitalManage/services/orderMatchReportUpdate";
  686 + if (!empty($token) && !empty($sendData)) {
  687 + $res = HttpHelper::curl($url, 'POST', $sendData, [], $token);
  688 + $resArr = json_decode(stripslashes($res), true);
  689 +
  690 + if ($resArr['succeed'] == true) {
  691 + $slogs['send_stu'] = 1;
  692 + } else {
  693 + $slogs['send_stu'] = 0;
  694 + }
  695 + $slogs['agent_order_id'] = $row['id'];
  696 + $slogs['createtime'] = time();
  697 + $slogs['step'] = 5;//复盘
  698 + $slogs['reback_msg'] = $res;
  699 +
  700 + $logs = Db::name('agent_order_send_logs')->insertGetId($slogs);
  701 +
  702 + }
  703 + }
  704 +
  705 +
  706 + //审核通过并指定了经纪人
  707 +// if (($params['status'] == '1' || $params['status'] == '3') && $params['agent_users_id'] > 0) {
  708 +// //获得工单分类名称
  709 +// $ordertype = Db::name('agent_order_type')
  710 +// ->where(['id' => $params['agent_order_type_id']])
  711 +// ->find();
  712 +// $jjr_name = Db::name('agent_users')
  713 +// ->where(['id' => $params['agent_users_id']])
  714 +// ->value('jjr_name');
  715 +// $titdesc = '系统指派工单[' . $ordertype['title'] . ']';
  716 +// $sendInfo = array(
  717 +// 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  718 +// 'keyword1' => array('value' => urlencode($row['order_nunber']), 'color' => '#173177'),
  719 +// 'keyword2' => array('value' => urlencode('已指派,待处理'), 'color' => '#173177'),
  720 +// 'keyword3' => array('value' => urlencode($jjr_name), 'color' => '#173177'),
  721 +// 'remark' => array('value' => urlencode('处理时间:' . date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  722 +// );
  723 +// $wxopenid = getAgetWxOpenid($params['agent_users_id']);
  724 +// if ($wxopenid) {
  725 +// $config = get_addon_config('wechat');
  726 +// $tourl = 'https://fdc.xp.yn.cn/h5/';
  727 +// $ywt_appid = 'wxe1355bcf5af1bea3';
  728 +// $pagepath = 'pages/home/wait/kind?id=' . $row['id'] . '&type=' . $params['agent_order_type_id'] . '&index=1';
  729 +// $res = sendWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  730 +// file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  731 +// }
  732 +// }
  733 +
  734 + //推送公众号模板信息给工单管理经纪人
  735 + $this->senWxmsgToAgentUser($orders, $titdesc);
  736 + $this->success();
  737 + } else {
  738 + $this->error(__('No rows were updated'));
  739 + }
  740 + }
  741 + $this->error(__('Parameter %s can not be empty', ''));
  742 + }
  743 + $this->view->assign("row", $row);
  744 + $this->view->assign("step", $step);
  745 + return $this->view->fetch();
  746 + }
  747 +
  748 + /***
  749 + * 公众号推送工单信息给经纪人
  750 + */
  751 + private function senWxmsgToAgentUser($order, $titdesc)
  752 + {
  753 + //获得工单分类名称
  754 + $ordertype = Db::name('agent_order_type')
  755 + ->where(['id' => $order['agent_order_type_id']])
  756 + ->find();
  757 + $jjr_name = Db::name('agent_users')
  758 + ->where(['id' => $order['agent_users_id']])
  759 + ->value('jjr_name');
  760 + $sendInfo = array(
  761 + 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  762 + 'keyword1' => array('value' => urlencode($order['order_nunber']), 'color' => '#173177'),
  763 + 'keyword2' => array('value' => urlencode($titdesc), 'color' => '#173177'),
  764 + 'keyword3' => array('value' => urlencode($jjr_name), 'color' => '#173177'),
  765 + 'remark' => array('value' => urlencode('处理时间:' . date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  766 + );
  767 + $wxopenid = getAgetWxOpenid($order['agent_users_id']);
  768 + if ($wxopenid) {
  769 + $config = get_addon_config('wechat');
  770 + $tourl = 'https://fdc.xp.yn.cn/h5/';
  771 + $ywt_appid = 'wxe1355bcf5af1bea3';
  772 + $pagepath = 'pages/order/order_details?id=' . $order['id'];
  773 + $res = sendWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  774 + //file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  775 + }
  776 + }
  777 +
  778 + /**
  779 + * 导入excel数据
  780 + */
  781 + public function import()
  782 + {
  783 +
  784 + $file = $this->request->request('file');
  785 + if (!$file) {
  786 + $this->error(__('Parameter %s can not be empty', 'file'));
  787 + }
  788 + $filePath = ROOT_PATH . DS . 'public' . DS . $file;
  789 + if (!is_file($filePath)) {
  790 + $this->error(__('No results were found'));
  791 + }
  792 +
  793 + if (!is_file($filePath)) {
  794 + $this->error('找不到数据文件,请重新上传');
  795 + }
  796 +
  797 + //实例化reader
  798 + $ext = pathinfo($filePath, PATHINFO_EXTENSION);
  799 + if (!in_array($ext, ['xls', 'xlsx'])) {
  800 + $this->error('不支持的数据格式');
  801 + }
  802 + if ($ext === 'xls') {
  803 + $reader = new Xls();
  804 + } else {
  805 + $reader = new Xlsx();
  806 + }
  807 + //读取EXCEl的内容
  808 + $PHPExcel = $reader->load($filePath);
  809 + if (!$PHPExcel) {
  810 + $this->error('表格内没有数据内容');
  811 + }
  812 + $currentSheet = $PHPExcel->getSheet(0); //读取文件中的第一个工作表
  813 + $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
  814 + $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
  815 + $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
  816 + $fields = [];
  817 + //获得表第1行栏目名称
  818 + for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
  819 + for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
  820 + $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
  821 + $fields[] = $val;
  822 + }
  823 + }
  824 + //获得从第2行起内容列表数组
  825 + for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
  826 + $values = [];
  827 + for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
  828 + $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
  829 + $values[] = is_null($val) ? '0' : $val;
  830 + }
  831 +
  832 + //循环保存数据到数据库
  833 + $data['agent_order_type_id'] = $this->getcatIds($values[1]);
  834 + $data['order_nunber'] = getOrderSn();
  835 +
  836 + $data['user_name'] = $values[2];
  837 + $data['cqr_mobile'] = $values[3];
  838 + $data['agent_user'] = $values[4];
  839 + $data['mobile'] = $values[5] > '0' ? $values[5] : '';
  840 +
  841 + if ($data['agent_order_type_id'] == 5 && $values[6] > '0') {
  842 + $data['loan_cat_id'] = $this->getLoancatIds($values[6]);
  843 + } else {
  844 + $data['loan_cat_id'] = '';
  845 + }
  846 + if ($data['agent_order_type_id'] == 1 && $values[7] > '0') {
  847 + $data['house_cat_id'] = $this->getHousecatIds($values[7]);
  848 + } else {
  849 + $data['house_cat_id'] = '';
  850 + }
  851 +
  852 + $data['agent_name'] = $values[8] > '0' ? $values[8] : '';
  853 + $data['agent_user_name'] = $values[9] > '0' ? $values[9] : '';
  854 + $data['agent_mobile'] = $values[10] > '0' ? $values[10] : '';
  855 +
  856 + $data['house_area'] = $values[11] > '0' ? $values[11] : '';
  857 + $data['house_price'] = $values[12] > '0' ? $values[12] : '';
  858 +
  859 + $data['content'] = $values[13] > '0' ? $values[13] : '';
  860 + $data['remark'] = $values[14] > '0' ? $values[14] : '';
  861 +
  862 + $data['is_import'] = 1;
  863 + $data['createtime'] = time();
  864 +
  865 + //判断订单号是否存在
  866 + $cks = Db::name('agent_order')
  867 + ->where(['order_nunber' => $data['order_nunber']])
  868 + ->find();
  869 + if (empty($cks)) {
  870 + $rs = Db::name('agent_order')->insertGetId($data);
  871 + }
  872 +
  873 + }
  874 + $this->success('导入成功');
  875 + }
  876 +
  877 + /**
  878 + * 配置分类
  879 + * 工单分类
  880 + */
  881 + protected function getcatIds($data)
  882 + {
  883 + $wh['title'] = ['=', $data];
  884 + $cat = Db::name('agent_order_type')
  885 + ->where($wh)
  886 + ->find();
  887 + if (empty($cat)) {
  888 + $wh2['title'] = ['like', '%' . $data . '%'];
  889 + $cat = Db::name('agent_order_type')
  890 + ->where($wh2)
  891 + ->find();
  892 + }
  893 + $cat_id = !empty($cat) ? $cat['id'] : 1;
  894 +
  895 + return $cat_id;
  896 + }
  897 +
  898 + /**
  899 + * 贷款分类
  900 + *
  901 + */
  902 + protected function getLoancatIds($data)
  903 + {
  904 + $wh['catname'] = ['=', $data];
  905 + $cat = Db::name('loan_cat')
  906 + ->where($wh)
  907 + ->find();
  908 + if (empty($cat)) {
  909 + $wh2['catname'] = ['like', '%' . $data . '%'];
  910 + $cat = Db::name('loan_cat')
  911 + ->where($wh2)
  912 + ->find();
  913 + }
  914 + $cat_id = !empty($cat) ? $cat['id'] : 1;
  915 +
  916 + return $cat_id;
  917 + }
  918 +
  919 + /**
  920 + * 房子性质分类
  921 + *
  922 + */
  923 + protected function getHousecatIds($data)
  924 + {
  925 + $wh['catname'] = ['=', $data];
  926 + $cat = Db::name('house_cat')
  927 + ->where($wh)
  928 + ->find();
  929 + if (empty($cat)) {
  930 + $wh2['catname'] = ['like', '%' . $data . '%'];
  931 + $cat = Db::name('house_cat')
  932 + ->where($wh2)
  933 + ->find();
  934 + }
  935 + $cat_id = !empty($cat) ? $cat['id'] : 1;
  936 +
  937 + return $cat_id;
  938 + }
  939 +
  940 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + *
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Orderlog extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Orderlog模型对象
  18 + * @var \app\admin\model\agent\Orderlog
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Orderlog;
  26 +
  27 + }
  28 +
  29 + /**
  30 + * 查看
  31 + */
  32 + public function index()
  33 + {
  34 + //设置过滤方法
  35 + $this->request->filter(['strip_tags', 'trim']);
  36 + if ($this->request->isAjax()) {
  37 + $appid = $this->request->param('app_id', 0);
  38 + if ($appid > 0) {
  39 + $wh['agent_order_id'] = ['=', $appid];
  40 + } else {
  41 + $wh = " 1=1 ";
  42 + }
  43 + //如果发送的来源是Selectpage,则转发到Selectpage
  44 + if ($this->request->request('keyField')) {
  45 + return $this->selectpage();
  46 + }
  47 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  48 +
  49 + $list = $this->model
  50 + ->where($where)
  51 + ->where($wh)
  52 + ->order('id', 'asc')
  53 + ->paginate($limit);
  54 +
  55 + $rows = $list->items();
  56 + foreach ($rows as $kk => $vv) {
  57 + //关联发布人
  58 + $oinfo = Db::name('agent_order')
  59 + ->where(['id' => $vv['agent_order_id']])
  60 + ->find();
  61 + $rows[$kk]['user_name'] = $oinfo['user_name'];
  62 + $rows[$kk]['mobile'] = $oinfo['mobile'];
  63 + //处理人信息
  64 + if ($vv['agent_user_id'] > 0) {
  65 + $agent = Db::name('agent_users')
  66 + ->where(['id' => $vv['agent_user_id']])
  67 + ->field('id,jjr_name,jjr_mobile')
  68 + ->find();
  69 + $rows[$kk]['jjr_name'] = $agent['jjr_name'] . '[' . $agent['jjr_mobile'] . ']';
  70 + } else {
  71 + $rows[$kk]['jjr_name'] = '-';
  72 + }
  73 + }
  74 +
  75 + $result = array("total" => $list->total(), "rows" => $rows);
  76 +
  77 + return json($result);
  78 + }
  79 + return $this->view->fetch();
  80 + }
  81 +
  82 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 工单推送公证处日志
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Ordersendlog extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Ordersendlog模型对象
  17 + * @var \app\admin\model\agent\Ordersendlog
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\agent\Ordersendlog;
  25 + $this->view->assign("sendStuList", $this->model->getSendStuList());
  26 + }
  27 +
  28 + public function import()
  29 + {
  30 + parent::import();
  31 + }
  32 +
  33 + /**
  34 + * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
  35 + * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
  36 + * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  37 + */
  38 +
  39 +
  40 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 工单分类
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Ordertype extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Ordertype模型对象
  17 + * @var \app\admin\model\agent\Ordertype
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\agent\Ordertype;
  25 +
  26 + }
  27 +
  28 + /**
  29 + * 查看
  30 + */
  31 + public function index()
  32 + {
  33 + //当前是否为关联查询
  34 + $this->relationSearch = true;
  35 + //设置过滤方法
  36 + $this->request->filter(['strip_tags', 'trim']);
  37 + if ($this->request->isAjax()) {
  38 + //如果发送的来源是Selectpage,则转发到Selectpage
  39 + if ($this->request->request('keyField')) {
  40 + return $this->selectpage();
  41 + }
  42 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  43 +
  44 + $list = $this->model
  45 + ->where($where)
  46 + ->where('siteswitch!=3')
  47 + ->order('id', 'asc')
  48 + ->paginate($limit);
  49 + foreach ($list as $row) {
  50 + $row->visible(['id', 'title', 'icon_image', 'weigh', 'siteswitch', 'price']);
  51 + }
  52 + $result = array("total" => $list->total(), "rows" => $list->items());
  53 +
  54 + return json($result);
  55 + }
  56 + return $this->view->fetch();
  57 + }
  58 +
  59 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + *
  9 + *
  10 + * @icon fa fa-circle-o
  11 + */
  12 +class Ordertypeprocess extends Backend
  13 +{
  14 +
  15 + /**
  16 + * Ordertypeprocess模型对象
  17 + * @var \app\admin\model\agent\Ordertypeprocess
  18 + */
  19 + protected $model = null;
  20 +
  21 + public function _initialize()
  22 + {
  23 + parent::_initialize();
  24 + $this->model = new \app\admin\model\agent\Ordertypeprocess;
  25 +
  26 + }
  27 +
  28 + public function import()
  29 + {
  30 + parent::import();
  31 + }
  32 +
  33 +
  34 +
  35 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 企业年费缴纳管理
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Paymentlogs extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Paymentlogs模型对象
  18 + * @var \app\admin\model\agent\Paymentlogs
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Paymentlogs;
  26 + $agt_ids = $this->request->param('ids', 0);
  27 + if ($agt_ids > 0) {
  28 + $ginfo = Db::name('agent_list')
  29 + ->where(['id' => $agt_ids])
  30 + ->find();
  31 + } else {
  32 + $ginfo = [];
  33 + }
  34 + $this->view->assign('ginfo', $ginfo);
  35 + }
  36 +
  37 + /**
  38 + * 查看
  39 + */
  40 + public function index()
  41 + {
  42 + //当前是否为关联查询
  43 + $this->relationSearch = true;
  44 + //设置过滤方法
  45 + $this->request->filter(['strip_tags', 'trim']);
  46 + if ($this->request->isAjax()) {
  47 + $ids = $this->request->param('ids', 0);
  48 + if ($ids > 0) {
  49 + $wh['agent_list_id'] = ['=', $ids];
  50 + } else {
  51 + $wh = ' 1=1 ';
  52 + }
  53 + //如果发送的来源是Selectpage,则转发到Selectpage
  54 + if ($this->request->request('keyField')) {
  55 + return $this->selectpage();
  56 + }
  57 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  58 +
  59 + $list = $this->model
  60 + ->with(['agentlist'])
  61 + ->where($where)
  62 + ->where($wh)
  63 + ->order($sort, $order)
  64 + ->paginate($limit);
  65 +
  66 + foreach ($list as $row) {
  67 + $row->visible(['id', 'agent_list_id', 'pay_price', 'createtime', 'start_pay_time', 'end_pay_time', 'stu_msg']);
  68 + $row->visible(['agentlist']);
  69 + $row->getRelation('agentlist')->visible(['agent_name']);
  70 + }
  71 + $rows = $list->items();
  72 + foreach ($rows as $kk => $vv) {
  73 + //判断是否过期
  74 + $nowtime = time();
  75 + if ($nowtime > $vv['end_pay_time']) {
  76 + $rows[$kk]['stu_msg'] = '已过期';
  77 + } else {
  78 + $rows[$kk]['stu_msg'] = '有效';
  79 + }
  80 + }
  81 +
  82 + $result = array("total" => $list->total(), "rows" => $rows);
  83 +
  84 + return json($result);
  85 + }
  86 + return $this->view->fetch();
  87 + }
  88 +
  89 + /**
  90 + * 添加
  91 + */
  92 + public function add()
  93 + {
  94 + if ($this->request->isPost()) {
  95 + $params = $this->request->post("row/a");
  96 + if ($params) {
  97 + $params = $this->preExcludeFields($params);
  98 + $params['admin_id'] = $this->auth->id;
  99 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  100 + $params[$this->dataLimitField] = $this->auth->id;
  101 + }
  102 + $result = false;
  103 + Db::startTrans();
  104 + try {
  105 + //是否采用模型验证
  106 + if ($this->modelValidate) {
  107 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  108 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  109 + $this->model->validateFailException(true)->validate($validate);
  110 + }
  111 + $result = $this->model->allowField(true)->save($params);
  112 + //处理企业支付时间,更新企业表支付结束时间
  113 + $agentpay['start_pay_time'] = strtotime($params['start_pay_time']);
  114 + $agentpay['end_pay_time'] = strtotime($params['end_pay_time']);
  115 + $agentpay['pay_stu'] = 1;
  116 + $agentpay['updatetime'] = time();
  117 + Db::name('agent_list')->where(['id' => $params['agent_list_id']])->update($agentpay);
  118 + Db::commit();
  119 + } catch (ValidateException $e) {
  120 + Db::rollback();
  121 + $this->error($e->getMessage());
  122 + } catch (PDOException $e) {
  123 + Db::rollback();
  124 + $this->error($e->getMessage());
  125 + } catch (Exception $e) {
  126 + Db::rollback();
  127 + $this->error($e->getMessage());
  128 + }
  129 + if ($result !== false) {
  130 + $this->success();
  131 + } else {
  132 + $this->error(__('No rows were inserted'));
  133 + }
  134 + }
  135 + $this->error(__('Parameter %s can not be empty', ''));
  136 + }
  137 + return $this->view->fetch();
  138 + }
  139 +
  140 + /**
  141 + * 编辑
  142 + */
  143 + public function edit($ids = null)
  144 + {
  145 + $row = $this->model->get($ids);
  146 + if (!$row) {
  147 + $this->error(__('No Results were found'));
  148 + }
  149 + $adminIds = $this->getDataLimitAdminIds();
  150 + if (is_array($adminIds)) {
  151 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  152 + $this->error(__('You have no permission'));
  153 + }
  154 + }
  155 + if ($this->request->isPost()) {
  156 + $params = $this->request->post("row/a");
  157 + if ($params) {
  158 + $params = $this->preExcludeFields($params);
  159 +
  160 + $result = false;
  161 + Db::startTrans();
  162 + try {
  163 + //是否采用模型验证
  164 + if ($this->modelValidate) {
  165 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  166 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  167 + $row->validateFailException(true)->validate($validate);
  168 + }
  169 +
  170 + $result = $row->allowField(true)->save($params);
  171 +
  172 + //处理企业支付时间,更新企业表支付结束时间
  173 + $agentpay['start_pay_time'] = strtotime($params['start_pay_time']);
  174 + $agentpay['end_pay_time'] = strtotime($params['end_pay_time']);
  175 + $agentpay['pay_stu'] = 1;
  176 + $agentpay['updatetime'] = time();
  177 + Db::name('agent_list')->where(['id' => $params['agent_list_id']])->update($agentpay);
  178 +
  179 + Db::commit();
  180 + } catch (ValidateException $e) {
  181 + Db::rollback();
  182 + $this->error($e->getMessage());
  183 + } catch (PDOException $e) {
  184 + Db::rollback();
  185 + $this->error($e->getMessage());
  186 + } catch (Exception $e) {
  187 + Db::rollback();
  188 + $this->error($e->getMessage());
  189 + }
  190 + if ($result !== false) {
  191 + $this->success();
  192 + } else {
  193 + $this->error(__('No rows were updated'));
  194 + }
  195 + }
  196 + $this->error(__('Parameter %s can not be empty', ''));
  197 + }
  198 + $this->view->assign("row", $row);
  199 + return $this->view->fetch();
  200 + }
  201 +
  202 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 购房售房人信息
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Payusers extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Payusers模型对象
  18 + * @var \app\admin\model\agent\Payusers
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Payusers;
  26 + $this->view->assign("isnaturalpersonList", $this->model->getIsnaturalpersonList());
  27 + $this->view->assign("typeList", $this->model->getTypeList());
  28 + }
  29 +
  30 + /**
  31 + * 查看
  32 + */
  33 + public function index()
  34 + {
  35 + //当前是否为关联查询
  36 + $this->relationSearch = true;
  37 + //设置过滤方法
  38 + $this->request->filter(['strip_tags', 'trim']);
  39 + if ($this->request->isAjax()) {
  40 + $ids = $this->request->param('ids', 0);
  41 + if ($ids > 0) {
  42 + $wh['agent_order_id'] = ['=', $ids];
  43 + } else {
  44 + $wh = ' 1=1 ';
  45 + }
  46 + //如果发送的来源是Selectpage,则转发到Selectpage
  47 + if ($this->request->request('keyField')) {
  48 + return $this->selectpage();
  49 + }
  50 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  51 +
  52 + $list = $this->model
  53 + ->where($where)
  54 + ->where($wh)
  55 + ->order('id','asc')
  56 + ->paginate($limit);
  57 +
  58 + $rows = $list->items();
  59 +
  60 + $result = array("total" => $list->total(), "rows" => $rows);
  61 +
  62 + return json($result);
  63 + }
  64 + return $this->view->fetch();
  65 + }
  66 +
  67 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\agent;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Db;
  7 +
  8 +/**
  9 + * 一网通办人员管理
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Usermobile extends Backend
  14 +{
  15 +
  16 + /**
  17 + * Usermobile模型对象
  18 + * @var \app\admin\model\agent\Usermobile
  19 + */
  20 + protected $model = null;
  21 +
  22 + public function _initialize()
  23 + {
  24 + parent::_initialize();
  25 + $this->model = new \app\admin\model\agent\Usermobile;
  26 + $this->view->assign("statusList", $this->model->getStatusList());
  27 + }
  28 +
  29 + public function import()
  30 + {
  31 + parent::import();
  32 + }
  33 +
  34 + /**
  35 + * 查看
  36 + */
  37 + public function index()
  38 + {
  39 + //当前是否为关联查询
  40 + $this->relationSearch = true;
  41 + //设置过滤方法
  42 + $this->request->filter(['strip_tags', 'trim']);
  43 + if ($this->request->isAjax()) {
  44 +
  45 + //如果发送的来源是Selectpage,则转发到Selectpage
  46 + if ($this->request->request('keyField')) {
  47 + return $this->selectpage();
  48 + }
  49 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  50 + $a = [];
  51 + $b = (json_decode((request()->param())['filter'],true))['status'];
  52 + if($b === '1'){
  53 +
  54 + }else{
  55 + $a['user_id'] = ['<>',''];
  56 + }
  57 +
  58 + $list = $this->model
  59 + ->where($where)
  60 + ->where($a)
  61 + ->order('id', 'desc')
  62 + ->paginate($limit);
  63 +
  64 + $rows = $list->items();
  65 + foreach ($rows as $kk => $vv) {
  66 + //关联经纪人信息
  67 + $agent = Db::name('agent_users')
  68 + ->where(['jjr_mobile' => $vv['catname']])
  69 + ->find();
  70 + $rows[$kk]['agent_user'] = '-';
  71 + $rows[$kk]['userno'] = '-';
  72 + if (empty($agent)) {
  73 + $rows[$kk]['agent_stu'] = '未注册';
  74 + }
  75 + if ($agent['jjr_agent_stu'] == '0') {
  76 + $rows[$kk]['agent_user'] = $agent['jjr_name'];
  77 + $rows[$kk]['userno'] = $agent['userno'];
  78 + $rows[$kk]['agent_stu'] = '未审核';
  79 + }
  80 + if ($agent['jjr_agent_stu'] == '1') {
  81 + $rows[$kk]['agent_user'] = $agent['jjr_name'];
  82 + $rows[$kk]['userno'] = $agent['userno'];
  83 + $rows[$kk]['agent_stu'] = '审核通过';
  84 + }
  85 + if ($agent['jjr_agent_stu'] == '2') {
  86 + $rows[$kk]['agent_user'] = $agent['jjr_name'];
  87 + $rows[$kk]['userno'] = $agent['userno'];
  88 + $rows[$kk]['agent_stu'] = '不通过';
  89 + }
  90 + if ($agent['jjr_agent_stu'] == '3') {
  91 + $rows[$kk]['agent_user'] = $agent['jjr_name'];
  92 + $rows[$kk]['userno'] = $agent['userno'];
  93 + $rows[$kk]['agent_stu'] = '离职';
  94 + }
  95 + if ($agent['jjr_agent_stu'] == '4') {
  96 + $rows[$kk]['agent_user'] = $agent['jjr_name'];
  97 + $rows[$kk]['userno'] = $agent['userno'];
  98 + $rows[$kk]['agent_stu'] = '非正常离职';
  99 + }
  100 + }
  101 +
  102 + $result = array("total" => $list->total(), "rows" => $rows);
  103 +
  104 + return json($result);
  105 + }
  106 + return $this->view->fetch();
  107 + }
  108 +
  109 + /**
  110 + * 添加
  111 + */
  112 + public function add()
  113 + {
  114 + if ($this->request->isPost()) {
  115 + $params = $this->request->post("row/a");
  116 + if ($params) {
  117 + $params = $this->preExcludeFields($params);
  118 + //判断手机号码格式
  119 + if (!preg_match('/^1[3456789]\d{9}$/ims', $params['catname'])) {
  120 + $this->error('手机号码格式不正确');
  121 + }
  122 + //判断手机号码是否重复
  123 + $cksrs = Db::name('agent_user_mobile')
  124 + ->where(['catname' => $params['catname']])
  125 + ->find();
  126 + if (!empty($cksrs)) {
  127 + $this->error('手机号码已存在');
  128 + }
  129 +
  130 + if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
  131 + $params[$this->dataLimitField] = $this->auth->id;
  132 + }
  133 + $result = false;
  134 + //关联经纪人信息
  135 + $agent = Db::name('agent_users')
  136 + ->where(['jjr_mobile' => $params['catname']])
  137 + ->find();
  138 + $params['user_id'] = $agent['user_id'];
  139 + $params['jjr_name'] = $agent['jjr_name'];
  140 + $params['userno'] = $agent['userno'];
  141 + Db::startTrans();
  142 + try {
  143 + //是否采用模型验证
  144 + if ($this->modelValidate) {
  145 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  146 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
  147 + $this->model->validateFailException(true)->validate($validate);
  148 + }
  149 + $result = $this->model->allowField(true)->save($params);
  150 +
  151 +
  152 + Db::commit();
  153 + } catch (ValidateException $e) {
  154 + Db::rollback();
  155 + $this->error($e->getMessage());
  156 + } catch (PDOException $e) {
  157 + Db::rollback();
  158 + $this->error($e->getMessage());
  159 + } catch (Exception $e) {
  160 + Db::rollback();
  161 + $this->error($e->getMessage());
  162 + }
  163 + if ($result !== false) {
  164 +
  165 + $this->success();
  166 + } else {
  167 + $this->error(__('No rows were inserted'));
  168 + }
  169 + }
  170 + $this->error(__('Parameter %s can not be empty', ''));
  171 + }
  172 + return $this->view->fetch();
  173 + }
  174 +
  175 + /**
  176 + * 编辑
  177 + */
  178 + public function edit($ids = null)
  179 + {
  180 + $row = $this->model->get($ids);
  181 + if (!$row) {
  182 + $this->error(__('No Results were found'));
  183 + }
  184 + $adminIds = $this->getDataLimitAdminIds();
  185 + if (is_array($adminIds)) {
  186 + if (!in_array($row[$this->dataLimitField], $adminIds)) {
  187 + $this->error(__('You have no permission'));
  188 + }
  189 + }
  190 + if ($this->request->isPost()) {
  191 + $params = $this->request->post("row/a");
  192 + if ($params) {
  193 + $params = $this->preExcludeFields($params);
  194 + //判断手机号码格式
  195 + if (!preg_match('/^1[3456789]\d{9}$/ims', $params['catname'])) {
  196 + $this->error('手机号码格式不正确');
  197 + }
  198 + //判断手机号码是否重复
  199 + $wh['id'] = ['neq', $row['id']];
  200 + $cksrs = Db::name('agent_user_mobile')
  201 + ->where(['catname' => $params['catname']])
  202 + ->where($wh)
  203 + ->find();
  204 + if (!empty($cksrs)) {
  205 + $this->error('手机号码已存在');
  206 + }
  207 + $result = false;
  208 + //关联经纪人信息
  209 + $agent = Db::name('agent_users')
  210 + ->where(['jjr_mobile' => $params['catname']])
  211 + ->find();
  212 + $params['user_id'] = $agent['user_id'];
  213 + $params['jjr_name'] = $agent['jjr_name'];
  214 + $params['userno'] = $agent['userno'];
  215 + Db::startTrans();
  216 + try {
  217 + //是否采用模型验证
  218 + if ($this->modelValidate) {
  219 + $name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
  220 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
  221 + $row->validateFailException(true)->validate($validate);
  222 + }
  223 +
  224 + $result = $row->allowField(true)->save($params);
  225 + Db::commit();
  226 + } catch (ValidateException $e) {
  227 + Db::rollback();
  228 + $this->error($e->getMessage());
  229 + } catch (PDOException $e) {
  230 + Db::rollback();
  231 + $this->error($e->getMessage());
  232 + } catch (Exception $e) {
  233 + Db::rollback();
  234 + $this->error($e->getMessage());
  235 + }
  236 + if ($result !== false) {
  237 + $this->success();
  238 + } else {
  239 + $this->error(__('No rows were updated'));
  240 + }
  241 + }
  242 + $this->error(__('Parameter %s can not be empty', ''));
  243 + }
  244 + $this->view->assign("row", $row);
  245 + return $this->view->fetch();
  246 + }
  247 +
  248 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\wechat;
  4 +
  5 +use app\common\controller\Backend;
  6 +use app\admin\model\WechatResponse;
  7 +
  8 +/**
  9 + * 微信自动回复管理
  10 + *
  11 + * @icon fa fa-circle-o
  12 + */
  13 +class Autoreply extends Backend
  14 +{
  15 +
  16 + protected $model = null;
  17 + protected $noNeedRight = ['check_text_unique'];
  18 +
  19 + public function _initialize()
  20 + {
  21 + parent::_initialize();
  22 + $this->model = model('WechatAutoreply');
  23 + }
  24 +
  25 + /**
  26 + * 编辑
  27 + */
  28 + public function edit($ids = null)
  29 + {
  30 + $row = $this->model->get(['id' => $ids]);
  31 + if (!$row) {
  32 + $this->error(__('No Results were found'));
  33 + }
  34 + if ($this->request->isPost()) {
  35 + $params = $this->request->post("row/a");
  36 + if ($params) {
  37 + $row->save($params);
  38 + $this->success();
  39 + }
  40 + $this->error();
  41 + }
  42 + $response = WechatResponse::get(['eventkey' => $row['eventkey']]);
  43 + $this->view->assign("response", $response);
  44 + $this->view->assign("row", $row);
  45 + return $this->view->fetch();
  46 + }
  47 +
  48 + /**
  49 + * 判断文本是否唯一
  50 + * @internal
  51 + */
  52 + public function check_text_unique()
  53 + {
  54 + $row = $this->request->post("row/a");
  55 + $except = $this->request->post("except");
  56 + $text = isset($row['text']) ? $row['text'] : '';
  57 + if ($this->model->where('text', $text)->where(function ($query) use ($except) {
  58 + if ($except) {
  59 + $query->where('text', '<>', $except);
  60 + }
  61 + })->count() == 0) {
  62 + $this->success();
  63 + } else {
  64 + $this->error(__('Text already exists'));
  65 + }
  66 + }
  67 +
  68 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\wechat;
  4 +
  5 +use app\common\controller\Backend;
  6 +use think\Controller;
  7 +use think\Request;
  8 +
  9 +/**
  10 + * 微信配置管理
  11 + *
  12 + * @icon fa fa-circle-o
  13 + */
  14 +class Config extends Backend
  15 +{
  16 +
  17 + protected $model = null;
  18 +
  19 + public function _initialize()
  20 + {
  21 + parent::_initialize();
  22 + $this->model = model('WechatConfig');
  23 + }
  24 +
  25 + /**
  26 + * 添加
  27 + */
  28 + public function add()
  29 + {
  30 + if ($this->request->isPost()) {
  31 + $params = $this->request->post("row/a");
  32 + if ($params) {
  33 + foreach ($params as $k => &$v) {
  34 + $v = is_array($v) ? implode(',', $v) : $v;
  35 + }
  36 +
  37 + if ($params['mode'] == 'json') {
  38 + //JSON字段
  39 + $fieldarr = $valuearr = [];
  40 + $field = $this->request->post('field/a');
  41 + $value = $this->request->post('value/a');
  42 + foreach ($field as $k => $v) {
  43 + if ($v != '') {
  44 + $fieldarr[] = $field[$k];
  45 + $valuearr[] = $value[$k];
  46 + }
  47 + }
  48 + $params['value'] = json_encode(array_combine($fieldarr, $valuearr), JSON_UNESCAPED_UNICODE);
  49 + }
  50 + unset($params['mode']);
  51 + try {
  52 + //是否采用模型验证
  53 + if ($this->modelValidate) {
  54 + $name = basename(str_replace('\\', '/', get_class($this->model)));
  55 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate;
  56 + $this->model->validate($validate);
  57 + }
  58 + $result = $this->model->save($params);
  59 + if ($result !== false) {
  60 + $this->success();
  61 + } else {
  62 + $this->error($this->model->getError());
  63 + }
  64 + } catch (\think\exception\PDOException $e) {
  65 + $this->error($e->getMessage());
  66 + }
  67 + }
  68 + $this->error(__('Parameter %s can not be empty', ''));
  69 + }
  70 + return $this->view->fetch();
  71 + }
  72 +
  73 + /**
  74 + * 编辑
  75 + */
  76 + public function edit($ids = null)
  77 + {
  78 + $row = $this->model->get($ids);
  79 + if (!$row) {
  80 + $this->error(__('No Results were found'));
  81 + }
  82 + if ($this->request->isPost()) {
  83 + $params = $this->request->post("row/a");
  84 + if ($params) {
  85 + foreach ($params as $k => &$v) {
  86 + $v = is_array($v) ? implode(',', $v) : $v;
  87 + }
  88 +
  89 + if ($params['mode'] == 'json') {
  90 + //JSON字段
  91 + $fieldarr = $valuearr = [];
  92 + $field = $this->request->post('field/a');
  93 + $value = $this->request->post('value/a');
  94 + foreach ($field as $k => $v) {
  95 + if ($v != '') {
  96 + $fieldarr[] = $field[$k];
  97 + $valuearr[] = $value[$k];
  98 + }
  99 + }
  100 + $params['value'] = json_encode(array_combine($fieldarr, $valuearr), JSON_UNESCAPED_UNICODE);
  101 + }
  102 + unset($params['mode']);
  103 + try {
  104 + //是否采用模型验证
  105 + if ($this->modelValidate) {
  106 + $name = basename(str_replace('\\', '/', get_class($this->model)));
  107 + $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : true) : $this->modelValidate;
  108 + $row->validate($validate);
  109 + }
  110 + $result = $row->save($params);
  111 + if ($result !== false) {
  112 + $this->success();
  113 + } else {
  114 + $this->error($row->getError());
  115 + }
  116 + } catch (\think\exception\PDOException $e) {
  117 + $this->error($e->getMessage());
  118 + }
  119 + }
  120 + $this->error(__('Parameter %s can not be empty', ''));
  121 + }
  122 + $this->view->assign("row", $row);
  123 + $this->view->assign("value", (array)json_decode($row->value, true));
  124 + return $this->view->fetch();
  125 + }
  126 +
  127 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\wechat;
  4 +
  5 +use addons\wechat\library\Config;
  6 +use app\common\controller\Backend;
  7 +use app\admin\model\WechatResponse;
  8 +use EasyWeChat\Factory;
  9 +use think\Exception;
  10 +
  11 +/**
  12 + * 菜单管理
  13 + *
  14 + * @icon fa fa-list-alt
  15 + */
  16 +class Menu extends Backend
  17 +{
  18 + protected $wechatcfg = null;
  19 +
  20 + public function _initialize()
  21 + {
  22 + parent::_initialize();
  23 + $this->wechatcfg = \app\admin\model\WechatConfig::get(['name' => 'menu']);
  24 + }
  25 +
  26 + /**
  27 + * 查看
  28 + */
  29 + public function index()
  30 + {
  31 + $responselist = array();
  32 + $all = WechatResponse::all();
  33 + foreach ($all as $k => $v) {
  34 + $responselist[$v['eventkey']] = $v['title'];
  35 + }
  36 + $this->view->assign('responselist', $responselist);
  37 + $this->view->assign('menu', (array)json_decode($this->wechatcfg->value, true));
  38 + return $this->view->fetch();
  39 + }
  40 +
  41 + /**
  42 + * 修改
  43 + */
  44 + public function edit($ids = null)
  45 + {
  46 + $menu = $this->request->post("menu");
  47 + $menu = (array)json_decode($menu, true);
  48 + foreach ($menu as $index => &$item) {
  49 + if (isset($item['sub_button'])) {
  50 + foreach ($item['sub_button'] as &$subitem) {
  51 + if ($subitem['type'] == 'view') {
  52 + $allowFields = ['type', 'name', 'url'];
  53 + $subitem = ['type' => $subitem['type'], 'name' => $subitem['name'], 'url' => $subitem['url']];
  54 + } else {
  55 + if ($subitem['type'] == 'miniprogram') {
  56 + $allowFields = ['type', 'name', 'url', 'appid', 'pagepath'];
  57 + $subitem = ['type' => $subitem['type'], 'name' => $subitem['name'], 'url' => $subitem['url'], 'appid' => $subitem['appid'], 'pagepath' => $subitem['pagepath']];
  58 + } else {
  59 + $allowFields = ['type', 'name', 'key'];
  60 + $subitem = ['type' => $subitem['type'], 'name' => $subitem['name'], 'key' => $subitem['key']];
  61 + }
  62 + }
  63 + $subitem = array_intersect_key($subitem, array_flip($allowFields));
  64 + }
  65 + } else {
  66 + if ($item['type'] == 'view') {
  67 + $allowFields = ['type', 'name', 'url'];
  68 + } else {
  69 + if ($item['type'] == 'miniprogram') {
  70 + $allowFields = ['type', 'name', 'url', 'appid', 'pagepath'];
  71 + } else {
  72 + $allowFields = ['type', 'name', 'key'];
  73 + }
  74 + }
  75 + $item = array_intersect_key($item, array_flip($allowFields));
  76 + }
  77 + }
  78 + $this->wechatcfg->value = json_encode($menu, JSON_UNESCAPED_UNICODE);
  79 + $this->wechatcfg->save();
  80 + $this->success();
  81 + }
  82 +
  83 + /**
  84 + * 加载远程菜单
  85 + */
  86 + public function remote()
  87 + {
  88 + $app = Factory::officialAccount(Config::load());
  89 +
  90 + try {
  91 + $list = $app->menu->list();
  92 + } catch (\Exception $e) {
  93 + $this->error($e->getMessage());
  94 + }
  95 + if (isset($list['menu']['button'])) {
  96 + $buttons = $list['menu']['button'];
  97 + foreach ($buttons as $index => &$item) {
  98 + if (isset($item['sub_button'])) {
  99 + if ($item['sub_button']) {
  100 + foreach ($item['sub_button'] as $key => &$value) {
  101 + if (!isset($value['sub_button']) || !$value['sub_button']) {
  102 + unset($value['sub_button']);
  103 + }
  104 + }
  105 + } else {
  106 + unset($item['sub_button']);
  107 + }
  108 + }
  109 + }
  110 + $this->wechatcfg->value = json_encode($buttons, JSON_UNESCAPED_UNICODE);
  111 + $this->wechatcfg->save();
  112 + $this->success();
  113 + } else {
  114 + $this->error("加载菜单失败");
  115 + }
  116 + }
  117 +
  118 + /**
  119 + * 同步到服务器
  120 + */
  121 + public function sync($ids = null)
  122 + {
  123 + $app = Factory::officialAccount(Config::load());
  124 + try {
  125 + $hasError = false;
  126 + $menu = json_decode($this->wechatcfg->value, true);
  127 + foreach ($menu as $k => $v) {
  128 + if (isset($v['sub_button'])) {
  129 + foreach ($v['sub_button'] as $m => $n) {
  130 + if ($n['type'] == 'click' && isset($n['key']) && !$n['key']) {
  131 + $hasError = true;
  132 + break 2;
  133 + }
  134 + }
  135 + } else {
  136 + if ($v['type'] == 'click' && isset($v['key']) && !$v['key']) {
  137 + $hasError = true;
  138 + break;
  139 + }
  140 + }
  141 + }
  142 + if (!$hasError) {
  143 + try {
  144 + $ret = $app->menu->create($menu);
  145 + } catch (\Exception $e) {
  146 + $this->error($e->getMessage());
  147 + }
  148 + if ($ret['errcode'] == 0) {
  149 + $this->success();
  150 + } else {
  151 + $this->error($ret['errmsg']);
  152 + }
  153 + } else {
  154 + $this->error(__('Invalid parameters'));
  155 + }
  156 + } catch (Exception $e) {
  157 + $this->error($e->getMessage());
  158 + }
  159 + }
  160 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\wechat;
  4 +
  5 +use app\common\controller\Backend;
  6 +use addons\wechat\library\Wechat;
  7 +
  8 +/**
  9 + * 资源管理
  10 + *
  11 + * @icon fa fa-list-alt
  12 + */
  13 +class Response extends Backend
  14 +{
  15 +
  16 + protected $model = null;
  17 + protected $searchFields = 'id,title';
  18 +
  19 + public function _initialize()
  20 + {
  21 + parent::_initialize();
  22 + $this->model = model('WechatResponse');
  23 + }
  24 +
  25 + /**
  26 + * 选择素材
  27 + */
  28 + public function select()
  29 + {
  30 + return $this->view->fetch();
  31 + }
  32 +
  33 + /**
  34 + * 添加
  35 + */
  36 + public function add()
  37 + {
  38 + if ($this->request->isPost()) {
  39 + $params = $this->request->post("row/a");
  40 + $params['eventkey'] = isset($params['eventkey']) && $params['eventkey'] ? $params['eventkey'] : uniqid();
  41 + $params['content'] = json_encode($params['content']);
  42 + $params['createtime'] = time();
  43 + if ($params) {
  44 + $this->model->save($params);
  45 + $this->success();
  46 + $this->content = $params;
  47 + }
  48 + $this->error();
  49 + }
  50 + $appConfig = Wechat::appConfig();
  51 + $this->view->applist = $appConfig;
  52 + return $this->view->fetch();
  53 + }
  54 +
  55 + /**
  56 + * 编辑
  57 + */
  58 + public function edit($ids = NULL)
  59 + {
  60 + $row = $this->model->get($ids);
  61 + if (!$row)
  62 + $this->error(__('No Results were found'));
  63 + if ($this->request->isPost()) {
  64 + $params = $this->request->post("row/a");
  65 + $params['eventkey'] = isset($params['eventkey']) && $params['eventkey'] ? $params['eventkey'] : uniqid();
  66 + $params['content'] = json_encode($params['content']);
  67 + if ($params) {
  68 + $row->save($params);
  69 + $this->success();
  70 + }
  71 + $this->error();
  72 + }
  73 + $this->view->assign("row", $row);
  74 + $appConfig = Wechat::appConfig();
  75 + $this->view->applist = $appConfig;
  76 + return $this->view->fetch();
  77 + }
  78 +
  79 +}
  1 +<?php
  2 +
  3 +return [
  4 + 'Text' => '文本',
  5 + 'Event key' => '响应标识',
  6 + 'Remark' => '备注',
  7 + 'Text already exists' => '文本已经存在',
  8 +];
  1 +<?php
  2 +
  3 +return [
  4 + 'name' => '配置名称',
  5 + 'value' => '配置值',
  6 + 'Json key' => '键',
  7 + 'Json value' => '值',
  8 + 'Json editor' => 'JSON编辑器',
  9 + 'Insert link' => '插入链接',
  10 + 'createtime' => '创建时间',
  11 + 'updatetime' => '更新时间'
  12 +];
  1 +<?php
  2 +
  3 +return [
  4 + 'Resource title' => '资源标题',
  5 + 'Event key' => '事件标识',
  6 + 'Event' => '事件标识',
  7 + 'Text' => '文本',
  8 + 'App' => '应用',
  9 +];
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatAutoreply extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use fast\Random;
  6 +use think\Model;
  7 +
  8 +class WechatCaptcha extends Model
  9 +{
  10 +
  11 + // 表名
  12 + protected $name = 'wechat_captcha';
  13 + // 自动写入时间戳字段
  14 + protected $autoWriteTimestamp = 'int';
  15 + // 定义时间戳字段名
  16 + protected $createTime = 'createtime';
  17 + protected $updateTime = '';
  18 + // 追加属性
  19 + protected $append = [
  20 + ];
  21 +
  22 + /**
  23 + * 发送验证码
  24 + * @param $openid string 用户OpenID
  25 + * @param $event string 事件
  26 + * @param $ip string IP地址
  27 + * @return string
  28 + */
  29 + public static function send($openid, $event, $ip)
  30 + {
  31 + $captcha = self::where(['openid' => $openid, 'event' => $event])->whereTime('createtime', '-2 minutes')->find();
  32 + if ($captcha) {
  33 + return "验证码发送速度过快,请稍后重试";
  34 + }
  35 + $code = Random::alnum(4);
  36 + $data = [
  37 + 'event' => $event,
  38 + 'openid' => $openid,
  39 + 'code' => $code,
  40 + 'ip' => $ip,
  41 + ];
  42 + self::create($data);
  43 + return "你的验证码是:{$code},2分钟内输入有效";
  44 + }
  45 +
  46 + /**
  47 + * 检测验证码
  48 + * @param $code string 验证码
  49 + * @param $event string 事件
  50 + * @param $ip string IP
  51 + * @return bool
  52 + */
  53 + public static function check($code, $event, $ip = null)
  54 + {
  55 + $ip = is_null($ip) ? request()->ip() : $ip;
  56 + $captcha = self::where(['ip' => $ip, 'event' => $event])->whereTime('createtime', '-2 minutes')->find();
  57 + if ($captcha && $captcha->code == $code && $captcha->times < 10) {
  58 + $captcha->setInc("times");
  59 + return true;
  60 + }
  61 + //验证大于10次或超时
  62 + if ($captcha && ($captcha->times >= 10 || time() - $captcha->createtime > 120)) {
  63 + $captcha->delete();
  64 + }
  65 +
  66 + return false;
  67 + }
  68 +
  69 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatConfig extends Model
  8 +{
  9 +
  10 + // 表名,不含前缀
  11 + public $name = 'wechat_config';
  12 + // 自动写入时间戳字段
  13 + protected $autoWriteTimestamp = 'int';
  14 + // 定义时间戳字段名
  15 + protected $createTime = 'createtime';
  16 + protected $updateTime = 'updatetime';
  17 + // 追加属性
  18 + protected $append = [
  19 + ];
  20 +
  21 + /**
  22 + * 读取指定配置名称的值
  23 + * @param string $name
  24 + * @return string
  25 + */
  26 + public static function value($name)
  27 + {
  28 + $item = self::get(['name' => $name]);
  29 + return $item ? $item->value : '';
  30 + }
  31 +
  32 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatContext extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class WechatResponse extends Model
  8 +{
  9 +
  10 + // 自动写入时间戳字段
  11 + protected $autoWriteTimestamp = 'int';
  12 + // 定义时间戳字段名
  13 + protected $createTime = 'createtime';
  14 + protected $updateTime = 'updatetime';
  15 +
  16 +}
  1 +<link href="__CDN__/assets/addons/wechat/css/menu.css?v={$site.version}" rel="stylesheet">
  2 +<style>
  3 + .clickbox {margin:0;text-align: left;}
  4 + .create-click {
  5 + margin-left:0;
  6 + }
  7 +</style>
  8 +<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
  9 + <div class="form-group">
  10 + <label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input type="text" name="row[title]" value="" id="c-title" class="form-control" data-rule="required" />
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label for="c-text" class="control-label col-xs-12 col-sm-2">{:__('Text')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <input type="text" name="row[text]" value="" id="c-text" class="form-control" data-rule="required; remote(wechat/autoreply/check_text_unique)" />
  19 + </div>
  20 + </div>
  21 + <div class="form-group">
  22 + <label for="c-eventkey" class="control-label col-xs-12 col-sm-2">{:__('Event key')}:</label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <input type="hidden" name="row[eventkey]" id="c-eventkey" class="form-control" value="" data-rule="required" readonly />
  25 + <div class="clickbox">
  26 + <span class="create-click"><a href="{:url('wechat.response/select')}" id="select-resources"><i class="weixin-icon big-add-gray"></i><strong>选择现有资源</strong></a></span>
  27 + <span class="create-click"><a href="{:url('wechat.response/add')}" id="add-resources"><i class="weixin-icon big-add-gray"></i><strong>添加新资源</strong></a></span>
  28 + </div>
  29 + </div>
  30 + </div>
  31 + <div class="form-group">
  32 + <label for="c-remark" class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
  33 + <div class="col-xs-12 col-sm-8">
  34 + <input type="text" name="row[remark]" value="" id="c-remark" class="form-control" />
  35 + </div>
  36 + </div>
  37 + <div class="form-group">
  38 + <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
  39 + <div class="col-xs-12 col-sm-8">
  40 + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
  41 + </div>
  42 + </div>
  43 + <div class="form-group hide layer-footer">
  44 + <label class="control-label col-xs-12 col-sm-2"></label>
  45 + <div class="col-xs-12 col-sm-8">
  46 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  47 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  48 + </div>
  49 + </div>
  50 +
  51 +</form>
  1 +<link href="__CDN__/assets/addons/wechat/css/menu.css?v={$site.version}" rel="stylesheet">
  2 +<style>
  3 + .clickbox {margin:0;text-align: left;}
  4 + .create-click {
  5 + margin-left:0;
  6 + }
  7 +</style>
  8 +<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
  9 +
  10 + <div class="form-group">
  11 + <label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
  12 + <div class="col-xs-12 col-sm-8">
  13 + <input type="text" name="row[title]" value="{$row.title}" id="c-title" class="form-control" data-rule="required" />
  14 + </div>
  15 + </div>
  16 + <div class="form-group">
  17 + <label for="c-text" class="control-label col-xs-12 col-sm-2">{:__('Text')}:</label>
  18 + <div class="col-xs-12 col-sm-8">
  19 + <input type="text" name="row[text]" value="{$row.text}" id="c-text" class="form-control" data-rule="required; remote(wechat/autoreply/check_text_unique, except={$row.text})" />
  20 + </div>
  21 + </div>
  22 + <div class="form-group">
  23 + <label for="c-eventkey" class="control-label col-xs-12 col-sm-2">{:__('Content')}:</label>
  24 + <div class="col-xs-12 col-sm-8">
  25 + <div class="clickbox">
  26 + <input type="hidden" name="row[eventkey]" id="c-eventkey" class="form-control" value="{$row.eventkey}" data-rule="required" readonly />
  27 + <span class="create-click"><a href="wechat/response/select" id="select-resources"><i class="weixin-icon big-add-gray"></i><strong>选择现有资源</strong></a><div class="keytitle">资源名:{:$response['title']}</div></span>
  28 + <span class="create-click"><a href="wechat/response/add" id="add-resources"><i class="weixin-icon big-add-gray"></i><strong>添加新资源</strong></a></span>
  29 + </div>
  30 + </div>
  31 + </div>
  32 + <div class="form-group">
  33 + <label for="c-remark" class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
  34 + <div class="col-xs-12 col-sm-8">
  35 + <input type="text" name="row[remark]" value="{$row.remark}" id="c-remark" class="form-control" />
  36 + </div>
  37 + </div>
  38 + <div class="form-group">
  39 + <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
  40 + <div class="col-xs-12 col-sm-8">
  41 + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
  42 + </div>
  43 + </div>
  44 + <div class="form-group hide layer-footer">
  45 + <label class="control-label col-xs-12 col-sm-2"></label>
  46 + <div class="col-xs-12 col-sm-8">
  47 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  48 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  49 + </div>
  50 + </div>
  51 +</form>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar()}
  10 + <div class="dropdown btn-group {:$auth->check('wechat/autoreply/multi')?'':'hide'}">
  11 + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
  12 + <ul class="dropdown-menu text-left" role="menu">
  13 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
  14 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
  15 + </ul>
  16 + </div>
  17 + </div>
  18 + <table id="table" class="table table-striped table-bordered table-hover"
  19 + data-operate-edit="{:$auth->check('wechat/autoreply/edit')}"
  20 + data-operate-del="{:$auth->check('wechat/autoreply/del')}"
  21 + width="100%">
  22 + </table>
  23 + </div>
  24 + </div>
  25 +
  26 + </div>
  27 + </div>
  28 +</div>
  1 +<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 + <input type="hidden" name="row[mode]" value="textarea" />
  3 + <div class="form-group">
  4 + <label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label for="c-value" class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <p>
  19 + <a href="javascript:;" class="btn btn-info btn-jsoneditor"><i class="fa fa-pencil"></i> {:__('Json editor')}</a>
  20 + <a href="javascript:;" class="btn btn-primary btn-insertlink"><i class="fa fa-link"></i> {:__('Insert link')}</a>
  21 + </p>
  22 + <textarea id="c-value" class="form-control " rows="15" name="row[value]"></textarea>
  23 + <dl class="fieldlist hide" rel="1">
  24 + <dd>
  25 + <ins>{:__('Json key')}</ins>
  26 + <ins>{:__('Json value')}</ins>
  27 + </dd>
  28 + <dd>
  29 + <input type="text" name="field[0]" class="form-control" id="field-0" value="" size="10" required />
  30 + <input type="text" name="value[0]" class="form-control" id="value-0" value="" size="40" required />
  31 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  32 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  33 + </dd>
  34 + <dd><a href="javascript:;" class="append btn btn-sm btn-success"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
  35 + </dl>
  36 + </div>
  37 + </div>
  38 + <div class="form-group hide layer-footer">
  39 + <label class="control-label col-xs-12 col-sm-2"></label>
  40 + <div class="col-xs-12 col-sm-8">
  41 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  42 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  43 + </div>
  44 + </div>
  45 +</form>
  1 +<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
  2 + <input type="hidden" name="row[mode]" value="textarea" />
  3 + <div class="form-group">
  4 + <label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name}">
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label for="c-title" class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="{$row.title}">
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label for="c-value" class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <textarea id="c-value" class="form-control " rows="15" name="row[value]">{$row.value}</textarea>
  19 + </div>
  20 + </div>
  21 + <div class="form-group hide layer-footer">
  22 + <label class="control-label col-xs-12 col-sm-2"></label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  25 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  26 + </div>
  27 + </div>
  28 +</form>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar()}
  10 + <div class="dropdown btn-group {:$auth->check('wechat/config/multi')?'':'hide'}">
  11 + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
  12 + <ul class="dropdown-menu text-left" role="menu">
  13 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
  14 + <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
  15 + </ul>
  16 + </div>
  17 + </div>
  18 + <table id="table" class="table table-striped table-bordered table-hover"
  19 + data-operate-edit="{:$auth->check('wechat/config/edit')}"
  20 + data-operate-del="{:$auth->check('wechat/config/del')}"
  21 + width="100%">
  22 + </table>
  23 + </div>
  24 + </div>
  25 +
  26 + </div>
  27 + </div>
  28 +</div>
  1 +<link href="__CDN__/assets/addons/wechat/css/menu.css?v={$site['version']}" rel="stylesheet"/>
  2 +<style>
  3 + .form-item dl dt {
  4 + width: 120px;
  5 + }
  6 +
  7 + .form-item dl dd {
  8 + margin-left: 120px;
  9 + }
  10 +
  11 + .form-item dl dd input {
  12 + font-size: 12px;
  13 + }
  14 +</style>
  15 +<div class="panel panel-default panel-intro">
  16 + {:build_heading()}
  17 +
  18 + <div class="panel-body">
  19 + <div id="myTabContent" class="tab-content">
  20 + <div class="tab-pane fade active in" id="one">
  21 + <div class="widget-body no-padding">
  22 + <div class="weixin-menu-setting clearfix">
  23 + <div class="mobile-menu-preview">
  24 + <div class="mobile-head-title">{$site.name}</div>
  25 + <ul class="menu-list" id="menu-list">
  26 + </ul>
  27 + </div>
  28 + <div class="weixin-body">
  29 + <div class="weixin-content" style="display:none">
  30 + <div class="item-info">
  31 + <form id="form-item" class="form-item" data-value="">
  32 + <div class="item-head">
  33 + <h4 id="current-item-name">添加子菜单</h4>
  34 + <div class="item-delete"><a href="javascript:;" id="item_delete">删除菜单</a></div>
  35 + </div>
  36 + <div style="margin-top: 20px;" id="item-body">
  37 +
  38 + </div>
  39 + </form>
  40 + </div>
  41 + </div>
  42 + <div class="no-weixin-content">
  43 + 点击左侧菜单进行编辑操作
  44 + </div>
  45 + </div>
  46 + </div>
  47 +
  48 + <div class="text-center" style="position:relative;">
  49 + <div class="text-danger" style="width:317px;position:absolute;left:0;top:0;">
  50 + <i class="fa fa-lightbulb-o"></i> <small>可直接拖动菜单排序</small>
  51 + </div>
  52 + <div style="padding-left:337px;">
  53 + <a href="javascript:;" id="menuRemote" class="btn btn-success"><i class="fa fa-cloud-download"></i> 加载服务端菜单</a>
  54 + <a href="javascript:;" id="menuSyn" class="btn btn-danger"><i class="fa fa-check"></i> 保存并发布</a>
  55 + </div>
  56 + </div>
  57 + </div>
  58 + </div>
  59 +
  60 + </div>
  61 + </div>
  62 +</div>
  63 +<script type="text/html" id="menutpl">
  64 + <%for(var i=0; i< menu.length; i++){%>
  65 + <%var first=menu[i];%>
  66 + <li id="menu-<%=i%>" class="menu-item" data-type="<%=first['type']%>" data-key="<%=first['key']%>" data-name="<%=first['name']%>" data-url="<%=first['url']%>" data-appid="<%=first['appid']%>" data-pagepath="<%=first['pagepath']%>">
  67 + <a href="javascript:;" class="menu-link">
  68 + <i class="icon-menu-dot"></i> <i class="weixin-icon sort-gray"></i> <span class="title"><%=first['name']%></span>
  69 + </a>
  70 +
  71 + <div class="sub-menu-box" style="display:none;">
  72 + <ul class="sub-menu-list">
  73 + <%if(typeof first['sub_button']!='undefined'){%>
  74 + <%for(var j=0; j< first['sub_button'].length; j++){%>
  75 + <%var second=first['sub_button'][j];%>
  76 + <li id="sub-menu-<%=j%>" class="sub-menu-item" data-type="<%=second['type']%>" data-key="<%=second['key']%>" data-name="<%=second['name']%>" data-url="<%=second['url']%>" data-appid="<%=second['appid']%>" data-pagepath="<%=second['pagepath']%>"><a href="javascript:;"> <i class="weixin-icon sort-gray"></i><span class="sub-title"><%=second['name']%></span></a></li>
  77 + <%}%>
  78 + <%}%>
  79 + <li class="add-sub-item <%if(typeof first['sub_button']!='undefined' && first['sub_button'].length>=5){%>hidden<%}%>"><a href="javascript:;" title="添加子菜单"><span class=" "><i class="weixin-icon add-gray"></i></span></a></li>
  80 + </ul>
  81 + <i class="arrow arrow-out"></i> <i class="arrow arrow-in"></i>
  82 + </div>
  83 + </li>
  84 + <%}%>
  85 + <li class="add-item extra" id="add-item">
  86 + <a href="javascript:;" class="menu-link" title="添加菜单"><i class="weixin-icon add-gray"></i></a>
  87 + </li>
  88 +</script>
  89 +<script type="text/html" id="itemtpl">
  90 + <dl>
  91 + <dt id="current-item-option"><span class="is-sub-item <%=first?'hidden':''%>"></span>菜单标题:</dt>
  92 + <dd>
  93 + <div class="input-box"><input id="item_title" name="name" type="text" value="<%=name%>"></div>
  94 + </dd>
  95 + </dl>
  96 + <%if(!hasChild){%>
  97 + <dl class="is-item">
  98 + <dt id="current-item-type"><span class="is-sub-item <%=first?'hidden':''%>"></span>菜单内容:</dt>
  99 + <dd>
  100 + <%for(var i=0;i< typeList.length; i++){%>
  101 + <input id="type<%=i%>" type="radio" name="type" value="<%=typeList[i]['name']%>" <%=typeList[i]['name']==type?'checked':''%> /><label for="type<%=i%>"><span class="lbl_content"><%=typeList[i]['title']%></span></label>
  102 + <%}%>
  103 + </dd>
  104 + </dl>
  105 + <div id="menu-content" class="is-item">
  106 + <%if(type=='view'){%>
  107 + <div class="viewbox is-view">
  108 + <p class="menu-content-tips">点击该<span class="is-sub-item <%=first?'hidden':''%>"></span>菜单会跳到以下链接</p>
  109 + <dl>
  110 + <dt>页面地址:</dt>
  111 + <dd>
  112 + <div class="input-box"><input type="text" name="url" value="<%=url%>"></div>
  113 + </dd>
  114 + </dl>
  115 + </div>
  116 + <%}%>
  117 + <%if(type!='view'&&type!='miniprogram'){%>
  118 + <div class="clickbox is-click">
  119 + <input type="hidden" name="key" id="key" value="<%=key%>"/>
  120 + <span class="create-click">
  121 + <%if(keytitle){%>
  122 + <div class="keytitle">资源名:<%=keytitle%></div>
  123 + <%}%>
  124 + <a href="{:url('wechat.response/select')}" id="select-resources"><i class="weixin-icon big-add-gray"></i><strong>选择现有资源</strong></a>
  125 + </span>
  126 + <span class="create-click">
  127 + <a href="{:url('wechat.response/add')}" id="add-resources"><i class="weixin-icon big-add-gray"></i><strong>添加新资源</strong></a>
  128 + </span>
  129 + </div>
  130 + <%}%>
  131 + <%if(type=='miniprogram'){%>
  132 + <div class="viewbox is-miniprogram">
  133 + <p class="menu-content-tips">点击该<span class="is-sub-item <%=first?'':'hidden'%>"></span>菜单会跳到以下小程序</p>
  134 + <dl>
  135 + <dt>小程序ID</dt>
  136 + <dd>
  137 + <div class="input-box"><input type="text" id="appid" name="appid" placeholder="在小程序后台获取" value="<%=appid%>"></div>
  138 + </dd>
  139 + </dl>
  140 + <dl>
  141 + <dt>小程序页面路径:</dt>
  142 + <dd>
  143 + <div class="input-box"><input type="text" id="pagepath" name="pagepath" placeholder="小程序页面路径" value="<%=pagepath%>"></div>
  144 + </dd>
  145 + </dl>
  146 + <dl>
  147 + <dt>页面地址:</dt>
  148 + <dd>
  149 + <div class="input-box"><input type="text" name="url" placeholder="页面地址,当不支持小程序时会跳转此页面" value="<%=url%>"></div>
  150 + </dd>
  151 + </dl>
  152 + </div>
  153 + <%}%>
  154 + </div>
  155 + <%}%>
  156 +</script>
  157 +<!--@formatter:off-->
  158 +<script type="text/javascript">
  159 + var menu = {:json_encode($menu, JSON_UNESCAPED_UNICODE)};
  160 + var responselist = {:json_encode($responselist, JSON_UNESCAPED_UNICODE)};
  161 +</script>
  162 +<!--@formatter:on-->
  1 +<form id="add-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
  2 + <div class="form-group">
  3 + <label for="module" class="control-label col-xs-12 col-sm-2">{:__('Resource title')}:</label>
  4 + <div class="col-xs-12 col-sm-8">
  5 + <input type="text" class="form-control" id="title" name="row[title]" value="" data-rule="required" />
  6 + </div>
  7 + </div>
  8 + <div class="form-group">
  9 + <label for="remark" class="control-label col-xs-12 col-sm-2">{:__('Memo')}:</label>
  10 + <div class="col-xs-12 col-sm-8">
  11 + <textarea class="form-control" id="remark" name="row[remark]"></textarea>
  12 + </div>
  13 + </div>
  14 + <div class="form-group">
  15 + <label for="content" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
  16 + <div class="col-xs-12 col-sm-8">
  17 + <input type="radio" name="row[type]" value="text" id="type-text" checked />
  18 + <label for="type-text">{:__('Text')}</label>
  19 + <input type="radio" name="row[type]" value="app" id="type-app" />
  20 + <label for="type-app">{:__('App')}</label>
  21 + </div>
  22 + </div>
  23 + <div id="expand">
  24 +
  25 + </div>
  26 + <div class="form-group">
  27 + <label for="status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
  28 + <div class="col-xs-12 col-sm-8">
  29 + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
  30 + </div>
  31 + </div>
  32 + <div class="form-group {:input('get.callback')?'':'hidden layer-footer'}">
  33 + <div class="col-xs-2"></div>
  34 + <div class="col-xs-12 col-sm-8">
  35 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  36 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  37 + </div>
  38 + </div>
  39 + <select name="applist" disabled="true" class="hidden">
  40 + {foreach $applist as $k => $v}
  41 + <option value="{$k}">{$v.name}</option>
  42 + {/foreach}
  43 + </select>
  44 +</form>
  45 +<script>
  46 + var apps = {:json_encode($applist)};
  47 + var datas = {};
  48 +</script>
  1 +<form id="edit-form" class="form-horizontal form-ajax" role="form" data-toggle="validator" method="POST" action="">
  2 +
  3 + <div class="form-group">
  4 + <label for="module" class="control-label col-xs-12 col-sm-2">{:__('Resource title')}:</label>
  5 + <div class="col-xs-12 col-sm-8">
  6 + <input type="text" class="form-control" id="title" name="row[title]" value="{$row.title}" data-rule="required" />
  7 + </div>
  8 + </div>
  9 + <div class="form-group">
  10 + <label for="controller" class="control-label col-xs-12 col-sm-2">{:__('Event key')}:</label>
  11 + <div class="col-xs-12 col-sm-8">
  12 + <input type='text' class="form-control" id="eventkey" name="row[eventkey]" value="{$row.eventkey}" data-rule="required" readonly />
  13 + </div>
  14 + </div>
  15 + <div class="form-group">
  16 + <label for="remark" class="control-label col-xs-12 col-sm-2">{:__('Memo')}:</label>
  17 + <div class="col-xs-12 col-sm-8">
  18 + <textarea class="form-control" id="remark" name="row[remark]">{$row.remark}</textarea>
  19 + </div>
  20 + </div>
  21 + <div class="form-group">
  22 + <label for="content" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
  23 + <div class="col-xs-12 col-sm-8">
  24 + {:build_radios('row[type]', ['text' => __('Text'), 'app' => __('App')], $row['type'])}
  25 + </div>
  26 + </div>
  27 + <div id="expand">
  28 +
  29 + </div>
  30 + <div class="form-group">
  31 + <div class="col-xs-2"></div>
  32 + <div class="col-xs-12 col-sm-8">
  33 + {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
  34 + </div>
  35 + </div>
  36 + <div class="form-group hidden layer-footer">
  37 + <div class="col-xs-2"></div>
  38 + <div class="col-xs-12 col-sm-8">
  39 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  40 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  41 + </div>
  42 + </div>
  43 + <select name="applist" disabled="true" class="hidden">
  44 + {foreach $applist as $k => $v}
  45 + <option value="{$k}">{$v.name}</option>
  46 + {/foreach}
  47 + </select>
  48 +</form>
  49 +<script>
  50 + var apps = {:json_encode($applist)};
  51 + var datas = {$row.content};
  52 +</script>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar();}
  10 + </div>
  11 + <table id="table" class="table table-bordered table-hover"
  12 + data-operate-edit="{:$auth->check('wechat/response/edit')}"
  13 + data-operate-del="{:$auth->check('wechat/response/del')}"
  14 + width="100%">
  15 + </table>
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <table id="table" class="table table-bordered table-hover" width="100%">
  9 +
  10 + </table>
  11 + </div>
  12 + </div>
  13 +
  14 + </div>
  15 + </div>
  16 +</div>
@@ -87,4 +87,76 @@ class Index extends Api @@ -87,4 +87,76 @@ class Index extends Api
87 return $qrCodeData; 87 return $qrCodeData;
88 } 88 }
89 } 89 }
  90 +
  91 +
  92 + /***
  93 + * 公众号推送审核信息给经纪人
  94 + */
  95 + public function senWxmsgToAgentUser($titdesc="", $remark="")
  96 + {
  97 + $wxopenid="o5ABA4yWDTLRTf3LkBMMHoV7XOvQ";
  98 + $sendInfo = array(
  99 + 'first' => array('value' => urlencode($titdesc), 'color' => "#743A3A"),
  100 + 'keyword1' => array('value' => urlencode(date('Y-m-d H:i:s', time())), 'color' => '#173177'),
  101 + 'keyword2' => array('value' => urlencode('企业入驻'), 'color' => '#173177'),
  102 + 'remark' => array('value' => urlencode($remark), 'color' => '#173177'),
  103 + );
  104 + if ($wxopenid) {
  105 + $config = get_addon_config('wechat');
  106 + $tourl = 'https://fdc.xp.yn.cn/h5/';
  107 + $ywt_appid = 'wx9f73637c6b8f2c47';
  108 + $pagepath = 'pages/home/index';
  109 + $res = $this->sendAstuWxMsgToAgent($sendInfo, $wxopenid, $tourl, $config['app_id'], $config['secret'], $ywt_appid, $pagepath);
  110 + return $res;
  111 + //file_put_contents("pcl_wct_send.log", date("Y-m-d H:i:s") . "1-2-" . json_encode($res, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  112 + }
  113 + }
  114 +
  115 + /**
  116 + * 微信公众号
  117 + * 经纪人审核 消息推送
  118 + */
  119 + function sendAstuWxMsgToAgent($info, $openid, $tourl, $appid, $secret, $ywt_appid, $pagepath)
  120 + {
  121 + $myurl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
  122 +
  123 + $json_token = $this->http_request($myurl);
  124 + $access_tokens = json_decode($json_token, true);
  125 + print_r($access_tokens);return;
  126 +
  127 + $access_token = $access_tokens['access_token'];
  128 +
  129 + $template = array(
  130 + 'touser' => $openid, //
  131 + 'template_id' => 'zQaLnhEOQxdGOKJlDUAfEoNY4NTmNWy9a9vYzkZjGn8', //模板消息id 必须修改
  132 + 'url' => $tourl, //点击链接
  133 + "miniprogram" => [
  134 + "appid" => $ywt_appid,
  135 + "pagepath" => $pagepath
  136 + ],
  137 + 'topcolor' => "#173177",
  138 + 'data' => $info
  139 + );
  140 +
  141 + $json_template = json_encode($template);
  142 + $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $access_token;
  143 + $json = http_request($url, urldecode($json_template));
  144 + $rs = json_decode($json, true);
  145 + return $rs;
  146 + }
  147 + function http_request($url, $data = array())
  148 + {
  149 + $ch = curl_init();
  150 + curl_setopt($ch, CURLOPT_URL, $url);
  151 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  152 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  153 + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  154 + // 我们在POST数据哦!
  155 + curl_setopt($ch, CURLOPT_POST, 1);
  156 + // 把post的变量加上
  157 + curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  158 + $output = curl_exec($ch);
  159 + curl_close($ch);
  160 + return $output;
  161 + }
90 } 162 }
  1 +define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefined, Backend, Form, Table) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'wechat/autoreply/index',
  9 + add_url: 'wechat/autoreply/add',
  10 + edit_url: 'wechat/autoreply/edit',
  11 + del_url: 'wechat/autoreply/del',
  12 + multi_url: 'wechat/autoreply/multi',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + // 初始化表格
  19 + table.bootstrapTable({
  20 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  21 + sortName: 'id',
  22 + columns: [
  23 + [
  24 + {field: 'state', checkbox: true, },
  25 + {field: 'id', title: __('Id')},
  26 + {field: 'title', title: __('Title')},
  27 + {field: 'text', title: __('Text')},
  28 + {field: 'eventkey', title: __('Event key')},
  29 + {field: 'remark', title: __('Remark')},
  30 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  31 + {field: 'updatetime', title: __('Update time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  32 + {field: 'status', title: __('Status'), formatter: Table.api.formatter.status},
  33 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  34 + ]
  35 + ]
  36 + });
  37 +
  38 + // 为表格绑定事件
  39 + Table.api.bindevent(table);
  40 +
  41 + },
  42 + add: function () {
  43 + Controller.api.bindevent();
  44 + },
  45 + edit: function () {
  46 + Controller.api.bindevent();
  47 + },
  48 + api: {
  49 + bindevent: function () {
  50 + Form.api.bindevent($("form[role=form]"));
  51 +
  52 + var refreshkey = function (data) {
  53 + $("input[name='row[eventkey]']").val(data.eventkey).trigger("change");
  54 + Layer.closeAll();
  55 + var keytitle = data.title;
  56 + var cont = $(".clickbox .create-click:first");
  57 + $(".keytitle", cont).remove();
  58 + if (keytitle) {
  59 + cont.append('<div class="keytitle">' + __('Event key') + ':' + keytitle + '</div>');
  60 + }
  61 + };
  62 + $(document).on('click', "#select-resources", function () {
  63 + var key = $("input[name='row[eventkey]']").val();
  64 + parent.Backend.api.open($(this).attr("href") + "?key=" + key, __('Select'), {callback: refreshkey});
  65 + return false;
  66 + });
  67 +
  68 + $(document).on('click', "#add-resources", function () {
  69 + parent.Backend.api.open($(this).attr("href") + "?key=", __('Add'), {callback: refreshkey});
  70 + return false;
  71 + });
  72 + }
  73 + }
  74 +
  75 + };
  76 + return Controller;
  77 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'wechat/config/index',
  9 + add_url: 'wechat/config/add',
  10 + edit_url: 'wechat/config/edit',
  11 + del_url: 'wechat/config/del',
  12 + multi_url: 'wechat/config/multi',
  13 + table: 'wechat_config',
  14 + }
  15 + });
  16 +
  17 + var table = $("#table");
  18 +
  19 + // 初始化表格
  20 + table.bootstrapTable({
  21 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  22 + pk: 'id',
  23 + sortName: 'id',
  24 + columns: [
  25 + [
  26 + {field: 'state', checkbox: true},
  27 + {field: 'id', title: __('Id')},
  28 + {field: 'name', title: __('Name')},
  29 + {field: 'title', title: __('Title')},
  30 + {field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  31 + {field: 'updatetime', title: __('Updatetime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  32 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  33 + ]
  34 + ]
  35 + });
  36 +
  37 + // 为表格绑定事件
  38 + Table.api.bindevent(table);
  39 + },
  40 + add: function () {
  41 + Controller.api.bindevent();
  42 + },
  43 + edit: function () {
  44 + Controller.api.bindevent();
  45 + },
  46 + api: {
  47 + bindevent: function () {
  48 + Form.api.bindevent($("form[role=form]"));
  49 + $("input[name='row[type]']:checked").trigger("click");
  50 + }
  51 + }
  52 + };
  53 + return Controller;
  54 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'sortable'], function ($, undefined, Backend, Table, Form, Sortable) {
  2 + var Controller = {
  3 + index: function () {
  4 + var typeList = [
  5 + {name: "click", title: "发送消息"},
  6 + {name: "view", title: "跳转网页"},
  7 + {name: "miniprogram", title: "跳转小程序"},
  8 + {name: "scancode_push", title: "扫码推"},
  9 + {name: "scancode_waitmsg", title: "扫码推提示框"},
  10 + {name: "pic_sysphoto", title: "拍照发图"},
  11 + {name: "pic_photo_or_album", title: "拍照相册发图"},
  12 + {name: "pic_weixin", title: "相册发图"},
  13 + {name: "location_select", title: "地理位置选择"},
  14 + ];
  15 + String.prototype.subByte = function (start, bytes) {
  16 + for (var i = start; bytes > 0; i++) {
  17 + var code = this.charCodeAt(i);
  18 + bytes -= code < 256 ? 1 : 2;
  19 + }
  20 + return this.slice(start, i + bytes)
  21 + };
  22 +
  23 + //初始化菜单
  24 + $("#menu-list").prepend(Template("menutpl", {menu: menu}));
  25 +
  26 + //拖动排序
  27 + new Sortable($("#menu-list")[0], {
  28 + draggable: 'li.menu-item',
  29 + onEnd: function () {
  30 + updateChangeMenu();
  31 + }
  32 + });
  33 +
  34 + //子菜单拖动排序
  35 + $(".sub-menu-list").each(function () {
  36 + new Sortable(this, {
  37 + draggable: 'li.sub-menu-item',
  38 + onEnd: function () {
  39 + updateChangeMenu();
  40 + }
  41 + });
  42 + });
  43 +
  44 + //添加主菜单
  45 + $(document).on('click', '#add-item', function () {
  46 + var menu_item_total = $(".menu-item").size();
  47 + if (menu_item_total < 3) {
  48 + var item = '<li class="menu-item" data-type="click" data-key="" data-name="添加菜单" > <a href="javascript:;" class="menu-link"> <i class="icon-menu-dot"></i> <i class="weixin-icon sort-gray"></i> <span class="title">添加菜单</span> </a> <div class="sub-menu-box" style=""> <ul class="sub-menu-list"><li class=" add-sub-item"><a href="javascript:;" title="添加子菜单"><span class=" "><i class="weixin-icon add-gray"></i></span></a></li> </ul> <i class="arrow arrow-out"></i> <i class="arrow arrow-in"></i> </div></li>';
  49 + var itemDom = $(item);
  50 + itemDom.insertBefore(this);
  51 + itemDom.trigger("click");
  52 + $("#item_title").focus().select();
  53 + $(".sub-menu-box", itemDom).show();
  54 + updateChangeMenu();
  55 + new Sortable($(".sub-menu-list", itemDom)[0], {draggable: 'li.sub-menu-item'});
  56 + }
  57 + });
  58 +
  59 + //切换类型
  60 + $(document).on('change', 'input[name=type]', function () {
  61 + $(".sub-menu-item.current,.menu-item.current").data("type", $(this).val()).trigger("click");
  62 + });
  63 +
  64 + //删除菜单
  65 + $(document).on('click', '#item_delete', function () {
  66 + var current = $("#menu-list li.current");
  67 + var prev = current.prev("li[data-type]");
  68 + var next = current.next("li[data-type]");
  69 +
  70 + if (prev.size() == 0 && next.size() == 0 && $(".sub-menu-box", current).size() == 0) {
  71 + last = current.closest(".menu-item");
  72 + } else if (prev.size() > 0 || next.size() > 0) {
  73 + last = prev.size() > 0 ? prev : next;
  74 + } else {
  75 + last = null;
  76 + $(".weixin-content").hide();
  77 + $(".no-weixin-content").show();
  78 + }
  79 + if (current.hasClass("sub-menu-item")) {
  80 + $(".add-sub-item", current.parent()).removeClass("hidden");
  81 + }
  82 + current.remove();
  83 + if (last) {
  84 + last.trigger('click');
  85 + } else {
  86 + $("input[name='name']").val('');
  87 + }
  88 +
  89 + updateChangeMenu();
  90 + });
  91 +
  92 + //更新修改与变动
  93 + var updateChangeMenu = function () {
  94 + var item = $("#menu-list li.current");
  95 + var values = $("#form-item").serializeArray();
  96 + $.each(values, function (i, j) {
  97 + if (j.name == 'name') {
  98 + $(">a", item).html(j.value);
  99 + }
  100 + item.data(j.name, j.value);
  101 + });
  102 + menuUpdate();
  103 + };
  104 +
  105 + //更新菜单数据
  106 + var menuUpdate = function () {
  107 + $.post("wechat/menu/edit", {menu: JSON.stringify(getMenuList())}, function (data) {
  108 + if (data['code'] == 1) {
  109 + } else {
  110 + Toastr.error(__('Operation failed'));
  111 + }
  112 + }, 'json');
  113 + };
  114 +
  115 + //获取菜单数据
  116 + var getMenuList = function () {
  117 + var menus = [];
  118 + var sub_button = [];
  119 + var menu_i = 0;
  120 + var sub_menu_i = 0;
  121 + var item;
  122 + $("#menu-list li").each(function (i) {
  123 + item = $(this);
  124 + var name = item.data('name');
  125 + if (name != null) {
  126 + if (item.hasClass('menu-item')) {
  127 + sub_menu_i = 0;
  128 + if (item.find('.sub-menu-item').size() > 0) {
  129 + menus[menu_i] = {"name": name, "sub_button": "sub_button"}
  130 + } else {
  131 + menus[menu_i] = $(this).data();
  132 + }
  133 + if (menu_i > 0) {
  134 + menus[menu_i - 1]['sub_button'] = menus[menu_i - 1]['sub_button'] == "sub_button" ? sub_button : menus[menu_i - 1]['sub_button'];
  135 + }
  136 + sub_button = [];
  137 + menu_i++;
  138 + } else {
  139 + sub_button[sub_menu_i++] = $(this).data();
  140 + }
  141 + }
  142 + });
  143 + if (sub_button.length > 0) {
  144 + var len = menus.length;
  145 + menus[len - 1]['sub_button'] = sub_button;
  146 + }
  147 + return menus;
  148 + };
  149 +
  150 + //添加子菜单
  151 + $(document).on('click', ".add-sub-item", function () {
  152 + var sub_menu_item_total = $(this).parent().find(".sub-menu-item").size();
  153 + if (sub_menu_item_total < 5) {
  154 + var item = '<li class="sub-menu-item" data-type="click" data-key="" data-name="添加子菜单"><a href="javascript:;"><span class=" "><i class="weixin-icon sort-gray"></i><span class="sub-title">添加子菜单</span></span></a></li>';
  155 + var itemDom = $(item);
  156 + itemDom.insertBefore(this);
  157 + itemDom.trigger("click");
  158 + $("#item_title").focus().select();
  159 + updateChangeMenu();
  160 + if (sub_menu_item_total == 4) {
  161 + $(this).addClass("hidden");
  162 + }
  163 + }
  164 + return false;
  165 + });
  166 +
  167 + //主菜单子菜单点击事件
  168 + $(document).on('click', ".menu-item, .sub-menu-item", function () {
  169 + var hasChild = $(".sub-menu-item", this).size() > 0 ? true : false;
  170 + if ($(this).hasClass("sub-menu-item")) {
  171 + $("#menu-list li").removeClass('current');
  172 + } else {
  173 + $("#menu-list li").removeClass('current');
  174 + $("#menu-list > li").not(this).find(".sub-menu-box").hide();
  175 + $(".sub-menu-box", this).toggle();
  176 + }
  177 + $(this).addClass('current');
  178 +
  179 + var data = $.extend({}, $(this).data());
  180 + data.keytitle = data.key && typeof responselist[data.key] != 'undefined' ? responselist[data.key] : '';
  181 + data.typeList = typeList;
  182 + data.hasChild = hasChild;
  183 + data.first = $(this).hasClass("menu-item") ? true : false;
  184 + $(".weixin-content").show();
  185 + $(".no-weixin-content").hide();
  186 + $("#item-body").html(Template("itemtpl", data));
  187 +
  188 + return false;
  189 + });
  190 +
  191 + //触发保存
  192 + $("form#form-item").on('change', "input,textarea", function () {
  193 + updateChangeMenu();
  194 + });
  195 +
  196 + //加载远程菜单
  197 + $(document).on('click', "#menuRemote", function () {
  198 + Layer.confirm("确认加载远程微信服务端菜单?<br>本地菜单将会被覆盖!!!", {icon: 3}, function () {
  199 + $.post("wechat/menu/remote", {}, function (ret) {
  200 + var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
  201 + if (ret.code == 1) {
  202 + Layer.closeAll();
  203 + Layer.alert('远程菜单覆盖成功!点击确定刷新页面!', {icon: 1}, function () {
  204 + location.reload();
  205 + });
  206 + } else {
  207 + Backend.api.toastr.error(msg ? msg : __('Operation failed'));
  208 + }
  209 + }, 'json');
  210 + });
  211 + return false;
  212 + });
  213 +
  214 + //点击同步
  215 + $(document).on('click', "#menuSyn", function () {
  216 + $.post("wechat/menu/sync", {}, function (ret) {
  217 + var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
  218 + if (ret.code == 1) {
  219 + Backend.api.toastr.success('菜单同步更新成功,生效时间请查看微信官网说明,或你重新关注公众号!');
  220 + } else {
  221 + Backend.api.toastr.error(msg ? msg : __('Operation failed'));
  222 + }
  223 + }, 'json');
  224 + });
  225 +
  226 + //刷新资源
  227 + var refreshkey = function (data) {
  228 + responselist[data.eventkey] = data.title;
  229 + $("input[name=key]").val(data.eventkey).trigger("change");
  230 + $("#menu-list li.current").trigger("click");
  231 + Layer.closeAll();
  232 + };
  233 +
  234 + //选择资源
  235 + $(document).on('click', "#select-resources", function () {
  236 + var key = $("#key").val();
  237 + Backend.api.open($(this).attr("href") + "?key=" + key, __('Select'), {
  238 + callback: refreshkey
  239 + });
  240 + return false;
  241 + });
  242 +
  243 + //添加资源
  244 + $(document).on('click', "#add-resources", function () {
  245 + Backend.api.open($(this).attr("href") + "?key=" + key, __('Add'), {
  246 + callback: refreshkey
  247 + });
  248 + return false;
  249 + });
  250 +
  251 + $("#menu-list li.menu-item:first").trigger("click");
  252 + },
  253 + add: function () {
  254 + Form.api.bindevent($("form[role=form]"));
  255 + },
  256 + edit: function () {
  257 + Form.api.bindevent($("form[role=form]"));
  258 + }
  259 + };
  260 + return Controller;
  261 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'adminlte'], function ($, undefined, Backend, Table, Form, Adminlte) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'wechat/response/index',
  9 + add_url: 'wechat/response/add',
  10 + edit_url: 'wechat/response/edit',
  11 + del_url: 'wechat/response/del',
  12 + multi_url: 'wechat/response/multi',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + // 初始化表格
  19 + table.bootstrapTable({
  20 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  21 + sortName: 'id',
  22 + columns: [
  23 + [
  24 + {field: 'state', checkbox: true,},
  25 + {field: 'id', title: 'ID'},
  26 + {field: 'type', title: __('Type')},
  27 + {field: 'title', title: __('Resource title')},
  28 + {field: 'eventkey', title: __('Event key')},
  29 + {field: 'status', title: __('Status'), formatter: Table.api.formatter.status, operate: false},
  30 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  31 + ]
  32 + ]
  33 + });
  34 +
  35 + // 为表格绑定事件
  36 + Table.api.bindevent(table);
  37 + },
  38 + select: function () {
  39 + // 初始化表格参数配置
  40 + Table.api.init({
  41 + extend: {
  42 + index_url: 'wechat/response/index',
  43 + }
  44 + });
  45 +
  46 + var table = $("#table");
  47 +
  48 + // 初始化表格
  49 + table.bootstrapTable({
  50 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  51 + sortName: 'id',
  52 + columns: [
  53 + [
  54 + {field: 'state', checkbox: true,},
  55 + {field: 'id', title: 'ID'},
  56 + {field: 'type', title: __('Type')},
  57 + {field: 'title', title: __('Title')},
  58 + {field: 'eventkey', title: __('Event key')},
  59 + {field: 'status', title: __('Status'), formatter: Table.api.formatter.status, operate: false},
  60 + {
  61 + field: 'operate', title: __('Operate'), events: {
  62 + 'click .btn-chooseone': function (e, value, row, index) {
  63 + Fast.api.close(row);
  64 + },
  65 + }, formatter: function () {
  66 + return '<a href="javascript:;" class="btn btn-danger btn-chooseone btn-xs"><i class="fa fa-check"></i> ' + __('Choose') + '</a>';
  67 + }
  68 + }
  69 + ]
  70 + ]
  71 + });
  72 +
  73 + // 为表格绑定事件
  74 + Table.api.bindevent(table);
  75 + },
  76 + add: function () {
  77 + Form.api.bindevent($("form[role=form]"), function (data) {
  78 + Fast.api.close(data);
  79 + });
  80 + Controller.api.bindevent();
  81 + },
  82 + edit: function () {
  83 + Form.api.bindevent($("form[role=form]"));
  84 + Controller.api.bindevent();
  85 + },
  86 + api: {
  87 + bindevent: function () {
  88 + var getAppFileds = function (id) {
  89 + var app = apps[id];
  90 + var appConfig = app['config'];
  91 + var str = '';
  92 + for (var i in appConfig) {
  93 + var type = appConfig[i]['type'];
  94 + var field = appConfig[i]['field'];
  95 + var caption = appConfig[i]['caption'];
  96 + var defaultvalue = typeof appConfig[i]['defaultvalue'] != 'undefined' ? appConfig[i]['defaultvalue'] : '';
  97 + if (type == 'text' || type == 'textarea') {
  98 + if (type == 'textarea') {
  99 + str += '<div class="form-group"><label for="content" class="control-label col-xs-12 col-sm-2">' + caption + ':</label><div class="col-xs-12 col-sm-8"><textarea ' + appConfig[i]['extend'] + ' class="form-control" name="row[content][' + field + ']" data-rule="' + appConfig[i]['rule'] + '">' + defaultvalue + '</textarea> </div> </div>';
  100 + } else {
  101 + str += '<div class="form-group"><label for="content" class="control-label col-xs-12 col-sm-2">' + caption + ':</label><div class="col-xs-12 col-sm-8"><input ' + appConfig[i]['extend'] + ' class="form-control" name="row[content][' + field + ']" type="text" value="' + defaultvalue + '" data-rule="' + appConfig[i]['rule'] + '"> </div> </div>';
  102 + }
  103 + } else {
  104 + var options = appConfig[i]['options'];
  105 + var html = '';
  106 + if (type == 'select') {
  107 + for (var j in options) {
  108 + html += '<option value="' + j + '">' + options[j] + '</option>';
  109 + }
  110 + html = '<select ' + appConfig[i]['extend'] + ' class="form-control" name="row[content][' + field + ']">' + html + '</select>';
  111 + } else if (type == 'checkbox') {
  112 + for (var j in options) {
  113 + html += '<input type="checkbox" name="row[content][' + field + '][]" value="' + j + '"> <span>' + options[j] + '</span> ';
  114 + }
  115 +
  116 + } else if (type == 'radio') {
  117 + var index = 0;
  118 + for (var j in options) {
  119 + html += '<input type="radio" name="row[content][' + field + ']" value="' + j + '" ' + (index == 0 ? 'checked' : '') + '> <span>' + options[j] + '</span> ';
  120 + index++;
  121 + }
  122 + }
  123 + str += '<div class="form-group"><label for="content" class="control-label col-xs-12 col-sm-2">' + caption + ':</label><div class="col-xs-12 col-sm-8">' + html + ' </div> </div>';
  124 + }
  125 +
  126 + }
  127 + return str;
  128 + };
  129 + $(document).on('change', "#app", function () {
  130 + var app = $(this).val();
  131 + $("#appfields").html(getAppFileds(app));
  132 + if (datas.app == app) {
  133 + delete (datas.app);
  134 + var form = $("form.form-ajax");
  135 + $.each(datas, function (i, j) {
  136 + console.log(i, j);
  137 + form.field("row[content][" + i + "]" + ($("input[name='row[content][" + i + "][]']", form).size() > 0 ? '[]' : ''), j);
  138 + });
  139 + }
  140 + Form.api.bindevent("#appfields");
  141 + });
  142 + $(document).on('click', "input[name='row[type]']", function () {
  143 + var type = $(this).val();
  144 + if (type == 'text') {
  145 + $("#expand").html('<div class="form-group"><label for="content" class="control-label col-xs-12 col-sm-2">文本内容:</label><div class="col-xs-12 col-sm-8"><textarea class="form-control" name="row[content][content]" data-rule="required"></textarea></div></div>');
  146 + $("form[role='form']").field("row[content][content]", datas.content);
  147 + } else if (type == 'app') {
  148 + $("#expand").html('<div class="form-group"><label for="content" class="control-label col-xs-12 col-sm-2">应用:</label><div class="col-xs-12 col-sm-8"><select class="form-control" name="row[content][app]" id="app">' + $("select[name=applist]").html() + '</select></div></div><div id="appfields"><div>');
  149 + $("form[role='form']").field("row[content][app]", datas.app);
  150 + $("#app").trigger('change');
  151 + }
  152 + });
  153 + $("input[name='row[type]']:checked").trigger("click");
  154 + }
  155 + }
  156 + };
  157 + return Controller;
  158 +});