yanzai 1 year ago
commit db1c214b1e

@ -10,10 +10,8 @@ class QuestionItemController extends Controller
{
public function item(Request $request)
{
$hospital_id = $request->post('hospital_id');
$items = DB::table('items')
->select(['item_id', 'name', 'pinyin', 'sex'])
->where(['hospital_id' => $hospital_id])
->get();
return \Yz::Return(true, '操作完成', [
'list' => $items
@ -90,7 +88,15 @@ class QuestionItemController extends Controller
if (!!$search) {
$db->where('name', $search);
}
$list = $db->paginate(20);
$list = $db->orderBy('id', 'desc')->paginate(20);
return \Yz::Return(true, '操作完成', [
'list' => $list
]);
}
public function select(Request $request)
{
$list = DB::table('question_items')->select(['id', 'name'])->get();
return \Yz::Return(true, '操作完成', [
'list' => $list
]);

@ -72,7 +72,15 @@ class QuestionQuestionController extends Controller
if (!!$search) {
$db->where('question', 'like', "%$search%");
}
$list = $db->paginate(20);
$list = $db->orderBy('id', 'desc')->paginate(20);
return \Yz::Return(true, '操作完成', [
'list' => $list
]);
}
public function select(Request $request)
{
$list = DB::table('question_questions')->select(['id', 'question'])->get();
return \Yz::Return(true, '操作完成', [
'list' => $list
]);

@ -80,7 +80,7 @@ class QuestionnaireController extends Controller
if (!!$type) {
$db->where('type', $type);
}
$list = $db->paginate(20);
$list = $db->orderBy('id', 'desc')->paginate(20);
return \Yz::Return(true, '操作完成', [
'list' => $list
]);

@ -29,11 +29,13 @@ Route::group(['middleware' => ['checktoken', 'log'], 'prefix' => 'v1'], function
Route::post('admin/question/delete', 'App\Http\Controllers\API\Admin\QuestionnaireController@delete');
Route::post('admin/question/list', 'App\Http\Controllers\API\Admin\QuestionnaireController@list');
Route::post('admin/questionQuestion/select', 'App\Http\Controllers\API\Admin\QuestionQuestionController@select');
Route::post('admin/questionQuestion/create', 'App\Http\Controllers\API\Admin\QuestionQuestionController@create');
Route::post('admin/questionQuestion/update', 'App\Http\Controllers\API\Admin\QuestionQuestionController@update');
Route::post('admin/questionQuestion/delete', 'App\Http\Controllers\API\Admin\QuestionQuestionController@delete');
Route::post('admin/questionQuestion/list', 'App\Http\Controllers\API\Admin\QuestionQuestionController@list');
Route::post('admin/questionItem/select', 'App\Http\Controllers\API\Admin\QuestionItemController@select');
Route::post('admin/questionItem/item', 'App\Http\Controllers\API\Admin\QuestionItemController@item');
Route::post('admin/questionItem/create', 'App\Http\Controllers\API\Admin\QuestionItemController@create');
Route::post('admin/questionItem/update', 'App\Http\Controllers\API\Admin\QuestionItemController@update');

@ -248,4 +248,55 @@ export const ArticleGetDetail = (data={}) => {
//删除文章
export const ArticleGetDel = (data={}) => {
return axios({url:import.meta.env.VITE_APP_API+'v1/admin/ArticleGetDel',data:data})
}
// 问卷调查
export const QuestionCreateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/create', data: data})
}
export const QuestionUpdateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/update', data: data})
}
export const QuestionDeleteAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/question/delete', data: data})
}
export const QuestionListAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/question/list?page=${data.page}`, data: data})
}
export const QuestionQuestionCreateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/create', data: data})
}
export const QuestionQuestionUpdateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/update', data: data})
}
export const QuestionQuestionDeleteAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionQuestion/delete', data: data})
}
export const QuestionQuestionListAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionQuestion/list?page=${data.page}`, data: data})
}
// 题目列表[全部]
export const QuestionQuestionSelectAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionQuestion/select`, data: data})
}
export const QuestionItemCreateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/create', data: data})
}
export const QuestionItemUpdateAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/update', data: data})
}
export const QuestionItemDeleteAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + 'v1/admin/questionItem/delete', data: data})
}
export const QuestionItemListAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/list?page=${data.page}`, data: data})
}
// 问卷调查 获取 检测项目列表
export const QuestionItemItemAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/item`, data: data})
}
// 项目列表[全部]
export const QuestionItemSelectAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/select`, data: data})
}

