Inspect.vue 10.3 KB
<template>
    <div>
        <div class="label-title mt-2">{{ diseaseType === 1 ? '辅助检查' : '其他检查' }}</div>
        <van-field
            v-model="form.auxiliaryExaminationName"
            isLink
            readonly
            placeholder="请选择"
            @click="showAuxiliaryExamination = true"
            class="form-input"
        />
        <van-popup v-model:show="showAuxiliaryExamination" position="bottom">
            <div class="p-4" style="height: 100%">
                <div class="flex justify-between items-center mb-4 pop-title">
                    <div class="greyColor" @click="showAuxiliaryExamination = false">取消</div>
                    <div>辅助检查(可多选)</div>
                    <div class="blueColor" @click="auxiliaryConfirm">确定</div>
                </div>
                <div style="height: 80%; overflow: auto">
                    <CheckBtn
                        multiple
                        column-2
                        :options="dictList"
                        v-model:value="form.auxiliaryExamination"
                        :fieldNames="{ text: 'name', value: 'value' }"
                    />
                </div>
            </div>
        </van-popup>
        <div v-for="x in viewData" :key="x.insType" class="bg-fa mt-2">
            <div class="label-title" required style="color: #262626; font-size: 14px">{{ x.insName }}</div>
            <template v-for="y in x.items" :key="y.itemCode" v-if="x.insType !== 99">
                <van-field
                    :label="getItemName(y)"
                    v-model="y.itemValue"
                    :rules="getRule(y)"
                    placeholder="请输入"
                    class="card-input mt-2"
                    v-if="y.itemType === 1"
                >
                    <template #extra v-if="y.unit">
                        <span class="ml-1">{{ y.unit }}</span>
                    </template>
                </van-field>
                <van-field
                    :label="getItemName(y)"
                    is-link
                    :modelValue="y.itemValue"
                    :rules="getRule(y)"
                    readonly
                    placeholder="请选择或录入"
                    @click="setSelectOption(y, y.itemType)"
                    class="card-input mt-2"
                    v-if="y.itemType === 4"
                >
                    <template #extra v-if="y.unit">
                        <span class="ml-1">{{ y.unit }}</span>
                    </template>
                </van-field>
            </template>
            <template v-for="y in x.items" :key="y.itemCode" v-if="x.insType === 99">
                <div style="background-color: #fff; padding: 8px; border-radius: 8px">
                    <div class="label-title">检查结果</div>
                    <van-field style="padding: 0">
                        <template #input>
                            <van-radio-group
                                v-model="y.itemValue"
                                shape="dot"
                                direction="horizontal"
                                class="w-full doc-radio-group"
                            >
                                <van-radio
                                    v-for="item in store.getDict('CP00157')"
                                    :key="item.value"
                                    :name="item.value"
                                    label-position="left"
                                >
                                    {{ item.name }}
                                </van-radio>
                            </van-radio-group>
                        </template>
                    </van-field>
                    <van-field
                        v-if="y.itemValue === 2"
                        v-model="y.abnormalSituation"
                        placeholder="异常情况"
                        class="form-input mt-2"
                    />
                </div>
                <div style="background-color: #fff; padding: 8px; border-radius: 8px" class="mt-2">
                    <div class="label-title">影像报告</div>
                    <DocImageUpload
                        description="温馨提示:请上传JPG、PNG格式图片,文件大小不超过10M"
                        lengthMessage="抱歉,最多可上传8个文件。"
                        :imageData="y.picturesList" 
                        @change="(ids, option) => y.img = ids"
                        :maxLength="8">
                    </DocImageUpload>
                </div>
            </template>
        </div>
        <InputSelect
            v-model:show="selectOption.show4"
            :dict="selectOption.dict"
            @change="onSelectInputConfirm">
        </InputSelect>
    </div>
