更新 问卷调查 项目 改成 关联套餐

main
鹿和sa0ChunLuyu 1 year ago
parent 241cf02bc2
commit 5e9d1cc6e7

@ -17,6 +17,15 @@ class QuestionItemController extends Controller
'list' => $items 'list' => $items
]); ]);
} }
public function combo(Request $request)
{
$combos = DB::table('combos')
->select(['combo_id', 'name', 'pinyin'])
->get();
return \Yz::Return(true, '操作完成', [
'list' => $combos
]);
}
public function create(Request $request) public function create(Request $request)
{ {

@ -120,8 +120,10 @@ class QuestionnairesLogsController extends Controller
public function sum_items($items, $check_items) public function sum_items($items, $check_items)
{ {
$sum = DB::table('items')->whereIn('item_id', $items)->where('status', 1)->sum('price'); $sum = DB::table('items')->whereIn('item_id', $items)->where('status', 1)->sum('price');
$check_sum = DB::table('items')->whereIn('item_id', $check_items)->where('status', 1)->sum('price'); $check_sum = DB::table('items')->whereIn('item_id', $check_items['items'])->where('status', 1)->sum('price');
return round($sum + $check_sum, 2); $combo = DB::table('combos')->whereIn('combo_id', [$check_items['combo']])->where('status', 1)->sum('price');
$zhekou = 1;
return number_format($combo + (($sum + $check_sum) * $zhekou), 2, '.', '');
} }
public function submit(Request $request) public function submit(Request $request)
{ {
@ -140,9 +142,21 @@ class QuestionnairesLogsController extends Controller
$items = json_decode($question_info->items, true); $items = json_decode($question_info->items, true);
$check_items = []; $check_items = [];
$check_items_array = [ $check_items_array = [
'jichu' => [], 'jichu' => [
'tuijian' => [], 'combo' => '0',
'gaoduan' => [], 'combo_items' => [],
'items' => []
],
'tuijian' => [
'combo' => '0',
'combo_items' => [],
'items' => []
],
'gaoduan' => [
'combo' => '0',
'combo_items' => [],
'items' => []
],
]; ];
$question_ids = []; $question_ids = [];
$question_map = []; $question_map = [];
@ -176,22 +190,85 @@ class QuestionnairesLogsController extends Controller
$check_items_info = DB::table('question_items')->where('id', $item)->first(); $check_items_info = DB::table('question_items')->where('id', $item)->first();
if (!!$check_items_info) { if (!!$check_items_info) {
$check_items[] = (string)$item; $check_items[] = (string)$item;
$jichu_ids = json_decode($check_items_info->jichu, true);
foreach ($jichu_ids as $jichu_id) { if ($check_items_info->jichu != '0') {
if (!in_array($jichu_id, $check_items_array['jichu']) && !in_array($jichu_id, $items)) { $jichu_combo_info = DB::table('combos')->where('combo_id', $check_items_info->jichu)->first();
$check_items_array['jichu'][] = $jichu_id; if (!!$jichu_combo_info) {
if ($check_items_array['jichu']['combo'] == '0') {
$items_ids = [];
$combo_items = json_decode($jichu_combo_info->items, true);
foreach ($combo_items as $combo_item) {
$items_ids[] = $combo_item['id'];
}
$check_items_array['jichu']['combo'] = $check_items_info->jichu;
$check_items_array['jichu']['combo_items'] = $items_ids;
} else {
$items_ids = [];
$combo_items = json_decode($jichu_combo_info->items, true);
foreach ($combo_items as $combo_item) {
if (
!in_array($combo_item['id'], $check_items_array['jichu']['combo_items']) &&
!in_array($combo_item['id'], $check_items_array['jichu']['items'])
) {
$items_ids[] = $combo_item['id'];
}
}
$check_items_array['jichu']['items'] = array_merge($check_items_array['jichu']['items'], $items_ids);
}
} }
} }
$tuijian_ids = json_decode($check_items_info->tuijian, true);
foreach ($tuijian_ids as $tuijian_id) { if ($check_items_info->tuijian != '0') {
if (!in_array($tuijian_id, $check_items_array['tuijian']) && !in_array($tuijian_id, $items)) { $tuijian_combo_info = DB::table('combos')->where('combo_id', $check_items_info->tuijian)->first();
$check_items_array['tuijian'][] = $tuijian_id; if (!!$tuijian_combo_info) {
if ($check_items_array['tuijian']['combo'] == '0') {
$items_ids = [];
$combo_items = json_decode($tuijian_combo_info->items, true);
foreach ($combo_items as $combo_item) {
$items_ids[] = $combo_item['id'];
}
$check_items_array['tuijian']['combo'] = $check_items_info->tuijian;
$check_items_array['tuijian']['combo_items'] = $items_ids;
} else {
$items_ids = [];
$combo_items = json_decode($tuijian_combo_info->items, true);
foreach ($combo_items as $combo_item) {
if (
!in_array($combo_item['id'], $check_items_array['tuijian']['combo_items']) &&
!in_array($combo_item['id'], $check_items_array['tuijian']['items'])
) {
$items_ids[] = $combo_item['id'];
}
}
$check_items_array['tuijian']['items'] = array_merge($check_items_array['tuijian']['items'], $items_ids);
}
} }
} }
$gaoduan_ids = json_decode($check_items_info->gaoduan, true);
foreach ($gaoduan_ids as $gaoduan_id) { if ($check_items_info->gaoduan != '0') {
if (!in_array($gaoduan_id, $check_items_array['gaoduan']) && !in_array($gaoduan_id, $items)) { $gaoduan_combo_info = DB::table('combos')->where('combo_id', $check_items_info->gaoduan)->first();
$check_items_array['gaoduan'][] = $gaoduan_id; if (!!$gaoduan_combo_info) {
if ($check_items_array['gaoduan']['combo'] == '0') {
$items_ids = [];
$combo_items = json_decode($gaoduan_combo_info->items, true);
foreach ($combo_items as $combo_item) {
$items_ids[] = $combo_item['id'];
}
$check_items_array['gaoduan']['combo'] = $check_items_info->gaoduan;
$check_items_array['gaoduan']['combo_items'] = $items_ids;
} else {
$items_ids = [];
$combo_items = json_decode($gaoduan_combo_info->items, true);
foreach ($combo_items as $combo_item) {
if (
!in_array($combo_item['id'], $check_items_array['gaoduan']['combo_items']) &&
!in_array($combo_item['id'], $check_items_array['gaoduan']['items'])
) {
$items_ids[] = $combo_item['id'];
}
}
$check_items_array['gaoduan']['items'] = array_merge($check_items_array['gaoduan']['items'], $items_ids);
}
} }
} }
} }

@ -36,6 +36,7 @@ Route::group(['middleware' => ['checktoken', 'log'], 'prefix' => 'v1'], function
Route::post('admin/questionQuestion/list', 'App\Http\Controllers\API\Admin\QuestionQuestionController@list'); 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/select', 'App\Http\Controllers\API\Admin\QuestionItemController@select');
Route::post('admin/questionItem/combo', 'App\Http\Controllers\API\Admin\QuestionItemController@combo');
Route::post('admin/questionItem/item', 'App\Http\Controllers\API\Admin\QuestionItemController@item'); 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/create', 'App\Http\Controllers\API\Admin\QuestionItemController@create');
Route::post('admin/questionItem/update', 'App\Http\Controllers\API\Admin\QuestionItemController@update'); Route::post('admin/questionItem/update', 'App\Http\Controllers\API\Admin\QuestionItemController@update');

@ -312,6 +312,10 @@ export const QuestionItemListAction = (data = {}) => {
export const QuestionItemItemAction = (data = {}) => { export const QuestionItemItemAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/item`, data: data}) return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/item`, data: data})
} }
// 问卷调查 获取 套餐列表
export const QuestionItemComboAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/combo`, data: data})
}
// 项目列表[全部] // 项目列表[全部]
export const QuestionItemSelectAction = (data = {}) => { export const QuestionItemSelectAction = (data = {}) => {
return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/select`, data: data}) return axios({url: import.meta.env.VITE_APP_API + `v1/admin/questionItem/select`, data: data})

@ -4,36 +4,31 @@
* usersa0ChunLuyu * usersa0ChunLuyu
* date2024年10月12日 16:29:26 * date2024年10月12日 16:29:26
*/ */
import {ref, onMounted} from 'vue'; import { ref, onMounted } from 'vue'
import $router from '@/router' import $router from '@/router'
import {onBeforeRouteUpdate} from "vue-router"; import { onBeforeRouteUpdate } from 'vue-router'
import {ElMessage, ElMessageBox} from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { import {
QuestionItemCreateAction, QuestionItemCreateAction,
QuestionItemUpdateAction, QuestionItemUpdateAction,
QuestionItemDeleteAction, QuestionItemDeleteAction,
QuestionItemListAction, QuestionItemComboAction,
QuestionItemItemAction QuestionItemListAction
} from '@/api/api.js' } from '@/api/api.js'
const default_page_options = { const default_page_options = {
search: '', search: '',
page: 1, page: 1
} }
const page_options = ref(JSON.parse(JSON.stringify(default_page_options))) const page_options = ref(JSON.parse(JSON.stringify(default_page_options)))
onBeforeRouteUpdate((to) => { onBeforeRouteUpdate((to) => {
routerChange(to.query) routerChange(to.query)
}) })
const item_list = ref([]) const combo_list = ref([])
const QuestionItemItem = async () => { const QuestionItemCombo = async () => {
const response = await QuestionItemItemAction({}) const response = await QuestionItemComboAction({})
if (response.status) { if (response.status) {
item_list.value = response.data.list.map((item) => { combo_list.value = response.data.list
return {
...item,
name: item.sex !== 0 ? `${item.name}(${item.sex === 1 ? '男' : '女'})` : item.name
}
})
} else { } else {
ElMessage.error(response.msg) ElMessage.error(response.msg)
} }
@ -43,14 +38,7 @@ const last_page = ref(0)
const QuestionItemList = async () => { const QuestionItemList = async () => {
const response = await QuestionItemListAction(page_options.value) const response = await QuestionItemListAction(page_options.value)
if (response.status) { if (response.status) {
table_list.value = response.data.list.data.map((item) => { table_list.value = response.data.list.data
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 last_page.value = response.data.list.last_page
} else { } else {
ElMessage.error(response.msg) ElMessage.error(response.msg)
@ -60,7 +48,7 @@ const QuestionItemList = async () => {
const routerChange = (query) => { const routerChange = (query) => {
page_options.value = { page_options.value = {
search: query.search || default_page_options.search, search: query.search || default_page_options.search,
page: Number(query.page) || default_page_options.page, page: Number(query.page) || default_page_options.page
} }
QuestionItemList() QuestionItemList()
} }
@ -72,22 +60,13 @@ const searchClick = (page = 1) => {
}) })
} }
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 = { const edit_data_default = {
id: 0, id: 0,
name: '', name: '',
desc: '', desc: '',
jichu: [], jichu: '0',
tuijian: [], tuijian: '0',
gaoduan: [], gaoduan: '0'
} }
const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default))) const edit_data = ref(JSON.parse(JSON.stringify(edit_data_default)))
const edit_show = ref(false) const edit_show = ref(false)
@ -101,10 +80,7 @@ const updateClick = (row) => {
const editDoneClick = async () => { const editDoneClick = async () => {
const $func = edit_data.value.id !== 0 ? QuestionItemUpdateAction : QuestionItemCreateAction const $func = edit_data.value.id !== 0 ? QuestionItemUpdateAction : QuestionItemCreateAction
const response = await $func({ const response = await $func({
...edit_data.value, ...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) { if (response.status) {
edit_show.value = false edit_show.value = false
@ -115,7 +91,7 @@ const editDoneClick = async () => {
} }
const QuestionItemDelete = async (id) => { const QuestionItemDelete = async (id) => {
const response = await QuestionItemDeleteAction({id}) const response = await QuestionItemDeleteAction({ id })
if (response.status) { if (response.status) {
await QuestionItemList() await QuestionItemList()
} else { } else {
@ -124,67 +100,28 @@ const QuestionItemDelete = async (id) => {
} }
const deleteClick = (id) => { const deleteClick = (id) => {
ElMessageBox.confirm( ElMessageBox.confirm('是否确认删除该项目?', '提示', {
'是否确认删除该项目?', confirmButtonText: '确认',
'提示', cancelButtonText: '取消',
{ type: 'warning'
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
QuestionItemDelete(id)
}).catch(() => {
}) })
.then(() => {
QuestionItemDelete(id)
})
.catch(() => {})
} }
const edit_item_data = ref({ const comboNameShow = (combo_id) => {
active: 'jichu', if (Number(combo_id) === 0) return '无关联套餐'
items: [] return combo_list.value.find((i) => i.combo_id == combo_id).name
})
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(() => { onMounted(() => {
routerChange($router.currentRoute.value.query) routerChange($router.currentRoute.value.query)
QuestionItemItem() QuestionItemCombo()
}) })
</script> </script>
<template> <template>
<div> <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 ? '编辑' : '新建'}`"> <el-dialog v-model="edit_show" :title="`${!!edit_data.id ? '编辑' : '新建'}`">
<div> <div>
<el-form label-width="150"> <el-form label-width="150">
@ -195,24 +132,42 @@ onMounted(() => {
<el-input v-model="edit_data.desc" placeholder="请输入项目说明"></el-input> <el-input v-model="edit_data.desc" placeholder="请输入项目说明"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="基础项目"> <el-form-item label="基础项目">
<span style="margin-right: 10px;">{{ edit_data.jichu.length }} 个关联项目</span> <el-select filterable v-model="edit_data.jichu" placeholder="请选择">
<el-button type="primary" size="small" @click="editItemClick('jichu')"></el-button> <el-option
v-for="(i, k) in [{ combo_id: '0', name: '暂不关联' }, ...combo_list]"
:key="k"
:label="i.name"
:value="i.combo_id"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="推荐项目"> <el-form-item label="推荐项目">
<span style="margin-right: 10px;">{{ edit_data.tuijian.length }} 个关联项目</span> <el-select filterable v-model="edit_data.tuijian" placeholder="请选择">
<el-button type="primary" size="small" @click="editItemClick('tuijian')"></el-button> <el-option
v-for="(i, k) in [{ combo_id: '0', name: '暂不关联' }, ...combo_list]"
:key="k"
:label="i.name"
:value="i.combo_id"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="高端项目"> <el-form-item label="高端项目">
<span style="margin-right: 10px;">{{ edit_data.gaoduan.length }} 个关联项目</span> <el-select filterable v-model="edit_data.gaoduan" placeholder="请选择">
<el-button type="primary" size="small" @click="editItemClick('gaoduan')"></el-button> <el-option
v-for="(i, k) in [{ combo_id: '0', name: '暂不关联' }, ...combo_list]"
:key="k"
:label="i.name"
:value="i.combo_id"
/>
</el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="edit_show = false">取消</el-button> <el-button @click="edit_show = false">取消</el-button>
<el-button type="primary" @click="editDoneClick()"></el-button> <el-button type="primary" @click="editDoneClick()"></el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -220,32 +175,41 @@ onMounted(() => {
<div class="head"> <div class="head">
<el-row> <el-row>
<el-form-item> <el-form-item>
<el-input v-model="page_options.search" placeholder="搜索项目名称"/> <el-input v-model="page_options.search" placeholder="搜索项目名称" />
</el-form-item> </el-form-item>
<el-button type="primary" @click="searchClick()" style="margin-left: 10px;">查询</el-button> <el-button type="primary" @click="searchClick()" style="margin-left: 10px"
<el-button type="success" @click="createClick()" style="margin-left: 10px;">添加</el-button> >查询</el-button
>
<el-button type="success" @click="createClick()" style="margin-left: 10px"
>添加</el-button
>
</el-row> </el-row>
</div> </div>
</div> </div>
<el-table :data="table_list" style="width: 100%;" row-key="id" :tooltip-options="{ <el-table
:data="table_list"
style="width: 100%"
row-key="id"
:tooltip-options="{
popperClass: 'popper_class_wrapper' 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="id" label="ID" width="100" />
<el-table-column prop="desc" label="项目说明" show-overflow-tooltip/> <el-table-column prop="name" label="项目名称" width="200" />
<el-table-column prop="desc" label="项目说明" show-overflow-tooltip />
<el-table-column label="基础项目" show-overflow-tooltip> <el-table-column label="基础项目" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ itemNameShow(scope.row.jichu) }} {{ comboNameShow(scope.row.jichu) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="推荐项目" show-overflow-tooltip> <el-table-column label="推荐项目" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ itemNameShow(scope.row.tuijian) }} {{ comboNameShow(scope.row.tuijian) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="高端项目" show-overflow-tooltip> <el-table-column label="高端项目" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ itemNameShow(scope.row.gaoduan) }} {{ comboNameShow(scope.row.gaoduan) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="140"> <el-table-column label="操作" width="140">
@ -257,8 +221,15 @@ onMounted(() => {
</el-table> </el-table>
<div class="page"> <div class="page">
<el-pagination v-if="last_page > 0" :current-page="page_options.page" mt-2 background layout="prev, pager, next" <el-pagination
:page-count="last_page" @update:current-page="searchClick"/> 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>
</div> </div>
</template> </template>

@ -74,11 +74,15 @@
} }
const itemShow = (type) => { const itemShow = (type) => {
const id = question_info.value.check_items_array[type].combo
const mergedArray = [...new Set([ const mergedArray = [...new Set([
...question_info.value.items, ...question_info.value.items,
...question_info.value.check_items_array[type] ...question_info.value.check_items_array[type].items
])] ])]
let query = "?itemIds=" + mergedArray.join(','); let query = "?comboId=" + id + '&wj=1';
if (mergedArray.length !== 0) {
query += "&itemIds=" + mergedArray.join(',');
}
uni.navigateTo({ uni.navigateTo({
url: "/pages/main/tj/tjxq" + query, url: "/pages/main/tj/tjxq" + query,
}); });
@ -104,7 +108,10 @@
<view class="items_title_wrapper"> <view class="items_title_wrapper">
<view class="items_title_text_wrapper">基础推荐方案</view> <view class="items_title_text_wrapper">基础推荐方案</view>
<view class="items_title_count_wrapper"> <view class="items_title_count_wrapper">
<text>{{ question_info.items.length + question_info.check_items_array.jichu.length }}</text> <text>{{ question_info.items.length
+ question_info.check_items_array.jichu.combo_items.length
+ question_info.check_items_array.jichu.items.length
}}</text>
<view class="count_icon_wrapper"> <view class="count_icon_wrapper">
<uni-icons type="right" size="20"></uni-icons> <uni-icons type="right" size="20"></uni-icons>
</view> </view>
@ -120,11 +127,14 @@
</view> </view>
</view> </view>
<view v-if="question_info.check_items_array.tuijian.length > 0" class="items_item_wrapper"> <view v-if="Number(question_info.check_items_array.tuijian.combo) !== 0" class="items_item_wrapper">
<view class="items_title_wrapper"> <view class="items_title_wrapper">
<view class="items_title_text_wrapper">中等推荐方案</view> <view class="items_title_text_wrapper">中等推荐方案</view>
<view class="items_title_count_wrapper"> <view class="items_title_count_wrapper">
<text>{{ question_info.items.length + question_info.check_items_array.tuijian.length }}</text> <text>{{ question_info.items.length
+ question_info.check_items_array.tuijian.combo_items.length
+ question_info.check_items_array.tuijian.items.length
}}</text>
<view class="count_icon_wrapper"> <view class="count_icon_wrapper">
<uni-icons type="right" size="20"></uni-icons> <uni-icons type="right" size="20"></uni-icons>
</view> </view>
@ -140,11 +150,14 @@
</view> </view>
</view> </view>
<view v-if="question_info.check_items_array.gaoduan.length > 0" class="items_item_wrapper"> <view v-if="Number(question_info.check_items_array.gaoduan.combo) !== 0" class="items_item_wrapper">
<view class="items_title_wrapper"> <view class="items_title_wrapper">
<view class="items_title_text_wrapper">高端推荐方案</view> <view class="items_title_text_wrapper">高端推荐方案</view>
<view class="items_title_count_wrapper"> <view class="items_title_count_wrapper">
<text>{{ question_info.items.length + question_info.check_items_array.gaoduan.length }}</text> <text>{{ question_info.items.length
+ question_info.check_items_array.gaoduan.combo_items.length
+ question_info.check_items_array.gaoduan.items.length
}}</text>
<view class="count_icon_wrapper"> <view class="count_icon_wrapper">
<uni-icons type="right" size="16"></uni-icons> <uni-icons type="right" size="16"></uni-icons>
</view> </view>

Loading…
Cancel
Save