Message.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace app\model\message;
  11. use addon\wechat\model\Wechat;
  12. use app\model\BaseModel;
  13. use app\model\shop\Shop;
  14. use app\model\system\Site;
  15. use think\facade\Db;
  16. use think\facade\Queue;
  17. /**
  18. * 消息管理类
  19. */
  20. class Message extends BaseModel
  21. {
  22. /********************************************************************* 平台消息类型 start *********************************************************************************/
  23. function editMessage($data, $condition)
  24. {
  25. $count = model('message')->getCount($condition);
  26. if ($count > 0) {
  27. $res = model('message')->update($data, $condition);
  28. } else {
  29. $res = model('message')->add($data);
  30. }
  31. return $this->success($res);
  32. }
  33. /**
  34. * 编辑微信模板消息是否启动
  35. * @param $is_open
  36. * @param $condition
  37. */
  38. public function modifyMessageWechatIsOpen($is_open, $condition)
  39. {
  40. $check_condition = array_column($condition, 2, 0);
  41. $keywords = isset($check_condition[ 'keywords' ]) ? $check_condition[ 'keywords' ] : '';
  42. if ($keywords === '') {
  43. return $this->error('', 'REQUEST_KEYWORDS');
  44. }
  45. $data = array (
  46. "wechat_is_open" => $is_open
  47. );
  48. $res = model('message')->update($data, $condition);
  49. if ($res === false) {
  50. return $this->error('', 'UNKNOW_ERROR');
  51. }
  52. return $this->success($res);
  53. }
  54. /**
  55. * 消息模本信息
  56. * @param $condition
  57. * @param string $field
  58. * @return \multitype
  59. */
  60. public function getMessageInfo($site_id, $keywords, $field = "*")
  61. {
  62. $info = model("message_template")->getInfo([ [ 'keywords', '=', $keywords ] ], $field);
  63. if (!empty($info)) {
  64. $info[ "message_json_array" ] = empty($info[ "message_json" ]) ? [] : json_decode($info[ "message_json" ], true);//消息配置
  65. $info[ "sms_json_array" ] = event('SmsTemplateInfo', [ 'keywords' => $keywords, 'site_id' => $site_id ], true);//短信配置
  66. $info[ "wechat_json_array" ] = empty($info[ "wechat_json" ]) ? [] : json_decode($info[ "wechat_json" ], true);//微信模板消息配置
  67. $info[ "weapp_json_array" ] = empty($info[ "weapp_json" ]) ? [] : json_decode($info[ "weapp_json" ], true);//微信小程序订阅消息配置
  68. $info[ "aliapp_json_array" ] = empty($info[ "aliapp_json" ]) ? [] : json_decode($info[ "aliapp_json" ], true);//支付宝小程序订阅消息配置
  69. $message = model('message')->getInfo([ [ 'keywords', '=', $keywords ], [ 'site_id', '=', $site_id ] ]);
  70. if (empty($message)) {
  71. $data = [
  72. 'keywords' => $keywords,
  73. 'site_id' => $site_id,
  74. 'sms_is_open' => 0,
  75. ];
  76. model('message')->add($data);
  77. $message = model('message')->getInfo([ [ 'keywords', '=', $keywords ], [ 'site_id', '=', $site_id ] ]);
  78. }
  79. $info = array_merge($info, $message);
  80. }
  81. return $this->success($info);
  82. }
  83. /**
  84. * 获取消息详情
  85. * @param array $condition
  86. * @param string $field
  87. * @return array
  88. */
  89. public function getMessageDetail($site_id, $keywords, $field = "*")
  90. {
  91. $message = model('message')->getInfo([ [ 'keywords', '=', $keywords ], [ 'site_id', '=', $site_id ] ], $field);
  92. if (empty($message)) {
  93. $data = [
  94. 'keywords' => $keywords,
  95. 'site_id' => $site_id,
  96. 'sms_is_open' => 0
  97. ];
  98. model('message')->add($data);
  99. $message = model('message')->getInfo([ [ 'keywords', '=', $keywords ], [ 'site_id', '=', $site_id ] ], $field);
  100. return $this->success($message);
  101. }
  102. return $this->success($message);
  103. }
  104. /**
  105. * 消息列表
  106. * @param array $condition
  107. * @param bool $field
  108. * @param string $order
  109. * @param null $limit
  110. */
  111. public function getMessageList($site_id = 0, $message_type = 1, $field = '*', $order = '', $limit = null)
  112. {
  113. $field = 'nmt.id, nmt.addon, nmt.keywords, nmt.title, nmt.message_type, nmt.message_json, nmt.sms_addon, nmt.sms_json, nmt.sms_content, nmt.wechat_json, nmt.aliapp_json
  114. , nmt.weapp_json, nmt.aliapp_json, nmt.support_type, nmt.remark, nm.sms_is_open, nm.wechat_is_open, nm.wechat_template_id, nm.weapp_is_open, nm.weapp_template_id, nm.aliapp_is_open, nm.aliapp_template_id';
  115. switch ( $message_type ) {
  116. case 1:
  117. $order = Db::raw("field(nmt.keywords,'REGISTER_CODE','LOGIN_CODE','SET_PASSWORD','FIND_PASSWORD','MEMBER_BIND',
  118. 'USER_CANCEL_SUCCESS','USER_CANCEL_FAIL','ORDER_URGE_PAYMENT','ORDER_CLOSE','ORDER_PAY',
  119. 'ORDER_DELIVERY','ORDER_COMPLETE','ORDER_VERIFY_OUT_TIME','VERIFY_CODE_EXPIRE','VERIFY',
  120. 'ORDER_REFUND_AGREE','ORDER_REFUND_REFUSE','USER_WITHDRAWAL_SUCCESS','USER_BALANCE_CHANGE_NOTICE'
  121. ,'COMMISSION_GRANT','FENXIAO_WITHDRAWAL_SUCCESS','FENXIAO_WITHDRAWAL_ERROR','BARGAIN_COMPLETE', 'PINTUAN_COMPLETE', 'PINTUAN_FAIL', 'SECKILL_START')");
  122. break;
  123. case 2:
  124. $order = Db::raw("field(nmt.keywords,'BUYER_PAY','BUYER_ORDER_COMPLETE','BUYER_REFUND','BUYER_DELIVERY_REFUND',
  125. 'USER_WITHDRAWAL_APPLY','FENXIAO_WITHDRAWAL_APPLY','USER_CANCEL_APPLY')");
  126. break;
  127. }
  128. $join = [
  129. ['message nm', 'nmt.keywords = nm.keywords', 'left']
  130. ];
  131. $list = model('message_template')->getList([ [ "nmt.message_type", "=", $message_type ] ], $field, $order, 'nmt', $join, '', $limit);
  132. if (!empty($list)) {
  133. foreach ($list as $k => $v) {
  134. $list[ $k ][ 'support_type' ] = explode(',', $v[ 'support_type' ]);
  135. $list[ $k ][ 'sms_is_open' ] = $v['sms_is_open'] == null ? 0 : $v[ 'sms_is_open' ];
  136. $list[ $k ][ 'wechat_is_open' ] = $v['wechat_is_open'] == null ? 0 : $v[ 'wechat_is_open' ];
  137. $list[ $k ][ 'weapp_is_open' ] = $v['weapp_is_open'] == null ? 0 : $v[ 'weapp_is_open' ];
  138. $list[ $k ][ 'aliapp_is_open' ] = $v['aliapp_is_open'] == null ? 0 : $v[ 'aliapp_is_open' ];
  139. }
  140. }
  141. return $this->success($list);
  142. }
  143. /**
  144. * 消息分页列表
  145. * @param array $condition
  146. * @param int $page
  147. * @param int $page_size
  148. * @param string $order
  149. * @param string $field
  150. * @return \multitype
  151. */
  152. public function getMessagePageList($condition = [], $site_id = 0, $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
  153. {
  154. $list = model('message_template')->pageList($condition, $field, $order, $page, $page_size);
  155. if ($site_id > 0) {
  156. if (!empty($list[ 'list' ])) {
  157. foreach ($list[ 'list' ] as $k => $v) {
  158. $message_info = model('message')->getInfo([ [ "keywords", "=", $v[ 'keywords' ] ], [ 'site_id', '=', $site_id ] ], 'wechat_is_open,wechat_template_id');
  159. $list[ 'list' ][ $k ][ 'wechat_is_open' ] = $message_info == null ? 0 : $message_info[ 'wechat_is_open' ];
  160. $list[ 'list' ][ $k ][ 'wechat_template_id' ] = $message_info == null ? 0 : $message_info[ 'wechat_template_id' ];
  161. }
  162. }
  163. }
  164. return $this->success($list);
  165. }
  166. /**
  167. * 获取微信模板消息id
  168. * @param string $keywords
  169. * todo 批量获取模板消息
  170. */
  171. public function getWechatTemplateNo(string $keywords, $site_id, $wechat_is_open = 0)
  172. {
  173. $keyword = explode(',', $keywords);
  174. $wechat = new Wechat($site_id);
  175. if ($wechat_is_open == 1) {
  176. // 启用
  177. foreach ($keyword as $item) {
  178. $shop_message = model('message')->getInfo([ [ 'keywords', '=', $item ], [ "site_id", "=", $site_id ] ], 'wechat_template_id');
  179. $data = [
  180. 'wechat_is_open' => $wechat_is_open,
  181. 'site_id' => $site_id,
  182. 'keywords' => $item,
  183. ];
  184. // 开启时没有模板则进行添加
  185. if (!empty($shop_message)) {
  186. if (empty($shop_message[ 'wechat_template_id' ])) {
  187. $template_info = model('message_template')->getInfo([ [ 'keywords', '=', $item ], [ 'wechat_json', '<>', '' ] ], 'wechat_json');
  188. if (!empty($template_info)) {
  189. $template = json_decode($template_info[ 'wechat_json' ], true);
  190. $res = $wechat->getTemplateId($template[ 'template_id_short' ]);
  191. if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] == 0) {
  192. $data[ 'wechat_template_id' ] = $res[ 'template_id' ];
  193. } else {
  194. return $this->error($res, $res[ 'errmsg' ]);
  195. }
  196. }
  197. }
  198. model('message')->update($data, [ [ 'keywords', '=', $item ], [ "site_id", "=", $site_id ] ]);
  199. } else {
  200. $template_info = model('message_template')->getInfo([ [ 'keywords', '=', $item ], [ 'wechat_json', '<>', '' ] ], 'wechat_json');
  201. if (!empty($template_info)) {
  202. $template = json_decode($template_info[ 'wechat_json' ], true);
  203. $res = $wechat->getTemplateId($template[ 'template_id_short' ]);
  204. if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] == 0) {
  205. $data[ 'wechat_template_id' ] = $res[ 'template_id' ];
  206. } else {
  207. return $this->error($res, $res[ 'errmsg' ]);
  208. }
  209. }
  210. model('message')->add($data);
  211. }
  212. }
  213. } else if ($wechat_is_open == 0) {
  214. // 关闭
  215. foreach ($keyword as $item) {
  216. $shop_message = model('message')->getInfo([ [ 'keywords', '=', $item ], [ "site_id", "=", $site_id ] ], 'wechat_template_id');
  217. if (!empty($shop_message)) {
  218. $update_data = [ 'wechat_is_open' => $wechat_is_open ];
  219. if($shop_message[ 'wechat_template_id' ]){
  220. $res = $wechat->deleteTemplate($shop_message[ 'wechat_template_id' ]);
  221. if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] == 0) {
  222. $update_data[ 'wechat_template_id' ] = '';
  223. }else{
  224. return $this->error($res, $res[ 'errmsg' ]);
  225. }
  226. }
  227. model('message')->update($update_data, [ [ 'keywords', '=', $item ], [ "site_id", "=", $site_id ] ]);
  228. } else {
  229. model('message')->add([
  230. 'site_id' => $site_id,
  231. 'keywords' => $item,
  232. 'wechat_is_open' => $wechat_is_open
  233. ]);
  234. }
  235. }
  236. } else {
  237. // 获取
  238. $list = model('message_template')->getList([ [ 'keywords', 'in', $keyword ], [ 'wechat_json', '<>', '' ] ], 'keywords,wechat_json');
  239. if (!empty($list)) {
  240. foreach ($list as $item) {
  241. $template = json_decode($item[ 'wechat_json' ], true);
  242. $res = $wechat->getTemplateId($template[ 'template_id_short' ]);
  243. if (isset($res[ 'errcode' ]) && $res[ 'errcode' ] != 0) return $this->error($res, $res[ 'errmsg' ]);
  244. $shop_message = model('message')->getInfo([ [ 'keywords', '=', $item[ 'keywords' ] ], [ "site_id", "=", $site_id ] ], 'wechat_template_id');
  245. if (!empty($shop_message)) {
  246. model('message')->update([ 'wechat_template_id' => $res[ 'template_id' ] ], [ [ 'keywords', '=', $item[ 'keywords' ] ], [ "site_id", "=", $site_id ] ]);
  247. } else {
  248. model('message')->add([
  249. 'site_id' => $site_id,
  250. 'keywords' => $item[ 'keywords' ],
  251. 'wechat_template_id' => $res[ 'template_id' ]
  252. ]);
  253. }
  254. }
  255. }
  256. }
  257. return $this->success();
  258. }
  259. /********************************************************************* 平台消息类型 end *********************************************************************************/
  260. /**
  261. * 消息发送
  262. * @param $param
  263. */
  264. public function sendMessage($param)
  265. {
  266. try {
  267. $keywords = $param[ "keywords" ];
  268. $site_id = $param[ "site_id" ] ?? $param[ "site_id" ];
  269. $message_info_result = $this->getMessageInfo($site_id, $keywords);
  270. $message_info = $message_info_result[ "data" ];
  271. $param[ "message_info" ] = $message_info;
  272. $shop_info = [];
  273. if ($site_id > 0) {
  274. $shop_model = new Shop();
  275. $shop_info_result = $shop_model->getShopInfo([ [ 'site_id', '=', $site_id ] ]);
  276. $site_model = new Site();
  277. $site_info = $site_model->getSiteInfo([ [ 'site_id', '=', $site_id ] ]);
  278. $shop_info = array_merge($shop_info_result[ "data" ], $site_info[ 'data' ]);
  279. }
  280. $param[ "site_info" ] = $shop_info;
  281. // $result = event("SendMessageTemplate", $param, true);//匹配消息模板 并发送
  282. $result = checkQueue($param, function($params) {
  283. $send_type = $params[ 'type' ] ?? 'later';
  284. // 如果为验证码同步发送
  285. if ($send_type == 'code') {
  286. $result = event('SendMessageTemplate', $params, true);//匹配消息模板 并发送
  287. return $result;
  288. } else {
  289. // 是够延时发送
  290. if (isset($params[ 'later' ]) && !empty($params[ 'later' ])) {
  291. Queue::later(( time() + $params[ 'later' ] ), 'Sendmessage', $params);
  292. } else {
  293. Queue::push('Sendmessage', $params);
  294. }
  295. return $this->success();
  296. }
  297. }, function($params) {
  298. $result = event('SendMessageTemplate', $params, true);//匹配消息模板 并发送
  299. return $result;
  300. });
  301. return $result;
  302. } catch (\Exception $e) {
  303. return $this->error('', $e->getMessage().$e->getFile().$e->getLine());
  304. }
  305. }
  306. }