Browse Source

feat(distillation): 新增蒸馏词管理功能

- 新增蒸馏词、目标转化词、扩展词、关联问题的数据模型与DAO类
- 在 DistillationWord 模型中增加关联关系方法 (trans, expand, questions)
- 控制器 DistillationWordController 实现增删改查及下拉数据接口
- 服务层 DistillationWordService 完成业务逻辑处理,包括事务操作
- 验证器 DistillationWordValidate 更新字段校验规则
- 路由配置新增蒸馏词相关API路径及权限控制
- 支持主关键词、目标转化词、扩展词的保存与更新逻辑
- 列表查询支持模糊搜索和统计关联问题数量
- 提供纯数据列表接口用于前端下拉选项
- 增加软删除机制,确保数据一致性回滚处理
master
zhangf@suq.cn 1 week ago
parent
commit
d1b94ae7cf
  1. 39
      app/controller/DistillationWordController.php
  2. 17
      app/dao/DistillationExpandWordDao.php
  3. 17
      app/dao/DistillationQuestionsDao.php
  4. 17
      app/dao/DistillationTransWordDao.php
  5. 33
      app/model/DistillationQuestions.php
  6. 15
      app/model/DistillationWord.php
  7. 37
      app/route/route.php
  8. 138
      app/service/DistillationWordService.php
  9. 15
      app/validate/DistillationWordValidate.php

39
app/controller/DistillationWordController.php

