作者 郭文星

123

要显示太多修改。

为保证性能只显示 32 of 32+ 个文件。

  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 +}