Przeglądaj źródła

对接小工具接口

unknown 1 dzień temu
rodzic
commit
bf288d93fa

+ 4 - 4
src/views/elderly/apply/check-in-request/ProcessForm.vue

@@ -934,9 +934,9 @@
             </el-form-item>
           </el-col>
           <el-col :lg="processType == 2 ? 24 : 6" :md="processType == 2 ? 24 : 12" :sm="24" :xs="24">
-            <el-form-item label="社会保障卡" prop="socialsecurityCardNumber">
+            <el-form-item label="社会保障卡" prop="socialSecurityCardNumber">
               <TgInput
-                v-model="dataForm.socialsecurityCardNumber"
+                v-model="dataForm.socialSecurityCardNumber"
                 placeholder="请输入社会保障卡"
                 clearable
                 maxlength="50"
@@ -1194,7 +1194,7 @@
 </template>
 <script setup lang="ts">
 import { DICT_TYPE, getDictLabel, getDictOptions, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
-import { addElderlyInfo, editElderlyInfo, getElderInfoById } from '@/api/elderly/elder/elderly-Info'
+import {  getElderInfoById } from '@/api/elderly/elder/elderly-Info'
 import { ChechInRequestFormType } from '../types'
 import { FormRules } from 'element-plus'
 import { useValidator } from '@/hooks/web/useValidator'
@@ -1263,7 +1263,7 @@ let dataForm = reactive<ChechInRequestFormType>({
   fileNumber: '',
   inStatusType: '',
   language: '',
-  socialsecurityCardNumber: '',
+  socialSecurityCardNumber: '',
   insuredPlace: '',
   whetherDisabled: '',
   pension: undefined,

+ 4 - 2
src/views/elderly/elder/column.ts

@@ -161,7 +161,9 @@ export const ElderFileColumns = reactive([
   },
   {
     label: '退住日期',
-    field: 'checkOutTime'
+    field: 'checkOutTime',
+    format: true,
+    width: 150,
   },
   {
     label: '床位号',
@@ -445,4 +447,4 @@ export const WaitElderColumns = reactive([
     field: 'createdTime',
     format: true
   }
-])
+])

+ 53 - 25
src/views/elderly/elder/elder-file/Third.vue

@@ -116,31 +116,58 @@
     </el-table>
 
     <div class="title mt-3">变更信息</div>
-    <el-table :header-cell-style="tableHeaderColor" :data="info.changeRecords">
-      <el-table-column prop="date" label="序号">
-        <template #default="scope">
-          {{ scope.$index + 1 }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="categoryName" label="变更类型" />
-      <el-table-column prop="originalName" label="原项目" />
-      <el-table-column prop="expectName" label="现项目" />
-      <el-table-column prop="originalAmount" label="原价格(元)" />
-      <el-table-column prop="actualAmount" label="现价格(元)" />
-      <el-table-column prop="changeDate" label="变更生效日期">
-        <template #default="scope">
-          {{ scope.row.changeDate.join('-') }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="creator" label="变更发起人" />
-      <el-table-column prop="createTime" label="变更发起时间" :formatter="dateFormatter2" />
-      <el-table-column prop="remarks" label="附件">
-        <template #default="scope">
-          {{ scope.row.changeFile }}
-          <!-- <select-upload v-model="JSON.parse(scope.row.changeFile)"/> -->
-        </template>
-      </el-table-column>
-    </el-table>
+    <el-tabs v-model="activeChangeTab" type="card">
+      <el-tab-pane label="护理床位餐饮变更" name="changeRecords">
+        <el-table :header-cell-style="tableHeaderColor" :data="info.changeRecords">
+          <el-table-column prop="date" label="序号">
+            <template #default="scope">
+              {{ scope.$index + 1 }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="categoryName" label="变更类型" />
+          <el-table-column prop="originalName" label="原项目" />
+          <el-table-column prop="expectName" label="现项目" />
+          <el-table-column prop="originalAmount" label="原价格(元)" />
+          <el-table-column prop="actualAmount" label="现价格(元)" />
+          <el-table-column prop="changeDate" label="变更生效日期">
+            <template #default="scope">
+              {{ scope.row.changeDate.join('-') }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="creator" label="变更发起人" />
+          <el-table-column prop="createTime" label="变更发起时间" :formatter="dateFormatter2" />
+          <el-table-column prop="remarks" label="附件">
+            <template #default="scope">
+              {{ scope.row.changeFile }}
+              <!-- <select-upload v-model="JSON.parse(scope.row.changeFile)"/> -->
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="价格变更" name="priceChangeRecords">
+        <el-table :header-cell-style="tableHeaderColor" :data="info.priceChangeRecords">
+          <el-table-column prop="date" label="序号">
+            <template #default="scope">
+              {{ scope.$index + 1 }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="categoryName" label="变更类型" />
+          <el-table-column prop="originalName" label="原项目名称" />
+          <el-table-column prop="originalAmount" label="原价格(元)">
+            <template #default="scope">
+              {{ formatNum(scope.row.originalAmount) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="amount" label="现价格(元)">
+            <template #default="scope">
+              {{ formatNum(scope.row.amount) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="变更时间" :formatter="dateFormatter2" />
+          <el-table-column prop="creator" label="变更发起人" />
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
   </div>
 </template>
 <script lang="ts" setup>
@@ -169,6 +196,7 @@ const nurseInfo = ref({})
 const foodInfo = ref({})
 
 const info = ref({})
+const activeChangeTab = ref('changeRecords')
 const getInfo = async () => {
   const res = await getContractByElderId(props.dataForm.id)
   info.value = res

+ 80 - 18
src/views/elderly/fee/bill-pay/pay.vue

@@ -155,7 +155,7 @@ const formLoading = ref(false)
 
 const handleClosed = () => {
   options.value = []
-  billForm.value = resetBillForm
+  billForm.value = JSON.parse(JSON.stringify(resetBillForm))
   dialogVisible.value = false
 }
 
@@ -189,21 +189,44 @@ const handleRemoveItem = (index) => {
     billForm.value.items[0].payAmount = num
 }
 
+// 计算当前行之外的其他行已收金额总和
+const getOtherItemsTotal = (currentRow) => {
+  let total = 0
+  billForm.value.items.forEach((item) => {
+    if (item !== currentRow) {
+      total += item.payAmount ? Number(item.payAmount) : 0
+    }
+  })
+  return total
+}
+
+// 判断是否为预存款或长护险账户(根据label模糊匹配)
+const isBalanceOrInsurance = (payType) => {
+  const item = options.value.find(item => item.value == payType)
+  if (!item) return false
+  return item.label.indexOf('预存款') > -1 || item.label.indexOf('长护险账户') > -1
+}
+
 // 切换支付方式
 const handleChangePayType = (row) => {
-  if (typeof row.payType == 'string' && (row.payType.indexOf("long_term_care_insurance") > -1 || row.payType == 'balance')) {
+  if (isBalanceOrInsurance(row.payType)) {
     const item = options.value.find(item=>row.payType == item.value)
-    row.payAmount = item.price
-    // 修改完后其余相加,扣减第一条的费用
-    let firstTotal = 0
-    // 判断钱是否一致
-    billForm.value.items.map((item, index) => {
-      if(index != 0){
-        firstTotal += item.payAmount ? Number(item.payAmount) : 0
+    if (!item) return
+    // 预存款/长护险的金额 = min(账户余额, 本次应缴)
+    row.payAmount = item.price < billForm.value.payAmount ? item.price : billForm.value.payAmount
+    // 重新分配其他行的金额,使总和等于本次应缴
+    // 非预存款/长护险的行(保持原有顺序,排除当前行)
+    const otherRows = billForm.value.items.filter((item) => item !== row)
+    const remainingAmount = Number(formatNum(Number(billForm.value.payAmount) - Number(row.payAmount)))
+    // 将剩余金额分配给第一行(如果是非预存款行)或其他行
+    if (otherRows.length > 0) {
+      // 第一行承担剩余金额
+      otherRows[0].payAmount = remainingAmount
+      // 其他行清零
+      for (let i = 1; i < otherRows.length; i++) {
+        otherRows[i].payAmount = 0
       }
-    })
-    const num = formatNum(Number(billForm.value.payAmount) - firstTotal)
-    billForm.value.items[0].payAmount = num
+    }
   }
 }
 
@@ -219,7 +242,7 @@ const submitForm = async () => {
       message.error('请添加支付方式')
       return
     }
-    if (billForm.value.items.length > 1) {
+   // if (billForm.value.items.length > 1) {
       let total = 0
       // 判断钱是否一致
       billForm.value.items.map((item) => {
@@ -229,7 +252,28 @@ const submitForm = async () => {
         message.error('收款金额与本次应缴不一致')
         return
       }
+    //}
+
+    //这里
+    // 校验预存款和长护险账户的金额是否超过余额
+    for (const item of billForm.value.items) {
+      if (isBalanceOrInsurance(item.payType)) {
+        const optionItem = options.value.find(opt => opt.value == item.payType)
+        if (optionItem && Number(item.payAmount) > Number(optionItem.price)) {
+          message.error(`${optionItem.label.split('(')[0]}的收款金额不能超过账户余额${optionItem.price}元`)
+          return
+        }
+      }
     }
+
+    // 校验所有收款金额不能为负数
+    for (const item of billForm.value.items) {
+      if (Number(item.payAmount) < 0) {
+        message.error('收款金额不能为负数')
+        return
+      }
+    }
+
     // 判断如果为0不能缴费
     // if(total == 0){
     //   message.error('本次应缴不能为0')
@@ -272,10 +316,16 @@ const handleChange = () => {
 }
 
 const handleItemChange = (row) => {
-  if (typeof row.payType == 'string' && (row.payType.indexOf("account_member_card") > -1 || row.payType == 'balance' || row.payType.indexOf("long_term_care_insurance") > -1) ) {
+  if (typeof row.payType == 'string' && row.payType.indexOf("account_member_card") > -1 || isBalanceOrInsurance(row.payType)) {
     const item = options.value.find(item=>row.payType == item.value)
     if (item) {
-      row.payAmount = row.payAmount > item.price ? item.price : row.payAmount
+      // 计算当前行之外的其他支付方式已收金额
+      const otherTotal = getOtherItemsTotal(row)
+      // 当前行最多能收的金额 = 本次应缴 - 其他已收金额
+      const maxPayAmount = Number(formatNum(Number(billForm.value.payAmount) - otherTotal))
+      // 收款金额不能超过账户余额,也不能超过当前行最多能收金额
+      const limit = item.price < maxPayAmount ? item.price : maxPayAmount
+      row.payAmount = row.payAmount > limit ? limit : row.payAmount
     }
   }
 
@@ -295,10 +345,23 @@ const handleItemChange = (row) => {
 
 // 比较最大值
 const handleItemBlur = (row) => {
-  if (typeof row.payType == 'string' && (row.payType.indexOf("account_member_card") > -1 || row.payType == 'balance' || row.payType.indexOf("long_term_care_insurance") > -1) ) {
+  // 校验金额不能为负数
+  if (Number(row.payAmount) < 0) {
+    message.error('收款金额不能为负数')
+    row.payAmount = 0
+    return
+  }
+
+  if (typeof row.payType == 'string' && row.payType.indexOf("account_member_card") > -1 || isBalanceOrInsurance(row.payType)) {
     const item = options.value.find(item=>row.payType == item.value)
     if (item) {
-      row.payAmount = row.payAmount > item.price ? item.price : row.payAmount
+      // 计算当前行之外的其他支付方式已收金额
+      const otherTotal = getOtherItemsTotal(row)
+      // 当前行最多能收的金额 = 本次应缴 - 其他已收金额
+      const maxPayAmount = Number(formatNum(Number(billForm.value.payAmount) - otherTotal))
+      // 收款金额不能超过账户余额,也不能超过当前行最多能收金额
+      const limit = item.price < maxPayAmount ? item.price : maxPayAmount
+      row.payAmount = row.payAmount > limit ? limit : row.payAmount
     }
   }
 
@@ -358,7 +421,6 @@ const getItemList = async () => {
     yc.label = `预存款(余额:${result.amount})`
     yc.price = result.amount
   }
-
   // 获取当前账户的会员卡
   const r = await getMemberCardListByIdCard(elderIdCard.value)
   if(r && r.length){

+ 393 - 0
src/views/system/little-tools/DeleteItemForm.vue

@@ -0,0 +1,393 @@
+<template>
+  <Dialog
+    v-model="dialogVisible"
+    :title="titleName"
+    width="80%"
+    class="form-tag-dialog delete-item-form"
+    scroll
+    @close="handleClosed"
+  >
+    <el-form
+      class="-mb-15px"
+      :model="dataForm"
+      ref="formRef"
+      label-width="110px"
+      :rules="dataRule"
+      v-loading="formLoading"
+    >
+      <!-- 长者选择 -->
+      <div class="info-title">长者信息</div>
+      <div class="info-wrap">
+        <el-row :gutter="10">
+          <el-col :lg="12" :md="12" :sm="24" :xs="24">
+            <el-form-item label="选择长者" prop="elderId">
+              <SelectElder
+                v-model="dataForm.elderId"
+                type="2"
+                @elder="handleSelectElder"
+                :tId="dataForm.tenantId"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :lg="12" :md="12" :sm="24" :xs="24">
+            <el-form-item label="长者姓名">
+              <el-text>{{ dataForm.elderName }}</el-text>
+            </el-form-item>
+          </el-col>
+          <el-col :lg="12" :md="12" :sm="24" :xs="24">
+            <el-form-item label="身份证号">
+              <el-text>{{ dataForm.idCard }}</el-text>
+            </el-form-item>
+          </el-col>
+          <el-col :lg="12" :md="12" :sm="24" :xs="24">
+            <el-form-item label="床位号">
+              <el-text>{{ dataForm.bedName }}</el-text>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </div>
+
+      <!-- 月度固定费用列表 -->
+      <div class="info-title">月度固定费用 (共 {{ expenseList.length }} 条)</div>
+      <div class="info-wrap">
+        <div v-if="expenseList.length > 0">
+          <el-table
+            :data="expenseList"
+            v-loading="tableLoading"
+            @selection-change="handleSelectionChange"
+            border
+            style="width: 100%"
+          >
+            <el-table-column type="selection" width="55" align="center" fixed />
+            <el-table-column label="项目类别" prop="itemCategoryName" min-width="120" show-overflow-tooltip />
+            <el-table-column label="项目名称" prop="itemName" min-width="150" show-overflow-tooltip />
+            <el-table-column label="金额" prop="amount" min-width="100">
+              <template #default="{ row }">
+                <span>¥{{ formatNum(row.amount) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="实际金额" prop="actualAmount" min-width="100">
+              <template #default="{ row }">
+                <span>¥{{ formatNum(row.actualAmount) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否打折" prop="isDiscount" min-width="90">
+              <template #default="{ row }">
+                <el-tag v-if="row.isDiscount === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="折扣" prop="discount" min-width="80" />
+            <el-table-column label="折扣金额" prop="discountAmount" min-width="100">
+              <template #default="{ row }">
+                <span v-if="row.discountAmount">¥{{ formatNum(row.discountAmount) }}</span>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否月度费用" prop="isMonthlyExpense" min-width="110">
+              <template #default="{ row }">
+                <el-tag v-if="row.isMonthlyExpense === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否一次性费用" prop="isOneTimeFee" min-width="120">
+              <template #default="{ row }">
+                <el-tag v-if="row.isOneTimeFee === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否押金" prop="isDeposit" min-width="90">
+              <template #default="{ row }">
+                <el-tag v-if="row.isDeposit === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否赠送" prop="isFreeGift" min-width="90">
+              <template #default="{ row }">
+                <el-tag v-if="row.isFreeGift === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="赠送开始时间" prop="freeStartTime" min-width="160" />
+            <el-table-column label="赠送结束时间" prop="freeEndTime" min-width="160" />
+            <el-table-column label="是否分期" prop="isHirePurchase" min-width="90">
+              <template #default="{ row }">
+                <el-tag v-if="row.isHirePurchase === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="分期期数" prop="hirePurchaseNumber" min-width="90" />
+            <el-table-column label="分期每期金额" prop="hirePurchaseAmount" min-width="120">
+              <template #default="{ row }">
+                <span v-if="row.hirePurchaseAmount">¥{{ formatNum(row.hirePurchaseAmount) }}</span>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="数量" prop="count" min-width="80" />
+            <el-table-column label="单项总价" prop="totalAmount" min-width="100">
+              <template #default="{ row }">
+                <span>¥{{ formatNum(row.totalAmount) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="费用类型" prop="type" min-width="100">
+              <template #default="{ row }">
+                <el-tag v-if="row.type === 1" type="primary">床位费</el-tag>
+                <el-tag v-else-if="row.type === 2" type="success">护理费</el-tag>
+                <el-tag v-else-if="row.type === 3" type="warning">膳食费</el-tag>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="租户ID" prop="tenantId" min-width="100" />
+            <el-table-column label="变更开始日期" prop="changeStartDate" min-width="120">
+              <template #default="{ row }">
+                <span>{{ row.changeStartDate ? formatBackendDateTime(row.changeStartDate, 'YYYY-MM-DD') : '-' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="变更结束日期" prop="changeEndDate" min-width="120">
+              <template #default="{ row }">
+                <span>{{ row.changeEndDate ? formatBackendDateTime(row.changeEndDate, 'YYYY-MM-DD') : '-' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="变更标识" prop="changeFlag" min-width="100">
+              <template #default="{ row }">
+                <el-tag v-if="row.changeFlag === 0" type="warning">有变更</el-tag>
+                <el-tag v-else-if="row.changeFlag === 1" type="success">无变更</el-tag>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="是否按天计算" prop="isDayCalculate" min-width="110">
+              <template #default="{ row }">
+                <el-tag v-if="row.isDayCalculate === 1" type="success">是</el-tag>
+                <el-tag v-else type="info">否</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="创建时间" prop="createTime" min-width="160">
+              <template #default="{ row }">
+                <span>{{ formatBackendDateTime(row.createTime) }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-empty v-else-if="!tableLoading" description="暂无数据" />
+      </div>
+    </el-form>
+
+    <template #footer>
+      <el-button @click="handleClosed">关闭</el-button>
+      <el-button
+        v-loading="submitLoading"
+        type="danger"
+        @click="submitForm"
+        :disabled="!selectedIds.length"
+      >
+        删除选中({{ selectedIds.length }})
+      </el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { getTenantId } from '@/utils/auth'
+import { formatNum } from '@/utils/formatter'
+import { formatBackendDateTime } from '@/utils/formatTime'
+import { getExpenseItemsByElderId, deleteExpenseItems } from './api'
+
+interface ExpenseItem {
+  id: number
+  expenseId: number
+  itemId: number
+  itemCategoryId: number
+  itemCategoryName: string
+  itemName: string
+  amount: number
+  actualAmount: number
+  isDiscount: number
+  discount: string
+  isMonthlyExpense: number
+  isOneTimeFee: number
+  isDeposit: number
+  isFreeGift: number
+  freeStartTime: string
+  freeEndTime: string
+  isHirePurchase: number
+  hirePurchaseNumber: number
+  hirePurchaseAmount: number
+  count: number
+  totalAmount: number
+  type: number
+  discountAmount: number
+  tenantId: number
+  changeStartDate: string
+  changeEndDate: string
+  changeFlag: number
+  createTime: string
+  isDayCalculate: number
+}
+
+interface DataForm {
+  elderId: number | undefined
+  elderName: string
+  idCard: string
+  bedName: string
+  tenantId: number
+}
+
+defineOptions({ name: 'DeleteItemForm' })
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+const dialogVisible = ref(false) // 弹窗
+const formLoading = ref(false) // 表单加载
+const submitLoading = ref(false) // 提交加载
+const tableLoading = ref(false) // 表格加载
+const titleName = ref('删除长者固定月费用')
+
+// 表单数据
+const dataForm = reactive<DataForm>({
+  elderId: undefined,
+  elderName: '',
+  idCard: '',
+  bedName: '',
+  tenantId: getTenantId()
+})
+
+// 表单校验规则
+const dataRule = {
+  elderId: [
+    { required: true, message: '请选择长者', trigger: 'change' }
+  ]
+}
+
+// 费用列表
+const expenseList = ref<ExpenseItem[]>([])
+// 选中的费用ID
+const selectedIds = ref<number[]>([])
+
+const formRef = ref()
+
+/** 打开弹窗 */
+const open = async () => {
+  dialogVisible.value = true
+  resetForm()
+}
+
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 选择长者回调 */
+const handleSelectElder = async (item: any) => {
+  dataForm.elderId = item.id
+  dataForm.elderName = item.elderName || ''
+  dataForm.idCard = item.idCard || ''
+  dataForm.bedName = item.bedName || ''
+
+  // 获取长者月度固定费用
+  if (item.id) {
+    await getExpenseList(item.id)
+  }
+}
+
+/** 获取长者月度固定费用列表 */
+const getExpenseList = async (elderId: number) => {
+  tableLoading.value = true
+  try {
+    const res: any = await getExpenseItemsByElderId(elderId)
+    console.log('接口返回:', res)
+    expenseList.value = res
+    console.log('expenseList 赋值后:', expenseList.value)
+
+  } catch (err) {
+    console.error('获取费用列表失败', err)
+    expenseList.value = []
+    message.error('获取费用列表失败')
+  } finally {
+    tableLoading.value = false
+  }
+}
+
+/** 表格选择变化 */
+const handleSelectionChange = (selection: ExpenseItem[]) => {
+  selectedIds.value = selection.map(item => item.id)
+}
+
+/** 提交表单 - 删除选中的费用 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  if (!selectedIds.value.length) {
+    message.warning('请选择要删除的费用')
+    return
+  }
+
+  // 确认删除
+  try {
+    await ElMessageBox.confirm(
+      `确定要删除选中的 ${selectedIds.value.length} 项费用吗?`,
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }
+    )
+  } catch {
+    return
+  }
+
+  submitLoading.value = true
+  try {
+    const res: any = await deleteExpenseItems(selectedIds.value)
+    console.log('删除接口返回:', res)
+    // 支持两种返回格式: {code: 0, data: true, msg: ""} 或 {code: 0, msg: ""}
+    if (res) {
+      message.success('删除成功')
+      // 刷新列表
+      if (dataForm.elderId) {
+        await getExpenseList(dataForm.elderId)
+      }
+      selectedIds.value = []
+      // 发送操作成功的事件
+      emit('success')
+    } else {
+      message.error(res?.msg || '删除失败')
+    }
+  } catch (err) {
+    console.error('删除失败', err)
+    message.error('删除失败')
+  } finally {
+    submitLoading.value = false
+  }
+}
+
+// 重置表单
+const resetForm = () => {
+  dataForm.elderId = undefined
+  dataForm.elderName = ''
+  dataForm.idCard = ''
+  dataForm.bedName = ''
+  expenseList.value = []
+  selectedIds.value = []
+  formRef.value?.resetFields()
+}
+
+// 关闭表单
+const handleClosed = () => {
+  resetForm()
+  dialogVisible.value = false
+}
+</script>
+
+<style scoped lang="scss">
+.delete-item-form {
+  .info-title {
+    font-size: 16px;
+    font-weight: bold;
+    margin: 15px 0 10px;
+    padding-left: 10px;
+    border-left: 4px solid #409eff;
+  }
+
+  .info-wrap {
+    padding: 15px;
+    background-color: #f5f7fa;
+    border-radius: 4px;
+    margin-bottom: 15px;
+  }
+}
+</style>

+ 16 - 0
src/views/system/little-tools/api.ts

@@ -25,3 +25,19 @@ export interface ProcessExpenseAddVO {
 export const createProcessExpense = async (data: ProcessExpenseAddVO) => {
   return await request.post({ url: '/elderly/expense/addFixedExpense', data })
 }
+
+/**
+ * 获取长者月度固定费用列表
+ * @param elderId 长者ID
+ */
+export const getExpenseItemsByElderId = async (elderId: number) => {
+  return await request.get({ url: '/elderly/expense/getExpenseItemsByElderId', params: { elderId } })
+}
+
+/**
+ * 删除长者费用项目
+ * @param ids 费用ID数组
+ */
+export const deleteExpenseItems = async (ids: number[]) => {
+  return await request.post({ url: '/elderly/expense/deleteExpenseItems', data: ids })
+}

+ 8 - 0
src/views/system/little-tools/index.vue

@@ -14,21 +14,25 @@
 
     <MarkCheckinBillsPaidForm  ref="refMarkCheckinBillsPaid"/>
     <AddItemForm  ref="addItemForm"/>
+    <DeleteItemForm  ref="deleteItemForm"/>
 
   </div>
 </template>
 <script setup lang="ts">
 import MarkCheckinBillsPaidForm from "./MarkCheckinBillsPaidForm.vue"
 import AddItemForm from "./AddItemForm.vue"
+import DeleteItemForm from "./DeleteItemForm.vue"
 import {useUserStore} from "@/store/modules/user";
 const message = useMessage() // 消息弹窗
 const userStore = useUserStore()
 const refMarkCheckinBillsPaid = ref()
 const addItemForm = ref()
+const deleteItemForm = ref()
 
 const cards = ref([
   { id: 0, title: '把入院账单设置成已缴费状态', content: '只操作本机构的,集团账号时不要操作' },
   { id: 1, title: '为长者增加月度费用', content: '只操作本机构的,集团账号时不要操作' },
+  { id: 2, title: '为长者删除月度费用', content: '只操作本机构的,集团账号时不要操作' },
 
 ])
 
@@ -45,6 +49,10 @@ const itemClick=(id:any)=>{
       addItemForm.value.open(undefined,false,"月度费用",undefined,userStore.orgTenantId)
 
       break
+    case 2: //删除月度费用
+      deleteItemForm.value.open(undefined,false,"月度费用",undefined,userStore.orgTenantId)
+
+      break
   }
 
 }