|
@@ -32,16 +32,16 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12" :xs="24">
|
|
<el-col :span="12" :xs="24">
|
|
|
<el-form-item label="床位号" prop="bedName">
|
|
<el-form-item label="床位号" prop="bedName">
|
|
|
- <el-input v-if="!isDetail" v-model="dataForm.bedName" disabled/>
|
|
|
|
|
- <el-text v-else>{{dataForm.bedName}}</el-text>
|
|
|
|
|
|
|
+ <el-input v-if="!isDetail" v-model="dataForm.bedName" disabled />
|
|
|
|
|
+ <el-text v-else>{{ dataForm.bedName }}</el-text>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="20">
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12" :xs="24">
|
|
<el-col :span="12" :xs="24">
|
|
|
<el-form-item label="护理等级" prop="nurseLevelName">
|
|
<el-form-item label="护理等级" prop="nurseLevelName">
|
|
|
- <el-input v-if="!isDetail" v-model="dataForm. nurseLevelName" disabled/>
|
|
|
|
|
- <el-text v-else>{{dataForm.nurseLevelName}}</el-text>
|
|
|
|
|
|
|
+ <el-input v-if="!isDetail" v-model="dataForm.nurseLevelName" disabled />
|
|
|
|
|
+ <el-text v-else>{{ dataForm.nurseLevelName }}</el-text>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12" :xs="24">
|
|
<el-col :span="12" :xs="24">
|
|
@@ -70,15 +70,40 @@
|
|
|
v-for="(p, i) in dataForm.items"
|
|
v-for="(p, i) in dataForm.items"
|
|
|
:key="i"
|
|
:key="i"
|
|
|
>
|
|
>
|
|
|
- <div class="border">
|
|
|
|
|
- <el-checkbox
|
|
|
|
|
- :label="p.nurseItemName"
|
|
|
|
|
- v-model="p.checked"
|
|
|
|
|
- @change="(arg) => handleChangeCheckBox(arg, p)"
|
|
|
|
|
- v-if="!isDetail"
|
|
|
|
|
- />
|
|
|
|
|
- <div v-else class="itemName">{{ p.nurseItemName }}</div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-row :gutter="20">
|
|
|
|
|
+ <el-col :span="16">
|
|
|
|
|
+ <div class="item-left">
|
|
|
|
|
+ <el-checkbox
|
|
|
|
|
+ :label="`${p.nurseItemName}(${p.frequencyCategory})`"
|
|
|
|
|
+ v-model="p.checked"
|
|
|
|
|
+ @change="(arg) => handleChangeCheckBox(arg, p)"
|
|
|
|
|
+ v-if="!isDetail"
|
|
|
|
|
+ />
|
|
|
|
|
+ <div v-else class="itemName"
|
|
|
|
|
+ >{{ p.nurseItemName }}({{ p.frequencyCategory }})</div
|
|
|
|
|
+ >
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <div class="item-time" v-if="!isDetail">
|
|
|
|
|
+ <span class="time-label required" v-if="p.frequencyCategoryType == 1"
|
|
|
|
|
+ >护理开始时间</span
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-time-picker
|
|
|
|
|
+ v-if="p.frequencyCategoryType == 1"
|
|
|
|
|
+ v-model="p.beginTime"
|
|
|
|
|
+ value-format="HH:mm:ss"
|
|
|
|
|
+ placeholder="请选择开始时间"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-else class="item-time detail-time">
|
|
|
|
|
+ <span class="time-label" v-if="p.frequencyCategoryType == 1">护理开始时间</span>
|
|
|
|
|
+ <span v-if="p.frequencyCategoryType == 1">{{
|
|
|
|
|
+ formatBeginTimeDetail(p.beginTime)
|
|
|
|
|
+ }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
</div>
|
|
</div>
|
|
@@ -117,15 +142,15 @@ const state = reactive<planType>({
|
|
|
nurseLevelName: '',
|
|
nurseLevelName: '',
|
|
|
effectiveDate: '',
|
|
effectiveDate: '',
|
|
|
items: [],
|
|
items: [],
|
|
|
- extraItems: [],
|
|
|
|
|
|
|
+ extraItems: []
|
|
|
},
|
|
},
|
|
|
dataRule: {
|
|
dataRule: {
|
|
|
elderId: [{ required: true, message: '长者姓名不能为空', trigger: 'blur' }],
|
|
elderId: [{ required: true, message: '长者姓名不能为空', trigger: 'blur' }],
|
|
|
effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }]
|
|
effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }]
|
|
|
- },
|
|
|
|
|
|
|
+ }
|
|
|
})
|
|
})
|
|
|
const { dataForm, dataRule } = toRefs(state)
|
|
const { dataForm, dataRule } = toRefs(state)
|
|
|
-const resetFormField = reactive({ ...dataForm.value })
|
|
|
|
|
|
|
+const resetFormField = reactive({ ...dataForm.value })
|
|
|
const route = useRoute()
|
|
const route = useRoute()
|
|
|
const formLoading = ref(false)
|
|
const formLoading = ref(false)
|
|
|
const isDetail = ref(false)
|
|
const isDetail = ref(false)
|
|
@@ -135,9 +160,40 @@ const itemTitle = computed(() => {
|
|
|
return isDetail.value ? '详情' : !dataForm.value.id ? '新增' : '修改'
|
|
return isDetail.value ? '详情' : !dataForm.value.id ? '新增' : '修改'
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+/** 详情接口可能返回时间戳或整段日期时间,转为时间选择器用的 HH:mm:ss */
|
|
|
|
|
+const toTimePickerValue = (beginTime: unknown): string => {
|
|
|
|
|
+ if (beginTime == null || beginTime === '') return ''
|
|
|
|
|
+ if (typeof beginTime === 'number') {
|
|
|
|
|
+ const d = new Date(beginTime)
|
|
|
|
|
+ if (Number.isNaN(d.getTime())) return ''
|
|
|
|
|
+ const pad = (n: number) => String(n).padStart(2, '0')
|
|
|
|
|
+ return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
|
|
|
|
|
+ }
|
|
|
|
|
+ if (typeof beginTime === 'string') {
|
|
|
|
|
+ if (/^\d+$/.test(beginTime)) return toTimePickerValue(Number(beginTime))
|
|
|
|
|
+ if (beginTime.includes(' ')) return beginTime.split(' ')[1] || ''
|
|
|
|
|
+ }
|
|
|
|
|
+ return String(beginTime)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 详情展示:时间戳或日期时间转为可读时间 */
|
|
|
|
|
+const formatBeginTimeDetail = (beginTime: unknown): string => {
|
|
|
|
|
+ if (beginTime == null || beginTime === '') return '-'
|
|
|
|
|
+ if (typeof beginTime === 'number' || (typeof beginTime === 'string' && /^\d+$/.test(beginTime))) {
|
|
|
|
|
+ const d = new Date(Number(beginTime))
|
|
|
|
|
+ if (Number.isNaN(d.getTime())) return '-'
|
|
|
|
|
+ const pad = (n: number) => String(n).padStart(2, '0')
|
|
|
|
|
+ return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
|
|
|
|
|
+ }
|
|
|
|
|
+ if (typeof beginTime === 'string' && beginTime.includes(' ')) {
|
|
|
|
|
+ return beginTime.split(' ')[1] || '-'
|
|
|
|
|
+ }
|
|
|
|
|
+ return String(beginTime)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/** 打开弹窗 */
|
|
/** 打开弹窗 */
|
|
|
const open = async (id, detail) => {
|
|
const open = async (id, detail) => {
|
|
|
- dataForm.value.id=''
|
|
|
|
|
|
|
+ dataForm.value.id = ''
|
|
|
dialogVisible.value = true
|
|
dialogVisible.value = true
|
|
|
isDetail.value = detail
|
|
isDetail.value = detail
|
|
|
if (id) {
|
|
if (id) {
|
|
@@ -153,7 +209,11 @@ const open = async (id, detail) => {
|
|
|
dataForm.value = res
|
|
dataForm.value = res
|
|
|
await formatExtraItem()
|
|
await formatExtraItem()
|
|
|
dataForm.value.items = res.items?.length > 0 ? res.items : res.extraItems
|
|
dataForm.value.items = res.items?.length > 0 ? res.items : res.extraItems
|
|
|
- console.log('dataForm.value', dataForm.value)
|
|
|
|
|
|
|
+ dataForm.value.items?.forEach((item) => {
|
|
|
|
|
+ if (item.frequencyCategoryType === 1 && item.beginTime != null && item.beginTime !== '') {
|
|
|
|
|
+ item.beginTime = toTimePickerValue(item.beginTime)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
|
@@ -175,7 +235,7 @@ const formatExtraItem = async () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const handleClosed = () => {
|
|
const handleClosed = () => {
|
|
|
- dataForm.value = {...resetFormField}
|
|
|
|
|
|
|
+ dataForm.value = { ...resetFormField }
|
|
|
dialogVisible.value = false
|
|
dialogVisible.value = false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -185,17 +245,20 @@ const handleAdd = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const getItemList = (val) => {
|
|
const getItemList = (val) => {
|
|
|
|
|
+ console.log('val', val)
|
|
|
// 添加的内容放到护理项目中
|
|
// 添加的内容放到护理项目中
|
|
|
val.map((item) => {
|
|
val.map((item) => {
|
|
|
dataForm.value.items.push({
|
|
dataForm.value.items.push({
|
|
|
nurseItemId: item.id,
|
|
nurseItemId: item.id,
|
|
|
nurseItemName: item.itemName,
|
|
nurseItemName: item.itemName,
|
|
|
- frequency: 1,
|
|
|
|
|
- frequencyUnit: item.frequency,
|
|
|
|
|
- operatingMode: item.operatingMode,
|
|
|
|
|
|
|
+ frequencyType: item.frequencyType,
|
|
|
|
|
+ frequency: item.frequency,
|
|
|
|
|
+ frequencyCategory: item.frequencyCategory,
|
|
|
|
|
+ frequencyCategoryType: item.frequencyCategoryType,
|
|
|
checked: true,
|
|
checked: true,
|
|
|
price: item.price,
|
|
price: item.price,
|
|
|
- isExtra: item.type == 1 ? 1 : 0
|
|
|
|
|
|
|
+ isExtra: item.type == 1 ? 1 : 0,
|
|
|
|
|
+ beginTime: ''
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
@@ -216,20 +279,31 @@ const handleChangeCheckBox = (val, item) => {
|
|
|
|
|
|
|
|
const formRef = ref()
|
|
const formRef = ref()
|
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
|
|
|
|
+
|
|
|
const submitForm = async () => {
|
|
const submitForm = async () => {
|
|
|
// 校验表单
|
|
// 校验表单
|
|
|
if (!formRef.value) return
|
|
if (!formRef.value) return
|
|
|
const valid = await formRef.value.validate()
|
|
const valid = await formRef.value.validate()
|
|
|
if (!valid) return
|
|
if (!valid) return
|
|
|
|
|
+
|
|
|
|
|
+ const missingTime = dataForm.value.items.find(
|
|
|
|
|
+ (item) => item.checked && !item.beginTime && item.frequencyCategoryType == 1
|
|
|
|
|
+ )
|
|
|
|
|
+ if (missingTime) {
|
|
|
|
|
+ message.warning(`请先选择【${missingTime.nurseItemName}】的护理开始时间`)
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
formLoading.value = true
|
|
formLoading.value = true
|
|
|
- const params = {
|
|
|
|
|
- type: route.path.indexOf('medical-care-plan') > -1 ? 2 : 1, // 2:医疗护理 1 生活护理,
|
|
|
|
|
- ...dataForm.value,
|
|
|
|
|
- }
|
|
|
|
|
- const res = params.id
|
|
|
|
|
- ? await updateNursingPlan(params)
|
|
|
|
|
- : await createNursingPlan(params)
|
|
|
|
|
|
|
+ let params = JSON.parse(JSON.stringify(dataForm.value))
|
|
|
|
|
+ ;(params.type = route.path.indexOf('medical-care-plan') > -1 ? 2 : 1), // 2:医疗护理 1 生活护理,
|
|
|
|
|
+ params.items.forEach((item) => {
|
|
|
|
|
+ if (item.frequencyCategoryType == 1 && item.beginTime) {
|
|
|
|
|
+ item.beginTime = new Date(`${params.effectiveDate} ${item.beginTime}`).getTime()
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ const res = params.id ? await updateNursingPlan(params) : await createNursingPlan(params)
|
|
|
if (res) {
|
|
if (res) {
|
|
|
message.success(t('common.updateSuccess'))
|
|
message.success(t('common.updateSuccess'))
|
|
|
handleClosed()
|
|
handleClosed()
|
|
@@ -252,11 +326,27 @@ const submitForm = async () => {
|
|
|
.itemName {
|
|
.itemName {
|
|
|
line-height: 30px;
|
|
line-height: 30px;
|
|
|
}
|
|
}
|
|
|
- .border {
|
|
|
|
|
|
|
+ .item-left {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ min-height: 32px;
|
|
|
padding: 1px 11px;
|
|
padding: 1px 11px;
|
|
|
|
|
+ flex: 1;
|
|
|
box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
|
|
box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset;
|
|
|
border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
|
|
border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
|
|
|
}
|
|
}
|
|
|
|
|
+ .item-time {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .time-label {
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
|
|
+ }
|
|
|
|
|
+ .detail-time {
|
|
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
|
|
+ }
|
|
|
.border-warning {
|
|
.border-warning {
|
|
|
border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
|
|
border-radius: var(--el-input-border-radius, var(--el-border-radius-base));
|
|
|
box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-color-warning)) inset;
|
|
box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-color-warning)) inset;
|