2026-03-21 02:55:24 +08:00
|
|
|
<?php
|
|
|
|
|
// +----------------------------------------------------------------------
|
2026-03-29 11:22:52 +08:00
|
|
|
// | Author: ScottPan Team
|
2026-03-21 02:55:24 +08:00
|
|
|
// +----------------------------------------------------------------------
|
2026-03-29 11:22:52 +08:00
|
|
|
|
2026-03-21 02:55:24 +08:00
|
|
|
namespace app\controller\admin\v1\user;
|
|
|
|
|
|
|
|
|
|
use app\controller\admin\AuthController;
|
|
|
|
|
use app\services\user\label\UserLabelCateServices;
|
|
|
|
|
use app\services\user\label\UserLabelRelationServices;
|
|
|
|
|
use app\services\user\label\UserLabelServices;
|
|
|
|
|
use crmeb\services\wechat\config\WorkConfig;
|
|
|
|
|
use crmeb\services\wechat\Work;
|
|
|
|
|
use think\annotation\Inject;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户标签控制器
|
|
|
|
|
* Class UserLabel
|
|
|
|
|
* @package app\controller\admin\v1\user
|
|
|
|
|
*/
|
|
|
|
|
class UserLabel extends AuthController
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var UserLabelServices
|
|
|
|
|
*/
|
|
|
|
|
#[Inject]
|
|
|
|
|
protected UserLabelServices $services;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 标签列表
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function index()
|
|
|
|
|
{
|
|
|
|
|
$where = $this->request->getMore([
|
|
|
|
|
['label_cate', ''],
|
|
|
|
|
['label_name', ''],
|
|
|
|
|
['label_type', ''],
|
|
|
|
|
['status', ''],
|
|
|
|
|
]);
|
|
|
|
|
$where['type'] = 0;
|
|
|
|
|
return $this->success($this->services->getList($where));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取带分类的用户标签列表
|
|
|
|
|
* @param UserLabelCateServices $userLabelCateServices
|
|
|
|
|
* @return mixed
|
|
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
|
|
* @throws \think\db\exception\DbException
|
|
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
|
|
*/
|
|
|
|
|
public function tree_list(UserLabelCateServices $userLabelCateServices)
|
|
|
|
|
{
|
|
|
|
|
[$label_type] = $this->request->getMore([
|
|
|
|
|
['label_type', ''],
|
|
|
|
|
], true);
|
|
|
|
|
$cate = $userLabelCateServices->getLabelCateAll();
|
|
|
|
|
$data = [];
|
|
|
|
|
$label = [];
|
|
|
|
|
if ($cate) {
|
|
|
|
|
foreach ($cate as $value) {
|
|
|
|
|
$data[] = [
|
|
|
|
|
'id' => $value['id'] ?? 0,
|
|
|
|
|
'value' => $value['id'] ?? 0,
|
|
|
|
|
'label_cate' => 0,
|
|
|
|
|
'label_name' => $value['name'] ?? '',
|
|
|
|
|
'label' => $value['name'] ?? '',
|
|
|
|
|
'store_id' => $value['store_id'] ?? 0,
|
|
|
|
|
'type' => $value['type'] ?? 1,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
$label = $this->services->getList(['type' => 0, 'label_type' => $label_type]);
|
|
|
|
|
$label = $label['list'] ?? [];
|
|
|
|
|
if ($label) {
|
|
|
|
|
foreach ($label as &$item) {
|
|
|
|
|
$item['label'] = $item['label_name'];
|
|
|
|
|
$item['value'] = $item['id'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $this->success($this->services->get_tree_children($data, $label));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加修改标签表单
|
|
|
|
|
* @return mixed
|
|
|
|
|
* @throws \FormBuilder\Exception\FormBuilderException
|
|
|
|
|
*/
|
|
|
|
|
public function add()
|
|
|
|
|
{
|
|
|
|
|
[$id, $label_cate] = $this->request->getMore([
|
|
|
|
|
['id', 0],
|
|
|
|
|
['label_cate', 0]
|
|
|
|
|
], true);
|
|
|
|
|
return $this->success($this->services->add((int)$id, 0, 0, $label_cate));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 保存标签表单数据
|
|
|
|
|
* @param int $id
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function save()
|
|
|
|
|
{
|
|
|
|
|
$data = $this->request->postMore([
|
|
|
|
|
['id', 0],
|
|
|
|
|
['label_cate', 0],
|
|
|
|
|
['label_name', ''],//标签名称数组
|
|
|
|
|
['label_type', 1],//标签类型,1:手动;2 自动
|
|
|
|
|
['is_product', 0],//商品条件,1 开启 0 关闭
|
|
|
|
|
['is_property', 0],//资产条件,1 开启 0 关闭
|
|
|
|
|
['is_trade', 0],//交易条件,1 开启0 关闭
|
|
|
|
|
['is_customer', 0],//客户条件,1 开启 0 关闭
|
|
|
|
|
['is_condition', 1],//条件类型,1 条件满足任一,2全部条件满足
|
|
|
|
|
['product', []],//商品条件
|
|
|
|
|
['property', []],//资产条件
|
|
|
|
|
['trade', []],//交易条件
|
|
|
|
|
['customer', []],//客户条件
|
|
|
|
|
['status', 1],//状态
|
|
|
|
|
]);
|
|
|
|
|
// if (!$data['label_name'] = trim($data['label_name'])) return $this->fail('会员标签不能为空!');
|
|
|
|
|
$label_name = is_array($data['label_name']) ? $data['label_name'] : [$data['label_name']];
|
|
|
|
|
foreach ($label_name as $value) {
|
|
|
|
|
if ($this->services->fieldExists('label_name', $value, (int)$data['id'])) {
|
|
|
|
|
return $this->fail("会员标签{$value}已存在!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$this->services->saveData((int)$data['id'], $data);
|
|
|
|
|
return $this->success('保存成功');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除
|
|
|
|
|
* @param $id
|
|
|
|
|
* @throws \Exception
|
|
|
|
|
*/
|
|
|
|
|
public function delete()
|
|
|
|
|
{
|
|
|
|
|
[$id] = $this->request->getMore([
|
|
|
|
|
['id', 0],
|
|
|
|
|
], true);
|
|
|
|
|
if (!$id) return $this->fail('数据不存在');
|
|
|
|
|
$this->services->delLabel((int)$id);
|
|
|
|
|
return $this->success('刪除成功!');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 标签分类
|
|
|
|
|
* @param UserLabelCateServices $services
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function getUserLabel(UserLabelCateServices $services, $uid)
|
|
|
|
|
{
|
|
|
|
|
[$uids, $all, $where] = $this->request->postMore([
|
|
|
|
|
['uids', []],
|
|
|
|
|
['all', 0],
|
|
|
|
|
['where', ""],
|
|
|
|
|
], true);
|
|
|
|
|
if (count($uids) == 1) {
|
|
|
|
|
$uid = $uids[0] ?? 0;
|
|
|
|
|
}
|
|
|
|
|
return $this->success($services->getUserLabel((int)$uid));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设置用户标签
|
|
|
|
|
* @param UserLabelRelationServices $services
|
|
|
|
|
* @param $uid
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function setUserLabel(UserLabelRelationServices $services, $uid)
|
|
|
|
|
{
|
|
|
|
|
[$labels, $unLabelIds] = $this->request->postMore([
|
|
|
|
|
['label_ids', []],
|
|
|
|
|
['un_label_ids', []]
|
|
|
|
|
], true);
|
|
|
|
|
if (!count($labels) && !count($unLabelIds)) {
|
|
|
|
|
return $this->fail('请先添加用户标签');
|
|
|
|
|
}
|
|
|
|
|
if ($services->setUserLable($uid, $labels) && $services->unUserLabel($uid, $unLabelIds)) {
|
|
|
|
|
return $this->success('设置成功');
|
|
|
|
|
} else {
|
|
|
|
|
return $this->fail('设置失败');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 同步客户标签
|
|
|
|
|
* @param WorkConfig $config
|
|
|
|
|
* @return mixed
|
|
|
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
|
|
|
* @throws \think\db\exception\DbException
|
|
|
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
|
|
|
*/
|
|
|
|
|
public function synchroWorkLabel(WorkConfig $config, Work $work)
|
|
|
|
|
{
|
|
|
|
|
if (!$config->corpId) {
|
|
|
|
|
return $this->fail('请先配置企业微信ID');
|
|
|
|
|
}
|
|
|
|
|
$config = $work->getAppConfig(WorkConfig::TYPE_USER);
|
|
|
|
|
// if (empty($config['secret'])) {
|
|
|
|
|
// return $this->fail('请先配置企业微信客户secret');
|
|
|
|
|
// }
|
|
|
|
|
if ($this->services->authWorkClientLabel()) {
|
|
|
|
|
return $this->success('已加入消息队列,进行同步。请稍等片刻');
|
|
|
|
|
} else {
|
|
|
|
|
return $this->fail('加入消息队列失败');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取标签详情信息
|
|
|
|
|
* @param int $id 标签ID
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function info($id)
|
|
|
|
|
{
|
|
|
|
|
if (!$id) {
|
|
|
|
|
return $this->fail('数据不存在');
|
|
|
|
|
}
|
|
|
|
|
$info = $this->services->getInfo($id);
|
|
|
|
|
return $this->success($info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量处理用户标签检查
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function batchProcess()
|
|
|
|
|
{
|
|
|
|
|
[$labelIds, $action] = $this->request->postMore([
|
|
|
|
|
['label_ids', []],
|
|
|
|
|
['action', 'update']
|
|
|
|
|
], true);
|
|
|
|
|
|
|
|
|
|
if (empty($labelIds)) {
|
|
|
|
|
return $this->fail('请选择要处理的标签');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
/** @var \app\services\user\label\UserLabelBatchProcessServices $batchProcessServices */
|
|
|
|
|
$batchProcessServices = app()->make(\app\services\user\label\UserLabelBatchProcessServices::class);
|
|
|
|
|
$result = $batchProcessServices->processLabelChange($labelIds, $action);
|
|
|
|
|
|
|
|
|
|
if ($result) {
|
|
|
|
|
return $this->success('批量处理任务已启动,正在后台处理中,请稍后查看处理结果');
|
|
|
|
|
} else {
|
|
|
|
|
return $this->fail('批量处理任务启动失败');
|
|
|
|
|
}
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->fail('批量处理失败:' . $e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取批量处理状态
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function batchStatus()
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
/** @var \app\services\user\label\UserLabelBatchProcessServices $batchProcessServices */
|
|
|
|
|
$batchProcessServices = app()->make(\app\services\user\label\UserLabelBatchProcessServices::class);
|
|
|
|
|
$status = $batchProcessServices->getBatchProcessStatus();
|
|
|
|
|
return $this->success($status);
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->fail('获取处理状态失败:' . $e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发所有自动标签的用户检查
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
public function processAllAutoLabels()
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
// 获取所有自动标签
|
|
|
|
|
$autoLabels = $this->services->getLabelList([
|
|
|
|
|
'label_type' => 2, // 自动标签
|
|
|
|
|
'status' => 1 // 启用状态
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if (empty($autoLabels)) {
|
|
|
|
|
return $this->fail('没有找到启用的自动标签');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$labelIds = array_column($autoLabels, 'id');
|
|
|
|
|
|
|
|
|
|
/** @var \app\services\user\label\UserLabelBatchProcessServices $batchProcessServices */
|
|
|
|
|
$batchProcessServices = app()->make(\app\services\user\label\UserLabelBatchProcessServices::class);
|
|
|
|
|
$result = $batchProcessServices->processLabelChange($labelIds, 'check_all');
|
|
|
|
|
|
|
|
|
|
if ($result) {
|
|
|
|
|
return $this->success('所有自动标签检查任务已启动,共处理 ' . count($labelIds) . ' 个标签,正在后台处理中');
|
|
|
|
|
} else {
|
|
|
|
|
return $this->fail('批量处理任务启动失败');
|
|
|
|
|
}
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
|
|
return $this->fail('处理失败:' . $e->getMessage());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|