Files
tms-erp-web/src/views/payment/components/bill-payment-search.vue
T
gxwebsoft b6fed6892a feat(organization): 全站所属组织搜索统一为树形下拉并修复项目部门宽度
- 新增复用 mixin organization-search.js,封装树形组织搜索功能,自动识别不同架构
- 替换合同管理、运输能力(司机/车辆/船舶)、费用模块的所属组织搜索使用树形下拉组件
- 将自定义搜索表单中所属组织 input 替换为 el-tree-select,支持树节点选中并写回名称
- 防止不同页面间组织数据相互覆盖,mixin 内部树数据命名为 organizationTreeOptions
- 修复项目补录页面业务部门错用全宽样式,恢复半宽显示,调整注释避免误读
- 各相关页面组件中引入并使用 mixin,调用接口加载组织树数据,保障搜索功能一致性
2026-08-28 16:00:53 +08:00

112 lines
3.4 KiB
Vue

<template>
<section class="bill-payment-search">
<el-form :model="query" label-position="right" label-width="88px" @submit.prevent>
<div class="bill-payment-search__grid">
<el-form-item label="单据号">
<el-input v-model="query.paymentNo" clearable placeholder="请输入" />
</el-form-item>
<el-form-item label="使用部门">
<el-tree-select
:model-value="query.deptName"
:data="organizationTreeOptions"
node-key="id"
check-strictly
filterable
clearable
render-after-expand
style="width: 100%"
placeholder="请选择 所属组织"
:props="{ label: 'label', value: 'id', children: 'children' }"
@update:model-value="val => { query.deptName = findOrgById(val)?.rawLabel || val }"
/>
</el-form-item>
<el-form-item label="付款日期">
<el-date-picker
v-model="query.paymentDateRange"
type="daterange"
unlink-panels
clearable
value-format="YYYY-MM-DD"
range-separator="~"
start-placeholder="//"
end-placeholder="//"
/>
</el-form-item>
<el-form-item label="单据状态">
<el-select v-model="query.approvalStatus" clearable placeholder="请选择">
<el-option
v-for="item in approvalStatusOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</div>
<div class="bill-payment-search__actions">
<el-button type="primary" :loading="loading" @click="$emit('search')">查询</el-button>
<el-button @click="$emit('reset')">重置</el-button>
<el-tooltip :content="expanded ? '折叠' : '展开'" placement="top">
<el-button text @click="expanded = !expanded">
<el-icon><component :is="expanded ? ArrowUp : ArrowDown" /></el-icon>
</el-button>
</el-tooltip>
</div>
</el-form>
</section>
</template>
<script>
import { ArrowDown, ArrowUp } from '@element-plus/icons-vue';
import { approvalStatusOptions } from '@/api/payment/billPayment';
import organizationSearch from '@/mixins/organization-search';
export default {
name: 'BillPaymentSearch',
mixins: [organizationSearch],
props: {
query: { type: Object, required: true },
loading: { type: Boolean, default: false },
},
emits: ['search', 'reset'],
data() {
return { ArrowDown, ArrowUp, expanded: false, approvalStatusOptions };
},
mounted() {
this.loadOrganizationOptions();
},
};
</script>
<style scoped lang="scss">
.bill-payment-search {
padding: 12px 12px 4px;
background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.bill-payment-search__grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px 24px;
}
.bill-payment-search :deep(.el-form-item) {
margin-bottom: 8px;
}
.bill-payment-search :deep(.el-input),
.bill-payment-search :deep(.el-select),
.bill-payment-search :deep(.el-date-editor) {
width: 100%;
}
.bill-payment-search__actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-bottom: 8px;
}
@media (max-width: 1200px) {
.bill-payment-search__grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
</style>