@ -4,12 +4,336 @@
* usersa0ChunLuyu
* date2024年10月12日 16:29:26
*/
import {ref, onMounted, computed} from 'vue';
import $router from '@/router'
import {onBeforeRouteUpdate} from "vue-router";
import {ElMessage, ElMessageBox} from 'element-plus'
import {
QuestionCreateAction,
QuestionUpdateAction,
QuestionDeleteAction,
QuestionListAction,
QuestionItemItemAction,
QuestionQuestionSelectAction
} from '@/api/api.js'
const default_page_options = {
search: '',
type: '',
page: 1,
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const item_list = ref([])
const QuestionItemItem = async () => {
const response = await QuestionItemItemAction({})
if (response.status) {
item_list.value = response.data.list.map((item) => {
return {
...item,
name: item.sex !== 0 ? `${item.name}(${item.sex === 1 ? '男' : '女'})` : item.name
}
})
} else {
ElMessage.error(response.msg)
}
}
const question_list = ref([])
const QuestionQuestionSelect = async () => {
const response = await QuestionQuestionSelectAction({})
if (response.status) {
question_list.value = response.data.list
} else {
ElMessage.error(response.msg)
}
}
const table_list = ref([])
const last_page = ref(0)
const QuestionList = async () => {
const response = await QuestionListAction(page_options.value)
if (response.status) {
table_list.value = response.data.list.data.map((item) => {
return {
...item,
items: JSON.parse(item.items),
questions: JSON.parse(item.questions)
}
})
last_page.value = response.data.list.last_page
} else {
ElMessage.error(response.msg)
}
}
const routerChange = (query) => {
page_options.value = {
search: query.search || default_page_options.search,
type: query.type || default_page_options.type,
page: Number(query.page) || default_page_options.page,
}
QuestionList()
}
const searchClick = (page = 1) => {
page_options.value.page = page
$router.push({
query: JSON.parse(JSON.stringify(page_options.value))
})
}
const itemNameShow = (items) => {
let names = []
for (let i in item_list.value) {
if (items.includes(String(item_list.value[i].item_id))) {
names.push(item_list.value[i].name)
}
}
return names.join('、')
}
const edit_data_default = {
id: 0,
type: '问卷调查',
name: '',
items: [],
questions: []
}
const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default)))
const edit_show = ref(false)
const createClick = () => {
updateClick(edit_data_default)
}
const updateClick = (row) => {
edit_data.value = JSON.parse(JSON.stringify(row))
edit_show.value = true
}
const editDoneClick = async () => {
const $func = edit_data.value.id !== 0 ? QuestionUpdateAction : QuestionCreateAction
const response = await $func({
...edit_data.value,
items: JSON.stringify(edit_data.value.items),
questions: JSON.stringify(edit_data.value.questions),
})
if (response.status) {
edit_show.value = false
await QuestionList()
} else {
ElMessage.error(response.msg)
}
}
const QuestionDelete = async (id) => {
const response = await QuestionDeleteAction({id})
if (response.status) {
await QuestionList()
} else {
ElMessage.error(response.msg)
}
}
const deleteClick = (id) => {
ElMessageBox.confirm(
'是否确认删除该问卷?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
QuestionDelete(id)
}).catch(() => {
})
}
const edit_item_data = ref([])
const edit_item_show = ref(false)
const editItemClick = () => {
edit_item_data.value = JSON.parse(JSON.stringify(edit_data.value.items))
edit_item_show.value = true
}
const editItemDoneClick = () => {
edit_data.value.items = JSON.parse(JSON.stringify(edit_item_data.value))
edit_item_show.value = false
}
const filterMethod = (query, item) => {
return item.name.toLowerCase().includes(query.toLowerCase()) || item.pinyin.toLowerCase().includes(query.toLowerCase())
}
const moveQuestionClick = (index, type) => {
if (edit_data.value.questions.length - 1 >= index + type) {
const question = edit_data.value.questions[index]
edit_data.value.questions[index] = JSON.parse(JSON.stringify(edit_data.value.questions[index + type]))
edit_data.value.questions[index + type] = JSON.parse(JSON.stringify(question))
}
}
const delQuestionClick = (index) => {
edit_data.value.questions.splice(index, 1)
}
const question_edit_list = computed(() => {
return edit_data.value.questions.map((item) => {
return {
id: item,
question: question_list.value.find((i) => i.id === Number(item)).question
}
})
})
const edit_question_active = ref(null)
const addQuestionClick = () => {
if (edit_question_active.value) {
edit_data.value.questions.push(String(edit_question_active.value))
}
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
QuestionItemItem()
QuestionQuestionSelect()
})
</script>
<template>
<div>
<el-dialog v-model="edit_item_show" title="关联项目管理" width="610px"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false">
<div>
<el-transfer
:titles="['可选项目', '已选项目']"
:props="{key: 'item_id', label: 'name'}"
v-model="edit_item_data"
filterable
:filter-method="filterMethod"
filter-placeholder="搜索"
:data="item_list"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="editItemDoneClick()" type="primary">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="edit_show" title="题目配置" width="1000px">
<div>
<el-form label-width="150">
<el-form-item label="问卷名称">
<el-input v-model="edit_data.name" placeholder="请输入问卷名称"></el-input>
</el-form-item>
<el-form-item label="问卷类型">
<el-select v-model="edit_data.type" placeholder="请选择问卷类型">
<el-option label="检前评估" value="检前评估"></el-option>
<el-option label="问卷调查" value="问卷调查"></el-option>
</el-select>
</el-form-item>
<el-form-item label="基础项目">
<span style="margin-right: 10px;">{{ edit_data.items.length }} 个关联项目</span>
<el-button type="primary" size="small" @click="editItemClick()"></el-button>
</el-form-item>
<el-form-item label="题目">
<div class="question_edit_title_wrapper">
<el-select style="width: 300px;margin-right: 10px;" v-model="edit_question_active"
placeholder="请选择题目">
<el-option v-for="(i,k) in question_list" :key="k" :label="i.question" :value="i.id"></el-option>
</el-select>
<el-button type="primary" size="small" @click="addQuestionClick()"></el-button>
</div>
<el-table :data="question_edit_list" style="width: 100%;" row-key="id" :tooltip-options="{
popperClass: 'popper_class_wrapper'
}">
<el-table-column prop="id" label="ID" width="100"/>
<el-table-column prop="question" label="题目" show-overflow-tooltip/>
<el-table-column label="操作" width="140">
<template #default="scope">
<el-button :disabled="scope.$index===0" type="primary" size="small"
@click="moveQuestionClick(scope.$index, -1)">
</el-button>
<el-button :disabled="scope.$index===edit_data.questions.length - 1" type="primary" size="small"
@click="moveQuestionClick(scope.$index, 1)">
</el-button>
<el-button :disabled="edit_data.questions.length === 1" type="primary" size="small"
@click="delQuestionClick(scope.$index)">X
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="edit_show = false">取消</el-button>
<el-button type="primary" @click="editDoneClick()"></el-button>
</span>
</template>
</el-dialog>
<div class="head">
<div class="head">
<el-row>
<el-form-item label="问卷类型">
<el-select :empty-values="[undefined, null]" style="width: 120px;" v-model="page_options.type"
placeholder="请选择问卷类型">
<el-option label="全部" value=""></el-option>
<el-option label="检前评估" value="检前评估"></el-option>
<el-option label="问卷调查" value="问卷调查"></el-option>
</el-select>
</el-form-item>
<el-form-item style="margin-left: 10px;">
<el-input v-model="page_options.search" placeholder="搜索项目名称"/>
</el-form-item>
<el-button type="primary" @click="searchClick()" style="margin-left: 10px;">查询</el-button>
<el-button type="success" @click="createClick()" style="margin-left: 10px;">添加</el-button>
</el-row>
</div>
</div>
<el-table :data="table_list" style="width: 100%;" row-key="id" :tooltip-options="{
popperClass: 'popper_class_wrapper'
}">
<el-table-column prop="id" label="ID" width="100"/>
<el-table-column prop="name" label="问卷名称" width="200"/>
<el-table-column prop="type" label="问卷类型" width="120"/>
<el-table-column label="基础项目" show-overflow-tooltip>
<template #default="scope">
{{ itemNameShow(scope.row.items) }}
</template>
</el-table-column>
<el-table-column label="题目" width="60">
<template #default="scope">
{{ scope.row.questions.length }}
</template>
</el-table-column>
<el-table-column label="操作" width="140">
<template #default="scope">
<el-button type="primary" @click="updateClick(scope.row)" size="small">修改</el-button>
<el-button type="danger" @click="deleteClick(scope.row.id)" size="small">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination v-if="last_page > 0" :current-page="page_options.page" mt-2 background layout="prev, pager, next"
:page-count="last_page" @update:current-page="searchClick"/>
</div>
</div>
</template>
<style>
.popper_class_wrapper {
width: 300px;
}
</style>
<style scoped>
.question_edit_title_wrapper {
display: flex;
align-items: center;
margin-bottom: 5px;
}
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>