</template>
<script>
import { useStore } from '@/doctor/store'
import { getInspectCode } from '@/api/doctor/separateFU'
import CheckBtn from '@/doctor/components/checkBtn/CheckBtn.vue'
import InputSelect from '@/doctor/diagnose/common/InputSelect.vue'
import DocImageUpload from '@/doctor/components/docImageUpload/DocImageUpload.vue'
export default {
    components: { CheckBtn, InputSelect, DocImageUpload },
    props: {
        form: {
            type: Object,
            default: () => {}
        },
        diseaseInfo: {
            type: Object,
            default: () => {}
        }
    },
    data() {
        return {
            store: useStore(),
            showAuxiliaryExamination: false,
            inspectList: [],
            viewData: [],
            selectOption: {
                show4: false,
                item: {},
                dict: []
            }
        }
    },
    computed: {
        diseaseType() {
            return this.diseaseInfo.diseaseType
        },
        dictList() {
            if (this.diseaseInfo.diseaseType === 1) return this.store.getDict('CP00073')
            if (this.diseaseInfo.diseaseType === 2) return this.store.getDict('CP00074')
        }
    },
    created() {
        this.getCode()
    },
    methods: {
        auxiliaryConfirm() {
            let list = []
            this.dictList.forEach(item => {
                let selected = this.form.auxiliaryExamination.filter(e => e === item.value)
                if (selected && selected.length) {
                    list.push(item.name)
                }
            })
            this.form.auxiliaryExaminationName = list.join()
            this.showAuxiliaryExamination = false

            let inspectList = []
            this.form.auxiliaryExamination.forEach(item => {
                const items = this.inspectList.filter(e => e.insType === item)
                inspectList.push({
                    insType: items[0].insType,
                    insName: items[0].insName,
                    items: [...items]
                })
            })
            this.viewData = inspectList
        },

        getCode() {
            getInspectCode(1).then(res => {
                // this.inspectList = res.data
                let list = res.data.filter(item => !(item.insType === 4 && item.itemCode === 'BUN'))
                this.inspectList = [
                    ...list,
                    {
                        configType: 2,
                        insType: 99,
                        insName: '心电图',
                        itemCode: '99-1',
                        itemName: null,
                        itemType: 2
                    },
                    {
                        configType: 2,
                        insType: 34,
                        insName: '并发症检查',
                        itemCode: '34-1',
                        itemName: null,
                        itemType: 1
                    }
                ]
                console.log(666, this.inspectList)
            })
        },
        setSelectOption(item, itemType) {
            this.selectOption['show' + itemType] = true
            this.selectOption.item = item
            this.selectOption.dict = item.dictItemList
        },
        onSelectInputConfirm(option) {
            this.selectOption.item.itemValue = option.value
            this.selectOption.show4 = false
        },
        submit() {
            return new Promise((resolve, reject) => {
                let list = []
                this.viewData.forEach(x => {
                    x.items.forEach(y => {
                        list.push({
                            diseaseType: this.diseaseInfo.diseaseType,
                            dataType: y.configType,
                            insType: y.insType,
                            insName: y.insName,
                            itemCode: y.itemCode,
                            itemName: y.itemName,
                            itemType: y.itemType,
                            itemValue: y.itemValue,
                            abnormalSituation: y.abnormalSituation,
                            img: y.img,
                            unit: y.unit
                        })
                    })
                })
                resolve(list)
            })
        },
        getRule(item) {
            if (!item.pattern) {
                return [{ required: true, message: '请录入' }]
            }
            return [
                { required: true, message: '请录入' },
                { pattern: new RegExp(item.pattern), message: item.message }
            ]
        },
        getItemName(item) {
            if (!item.itemName) {
                return ''
            }
            return `${item.itemName}(${item.itemCode}) : `
        }
    }
}
</script>
<style lang="less" scoped>
.label-title {
    font-size: 13px;
    color: #595959;
    font-weight: 500;
    margin-bottom: 8px;
    &[required] {
        &::after {
            content: '*';
            color: #FF4D4F;
            font-weight: bold;
            margin-left: 4px;
        }
    }
}
.form-input {
    background-color: #FAFAFA;
    padding: 8px 12px;
    border-radius: 8px;
}
.pop-title {
    color: #262626;
    font-size: 16px;
    font-weight: 600;
}
.greyColor {
    color: var(--van-text-color-2);
    font-weight: 400;
}
.blueColor {
    color: #607FF0;
    font-weight: 500;
}
.bg-fa {
    background-color: #FAFAFA;
    padding: 8px;
    border-radius: 8px;
}
.card-input {
    padding: 8px 12px;
    border-radius: 8px;
}
</style>