Files
xk-doctor-wx/subPackages/sub_workbench/prescription_v2/components/ChineseMedicineConfig.vue

372 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="chinese-medicine-config">
<!-- 制剂方式 -->
<view class="config-section m-b-32">
<view class="section-title m-b-16">
<d-text text="制剂方式" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="section-content">
<view class="modern-pill-group">
<view
class="modern-pill"
:class="{ active: localConfig.ruleType === 1 }"
@click="handleRuleTypeChange(1)"
>
自制剂
</view>
<view
class="modern-pill"
:class="{ active: localConfig.ruleType === 2 }"
@click="handleRuleTypeChange(2)"
>
委托调剂
</view>
</view>
</view>
</view>
<!-- 自制剂配置 -->
<view class="config-section border-t-dashed pt-32 m-b-32" v-if="localConfig.ruleType === 1">
<view class="section-title m-b-16">
<d-text text="包法选择" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="section-content">
<view class="modern-pill-group">
<view
v-for="item in packageMethodList"
:key="item.id"
class="modern-pill outline"
:class="{ active: localConfig.packageMethodId === item.id }"
@click="handlePackageMethodTagClick(item)"
>
{{ item.name }}
</view>
</view>
</view>
</view>
<!-- 委托调剂配置 -->
<view class="config-section border-t-dashed pt-32" v-if="localConfig.ruleType === 2">
<view class="section-title m-b-16">
<d-text text="制剂要求" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="section-content m-b-24">
<view class="modern-pill-group">
<view
v-for="item in processRuleList"
:key="item.id"
class="modern-pill outline"
:class="{ active: localConfig.processRuleId === item.id }"
@click="handleProcessRuleTagClick(item)"
>
{{ item.name }}
</view>
</view>
</view>
<view class="section-title m-b-16 m-t-24">
<d-text text="煎法说明" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="section-content m-b-24">
<view class="modern-pill-group">
<view
v-for="item in childProcessRuleList"
:key="item.id"
class="modern-pill outline"
:class="{ active: localConfig.childProcessRuleId === item.id }"
@click="handleChildProcessRuleTagClick(item)"
>
{{ item.name }}
</view>
</view>
</view>
<view class="section-title m-b-16 m-t-24">
<d-text text="附加备注" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="section-content m-b-32">
<view class="modern-pill-group">
<view
v-for="item in processRuleNoteList"
:key="item.id"
class="modern-pill outline"
:class="{ active: localConfig.processRuleNoteId === item.id }"
@click="handleProcessRuleNoteTagClick(item)"
>
{{ item.note || item.name }}
</view>
</view>
</view>
</view>
<!-- 用量和频次 WesternUsageModal 保持一致的表单布局 -->
<view class="config-form border-t-dashed pt-20">
<view class="form-item flex-row flex-jus-sp flex-ali-center p-y-24">
<view class="item-label">
<d-text text="剂数" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="item-content flex-row flex-ali-center">
<u-number-box
v-model="localConfig.dosage"
:min="1"
:input-width="80"
:input-height="60"
bg-color="#F7F8FA"
/>
<d-text text="剂(天)" className="fs-28 color-sub m-l-16"></d-text>
</view>
</view>
<view class="form-item flex-row flex-jus-sp flex-ali-center p-y-24">
<view class="item-label">
<d-text text="用药频次" className="fs-30 font-bold color-title"></d-text>
</view>
<view class="item-content flex-row flex-ali-center">
<u-number-box
v-model="localConfig.dayDosage"
:min="1"
:input-width="80"
:input-height="60"
bg-color="#F7F8FA"
/>
<d-text text="次/天" className="fs-28 color-sub m-l-16"></d-text>
</view>
</view>
</view>
</view>
</template>
<script>
// 保留原有逻辑
export default {
name: 'ChineseMedicineConfig',
props: {
/**
* 中药配置
*/
config: {
type: Object,
default: () => ({
ruleType: 1,
packageMethodId: null,
processRuleId: null,
childProcessRuleId: null,
processRuleNoteId: null,
dosage: 7,
dayDosage: 2
})
},
/**
* 制剂列表
*/
processRuleList: {
type: Array,
default: () => []
},
/**
* 煎法列表
*/
childProcessRuleList: {
type: Array,
default: () => []
},
/**
* 备注列表
*/
processRuleNoteList: {
type: Array,
default: () => []
}
},
data() {
return {
localConfig: {},
packageMethodList: [
{ id: 1, name: '味包' },
{ id: 2, name: '剂包' }
]
};
},
watch: {
config: {
handler(newVal) {
this.localConfig = { ...newVal };
},
immediate: true,
deep: true
},
localConfig: {
handler(newVal) {
this.$emit('update:config', { ...newVal });
},
deep: true
}
},
methods: {
/**
* 处理制剂方式改变
* @param {number} value - 制剂方式1=自制剂2=委托调剂
* 职责:更新制剂方式,触发配置更新
*/
handleRuleTypeChange(value) {
this.localConfig.ruleType = value;
// 切换时清空相关配置
if (value === 1) {
// 自制剂:清空委托调剂相关配置,默认选择第一个包法
this.localConfig.processRuleId = null;
this.localConfig.childProcessRuleId = null;
this.localConfig.processRuleNoteId = null;
// 如果包法未选择,默认选择第一个
if (!this.localConfig.packageMethodId && this.packageMethodList.length > 0) {
this.localConfig.packageMethodId = this.packageMethodList[0].id;
}
} else {
// 委托调剂:清空自制剂相关配置
this.localConfig.packageMethodId = null;
}
},
/**
* 处理包法改变(标签点击)
* @param {Object} item - 包法项
* 职责更新包法ID
*/
handlePackageMethodTagClick(item) {
this.localConfig.packageMethodId = item.id;
},
/**
* 处理制剂改变(标签点击)
* @param {Object} item - 制剂项
* 职责更新制剂ID触发加载煎法列表
*/
handleProcessRuleTagClick(item) {
// 清空煎法和备注ID级联清空
this.localConfig.processRuleId = item.id;
this.localConfig.childProcessRuleId = null;
this.localConfig.processRuleNoteId = null;
// localConfig 的变化会通过 watch 自动触发 @update:config
},
/**
* 处理煎法改变(标签点击)
* @param {Object} item - 煎法项
* 职责更新煎法ID触发加载备注列表
*/
handleChildProcessRuleTagClick(item) {
// 清空备注ID级联清空
this.localConfig.childProcessRuleId = item.id;
this.localConfig.processRuleNoteId = null;
// localConfig 的变化会通过 watch 自动触发 @update:config
},
/**
* 处理备注改变(标签点击)
* @param {Object} item - 备注项
* 职责更新备注ID
*/
handleProcessRuleNoteTagClick(item) {
this.localConfig.processRuleNoteId = item.id;
},
/**
* 获取包法名称
* @returns {string} 包法名称
*/
getPackageMethodName() {
const item = this.packageMethodList.find(item => item.id === this.localConfig.packageMethodId);
return item?.name || '';
},
/**
* 获取制剂名称
* @returns {string} 制剂名称
*/
getProcessRuleName() {
const item = this.processRuleList.find(item => item.id === this.localConfig.processRuleId);
return item?.name || '';
},
/**
* 获取煎法名称
* @returns {string} 煎法名称
*/
getChildProcessRuleName() {
const item = this.childProcessRuleList.find(item => item.id === this.localConfig.childProcessRuleId);
return item?.name || '';
},
/**
* 获取备注名称
* @returns {string} 备注名称
*/
getProcessRuleNoteName() {
const item = this.processRuleNoteList.find(item => item.id === this.localConfig.processRuleNoteId);
return item?.name || '';
}
}
};
</script>
<style lang="scss" scoped>
/* 统一样式 */
.color-title { color: #2A2E35; }
.color-sub { color: #8A92A3; }
.fs-28 { font-size: 28rpx; }
.fs-30 { font-size: 30rpx; }
.font-bold { font-weight: bold; }
.m-b-16 { margin-bottom: 16rpx; }
.m-b-24 { margin-bottom: 24rpx; }
.m-b-32 { margin-bottom: 32rpx; }
.m-t-24 { margin-top: 24rpx; }
.m-l-16 { margin-left: 16rpx; }
.pt-20 { padding-top: 20rpx; }
.pt-32 { padding-top: 32rpx; }
.p-y-24 { padding: 24rpx 0; }
.border-t-dashed { border-top: 1px dashed #E2E8F0; }
.flex-row { display: flex; flex-direction: row; }
.flex-jus-sp { justify-content: space-between; }
.flex-ali-center { align-items: center; }
.chinese-medicine-config {
display: flex;
flex-direction: column;
}
.modern-pill-group {
display: flex;
gap: 16rpx;
flex-wrap: wrap;
}
.modern-pill {
padding: 12rpx 36rpx;
background-color: #F4F6F8;
color: #6C7380;
border-radius: 40rpx;
font-size: 26rpx;
text-align: center;
cursor: pointer;
border: 1px solid transparent;
transition: all 0.2s;
&.active {
background-color: #00A88A;
color: #fff;
border-color: #00A88A;
font-weight: bold;
}
&.outline {
background-color: #fff;
border: 1px solid #E2E8F0;
&.active {
background-color: #E8F6F4;
color: #00A88A;
border-color: #00A88A;
}
}
}
</style>