@ -4,12 +4,273 @@
* usersa0ChunLuyu
* date2024年10月12日 16:29:26
*/
import {ref, onMounted} from 'vue';
import $router from '@/router'
import {onBeforeRouteUpdate} from "vue-router";
import {ElMessage, ElMessageBox} from 'element-plus'
import {
QuestionItemCreateAction,
QuestionItemUpdateAction,
QuestionItemDeleteAction,
QuestionItemListAction,
QuestionItemItemAction
} from '@/api/api.js'
const default_page_options = {
search: '',
page: 1,
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const item_list = ref([])
const QuestionItemItem = async () => {
const response = await QuestionItemItemAction({})
if (response.status) {
item_list.value = response.data.list.map((item) => {
return {
...item,
name: item.sex !== 0 ? `${item.name}(${item.sex === 1 ? '男' : '女'})` : item.name
}
})
} else {
ElMessage.error(response.msg)
}
}
const table_list = ref([])
const last_page = ref(0)
const QuestionItemList = async () => {
const response = await QuestionItemListAction(page_options.value)
if (response.status) {
table_list.value = response.data.list.data.map((item) => {
return {
...item,
jichu: JSON.parse(item.jichu),
tuijian: JSON.parse(item.tuijian),
gaoduan: JSON.parse(item.gaoduan),
}
})
last_page.value = response.data.list.last_page
} else {
ElMessage.error(response.msg)
}
}
const routerChange = (query) => {
page_options.value = {
search: query.search || default_page_options.search,
page: Number(query.page) || default_page_options.page,
}
QuestionItemList()
}
const searchClick = (page = 1) => {
page_options.value.page = page
$router.push({
query: JSON.parse(JSON.stringify(page_options.value))
})
}
const itemNameShow = (items) => {
let names = []
for (let i in item_list.value) {
if (items.includes(String(item_list.value[i].item_id))) {
names.push(item_list.value[i].name)
}
}
return names.join('、')
}
const edit_data_default = {
id: 0,
name: '',
desc: '',
jichu: [],
tuijian: [],
gaoduan: [],
}
const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default)))
const edit_show = ref(false)
const createClick = () => {
updateClick(edit_data_default)
}
const updateClick = (row) => {
edit_data.value = JSON.parse(JSON.stringify(row))
edit_show.value = true
}
const editDoneClick = async () => {
const $func = edit_data.value.id !== 0 ? QuestionItemUpdateAction : QuestionItemCreateAction
const response = await $func({
...edit_data.value,
jichu: JSON.stringify(edit_data.value.jichu),
tuijian: JSON.stringify(edit_data.value.tuijian),
gaoduan: JSON.stringify(edit_data.value.gaoduan),
})
if (response.status) {
edit_show.value = false
await QuestionItemList()
} else {
ElMessage.error(response.msg)
}
}
const QuestionItemDelete = async (id) => {
const response = await QuestionItemDeleteAction({id})
if (response.status) {
await QuestionItemList()
} else {
ElMessage.error(response.msg)
}
}
const deleteClick = (id) => {
ElMessageBox.confirm(
'是否确认删除该项目?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
QuestionItemDelete(id)
}).catch(() => {
})
}
const edit_item_data = ref({
active: 'jichu',
items: []
})
const edit_item_show = ref(false)
const editItemClick = (type) => {
edit_item_data.value = {
active: type,
items: JSON.parse(JSON.stringify(edit_data.value[type]))
}
edit_item_show.value = true
}
const editItemDoneClick = () => {
edit_data.value[edit_item_data.value.active] = JSON.parse(JSON.stringify(edit_item_data.value.items))
edit_item_show.value = false
}
const filterMethod = (query, item) => {
return item.name.toLowerCase().includes(query.toLowerCase()) || item.pinyin.toLowerCase().includes(query.toLowerCase())
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
QuestionItemItem()
})
</script>
<template>
<div>
<el-dialog v-model="edit_item_show" title="关联项目管理" width="610px"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false">
<div>
<el-transfer
:titles="['可选项目', '已选项目']"
:props="{key: 'item_id', label: 'name'}"
v-model="edit_item_data.items"
filterable
:filter-method="filterMethod"
filter-placeholder="搜索"
:data="item_list"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="editItemDoneClick()" type="primary">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="edit_show" :title="`${!!edit_data.id ? '编辑' : '新建'}`">
<div>
<el-form label-width="150">
<el-form-item label="项目名称">
<el-input v-model="edit_data.name" placeholder="请输入项目名称"></el-input>
</el-form-item>
<el-form-item label="项目说明">
<el-input v-model="edit_data.desc" placeholder="请输入项目说明"></el-input>
</el-form-item>
<el-form-item label="基础项目">
<span style="margin-right: 10px;">{{ edit_data.jichu.length }} 个关联项目</span>
<el-button type="primary" size="small" @click="editItemClick('jichu')"></el-button>
</el-form-item>
<el-form-item label="推荐项目">
<span style="margin-right: 10px;">{{ edit_data.tuijian.length }} 个关联项目</span>
<el-button type="primary" size="small" @click="editItemClick('tuijian')"></el-button>
</el-form-item>
<el-form-item label="高端项目">
<span style="margin-right: 10px;">{{ edit_data.gaoduan.length }} 个关联项目</span>
<el-button type="primary" size="small" @click="editItemClick('gaoduan')"></el-button>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="edit_show = false">取消</el-button>
<el-button type="primary" @click="editDoneClick()"></el-button>
</span>
</template>
</el-dialog>
<div class="head">
<div class="head">
<el-row>
<el-form-item>
<el-input v-model="page_options.search" placeholder="搜索项目名称"/>
</el-form-item>
<el-button type="primary" @click="searchClick()" style="margin-left: 10px;">查询</el-button>
<el-button type="success" @click="createClick()" style="margin-left: 10px;">添加</el-button>
</el-row>
</div>
</div>
<el-table :data="table_list" style="width: 100%;" row-key="id" :tooltip-options="{
popperClass: 'popper_class_wrapper'
}">
<el-table-column prop="id" label="ID" width="100"/>
<el-table-column prop="name" label="项目名称" width="200"/>
<el-table-column prop="desc" label="项目说明" show-overflow-tooltip/>
<el-table-column label="基础项目" show-overflow-tooltip>
<template #default="scope">
{{ itemNameShow(scope.row.jichu) }}
</template>
</el-table-column>
<el-table-column label="推荐项目" show-overflow-tooltip>
<template #default="scope">
{{ itemNameShow(scope.row.tuijian) }}
</template>
</el-table-column>
<el-table-column label="高端项目" show-overflow-tooltip>
<template #default="scope">
{{ itemNameShow(scope.row.gaoduan) }}
</template>
</el-table-column>
<el-table-column label="操作" width="140">
<template #default="scope">
<el-button type="primary" @click="updateClick(scope.row)" size="small">修改</el-button>
<el-button type="danger" @click="deleteClick(scope.row.id)" size="small">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination v-if="last_page > 0" :current-page="page_options.page" mt-2 background layout="prev, pager, next"
:page-count="last_page" @update:current-page="searchClick"/>
</div>
</div>
</template>
<style>
.popper_class_wrapper {
width: 300px;
}
</style>
<style scoped>
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>

