Files
huangjingfen/pro_v3.5.1_副本/app/services/work/WorkGroupChatAuthServices.php

225 lines
7.8 KiB
PHP
Raw Normal View History

feat(fsgx): 完成全部24项开发任务 Phase1-7 Phase1 后端核心: - 新增 fsgx_v1.sql 迁移脚本(is_queue_goods/frozen_points/available_points/no_assess) - SystemConfigServices 返佣设置扩展(周期人数/分档比例/范围/时机) - StoreOrderCreateServices 周期循环佣金计算 - StoreOrderTakeServices 佣金发放后同步冻结积分 - StoreProductServices/StoreProduct 保存 is_queue_goods Phase2 后端接口: - GET /api/hjf/brokerage/progress 佣金周期进度 - GET /api/hjf/assets/overview 资产总览 - HjfPointsServices 每日 frozen_points 0.4‰ 释放定时任务 - PUT /adminapi/hjf/member/{uid}/no_assess 不考核接口 - GET /adminapi/hjf/points/release_log 积分日志接口 Phase3 前端清理: - hjfCustom.js 路由精简(仅保留 points/log) - hjfQueue.js/hjfMember.js API 清理/重定向至 CRMEB 原生接口 - pages.json 公排→推荐佣金/佣金记录/佣金规则 Phase4-5 前端改造: - queue/status.vue 推荐佣金进度页整体重写 - 商品详情/订单确认/支付结果页文案与逻辑改造 - 个人中心/资产页/引导页/规则页文案改造 - HjfQueueProgress/HjfRefundNotice/HjfAssetCard 组件改造 - 推广中心嵌入佣金进度摘要 - hjfMockData.js 全量更新(公排字段→佣金字段) Phase6 Admin 增强: - 用户列表新增 frozen_points/available_points 列及不考核操作按钮 - hjfPoints.js USE_MOCK=false 对接真实积分日志接口 Phase7 配置文档: - docs/fsgx-phase7-config-checklist.md 后台配置与全链路验收清单 Made-with: Cursor
2026-03-23 22:32:19 +08:00
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\work;
use app\dao\work\WorkGroupChatAuthDao;
use app\services\BaseServices;
use app\services\user\label\UserLabelServices;
use crmeb\services\wechat\Work;
use crmeb\traits\service\ContactWayQrCode;
use think\annotation\Inject;
use think\exception\ValidateException;
/**
* 企业微信自动拉群
* Class WorkGroupChatAuthServices
* @package app\services\work
*/
class WorkGroupChatAuthServices extends BaseServices
{
use ContactWayQrCode;
/**
* @var WorkGroupChatAuthDao
*/
#[Inject]
protected WorkGroupChatAuthDao $dao;
/**
* @param array $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getList(array $where)
{
[$page, $limit] = $this->getPageValue();
$list = $this->dao->getDataList($where, ['*'], $page, $limit, 'create_time');
$chatIds = [];
$labels = [];
foreach ($list as $item) {
$chatIds = array_merge($chatIds, $item['chat_id']);
$labels = array_merge($labels, $item['label'] ?? []);
}
$chatIds = array_merge(array_unique(array_filter($chatIds)));
$labels = array_merge(array_unique(array_filter($labels)));
/** @var UserLabelServices $userLabelService */
$userLabelService = app()->make(UserLabelServices::class);
$labelList = $userLabelService->getColumn([
['tag_id', 'in', $labels]
], 'label_name', 'tag_id');
/** @var WorkGroupChatServices $service */
$service = app()->make(WorkGroupChatServices::class);
$chatList = $service->getColumn([
['chat_id', 'in', $chatIds]
], 'name', 'chat_id');
foreach ($list as &$item) {
$chatNewList = $labelNewList = [];
foreach ($chatList as $key => $val) {
if (in_array($key, $item['chat_id'])) {
$chatNewList[] = ['name' => $val, 'chat_id' => $key];
}
}
if ($item['label']) {
foreach ($labelList as $k => $v) {
if (in_array($k, $item['label'])) {
$labelNewList[] = ['name' => $v, 'label_id' => $k];
}
}
}
$item['chat_list'] = $chatNewList;
$item['label_list'] = $labelNewList;
}
$count = $this->dao->count($where);
return compact('list', 'count');
}
/**
* 保存或者修改自动拉群
* @param array $data
* @param int $id
* @return mixed
*/
public function saveGroupChatAuth(array $data, int $id = 0)
{
return $this->transaction(function () use ($data, $id) {
if ($id) {
$authInfo = $this->dao->get(['id' => $id], ['config_id']);
$this->dao->update($id, $data);
$this->handleGroupChat($data, $id, $authInfo->config_id);
} else {
$res = $this->dao->save($data);
$id = $res->id;
$this->handleGroupChat($data, $id);
}
return $id;
});
}
/**
* 配置加入群聊并获取二维码
* @param string $configId
* @param array $data
* @param int $id
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
protected function handleGroupChat(array $data, int $id, string $configId = '')
{
//设置进群配置
if ($configId) {
$qrCode = Work::instance()->groupChat()->updateJoinWay($configId, $data['group_name'], $data['chat_id'], 'groupChat-' . $id, (int)$data['auth_group_chat'], (int)$data['group_num']);
} else {
$qrCode = Work::instance()->groupChat()->addJoinWay($data['group_name'], $data['chat_id'], 'groupChat-' . $id, (int)$data['auth_group_chat'], (int)$data['group_num']);
}
if (0 !== $qrCode['errcode']) {
throw new ValidateException($qrCode['errmsg']);
}
if (!$configId) {
$this->dao->update($id, ['config_id' => $qrCode['config_id']]);
$configId = $qrCode['config_id'];
}
//获取群二维码
$qrCodeInfo = Work::instance()->groupChat()->getJoinWay($configId);
if (0 !== $qrCodeInfo['errcode']) {
throw new ValidateException($qrCodeInfo['errmsg']);
}
$this->dao->update($id, ['qr_code' => $qrCodeInfo['join_way']['qr_code']]);
}
/**
* 删除客户进群配置
* @param int $id
* @return bool
* @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
* @throws \GuzzleHttp\Exception\GuzzleException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function deleteGroupChatAuth(int $id)
{
$groupChatAuthInfo = $this->dao->get($id);
if (!$groupChatAuthInfo) {
throw new ValidateException('删除的群聊配置不存在');
}
//删除入群配置
if ($groupChatAuthInfo->config_id) {
$qrCode = Work::instance()->groupChat()->deleteJoinWay($groupChatAuthInfo->config_id);
if (0 !== $qrCode['errcode']) {
throw new ValidateException($qrCode['errmsg']);
}
}
return $this->dao->destroy($id);
}
/**
* 获取群配置
* @param int $id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getGrouChatAuthInfo(int $id)
{
$groupChatAuthInfo = $this->dao->get($id);
if (!$groupChatAuthInfo) {
throw new ValidateException('删除的群聊配置不存在');
}
$groupChatAuthInfo['labelList'] = $groupChatAuthInfo['chatList'] = [];
if ($groupChatAuthInfo->label) {
/** @var UserLabelServices $userLabelService */
$userLabelService = app()->make(UserLabelServices::class);
$groupChatAuthInfo['labelList'] = $userLabelService->getColumn([
['tag_id', 'in', $groupChatAuthInfo->label]
], 'label_name,tag_id');
}
if ($groupChatAuthInfo->chat_id) {
/** @var WorkGroupChatServices $service */
$service = app()->make(WorkGroupChatServices::class);
$groupChatAuthInfo['chatList'] = $service->getColumn([
['chat_id', 'in', $groupChatAuthInfo->chat_id]
], 'name,chat_id');
}
return $groupChatAuthInfo->toArray();
}
/**
*
* @param int $groupAuthId
* @param string $userid
* @param string $externalUserID
*/
public function clientAddLabel(int $groupAuthId, string $userid, string $externalUserID)
{
$label = $this->dao->value(['id' => $groupAuthId], 'label');
$resTage = Work::markTags($userid, $externalUserID, $label);
if (0 !== $resTage['errcode']) {
throw new ValidateException($resTage['errmsg']);
}
}
}