From d1b94ae7cfba33f35c3b2948a2d2a9c41cddf9b4 Mon Sep 17 00:00:00 2001 From: "zhangf@suq.cn" Date: Tue, 9 Dec 2025 09:49:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(distillation):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=92=B8=E9=A6=8F=E8=AF=8D=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增蒸馏词、目标转化词、扩展词、关联问题的数据模型与DAO类 - 在 DistillationWord 模型中增加关联关系方法 (trans, expand, questions) - 控制器 DistillationWordController 实现增删改查及下拉数据接口 - 服务层 DistillationWordService 完成业务逻辑处理,包括事务操作 - 验证器 DistillationWordValidate 更新字段校验规则 - 路由配置新增蒸馏词相关API路径及权限控制 - 支持主关键词、目标转化词、扩展词的保存与更新逻辑 - 列表查询支持模糊搜索和统计关联问题数量 - 提供纯数据列表接口用于前端下拉选项 - 增加软删除机制,确保数据一致性回滚处理 --- app/controller/DistillationWordController.php | 39 +++++++- app/dao/DistillationExpandWordDao.php | 17 ++++ app/dao/DistillationQuestionsDao.php | 17 ++++ app/dao/DistillationTransWordDao.php | 17 ++++ app/model/DistillationQuestions.php | 33 ++++++ app/model/DistillationWord.php | 15 +++ app/route/route.php | 37 +++---- app/service/DistillationWordService.php | 138 ++++++++++++++++++++++++-- app/validate/DistillationWordValidate.php | 33 ++++++ app/validate/UserGroupValidate.php | 28 ------ 10 files changed, 314 insertions(+), 60 deletions(-) create mode 100644 app/dao/DistillationExpandWordDao.php create mode 100644 app/dao/DistillationQuestionsDao.php create mode 100644 app/dao/DistillationTransWordDao.php create mode 100644 app/model/DistillationQuestions.php create mode 100644 app/validate/DistillationWordValidate.php delete mode 100644 app/validate/UserGroupValidate.php diff --git a/app/controller/DistillationWordController.php b/app/controller/DistillationWordController.php index b44caf8..1253eaa 100644 --- a/app/controller/DistillationWordController.php +++ b/app/controller/DistillationWordController.php @@ -2,10 +2,36 @@ namespace app\controller; use app\service\DistillationWordService; +use app\validate\DistillationWordValidate; +use plugin\piadmin\app\utils\ArrayUtils; 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 { $params = requestOnly([ @@ -20,4 +46,15 @@ class UserController 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()); + } + } \ No newline at end of file diff --git a/app/dao/DistillationExpandWordDao.php b/app/dao/DistillationExpandWordDao.php new file mode 100644 index 0000000..2e2eb11 --- /dev/null +++ b/app/dao/DistillationExpandWordDao.php @@ -0,0 +1,17 @@ +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'); + } + } \ No newline at end of file diff --git a/app/route/route.php b/app/route/route.php index 1fd5fcc..807ffb4 100644 --- a/app/route/route.php +++ b/app/route/route.php @@ -1,31 +1,26 @@ 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([ AdminAuthorizationMiddleware::class, PermissionsMiddleware::class diff --git a/app/service/DistillationWordService.php b/app/service/DistillationWordService.php index 039c5d6..d344291 100644 --- a/app/service/DistillationWordService.php +++ b/app/service/DistillationWordService.php @@ -2,53 +2,171 @@ namespace app\service; +use app\dao\DistillationExpandWordDao; +use app\dao\DistillationQuestionsDao; +use app\dao\DistillationTransWordDao; use app\dao\DistillationWordDao; use plugin\piadmin\app\base\BaseService; use plugin\piadmin\app\exception\ApiException; -use plugin\piadmin\app\utils\RequestUtils; +use support\think\Db; class DistillationWordService extends BaseService { protected $dao; + protected $transDao; + protected $expandDao; + protected $questionsDao; public function __construct(DistillationWordDao $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 * @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 = [ 'delete_time' => 0 ]; if (isNotBlank($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); return compact('list', 'count'); } /** - * 获取用户信息 + * 获取信息 * @param mixed $id * @return 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('数据不存在'); } - 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; } } \ No newline at end of file diff --git a/app/validate/DistillationWordValidate.php b/app/validate/DistillationWordValidate.php new file mode 100644 index 0000000..cad6cfe --- /dev/null +++ b/app/validate/DistillationWordValidate.php @@ -0,0 +1,33 @@ + [ + 'name' => 'require|max:90', + 'trans_words' => 'require', + 'expand_words' => 'require|array', + ], + 'update' => [ + 'id' => 'require', + 'name' => 'require|max:90', + 'trans_words' => 'require', + 'drill_status' => 'require|in:1,2', + 'algorithm' => 'require|in:1,2' + ] + ]; + protected $message = [ + 'id.require' => 'ID不能为空', + 'name.require' => '主关键词不能为空', + 'trans_words.require' => '目标转化词不能为空', + 'expand_words.require' => '扩展词不能为空', + 'drill_status.require' => '训练状态不能为空', + 'drill_status.in' => '训练状态超出范围(1,2)', + 'algorithm.require' => '查收录算法不能为空', + 'algorithm.in' => '查收录算法超出范围(1,2)' + ]; +} \ No newline at end of file diff --git a/app/validate/UserGroupValidate.php b/app/validate/UserGroupValidate.php deleted file mode 100644 index 28276fc..0000000 --- a/app/validate/UserGroupValidate.php +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'name' => 'require|max:90', - 'trans_words' => 'require|in:1,0', - 'expand_words' => 'require|in:1,2', - ], - 'update' => [ - 'id' => 'require', - 'name' => 'require|max:90', - 'trans_words' => 'require|in:1,0', - 'expand_words' => 'require|in:1,2', - ] - ]; - protected $message = [ - 'id.require' => 'ID不能为空', - 'name.require' => '主关键词不能为空', - 'trans_words.require' => '目标转化词不能为空', - 'expand_words.require' => '扩展词不能为空', - ]; -} \ No newline at end of file