| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <script setup>
- import { computed, reactive, ref, toRef, watch } from 'vue'
- import ScreenModal from '@/components/ScreenModal.vue'
- import { getYakOutboundReports } from '@/api/home'
- import { displayEmpty } from '@/utils/displayEmpty'
- import { buildScreenYearOptions } from '@/utils/screenYearOptions'
- import { useDialogStatYearSync } from '@/utils/useDialogStatYearSync'
- import { useScreenTownVillageOptions } from '@/utils/screenTownVillage'
- const props = defineProps({
- modelValue: { type: Boolean, default: false }
- })
- const emit = defineEmits(['update:modelValue'])
- const visible = computed({
- get: () => props.modelValue,
- set: (v) => emit('update:modelValue', v)
- })
- const query = reactive({
- statYear: undefined,
- statMonth: undefined,
- townDeptId: undefined,
- villageDeptId: undefined
- })
- const { townOptions, villageOptions, loadTownVillageOptions } = useScreenTownVillageOptions(
- toRef(query, 'townDeptId')
- )
- const loading = ref(false)
- const tableRows = ref([])
- const total = ref(0)
- const pageNum = ref(1)
- const pageSize = ref(10)
- const yearSelectOptions = buildScreenYearOptions()
- const { syncDialogYearFromGlobal } = useDialogStatYearSync(query, {
- visible,
- onSynced: () => {
- pageNum.value = 1
- fetchList()
- }
- })
- const monthOptions = Array.from({ length: 12 }, (_, i) => i + 1)
- function toNum(val) {
- if (val === null || val === undefined || val === '') {
- return null
- }
- const n = Number(val)
- return Number.isNaN(n) ? null : n
- }
- /** 自食合计 = 牛 + 绵羊 + 山羊;全空则展示 -- */
- function selfConsumptionTotal(row) {
- const cattle = toNum(row?.selfConsumptionCattleCount)
- const sheep = toNum(row?.selfConsumptionSheepCount)
- const goat = toNum(row?.selfConsumptionGoatCount)
- if (cattle === null && sheep === null && goat === null) {
- return displayEmpty(null)
- }
- return (cattle || 0) + (sheep || 0) + (goat || 0)
- }
- async function fetchList() {
- loading.value = true
- try {
- const params = {
- pageNum: pageNum.value,
- pageSize: pageSize.value,
- statYear: query.statYear,
- statMonth: query.statMonth
- }
- if (query.townDeptId != null && query.townDeptId !== '') {
- params.townDeptId = query.townDeptId
- }
- if (query.villageDeptId != null && query.villageDeptId !== '') {
- params.villageDeptId = query.villageDeptId
- }
- const res = await getYakOutboundReports(params)
- tableRows.value = res.rows || []
- total.value = Number(res.total) || 0
- } catch {
- tableRows.value = []
- total.value = 0
- } finally {
- loading.value = false
- }
- }
- function handleSearch() {
- pageNum.value = 1
- fetchList()
- }
- function handleReset() {
- syncDialogYearFromGlobal()
- query.statMonth = undefined
- query.townDeptId = undefined
- query.villageDeptId = undefined
- pageNum.value = 1
- fetchList()
- }
- function onTownChange() {
- query.villageDeptId = undefined
- }
- function onOpen() {
- syncDialogYearFromGlobal()
- query.statMonth = undefined
- query.townDeptId = undefined
- query.villageDeptId = undefined
- pageNum.value = 1
- loadTownVillageOptions().then(() => fetchList())
- }
- function onClose() {
- tableRows.value = []
- total.value = 0
- }
- watch([pageNum, pageSize], () => {
- if (visible.value) {
- fetchList()
- }
- })
- </script>
- <template>
- <ScreenModal
- v-model="visible"
- title="牲畜自食情况明细"
- width="1480px"
- height="780px"
- max-width="98vw"
- max-height="94vh"
- @open="onOpen"
- @close="onClose"
- >
- <el-form :inline="true" :model="query" class="sc-form" @submit.prevent>
- <el-form-item label="年份">
- <el-select v-model="query.statYear" clearable placeholder="年份" style="width: 110px">
- <el-option v-for="y in yearSelectOptions" :key="y" :label="`${y}年`" :value="y" />
- </el-select>
- </el-form-item>
- <el-form-item label="月份">
- <el-select v-model="query.statMonth" clearable placeholder="月份" style="width: 100px">
- <el-option v-for="m in monthOptions" :key="m" :label="`${m}月`" :value="m" />
- </el-select>
- </el-form-item>
- <el-form-item label="乡镇">
- <el-select
- v-model="query.townDeptId"
- placeholder="全部乡镇"
- clearable
- filterable
- style="width: 160px"
- @change="onTownChange"
- >
- <el-option
- v-for="t in townOptions"
- :key="t.deptId"
- :label="t.deptName"
- :value="t.deptId"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="村">
- <el-select
- v-model="query.villageDeptId"
- placeholder="全部村"
- clearable
- filterable
- style="width: 160px"
- >
- <el-option
- v-for="v in villageOptions"
- :key="v.deptId"
- :label="v.deptName"
- :value="v.deptId"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleSearch">搜索</el-button>
- <el-button @click="handleReset">重置</el-button>
- </el-form-item>
- </el-form>
- <el-table
- v-loading="loading"
- :data="tableRows"
- border
- stripe
- height="100%"
- class="sc-table"
- empty-text="暂无数据"
- >
- <el-table-column prop="statYear" label="年份" width="80" align="center">
- <template #default="{ row }">{{ displayEmpty(row.statYear) }}</template>
- </el-table-column>
- <el-table-column prop="statMonth" label="月份" width="70" align="center">
- <template #default="{ row }">{{ displayEmpty(row.statMonth) }}</template>
- </el-table-column>
- <el-table-column prop="townName" label="乡镇" min-width="100" show-overflow-tooltip>
- <template #default="{ row }">{{ displayEmpty(row.townName) }}</template>
- </el-table-column>
- <el-table-column prop="villageName" label="村" min-width="100" show-overflow-tooltip>
- <template #default="{ row }">{{ displayEmpty(row.villageName) }}</template>
- </el-table-column>
- <el-table-column label="户数(户)" min-width="100" align="right">
- <template #default="{ row }">{{ displayEmpty(row.farmerHouseholdCount) }}</template>
- </el-table-column>
- <el-table-column label="人数(人)" min-width="100" align="right">
- <template #default="{ row }">{{ displayEmpty(row.farmerPopulationCount) }}</template>
- </el-table-column>
- <el-table-column label="牛(头)" min-width="90" align="right">
- <template #default="{ row }">{{ displayEmpty(row.selfConsumptionCattleCount) }}</template>
- </el-table-column>
- <el-table-column label="绵羊(只)" min-width="90" align="right">
- <template #default="{ row }">{{ displayEmpty(row.selfConsumptionSheepCount) }}</template>
- </el-table-column>
- <el-table-column label="山羊(只)" min-width="90" align="right">
- <template #default="{ row }">{{ displayEmpty(row.selfConsumptionGoatCount) }}</template>
- </el-table-column>
- <el-table-column label="合计(头只匹)" min-width="120" align="right">
- <template #default="{ row }">{{ selfConsumptionTotal(row) }}</template>
- </el-table-column>
- </el-table>
- <div class="sc-pager">
- <el-pagination
- v-model:current-page="pageNum"
- v-model:page-size="pageSize"
- background
- layout="total, sizes, prev, pager, next"
- :total="total"
- :page-sizes="[10, 20, 50]"
- />
- </div>
- </ScreenModal>
- </template>
- <style scoped>
- .sc-form {
- flex-shrink: 0;
- margin-bottom: 8px;
- }
- .sc-form :deep(.el-form-item__label) {
- color: #a8d4c8;
- }
- .sc-table {
- width: 100%;
- flex: 1;
- min-height: 0;
- }
- .sc-pager {
- flex-shrink: 0;
- display: flex;
- justify-content: flex-end;
- margin-top: 12px;
- }
- </style>
|