This commit is contained in:
2025-09-12 21:23:44 +08:00
23 changed files with 896 additions and 383 deletions

View File

@@ -13,52 +13,63 @@ export function getIndexCount() {
export function getStatisticsCurrDay() { export function getStatisticsCurrDay() {
return requestClient.get<any>('/sis/alarmEvents/query/statistics/currDay'); return requestClient.get<any>('/sis/alarmEvents/query/statistics/currDay');
} }
// 所有预警信息分类统计 // 所有预警信息分类统计
export function getStatistics() { export function getStatistics() {
return requestClient.get<any>('/sis/alarmEvents/query/statistics'); return requestClient.get<any>('/sis/alarmEvents/query/statistics');
} }
// 工单 // 工单
export function getworkOrder() { export function getworkOrder() {
return requestClient.get<any>('/property/screen/typeWorkOrderHistogram'); return requestClient.get<any>(
'/property/cockpit/screen/typeWorkOrderHistogram',
);
} }
// 会议室 // 会议室
export function getTodayMeetCount() { export function getTodayMeetCount() {
return requestClient.get<any>('/property/screen/todayMeetCount'); return requestClient.get<any>('/property/cockpit/screen/todayMeetCount');
} }
// 水电 // 水电
export function getHydropower() { export function getHydropower() {
return requestClient.get<any>('/property/meterInfo/statusCount'); return requestClient.get<any>('/property/meterInfo/statusCount');
} }
// 门禁 // 门禁
export function getAccessControl() { export function getAccessControl() {
return requestClient.get<any>('/sis/e8/door/online'); return requestClient.get<any>('/sis/e8/door/online');
} }
// 摄像头状态 // 摄像头状态
export function getCamera() { export function getCamera() {
return requestClient.get<any>('/sis/deviceManage/online'); return requestClient.get<any>('/sis/deviceManage/online');
} }
// 访客 // 访客
export function getVisitorCount() { export function getVisitorCount() {
return requestClient.get<any>('/property/screen/todayVisitorCount'); return requestClient.get<any>('/property/cockpit/screen/todayVisitorCount');
} }
//车流 //车流
export async function queryTwentyfourRunningDatasByPlNos() { export async function queryTwentyfourRunningDatasByPlNos() {
let params = { let params = {
"orgId": "10012", orgId: '10012',
"plNos": [ plNos: ['PFN000000012', 'PFN000000025'],
"PFN000000012",
"PFN000000025"
]
}; };
const response = await fetch('https://server.cqnctc.com:6081/web/thirdParty/queryTwentyfourRunningDatasByPlNos', { const response = await fetch(
'https://server.cqnctc.com:6081/web/thirdParty/queryTwentyfourRunningDatasByPlNos',
{
method: 'POST', // 指定请求方法为POST method: 'POST', // 指定请求方法为POST
headers: { headers: {
'Content-Type': 'application/json', // 设置内容类型为JSON 'Content-Type': 'application/json', // 设置内容类型为JSON
}, },
body: JSON.stringify(params), // 将参数对象转换为JSON字符串并作为请求体发送 body: JSON.stringify(params), // 将参数对象转换为JSON字符串并作为请求体发送
}); },
);
return response.json(); return response.json();
} }
// /** // /**
// * 导出资产管理列表 // * 导出资产管理列表
// * @param params // * @param params

View File

@@ -65,6 +65,10 @@ export interface OrderChargeVO {
* 收费状态 * 收费状态
*/ */
chargeStatus: string | number; chargeStatus: string | number;
/**
* 单位
*/
residentUnitId: string;
} }
export interface OrderChargeForm extends BaseEntity { export interface OrderChargeForm extends BaseEntity {
@@ -266,4 +270,8 @@ export interface orderChargeDetailForm extends BaseEntity {
* 收费状态 * 收费状态
*/ */
chargeStatus?: string | number; chargeStatus?: string | number;
/**
* 租赁单位
*/
residentUnitText?: string;
} }

View File

@@ -7,14 +7,22 @@ import { commonExport } from '#/api/helper';
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request';
/** /**
* 查询绿植租赁-订单管理列表 * 查询绿植租赁-订单管理列表
* @param params * @param params
* @returns 绿植租赁-订单管理列表 * @returns 绿植租赁-订单管理列表
*/ */
export function rentalOrderList(params?: RentalOrderQuery) { export function rentalOrderList(params?: RentalOrderQuery) {
return requestClient.get<PageResult<RentalOrderVO>>('/property/rentalOrder/list', { params }); return requestClient.get<PageResult<RentalOrderVO>>(
'/property/rentalOrder/list',
{ params },
);
}
export function rentalNotSelectList(params?: RentalOrderQuery) {
return requestClient.get<PageResult<RentalOrderVO>>(
'/property/rentalOrder/notSelectList',
{ params },
);
} }
/** /**
* 导出绿植租赁-订单管理列表 * 导出绿植租赁-订单管理列表
* @param params * @param params

View File

@@ -86,6 +86,10 @@ export interface RentalOrderVO {
*/ */
signTime: string; signTime: string;
/**
* 单位名称
*/
residentUnitText: string;
} }
export interface RentalOrderForm extends BaseEntity { export interface RentalOrderForm extends BaseEntity {
@@ -173,7 +177,6 @@ export interface RentalOrderForm extends BaseEntity {
* 签署时间 * 签署时间
*/ */
signTime?: string; signTime?: string;
} }
export interface RentalOrderQuery extends PageQuery { export interface RentalOrderQuery extends PageQuery {

View File

@@ -246,4 +246,9 @@ export interface Unit extends BaseEntity {
*/ */
area?: string; area?: string;
/**
* 房间数量
*/
roomNumber: number;
} }

View File

@@ -88,7 +88,7 @@ export const columns: VxeGridProps['columns'] = [
{ {
title: '状态', title: '状态',
field: 'state', field: 'state',
slots: {default: 'state'}, slots: { default: 'state' },
width: 100, width: 100,
}, },
{ {
@@ -158,15 +158,15 @@ export const modalSchema: FormSchemaGetter = () => [
placeholder: '请输入(如:元)', placeholder: '请输入(如:元)',
}, },
}, },
{ // {
label: '手机缴费', // label: '付费方式',
fieldName: 'isMobilePay', // fieldName: 'paymentMode',
component: 'Select', // component: 'Select',
componentProps: { // componentProps: {
options: getDictOptions('pro_mobile_payment'), // options: getDictOptions('wy_fffs'),
}, // },
rules: 'selectRequired', // rules: 'selectRequired',
}, // },
{ {
label: '进位方式', label: '进位方式',
fieldName: 'roundingMode', fieldName: 'roundingMode',
@@ -202,7 +202,6 @@ export const modalSchema: FormSchemaGetter = () => [
options: getDictOptions('pro_calculation_formula'), options: getDictOptions('pro_calculation_formula'),
}, },
rules: 'selectRequired', rules: 'selectRequired',
formItemClass:'col-span-2',
}, },
{ {
label: '计费单价', label: '计费单价',

View File

@@ -1,17 +1,18 @@
import type {FormSchemaGetter} from '#/adapter/form'; import type { FormSchemaGetter } from '#/adapter/form';
import type {VxeGridProps} from '#/adapter/vxe-table'; import type { VxeGridProps } from '#/adapter/vxe-table';
import {getDictOptions} from "#/utils/dict"; import { getDictOptions } from '#/utils/dict';
import {renderDict} from "#/utils/render"; import { renderDict } from '#/utils/render';
import {costItemSettingList} from "#/api/property/costManagement/costItemSetting"; import { costItemSettingList } from '#/api/property/costManagement/costItemSetting';
import { h } from 'vue'; import { h } from 'vue';
import { resident_unitList } from '#/api/property/resident/unit';
export const querySchema: FormSchemaGetter = () => [ export const querySchema: FormSchemaGetter = () => [
{ {
component: 'ApiSelect', component: 'ApiSelect',
componentProps: { componentProps: {
api:async ()=>{ api: async () => {
return (await costItemSettingList({pageSize: 1000, pageNum: 1}))?.rows return (await costItemSettingList({ pageSize: 1000, pageNum: 1 }))
?.rows;
}, },
afterFetch: (data: { chargeItem: string; id: string }[]) => { afterFetch: (data: { chargeItem: string; id: string }[]) => {
return data.map((item: any) => ({ return data.map((item: any) => ({
@@ -28,12 +29,29 @@ export const querySchema: FormSchemaGetter = () => [
fieldName: 'chargeStatus', fieldName: 'chargeStatus',
label: '缴费状态', label: '缴费状态',
componentProps: { componentProps: {
options: getDictOptions('wy_fyshzt') options: getDictOptions('wy_fyshzt'),
}, },
}, },
{
component: 'ApiSelect',
componentProps: {
api: async () => {
const rows = await resident_unitList({
pageSize: 1000000000,
pageNum: 1,
});
return rows;
},
resultField: 'rows',
labelField: 'name',
valueField: 'id',
},
fieldName: 'residentUnitId',
label: '单位',
},
]; ];
export const columns: VxeGridProps['columns'] = [ export const columns: VxeGridProps['columns'] = [
{type: 'checkbox', width: 60}, { type: 'checkbox', width: 60 },
{ {
title: '单位', title: '单位',
field: 'residentUnitText', field: 'residentUnitText',
@@ -41,7 +59,7 @@ export const columns: VxeGridProps['columns'] = [
}, },
{ {
title: '收费项目', title: '收费项目',
field: 'costItemsId', field: 'chargeItemText',
width: 150, width: 150,
}, },
{ {
@@ -53,21 +71,23 @@ export const columns: VxeGridProps['columns'] = [
title: '计费开始时间', title: '计费开始时间',
field: 'startTime', field: 'startTime',
width: 150, width: 150,
slots: { default: 'startTime' },
}, },
{ {
title: '计费结束时间', title: '计费结束时间',
field: 'endTime', field: 'endTime',
width: 150, width: 150,
slots: { default: 'endTime' },
}, },
{ {
title: '缴费状态', title: '缴费状态',
field: 'chargeStatus', field: 'chargeStatus',
width: 150, width: 150,
slots: { slots: {
default: ({row}) => { default: ({ row }) => {
return renderDict(row.chargeStatus, 'wy_fyshzt') return renderDict(row.chargeStatus, 'wy_fyshzt');
} },
} },
}, },
// { // {
// title: '状态', // title: '状态',
@@ -87,7 +107,7 @@ export const columns: VxeGridProps['columns'] = [
{ {
field: 'action', field: 'action',
fixed: 'right', fixed: 'right',
slots: {default: 'action'}, slots: { default: 'action' },
title: '操作', title: '操作',
width: 180, width: 180,
}, },
@@ -107,8 +127,7 @@ export const modalSchema: FormSchemaGetter = () => [
label: '单位', label: '单位',
fieldName: 'residentUnitId', fieldName: 'residentUnitId',
component: 'Select', component: 'Select',
componentProps: { componentProps: {},
},
rules: 'selectRequired', rules: 'selectRequired',
formItemClass: 'col-span-2', formItemClass: 'col-span-2',
}, },
@@ -136,16 +155,14 @@ export const modalSchema: FormSchemaGetter = () => [
label: '业主', label: '业主',
fieldName: 'personId', fieldName: 'personId',
component: 'ApiSelect', component: 'ApiSelect',
componentProps: { componentProps: {},
},
rules: 'selectRequired', rules: 'selectRequired',
}, },
{ {
label: '费用类型', label: '费用类型',
fieldName: 'costType', fieldName: 'costType',
component: 'Select', component: 'Select',
componentProps: { componentProps: {},
},
rules: 'selectRequired', rules: 'selectRequired',
}, },
{ {
@@ -201,7 +218,7 @@ export const modalSchemaUpdate: FormSchemaGetter = () => [
fieldName: 'payType', fieldName: 'payType',
component: 'Select', component: 'Select',
componentProps: { componentProps: {
options:getDictOptions('wy_zffs') options: getDictOptions('wy_zffs'),
}, },
rules: 'selectRequired', rules: 'selectRequired',
}, },
@@ -210,14 +227,15 @@ export const modalSchemaUpdate: FormSchemaGetter = () => [
fieldName: 'chargeCycle', fieldName: 'chargeCycle',
component: 'InputNumber', component: 'InputNumber',
componentProps: { componentProps: {
min:1, min: 1,
precision:0, precision: 0,
placeholder:'请输入缴费周期(月)' placeholder: '请输入缴费周期(月)',
}, },
suffix: () => h('span', { style: {fontSize: '0.875rem',fontWeight:500,} }, '月'), suffix: () =>
h('span', { style: { fontSize: '0.875rem', fontWeight: 500 } }, '月'),
rules: 'selectRequired', rules: 'selectRequired',
}, },
] ];
export const modalSchemaRefund: FormSchemaGetter = () => [ export const modalSchemaRefund: FormSchemaGetter = () => [
{ {
label: '主键', label: '主键',
@@ -233,6 +251,6 @@ export const modalSchemaRefund: FormSchemaGetter = () => [
fieldName: 'reason', fieldName: 'reason',
component: 'Textarea', component: 'Textarea',
formItemClass: 'col-span-2', formItemClass: 'col-span-2',
rules:'required' rules: 'required',
}, },
] ];

View File

@@ -39,6 +39,11 @@ async function handleOpenChange(open: boolean) {
} }
modalApi.modalLoading(false); modalApi.modalLoading(false);
} }
function formatDate(dateString: string) {
if (!dateString) return '';
const date = new Date(dateString);
return date.toISOString().split('T')[0];
}
</script> </script>
<template> <template>
@@ -57,7 +62,7 @@ async function handleOpenChange(open: boolean) {
/> />
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="计费时间"> <DescriptionsItem label="计费时间">
{{ houseChargeDetail.startTime + ' 至 ' + houseChargeDetail.endTime }} {{ formatDate(houseChargeDetail.startTime) + ' 至 ' + formatDate(houseChargeDetail.endTime) }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="单位"> <DescriptionsItem label="单位">
{{ houseChargeDetail?.residentUnitText }} {{ houseChargeDetail?.residentUnitText }}

View File

@@ -125,7 +125,11 @@ function handleMultiDelete() {
}, },
}); });
} }
function formatDate(dateString: string) {
if (!dateString) return '';
const date = new Date(dateString);
return date.toISOString().split('T')[0];
}
function handleDownloadExcel() { function handleDownloadExcel() {
commonDownloadExcel(houseChargeExport, '房屋收费数据', tableApi.formApi.form.values, { commonDownloadExcel(houseChargeExport, '房屋收费数据', tableApi.formApi.form.values, {
fieldMappingTime: formOptions.fieldMappingTime, fieldMappingTime: formOptions.fieldMappingTime,
@@ -161,6 +165,14 @@ function handleDownloadExcel() {
</a-button> </a-button>
</Space> </Space>
</template> </template>
<template #startTime="{row}">
{{ formatDate(row.startTime) }}
</template>
<template #endTime="{row}">
{{ formatDate(row.endTime) }}
</template>
<template #action="{ row }"> <template #action="{ row }">
<Space> <Space>
<ghost-button <ghost-button

View File

@@ -2,7 +2,8 @@ import type { FormSchemaGetter } from '#/adapter/form';
import type { VxeGridProps } from '#/adapter/vxe-table'; import type { VxeGridProps } from '#/adapter/vxe-table';
import { getDictOptions } from '#/utils/dict'; import { getDictOptions } from '#/utils/dict';
import { renderDict } from '#/utils/render'; import { renderDict } from '#/utils/render';
import {rentalOrderList} from "#/api/property/rentalOrder"; import { rentalOrderList } from '#/api/property/rentalOrder';
import { resident_unitList } from '#/api/property/resident/unit';
export const querySchema: FormSchemaGetter = () => [ export const querySchema: FormSchemaGetter = () => [
{ {
@@ -70,47 +71,47 @@ export const columns: VxeGridProps['columns'] = [
return (rowIndex + 1).toString(); return (rowIndex + 1).toString();
}, },
}, },
minWidth: '120' minWidth: '120',
}, },
{ {
title: '订单号', title: '订单号',
field: 'orderId', field: 'orderId',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '租赁合同编号', title: '租赁合同编号',
field: 'userId', field: 'userId',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '租赁人', title: '租赁人',
field: 'userName', field: 'userName',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '租金', title: '租金',
field: 'rent', field: 'rent',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '押金', title: '押金',
field: 'deposit', field: 'deposit',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '违约金', title: '违约金',
field: 'penalty', field: 'penalty',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '总金额', title: '总金额',
field: 'totalAmount', field: 'totalAmount',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '收费日期', title: '收费日期',
field: 'chargeDate', field: 'chargeDate',
minWidth: '120' minWidth: '120',
}, },
{ {
title: '支付方式', title: '支付方式',
@@ -120,7 +121,7 @@ export const columns: VxeGridProps['columns'] = [
return renderDict(row.paymentMethod, 'pro_payment_method'); return renderDict(row.paymentMethod, 'pro_payment_method');
}, },
}, },
minWidth: '120' minWidth: '120',
}, },
{ {
title: '开票状态', title: '开票状态',
@@ -130,7 +131,7 @@ export const columns: VxeGridProps['columns'] = [
return renderDict(row.invoiceStatus, 'pro_invoice_status'); return renderDict(row.invoiceStatus, 'pro_invoice_status');
}, },
}, },
minWidth: '120' minWidth: '120',
}, },
{ {
title: '发票类型', title: '发票类型',
@@ -140,7 +141,7 @@ export const columns: VxeGridProps['columns'] = [
return renderDict(row.invoiceType, 'pro_invoice_type'); return renderDict(row.invoiceType, 'pro_invoice_type');
}, },
}, },
minWidth: '120' minWidth: '120',
}, },
{ {
title: '收费状态', title: '收费状态',
@@ -150,12 +151,12 @@ export const columns: VxeGridProps['columns'] = [
return renderDict(row.chargeStatus, 'pro_charging_status'); return renderDict(row.chargeStatus, 'pro_charging_status');
}, },
}, },
minWidth: '120' minWidth: '120',
}, },
{ {
title: '创建时间', title: '创建时间',
field: 'createTime', field: 'createTime',
minWidth: '120' minWidth: '120',
}, },
{ {
field: 'action', field: 'action',
@@ -184,54 +185,61 @@ export const modalSchema: FormSchemaGetter = () => [
api: rentalOrderList, api: rentalOrderList,
resultField: 'rows', resultField: 'rows',
labelField: 'orderNo', labelField: 'orderNo',
valueField: 'id',
}, },
rules: 'required', rules: 'required',
}, },
// { {
// label: '租赁人ID', component: 'ApiSelect',
// fieldName: 'userId', fieldName: 'residentUnitId',
// component: 'ApiSelect', label: '租赁单位',
// componentProps: { componentProps: () => ({
// api: rentalOrderList, api: getUnitList,
// resultField: 'rows', resultField: 'data',
// labelField: 'customerName', labelField: 'label',
// valueField: 'id', valueField: 'value',
// }, immediate: true,
// rules: 'required', debounceTime: 500,
// }, allowClear: true,
placeholder: '',
filterOption: true,
}),
rules: 'selectRequired',
disabled: true,
},
{ {
label: '租赁人', label: '租赁人',
fieldName: 'userName', fieldName: 'userName',
component: "Select", component: 'Select',
rules: 'selectRequired', rules: 'selectRequired',
}, },
{ {
label: '租金', label: '租金',
fieldName: 'rent', fieldName: 'rent',
component: 'InputNumber', component: 'InputNumber',
rules: 'required', rules: 'required',
componentProps:{ componentProps: {
precision: 2, precision: 2,
} },
}, },
{ {
label: '押金', label: '押金',
fieldName: 'deposit', fieldName: 'deposit',
component: 'InputNumber', component: 'InputNumber',
rules: 'required', rules: 'required',
componentProps:{ componentProps: {
precision: 2, precision: 2,
} },
}, },
{ {
label: '违约金', label: '违约金',
fieldName: 'penalty', fieldName: 'penalty',
component: 'InputNumber', component: 'InputNumber',
rules: 'required', rules: 'required',
componentProps:{ componentProps: {
precision: 2, precision: 2,
} },
}, },
// { // {
// label: '总金额', // label: '总金额',
@@ -287,3 +295,21 @@ export const modalSchema: FormSchemaGetter = () => [
rules: 'required', rules: 'required',
}, },
]; ];
export async function getUnitList(): Promise<
{ value: number; label: string }[]
> {
const queryParam = {
pageNum: 1,
pageSize: 1000,
};
const res = await resident_unitList(queryParam);
const data: { value: number; label: string }[] = [];
res.rows.forEach((r: any) => {
data.push({
value: r.id,
label: r.name,
});
});
return data;
}