@ -4,12 +4,373 @@
* usersa0ChunLuyu
* date2024年10月12日 16:29:26
*/
import {ref, onMounted, nextTick} from 'vue';
import $router from '@/router'
import {onBeforeRouteUpdate} from "vue-router";
import {ElMessage, ElMessageBox} from 'element-plus'
import {
QuestionQuestionSelectAction,
QuestionItemSelectAction,
QuestionQuestionCreateAction,
QuestionQuestionUpdateAction,
QuestionQuestionDeleteAction,
QuestionQuestionListAction
} from '@/api/api.js'
const default_page_options = {
search: '',
page: 1,
}
const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => {
routerChange(to.query)
})
const table_list = ref([])
const last_page = ref(0)
const QuestionQuestionList = async () => {
const response = await QuestionQuestionListAction(page_options.value)
if (response.status) {
table_list.value = response.data.list.data.map((item) => {
return {
...item,
option: JSON.parse(item.option)
}
})
last_page.value = response.data.list.last_page
} else {
ElMessage.error(response.msg)
}
}
const routerChange = (query) => {
page_options.value = {
search: query.search || default_page_options.search,
page: Number(query.page) || default_page_options.page,
}
QuestionQuestionList()
}
const searchClick = (page = 1) => {
page_options.value.page = page
$router.push({
query: JSON.parse(JSON.stringify(page_options.value))
})
}
const select_option = {
value: [
{content: 'A. ', type: 'items', items: [], questions: []},
{content: 'B. ', type: 'items', items: [], questions: []},
{content: 'C. ', type: 'items', items: [], questions: []},
]
}
const input_option = {
value: '',
placeholder: '请输入选项内容'
}
const edit_data_default = {
id: 0,
question: '',
type: 'input',
option: {
input: JSON.parse(JSON.stringify(input_option)),
select: JSON.parse(JSON.stringify(select_option)),
},
}
const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default)))
const edit_show = ref(false)
const createClick = () => {
updateClick(edit_data_default)
}
const updateClick = (row) => {
edit_data.value = JSON.parse(JSON.stringify(row))
edit_show.value = true
}
const editDoneClick = async () => {
const $func = edit_data.value.id !== 0 ? QuestionQuestionUpdateAction : QuestionQuestionCreateAction
const response = await $func({
...edit_data.value,
option: JSON.stringify(edit_data.value.option),
})
if (response.status) {
edit_show.value = false
await QuestionQuestionList()
} else {
ElMessage.error(response.msg)
}
}
const QuestionQuestionDelete = async (id) => {
const response = await QuestionQuestionDeleteAction({id})
if (response.status) {
await QuestionQuestionList()
} else {
ElMessage.error(response.msg)
}
}
const deleteClick = (id) => {
ElMessageBox.confirm(
'是否确认删除该题目?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
QuestionQuestionDelete(id)
}).catch(() => {
})
}
const edit_item_data = ref({
active: 0,
items: []
})
const edit_item_show = ref(false)
const question_list = ref([])
const QuestionQuestionSelect = async () => {
const response = await QuestionQuestionSelectAction()
if (response.status) {
question_list.value = response.data.list
} else {
ElMessage.error(response.msg)
}
}
const editItemClick = async (index) => {
const type = edit_data.value.option.select.value[index].type
if (type === 'questions') {
await QuestionQuestionSelect()
}
await nextTick(() => {
edit_item_data.value = {
active: index,
items: JSON.parse(JSON.stringify(edit_data.value.option.select.value[index][type]))
}
edit_item_show.value = true
})
}
const editItemDoneClick = () => {
const type = edit_data.value.option.select.value[edit_item_data.value.active].type
edit_data.value.option.select.value[edit_item_data.value.active][type] = JSON.parse(JSON.stringify(edit_item_data.value.items))
edit_item_show.value = false
}
const filterMethod = (query, item) => {
const type = edit_data.value.option.select.value[edit_item_data.value.active].type
if (type === 'items') {
return item.name.toLowerCase().includes(query.toLowerCase())
} else {
return item.question.toLowerCase().includes(query.toLowerCase())
}
}
const item_list = ref([])
const QuestionItemSelect = async () => {
const response = await QuestionItemSelectAction()
if (response.status) {
item_list.value = response.data.list
} else {
ElMessage.error(response.msg)
}
}
const moveQuestionClick = (index, type) => {
if (edit_data.value.option.select.value.length - 1 >= index + type) {
const question = edit_data.value.option.select.value[index]
edit_data.value.option.select.value[index] = JSON.parse(JSON.stringify(edit_data.value.option.select.value[index + type]))
edit_data.value.option.select.value[index + type] = JSON.parse(JSON.stringify(question))
}
}
const delQuestionClick = (index) => {
edit_data.value.option.select.value.splice(index, 1)
}
const addQuestionClick = () => {
edit_data.value.option.select.value.push({content: '', type: 'items', items: [], questions: []})
}
const question_type_map = {
select: '选择题',
input: '输入框'
}
onMounted(() => {
routerChange($router.currentRoute.value.query)
QuestionItemSelect()
})
</script>
<template>
<div>
<el-dialog v-model="edit_item_show" title="关联管理" width="610px"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false">
<div>
<el-transfer
:titles="['可选', '已选']"
:props="{key: 'id', label: edit_data.option.select.value[edit_item_data.active].type === 'items' ? 'name' : 'question'}"
v-model="edit_item_data.items"
filterable
:filter-method="filterMethod"
filter-placeholder="搜索"
:data="edit_data.option.select.value[edit_item_data.active].type === 'items' ? item_list : question_list"
/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="editItemDoneClick()" type="primary">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="edit_show" :title="`${!!edit_data.id ? '编辑' : '新建'}`" width="1000px">
<div>
<el-form label-width="150">
<el-form-item label="题目">
<el-input v-model="edit_data.question" placeholder="请输入题目"></el-input>
</el-form-item>
<el-form-item label="题目类型">
<el-select v-model="edit_data.type" placeholder="请选择题目类型">
<el-option label="选择题" value="select"></el-option>
<el-option label="输入框" value="input"></el-option>
</el-select>
</el-form-item>
<template v-if="edit_data.type === 'input'">
<el-form-item label="题目配置">
<div>
<div class="select_item_wrapper">
<el-input class="select_input_wrapper" v-model="edit_data.option.input.value"
placeholder="请输入默认值"></el-input>
<el-input class="select_input_wrapper" v-model="edit_data.option.input.placeholder"
placeholder="请输入占位符"></el-input>
</div>
</div>
</el-form-item>
</template>
<template v-else-if="edit_data.type === 'select'">
<el-form-item label="题目配置">
<div>
<div class="select_item_wrapper" v-for="(_,k) in edit_data.option.select.value" :key="k">
<el-input class="select_input_wrapper" v-model="edit_data.option.select.value[k].content"
placeholder="请输入"></el-input>
<el-select class="select_select_wrapper" v-model="edit_data.option.select.value[k].type"
placeholder="请选择题目类型">
<el-option label="项目" value="items"></el-option>
<el-option label="题目" value="questions"></el-option>
</el-select>
<span style="margin-right: 10px;">{{
edit_data.option.select.value[k].type === 'items'
? edit_data.option.select.value[k].items.length
: edit_data.option.select.value[k].questions.length
}}{{ edit_data.option.select.value[k].type === 'items' ? '项目' : '题目' }}</span>
<el-button type="primary" size="small" @click="editItemClick(k)">
编辑{{ edit_data.option.select.value[k].type === 'items' ? '项目' : '题目' }}
</el-button>
<el-button :disabled="k===0" type="primary" size="small" @click="moveQuestionClick(k, -1)">
</el-button>
<el-button :disabled="k===edit_data.option.select.value.length - 1" type="primary" size="small"
@click="moveQuestionClick(k, 1)">
</el-button>
<el-button :disabled="edit_data.option.select.value.length === 1" type="primary" size="small"
@click="delQuestionClick(k)">X
</el-button>
</div>
<div>
<el-button type="primary" size="small" @click="addQuestionClick()"></el-button>
</div>
</div>
</el-form-item>
</template>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="edit_show = false">取消</el-button>
<el-button type="primary" @click="editDoneClick()"></el-button>
</span>
</template>
</el-dialog>
<div class="head">
<div class="head">
<el-row>
<el-form-item>
<el-input v-model="page_options.search" placeholder="搜索题目"/>
</el-form-item>
<el-button type="primary" @click="searchClick()" style="margin-left: 10px;">查询</el-button>
<el-button type="success" @click="createClick()" style="margin-left: 10px;">添加</el-button>
</el-row>
</div>
</div>
<el-table :data="table_list" style="width: 100%;" row-key="id" :tooltip-options="{
popperClass: 'popper_class_wrapper'
}">
<el-table-column prop="id" label="ID" width="100"/>
<el-table-column prop="question" label="题目" width="200" show-overflow-tooltip/>
<el-table-column label="类型" width="100">
<template #default="scope">
{{ question_type_map[scope.row.type] }}
</template>
</el-table-column>
<el-table-column label="题目配置">
<template #default="scope">
<div v-if="scope.row.type === 'input'" class="select_item_wrapper">
<span class="title_wrapper">占位符</span><span
style="margin: 0 10px;">{{ scope.row.option.input.placeholder }}</span>
<span v-if="!!scope.row.option.input.value" class="title_wrapper">默认值:</span><span style="margin: 0 10px;">{{
scope.row.option.input.value
}}</span>
</div>
<div v-else-if="scope.row.type === 'select'">
<div class="select_item_wrapper" v-for="(i,k) in scope.row.option.select.value" :key="k">
<span style="margin-right: 10px;width: 400px;">{{ i.content }}</span>
<span class="title_wrapper">带出</span>
<span>{{
scope.row.option.select.value[k].type === 'items' ? '项目' : '题目'
}}</span>
<span style="margin: 0 5px;">{{ scope.row.option.select.value[k][scope.row.option.select.value[k].type].length }}</span>
<span></span>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="140">
<template #default="scope">
<el-button type="primary" @click="updateClick(scope.row)" size="small">修改</el-button>
<el-button type="danger" @click="deleteClick(scope.row.id)" size="small">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="page">
<el-pagination v-if="last_page > 0" :current-page="page_options.page" mt-2 background layout="prev, pager, next"
:page-count="last_page" @update:current-page="searchClick"/>
</div>
</div>
</template>
<style>
.popper_class_wrapper {
width: 300px;
}
</style>
<style scoped>
.title_wrapper {
font-weight: bold;
}
.select_input_wrapper {
width: 300px;
margin-right: 10px;
}
.select_select_wrapper {
width: 80px;
margin-right: 10px;
}
.select_item_wrapper {
display: flex;
align-items: center;
margin-bottom: 5px;
}
.page {
display: flex;
justify-content: flex-end;
margin-top: 10px;
}
</style>

