Files
fishery-app/src/components/other/fish.vue
2026-01-12 00:36:05 +08:00

220 lines
5.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<nut-row class="fishBody">
<view class="sticky-header">
<nut-col :span="24" class="view_f_between" :style="{ padding: '10px' }">
<view class="font_28 c_222" @click="cancel">取消</view>
<view class="font_28 c_17B4B2" @click="confirm">确定</view>
</nut-col>
<nut-col :span="24">
<nut-searchbar
v-model="fishName"
max-length="20"
placeholder="请输入鱼类名称"
clearable
background="#efefef"
@search="search"
@clear="resTypeList"
>
<template #leftin>
<Search2 />
</template>
<template #rightin>
<nut-button type="primary" size="small" @click="search(fishName)"
>搜索</nut-button
>
</template>
</nut-searchbar>
</nut-col>
</view>
<nut-col :span="24">
<nut-config-provider :theme-vars="themeVars">
<nut-category :category="data.category" @change="changeText">
<template #default>
<nut-checkbox-group
ref="group"
v-model="props.fishIds"
:style="{ marginLeft: '10px' }"
>
<nut-checkbox
:label="item.catId"
v-for="item in data.customCategory"
shape="button"
:style="{ paddingTop: '10px' }"
>
{{ item.catName }}
</nut-checkbox>
</nut-checkbox-group>
</template>
</nut-category>
</nut-config-provider>
</nut-col>
</nut-row>
</template>
<script setup lang="ts" name="Fish">
import { fishList } from "@/api/pond";
import { Search2, Left, Photograph, Message } from "@nutui/icons-vue-taro";
import Taro from "@tarojs/taro";
const props = defineProps({
// 选中的鱼类
fishIds: {
type: Array,
default: function () {
return [];
},
},
});
const fishArr = ref<any>([]);
const data = reactive({
categoryInfo: {},
category: [{}],
customCategory: [{}],
});
// 鱼类名称-检索
const fishName = ref("");
const fishTypeNameMap = ref({
1: "常见鱼种",
2: "名优鱼",
3: "虾蟹类",
4: "观赏鱼",
5: "海水鱼",
6: "贝类",
7: "龟鳖类",
8: "蛙类",
9: "其它",
});
// 鱼类列表信息
const fishArray = ref<any>([]);
// 主题样式
const themeVars = ref({
checkboxLabelColor: "#222222",
checkboxLabelMarginLeft: "20px",
checkboxButtonFontSize: "14px",
checkboxButtonBorderRadius: "10px",
checkboxButtonBorderColor: "#ccc",
});
const emit = defineEmits(["cancel", "confirm"]);
/** -----------------method start----------------- */
onMounted(() => {
getFishList();
});
// 鱼类列表
function getFishList() {
fishList().then((res: any) => {
if (res.code == 200) {
fishArray.value = res.rows || [];
resTypeList();
}
});
}
// 点击文字
function changeText(index) {
data.customCategory = [].concat(data.categoryInfo.category[index].children);
}
// 检索鱼类
function search(e) {
if (e) {
data.category = [];
const customCategory: any = [];
data.categoryInfo.category.forEach((res) => {
res.children.forEach((child) => {
if (child.catName.includes(e)) {
const obj = {
catType: 1,
catId: child.catId,
catName: child.catName,
};
customCategory.push(obj);
}
});
});
data.customCategory = customCategory;
} else {
resTypeList();
}
}
// 初始化类别列表
function resTypeList() {
const resList = fishArray.value;
// 初始化临时结果容器
const typeMap = {};
// 遍历数据并按类型进行分组
for (const item of resList) {
const fishType = item.fishType;
const typeName = fishTypeNameMap.value[fishType];
if (!typeMap[fishType]) {
typeMap[fishType] = {
id: typeName,
name: typeName,
children: [],
};
}
typeMap[fishType].children.push({
id: item.id,
name: item.fishName,
catId: item.id,
catName: item.fishName,
});
}
const category: any = [];
const customCategory: any = [];
for (let [key, value] of Object.entries(fishTypeNameMap.value)) {
category.push({ catId: value, catName: value });
const arr = {};
arr["catId"] = String(value);
arr["catName"] = value;
arr["catType"] = 1;
const children: any = [];
resList.forEach((item) => {
if (item.fishType == key) {
children.push({ catId: String(item.id), catName: item.fishName });
}
});
arr["children"] = children;
customCategory.push(arr);
}
// 转换为所需数组格式
const dataArr = Object.values(typeMap);
fishArr.value = dataArr;
data.category = category;
data.customCategory = customCategory[0].children;
data.categoryInfo = {
level: 1,
showPic: true,
catType: 1,
category: customCategory,
};
}
// 取消
function cancel() {
emit("cancel", "");
}
// 确定
function confirm() {
const resList = fishArray.value;
const fishNameList = [];
resList.forEach((item) => {
if (props.fishIds.includes(String(item.id))) {
fishNameList.push(item.fishName);
}
});
const fishInfo = fishNameList.length > 0 ? fishNameList.join("") : "";
emit("confirm", { res: props.fishIds, fishInfo });
}
/** -----------------method end------------------- */
</script>
<style lang="scss">
.fishBody{
height: 100%;
display: flex;
flex-direction: column;
}
.sticky-header {
position: sticky;
top: 0;
z-index: 1000;
background-color: #ffffff;
}
</style>