View File

@@ -1,13 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import type {orderChargeDetailForm} from '#/api/property/chargeManagement/model'; import type { orderChargeDetailForm } from '#/api/property/chargeManagement/model';
import {shallowRef} from 'vue'; import { shallowRef } from 'vue';
import {useVbenModal} from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import {Descriptions, DescriptionsItem} from 'ant-design-vue'; import { Descriptions, DescriptionsItem } from 'ant-design-vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';
import {orderChargeInfo} from '#/api/property/chargeManagement'; import { orderChargeInfo } from '#/api/property/chargeManagement';
import {renderDict} from "#/utils/render"; import { renderDict } from '#/utils/render';
dayjs.extend(duration); dayjs.extend(duration);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
@@ -25,7 +25,7 @@ async function handleOpenChange(open: boolean) {
return null; return null;
} }
modalApi.modalLoading(true); modalApi.modalLoading(true);
const {id} = modalApi.getData() as { id: number | string }; const { id } = modalApi.getData() as { id: number | string };
const response = await orderChargeInfo(id); const response = await orderChargeInfo(id);
orderChargeDetail.value = response; orderChargeDetail.value = response;
modalApi.modalLoading(false); modalApi.modalLoading(false);
@@ -33,8 +33,19 @@ async function handleOpenChange(open: boolean) {
</script> </script>
<template> <template>
<BasicModal :footer="false" :fullscreen-button="false" title="查看收费" class="w-[70%]"> <BasicModal
<Descriptions v-if="orderChargeDetail" size="small" :column="2" bordered :labelStyle="{width:'100px'}"> :footer="false"
:fullscreen-button="false"
title="查看收费"
class="w-[70%]"
>
<Descriptions
v-if="orderChargeDetail"
size="small"
:column="2"
bordered
:labelStyle="{ width: '100px' }"
>
<DescriptionsItem label="订单号"> <DescriptionsItem label="订单号">
{{ orderChargeDetail.orderId }} {{ orderChargeDetail.orderId }}
</DescriptionsItem> </DescriptionsItem>
@@ -42,7 +53,10 @@ async function handleOpenChange(open: boolean) {
{{ orderChargeDetail.rentalOrder.contractCode }} {{ orderChargeDetail.rentalOrder.contractCode }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="租赁人"> <DescriptionsItem label="租赁人">
{{ orderChargeDetail.userName}} {{ orderChargeDetail.userName }}
</DescriptionsItem>
<DescriptionsItem label="租赁单位">
{{ orderChargeDetail.residentUnitText }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="租金"> <DescriptionsItem label="租金">
{{ orderChargeDetail.rent }} {{ orderChargeDetail.rent }}
@@ -53,32 +67,53 @@ async function handleOpenChange(open: boolean) {
<DescriptionsItem label="违约金"> <DescriptionsItem label="违约金">
{{ orderChargeDetail.penalty }} {{ orderChargeDetail.penalty }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="开票状态" v-if="orderChargeDetail.invoiceStatus!=null"> <DescriptionsItem
label="开票状态"
v-if="orderChargeDetail.invoiceStatus != null"
>
<component <component
:is="renderDict(orderChargeDetail.invoiceStatus,'pro_invoice_status')" :is="
renderDict(orderChargeDetail.invoiceStatus, 'pro_invoice_status')
"
/> />
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="发票类型" v-if="orderChargeDetail.invoiceType!=null"> <DescriptionsItem
label="发票类型"
v-if="orderChargeDetail.invoiceType != null"
>
<component <component
:is="renderDict(orderChargeDetail.invoiceType,'pro_invoice_type')" :is="renderDict(orderChargeDetail.invoiceType, 'pro_invoice_type')"
/> />
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="收费状态" v-if="orderChargeDetail.chargeStatus!=null"> <DescriptionsItem
label="收费状态"
v-if="orderChargeDetail.chargeStatus != null"
>
<component <component
:is="renderDict(orderChargeDetail.chargeStatus,'pro_charging_status')" :is="
renderDict(orderChargeDetail.chargeStatus, 'pro_charging_status')
"
/> />
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="产品编号"> <DescriptionsItem label="产品编号">
{{ orderChargeDetail.rentalOrder.productList.map(item => item.plantCode).join('、') }} {{
orderChargeDetail.rentalOrder.productList
.map((item) => item.plantCode)
.join('、')
}}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="购买植物"> <DescriptionsItem label="购买植物">
{{ orderChargeDetail.rentalOrder.productList.map(item => item.plantName).join('、') }} {{
orderChargeDetail.rentalOrder.productList
.map((item) => item.plantName)
.join('、')
}}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="总金额"> <DescriptionsItem label="总金额">
{{ orderChargeDetail.totalAmount }} {{ orderChargeDetail.totalAmount }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="产品图片"> <DescriptionsItem label="产品图片">
<img :src="orderChargeDetail.createTime" alt=""> <img :src="orderChargeDetail.createTime" alt="" />
</DescriptionsItem> </DescriptionsItem>
</Descriptions> </Descriptions>
</BasicModal> </BasicModal>

View File

@@ -1,13 +1,21 @@
<script setup lang="ts"> <script setup lang="ts">
import {computed, reactive, ref} from 'vue'; import { computed, reactive, ref } from 'vue';
import { useVbenModal } from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; import { $t } from '@vben/locales';
import { cloneDeep } from '@vben/utils'; import { cloneDeep } from '@vben/utils';
import { useVbenForm } from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { orderChargeAdd, orderChargeInfo, orderChargeUpdate } from '#/api/property/chargeManagement'; import {
orderChargeAdd,
orderChargeInfo,
orderChargeUpdate,
} from '#/api/property/chargeManagement';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
import { modalSchema } from './data'; // import { modalSchema } from './data';
import QueryUserList from "#/views/property/greenPlantRentalManagement/chargeManagement/query-user-list.vue"; import QueryUserList from '#/views/property/greenPlantRentalManagement/chargeManagement/query-user-list.vue';
import { resident_unitList } from '#/api/property/resident/unit';
import type { FormSchemaGetter } from '#/adapter/form';
import { rentalNotSelectList } from '#/api/property/rentalOrder';
import { getDictOptions } from '#/utils/dict';
const emit = defineEmits<{ reload: [] }>(); const emit = defineEmits<{ reload: [] }>();
const isUpdate = ref(false); const isUpdate = ref(false);
@@ -15,16 +23,167 @@ const isUpdate = ref(false);
const title = computed(() => { const title = computed(() => {
return isUpdate.value ? $t('pages.common.edit') : '添加收费'; return isUpdate.value ? $t('pages.common.edit') : '添加收费';
}); });
const modalSchema = [
{
label: '主键',
fieldName: 'id',
component: 'Input',
dependencies: {
show: () => false,
triggerFields: [''],
},
},
{
label: '订单号',
fieldName: 'orderId',
component: 'ApiSelect',
componentProps: {
api: rentalNotSelectList,
resultField: 'rows',
labelField: 'orderNo',
valueField: 'id',
onChange: async (value: string, option: any) => {
await formApi.setValues({
residentUnitId: option.residentUnitId, // 假设订单数据中有 residentUnitId 字段
// 其他需要自动填充的字段
});
},
},
disabled: isUpdate.value ? true : false,
rules: 'required',
},
{
component: 'ApiSelect',
fieldName: 'residentUnitId',
label: '租赁单位',
componentProps: () => ({
api: getUnitList,
resultField: 'data',
labelField: 'label',
valueField: 'value',
immediate: true,
debounceTime: 500,
allowClear: true,
placeholder: '',
filterOption: true,
}),
rules: 'selectRequired',
disabled: true,
},
{
label: '租赁人',
fieldName: 'userName',
component: 'Select',
rules: 'selectRequired',
},
{
label: '租金',
fieldName: 'rent',
component: 'InputNumber',
rules: 'required',
componentProps: {
precision: 2,
},
},
{
label: '押金',
fieldName: 'deposit',
component: 'InputNumber',
rules: 'required',
componentProps: {
precision: 2,
},
},
{
label: '违约金',
fieldName: 'penalty',
component: 'InputNumber',
rules: 'required',
componentProps: {
precision: 2,
},
},
// {
// label: '总金额',
// fieldName: 'totalAmount',
// component: 'Input',
// rules: 'required',
// },
{
label: '开票状态',
fieldName: 'invoiceStatus',
component: 'Select',
componentProps: {
options: getDictOptions('pro_invoice_status'),
},
rules: 'selectRequired',
},
{
label: '发票类型',
fieldName: 'invoiceType',
component: 'Select',
componentProps: {
options: getDictOptions('pro_invoice_type'),
},
rules: 'selectRequired',
},
{
label: '收费状态',
fieldName: 'chargeStatus',
component: 'Select',
componentProps: {
options: getDictOptions('pro_charging_status'),
},
rules: 'selectRequired',
},
{
label: '支付方式',
fieldName: 'paymentMethod',
component: 'Select',
componentProps: {
options: getDictOptions('pro_payment_method'),
},
rules: 'selectRequired',
},
{
label: '收费日期',
fieldName: 'chargeDate',
component: 'DatePicker',
componentProps: {
showTime: true,
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'YYYY-MM-DD HH:mm:ss',
},
rules: 'required',
},
];
async function getUnitList() {
const queryParam = {
pageNum: 1,
pageSize: 1000,
};
const res = await resident_unitList(queryParam);
const data: { value: number; label: string }[] = [];
res.rows.forEach((r: any) => {
data.push({
value: r.id,
label: r.name,
});
});
return data;
}
const [BasicForm, formApi] = useVbenForm({ const [BasicForm, formApi] = useVbenForm({
commonConfig: { commonConfig: {
formItemClass: 'col-span-1', formItemClass: 'col-span-1',
labelWidth: 80, labelWidth: 80,
componentProps: { componentProps: {
class: 'w-full', class: 'w-full',
}
}, },
schema: modalSchema(), },
schema: modalSchema,
showDefaultActions: false, showDefaultActions: false,
wrapperClass: 'grid-cols-2', wrapperClass: 'grid-cols-2',
}); });
@@ -55,6 +214,8 @@ const [BasicModal, modalApi] = useVbenModal({
record.paymentMethod = record.paymentMethod?.toString(); record.paymentMethod = record.paymentMethod?.toString();
record.invoiceType = record.invoiceType?.toString(); record.invoiceType = record.invoiceType?.toString();
record.invoiceStatus = record.invoiceStatus?.toString(); record.invoiceStatus = record.invoiceStatus?.toString();
record.orderId = record.orderId;
record.residentUnitId = record.residentUnitId;
await formApi.setValues(record); await formApi.setValues(record);
} }
await markInitialized(); await markInitialized();
@@ -71,8 +232,8 @@ async function handleConfirm() {
} }
const data = cloneDeep(await formApi.getValues()); const data = cloneDeep(await formApi.getValues());
if (userInfo) { if (userInfo) {
data.userId = userInfo.userId data.userId = userInfo.userId;
data.userName = userInfo.userName data.userName = userInfo.userName;
} }
await (isUpdate.value ? orderChargeUpdate(data) : orderChargeAdd(data)); await (isUpdate.value ? orderChargeUpdate(data) : orderChargeAdd(data));
resetInitialized(); resetInitialized();
@@ -102,9 +263,13 @@ async function handleClosed() {
<BasicModal :title="title"> <BasicModal :title="title">
<BasicForm> <BasicForm>
<template #userName="slotProps"> <template #userName="slotProps">
<QueryUserList @update:userInfo="getUserInfo" v-bind="slotProps" :isUpdate="isUpdate" :userName="userName"/> <QueryUserList
@update:userInfo="getUserInfo"
v-bind="slotProps"
:isUpdate="isUpdate"
:userName="userName"
/>
</template> </template>
</BasicForm> </BasicForm>
</BasicModal> </BasicModal>
</template> </template>

View File

@@ -1,24 +1,23 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, shallowRef } from 'vue';
import {ref, shallowRef} from 'vue'; import { useVbenModal } from '@vben/common-ui';
import {useVbenModal} from '@vben/common-ui'; import { Descriptions, DescriptionsItem } from 'ant-design-vue';
import {Descriptions, DescriptionsItem} from 'ant-design-vue';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import duration from 'dayjs/plugin/duration'; import duration from 'dayjs/plugin/duration';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';
import {renderDict} from "#/utils/render"; import { renderDict } from '#/utils/render';
import type {RentalOrderVO} from "#/api/property/rentalOrder/model"; import type { RentalOrderVO } from '#/api/property/rentalOrder/model';
import {rentalOrderInfo} from "#/api/property/rentalOrder"; import { rentalOrderInfo } from '#/api/property/rentalOrder';
import {rentalColumns} from "./data"; import { rentalColumns } from './data';
import {Table} from "ant-design-vue"; import { Table } from 'ant-design-vue';
dayjs.extend(duration); dayjs.extend(duration);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
const planProducts=ref([]); const planProducts = ref([]);
const [BasicModal, modalApi] = useVbenModal({ const [BasicModal, modalApi] = useVbenModal({
onOpenChange: handleOpenChange, onOpenChange: handleOpenChange,
@@ -27,7 +26,7 @@ const [BasicModal, modalApi] = useVbenModal({
}, },
}); });
const orderDetail = shallowRef<null |RentalOrderVO>(null); const orderDetail = shallowRef<null | RentalOrderVO>(null);
async function handleOpenChange(open: boolean) { async function handleOpenChange(open: boolean) {
if (!open) { if (!open) {
@@ -35,73 +34,90 @@ async function handleOpenChange(open: boolean) {
} }
modalApi.modalLoading(true); modalApi.modalLoading(true);
const {id} = modalApi.getData() as { id: number | string }; const { id } = modalApi.getData() as { id: number | string };
// 赋值 // 赋值
orderDetail.value = await rentalOrderInfo(id); orderDetail.value = await rentalOrderInfo(id);
planProducts.value=orderDetail.value?.productList planProducts.value = orderDetail.value?.productList;
modalApi.modalLoading(false); modalApi.modalLoading(false);
} }
</script> </script>
<template> <template>
<BasicModal :footer="false" :fullscreen-button="false" title="租赁订单信息" class="w-[70%]"> <BasicModal
<Descriptions v-if="orderDetail" size="small" :column="2" bordered :labelStyle="{width:'100px'}"> :footer="false"
:fullscreen-button="false"
title="租赁订单信息"
class="w-[70%]"
>
<Descriptions
v-if="orderDetail"
size="small"
:column="2"
bordered
:labelStyle="{ width: '100px' }"
>
<DescriptionsItem label="订单号"> <DescriptionsItem label="订单号">
{{ orderDetail.orderNo }} {{ orderDetail.orderNo }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="客户名称"> <DescriptionsItem label="客户名称">
{{ orderDetail.customerName }} {{ orderDetail.customerName }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="客户类型" v-if="orderDetail.type!=null"> <DescriptionsItem label="客户类型" v-if="orderDetail.type != null">
<component <component :is="renderDict(orderDetail.customerType, 'wy_khlx')" />
:is="renderDict(orderDetail.customerType,'wy_khlx')" </DescriptionsItem>
/> <DescriptionsItem label="租赁单位">
{{ orderDetail.residentUnitText }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="租赁周期"> <DescriptionsItem label="租赁周期">
{{ orderDetail.rentalPeriod}} {{ orderDetail.rentalPeriod }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="租赁时间" :span="2"> <DescriptionsItem label="租赁时间" :span="2">
{{dayjs(orderDetail.startTime).format("YYYY-MM-DD")+' 至 '+dayjs(orderDetail.endTime).format("YYYY-MM-DD")}} {{
dayjs(orderDetail.startTime).format('YYYY-MM-DD') +
' 至 ' +
dayjs(orderDetail.endTime).format('YYYY-MM-DD')
}}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="总金额"> <DescriptionsItem label="总金额">
{{ orderDetail.totalAmount +"元"}} {{ orderDetail.totalAmount + '元' }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="租赁方式"> <DescriptionsItem label="租赁方式">
<component <component :is="renderDict(orderDetail.rentalType, 'wy_zlfs')" />
:is="renderDict(orderDetail.rentalType,'wy_zlfs')"
/>
</DescriptionsItem> </DescriptionsItem>
<!-- <DescriptionsItem label="支付状态">--> <!-- <DescriptionsItem label="支付状态">-->
<!-- <component--> <!-- <component-->
<!-- :is="renderDict(orderDetail.paymentStatus,'pro_charging_status')"--> <!-- :is="renderDict(orderDetail.paymentStatus,'pro_charging_status')"-->
<!-- />--> <!-- />-->
<!-- </DescriptionsItem>--> <!-- </DescriptionsItem>-->
<DescriptionsItem label="是否续租"> <DescriptionsItem label="是否续租">
<component <component :is="renderDict(orderDetail.isRelet, 'wy_sf')" />
:is="renderDict(orderDetail.isRelet,'wy_sf')"
/>
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="合同状态"> <DescriptionsItem label="合同状态">
<component <component :is="renderDict(orderDetail.contractStatus, 'wy_htzt')" />
:is="renderDict(orderDetail.contractStatus,'wy_htzt')"
/>
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="合同编号" v-if="orderDetail.contractStatus!='1'"> <DescriptionsItem
label="合同编号"
v-if="orderDetail.contractStatus != '1'"
>
{{ orderDetail.contractCode ?? '无' }} {{ orderDetail.contractCode ?? '无' }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="签署时间" v-if="orderDetail.contractStatus!='1'"> <DescriptionsItem
label="签署时间"
v-if="orderDetail.contractStatus != '1'"
>
{{ orderDetail.signTime ?? '无' }} {{ orderDetail.signTime ?? '无' }}
</DescriptionsItem> </DescriptionsItem>
</Descriptions> </Descriptions>
<div v-if="planProducts.length"> <div v-if="planProducts.length">
<div style="margin: 10px 0;font-weight: 500"> <div style="margin: 10px 0; font-weight: 500">订单产品详情</div>
订单产品详情 <Table
</div> :dataSource="planProducts"
<Table :dataSource="planProducts" :columns="rentalColumns" :pagination="false" :columns="rentalColumns"
bordered size="small"> :pagination="false"
bordered
size="small"
>
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
<template v-if="column.field === 'id'"> <template v-if="column.field === 'id'">
{{ index + 1 }} {{ index + 1 }}

View File

@@ -1,25 +1,26 @@
<script setup lang="ts"> <script setup lang="ts">
import {computed, ref} from 'vue'; import { computed, ref } from 'vue';
import {useVbenModal} from '@vben/common-ui'; import { useVbenModal } from '@vben/common-ui';
import {$t} from '@vben/locales'; import { $t } from '@vben/locales';
import {cloneDeep} from '@vben/utils'; import { cloneDeep } from '@vben/utils';
import {useVbenForm} from '#/adapter/form'; import { useVbenForm } from '#/adapter/form';
import { import {
rentalOrderAdd, rentalOrderAdd,
rentalOrderInfo, rentalOrderInfo,
rentalOrderUpdate rentalOrderUpdate,
} from '#/api/property/rentalOrder'; } from '#/api/property/rentalOrder';
import {defaultFormValueGetter, useBeforeCloseDiff} from '#/utils/popup'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup';
import {plantsProductList} from "#/api/property/productManagement"; import { plantsProductList } from '#/api/property/productManagement';
import {rentalPlanInfo, rentalPlanList} from "#/api/property/rentalPlan"; import { rentalPlanInfo, rentalPlanList } from '#/api/property/rentalPlan';
import {getDictOptions} from "#/utils/dict"; import { getDictOptions } from '#/utils/dict';
import type {PropertyVO} from "#/api/property/productManagement/model"; import type { PropertyVO } from '#/api/property/productManagement/model';
import type {RentalPlanVO} from "#/api/property/rentalPlan/model"; import type { RentalPlanVO } from '#/api/property/rentalPlan/model';
import {planInfoColumns} from './data'; import { planInfoColumns } from './data';
import {Table} from "ant-design-vue"; import { Table } from 'ant-design-vue';
import { resident_unitList } from '#/api/property/resident/unit';
const emit = defineEmits<{ reload: [] }>(); const emit = defineEmits<{ reload: [] }>();
@@ -54,7 +55,24 @@ const modalSchema = [
fieldName: 'customerType', fieldName: 'customerType',
component: 'Select', component: 'Select',
componentProps: { componentProps: {
options: getDictOptions('wy_khlx') options: getDictOptions('wy_khlx'),
},
rules: 'selectRequired',
},
{
component: 'ApiSelect',
fieldName: 'residentUnitId',
label: '租赁单位',
componentProps: {
api: getUnitList,
resultField: 'data',
labelField: 'label',
valueField: 'value',
immediate: true,
debounceTime: 500,
allowClear: true,
placeholder: '请选择租赁单位',
filterOption: true,
}, },
rules: 'selectRequired', rules: 'selectRequired',
}, },
@@ -63,7 +81,7 @@ const modalSchema = [
fieldName: 'rentalPeriod', fieldName: 'rentalPeriod',
component: 'Select', component: 'Select',
componentProps: { componentProps: {
options: getDictOptions('wy_time_unit') options: getDictOptions('wy_time_unit'),
}, },
rules: 'selectRequired', rules: 'selectRequired',
}, },
@@ -83,10 +101,10 @@ const modalSchema = [
fieldName: 'rentalType', fieldName: 'rentalType',
component: 'Select', component: 'Select',
componentProps: { componentProps: {
options: getDictOptions('wy_zlfs') options: getDictOptions('wy_zlfs'),
}, },
rules: 'selectRequired', rules: 'selectRequired',
formItemClass: 'col-span-2' formItemClass: 'col-span-2',
}, },
{ {
label: '租赁方案', label: '租赁方案',
@@ -101,29 +119,34 @@ const modalSchema = [
formItemClass: 'col-span-2', formItemClass: 'col-span-2',
componentProps: { componentProps: {
api: async () => { api: async () => {
const res = await rentalPlanList({pageNum: 1, pageSize: 1000, state: 1}); const res = await rentalPlanList({
pageNum: 1,
pageSize: 1000,
state: 1,
});
planList.value = res.rows || []; planList.value = res.rows || [];
return planList.value.map(item => ({ return planList.value.map((item) => ({
label: item.planName, label: item.planName,
value: item.id, value: item.id,
})); }));
}, },
onChange: async (value: string) => { onChange: async (value: string) => {
await getPlanProducts(value) await getPlanProducts(value);
}, },
showSearch: true, showSearch: true,
filterOption: (input: any, option: any) => filterOption: (input: any, option: any) =>
option.label.toLowerCase().includes(input.toLowerCase()), option.label.toLowerCase().includes(input.toLowerCase()),
} },
}, },
{ {
label: '方案详情', label: '方案详情',
fieldName: 'planInfo', fieldName: 'planInfo',
component: 'Input', component: 'Input',
slots: {default: 'planInfo'}, slots: { default: 'planInfo' },
dependencies: { dependencies: {
// 仅当 租赁方式 为 2套餐 时显示 // 仅当 租赁方式 为 2套餐 时显示
show: (formValues: any) => formValues.rentalType === '2' && formValues.planId != null, show: (formValues: any) =>
formValues.rentalType === '2' && formValues.planId != null,
triggerFields: ['planId', 'rentalType'], triggerFields: ['planId', 'rentalType'],
}, },
formItemClass: 'col-span-2', formItemClass: 'col-span-2',
@@ -141,17 +164,29 @@ const modalSchema = [
formItemClass: 'col-span-2', formItemClass: 'col-span-2',
componentProps: { componentProps: {
api: async () => { api: async () => {
const res = await plantsProductList({pageNum: 1, pageSize: 1000, inventory: 0}); const res = await plantsProductList({
pageNum: 1,
pageSize: 1000,
inventory: 0,
});
plantsList.value = res.rows || []; plantsList.value = res.rows || [];
return plantsList.value.map(item => ({ return plantsList.value.map((item) => ({
label: item.plantName + '-' + item.plantCode + '\xa0\xa0租金' + item.rent + '\xa0\xa0库存数量' + item.inventory, label:
item.plantName +
'-' +
item.plantCode +
'\xa0\xa0租金' +
item.rent +
'\xa0\xa0库存数量' +
item.inventory,
value: item.id, value: item.id,
})); }));
}, },
onChange: async (value: string) => { onChange: async (value: string) => {
plantInfo.value = plantsList.value.find(item => item.id === value); plantInfo.value = plantsList.value.find((item) => item.id === value);
if (plantInfo.value) { if (plantInfo.value) {
formApi.updateSchema([{ formApi.updateSchema([
{
componentProps: () => ({ componentProps: () => ({
min: 1, min: 1,
max: plantInfo.value?.inventory, max: plantInfo.value?.inventory,
@@ -159,18 +194,21 @@ const modalSchema = [
onChange: async () => { onChange: async () => {
const formValues = await formApi.getValues(); const formValues = await formApi.getValues();
if (formValues.productNum && plantInfo.value?.rent) { if (formValues.productNum && plantInfo.value?.rent) {
singleAmount.value = (plantInfo.value.rent * formValues.productNum).toFixed(2); singleAmount.value = (
plantInfo.value.rent * formValues.productNum
).toFixed(2);
} }
}, },
}), }),
fieldName: 'productNum', fieldName: 'productNum',
}]) },
]);
} }
}, },
showSearch: true, showSearch: true,
filterOption: (input: any, option: any) => filterOption: (input: any, option: any) =>
option.label.toLowerCase().includes(input.toLowerCase()), option.label.toLowerCase().includes(input.toLowerCase()),
} },
}, },
{ {
label: '租赁数量', label: '租赁数量',
@@ -198,14 +236,17 @@ const modalSchema = [
label: '总金额(元)', label: '总金额(元)',
fieldName: 'totalAmount', fieldName: 'totalAmount',
component: 'InputNumber', component: 'InputNumber',
slots: {default: 'totalAmount'}, slots: { default: 'totalAmount' },
dependencies: { dependencies: {
// 仅当 租赁方式 为 1单点 时显示 // 仅当 租赁方式 为 1单点 时显示
show: (formValues: any) => formValues.productNum && formValues.productId && formValues.rentalType === '1', show: (formValues: any) =>
formValues.productNum &&
formValues.productId &&
formValues.rentalType === '1',
triggerFields: ['productNum', 'rentalType'], triggerFields: ['productNum', 'rentalType'],
disabled: true, disabled: true,
}, },
labelWidth: 110 labelWidth: 110,
}, },
{ {
label: '是否续租', label: '是否续租',
@@ -216,7 +257,7 @@ const modalSchema = [
optionType: 'button', optionType: 'button',
options: getDictOptions('wy_sf'), options: getDictOptions('wy_sf'),
}, },
rules: 'required' rules: 'required',
}, },
{ {
label: '合同状态', label: '合同状态',
@@ -225,17 +266,18 @@ const modalSchema = [
componentProps: { componentProps: {
options: getDictOptions('wy_htzt'), options: getDictOptions('wy_htzt'),
}, },
rules: 'selectRequired' rules: 'selectRequired',
}, },
{ {
label: '合同编号', label: '合同编号',
fieldName: 'contractCode', fieldName: 'contractCode',
component: 'Input', component: 'Input',
dependencies: { dependencies: {
show: (formValues: any) => formValues.contractStatus != null && formValues.contractStatus != 1, show: (formValues: any) =>
formValues.contractStatus != null && formValues.contractStatus != 1,
triggerFields: ['contractStatus'], triggerFields: ['contractStatus'],
}, },
rules: 'required' rules: 'required',
}, },
{ {
label: '签署时间', label: '签署时间',
@@ -247,10 +289,11 @@ const modalSchema = [
valueFormat: 'YYYY-MM-DD', valueFormat: 'YYYY-MM-DD',
}, },
dependencies: { dependencies: {
show: (formValues: any) => formValues.contractStatus != null && formValues.contractStatus != 1, show: (formValues: any) =>
formValues.contractStatus != null && formValues.contractStatus != 1,
triggerFields: ['contractStatus'], triggerFields: ['contractStatus'],
}, },
rules: 'required' rules: 'required',
}, },
]; ];
const [BasicForm, formApi] = useVbenForm({ const [BasicForm, formApi] = useVbenForm({
@@ -262,15 +305,14 @@ const [BasicForm, formApi] = useVbenForm({
// 通用配置项 会影响到所有表单项 // 通用配置项 会影响到所有表单项
componentProps: { componentProps: {
class: 'w-full', class: 'w-full',
} },
}, },
schema: modalSchema, schema: modalSchema,
showDefaultActions: false, showDefaultActions: false,
wrapperClass: 'grid-cols-2', wrapperClass: 'grid-cols-2',
}); });
const { onBeforeClose, markInitialized, resetInitialized } = useBeforeCloseDiff(
const {onBeforeClose, markInitialized, resetInitialized} = useBeforeCloseDiff(
{ {
initializedGetter: defaultFormValueGetter(formApi), initializedGetter: defaultFormValueGetter(formApi),
currentGetter: defaultFormValueGetter(formApi), currentGetter: defaultFormValueGetter(formApi),
@@ -289,7 +331,7 @@ const [BasicModal, modalApi] = useVbenModal({
return null; return null;
} }
modalApi.modalLoading(true); modalApi.modalLoading(true);
const {id} = modalApi.getData() as { id?: number | string }; const { id } = modalApi.getData() as { id?: number | string };
isUpdate.value = !!id; isUpdate.value = !!id;
if (isUpdate.value && id) { if (isUpdate.value && id) {
const record = await rentalOrderInfo(id); const record = await rentalOrderInfo(id);
@@ -300,11 +342,26 @@ const [BasicModal, modalApi] = useVbenModal({
modalApi.modalLoading(false); modalApi.modalLoading(false);
}, },
}); });
async function getUnitList() {
const queryParam = {
pageNum: 1,
pageSize: 1000,
};
const res = await resident_unitList(queryParam);
const data: { value: number; label: string }[] = [];
res.rows.forEach((r: any) => {
data.push({
value: r.id,
label: r.name,
});
});
return data;
}
async function handleConfirm() { async function handleConfirm() {
try { try {
modalApi.lock(true); modalApi.lock(true);
const {valid} = await formApi.validate(); const { valid } = await formApi.validate();
if (!valid) { if (!valid) {
return; return;
} }
@@ -312,18 +369,18 @@ async function handleConfirm() {
const data = cloneDeep(await formApi.getValues()); const data = cloneDeep(await formApi.getValues());
if (data.rentalType == 1) { if (data.rentalType == 1) {
data.planId = undefined; data.planId = undefined;
data.totalAmount = singleAmount.value data.totalAmount = singleAmount.value;
} else { } else {
data.productId = undefined; data.productId = undefined;
data.productNum = undefined; data.productNum = undefined;
data.productList = planProducts.value data.productList = planProducts.value;
data.totalAmount = totalAmount.value data.totalAmount = totalAmount.value;
} }
if (data.rentalTime) { if (data.rentalTime) {
data.startTime = data.rentalTime[0]; data.startTime = data.rentalTime[0];
data.endTime = data.rentalTime[1]; data.endTime = data.rentalTime[1];
} }
data.paymentStatus = 0 data.paymentStatus = 0;
await (isUpdate.value ? rentalOrderUpdate(data) : rentalOrderAdd(data)); await (isUpdate.value ? rentalOrderUpdate(data) : rentalOrderAdd(data));
resetInitialized(); resetInitialized();
emit('reload'); emit('reload');
@@ -337,22 +394,22 @@ async function handleConfirm() {
//获取有库存的绿植 //获取有库存的绿植
async function getPlanProducts(id: string) { async function getPlanProducts(id: string) {
const res = await rentalPlanInfo(id) const res = await rentalPlanInfo(id);
planProducts.value = res.productList.map(item => ({ planProducts.value = res.productList.map((item) => ({
id:item.productId, id: item.productId,
plantName: item.product?.plantName, plantName: item.product?.plantName,
rent: item.product?.rent, rent: item.product?.rent,
inventory: item.productNum, inventory: item.productNum,
})) }));
totalAmount.value = planProducts.value?.reduce((sum, item: any) => sum + (item.rent * item.inventory), 0).toFixed(2) totalAmount.value = planProducts.value
?.reduce((sum, item: any) => sum + item.rent * item.inventory, 0)
.toFixed(2);
} }
async function handleClosed() { async function handleClosed() {
await formApi.resetForm(); await formApi.resetForm();
resetInitialized(); resetInitialized();
} }
</script> </script>
<template> <template>
@@ -360,8 +417,13 @@ async function handleClosed() {
<BasicForm> <BasicForm>
<template #planInfo="slotProps"> <template #planInfo="slotProps">
<div v-if="planProducts.length" style="width: 100%" v-bind="slotProps"> <div v-if="planProducts.length" style="width: 100%" v-bind="slotProps">
<Table :dataSource="planProducts" :columns="planInfoColumns" :pagination="false" <Table
bordered size="small"> :dataSource="planProducts"
:columns="planInfoColumns"
:pagination="false"
bordered
size="small"
>
<template #bodyCell="{ column, record, index }"> <template #bodyCell="{ column, record, index }">
<template v-if="column.field === 'id'"> <template v-if="column.field === 'id'">
{{ index + 1 }} {{ index + 1 }}
@@ -371,7 +433,7 @@ async function handleClosed() {
</template> </template>
</template> </template>
<template #footer> <template #footer>
<div style="text-align: right;margin-right: 20px"> <div style="text-align: right; margin-right: 20px">
<b>总金额</b> <b>总金额</b>
{{ totalAmount }} {{ totalAmount }}
</div> </div>
@@ -385,4 +447,3 @@ async function handleClosed() {
</BasicForm> </BasicForm>
</BasicModal> </BasicModal>
</template> </template>

View File

@@ -0,0 +1,141 @@
<script setup lang="ts">
import type { PropType } from 'vue';
import { onMounted, ref } from 'vue';
import { SyncOutlined } from '@ant-design/icons-vue';
import { Empty, InputSearch, Skeleton, Tree } from 'ant-design-vue';
import {communityTree} from "#/api/property/community";
import type {CommunityVO} from "#/api/property/community/model";
defineOptions({ inheritAttrs: false });
withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true });
const emit = defineEmits<{
/**
* 点击刷新按钮的事件
*/
reload: [];
/**
* 点击节点的事件
*/
select: [];
}>();
const selectRoomId = defineModel('selectRoomId', {
type: Array as PropType<string[]>,
default: () => [],
});
const checkedRoomId = defineModel('checkedRoomId', {
type: Array as PropType<string[]>,
default: () => [],
});
const searchValue = defineModel('searchValue', {
type: String,
default: '',
});
const checkable = defineModel('checkable', {
type: Boolean,
default: false,
});
/** 房间数据源 */
type RoomTreeArray = CommunityVO[];
const roomTreeArray = ref<RoomTreeArray>([]);
/** 骨架屏加载 */
const showTreeSkeleton = ref<boolean>(true);
async function loadTree() {
showTreeSkeleton.value = true;
searchValue.value = '';
selectRoomId.value = [];
checkedRoomId.value = [];
roomTreeArray.value = await communityTree(4);
showTreeSkeleton.value = false;
}
async function handleReload() {
await loadTree();
emit('reload');
}
function selectStyle(id:string){
if(selectRoomId.value.includes(id)){
return {
backgroundColor: '#e6f4ff',
padding:'0 10px',
borderRadius:'4px',
fontWeight:'bold'
}
}
return {}
}
onMounted(loadTree);
</script>
<template>
<div :class="$attrs.class">
<Skeleton
:loading="showTreeSkeleton"
:paragraph="{ rows: 8 }"
active
class="p-[8px]"
>
<div
class="bg-background flex h-full flex-col overflow-y-auto rounded-lg"
>
<!-- 固定在顶部 必须加上bg-background背景色 否则会产生'穿透'效果 -->
<div
v-if="showSearch"
class="bg-background z-100 sticky left-0 top-0 p-[8px]"
>
<InputSearch
v-model:value="searchValue"
:placeholder="$t('pages.common.search')"
size="small"
>
<template #enterButton>
<a-button @click="handleReload">
<SyncOutlined class="text-primary" />
</a-button>
</template>
</InputSearch>
</div>
<div class="h-full overflow-x-hidden px-[8px]">
<Tree
:checkable="checkable"
:selectable="false"
v-bind="$attrs"
v-if="roomTreeArray.length > 0"
v-model:checked-keys="checkedRoomId"
:class="$attrs.class"
:field-names="{ title: 'label', key: 'id' }"
:tree-data="roomTreeArray"
:virtual="false"
default-expand-all
>
<template #title="{ label,id }">
<span v-if="label.indexOf(searchValue) > -1" :style="selectStyle(id)">
{{ label.substring(0, label.indexOf(searchValue)) }}
<span style="color: #f50">{{ searchValue }}</span>
{{
label.substring(
label.indexOf(searchValue) + searchValue.length,
)
}}
</span>
<span v-else :style="selectStyle(id)">{{ label}}</span>
</template>
</Tree>
<!-- 仅本人数据权限 可以考虑直接不显示 -->
<div v-else class="mt-5">
<Empty
:image="Empty.PRESENTED_IMAGE_SIMPLE"
description="无部门数据"
/>
</div>
</div>
</div>
</Skeleton>
</div>
</template>

View File

@@ -47,12 +47,12 @@ export const columns: VxeGridProps['columns'] = [
return row.id return row.id
} }
}, },
width: 100 width: 180
}, },
{ {
title: '单位名称', title: '单位名称',
field: 'name', field: 'name',
width: 100 minWidth: 180
}, },
{ {
title: '单位类型', title: '单位类型',
@@ -72,7 +72,7 @@ export const columns: VxeGridProps['columns'] = [
{ {
title: '联系电话', title: '联系电话',
field: 'phone', field: 'phone',
width: 100 width: 120
}, },
// { // {
// title: '入驻位置', // title: '入驻位置',
@@ -82,8 +82,18 @@ export const columns: VxeGridProps['columns'] = [
{ {
title: '入驻时间', title: '入驻时间',
field: 'time', field: 'time',
width: 180,
},
{
title: '入驻房间数',
field: 'roomNumber',
width: 100, width: 100,
}, },
{
title: '入驻面积(㎡)',
field: 'area',
width: 180,
},
{ {
title: '状态', title: '状态',
field: 'state', field: 'state',
@@ -98,19 +108,22 @@ export const columns: VxeGridProps['columns'] = [
{ {
title: '备注', title: '备注',
field: 'remark', field: 'remark',
width: 100, width: 180,
slots: { default: ({ row }) => {
return row.remark || '-'
}, },
}, },
{ {
title: '创建时间', title: '创建时间',
field: 'createTime', field: 'createTime',
width: 100, width: 180,
}, },
{ {
field: 'action', field: 'action',
fixed: 'right', fixed: 'right',
slots: { default: 'action' }, slots: { default: 'action' },
title: '操作', title: '操作',
minWidth: 180, width: 180,
}, },
] ]
@@ -155,13 +168,13 @@ export const modalSchema: FormSchemaGetter = () => [
z.number().int().min(1000000000).max(19999999999, { message: '手机号格式错误' }) z.number().int().min(1000000000).max(19999999999, { message: '手机号格式错误' })
]).transform(val => val.toString()), ]).transform(val => val.toString()),
}, },
{ // {
label: '入驻位置', // label: '入驻位置',
fieldName: 'locations', // fieldName: 'locations',
component: 'TreeSelect', // component: 'TreeSelect',
rules: 'selectRequired', // rules: 'selectRequired',
formItemClass: 'col-span-2' // formItemClass: 'col-span-2'
}, // },
{ {
label: '入驻时间', label: '入驻时间',
fieldName: 'time', fieldName: 'time',
@@ -173,11 +186,6 @@ export const modalSchema: FormSchemaGetter = () => [
}, },
rules: 'required', rules: 'required',
}, },
{
label: '',
fieldName: 'Placeholder',
component: ''
},
{ {
label: '授权期限', label: '授权期限',
fieldName: 'authTime', fieldName: 'authTime',
@@ -188,6 +196,7 @@ export const modalSchema: FormSchemaGetter = () => [
valueFormat: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'YYYY-MM-DD HH:mm:ss',
}, },
rules: 'required', rules: 'required',
formItemClass: 'col-span-1'
}, },
{ {
label: '通行权限组', label: '通行权限组',

View File

@@ -12,6 +12,7 @@ import relativeTime from 'dayjs/plugin/relativeTime';
import {resident_unitInfo, authGroupList} from '#/api/property/resident/unit'; import {resident_unitInfo, authGroupList} from '#/api/property/resident/unit';
import {renderDict} from "#/utils/render"; import {renderDict} from "#/utils/render";
import RoomTree from "./components/room-tree.vue";
dayjs.extend(duration); dayjs.extend(duration);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
@@ -39,15 +40,27 @@ async function handleOpenChange(open: boolean) {
authGroupName.value = authGroup.find(item => item.id === authGroupId)?.name; authGroupName.value = authGroup.find(item => item.id === authGroupId)?.name;
// 赋值 // 赋值
unitDetail.value = response; unitDetail.value = response;
if(response.location){
selectRoomId.value=response.location.split(',');
}
modalApi.modalLoading(false); modalApi.modalLoading(false);
} }
const selectRoomId = ref<string[]>([]);
</script> </script>
<template> <template>
<BasicModal :footer="false" :fullscreen-button="false" title="入驻单位信息" class="w-[70%]"> <BasicModal :footer="false" :fullscreen-button="false" title="入驻单位信息" class="w-[70%]">
<Descriptions v-if="unitDetail" size="small" :column="2" bordered :labelStyle="{width:'120px'}"> <div class="flex gap-[8px]">
<div class="w-[260px]">
<RoomTree
class="max-h-[calc(100vh-38vh)]"
v-model:select-room-id="selectRoomId"
/>
</div>
<Descriptions class="flex-1" v-if="unitDetail" size="middle" :column="1" bordered :labelStyle="{width:'120px'}">
<DescriptionsItem label="单位编号"> <DescriptionsItem label="单位编号">
{{ unitDetail.id }} {{ unitDetail.id }}
</DescriptionsItem> </DescriptionsItem>
@@ -62,11 +75,11 @@ async function handleOpenChange(open: boolean) {
<DescriptionsItem label="联系人"> <DescriptionsItem label="联系人">
{{ unitDetail.contactPerson +'-'+unitDetail.phone}} {{ unitDetail.contactPerson +'-'+unitDetail.phone}}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="入驻位置" :span="2"> <DescriptionsItem label="入驻房间数" >
{{ unitDetail.locationDetail }} {{ unitDetail.roomNumber }}
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="入驻面积(㎡)" :span="2"> <DescriptionsItem label="入驻面积">
{{ unitDetail.area }} <span v-if="unitDetail.area">{{ unitDetail.area }}</span>
</DescriptionsItem> </DescriptionsItem>
<DescriptionsItem label="入驻时间"> <DescriptionsItem label="入驻时间">
{{ unitDetail.time }} {{ unitDetail.time }}
@@ -89,5 +102,6 @@ async function handleOpenChange(open: boolean) {
{{ unitDetail.remark ?? '-' }} {{ unitDetail.remark ?? '-' }}
</DescriptionsItem> </DescriptionsItem>
</Descriptions> </Descriptions>
</div>
</BasicModal> </BasicModal>
</template> </template>

View File

@@ -1,20 +1,21 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, ref } from 'vue'; import {computed, ref} from 'vue';
import { useVbenModal } from '@vben/common-ui'; import {useVbenModal} from '@vben/common-ui';
import { $t } from '@vben/locales'; import {$t} from '@vben/locales';
import { cloneDeep, handleNode } from '@vben/utils'; import {cloneDeep} from '@vben/utils';
import { useVbenForm } from '#/adapter/form'; import {useVbenForm} from '#/adapter/form';
import { import {
resident_unitAdd, resident_unitAdd,
resident_unitInfo, resident_unitInfo,
resident_unitUpdate, resident_unitUpdate,
} from '#/api/property/resident/unit'; } from '#/api/property/resident/unit';
import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import {defaultFormValueGetter, useBeforeCloseDiff} from '#/utils/popup';
import { modalSchema } from './data'; import {modalSchema} from './data';
import { communityTree } from '#/api/property/community'; import RoomTree from "./components/room-tree.vue";
import {message} from "ant-design-vue";
const emit = defineEmits<{ reload: [] }>(); const emit = defineEmits<{ reload: [] }>();
@@ -26,7 +27,7 @@ const title = computed(() => {
const [BasicForm, formApi] = useVbenForm({ const [BasicForm, formApi] = useVbenForm({
commonConfig: { commonConfig: {
// 默认占满两列 // 默认占满两列
formItemClass: 'col-span-1', formItemClass: 'col-span-2',
// 默认label宽度 px // 默认label宽度 px
labelWidth: 100, labelWidth: 100,
// 通用配置项 会影响到所有表单项 // 通用配置项 会影响到所有表单项
@@ -39,7 +40,7 @@ const [BasicForm, formApi] = useVbenForm({
wrapperClass: 'grid-cols-2', wrapperClass: 'grid-cols-2',
}); });
const { onBeforeClose, markInitialized, resetInitialized } = useBeforeCloseDiff( const {onBeforeClose, markInitialized, resetInitialized} = useBeforeCloseDiff(
{ {
initializedGetter: defaultFormValueGetter(formApi), initializedGetter: defaultFormValueGetter(formApi),
currentGetter: defaultFormValueGetter(formApi), currentGetter: defaultFormValueGetter(formApi),
@@ -59,16 +60,16 @@ const [BasicModal, modalApi] = useVbenModal({
} }
modalApi.modalLoading(true); modalApi.modalLoading(true);
const { id } = modalApi.getData() as { id?: number | string }; const {id} = modalApi.getData() as { id?: number | string };
isUpdate.value = !!id; isUpdate.value = !!id;
await initLocationOptions();
if (isUpdate.value && id) { if (isUpdate.value && id) {
const record = await resident_unitInfo(id); const record = await resident_unitInfo(id);
let roomIds=record.location.split(',') let roomIds = record.location.split(',')
await formApi.setValues({...record, await formApi.setValues({
authTime:[record.authBegDate,record.authEndDate], ...record,
locations:roomIds authTime: [record.authBegDate, record.authEndDate],
}); });
checkedRoomId.value = roomIds
} }
await markInitialized(); await markInitialized();
@@ -79,7 +80,11 @@ const [BasicModal, modalApi] = useVbenModal({
async function handleConfirm() { async function handleConfirm() {
try { try {
modalApi.lock(true); modalApi.lock(true);
const { valid } = await formApi.validate(); const {valid} = await formApi.validate();
if (!checkedRoomId.value.length) {
message.error('请选择入驻位置');
return;
}
if (!valid) { if (!valid) {
return; return;
} }
@@ -88,7 +93,7 @@ async function handleConfirm() {
data.authBegDate = data.authTime[0]; data.authBegDate = data.authTime[0];
data.authEndDate = data.authTime[1]; data.authEndDate = data.authTime[1];
data.location=data.locations.join(',') data.location = checkedRoomId.value.join(',')
await (isUpdate.value ? resident_unitUpdate(data) : resident_unitAdd(data)); await (isUpdate.value ? resident_unitUpdate(data) : resident_unitAdd(data));
resetInitialized(); resetInitialized();
emit('reload'); emit('reload');
@@ -99,51 +104,26 @@ async function handleConfirm() {
modalApi.lock(false); modalApi.lock(false);
} }
} }
/**
* 入驻位置数据
*/
async function initLocationOptions() {
const locationList = await communityTree(4);
const splitStr = '/';
handleNode(locationList, 'label', splitStr, function (node: any) {
if (node.level != 4) {
node.disabled = true;
}
});
formApi.updateSchema([
{
componentProps: () => ({
class: 'w-full',
fieldNames: {
key: 'id',
label: 'label',
value: 'code',
children: 'children',
},
placeholder: '请选择入驻位置',
showSearch: true,
treeData: locationList,
treeDefaultExpandAll: true,
treeLine: { showLeafIcon: false },
// 筛选的字段
treeNodeFilterProp: 'label',
// 选中后显示在输入框的值
treeNodeLabelProp: 'fullName',
multiple:true
}),
fieldName: 'locations',
},
]);
}
async function handleClosed() { async function handleClosed() {
await formApi.resetForm(); await formApi.resetForm();
resetInitialized(); resetInitialized();
} }
const checkedRoomId = ref<string[]>([]);
</script> </script>
<template> <template>
<BasicModal :title="title"> <BasicModal :title="title">
<BasicForm> </BasicForm> <div class="flex gap-[8px]">
<div class="w-[260px]">
<RoomTree
:checkable="true"
class="max-h-[calc(100vh-45vh)]"
v-model:checked-room-id="checkedRoomId"
/>
</div>
<BasicForm class="flex-1"></BasicForm>
</div>
</BasicModal> </BasicModal>
</template> </template>

View File

@@ -13,7 +13,7 @@ export const querySchema: FormSchemaGetter = () => [
fieldName: 'rosterType', fieldName: 'rosterType',
component: 'Select', component: 'Select',
componentProps: { componentProps: {
options: getDictOptions('roster_type'), options: getDictOptions(DictEnum.ROSTER_TYPE, true),
}, },
}, },
{ {
@@ -25,7 +25,7 @@ export const querySchema: FormSchemaGetter = () => [
component: 'Select', component: 'Select',
componentProps: { componentProps: {
getPopupContainer, getPopupContainer,
options: getDictOptions(DictEnum.SYS_USER_SEX), options: getDictOptions(DictEnum.SYS_USER_SEX, true),
}, },
fieldName: 'sex', fieldName: 'sex',
label: '性别', label: '性别',
@@ -41,7 +41,7 @@ export const columns: VxeGridProps['columns'] = [
field: 'libCode', field: 'libCode',
},*/ },*/
{ {
title: '人名称', title: '人名称',
field: 'imgName', field: 'imgName',
}, },
{ {
@@ -49,7 +49,7 @@ export const columns: VxeGridProps['columns'] = [
field: 'sex', field: 'sex',
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return renderDict(row.sex, 'sys_user_sex'); return renderDict(row.sex, DictEnum.SYS_USER_SEX);
}, },
}, },
}, },
@@ -66,7 +66,7 @@ export const columns: VxeGridProps['columns'] = [
field: 'certificateType', field: 'certificateType',
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return renderDict(row.certificateType, 'sys_certificate_type'); return renderDict(row.certificateType, DictEnum.SYS_CERTIFICATE_TYPE);
}, },
}, },
}, },
@@ -83,7 +83,7 @@ export const columns: VxeGridProps['columns'] = [
field: 'rosterType', field: 'rosterType',
slots: { slots: {
default: ({ row }) => { default: ({ row }) => {
return renderDict(row.rosterType, 'roster_type'); return renderDict(row.rosterType, DictEnum.ROSTER_TYPE);
}, },
}, },
width: 100, width: 100,
@@ -97,11 +97,6 @@ export const columns: VxeGridProps['columns'] = [
}, },
]; ];
const test = getDictOptions('roster_type');
test.forEach((item) => {
console.log('item', item);
});
export const modalSchema: FormSchemaGetter = () => [ export const modalSchema: FormSchemaGetter = () => [
{ {
label: '主键', label: '主键',
@@ -118,11 +113,12 @@ export const modalSchema: FormSchemaGetter = () => [
component: 'Select', component: 'Select',
rules: 'required', rules: 'required',
componentProps: { componentProps: {
options: getDictOptions('roster_type'), getPopupContainer,
options: getDictOptions(DictEnum.ROSTER_TYPE, true),
}, },
}, },
{ {
label: '人名称', label: '人名称',
fieldName: 'imgName', fieldName: 'imgName',
component: 'Input', component: 'Input',
rules: 'required', rules: 'required',
@@ -133,7 +129,7 @@ export const modalSchema: FormSchemaGetter = () => [
component: 'Select', component: 'Select',
componentProps: { componentProps: {
getPopupContainer, getPopupContainer,
options: getDictOptions(DictEnum.SYS_USER_SEX), options: getDictOptions(DictEnum.SYS_USER_SEX, true),
}, },
}, },
{ {
@@ -152,7 +148,7 @@ export const modalSchema: FormSchemaGetter = () => [
component: 'Select', component: 'Select',
componentProps: { componentProps: {
getPopupContainer, getPopupContainer,
options: getDictOptions(DictEnum.SYS_CERTIFICATE_TYPE), options: getDictOptions(DictEnum.SYS_CERTIFICATE_TYPE, true),
}, },
}, },
{ {

View File

@@ -48,7 +48,7 @@ const gridOptions: VxeGridProps = {
return await alarmEventsList({ return await alarmEventsList({
pageNum: page.currentPage, pageNum: page.currentPage,
pageSize: page.pageSize, pageSize: page.pageSize,
states: [40,50], states: [40, 50],
...formValues, ...formValues,
}); });
}, },
@@ -112,7 +112,7 @@ function handleMultiDelete() {
</script> </script>
<template> <template>
<Page :auto-content-height="true"> <Page :auto-content-height="true">
<BasicTable class="flex-1 overflow-hidden" table-title="视频预警处理"> <BasicTable class="flex-1 overflow-hidden">
<template #toolbar-tools> <template #toolbar-tools>
<Space> <Space>
<a-button <a-button

View File

@@ -112,7 +112,7 @@ function handleMultiDelete() {
</script> </script>
<template> <template>
<Page :auto-content-height="true"> <Page :auto-content-height="true">
<BasicTable class="flex-1 overflow-hidden" table-title="视频预警处理"> <BasicTable class="flex-1 overflow-hidden">
<template #toolbar-tools> <template #toolbar-tools>
<Space> <Space>
<a-button <a-button

View File

@@ -112,7 +112,7 @@ function handleMultiDelete() {
</script> </script>
<template> <template>
<Page :auto-content-height="true"> <Page :auto-content-height="true">
<BasicTable class="flex-1 overflow-hidden" table-title="视频预警处理"> <BasicTable class="flex-1 overflow-hidden">
<template #toolbar-tools> <template #toolbar-tools>
<Space> <Space>
<a-button <a-button

View File

@@ -11,6 +11,7 @@ export const DictEnum = {
SYS_USER_SEX: 'sys_user_sex', // 性别 SYS_USER_SEX: 'sys_user_sex', // 性别
SYS_YES_NO: 'sys_yes_no', // 是否 SYS_YES_NO: 'sys_yes_no', // 是否
SYS_CERTIFICATE_TYPE: 'sys_certificate_type', // 证件类型 SYS_CERTIFICATE_TYPE: 'sys_certificate_type', // 证件类型
ROSTER_TYPE:"roster_type",
WF_BUSINESS_STATUS: 'wf_business_status', // 业务状态 WF_BUSINESS_STATUS: 'wf_business_status', // 业务状态
WF_FORM_TYPE: 'wf_form_type', // 表单类型 WF_FORM_TYPE: 'wf_form_type', // 表单类型
WF_TASK_STATUS: 'wf_task_status', // 任务状态 WF_TASK_STATUS: 'wf_task_status', // 任务状态