@ -30,7 +30,12 @@ let projectIds = ref([]); // 项目id集合
let screenObj = ref({}); //
let combo_select = ref({}); //
let comboIds = ref([]); //
let status = ref(false); //
let popupMultiple = ref(false); //
let multipleList = ref([]); //
let multipleIndex = ref(0); //
let itemIds = ref([]); // id
let itemId = ref(""); // id
let comboId = ref(""); // id
const selectItemClick = async (index, key) => {
//
@ -266,13 +271,45 @@ onShow(() => {
});
const buyClick = async (item) => {
let query = "?comboId=" + item.combo_id;
comboId.value = item.combo_id;
if (item.duo_xuan_yi.length > 0) {
popupMultiple.value.open("center");
multipleIndex.value = 0;
itemIds.value = [];
itemId.value = "";
multipleList.value = item.duo_xuan_yi;
return;
}
toDetail();
};
const nextItemClick = () => {
if (!itemId.value) {
uni.$lu.toast("请选择项目");
return;
}
itemIds.value.push(itemId.value);
if (multipleIndex.value == multipleList.value.length - 1) {
toDetail();
return;
}
itemId.value = "";
multipleIndex.value = multipleIndex.value + 1;
};
const toDetail = () => {
//
let query = "?comboId=" + comboId.value;
if ($props.groupId) {
// ID
query += "&groupId=" + $props.groupId;
}
if (itemIds.value.length) {
query += "&itemIds=" + itemIds.value.join(",");
}
// ID
// /
popupMultiple.value.close();
uni.navigateTo({
url: "/pages/main/tj/tjxq" + query,
});
@ -440,6 +477,54 @@ const toRouter = () => {
<view class="combo_line_wrapper"></view>
</view>
</view>
<uni-popup ref="popupMultiple" class="w-full">
<view class="rounded-10rpx px-20rpx pb-55rpx box-border bg-#fff w-95vw">
<view
class="center relative pt-40rpx pb-30rpx text-36rpx rounded-t-15rpx box-border"
>
<text class="line-height-[1] text-32rpx">请选择</text>
<uni-icons
@click="popupMultiple.close()"
type="closeempty"
color="#A6A6A6"
size="26"
class="absolute right-40rpx"
></uni-icons>
</view>
<view class="bg-#F8F8F8 px-20rpx box-border rounded-10rpx">
<view
v-for="(item, index) in multipleList[multipleIndex]"
:key="index"
class="px-20rpx box-border b-b-1 b-#EAEAEA b-solid bs between h-100rpx"
>
<text class="text-#000000 text-30rpx">{{ item.item_name }}</text>
<view class="center">
<text class="text-#EC3D15 text-20rpx">¥</text>
<text class="text-#EC3D15 text-32rpx mb-0">{{ item.price }}</text>
<uni-icons
@click="itemId = item.item_id"
class="ml-28rpx"
color="#239EA3"
:type="itemId == item.item_id ? 'checkbox-filled' : 'circle'"
size="30"
></uni-icons>
</view>
</view>
</view>
<view class="text-#239EA3 text-28rpx my-45rpx text-center"
>当前套餐包含一个可自由{{
multipleList[multipleIndex].length
}}选1的体检项目<br />根据您的实际情况自行选择</view
>
<view
class="w-270rpx h-80rpx bg-#239EA3 center text-#F8F8F8 text-30rpx rounded-10rpx mx-auto"
@click="nextItemClick()"
>{{
multipleIndex == multipleList.length - 1 ? "确定" : "下一项"
}}</view
>
</view>
</uni-popup>
<uni-popup ref="popup" mask-background-color="transparent">
<view class="pt-180rpx w-full h-100vh" @click="popup.close()">
<view class="bg-[rgba(0,0,0,0.3)] h-100%">

@ -15,9 +15,9 @@ const person_list = ref([]);
let popup = ref(null);
let unitList = ref([]); //
const getPersonList = async () => {
uni.showLoading()
uni.showLoading();
const response = await $api("GetPersonList");
uni.hideLoading()
uni.hideLoading();
$response(response, () => {
person_list.value = response.data.list;
});
@ -50,13 +50,13 @@ const choosePersonClick = async (info) => {
};
const getGroupCombo = async (info) => {
uni.showLoading()
uni.showLoading();
//
const response = await $api("GetGroupCombo", {
hospital_id: $store.save.hospital,
group_id: info.group_id,
});
uni.hideLoading()
uni.hideLoading();
$response(response, () => {
console.log(response);
if (response.data.unit.length) {
@ -64,19 +64,17 @@ const getGroupCombo = async (info) => {
data.sex = info.sex;
data.phone = info.phone;
data.phone = info.married;
$store.setGroupInfo(data);
$store.setGroupInfo(data);
popup.value.close();
if (!data.items.length && data.tongshou_xiane > 0) {
//
//
uni.navigateTo({
url: "/pages/main/tj/selectType"
url: "/pages/main/tj/selectType",
});
} else {
//
uni.navigateTo({
url:
"/pages/main/tj/tjxq?groupId=" +
info.group_id
url: "/pages/main/tj/tjxq?groupId=" + info.group_id,
});
}
}

@ -189,6 +189,7 @@ const comfrimyy = async () => {
item_ids: buyInfo.value.item_ids,
plan_id: plan_id,
plan_nmr_id: plan_nmr_id,
doctor: yytjInfo.value?.doctor_name || "",
};
console.log(obj);

@ -27,7 +27,6 @@ let timeIndex = ref(null); // 当前选中时间索引
let status = ref(0); // 1 2
let calendarShow = ref(false); //
const rl_list = ref(false); //
let calendar = ref(null);
let isClickDoctor = ref(0); //
const mountedAction = async () => {
@ -296,7 +295,10 @@ const getCurrentTime = (item, index) => {
status.value = 0;
$store.setYytjInfo(yytjInfo.value);
};
const xmmcClick = (val, index) => {
const xmmcClick = (val, index, status) => {
if (nmrIndex.value == index && status) {
return;
}
//
if (
yytjInfo.value.nmr_list.length > 1 &&
@ -313,7 +315,8 @@ const xmmcClick = (val, index) => {
currentDate.value = val.time.split(" ")[0];
} else {
if (
((yytjInfo.value.nmr_list.length > 1 && index == 1) ||
((yytjInfo.value.nmr_list.length > 1 &&
index == yytjInfo.value.nmr_list.length - 1) ||
(yytjInfo.value.nmr_list.length == 1 && index == 0)) &&
yytjInfo.value.doctor_date
) {
@ -352,25 +355,6 @@ const clickDoctor = () => {
});
};
const confirm = (e) => {
console.log(e);
if (new Date(e.fulldate).getTime() < new Date(getToday()).getTime()) {
uni.$lu.toast("不能选择过去时间");
let time = setTimeout(() => {
calendar.value.open();
clearTimeout(time);
}, 500);
return;
}
status.value = 0;
yytjInfo.value.nmr_list[yytjInfo.value.nmr_list.length - 1].time = e.fulldate;
yytjInfo.value.doctor_date = e.fulldate;
$store.setYytjInfo(yytjInfo.value);
uni.navigateTo({
url: `/pages/main/selectDoctor/selectDoctor?date=${e.fulldate}`,
});
};
const comfrimyy = () => {
console.log(yytjInfo.value);
status.value = 1;
@ -534,16 +518,6 @@ onShow(() => {
<uni-icons type="right" size="14"></uni-icons>
</text>
</view>
<view class="ylrl">
<uni-calendar
ref="calendar"
:startDate="getToday()"
:showMonth="false"
:date="getToday()"
:insert="false"
@confirm="confirm"
/>
</view>
</view>
<view
style="box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.04)"
@ -654,7 +628,7 @@ onShow(() => {
<view
v-for="(item, index) in yytjInfo.nmr_list"
:key="index"
@click="xmmcClick(item, index)"
@click="xmmcClick(item, index, 1)"
:class="nmrIndex == index ? 'acitvetc' : ''"
class="flex flex-justify-around p-20rpx pl-10rpx pr-10rpx rounded-15rpx"
>

Loading…
Cancel
Save