@ -2,10 +2,36 @@
namespace app\controller; namespace app\controller;
use app\service\DistillationWordService; use app\service\DistillationWordService;
use app\validate\DistillationWordValidate;
use plugin\piadmin\app\utils\ArrayUtils;
use support\Response; use support\Response;
class UserController
class DistillationWordController
{ {
public function save(DistillationWordService $service): Response
{
$params = requestOnly([
'name' => '',
'trans_words' => '',
'expand_words' => [],
]);
validate(DistillationWordValidate::class)->check($params, 'save');
return success($service->saveData($params));
}
public function update(DistillationWordService $service): Response
{
$params = requestOnly([
'id' => '',
'name' => '',
'trans_words' => '',
'drill_status' => 1,
'algorithm' => 1
]);
validate(DistillationWordValidate::class)->check($params, 'update');
return success($service->updateData(ArrayUtils::filterNotEmpty($params)));
}
public function index(DistillationWordService $service): Response public function index(DistillationWordService $service): Response
{ {
$params = requestOnly([ $params = requestOnly([
@ -20,4 +46,15 @@ class UserController
return success($service->readData($id)); return success($service->readData($id));
} }
public function delete(DistillationWordService $service): Response
{
$id = input('id');
return success($service->deleteData($id));
}
public function pureIndex(DistillationWordService $service)
{
return success($service->selectData());
}
} }

17
app/dao/DistillationExpandWordDao.php

@ -0,0 +1,17 @@
<?php
namespace app\dao;
use app\model\DistillationExpandWord;
use plugin\piadmin\app\base\BaseDao;
class DistillationExpandWordDao extends BaseDao
{
protected function setModel(): string
{
return DistillationExpandWord::class;
}
}

17
app/dao/DistillationQuestionsDao.php

@ -0,0 +1,17 @@
<?php
namespace app\dao;
use app\model\DistillationQuestions;
use plugin\piadmin\app\base\BaseDao;
class DistillationQuestionsDao extends BaseDao
{
protected function setModel(): string
{
return DistillationQuestions::class;
}
}

17
app/dao/DistillationTransWordDao.php

@ -0,0 +1,17 @@
<?php
namespace app\dao;
use app\model\DistillationTransWord;
use plugin\piadmin\app\base\BaseDao;
class DistillationTransWordDao extends BaseDao
{
protected function setModel(): string
{
return DistillationTransWord::class;
}
}

33
app/model/DistillationQuestions.php

@ -0,0 +1,33 @@
<?php
namespace app\model;
use plugin\piadmin\app\base\BaseModel;
/**
* 蒸馏词关联目标转化词模型
*/
class DistillationQuestions extends BaseModel
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'geo_distillation_questions';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = true;
}

15
app/model/DistillationWord.php

@ -30,4 +30,19 @@ class DistillationWord extends BaseModel
*/ */
public $timestamps = true; public $timestamps = true;
public function trans()
{
return $this->hasMany(DistillationTransWord::class, 'distillation_id', 'id');
}
public function expand()
{
return $this->hasMany(DistillationExpandWord::class, 'distillation_id', 'id');
}
public function questions()
{
return $this->hasMany(DistillationQuestions::class, 'distillation_id', 'id');
}
} }

37
app/route/route.php

@ -1,31 +1,26 @@
<?php <?php
use app\controller\ActionArticleController;
use app\controller\ActionOptimizeController;
use app\controller\BrandLibraryController;
use app\controller\OrderController;
use app\controller\PlatformController;
use app\controller\ProjectBrandController;
use app\controller\ProjectController;
use app\controller\ProjectKeywordController;
use app\controller\ProjectResultBrandController;
use app\controller\ProjectResultContentController;
use app\controller\ProjectResultController;
use app\controller\ProjectResultReferenceSiteController;
use app\controller\ProjectTaskController;
use app\controller\ProjectWordCloudController;
use app\controller\SiteController;
use app\controller\ProjectTopicController;
use app\controller\ProjectUserController;
use app\controller\UserController;
use app\controller\UserGroupController;
use app\controller\VipController;
use app\controller\DistillationWordController;
use plugin\piadmin\app\middleware\AdminAuthorizationMiddleware; use plugin\piadmin\app\middleware\AdminAuthorizationMiddleware;
use plugin\piadmin\app\middleware\PermissionsMiddleware; use plugin\piadmin\app\middleware\PermissionsMiddleware;
use Webman\Route; use Webman\Route;
Route::group('/service/v1', function () { Route::group('/service/v1', function () {
//蒸馏词
Route::group('/distillation', function () {
//新增
Route::post('/save', [DistillationWordController::class, 'save'])->setParams(['perm' => ['distillationSave']]);
//修改
Route::post('/update', [DistillationWordController::class, 'update'])->setParams(['perm' => ['distillationUpdate']]);
//列表
Route::get('/index', [DistillationWordController::class, 'index'])->setParams(['perm' => ['distillationIndex']]);
//详情
Route::get('/read', [DistillationWordController::class, 'read'])->setParams(['perm' => ['distillationRead']]);
//删除
Route::post('/delete', [DistillationWordController::class, 'delete'])->setParams(['perm' => ['distillationDelete']]);
//下拉数据
Route::get('/pure/index', [DistillationWordController::class, 'pureIndex'])->setParams(['perm' => 'distillationPureIndex']);
});
})->middleware([ })->middleware([
AdminAuthorizationMiddleware::class, AdminAuthorizationMiddleware::class,
PermissionsMiddleware::class PermissionsMiddleware::class

138
app/service/DistillationWordService.php

@ -2,53 +2,171 @@
namespace app\service; namespace app\service;
use app\dao\DistillationExpandWordDao;
use app\dao\DistillationQuestionsDao;
use app\dao\DistillationTransWordDao;
use app\dao\DistillationWordDao; use app\dao\DistillationWordDao;
use plugin\piadmin\app\base\BaseService; use plugin\piadmin\app\base\BaseService;
use plugin\piadmin\app\exception\ApiException; use plugin\piadmin\app\exception\ApiException;
use plugin\piadmin\app\utils\RequestUtils;
use support\think\Db;
class DistillationWordService extends BaseService class DistillationWordService extends BaseService
{ {
protected $dao; protected $dao;
protected $transDao;
protected $expandDao;
protected $questionsDao;
public function __construct(DistillationWordDao $dao) public function __construct(DistillationWordDao $dao)
{ {
$this->dao = $dao; $this->dao = $dao;
$this->transDao = app()->make(DistillationTransWordDao::class);
$this->expandDao = app()->make(DistillationExpandWordDao::class);
$this->questionsDao = app()->make(DistillationQuestionsDao::class);
} }
/** /**
* 获取前台用户列表
* 保存信息
* @param array $params * @param array $params
* @return array * @return array
*/ */
public function listData(array $params): array
public function saveData(array $params): array
{
Db::startTrans();
try {
//保存主表
$data = $this->dao->save([
'name' => $params['name']
]);
//保存目标转化此
$trans_words = str_replace(',', ',', $params['trans_words']);
$trans_words = explode(',', $trans_words);
$trans = [];
foreach ($trans_words as $item) {
$trans[] = [
'distillation_id' => $data['id'],
'name' => $item
];
}
$this->transDao->insertAll($trans);
//保存扩展此
$expands = [];
foreach ($params['expand_words'] as $item) {
$expands[] = [
'distillation_id' => $data['id'],
'name' => $item
];
}
$this->expandDao->insertAll($expands);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $data->toArray();
}
/**
* 修改信息
* @param array $params
* @return array
*/
public function updateData(array $params): array
{ {
[$page, $limit] = RequestUtils::getPageParameter();
[$sortRule, $sortField] = RequestUtils::getSortParameter();
// 落库
Db::startTrans();
try {
$this->dao->update(['id' => $params['id']], $params);
//目标转化词,先删后加
$this->transDao->delete(['distillation_id' => $params['id']]);
$trans_words = str_replace(',', ',', $params['trans_words']);
$trans_words = explode(',', $trans_words);
$trans = [];
foreach ($trans_words as $item) {
if (empty($item)) {
continue;
}
$trans[] = [
'distillation_id' => $params['id'],
'name' => $item
];
}
$this->transDao->insertAll($trans);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return $params;
}
/**
* 获取列表
* @param array $params
* @return array
*/
public function listData(array $params): array
{
$query = [ $query = [
'delete_time' => 0 'delete_time' => 0
]; ];
if (isNotBlank($params['name'])) { if (isNotBlank($params['name'])) {
$query[] = ['name', 'like', '%' . $params['name'] . '%']; $query[] = ['name', 'like', '%' . $params['name'] . '%'];
} }
$list = $this->dao->getList($query, '*', $page, $limit, "$sortField $sortRule");
$list = $this->dao->getList($query, '*', 0, 0, 'id DESC', ['questions.count']);
$count = $this->dao->getCount($query); $count = $this->dao->getCount($query);
return compact('list', 'count'); return compact('list', 'count');
} }
/** /**
* 获取用户信息
* 获取信息
* @param mixed $id * @param mixed $id
* @return array * @return array
*/ */
public function readData(mixed $id): array public function readData(mixed $id): array
{ {
$user = $this->dao->get(['id' => $id]);
if (empty($user)) {
$user_group = $this->dao->get(['id' => $id], ['*'], ['trans', 'expand']);
if (empty($user_group)) {
throw new ApiException('数据不存在'); throw new ApiException('数据不存在');
} }
return $user->toArray();
return $user_group->toArray();
}
/**
* 删除信息
* @param mixed $id
* @return array
*/
public function deleteData(mixed $id): array
{
$data = $this->dao->get(['id' => $id]);
if (empty($data)) {
return [];
}
// 落库
Db::startTrans();
try {
//删主表
$this->dao->update($id, ['delete_time' => time()]);
//删子表
$this->transDao->update(['distillation_id' => $id], ['delete_time' => time()]);
$this->expandDao->update(['distillation_id' => $id], ['delete_time' => time()]);
$this->questionsDao->update(['distillation_id' => $id], ['delete_time' => time()]);
Db::commit();
} catch (\Exception $exception) {
Db::rollback();
throw new ApiException($exception->getMessage());
}
return ['id' => $id];
}
public function selectData()
{
$query = [
'delete_time' => 0
];
$list = $this->dao->getList($query);
return $list;
} }
} }

app/validate/UserGroupValidate.php → app/validate/DistillationWordValidate.php

Loading…
Cancel
Save