From e229a1ad1c6e6777d71071671999dc360649c767 Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Mon, 21 Jul 2025 20:57:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BD=A6=E8=BE=86=E6=94=B6=E8=B4=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/property/carCharge/index.ts | 4 + .../src/api/property/carCharge/model.d.ts | 5 + .../src/api/property/costMeterWater/index.ts | 5 + .../workforceManagement/arrangement-modal.vue | 174 ++++++- .../workforceManagement/calendarView.vue | 17 +- .../workforceManagement/data.ts | 123 ++++- .../workforceManagement/scheduleView.vue | 43 +- .../workforceManagement/unit-person-modal.vue | 326 +++++++++++++ .../carCharge/car-charge-detail.vue | 63 +++ .../carCharge/car-charge-refund.vue | 109 +++++ ...Charge-add-modal.vue => carCharge-add.vue} | 54 +-- .../carCharge/carCharge-detail-modal.vue | 144 ------ .../carCharge/carCharge-pay-modal.vue | 200 -------- .../carCharge/carCharge-update.vue | 124 +++++ .../property/costManagement/carCharge/data.ts | 439 ++++++------------ .../costManagement/carCharge/index.vue | 160 ++++--- .../costMeterWater/costMeterWater-modal.vue | 4 +- 17 files changed, 1206 insertions(+), 788 deletions(-) create mode 100644 apps/web-antd/src/views/property/attendanceManagement/workforceManagement/unit-person-modal.vue create mode 100644 apps/web-antd/src/views/property/costManagement/carCharge/car-charge-detail.vue create mode 100644 apps/web-antd/src/views/property/costManagement/carCharge/car-charge-refund.vue rename apps/web-antd/src/views/property/costManagement/carCharge/{carCharge-add-modal.vue => carCharge-add.vue} (75%) delete mode 100644 apps/web-antd/src/views/property/costManagement/carCharge/carCharge-detail-modal.vue delete mode 100644 apps/web-antd/src/views/property/costManagement/carCharge/carCharge-pay-modal.vue create mode 100644 apps/web-antd/src/views/property/costManagement/carCharge/carCharge-update.vue diff --git a/apps/web-antd/src/api/property/carCharge/index.ts b/apps/web-antd/src/api/property/carCharge/index.ts index 2eb61a11..e1e404ea 100644 --- a/apps/web-antd/src/api/property/carCharge/index.ts +++ b/apps/web-antd/src/api/property/carCharge/index.ts @@ -59,3 +59,7 @@ export function carChargeUpdate(data: CarChargeForm) { export function carChargeRemove(id: ID | IDS) { return requestClient.deleteWithMsg(`/property/carCharge/${id}`); } + +export function carChargeRefund(data: CarChargeForm) { + return requestClient.postWithMsg('/property/carCharge/returnFee', data); +} diff --git a/apps/web-antd/src/api/property/carCharge/model.d.ts b/apps/web-antd/src/api/property/carCharge/model.d.ts index 551a1b1d..e440cb99 100644 --- a/apps/web-antd/src/api/property/carCharge/model.d.ts +++ b/apps/web-antd/src/api/property/carCharge/model.d.ts @@ -16,6 +16,7 @@ export interface CarChargeVO { */ personId: string | number; + chargeItem:string /** * 楼层 */ @@ -55,6 +56,10 @@ export interface CarChargeVO { * 搜索值 */ searchValue: string; + amountReceivable?:any; + chargeStatus:any; + payType:any; + chargeCycle:any } diff --git a/apps/web-antd/src/api/property/costMeterWater/index.ts b/apps/web-antd/src/api/property/costMeterWater/index.ts index 6896773d..1f2c0fd0 100644 --- a/apps/web-antd/src/api/property/costMeterWater/index.ts +++ b/apps/web-antd/src/api/property/costMeterWater/index.ts @@ -58,4 +58,9 @@ export function costMeterWaterUpdate(data: CostMeterWaterForm) { */ export function costMeterWaterRemove(id: ID | IDS) { return requestClient.deleteWithMsg(`/property/meterWater/${id}`); +} + +// 根据业主id查询 +export function ultimoWater(id: ID | IDS) { + return requestClient.deleteWithMsg(`/property/ultimoWater/${id}`); } \ No newline at end of file diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue index 10c121d3..85ef382b 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue @@ -1,5 +1,5 @@ diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue index 873d2f9b..a5e1c40a 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue @@ -1,9 +1,11 @@ + +:deep(.ant-select-disabled .ant-select-selection-item), +:deep(.ant-picker-disabled .ant-picker-input > input) { + /* 设置一个更深的颜色 */ + color: rgb(0 0 0 / 65%) !important; + /* 有些浏览器需要这个来覆盖默认颜色 */ + -webkit-text-fill-color: rgb(0 0 0 / 65%) !important; +} + \ No newline at end of file diff --git a/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-detail-modal.vue b/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-detail-modal.vue deleted file mode 100644 index 84577e07..00000000 --- a/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-detail-modal.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - - diff --git a/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-pay-modal.vue b/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-pay-modal.vue deleted file mode 100644 index 718985f5..00000000 --- a/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-pay-modal.vue +++ /dev/null @@ -1,200 +0,0 @@ - - - - diff --git a/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-update.vue b/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-update.vue new file mode 100644 index 00000000..d916bcf1 --- /dev/null +++ b/apps/web-antd/src/views/property/costManagement/carCharge/carCharge-update.vue @@ -0,0 +1,124 @@ + + + \ No newline at end of file diff --git a/apps/web-antd/src/views/property/costManagement/carCharge/data.ts b/apps/web-antd/src/views/property/costManagement/carCharge/data.ts index 01b45498..803b7262 100644 --- a/apps/web-antd/src/views/property/costManagement/carCharge/data.ts +++ b/apps/web-antd/src/views/property/costManagement/carCharge/data.ts @@ -1,6 +1,8 @@ +// 字段、接口、label、options 保持 carCharge 现有逻辑不变,仅优化注释和结构风格 +// 参照 houseCharge/data.ts 的风格进行整理 + import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; - import { getDictOptions } from '#/utils/dict'; import { renderDict } from '#/utils/render'; import { costItemSettingList } from '#/api/property/costManagement/costItemSetting'; @@ -8,7 +10,9 @@ import { personList } from '#/api/property/resident/person'; import { communityTree } from '#/api/property/community'; import { handleNode } from '@vben/utils'; - +/** + * 查询表单 schema + */ export const querySchema: FormSchemaGetter = () => [ { component: 'Input', @@ -16,81 +20,56 @@ export const querySchema: FormSchemaGetter = () => [ label: '车牌号', }, { - component: 'Input', - fieldName: 'personId', label: '业主', + fieldName: 'personId', + component: 'ApiSelect', + componentProps: { + api: async () => { + const rows = await personList({ pageSize: 1000000000, pageNum: 1 }); + return rows; + }, + resultField: 'rows', + labelField: 'userName', + valueField: 'id', + }, }, { component: 'Select', componentProps: { - // 可选从DictEnum中获取 DictEnum.WY_CSZT 便于维护 - options: getDictOptions('wy_cszt'), + options: getDictOptions('wy_fyshzt'), }, - fieldName: 'state', + fieldName: 'chargeStatus', label: '状态', }, ]; -// 需要使用i18n注意这里要改成getter形式 否则切换语言不会刷新 -// export const columns: () => VxeGridProps['columns'] = () => [ +/** + * 表格列配置 + */ export const columns: VxeGridProps['columns'] = [ { type: 'checkbox', width: 60 }, { title: '序号', field: 'id', slots: { - default: ({ rowIndex }) => { - return (rowIndex + 1).toString(); - }, + default: ({ rowIndex }) => (rowIndex + 1).toString(), }, }, + { title: '车牌号', field: 'carNumber' }, + { title: '车位', field: 'location' }, + { title: '业主', field: 'personId' }, { - title: '车牌号', - field: 'carNumber', - }, - { - title: '车位', - field: 'location', - }, - { - title: '业主', - field: 'personId', - }, - // { - // title: '状态', - // field: 'state', - // slots: { - // default: ({ row }) => { - // // 可选从DictEnum中获取 DictEnum.WY_CSZT 便于维护 - // return renderDict(row.state, 'wy_cszt'); - // }, - // }, - // }, - { - title: '收费项目', - field: 'costItemsId', - }, - { - title: '计费开始时间', - field: 'starTime', - }, - { - title: '计费结束时间', - field: 'endTime', - }, - { - title: '说明', - field: 'remark', - }, - { - title: '状态', - field: 'charge_status', - slots:{ - default:({row}) => { - return renderDict(row.charge_status, 'wy_fyshzt') - } - } + title: '缴费状态', + field: 'chargeStatus', + width: 150, + slots: { + default: ({ row }) => renderDict(row.chargeStatus, 'wy_fyshzt'), + }, }, + { title: '收费项目', field: 'costItemsId' }, + { title: '计费开始时间', field: 'starTime' }, + { title: '计费结束时间', field: 'endTime' }, + { title: '说明', field: 'remark' }, { field: 'action', fixed: 'right', @@ -99,7 +78,10 @@ export const columns: VxeGridProps['columns'] = [ width: 180, }, ]; -//详情 + +/** + * 详情弹窗 schema + */ export const modalSchema: FormSchemaGetter = () => [ { label: '主键', @@ -115,62 +97,53 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'carNumber', component: 'Input', rules: 'required', - disabled:true, + disabled: true, }, -{ - label: '业主',// + { + label: '业主', fieldName: 'personId', component: 'ApiSelect', - rules:'required', - componentProps:{ + rules: 'required', + componentProps: { api: async () => { - const rows = await personList({pageSize:1000000000,pageNum:1}); + const rows = await personList({ pageSize: 1000000000, pageNum: 1 }); return rows; }, resultField: 'rows', labelField: 'userName', - valueField:'id' + valueField: 'id', }, - disabled:true, + disabled: true, }, { label: '楼层', fieldName: 'floorId', component: 'TreeSelect', - rules:'required', - disabled:true, + rules: 'required', + disabled: true, }, { label: '车位', fieldName: 'location', component: 'Input', - disabled:true, - }, - // { - // label: '状态', - // fieldName: 'state', - // component: 'Select', - // componentProps: { - // // 可选从DictEnum中获取 DictEnum.WY_CSZT 便于维护 - // options: getDictOptions('wy_cszt'), - // }, - // }, - { - label: '费用类型',//一个费用下有多个收费项目 - fieldName: 'costType', - component: 'Select', - componentProps:{ - options:getDictOptions('pro_expense_type'), - }, - disabled:true, + disabled: true, }, { - label: '收费项目',//一个收费项目对应一个费用类型 + label: '费用类型', + fieldName: 'costType', + component: 'Select', + componentProps: { + options: getDictOptions('pro_expense_type'), + }, + disabled: true, + }, + { + label: '收费项目', fieldName: 'costItemsId', component: 'ApiSelect', componentProps: { api: async () => { - const rows = await costItemSettingList({pageSize:1000000000,pageNum:1,costType:'2'}); + const rows = await costItemSettingList({ pageSize: 1000000000, pageNum: 1, costType: '2' }); return rows; }, resultField: 'rows', @@ -178,7 +151,7 @@ export const modalSchema: FormSchemaGetter = () => [ valueField: 'id', }, rules: 'required', - disabled:true, + disabled: true, }, { label: '计费开始时间', @@ -189,7 +162,7 @@ export const modalSchema: FormSchemaGetter = () => [ format: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'YYYY-MM-DD HH:mm:ss', }, - disabled:true, + disabled: true, }, { label: '计费结束时间', @@ -200,16 +173,19 @@ export const modalSchema: FormSchemaGetter = () => [ format: 'YYYY-MM-DD HH:mm:ss', valueFormat: 'YYYY-MM-DD HH:mm:ss', }, - disabled:true, + disabled: true, }, { label: '说明', fieldName: 'remark', component: 'Input', - disabled:true, + disabled: true, }, ]; -//创建 + +/** + * 创建弹窗 schema + */ export const addModalSchema: FormSchemaGetter = () => [ { label: '主键', @@ -227,26 +203,26 @@ export const addModalSchema: FormSchemaGetter = () => [ rules: 'required', }, { - label: '业主',// + label: '业主', fieldName: 'personId', component: 'ApiSelect', - disabled:false, - rules:'required', - componentProps:{ + disabled: false, + rules: 'required', + componentProps: { api: async () => { - const rows = await personList({pageSize:1000000000,pageNum:1}); + const rows = await personList({ pageSize: 1000000000, pageNum: 1 }); return rows; }, resultField: 'rows', labelField: 'userName', - valueField:'id' - } + valueField: 'id', + }, }, { label: '楼层', fieldName: 'floorId', component: 'TreeSelect', - rules:'required', + rules: 'required', }, { label: '车位', @@ -254,21 +230,21 @@ export const addModalSchema: FormSchemaGetter = () => [ component: 'Input', }, { - label: '费用类型',//一个费用下有多个收费项目 + label: '费用类型', fieldName: 'costType', component: 'Select', - componentProps:{ - options:getDictOptions('pro_expense_type'), + componentProps: { + options: getDictOptions('pro_expense_type'), }, - disabled:true, + disabled: true, }, { - label: '收费项目',//一个收费项目对应一个费用类型 + label: '收费项目', fieldName: 'costItemsId', component: 'ApiSelect', componentProps: { api: async () => { - const rows = await costItemSettingList({pageSize:1000000000,pageNum:1,costType:'2'}); + const rows = await costItemSettingList({ pageSize: 1000000000, pageNum: 1, costType: '2' }); return rows; }, resultField: 'rows', @@ -292,7 +268,7 @@ export const addModalSchema: FormSchemaGetter = () => [ label: '计费结束时间', fieldName: 'endTime', component: 'DatePicker', - rules:'required', + rules: 'required', componentProps: { showTime: true, format: 'YYYY-MM-DD HH:mm:ss', @@ -305,8 +281,71 @@ export const addModalSchema: FormSchemaGetter = () => [ component: 'Input', }, ]; -//缴费 + +/** + * 缴费弹窗 schema + */ export const payModalSchema: FormSchemaGetter = () => [ + { + label: '支付方式', + fieldName: 'payType', + component: 'Select', + componentProps: { + options: getDictOptions('wy_zffs'), + class: 'w-full', + }, + rules: 'required', + formItemClass: 'col-span-2', + }, + { + label: '缴费周期', + fieldName: 'chargeCycle', + component: 'Select', + componentProps: { + options: getDictOptions('wy_jfzq'), + class: 'w-full', + }, + formItemClass: 'col-span-2', + }, +]; + +/** + * 详情列配置 + */ +export const detailColumns: VxeGridProps['columns'] = [ + { + title: '序号', + field: 'id', + slots: { + default: ({ rowIndex }) => (rowIndex + 1).toString(), + }, + }, + { title: '费用项目', field: 'carNumber' }, + { title: '费用标识', field: 'location' }, + { title: '应收金额', field: 'personId' }, + { + title: '状态', + field: 'state', + slots: { + default: ({ row }) => renderDict(row.state, 'wy_cszt'), + }, + }, + { title: '建帐时间', field: 'starTime' }, + { title: '应收时间', field: 'endTime' }, + { title: '说明', field: 'remark' }, + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + width: 180, + }, +]; + +/** + * 退款弹窗 schema + */ +export const modalSchemaRefund: FormSchemaGetter = () => [ { label: '主键', fieldName: 'id', @@ -316,181 +355,11 @@ export const payModalSchema: FormSchemaGetter = () => [ triggerFields: [''], }, }, - { - label: '车牌号', - fieldName: 'carNumber', - component: 'Input', + { + label: '退费原因', + fieldName: 'reason', + component: 'Textarea', + formItemClass: 'col-span-2', rules: 'required', - disabled:true, - - }, - { - label: '业主',// - fieldName: 'personId', - component: 'ApiSelect', - rules:'required', - componentProps:{ - api: async () => { - const rows = await personList({pageSize:1000000000,pageNum:1}); - return rows; - }, - resultField: 'rows', - labelField: 'userName', - valueField:'id' - }, - disabled:true, - - }, - { - label: '楼层', - fieldName: 'floorId', - component: 'TreeSelect', - rules:'required', - disabled:true, - - }, - { - label: '车位', - fieldName: 'location', - component: 'Input', - disabled:true, - - }, - { - label: '费用类型',//一个费用下有多个收费项目 - fieldName: 'costType', - component: 'Select', - componentProps:{ - options:getDictOptions('pro_expense_type'), - }, - disabled:true, - }, - { - label: '收费项目',//一个收费项目对应一个费用类型 - fieldName: 'costItemsId', - component: 'ApiSelect', - componentProps: { - api: async () => { - const rows = await costItemSettingList({pageSize:1000000000,pageNum:1,costType:'2'}); - return rows; - }, - resultField: 'rows', - labelField: 'chargeItem', - valueField: 'id', - }, - rules: 'required', - disabled:true, - - }, - { - label: '计费开始时间', - fieldName: 'starTime', - component: 'DatePicker', - rules: 'required', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - }, - disabled:true, - - }, - { - label: '计费结束时间', - fieldName: 'endTime', - component: 'DatePicker', - rules:'required', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'YYYY-MM-DD HH:mm:ss', - }, - disabled:true, - - }, - { - label: '说明', - fieldName: 'remark', - component: 'Input', - disabled:true, - }, - { - label: '支付方式', - fieldName: 'payType', - component: 'Select', - componentProps:{ - options:getDictOptions('wy_zffs'), - }, - rules: 'required', - }, - { - label: '缴费周期', - fieldName: 'chargeCycle', - component: 'Select', - componentProps:{ - options:getDictOptions('wy_jfzq'), - }, - }, - { - label: '实收金额', - fieldName: 'cost', - component: 'Input', - }, - { - label: '自定义周期', - fieldName: 'remark', - component: 'Input', - }, -]; -export const detailColumns: VxeGridProps['columns'] = [ - { - title: '序号', - field: 'id', - slots: { - default: ({ rowIndex }) => { - return (rowIndex + 1).toString(); - }, - }, - }, - { - title: '费用项目', - field: 'carNumber', - }, - { - title: '费用标识', - field: 'location', - }, - { - title: '应收金额', - field: 'personId', - }, - { - title: '状态', - field: 'state', - slots: { - default: ({ row }) => { - // 可选从DictEnum中获取 DictEnum.WY_CSZT 便于维护 - return renderDict(row.state, 'wy_cszt'); - }, - }, - }, - { - title: '建帐时间', - field: 'starTime', - }, - { - title: '应收时间', - field: 'endTime', - }, - { - title: '说明', - field: 'remark', - }, - { - field: 'action', - fixed: 'right', - slots: { default: 'action' }, - title: '操作', - width: 180, }, ]; diff --git a/apps/web-antd/src/views/property/costManagement/carCharge/index.vue b/apps/web-antd/src/views/property/costManagement/carCharge/index.vue index b2f39efc..52fa9176 100644 --- a/apps/web-antd/src/views/property/costManagement/carCharge/index.vue +++ b/apps/web-antd/src/views/property/costManagement/carCharge/index.vue @@ -1,20 +1,12 @@ diff --git a/apps/web-antd/src/views/property/costManagement/costMeterWater/costMeterWater-modal.vue b/apps/web-antd/src/views/property/costManagement/costMeterWater/costMeterWater-modal.vue index 0a0f7e3f..6253b698 100644 --- a/apps/web-antd/src/views/property/costManagement/costMeterWater/costMeterWater-modal.vue +++ b/apps/web-antd/src/views/property/costManagement/costMeterWater/costMeterWater-modal.vue @@ -8,10 +8,10 @@ import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { cloneDeep,handleNode,getPopupContainer } from '@vben/utils'; import { communityTree } from '#/api/property/community'; import { watch } from 'vue'; -import { costItemSettingList } from '#/api/property/costManagement/costItemSetting'; +import { costItemSettingList} from '#/api/property/costManagement/costItemSetting'; import { meterReadingTypeList } from '#/api/property/costManagement/meterReadingType'; import { getDictOptions } from '#/utils/dict'; - +import {ultimoWater} from '#/api/property/costMeterWater' const emit = defineEmits<{ reload: [] }>(); const costItemsOptions = ref([]); const meterTypeOptions = ref([]);