Procházet zdrojové kódy

病史信息新增职业/工作地点字段,修复表单输入内容不同步的问题

- 职业改为原生选择器(对齐 get_case_select 返回的 profession 选项),工作地点改为必填文本输入(后台字段 work_address),移除占位的职业搜索接口调用
- uni-easyinput 组件缺少 Vue3 emits 声明,v-model 在当前 CLI 编译链下读写不可靠,全项目改为显式 :value + @input 绑定(history.vue、selfCenter/info.vue、historyDetail.vue)
- 修复天/月/年单位选择器不回显的问题(unitChange 补充回写 unitValue)
- get_case_select 新增的 career_type 字段不再污染选择器校验逻辑

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
wzz před 1 měsícem
rodič
revize
7c67320740

+ 5 - 0
src/components/uni-easyinput/uni-easyinput.vue

@@ -156,6 +156,11 @@
 						borderColor: '#e5e5e5'
 					}
 				}
+			},
+			// 强制显示的错误提示内容
+			errorMessage: {
+				type: [String, Boolean],
+				default: ''
 			}
 		},
 		data() {

+ 14 - 13
src/pages/selfCenter/info.vue

@@ -9,28 +9,28 @@
 				<!-- 基础表单校验 -->
 				<uni-forms ref="valiForm" :rules="rules" :modelValue="baseFormData">
 					<uni-forms-item label="姓名"  name="name" box-width="175rpx">
-						<uni-easyinput v-model="baseFormData.name" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
+						<uni-easyinput :value="baseFormData.name" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
 					</uni-forms-item>
 					<uni-forms-item label="电话"  name="phone" box-width="175rpx">
-						<uni-easyinput type="number" v-model="baseFormData.phone" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled/>
+						<uni-easyinput type="number" :value="baseFormData.phone" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled/>
 					</uni-forms-item>
 					<uni-forms-item label="性别"  box-width="175rpx">
-						<uni-data-checkbox v-model="baseFormData.sex" :localdata="selectData.sex" wrap="true" disabled/>
+						<uni-data-checkbox v-model="baseFormData.sex" :localdata="selectData.sex" :wrap="true" disabled/>
 					</uni-forms-item>
 					<uni-forms-item label="年龄"  name="age" box-width="175rpx">
-						<uni-easyinput type="number" v-model="baseFormData.age" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled  />
+						<uni-easyinput type="number" :value="baseFormData.age" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled  />
 					</uni-forms-item>
 					<uni-forms-item label="常住地"  name="address" box-width="175rpx">
-						<uni-easyinput v-model="baseFormData.address" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
+						<uni-easyinput :value="baseFormData.address" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
 					</uni-forms-item>
 					<uni-forms-item label="民族"  name="nation" box-width="175rpx">
 						<uni-data-select v-model="baseFormData.nation" disabled :localdata="selectData.nation" ></uni-data-select>
 					</uni-forms-item>
-					<uni-forms-item label="职业"  name="career" box-width="175rpx">
-						<uni-easyinput v-model="baseFormData.career" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
+					<uni-forms-item label="职业"  name="profession" box-width="175rpx">
+						<uni-data-select v-model="baseFormData.profession" disabled :localdata="selectData.profession"></uni-data-select>
 					</uni-forms-item>
-					<uni-forms-item label="工作地点"  name="workplace" box-width="175rpx">
-						<uni-easyinput v-model="baseFormData.workplace" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
+					<uni-forms-item label="工作地点"  name="work_address" box-width="175rpx">
+						<uni-easyinput :value="baseFormData.work_address" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" disabled />
 					</uni-forms-item>
 					<uni-forms-item label="学历"  name="education" box-width="175rpx">
 						<uni-data-select v-model="baseFormData.education" disabled :localdata="selectData.education"></uni-data-select>
@@ -42,10 +42,10 @@
 						<uni-data-select v-model="baseFormData.house" disabled :localdata="selectData.house"></uni-data-select>
 					</uni-forms-item>
 					<uni-forms-item label="耳鸣病程"  name="days" box-width="175rpx">
-						<uni-easyinput v-model="baseFormData.days" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" textUnit="天"  disabled />
+						<uni-easyinput :value="baseFormData.days" :styles="{fontSize:'14px',disableColor: '#f5f7fa', borderColor:'#e5e5e5'}" textUnit="天"  disabled />
 					</uni-forms-item>
 					<uni-forms-item label="惯用手"  box-width="175rpx">
-						<uni-data-checkbox v-model="baseFormData.common_hand" disabled :localdata="selectData.hand" wrap="true"/>
+						<uni-data-checkbox v-model="baseFormData.common_hand" disabled :localdata="selectData.hand" :wrap="true"/>
 					</uni-forms-item>
 					<uni-forms-item label="就诊类型"  name="type" box-width="175rpx">
 						<uni-data-select v-model="baseFormData.type" disabled :localdata="selectData.type"></uni-data-select>
@@ -74,8 +74,8 @@ export default {
 			age: "18",
 			birth_year: "0",
 			birthday: "0",
-			career: "",
-			workplace: "",
+			profession: 1,
+			work_address: "",
 			code: "",
 			common_hand: 2,
 			create_time: "0",
@@ -116,6 +116,7 @@ export default {
 			this.baseFormData.hospital_id = Number(this.baseFormData.hospital_id);
 			this.baseFormData.marriage = Number(this.baseFormData.marriage);
 			this.baseFormData.nation = Number(this.baseFormData.nation);
+			this.baseFormData.profession = Number(this.baseFormData.profession);
 			this.baseFormData.type = Number(this.baseFormData.type);
 			this.baseFormData.house = Number(this.baseFormData.house);
 			this.getUserSelect();

+ 49 - 83
src/pages/sickForm/history.vue

@@ -11,19 +11,19 @@
 				<!-- 基础表单校验 -->
 				<uni-forms ref="valiForm" :rules="rules" :modelValue="baseFormData">
 					<uni-forms-item label="姓名" required name="name" box-width="190rpx">
-						<uni-easyinput v-model="baseFormData.name" placeholder="请输入" />
+						<uni-easyinput :value="baseFormData.name" @input="baseFormData.name = $event" placeholder="请输入" />
 					</uni-forms-item>
 					<uni-forms-item label="电话" required name="phone" box-width="190rpx">
-						<uni-easyinput type="number" v-model="baseFormData.phone" placeholder="请输入" />
+						<uni-easyinput type="number" :value="baseFormData.phone" @input="baseFormData.phone = $event" placeholder="请输入" />
 					</uni-forms-item>
 					<uni-forms-item label="性别" required name="sex" box-width="190rpx">
-						<uni-data-checkbox v-model="baseFormData.sex" :localdata="selectData.sex" @change="change('sex',$event)" wrap="true"/>
+						<uni-data-checkbox v-model="baseFormData.sex" :localdata="selectData.sex" @change="change('sex',$event)" :wrap="true"/>
 					</uni-forms-item>
 					<uni-forms-item label="年龄" name="age" box-width="190rpx">
-						<uni-easyinput type="number" v-model="baseFormData.age" placeholder="请输入" />
+						<uni-easyinput type="number" :value="baseFormData.age" @input="baseFormData.age = $event" placeholder="请输入" />
 					</uni-forms-item>
 					<uni-forms-item label="常住地" required name="address" box-width="190rpx">
-						<uni-easyinput v-model="baseFormData.address" placeholder="请输入" />
+						<uni-easyinput :value="baseFormData.address" @input="baseFormData.address = $event" placeholder="请输入" />
 					</uni-forms-item>
 					<uni-forms-item label="民族" required name="nation" box-width="190rpx">
 						<picker @change="change('nation',$event)" :value="pickerIndexObj.nation" :range="selectData.nation" range-key="text">
@@ -31,17 +31,14 @@
 						</picker>
 					</uni-forms-item>
 
-					<uni-forms-item label="职业" name="career" box-width="190rpx">
-						<view class="career-search">
-							<uni-easyinput v-model="careerKeyword" placeholder="请输入查询后选择" @input="onCareerInput" />
-							<view class="career-suggest" v-if="careerSuggestList.length">
-								<view class="career-suggest-item" v-for="(item, idx) in careerSuggestList" :key="idx" @click="pickCareer(item)">{{ item.name }}</view>
-							</view>
-						</view>
+					<uni-forms-item label="职业" required name="profession" box-width="190rpx">
+						<picker @change="change('profession',$event)" :value="pickerIndexObj.profession" :range="selectData.profession" range-key="text">
+							<view class="picker-class-box">{{pickerText(selectData.profession, pickerIndexObj.profession)}}</view>
+						</picker>
 					</uni-forms-item>
 
-					<uni-forms-item label="工作地点" name="workplace" box-width="190rpx">
-						<uni-easyinput v-model="baseFormData.workplace" placeholder="如为教师请选择" />
+					<uni-forms-item label="工作地点" required name="work_address" box-width="190rpx">
+						<uni-easyinput :value="baseFormData.work_address" @input="baseFormData.work_address = $event" placeholder="请输入" />
 					</uni-forms-item>
 
 					<uni-forms-item label="学历" required name="education" box-width="190rpx">
@@ -61,12 +58,12 @@
 					</uni-forms-item>
 					<uni-forms-item label="耳鸣病程" required name="days" box-width="190rpx">
 						<view class="display-between">
-							<uni-easyinput v-model="baseFormData.days" placeholder="请输入" type="number" widthStyle="160rpx" />
-							<uni-data-checkbox v-model="unitValue" :localdata="unitList" @change="unitChange($event)" wrap="true"/>
+							<uni-easyinput :value="baseFormData.days" @input="baseFormData.days = $event" placeholder="请输入" type="number" widthStyle="160rpx" />
+							<uni-data-checkbox v-model="unitValue" :localdata="unitList" @change="unitChange($event)" :wrap="true"/>
 						</view>
 					</uni-forms-item>
 					<uni-forms-item label="惯用手" required name="common_hand" box-width="190rpx">
-						<uni-data-checkbox v-model="baseFormData.common_hand" :localdata="selectData.hand" @change="change('hand',$event)" wrap="true"/>
+						<uni-data-checkbox v-model="baseFormData.common_hand" :localdata="selectData.hand" @change="change('hand',$event)" :wrap="true"/>
 					</uni-forms-item>
 					<uni-forms-item label="就诊类型" required name="type" box-width="190rpx">
 						<picker @change="change('type',$event)" :value="pickerIndexObj.type" :range="selectData.type" range-key="text">
@@ -84,7 +81,7 @@
 						</picker>
 					</uni-forms-item>
 					<uni-forms-item label="ID号"  name="code" box-width="190rpx">
-						<uni-easyinput v-model="baseFormData.code" placeholder="请输入"/>
+						<uni-easyinput :value="baseFormData.code" @input="baseFormData.code = $event" placeholder="请输入"/>
 					</uni-forms-item>
 				</uni-forms>
 				<button class="footer-btn" @click="submit('valiForm')">提交</button>
@@ -144,6 +141,12 @@ export default {
 					errorMessage: '请选择惯用手'
 				}]
 			},
+			work_address: {
+				rules: [{
+					required: true,
+					errorMessage: '请输入工作地点'
+				}]
+			},
 		},
 		// 基础表单数据
 		baseFormData: {
@@ -151,9 +154,8 @@ export default {
 			age: "",
 			birth_year: "0",
 			birthday: "0",
-			career: "",
-			career_type:1,
-			workplace: "",
+			profession: 1,
+			work_address: "",
 			code: "",
 			common_hand: 2,
 			create_time: "0",
@@ -176,7 +178,7 @@ export default {
 			weixin_user_id: "1",
 		},
 		pickerIndexObj:{
-			career_type : 1,
+			profession: -1,
 			nation: -1,
 			education: -1,
 			marriage: -1,
@@ -188,6 +190,7 @@ export default {
 		selectData:{
 			sex: [],
 			hand: [],
+			profession: [],
 			nation: [],
 			education: [],
 			marriage: [],
@@ -196,8 +199,6 @@ export default {
 			hospital: [],
 		},
 		doctorRange: [],
-		careerKeyword: '',
-		careerSuggestList: [],
         isAuth: true,
 		pageId:1,
         date: currentDate,
@@ -253,26 +254,11 @@ export default {
 			});
 			return paramObj;
 	  },
-	// TODO: 职业搜索接口待后台确认,当前 method/action/字段均为占位,先按输入关键字返回匹配列表实现
-	async onCareerInput(value) {
-		this.careerKeyword = value
-		if (!value) {
-			this.careerSuggestList = []
-			return
-		}
-		const res = await request('user', 'career_search', { keyword: value })
-		this.careerSuggestList = res.code === 200 ? (res.data || []) : []
-	},
-	pickCareer(item) {
-		this.baseFormData.career = item.name
-		this.careerKeyword = item.name
-		this.careerSuggestList = []
-	},
 	validatePikcer(){
 		let pickerObj = this.pickerIndexObj , pickerArr = [];
 		let language = {
 			'nation':'民族',
-			'career_type':'职业类型',
+			'profession':'职业',
 			'education':'学历',
 			'marriage':'婚姻',
 			'house':'居住情况',
@@ -282,20 +268,13 @@ export default {
 		}
 		for(let k in pickerObj) {
 			if(pickerObj[k] === -1){
-				if (language[k] != '职业类型')
-				{
-					uni.showToast({
-						title:'请选择' + language[k],
-						mask:true,
-						icon:"error",
-						duration:2000
-					})
-					break;
-				}
-				else{
-					this.pickerIndexObj.career_type = 1;
-				}
-
+				uni.showToast({
+					title:'请选择' + language[k],
+					mask:true,
+					icon:"error",
+					duration:2000
+				})
+				break;
 			}
 		}
 		for(let k in pickerObj) {
@@ -336,6 +315,7 @@ export default {
 		return resultId;
 	},
 	  unitChange(e){
+		 this.unitValue = e.detail.value;
 		 this.unitSubmit = e.detail.value;
 	  },
 	  change(types,e) {
@@ -355,9 +335,9 @@ export default {
 			value = Number(e.detail.value);
 			that.baseFormData.education = that.getPostId(tpyeVal,value);
 			break;
-			case 'career_type' :
+			case 'profession' :
 			value = Number(e.detail.value);
-			that.baseFormData.career_type = that.getPostId(tpyeVal,value);
+			that.baseFormData.profession = that.getPostId(tpyeVal,value);
 			break;
 			case 'hand' :
 			value = e.detail.value;
@@ -392,7 +372,8 @@ export default {
 		  return (arr && arr[idx]) ? arr[idx].text : ''
 	  },
 	  pickerEchoShow(dataArr,dataId,typeName){
-		  if(typeName === 'sex' || typeName === 'hand'){
+		  // sex/hand 是复选组件自己处理回显;career_type(工作性质)后台会返回但表单目前没有对应字段,跳过避免污染 pickerIndexObj
+		  if(typeName === 'sex' || typeName === 'hand' || typeName === 'career_type'){
 			   return
 		  }else {
 			 let rangeArr = dataArr, selectedId = dataId;
@@ -416,7 +397,7 @@ export default {
 				this.baseFormData.doctor_id = Number(this.baseFormData.doctor_id);
 				this.baseFormData.doctor = this.baseFormData.doctor_id
 			}
-			this.baseFormData.career_type = Number(this.baseFormData.career_type);
+			this.baseFormData.profession = Number(this.baseFormData.profession);
 			this.baseFormData.education = Number(this.baseFormData.education);
 			this.baseFormData.marriage = Number(this.baseFormData.marriage);
 			this.baseFormData.nation = Number(this.baseFormData.nation);
@@ -428,11 +409,16 @@ export default {
 	     const res = await request('user', 'get_case_info', { openId: currentOpenId(), doctor_id: docId || 0 })
 	     if (res.code === 200) {
             this.baseFormData = res.data;
-			this.careerKeyword = this.baseFormData.career || ''
+			// 后台没填过职业时存的是字符串 "0"(跟 age/sex 是同一套"0 代表未填"的约定),
+			// "0" 在 JS 里是真值不会被 !this.baseFormData.profession 判断到,要单独处理
+			if (!this.baseFormData.profession || this.baseFormData.profession == '0') this.baseFormData.profession = 1
+			// 老病历记录没有工作地点字段时后台返回 null,uni-easyinput 绑定 null 初始值会导致输入内容同步不到 baseFormData,提前归一化成空字符串
+			if (this.baseFormData.work_address == null || this.baseFormData.work_address == undefined) this.baseFormData.work_address = ''
 			this.unitValue = this.baseFormData.days.substr(-1);
 			this.baseFormData.days = this.baseFormData.days.substr(0,(this.baseFormData.days.length-1))
-			this.makeFromData(docId,hosId)
 	     }
+		 // 不管是否已有历史病历,选项列表(民族/职业/学历...)都要加载,否则新用户第一次填表时全部选择项空白
+		 this.makeFromData(docId,hosId)
 	   },
 	  async getUserSelect() {
 		 const res = await request('user', 'get_case_select', { openId: currentOpenId() })
@@ -441,7 +427,7 @@ export default {
 			 for(let key in pickerArr){
 				 this.pickerEchoShow(pickerArr[key],this.baseFormData[key],key)
 			 }
-			 this.selectData = pickerArr;
+			 this.selectData = Object.assign({}, this.selectData, pickerArr);
 			 this.getDoctor(this.baseFormData.hospital_id)
 	     }
 	   },
@@ -459,6 +445,8 @@ export default {
 			uni.navigateTo({
 			  url:"/pages/sickForm/blurb?finish=" + this.isFinish
 			});
+	     } else {
+			console.error('update_case_info failed', res)
 	     }
 	   },
 	  objToArr(obj){
@@ -522,26 +510,4 @@ export default {
 	align-items: center;
 	font-size: 36rpx;
 }
-.career-search {
-	position: relative;
-	width: 100%;
-}
-.career-suggest {
-	position: absolute;
-	top: 70rpx;
-	left: 0;
-	right: 0;
-	background: #fff;
-	box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.1);
-	border-radius: 8rpx;
-	z-index: 10;
-	max-height: 320rpx;
-	overflow-y: auto;
-}
-.career-suggest-item {
-	padding: 16rpx 20rpx;
-	font-size: 26rpx;
-	color: #333;
-	border-bottom: 1px solid #f0f0f0;
-}
 </style>

+ 3 - 2
src/pages/sickForm/historyDetail.vue

@@ -13,8 +13,8 @@
 					</uni-forms-item>
 					<uni-forms-item label="( 1 ) 头痛的时间" isBold="bold"  v-if="item.id == 205" >
 						<view class="display-between" style="width:350rpx">
-							<uni-easyinput v-model="headache"  type="number" widthStyle="160rpx" />
-							<uni-data-checkbox v-model="unitValue" :localdata="unitList" @change="unitChange($event)" wrap="true" />
+							<uni-easyinput :value="headache" @input="headache = $event"  type="number" widthStyle="160rpx" />
+							<uni-data-checkbox v-model="unitValue" :localdata="unitList" @change="unitChange($event)" :wrap="true" />
 						</view>
 					</uni-forms-item>
 				</view>
@@ -67,6 +67,7 @@ export default {
 		return !!(item && item.isShow)
 	},
 	unitChange(e){
+			 this.unitValue = e.detail.value;
 			 this.unitSubmit = e.detail.value;
 	},
 	percentCalc(child,value){