|
|
@@ -0,0 +1,1067 @@
|
|
|
+<template>
|
|
|
+ <el-form
|
|
|
+ class="-mb-15px"
|
|
|
+ :model="dataForm"
|
|
|
+ ref="formRef"
|
|
|
+ label-width="110px"
|
|
|
+ :rules="dataRule"
|
|
|
+ scroll
|
|
|
+ v-loading="loading"
|
|
|
+ :toggleType="isDetail"
|
|
|
+ >
|
|
|
+ <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="床位号" prop="familyDiseases">
|
|
|
+
|
|
|
+ <el-text>{{dataForm.bedName}}</el-text>
|
|
|
+
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="12" :md="12" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="开始日期" prop="startDate">
|
|
|
+
|
|
|
+ <TgDatePicker type="date" v-model="dataForm.startDate" placeholder="选择日期" :toggle-type="isDetail"/>
|
|
|
+
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="12" :md="12" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="结束日期" prop="endDate">
|
|
|
+
|
|
|
+ <TgDatePicker type="date" v-model="dataForm.endDate" placeholder="选择日期" :toggle-type="isDetail"/>
|
|
|
+
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="info-title">{{
|
|
|
+ dataForm.inStatusType == '1' ? '月固定收费项目' : '固定收费项目'
|
|
|
+ }}</div>
|
|
|
+ <div class="info-wrap">
|
|
|
+ <el-row :gutter="10">
|
|
|
+
|
|
|
+ <template v-if="dataForm.inStatusType == '1'">
|
|
|
+ <template v-for="(item, index) in arr" :key="index">
|
|
|
+ <el-col :lg="7" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item
|
|
|
+ :label="item.label1"
|
|
|
+ class="mb12"
|
|
|
+ >
|
|
|
+ <TgSelect
|
|
|
+ v-model="item.itemId"
|
|
|
+ placeholder="请选择"
|
|
|
+ :clearable="false"
|
|
|
+ @change="(arg) => handleChange(arg, index, item, 1)"
|
|
|
+ :list="item.list"
|
|
|
+ dict-label="chargeName"
|
|
|
+ dict-value="id"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="(b, index) in item.list"
|
|
|
+ :key="index"
|
|
|
+ :label="`${b.chargeName}(${b.price}元${getDictLabel(DICT_TYPE.FEE_CHARGE_TYPE, b.chargeType)})`"
|
|
|
+ :value="b.id"
|
|
|
+ />
|
|
|
+ </TgSelect>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="7" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item :label="item.label2">
|
|
|
+ <TgInput input-type="number" v-model="item.actualAmount" @blur="handleBlur(item, 3)"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="5" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="是否打折" prop="isDiscount">
|
|
|
+ <TgSwitch
|
|
|
+ v-model="item.isDiscount"
|
|
|
+ inline-prompt
|
|
|
+ active-text="是"
|
|
|
+ inactive-text="否"
|
|
|
+ :disabled="!item.itemId"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="0"
|
|
|
+ @click="handleChangeDiscount(item)"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <template v-if="item.isDiscount">
|
|
|
+ <el-col :lg="7" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="折扣金额" prop="discountAmount">
|
|
|
+ <TgInput
|
|
|
+ v-model="item.discountAmountTemp"
|
|
|
+ append-text="¥"
|
|
|
+ input-type="number"
|
|
|
+ @input="(e)=>updateNum(e.target.value, item, 'discountAmount')"
|
|
|
+ @blur="handleBlur(item, 1)"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="7" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="折扣率" prop="isDiscount">
|
|
|
+ <TgInputNumber
|
|
|
+ :controls="false"
|
|
|
+ v-model="item.discountTemp"
|
|
|
+ @input="(e)=>updateNum(e, item, 'discount')"
|
|
|
+ @blur="handleBlur(item, 2)"
|
|
|
+ :max="10"
|
|
|
+ style="width: 90%"
|
|
|
+ />
|
|
|
+ <el-tooltip
|
|
|
+ class="item"
|
|
|
+ effect="dark"
|
|
|
+ content="输入0至10之间数值;例如:输入8.5为85折。(不包含0和10)"
|
|
|
+ placement="top-start"
|
|
|
+ >
|
|
|
+ <Icon icon="ep:info-filled" />
|
|
|
+ </el-tooltip>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </template>
|
|
|
+ <el-col
|
|
|
+ :lg="5"
|
|
|
+ :md="24"
|
|
|
+ :sm="24"
|
|
|
+ :xs="24"
|
|
|
+ :offset="item.isDiscount ? (smallerThanLg ? 0 : 5) : 0"
|
|
|
+ >
|
|
|
+ <el-form-item label="单项小计">
|
|
|
+ <span class="price">¥{{ formatNum(item.totalAmount) }}元/月</span>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-col :span="22" :offset="2"><el-divider /></el-col>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" class="mb5" v-if="!isDetail">
|
|
|
+ <el-button @click="handleAddMonth">
|
|
|
+ <Icon icon="ep:zoom-in" />添加固定项目
|
|
|
+ </el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" v-for="(item, index) in dataForm.monthlyExpenses" :key="index">
|
|
|
+ <el-row :gutter="10">
|
|
|
+ <el-col :lg="1" :md="24" :sm="24" :xs="24" v-if="!isDetail">
|
|
|
+ <Icon
|
|
|
+ :size="26"
|
|
|
+ color="#f09d31"
|
|
|
+ icon="ep:remove"
|
|
|
+ @click="handleDelMonth(index)"
|
|
|
+ />
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="6" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="项目类别" prop="itemCategoryId">
|
|
|
+ <TgTreeSelect
|
|
|
+ v-model="item.itemCategoryId"
|
|
|
+ :data="monthlyTreeList"
|
|
|
+ @change="(arg) => handleChangeCategory(arg, item)"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="6" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="项目名称" prop="itemId">
|
|
|
+ <TgSelect
|
|
|
+ v-model="item.itemId"
|
|
|
+ placeholder="请选择"
|
|
|
+ clearable
|
|
|
+ @change="(arg) => handleChange(arg, index, item, 2)"
|
|
|
+ dict-label="chargeName"
|
|
|
+ dict-value="id"
|
|
|
+ :list="item.list"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="t in item.list"
|
|
|
+ :key="t.id"
|
|
|
+ :label="`${t.chargeName}(${t.price}元${getDictLabel(DICT_TYPE.FEE_CHARGE_TYPE, t.chargeType)})`"
|
|
|
+ :value="t.id"
|
|
|
+ />
|
|
|
+ </TgSelect>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="6" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="费用" prop="actualAmount">
|
|
|
+ <TgInput input-type="number" v-model="item.actualAmount" @blur="handleBlur(item, 3)"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="5" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="是否打折" prop="isDiscount">
|
|
|
+ <TgSwitch
|
|
|
+ v-model="item.isDiscount"
|
|
|
+ inline-prompt
|
|
|
+ active-text="是"
|
|
|
+ inactive-text="否"
|
|
|
+ :disabled="!item.itemId"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="0"
|
|
|
+ @click="handleChangeDiscount(item)"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <template v-if="item.isDiscount">
|
|
|
+ <el-col
|
|
|
+ :lg="6"
|
|
|
+ :md="24"
|
|
|
+ :sm="24"
|
|
|
+ :xs="24"
|
|
|
+ :offset="item.isDiscount ? (smallerThanLg ? 0 : 1) : 0"
|
|
|
+ >
|
|
|
+ <el-form-item label="折扣金额" prop="discountAmount">
|
|
|
+ <TgInput
|
|
|
+ v-model="item.discountAmountTemp"
|
|
|
+ append-text="¥"
|
|
|
+ input-type="number"
|
|
|
+ @input="(e)=>updateNum(e.target.value, item, 'discountAmount')"
|
|
|
+ @blur="handleBlur(item, 1)"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :lg="6" :md="24" :sm="24" :xs="24">
|
|
|
+ <el-form-item label="折扣率" prop="isDiscount">
|
|
|
+ <TgInputNumber
|
|
|
+ :controls="false"
|
|
|
+ v-model="item.discountTemp"
|
|
|
+ @input="(e)=>updateNum(e, item, 'discount')"
|
|
|
+ @blur="handleBlur(item, 2)"
|
|
|
+ :max="10"
|
|
|
+ style="width: 90%"
|
|
|
+ />
|
|
|
+ <el-tooltip
|
|
|
+ class="item"
|
|
|
+ effect="dark"
|
|
|
+ content="输入0至10之间数值;例如:输入8.5为85折。(不包含0和10)"
|
|
|
+ placement="top-start"
|
|
|
+ >
|
|
|
+ <Icon icon="ep:info-filled" />
|
|
|
+ </el-tooltip>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </template>
|
|
|
+ <el-col
|
|
|
+ :offset="item.isDiscount ? (smallerThanLg ? 0 : 19) : 19"
|
|
|
+ >
|
|
|
+ <el-form-item label="单项小计">
|
|
|
+ <span class="price">¥{{ formatNum(item.totalAmount) }}元/月</span>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-col :span="22" :offset="2"><el-divider /></el-col>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24">
|
|
|
+ <p class="tR" style="text-align: right">
|
|
|
+ 月固定金额合计 <span class="totalNum" style="color:#ff0000;font-weight: bold;font-size: 18px">¥{{ formatNum(totalMonthFee) }}元</span>
|
|
|
+ </p>
|
|
|
+ </el-col>
|
|
|
+ </template>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ <div class="info-title">备注</div>
|
|
|
+ <div class="info-wrap">
|
|
|
+ <el-form-item label="费用备注">
|
|
|
+ <TgTextarea v-model="dataForm.remark" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+</template>
|
|
|
+<script setup lang="ts">
|
|
|
+import {
|
|
|
+ DICT_TYPE,
|
|
|
+ getDictLabel,
|
|
|
+ getDictOptions,
|
|
|
+ getIntDictOptions
|
|
|
+} from '@/utils/dict'
|
|
|
+import { getNursingLevelPage } from '@/api/elderly/nursing'
|
|
|
+import { getOverheadListByType, getOverheadPage } from '@/api/elderly/fee/overheadCharge'
|
|
|
+import {getBedIdByIdCardFun, getChargeCategoryTree} from '@/api/elderly/fee/chargeCategory'
|
|
|
+import { filteredTreeData, findTreeNode } from '@/utils/tree'
|
|
|
+import { dayjs, FormRules } from 'element-plus'
|
|
|
+import { formatDecimal, formatNum, formatRid } from '@/utils/formatter'
|
|
|
+import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'
|
|
|
+import { InfoFilled } from '@element-plus/icons-vue'
|
|
|
+import { getParentNodesById } from '@/utils'
|
|
|
+import { checkPrivateRoom } from '@/api/elderly/elder/bed-change'
|
|
|
+import { getTenantId } from '@/utils/auth'
|
|
|
+import { getBusinessId } from '@/api/elderly/common'
|
|
|
+defineOptions({ name: 'CheckInForm' })
|
|
|
+const message = useMessage() // 消息弹窗
|
|
|
+const formRef = ref() // 表单 Ref
|
|
|
+const loading = ref(false)
|
|
|
+const selectRoomRef = ref()
|
|
|
+
|
|
|
+const breakpoints = useBreakpoints(breakpointsTailwind)
|
|
|
+const smallerThanLg = breakpoints.smaller('xl') // only larger than md
|
|
|
+const isDetail = ref(false)
|
|
|
+const state = reactive({
|
|
|
+ dataForm: {
|
|
|
+ // 表单字段
|
|
|
+ tenantId: undefined,
|
|
|
+ id: '',
|
|
|
+ elderId: '',
|
|
|
+ elderName: '',
|
|
|
+ elderSex: '',
|
|
|
+ startDate: '',
|
|
|
+ endDate: '',
|
|
|
+ idCard: '',
|
|
|
+ iphone: '',
|
|
|
+ checkInDeadlineTime: '',
|
|
|
+ expireTime: '',
|
|
|
+ times: '',
|
|
|
+ totalAmount: '',
|
|
|
+ remark: '',
|
|
|
+ contractNumber: '',
|
|
|
+ nurseLevelId: '',
|
|
|
+ monthlyExpenses: [],
|
|
|
+ oneTimeExpenses: [],
|
|
|
+ bedId: '',
|
|
|
+ checkInTime: '',
|
|
|
+ checkOutTime: '',
|
|
|
+ inStatusType: '1',
|
|
|
+ isPrivateRoom: 0,
|
|
|
+ relativesList: [],
|
|
|
+ specialCareNotes: '',
|
|
|
+ status: '',
|
|
|
+ startTenantId: '',
|
|
|
+ recommendedNursingLevel: '', // 推荐护理字段
|
|
|
+ stageExpenses: []
|
|
|
+ },
|
|
|
+ dataRule: {
|
|
|
+ elderId: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '姓名不能为空',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ startDate: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '开始日期不能为空',
|
|
|
+ trigger: ['blur', 'change']
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ endDate: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '结束日期不能为空',
|
|
|
+ trigger: 'change'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
+ if (value && dataForm.value.checkInTime) {
|
|
|
+ const checkInTime = new Date(dataForm.value.checkInTime).getTime()
|
|
|
+ const checkOutTime = new Date(value).getTime()
|
|
|
+
|
|
|
+ if (checkOutTime <= checkInTime) {
|
|
|
+ callback(new Error('合同结束日期必须大于开始日期'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ trigger: 'change'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ contractNumber: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '合同编号不能为空',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ nurseLevelId: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '护理等级不能为空',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ bedId: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '床位号不能为空',
|
|
|
+ trigger: 'blur'
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+})
|
|
|
+const { dataForm, dataRule } = toRefs(state)
|
|
|
+const resetFormField = reactive({...dataForm.value})
|
|
|
+const rowItem = ref({})
|
|
|
+
|
|
|
+const handleSelectElder = (item) => {
|
|
|
+ dataForm.value.elderId = item.id
|
|
|
+ dataForm.value.bedName = item.bedName
|
|
|
+}
|
|
|
+
|
|
|
+/** 打开弹窗 */
|
|
|
+const init = async (row, detail=false, status) => {
|
|
|
+ dataForm.value.startTenantId = getTenantId()
|
|
|
+ isDetail.value = detail
|
|
|
+
|
|
|
+
|
|
|
+ //getNurseLevelList()
|
|
|
+ getOverheadByType(1)
|
|
|
+ getOverheadByType(2)
|
|
|
+ getOverheadByType(3)
|
|
|
+ getOverheadByType(7)
|
|
|
+ getTreeData()
|
|
|
+ //根据身份证查询床位 (定金预定的情况)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const changeOutTime = ()=>{
|
|
|
+ dataForm.value.times = ''
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/** 提交表单 */
|
|
|
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
+const submitForm = async () => {
|
|
|
+ // 校验表单
|
|
|
+ if (!formRef.value) return
|
|
|
+ const valid = await formRef.value.validate()
|
|
|
+ if (!valid) return
|
|
|
+
|
|
|
+ //计算所有费用金额,合同金额,(优惠后的)
|
|
|
+
|
|
|
+ let data = {
|
|
|
+ id: dataForm.value.id,
|
|
|
+ elderlyId: dataForm.value.elderId,
|
|
|
+ elderlyContractDO: {
|
|
|
+ elderId: dataForm.value.elderId,
|
|
|
+ elderName: dataForm.value.elderName,
|
|
|
+ beginTime: dataForm.value.checkInTime,
|
|
|
+ contractTerm: dataForm.value.times,
|
|
|
+ expireTime: dataForm.value.checkOutTime,
|
|
|
+ amount: formatRid(Number(formatDecimal(totalMonthFee.value)) + Number(formatDecimal(totalOneTimeFee.value)) + Number(formatDecimal(stageExpandFee.value))),
|
|
|
+ //expireTime: deathTime.value.substring(0, 10),
|
|
|
+ contractNumber: dataForm.value.contractNumber,
|
|
|
+ details: fileList.value,
|
|
|
+ specialCareNotes: dataForm.value.specialCareNotes,
|
|
|
+ inStatusType: dataForm.value.inStatusType,
|
|
|
+ tenantId: dataForm.value.tenantId,
|
|
|
+ },
|
|
|
+ expenseBO: {
|
|
|
+ elderId: dataForm.value.elderId,
|
|
|
+ startDate:dataForm.value.startDate,
|
|
|
+ endDate:dataForm.value.endDate,
|
|
|
+ totalAmount: formatRid(Number(formatDecimal(totalMonthFee.value)) + Number(formatDecimal(totalOneTimeFee.value)) + Number(formatDecimal(stageExpandFee.value))),
|
|
|
+ remark: dataForm.value.remark,
|
|
|
+ monthlyExpenses: JSON.parse(JSON.stringify(dataForm.value.monthlyExpenses)),
|
|
|
+ oneTimeExpenses: JSON.parse(JSON.stringify(dataForm.value.oneTimeExpenses)),
|
|
|
+ stageExpenses: JSON.parse(JSON.stringify(dataForm.value.stageExpenses)),
|
|
|
+ bedId: dataForm.value.bedId,
|
|
|
+ checkInTime: dataForm.value.checkInTime,
|
|
|
+ checkInDeadlineTime: dataForm.value.checkInDeadlineTime,
|
|
|
+ nurseLevelId: dataForm.value.nurseLevelId,
|
|
|
+ isPrivateRoom: dataForm.value.isPrivateRoom,
|
|
|
+ specialCareNotes: dataForm.value.specialCareNotes,
|
|
|
+ tenantId: dataForm.value.tenantId,
|
|
|
+ },
|
|
|
+ tenantId: dataForm.value.tenantId,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (dataForm.value.inStatusType == '1') {
|
|
|
+ data.expenseBO.monthlyExpenses.push(...arr)
|
|
|
+ }
|
|
|
+ data.expenseBO.monthlyExpenses.map((item) => {
|
|
|
+ item.list = undefined
|
|
|
+ })
|
|
|
+ data.expenseBO.oneTimeExpenses.map((item) => {
|
|
|
+ item.list = undefined
|
|
|
+ })
|
|
|
+ // 去除阶段性的actualAmount
|
|
|
+ data.expenseBO.stageExpenses.map(item=>{
|
|
|
+ item.list = undefined
|
|
|
+ if(item.isFreeGift == 1){
|
|
|
+ item.actualAmount = 0
|
|
|
+ }else if(item.isHirePurchase == 1){
|
|
|
+ item.actualAmount = item.hirePurchaseAmount
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ // 提交请求
|
|
|
+ return {
|
|
|
+ valid,
|
|
|
+ dataForm: data
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// 文件列表
|
|
|
+const fileList = ref<{ fileUrl: string; fileName: string }[]>([])
|
|
|
+
|
|
|
+/** 重置表单 */
|
|
|
+const resetForm = () => {
|
|
|
+ dataForm.value = {...resetFormField}
|
|
|
+ formRef.value?.resetFields()
|
|
|
+}
|
|
|
+
|
|
|
+//重置数据
|
|
|
+const resetData = () => {
|
|
|
+ dataForm.value.checkInTime = ''
|
|
|
+ dataForm.value.times = ''
|
|
|
+ dataForm.value.contractNumber = ''
|
|
|
+ dataForm.value.checkInDeadlineTime = ''
|
|
|
+ dataForm.value.monthlyExpenses = []
|
|
|
+ dataForm.value.oneTimeExpenses = []
|
|
|
+ dataForm.value.stageExpenses = []
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+const processType = ref()
|
|
|
+const getProcess = async (id, type, status) => {
|
|
|
+ const res = await getBusinessId(id)
|
|
|
+ init({bpmStatus: status, elderId: res.businessId2, id: res.businessId}, true, status)
|
|
|
+ processType.value = type
|
|
|
+}
|
|
|
+
|
|
|
+/** 查询护理等级列表 */
|
|
|
+const nurseLevelList = ref<{ id: number; nurseLevelName: string }[]>([])
|
|
|
+const getNurseLevelList = async () => {
|
|
|
+ try {
|
|
|
+ const data = await getNursingLevelPage({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 100
|
|
|
+ })
|
|
|
+ nurseLevelList.value = data.list
|
|
|
+ } finally {
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 查询床位类型 1
|
|
|
+// 查询护理标准 2
|
|
|
+// 餐饮标准 3
|
|
|
+const bedList = ref<{ chargeName: string; id: string; price: number }[]>([])
|
|
|
+const nurseList = ref<{ chargeName: string; id: string; price: number }[]>([])
|
|
|
+const foodList = ref<{ chargeName: string; id: string; price: number }[]>([])
|
|
|
+const serveList = ref<{ chargeName: string; id: string; price: number }[]>([])
|
|
|
+const getOverheadByType = async (val) => {
|
|
|
+ try {
|
|
|
+ const res = await getOverheadListByType(val, dataForm.value.startTenantId)
|
|
|
+ if (val == 1) {
|
|
|
+ bedList.value = res
|
|
|
+ arr[0].list = res
|
|
|
+ arr[0].itemCategoryId = res ? res[0].superiorsId : ''
|
|
|
+ } else if (val == 2) {
|
|
|
+ nurseList.value = res
|
|
|
+ arr[1].list = res
|
|
|
+ arr[1].itemCategoryId = res ? res[0].superiorsId : ''
|
|
|
+ } else if (val == 3) {
|
|
|
+ foodList.value = res
|
|
|
+ arr[2].list = res
|
|
|
+ arr[2].itemCategoryId = res ? res[0].superiorsId : ''
|
|
|
+ }else if (val == 7) {
|
|
|
+ foodList.value = res
|
|
|
+ arr[3].list = res
|
|
|
+ arr[3].itemCategoryId = res ? res[0].superiorsId : ''
|
|
|
+ }
|
|
|
+ }catch (e) {}
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 更新费用
|
|
|
+const handleChange = (id, index: number, item, type: number = 1) => {
|
|
|
+ // 固定费用中不需要选分类的几项
|
|
|
+ if (type == 1) {
|
|
|
+ let obj = arr[index].list.find((item) => item.id === id)
|
|
|
+ arr[index].itemName = obj?.chargeName
|
|
|
+ arr[index].actualAmount = item.isDiscount
|
|
|
+ ? item.discount
|
|
|
+ ? ((obj?.price * item.discount) / 100) * 10
|
|
|
+ : obj?.price
|
|
|
+ : obj?.price
|
|
|
+ arr[index].totalAmount = arr[index].actualAmount
|
|
|
+ arr[index].amount = obj?.price
|
|
|
+
|
|
|
+ // 在tree中找到这棵树的上一级
|
|
|
+ let node = findTreeNode(treeList.value, item.itemCategoryId, 'id', 'childrenList')
|
|
|
+ // 找到对应的名称
|
|
|
+ const res = getParentNodesById(treeList.value, node.parentId, node.id, 'name', 'parentId', 'childrenList')
|
|
|
+ // 只保留最后两位
|
|
|
+ if(res.length - 2 > 0){
|
|
|
+ for(let i = 0; i <= res.length - 2; i++){
|
|
|
+ res.pop()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ arr[index].itemCategoryName = res.reverse().join('-')
|
|
|
+ } else {
|
|
|
+ let obj = item.list.find((item) => item.id === id)
|
|
|
+ item.itemName = obj?.chargeName
|
|
|
+ if(type != 4){
|
|
|
+ item.actualAmount = item.isDiscount
|
|
|
+ ? item.discount
|
|
|
+ ? ((obj?.price * item.discount) / 100) * 10
|
|
|
+ : obj?.price
|
|
|
+ : obj?.price
|
|
|
+ item.totalAmount = type == 2 ? item.actualAmount : item.actualAmount * item.count
|
|
|
+ item.amount = obj?.price
|
|
|
+ }else{
|
|
|
+ item.actualAmount = obj.price
|
|
|
+ item.totalAmount = item.isFreeGift == 1 ? 0 : item.actualAmount * item.count
|
|
|
+ item.amount = obj.price
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleChangeOneTimeTotalPrice = (item) => {
|
|
|
+ item.totalAmount = item.actualAmount * item.count
|
|
|
+}
|
|
|
+
|
|
|
+// 更新输入框的值
|
|
|
+const updateNum = (e, item, type) => {
|
|
|
+ item[type] = Number(e.data || e)
|
|
|
+}
|
|
|
+
|
|
|
+// 项目类别
|
|
|
+const monthlyTreeList = ref()
|
|
|
+const treeList = ref()
|
|
|
+const defaultProps = ref({
|
|
|
+ // 树形属性
|
|
|
+ children: 'childrenList',
|
|
|
+ label: 'name',
|
|
|
+ value: 'id',
|
|
|
+ disabled: 'disabled'
|
|
|
+})
|
|
|
+const getTreeData = async () => {
|
|
|
+ try {
|
|
|
+ loading.value = true
|
|
|
+ // 长住
|
|
|
+ if (dataForm.value.inStatusType == '1') {
|
|
|
+ const data = await getChargeCategoryTree()
|
|
|
+ treeList.value = filteredTreeData(data, 'childrenList')
|
|
|
+ console.log("AA",treeList.value)
|
|
|
+ // 添加以下行来过滤 identification == '4' 的项并赋值给 monthlyTreeList
|
|
|
+ monthlyTreeList.value = filteredTreeData(data.filter(item => item.identification !== '4'), 'childrenList')
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // 试住
|
|
|
+ const data = await getChargeCategoryTree()
|
|
|
+ //let item = findTreeNode(data, '5', 'identification', 'childrenList')
|
|
|
+ //treeList.value = [item]
|
|
|
+ treeList.value = filteredTreeData(data, 'childrenList')
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ console.log('err', err)
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 项目名称
|
|
|
+const handleChangeCategory = async (arg, item) => {
|
|
|
+ item.itemId = ''
|
|
|
+ item.itemName = ''
|
|
|
+ item.isDeposit = ''
|
|
|
+ item.discountAmount = ''
|
|
|
+ item.discount = ''
|
|
|
+ let obj = findTreeNode(treeList.value, arg, 'id', 'childrenList')
|
|
|
+ item.isDeposit = (obj.identification == 4 || obj.identification == 22) ? 1 : 0
|
|
|
+ // 找到对应的名称
|
|
|
+ const res = getParentNodesById(treeList.value, obj.parentId, arg, 'name', 'parentId', 'childrenList')
|
|
|
+ // 只保留最后两位
|
|
|
+ if(res.length - 2 > 0){
|
|
|
+ for(let i = 0; i <= res.length - 2; i++){
|
|
|
+ res.pop()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ item.itemCategoryName = res.reverse().join('-')
|
|
|
+ // 找到匹配的关联节点
|
|
|
+ await getNameList(item)
|
|
|
+}
|
|
|
+const getNameList = async (item) => {
|
|
|
+ try {
|
|
|
+ const data = await getOverheadPage({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 200,
|
|
|
+ categoryId: item.itemCategoryId
|
|
|
+ })
|
|
|
+ item.list = data.list
|
|
|
+ } finally {
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+let arr: any = reactive([
|
|
|
+ {
|
|
|
+ label1: '床位类型',
|
|
|
+ label2: '床位费',
|
|
|
+ list: bedList.value,
|
|
|
+ type: 1,
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: '',
|
|
|
+ isDiscount: '',
|
|
|
+ isMonthlyExpense: 1,
|
|
|
+ isDeposit: 0,
|
|
|
+ totalAmount: 0,
|
|
|
+ discount: undefined,
|
|
|
+ discountTemp: undefined,
|
|
|
+ discountAmount: '',
|
|
|
+ discountAmountTemp: '',
|
|
|
+ errMsg: ''
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label1: '护理标准',
|
|
|
+ label2: '护理费',
|
|
|
+ list: nurseList.value,
|
|
|
+ type: 2,
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: '',
|
|
|
+ isDiscount: '',
|
|
|
+ isMonthlyExpense: 1,
|
|
|
+ isDeposit: 0,
|
|
|
+ totalAmount: 0,
|
|
|
+ discount: undefined,
|
|
|
+ discountTemp: undefined,
|
|
|
+ discountAmount: '',
|
|
|
+ discountAmountTemp: '',
|
|
|
+ errMsg: ''
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label1: '餐饮标准',
|
|
|
+ label2: '餐饮费',
|
|
|
+ list: foodList.value,
|
|
|
+ type: 3,
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: '',
|
|
|
+ isDiscount: '',
|
|
|
+ isMonthlyExpense: 1,
|
|
|
+ isDeposit: 0,
|
|
|
+ totalAmount: 0,
|
|
|
+ discount: undefined,
|
|
|
+ discountTemp: undefined,
|
|
|
+ discountAmount: '',
|
|
|
+ discountAmountTemp: '',
|
|
|
+ errMsg: ''
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label1: '服务标准',
|
|
|
+ label2: '服务费',
|
|
|
+ list: serveList.value,
|
|
|
+ type: 7,
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: '',
|
|
|
+ isDiscount: '',
|
|
|
+ isMonthlyExpense: 1,
|
|
|
+ isDeposit: 0,
|
|
|
+ totalAmount: 0,
|
|
|
+ discount: undefined,
|
|
|
+ discountTemp: undefined,
|
|
|
+ discountAmount: '',
|
|
|
+ discountAmountTemp: '',
|
|
|
+ errMsg: ''
|
|
|
+ }
|
|
|
+])
|
|
|
+
|
|
|
+// 是否启用打折
|
|
|
+const handleChangeDiscount = (row) => {
|
|
|
+ if (row.isDiscount) {
|
|
|
+ row.totalAmount = row.discount ? row.amount * ((row.discount / 100) * 10) : row.actualAmount
|
|
|
+ } else {
|
|
|
+ row.discount = '' // 折扣率
|
|
|
+ row.discountTemp = ''// 折扣率
|
|
|
+ row.discountAmount = '' // 折扣
|
|
|
+ row.discountAmountTemp = '' // 折扣
|
|
|
+ row.totalAmount = row.amount
|
|
|
+ row.actualAmount = row.amount
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 折扣和折扣率换算 价格
|
|
|
+const handleBlur = (item, type = 0) => {
|
|
|
+ if(type == 3){
|
|
|
+ // 判断是否有打折
|
|
|
+ if(item.discountTemp){
|
|
|
+ // TODO
|
|
|
+ }else{
|
|
|
+ item.totalAmount = item.actualAmount
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ // 填写折扣金额
|
|
|
+ if (type == 1) {
|
|
|
+ item.actualAmount = item.amount - item.discountAmount
|
|
|
+ item.discount = item.discountAmount ? (1000 - (item.discountAmount / item.amount) * 1000) * 10 / 1000 : ''
|
|
|
+ item.discountTemp = item.discount ? formatNum(item.discount) : ''
|
|
|
+ } else if (type == 2) { // 折扣率
|
|
|
+ item.actualAmount = item.discountTemp ? item.amount * (item.discountTemp * 1000) / (1000 * 10) : ''
|
|
|
+ item.discountAmount = item.discountTemp ? ((item.amount * (1 - item.discountTemp / 10)) / 10) * 10 : ''
|
|
|
+ item.discountAmountTemp = item.discountAmount ? formatNum(item.discountAmount) : ''
|
|
|
+ }
|
|
|
+ item.totalAmount = item.isDiscount
|
|
|
+ ? item.discount
|
|
|
+ ? item.actualAmount
|
|
|
+ : item.amount
|
|
|
+ : item.amount
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleAddMonth = () => {
|
|
|
+ dataForm.value.monthlyExpenses.push({
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: '',
|
|
|
+ isDiscount: '',
|
|
|
+ isMonthlyExpense: 1,
|
|
|
+ isDeposit: '', // 是否打折
|
|
|
+ discount: undefined, // 折扣率
|
|
|
+ discountTemp: undefined, // 折扣率
|
|
|
+ discountAmount: '', // 折扣
|
|
|
+ discountAmountTemp: '',
|
|
|
+ totalAmount: 0,
|
|
|
+ list: []
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const handleDelMonth = (index: number) => {
|
|
|
+ dataForm.value.monthlyExpenses.splice(index, 1)
|
|
|
+}
|
|
|
+
|
|
|
+const totalMonthFee = computed(() => {
|
|
|
+ let total = 0
|
|
|
+ dataForm.value.monthlyExpenses.map((item) => {
|
|
|
+ total += Number(item.totalAmount)
|
|
|
+ })
|
|
|
+ arr.map((item) => {
|
|
|
+ total += Number(item.totalAmount)
|
|
|
+ })
|
|
|
+ return total
|
|
|
+})
|
|
|
+
|
|
|
+const stageExpandFee = computed(()=>{
|
|
|
+ let total = 0
|
|
|
+ dataForm.value.stageExpenses.map((item) => {
|
|
|
+ if(item.isHirePurchase == 1)
|
|
|
+ total += item.totalAmount
|
|
|
+ })
|
|
|
+ return total
|
|
|
+})
|
|
|
+
|
|
|
+const handleAddOneTime = () => {
|
|
|
+ dataForm.value.oneTimeExpenses.push({
|
|
|
+ itemCategoryId: '',
|
|
|
+ itemCategoryName: '',
|
|
|
+ itemId: '',
|
|
|
+ itemName: '',
|
|
|
+ amount: '',
|
|
|
+ actualAmount: undefined,
|
|
|
+ count: 1,
|
|
|
+ isOneTimeFee: 1,
|
|
|
+ isDeposit: '',
|
|
|
+ totalAmount: 0,
|
|
|
+ list: []
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const totalOneTimeFee = computed(() => {
|
|
|
+ let total = 0
|
|
|
+ dataForm.value.oneTimeExpenses.map((item) => {
|
|
|
+ total += item.totalAmount
|
|
|
+ })
|
|
|
+ return total
|
|
|
+})
|
|
|
+
|
|
|
+const handleDelOneTime = (index: number) => {
|
|
|
+ dataForm.value.oneTimeExpenses.splice(index, 1)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// 校验
|
|
|
+const handleValidate = (item) => {
|
|
|
+ if (item.itemId || item.label1=='服务标准') {
|
|
|
+ item.errMsg = ''
|
|
|
+ } else {
|
|
|
+ item.errMsg = item.label1 + '不能为空'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+defineExpose({ init, submitForm, resetForm, getProcess }) // 提供 open 方法,用于打开弹窗
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.check-in-check {
|
|
|
+ .el-form {
|
|
|
+ padding: 15px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-title {
|
|
|
+ margin-left: -15px;
|
|
|
+ min-width: 75px;
|
|
|
+ max-width: 150px;
|
|
|
+ padding: 15px;
|
|
|
+ font-weight: bolder;
|
|
|
+ background-color: #f3f6fb;
|
|
|
+ border-top-right-radius: 50px;
|
|
|
+ border-bottom-right-radius: 50px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-wrap {
|
|
|
+ padding: 15px 0;
|
|
|
+ box-sizing: border-box;
|
|
|
+
|
|
|
+ &.fb12 {
|
|
|
+ .el-form-item {
|
|
|
+ margin-bottom: 12px !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .mb12 {
|
|
|
+ margin-bottom: 12px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-divider--horizontal {
|
|
|
+ margin: 15px !important;
|
|
|
+ margin-top: 0 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .info-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 20px;
|
|
|
+ background-color: #f3f6fb;
|
|
|
+ border-radius: 10px;
|
|
|
+
|
|
|
+ p {
|
|
|
+ margin: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:first-of-type {
|
|
|
+ margin-bottom: 15px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .bold {
|
|
|
+ display: inline-block;
|
|
|
+ margin-right: 10px;
|
|
|
+ font-weight: bolder;
|
|
|
+ }
|
|
|
+
|
|
|
+ i {
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .w100 {
|
|
|
+ width: 100% !important;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-divider {
|
|
|
+ background-color: #f5f5f5;
|
|
|
+ }
|
|
|
+
|
|
|
+ .mt18 {
|
|
|
+ margin-top: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .mb18 {
|
|
|
+ margin-bottom: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .m10 {
|
|
|
+ margin: 10px 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .c9 {
|
|
|
+ color: #999;
|
|
|
+ }
|
|
|
+
|
|
|
+ .desc {
|
|
|
+ color: #7a95e5;
|
|
|
+ padding-left: 40px;
|
|
|
+ }
|
|
|
+ .flex-between{
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+
|
|
|
+ .btn-group-box {
|
|
|
+ width: 100%;
|
|
|
+
|
|
|
+ .btn {
|
|
|
+ display: inline-block;
|
|
|
+ width: 30%;
|
|
|
+ margin-right: 10px;
|
|
|
+ text-align: center;
|
|
|
+ cursor: pointer;
|
|
|
+ background-color: #f2f5f8;
|
|
|
+ border-radius: 8px;
|
|
|
+
|
|
|
+ &:active {
|
|
|
+ background-color: #7a95e5;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .noLabel {
|
|
|
+ :deep(.el-form-item__content) {
|
|
|
+ margin-left: 30px !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .price {
|
|
|
+ display: inline-block;
|
|
|
+ min-width: 10px;
|
|
|
+ color: #ef9321;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tR {
|
|
|
+ text-align: right;
|
|
|
+ font-weight: bolder;
|
|
|
+
|
|
|
+ .totalNum {
|
|
|
+ color: #ef9321;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: bolder;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|