刘拾玖 4 mēneši atpakaļ
vecāks
revīzija
29df4f16db

+ 7 - 25
lib/link.ts

@@ -61,30 +61,12 @@ export const login = () => {
 		url: url,
 	})
 }
-// 地址列表
-export const goAddressList = (hzid, ptwybh = null) => {
-    let url = `/pages/address/index?hzid=${hzid}`;
-    if (ptwybh) {
-        url += `&ptwybh=${ptwybh}`;
-    }
-    navto(url);
-}
-// 新增地址
-export const addAddress = (hzid, shrxxid = null, defaulted = null) => {
-    let url = `/pages/address/add?hzid=${hzid}`;
-    if (shrxxid) {
-        url += `&shrxxid=${shrxxid}&defaulted=${defaulted}`;
-    }
-    navto(url);
-}
-
 
-
-// 处方列表
-export const goCFList = (hzsfzh,hzxm) => {
-	navto('/pages/cfList/index?hzsfzh='+ hzsfzh + '&hzxm=' + hzxm)
-}
-// 处方详情
-export const goCFDetails = (ptwybh,hzsfzh,hzxm) => {
-	navto('/pages/index/index?ptwybh='+ ptwybh + '&hzsfzh=' + hzsfzh + '&hzxm=' + hzxm)
+// 办件详情
+export const goBJDetails = (id = null) => {
+	if (id){
+		navto('/pages/feedback/details?id=' + id)
+	}else {
+		navto('/pages/feedback/details')
+	}
 }

+ 9 - 80
lib/type.ts

@@ -1,83 +1,12 @@
-export interface AreaVO {
-	name : string,
-	code : number,
-	center ?: [number, number]
-}
-export interface CfStatusVO {
-    statusList:  any[];
-}
-
-export interface CfLogisticsVO {
-    cfList: any[];
-}
-
-
-interface Patient {
-    hzxm: string;
-    zjhm: string;
-}
-
-interface Doctor {
-    nickname: string;
-}
-
-export interface RecipeContentVO {
-    yljgmc: string;        // 医疗机构名称
-    patient: Patient;      // 患者信息
-    yncfbh: string;        // 处方编号
-    detail: any[];         // 处方详情
-    cfts: string;          // 处方特色
-    fyfsyf: string;        // 用法用量
-    fyfslx: string;        // 处方类型
-    doctor: Doctor;        // 医生信息
-    createTime: string;    // 创建时间
-}
-
-export interface BasicInfoVO {
-    total: number;
-    list: any[];
-}
-
-export interface EvaluateVO {
-   zhpj: number; 
-   jyxg: number; 
-   kfys: number; 
-   jyzl: number; 
-   wlfw: number;
-   content: string;
-   image: string; 
-   anonymity: number;
-}
-
-export interface cfStatusVO {
-	createTime: Date,
-	icon: string,
-	isCur: boolean,
-	time: string,
-	title: string,
-}
-
-export interface EvaluateVO {
-	zhpj: number,
-	jyxg: number,
-	kfys: number,
-	jyzl: number,
-	wlfw: number,
-	image: string[],
-	content: string,
-	anonymity: number
-}
-
-export interface ConsigneeInfoVO {
-  shrxm: string;
-  shrsjh: string;
-  province: string;
-  city: string;
-  area: string;
-  shrdzxxdz: string;
-  hzid: string;
-  isDefaulted: boolean;
-  shrxxid: string;
+export interface feedbackVO {
+	djr: string;
+	lxdh: string;
+	yljgmc: string;
+	yljgdm: string;
+	fklx: string;
+	fkxq: string;
+	fkzt: string;
+	jd: []
 }
 
 

+ 9 - 111
lib/util.ts

@@ -218,125 +218,23 @@ export const maskName = (val) => {
 }
 
 /**
- * 匹配处方状态
- * @param 处方状态
- * @returns 状态信息
- */
-export function filterStateTitle(index) {
-	let dict_type = {
-		'00':'已开方',
-		'01':'已接收',
-		'02':'已确认',
-		'04':'已配方',
-		'05':'已浸泡',
-		'06':'已煎煮',
-		'07':'已包装',
-		'08':'已快递',
-		'09':'已发药',
-		'10':'已签收',
-	}
-	return dict_type[index]
-}
-
-/**
- * 匹配处方状态Icon
- * @param 处方状态
- * @returns 状态Icon
- */
-export function filterStateIcon(state) {
-	let dict_type = {
-		'00':'\ue69a',
-		'01':'\ue69a',
-		'02':'\ue690',
-		'04':'\ue688',
-		'05':'\ue691',
-		'06':'\ue694',
-		'07':'\ue693',
-		'08':'\ue689',
-		'09':'\ue68f',
-		'10':'\ue68f', 
-	}
-	return dict_type[state] || '\ue69a'
-}
-
-/**
- * 匹配物流状态
+ * 状态
  * @param 物流状态
  * @returns 状态信息
  */
-export function filterLogisticsTitle(index){
+export function filterApplicationStatus(index){
 	let dict_type = {
-		'2':'在途中',
-		'3':'派送中',
-		'4':'已签收',
-		'9':'签收失败',
+		'1':'待受理',
+		'2':'已受理',
+		'3':'已办结',
 	}
 	return dict_type[index]
 }
-
-/**
- * 服药方式
- */
-export function DictLabelFYFSYF(index){
-	let dict_type = {
-		'01':'内服',
-		'02':'外用',
-		'03':'开水冲服',
-		'04':'嚼服',
-		'05':'伴食服',
-		'06':'酒服',
-		'07':'外搽',
-		'08':'外敷',
-		'09':'熏洗',
-		'10':'熏蒸',
-		'11':'药浴',
-		'12':'滴鼻',
-		'13':'保留灌肠',
-		'14':'直肠灌注',
-		'15':'耳咽吹粉',
-		'16':'中医灌肠',
-	}
-	return dict_type[index]
-}
-
-/**
- * 发药方式
- */
-export function DictLabelFYFSLX(index){
-	let dict_type = {
-		'1':'现配现取',
-		'2':'代煎快递',
-		'3':'代煎不快递',
-		'4':'代配快递',
-		'5':'代配不快递',
-	}
-	return dict_type[index]
-}
-
-/**
- * 处方状态
- */
-export function DictLabelCFZT(index){
+export function filterApplicationBgColor(index){
 	let dict_type = {
-		'-2':'半退方',
-		'-1':'疑似半退方',
-		'00':'待处理',
-		'001':'已审方',
-		'002':'审方未通过',
-		'01':'已下载',
-		'02':'已确认',
-		'03':'确认未通过',
-		'05':'已配方',
-		'06':'已浸泡',
-		'07':'已煎煮',
-		'08':'已包装',
-		'09':'已快递',
-		'10':'已发车',
-		'11':'已签收',
-		'12':'饮片厂退回',
-		'13':'医疗机构退回',
-		'21':'稍后处理',
-		'99':'异常处方',
+		'1':'yellow',
+		'2':'blue',
+		'3':'green',
 	}
 	return dict_type[index]
 }

+ 1 - 1
manifest.json

@@ -71,7 +71,7 @@
     "vueVersion" : "3",
     "h5" : {
         "router" : {
-            "base" : "/ykb/",
+            "base" : "/ykz/",
             "mode" : "history"
         },
         "title" : "愉快办",

+ 7 - 23
pages.json

@@ -1,33 +1,17 @@
 {
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
-			"path": "pages/login/index",
+			"path": "pages/feedback/index",
 			"style": {
-				"navigationBarTitleText": "登录"
+				"navigationBarTitleText": "办件记录",
+				"navigationBarBackgroundColor": "#fff"
 			}
-		},
+		}, 
 		{
-			"path": "pages/address/index",
+			"path": "pages/feedback/details",
 			"style": {
-				"navigationBarTitleText": "我的地址"
-			}
-		},
-		{
-			"path": "pages/address/add",
-			"style": {
-				"navigationBarTitleText": "新增地址"
-			}
-		},
-		{
-			"path": "pages/cfList/index",
-			"style": {
-				"navigationBarTitleText": "中医用药一件事"
-			}
-		},
-		{
-			"path": "pages/index/index",
-			"style": {
-				"navigationBarTitleText": "移动便民查询"
+				"navigationBarTitleText": "中医用药一件事反馈登记",
+				"navigationBarBackgroundColor": "#fff"
 			}
 		}
 	],

+ 0 - 326
pages/address/PickerAddress.vue

@@ -1,326 +0,0 @@
-<template>
-	<view class="picker-address">
-		<uni-popup ref="popRef">
-			<view class="picker-address-content">
-				<view class="picker-address-top">
-					<view class="picker-address-action cancel" @click="onCancel">取消</view>
-					<view class="picker-address-action confirm" @click="onConfirm">确定</view>
-				</view>
-				<picker-view indicator-class='is-selected' :value="areaIndex" @change="onAreaChange">
-					<picker-view-column>
-						<view class="addr-item" :class="areaIndex[0] == index ?'selected':''"
-							v-for="(item, index) in areaList[0]" :key="index">
-							{{ item.name }}
-						</view>
-					</picker-view-column>
-					<picker-view-column>
-						<view class="addr-item" :class="areaIndex[1] == index ?'selected':''"
-							v-for="(item, index) in areaList[1]" :key="index">
-							{{ item.name }}
-						</view>
-					</picker-view-column>
-					<picker-view-column>
-						<view class="addr-item" :class="areaIndex[2] == index ?'selected':''"
-							v-for="(item, index) in areaList[2]" :key="index">
-							{{ item.name }}
-						</view>
-					</picker-view-column>
-				</picker-view>
-			</view>
-		</uni-popup>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, onMounted, computed, watch } from 'vue'
-	import dataTree from "@/static/json/pca-code.json"
-	
-	const emits = defineEmits(['change'])
-	const props = defineProps({
-		province: {
-			type: String,
-			default: ""
-		},
-		city: {
-			type: String,
-			default: ""
-		},
-		area: {
-			type: String,
-			default: ""
-		},
-	})
-	
-	 watch(
-	    () => props.province,
-	    () => {
-			if (props.province){
-				updateAreaIndex(props.province,props.city,props.area)
-			}
-	    }
-	  )
-	
-	const popRef = ref()
-	const areaList = ref([[], [], []])//todo类型
-	const areaIndex = ref([0, 0, 0])
-	
-
-	const provinceName = computed(() => {
-		return areaList.value[0][areaIndex.value[0]] ? areaList.value[0][areaIndex.value[0]]["name"] : '省';
-	})
-	const cityName = computed(() => {
-		return areaList.value[1][areaIndex.value[1]] ? areaList.value[1][areaIndex.value[1]]["name"] : '市';
-	})
-	const areaName = computed(() => {
-		return areaList.value[2][areaIndex.value[2]] ? areaList.value[2][areaIndex.value[2]]["name"] : '区';
-	})
-
-
-	const onCancel = ()=> {
-		popRef.value.close()
-	}
-
-	const onConfirm = async()=> {
-		const data = {
-			province:provinceName.value,
-			city:cityName.value,
-			area:areaName.value,
-		}
-		emits('change',data);
-		onCancel()
-	}
-
-	const onAreaChange = async (e) => {
-		const originalIndex = [...areaIndex.value];
-		console.log("原来", areaIndex.value)
-		areaIndex.value = e.detail.value
-		console.log("现在", areaIndex.value)
-		
-		if (originalIndex[0] !== areaIndex.value[0]) {
-			areaIndex.value[1] = 0
-			areaIndex.value[2] = 0
-			await initArea();
-		} else if (originalIndex[1] !== areaIndex.value[1]) {
-			areaIndex.value[2] = 0
-			await getCity();
-		}
-	}
-
-	const openPop = () => {
-		popRef.value.open('bottom')
-	}
-	
-	// 获取所有省
-	const getProvinces = (data) => { 
-		return data.map(province => ({ 
-			id: province.code, 
-			name: province.name ,
-		})); 
-	};
-	
-	// 匹配省里面的所有市
-	const getCitiesByProvinceIndex = (data, index) => {
-	    if (data[index] && data[index].children) {
-	        return data[index].children.map(city => ({
-	            id: city.code,
-	            name: city.name
-	        }));
-	    }
-	    return [];
-	};
-	// 匹配省里面的市的区
-	const getAreasByCityIndex = (data, provinceIndex, cityIndex) => {
-		if (data[provinceIndex] && data[provinceIndex].children &&
-			data[provinceIndex].children[cityIndex] && data[provinceIndex].children[cityIndex].children) {
-		return data[provinceIndex].children[cityIndex].children.map(area => ({
-				id: area.code,
-				name: area.name
-			}));
-		}
-		return [];
-	};
-
-
-
-	//初始化地址选择器
-	const initArea = async () => {
-		//获取省				
-		let result = getProvinces(dataTree)
-		console.log("省",result)
-		if (result == null) {
-			console.log("获取省出错");
-			return false;
-		} else {
-			areaList.value.splice(0, 1, result);
-			await getCity();
-		}
-	}
-	//获取市
-	const getCity = async () => {
-		let pid = areaIndex.value[0];
-
-		let result = getCitiesByProvinceIndex(dataTree, pid)
-		console.log("对应市",result)
-		if (result == null) {
-			console.log("获取市出错");
-			return false;
-		} else {
-			areaList.value.splice(1, 1, result);
-			await getArea();
-		}
-	}
-	//获取区
-	const getArea = async () => {
-		let pid = areaIndex.value[0];
-		let cid = areaIndex.value[1];
-		let result = getAreasByCityIndex(dataTree,pid,cid)
-		console.log("对应区",result)
-		if (result == null) {
-			console.log("获取区出错");
-			return false;
-		} else {
-			areaList.value.splice(2, 1, result);
-		}
-	}
-	
-	
-	const findIndexes = (dataTree, provinceName, cityName, areaName) => {
-	    let provinceIndex = 0;
-	    let cityIndex = 0;
-	    let areaIndex = 0;
-	    
-	    dataTree.some((province, pIndex) => {
-	        if (province.name === provinceName) {
-	            provinceIndex = pIndex;
-	            return province.children.some((city, cIndex) => {
-	                if (city.name === cityName) {
-	                    cityIndex = cIndex;
-	                    return city.children.some((area, aIndex) => {
-	                        if (area.name === areaName) {
-	                            areaIndex = aIndex;
-	                            return true;
-	                        }
-	                        return false;
-	                    });
-	                }
-	                return false;
-	            });
-	        }
-	        return false;
-	    });
-	
-	    return [provinceIndex, cityIndex, areaIndex];
-	}
-	
-	const updateAreaIndex = (provinceName, cityName, areaName) => {
-	    const indexes = findIndexes(dataTree, provinceName, cityName, areaName);
-	    areaIndex.value = indexes;
-	}
-
-	
-
-	onMounted(async () => {
-		if (props.province){
-			updateAreaIndex(props.province,props.city,props.area)
-		}
-		await initArea();
-		// getInfo()
-	})
-	defineExpose({ openPop })
-</script>
-
-<style lang="scss" scoped>
-	.picker-address {
-		.picker-address-content {
-			background-color: #fff;
-			border-radius: 16rpx 16rpx 0 0;
-
-			.picker-address-top {
-				height: 96rpx;
-				@include flex-between;
-				border-bottom: 1px solid $uni-border-color;
-
-				.picker-address-action {
-					font-size: $uni-font-size-xl;
-					line-height: $uni-line-height-xl;
-					@include flex;
-					padding: 0 32rpx;
-
-					&.cancel {
-						color: $uni-text-color !important;
-					}
-
-					&.confirm {
-						color: $uni-color-primary;
-					}
-				}
-			}
-
-			.addr-item {
-				height: 96rpx !important;
-				font-size: $uni-font-size-xl;
-				line-height: $uni-line-height-xl;
-				@include flex-center;
-
-				&.selected {
-					font-size: $uni-font-size-xxl;
-					line-height: $uni-line-height-xxl;
-				}
-			}
-		}
-
-		:deep(uni-picker-view) {
-			margin-top: 24rpx;
-		}
-
-		:deep(.is-selected) {
-			height: 96rpx !important;
-			color: $uni-text-color;
-			font-size: $uni-font-size-xxl;
-			line-height: $uni-line-height-xxl;
-		}
-
-		:deep(.uni-picker-view-wrapper) {
-			overflow: visible;
-
-			uni-picker-view-column {
-				overflow: visible;
-
-				&:first-child {
-					.is-selected {
-
-						&::before,
-						&::after {
-							left: -32rpx;
-						}
-					}
-				}
-
-				&:last-child {
-					.is-selected {
-
-						&::before,
-						&::after {
-							right: -32rpx;
-						}
-					}
-				}
-			}
-		}
-
-		:deep(.uni-picker-view-indicator:before) {
-			border-top-color: $uni-border-color;
-		}
-
-		:deep(.uni-picker-view-indicator:after) {
-			border-bottom-color: $uni-border-color;
-		}
-	}
-
-	picker-view {
-		width: 100%;
-		height: 600rpx;
-		padding: 0 32rpx;
-		box-sizing: border-box;
-		overflow: hidden;
-	}
-</style>

+ 0 - 309
pages/address/add.vue

@@ -1,309 +0,0 @@
-<template>
-	<view class="address-new">
-		<pub-loading-view :loaded="loaded" height="100%">
-			<view class="address-new-section" v-if="formData">
-				<uni-forms ref="formRef" :modelValue="formData" :rules="formRules" label-position="top" label-width="200px">
-					<view class="address-new-title">联系人信息</view>
-					<uni-forms-item label="收件人姓名" name="shrxm">
-						<uni-easyinput class="pub-input" :inputBorder="false" trim="all" v-model="formData.shrxm"
-							placeholder="请输入"></uni-easyinput>
-					</uni-forms-item>
-					<uni-forms-item label="联系电话" name="shrsjh">
-						<uni-easyinput class="pub-input" :inputBorder="false" trim="all" v-model="formData.shrsjh"
-							placeholder="请输入"></uni-easyinput>
-					</uni-forms-item>
-					<uni-forms-item label="省市区" name="province">
-						<view class="form-address" @click="pickerAddressRef?.openPop">
-							<!-- todo 没值显示请选择,有值显示 省 市 区,样式用checked -->
-							<view class="form-address-input" :class="popupText?'checked':''">
-								{{ popupText ? popupText : '请选择'}}
-							</view>
-							<view><text class="iconfont checkbox">&#xe656;</text></view>
-						</view>
-						<!-- 地址级联选中的字体要比不选中的要大,用picker没法实现 -->
-						<PickerAddress ref="pickerAddressRef" :province="formData.province" :city="formData.city"
-							:area="formData.area" @change="onChangeArea" />
-					</uni-forms-item>
-					<uni-forms-item label="详细地址(例如**街**号)" name="shrdzxxdz">
-						<uni-easyinput class="pub-input" :inputBorder="false" autoHeight trim="all" type="textarea"
-							v-model="formData.shrdzxxdz" placeholder="请输入"></uni-easyinput>
-					</uni-forms-item>
-				</uni-forms>
-				<view class="address-new-default">
-					<view class="row" @click="onDefault">
-						<text class="iconfont checkbox is-active" v-if="formData.isDefaulted">&#xe63b;</text>
-						<text class="iconfont checkbox" v-else>&#xe8bb;</text>
-						默认收件地址
-					</view>
-					<view @click="onClear">清空</view>
-				</view>
-			</view>
-		</pub-loading-view>
-		<view class="pub-button is-bg large" @click="onConfirm">确定</view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, PropType, onMounted, computed, reactive } from 'vue'
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption";
-	import rest from '@/stores/rest'
-	import dlg from '@/lib/dlg.ts'
-	import * as link from '@/lib/link'
-	import { onLoad } from "@dcloudio/uni-app";
-	import PickerAddress from './PickerAddress.vue'
-	import { ConsigneeInfoVO } from '../../lib/type';
-
-	const formRules = reactive({
-		shrxm: {
-			rules: [{
-				required: true,
-				errorMessage: '姓名不能为空'
-			}]
-		},
-		shrsjh: {
-			rules: [{
-				required: true,
-				errorMessage: '请填写手机号码',
-			}, {
-				validateFunction: function (rule, value, data, callback) {
-					let iphoneReg = (
-						/^(13[0-9]|14[1579]|15[0-3,5-9]|16[6]|17[0123456789]|18[0-9]|19[0-9])\d{8}$/
-					); //手机号码
-					if (!iphoneReg.test(value)) {
-						callback('手机号码格式不正确,请重新填写')
-					}
-				}
-			}]
-		},
-		province: {
-			rules: [{
-				required: true,
-				errorMessage: '省市区不能为空'
-			}]
-		},
-		shrdzxxdz: {
-			rules: [{
-				required: true,
-				errorMessage: '详细地址不能为空'
-			}]
-		}
-	})
-
-
-	const pickerAddressRef = ref()
-	const uniType = ref('add')
-	const formRef = ref()
-	const popupText = ref()
-	const loaded = ref(false)
-	const formData = ref({
-		shrxm: '',
-		shrsjh: '',
-		province: '',
-		city: '',
-		area: '',
-		shrdzxxdz: '',
-		shrxxid: null,
-		hzid: '',
-		isDefaulted: false
-	})
-
-	// 默认地址
-	const onDefault = () => {
-		formData.value.isDefaulted = !formData.value.isDefaulted
-	}
-	const onChangeArea = (e) => {
-		formData.value.province = e.province
-		formData.value.city = e.city
-		formData.value.area = e.area
-		popupText.value = e.province + ' ' + e.city + ' ' + e.area
-	}
-	// 清除
-	const onClear = () => {
-		popupText.value = null
-		formData.value = {
-			shrxm: '',
-			shrsjh: '',
-			province: '',
-			city: '',
-			area: '',
-			shrdzxxdz: '',
-			shrxxid: null,
-			hzid: '',
-			isDefaulted: false
-		}
-	}
-
-
-	const onConfirm = async () => {
-		// 校验表单
-		formRef.value.validate().then(async res => {
-			// 提交请求
-			try {
-				if (uniType.value == 'add') {
-					await rest.post('/default/consignee-info/create', formData.value)
-					dlg.success('新增地址管理成功!')
-				} else if (uniType.value == 'edit') {
-					await rest.put('/default/consignee-info/update', formData.value)
-					dlg.success('修改地址管理成功!')
-				}
-				link.back()
-			} catch (e) {
-				dlg.error(e)
-			}
-		}).catch(err => {
-			console.log('表单错误信息:', err);
-		})
-	}
-
-	const getInfo = async (shrxxid : string) => {
-		try {
-			let res = await rest.get('/default/consignee-info/get', { id: shrxxid }) as ConsigneeInfoVO
-			formData.value.shrxm = res.shrxm
-			formData.value.shrsjh = res.shrsjh
-			formData.value.province = res.province
-			formData.value.city = res.city
-			formData.value.area = res.area
-			formData.value.shrdzxxdz = res.shrdzxxdz
-			formData.value.hzid = res.hzid
-			formData.value.shrxxid = res.shrxxid
-			popupText.value = res.province + res.city + res.area
-			console.log("内容", formData.value)
-		} catch (e) {
-			dlg.error(e)
-		}
-	}
-
-
-	onLoad((data) => {
-		formData.value.hzid = aesDecrypt(data.hzid)
-		if (data.shrxxid) {
-			let shrxxid = aesDecrypt(data.shrxxid)
-			let defaulted = aesDecrypt(data.defaulted)
-			console.log("内容", defaulted)
-			uni.setNavigationBarTitle({
-				title: '编辑地址'
-			})
-			uniType.value = 'edit'
-			formData.value.isDefaulted = defaulted == "true" ? true : false
-			getInfo(shrxxid)
-		}
-	})
-</script>
-
-<style lang="scss" scoped>
-	.address-new {
-		padding: $uni-spacing-col-s3 $page-row-spacing 0;
-		box-sizing: border-box;
-		display: flex;
-		flex-direction: column;
-		height: 100%;
-
-		// position: relative;
-		:deep(.pub-loading) {
-			flex: 1;
-		}
-
-		.address-new-section {
-			background: #fff;
-			border-radius: 16rpx;
-			padding: $uni-spacing-col-s4 $page-row-spacing $uni-spacing-col-s3;
-
-			.address-new-title {
-				font-size: $uni-font-size-lg;
-				line-height: $uni-line-height-lg;
-				font-weight: 800;
-				margin-bottom: 24rpx;
-			}
-
-			.form-address {
-				@include flex-between;
-				border-bottom: 1px solid $uni-border-color;
-				// height: 70rpx;
-				padding: 8rpx 0 24rpx;
-				// todo 模拟校验出错
-				font-size: $uni-font-size-lg;
-				line-height: $uni-line-height-lg;
-				color: $uni-text-color-light;
-
-				.form-address-input.checked {
-					color: $uni-text-color;
-				}
-			}
-
-			:deep(.uni-forms-item__label) {
-				color: $uni-text-color-grey;
-				padding: 0rpx 0 0rpx 0; //12,4
-				font-size: $uni-font-size-base;
-				line-height: $uni-line-height-base;
-				height: auto;
-			}
-
-			:deep(.uni-easyinput__content) {
-				border-bottom: 1px solid $uni-border-color;
-
-				.uni-easyinput__content-input {
-					padding-left: 0 !important;
-					height: 70rpx;
-
-					.uni-input-wrapper {
-						.uni-input-placeholder {
-							font-size: $uni-font-size-lg;
-							line-height: $uni-line-height-lg;
-							color: $uni-text-color-light;
-						}
-
-						.uni-input-input {
-							font-size: $uni-font-size-lg;
-							line-height: $uni-line-height-lg;
-							color: $uni-text-color;
-						}
-					}
-				}
-			}
-
-			:deep(.uni-easyinput__content-textarea) {
-				 margin: 8rpx 0 4rpx;
-				 height: 60rpx;
-				 min-height: 60rpx;
-
-				.uni-easyinput__placeholder-class {
-					font-size: $uni-font-size-lg;
-					line-height: $uni-line-height-lg;
-					color: $uni-text-color-light;
-				}
-
-				.uni-textarea-textarea {
-					font-size: $uni-font-size-lg;
-					line-height: $uni-line-height-lg;
-					color: $uni-text-color;
-				}
-			}
-
-			.address-new-default {
-				// border-top: 1px solid $uni-border-color;
-				// margin-top: 24rpx;
-				// padding-top: 16rpx;
-				@include flex-between;
-				font-size: $uni-font-size-sm;
-				line-height: $uni-line-height-sm;
-
-				.row {
-					@include flex;
-				}
-
-				.iconfont {
-					font-size: 36rpx;
-					margin-right: 8rpx;
-
-					&.checkbox {
-						margin-right: 16rpx;
-						color: $uni-text-color-disable;
-					}
-
-					&.is-active {
-						color: $uni-color-primary;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 302
pages/address/index.vue

@@ -1,302 +0,0 @@
-<template>
-	<view class="address-page">
-		<view class="address-section">
-			<pub-list-scroll ref="pubListScrollRef" @next="onScrollTolower" :loaded="loaded" :text="loadText"
-				:status="status">
-				<view class="no-data" v-if="(!list || list.length == 0)&&!loaded">
-					<image mode="heightFix" src="/static/image/no-data.png" />
-					暂无数据
-				</view>
-				<view class="address-list" v-else>
-					<view v-for="(item,index) in list" :key="'cf'+index" class="address-item" @click="onClickItem(item.shrxxid)"
-						:class="item.shrxxid==curAddressId?'is-active':''">
-						<view class="row address-item-top">
-							<view>{{item.shrxm}}</view>
-							<view>{{item.shrsjh}}</view>
-						</view>
-						<view class="">{{ formattedAddress(item) }}</view>
-						<view class="address-item-bottom">
-							<view class="row" @click.stop="updateDefault(item)">
-								<text class="iconfont checkbox is-active" v-if="item.isDefaulted">&#xe63b;</text>
-								<text class="iconfont checkbox" v-else>&#xe8bb;</text>
-								默认收件地址
-							</view>
-							<view class="row">
-								<view class="row" @click.stop="openDetails('edit',item)"><text class="iconfont">&#xe6ae;</text>编辑</view>
-								<view class="row next-btn" @click.stop="openDeletePopup('center',item.shrxxid)"><text
-										class="iconfont">&#xe626;</text>删除
-								</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</pub-list-scroll>
-		</view>
-		<view class="pub-button is-bg large" @click="openDetails('add')">新增地址</view>
-
-		<!-- 选择弹窗 -->
-		<uni-popup ref="confirmPopup" type="dialog">
-			<uni-popup-dialog type="info" cancelText="取消" confirmText="确定" content="确定使用快递配送?" @confirm="onApply"
-				@close="onCancel"></uni-popup-dialog>
-		</uni-popup>
-		<!-- 删除弹窗 注意这里取消按钮的位置 -->
-		<uni-popup ref="delPopup" type="dialog">
-			<uni-popup-dialog type="info" cancelText="确定" confirmText="取消" content="确定删除该地址?" @confirm="onDelApply"
-				@close="onDelCancel"></uni-popup-dialog>
-		</uni-popup>
-	</view>
-</template>
-
-<script lang="ts" setup>
-	import { ref } from 'vue'
-	import dlg from '@/lib/dlg'
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption";
-	import { onLoad, onShow } from "@dcloudio/uni-app";
-	import rest from '@/stores/rest'
-	import * as link from '@/lib/link'
-	import { BasicInfoVO } from '../../lib/type';
-
-	const pubListScrollRef = ref(null)
-	const scrollTop = ref(0)
-	const loaded = ref(false)
-	const loadText = ref('数据加载中...')
-	const status = ref('loading')
-	const list = ref() //处方列表
-	const queryParams = ref({
-		pageNo: 1,
-		pageSize: 10,
-		hzid: '',
-	})
-	const ptwybh = ref()
-	const total = ref(0)
-
-
-	const confirmPopup = ref() // 弹出层
-	const delPopup = ref() // 删除弹出层
-	const deleteId = ref() // 删除的id
-	const curAddressId = ref() // 选中项
-	const selAddressId = ref() // 点击项
-
-	// 拼接地址
-	const formattedAddress = (item) => {
-		const { province, city, area, shrdzxxdz } = item
-		return `${province || ''}${city || ''}${area || ''}${shrdzxxdz || ''}`
-	}
-
-	const openDeletePopup = (position, id) => {
-		deleteId.value = id
-		delPopup.value.open(position)
-	}
-
-	const onClickItem = (id : string) => {
-		console.log("onClickItem", ptwybh.value)
-		if (ptwybh.value) {
-			selAddressId.value = id
-			confirmPopup.value.open('center')
-		}
-	}
-
-	const onDelCancel = async () => {
-		// 从 list 中找到该项的位置
-		const index = list.value.findIndex(item => item.shrxxid === deleteId.value);
-		if (index !== -1) {
-			const [removedItem] = list.value.splice(index, 1);
-			// 执行删除接口
-			try {
-				await rest.del('/default/consignee-info/delete?id=' + deleteId.value, {});
-			} catch (error) {
-				list.value.splice(index, 0, removedItem);
-			}
-		} else {
-			console.warn("未找到要删除的项");
-		}
-	}
-
-	const onDelApply = () => {
-		// 删除取消
-	}
-
-	const onCancel = () => {
-	}
-	const onApply = async () => {
-		if (ptwybh.value) {
-			curAddressId.value = selAddressId.value
-			const data = {
-				ptwybh: ptwybh.value,
-				shrxxid: curAddressId.value,
-				kd: true
-			}
-			await rest.put('/default/consignee-info/bindShrxxid', data);
-			dlg.success('操作成功')
-			link.back()
-		}
-	}
-
-	// 修改默认
-	const updateDefault = async (item) => {
-		if (item.isDefaulted === null) {
-			item.isDefaulted = true;
-			const index = list.value.findIndex(i => i.shrxxid === item.shrxxid);
-			if (index !== -1) {
-				const [movedItem] = list.value.splice(index, 1);
-				list.value.unshift(movedItem);
-				if (list.value.length > 1) {
-					list.value[1].isDefaulted = null;
-				}
-			}
-			await rest.put('/default/consignee-info/update', item)
-		}
-	}
-
-	const getList = async () => {
-		try {
-			loaded.value = true;
-			let res = await rest.get('/default/consignee-info/list', queryParams.value) as BasicInfoVO
-			let _list = res.list
-
-
-			if (queryParams.value.pageNo === 1) {
-				list.value = _list;
-			} else {
-				list.value = list.value.concat(_list);
-			}
-
-			total.value = res.total
-			if (res.total && queryParams.value.pageNo >= total.value / queryParams.value.pageSize) {
-				status.value = "noMore"
-			}
-			// 重置滚动位置 
-			if (queryParams.value.pageNo === 1) {
-				pubListScrollRef.value.goTop()
-			}
-		} catch (e) {
-			dlg.error(e)
-		} finally {
-			loaded.value = false;
-		}
-	}
-
-	//下一页
-	const onScrollTolower = async () => {
-		if (!list.value || queryParams.value.pageNo > (total.value / queryParams.value.pageSize)) {
-			return false;
-		}
-		if (queryParams.value.pageNo < total.value / queryParams.value.pageSize) {
-			status.value = "loading";
-		} else {
-			status.value = "noMore"
-			return;
-		}
-		queryParams.value.pageNo++;
-		getList();
-	}
-
-
-	const openDetails = (action, item = null) => {
-		console.log("内容", item)
-		if (item) {
-			link.addAddress(aesEncrypt(queryParams.value.hzid), aesEncrypt(item.shrxxid), aesEncrypt(item.isDefaulted ? 'true' : 'false'))
-		} else {
-			link.addAddress(aesEncrypt(queryParams.value.hzid))
-		}
-	}
-
-
-	onLoad((data) => {
-		queryParams.value.hzid = aesDecrypt(data.hzid)
-		if (data.ptwybh) {
-			console.log("进入了嘛")
-			ptwybh.value = aesDecrypt(data.ptwybh)
-		}
-	})
-	onShow(() => {
-		queryParams.value.pageNo = 1;
-		getList()
-	})
-</script>
-
-<style lang="scss" scoped>
-	.address-page {
-		display: flex;
-		flex-direction: column;
-		height: 100%;
-
-		.address-section {
-			flex: 1;
-			overflow-y: auto;
-			margin-top: 16rpx;
-
-			.address-list {
-
-				.address-item {
-					background: #fff;
-					margin-bottom: 24rpx;
-					padding: 24rpx 32rpx 16rpx;
-					color: $uni-text-color-grey;
-					border: 1px solid #fff;
-
-					.row {
-						@include flex;
-					}
-
-					.address-item-top {
-						font-size: $uni-font-size-lg;
-						line-height: $uni-line-height-lg;
-						color: $uni-text-color;
-						margin-bottom: 24rpx;
-
-						>view+view {
-							margin-left: 32rpx;
-						}
-					}
-
-					.address-item-bottom {
-						border-top: 1px solid $uni-border-color;
-						margin-top: 24rpx;
-						padding-top: 16rpx;
-						@include flex-between;
-						font-size: $uni-font-size-sm;
-						line-height: $uni-line-height-sm;
-
-						.iconfont {
-							font-size: 36rpx;
-							margin-right: 8rpx;
-
-							&.checkbox {
-								margin-right: 16rpx;
-								color: $uni-text-color-disable;
-							}
-
-							&.is-active {
-								color: $uni-color-primary;
-							}
-
-
-						}
-
-						.next-btn {
-							margin-left: 32rpx;
-						}
-					}
-
-					&.is-active {
-						border: 1px solid $uni-color-primary;
-						box-sizing: border-box;
-					}
-
-
-
-				}
-			}
-
-			::v-deep .scroll-view {
-				height: calc(100%);
-			}
-		}
-
-		.pub-button {
-			margin-left: 32rpx;
-			margin-right: 32rpx;
-		}
-	}
-</style>

+ 0 - 210
pages/cfList/index.vue

@@ -1,210 +0,0 @@
-<template>
-	<view class="cf-list-page">
-		<TopCard :data="queryParams" />
-		<view class="cf-list-section">
-			<pub-list-scroll ref="pubListScrollRef" @next="onScrollTolower" :loaded="loaded" :text="loadText" :status="status">
-				<view class="no-data" v-if="!list || list.length == 0">
-					<image mode="heightFix" src="/static/image/no-data.png" />
-					暂无数据
-				</view>
-				<view class="cf-list" v-else>
-					<view v-for="(item,index) in list" :key="'cf'+index" class="cf-item" @click.native="cardClick(item)">
-						<view class="cf-item-title">
-							<view><text class="label">开方日期</text>{{ formatDate(item.kfrq,'{y}-{m}-{d} {h}:{i}:{s}')}}</view>
-							<view class="cf-item-title-addr" v-if="isShowTag(item)" @click="skipAddressList($event,item)">
-								<text class="iconfont">&#xe692;</text>
-								填写收货地址
-							</view>
-						</view>
-						<view class="row">
-							<text class="label">处方状态</text>
-							<!-- 已签收/已快递/已发药 绿色,	其他全部橙色 -->
-							<text
-								:class="['cf-status', { 'is-green': ['09', '10', '11'].includes(item.cfzt) }]">{{ DictLabelCFZT(item.cfzt) }}</text>
-						</view>
-						<view class="row">
-							<text class="label">医疗机构</text>{{item.orgFullName}}
-						</view>
-					</view>
-				</view>
-			</pub-list-scroll>
-		</view>
-	</view>
-</template>
-
-<script lang="ts" setup>
-	import { ref } from 'vue'
-	import { onLoad, onShow } from "@dcloudio/uni-app";
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption";
-	import dlg from '@/lib/dlg'
-	import rest from '@/stores/rest'
-
-	import TopCard from '../index/TopCard.vue'
-
-	import { BasicInfoVO } from '../../lib/type'
-	import { DictLabelCFZT,globalState,formatDate } from '@/lib/util'
-	import * as link from '@/lib/link'
-	
-	const shrdzxxdz = ref()
-	const pubListScrollRef = ref(null)
-	const loaded = ref(false)
-	const loadText = ref('数据加载中...')
-	const status = ref('loading')
-	const list = ref() //处方列表
-	const queryParams = ref({
-		pageNo: 1,
-		pageSize: 10,
-		zjhm: '',
-		hzxm:'',
-	})
-	const total = ref(0)
-
-
-	const getList = async () => {
-		try {
-			loaded.value = true;
-			let res = await rest.get('/app-api/bmfw/findList', queryParams.value) as BasicInfoVO
-			console.log("基础信息", res)
-			let _list = res.list
-
-			if (queryParams.value.pageNo === 1) {
-				list.value = _list;
-			} else {
-				list.value = list.value.concat(_list);
-			}
-			// 最近就诊
-			if (list.value.length > 0){
-				const firstBasicInfo = list.value[0]
-				globalState.lastVisitDate = formatDate(firstBasicInfo.kfrq, '{y}-{m}-{d}')
-			}
-
-			total.value = res.total
-			if (res.total && queryParams.value.pageNo >= total.value / queryParams.value.pageSize) {
-				status.value = "noMore"
-			}
-			// 重置滚动位置
-			if (queryParams.value.pageNo === 1) { 
-				pubListScrollRef.value.goTop()
-			}
-		} catch (e) {
-			dlg.error(e)
-		} finally {
-			loaded.value = false;
-		}
-	}
-
-	//下一页
-	const onScrollTolower = async () => {
-		console.log("onScrollTolower")
-		if (!list.value || queryParams.value.pageNo > (total.value / queryParams.value.pageSize)) {
-			return false;
-		}
-		if (queryParams.value.pageNo < total.value / queryParams.value.pageSize) {
-			status.value = "loading";
-		} else {
-			status.value = "noMore"
-			return;
-		}
-		queryParams.value.pageNo++;
-		getList();
-	}
-
-	const cardClick = (item) => {
-		link.goCFDetails(aesEncrypt(item.ptwybm),aesEncrypt(queryParams.value.zjhm),aesEncrypt(queryParams.value.hzxm))
-	}
-	const isShowTag = (item) => {
-		if (['3', '5'].includes(item.fyfslx) && ['00', '001', '01', '02', '05', '06', '07', '08'].includes(item.cfzt)) {
-			return true
-		}
-		return false
-	}
-
-	const skipAddressList = (event, item) => {
-		event.stopPropagation();
-		link.goAddressList(aesEncrypt(queryParams.value.zjhm), aesEncrypt(item.ptwybm))
-	}
-	onLoad((data) => {
-		queryParams.value.zjhm = aesDecrypt(data.hzsfzh)
-		queryParams.value.hzxm = aesDecrypt(data.hzxm)
-	})
-	
-	onShow(() => { 
-		queryParams.value.pageNo = 1;
-		getList()
-	})
-</script>
-
-<style lang="scss" scoped>
-	.cf-list-page {
-		display: flex;
-		flex-direction: column;
-		height: 100%;
-
-		.cf-list-section {
-			flex: 1;
-			overflow-y: auto;
-			margin-top: 32rpx;
-			padding: 0 32rpx;
-
-			.cf-list {
-
-				.cf-item {
-					background: #fff;
-					margin-bottom: 24rpx;
-					border-radius: 8rpx;
-					padding: 24rpx 24rpx;
-
-					.label {
-						color: $uni-text-color-grey;
-						margin-right: 32rpx;
-
-					}
-
-					.cf-item-title {
-						border-bottom: 1px solid $uni-border-color;
-						margin: 0 -24rpx;
-						padding: 0 24rpx 24rpx;
-						@include flex-between;
-
-						.cf-item-title-addr {
-							font-size: $uni-font-size-sm;
-							line-height: $uni-line-height-sm;
-							color: $uni-color-primary;
-							@include flex;
-
-							.iconfont {
-								font-size: 40rpx;
-								margin-right: 8rpx;
-							}
-						}
-					}
-
-					.row {
-						margin-top: 16rpx;
-						@include flex;
-
-						.cf-status {
-							height: 56rpx;
-							padding: 0 32rpx;
-							@include flex-center;
-							color: $uni-color-orange;
-							border-radius: 8rpx;
-							font-size: $uni-font-size-sm;
-							line-height: $uni-line-height-sm;
-							background: linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), $uni-color-orange;
-
-							&.is-green {
-								color: $uni-color-green;
-								background: linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), $uni-color-green;
-							}
-						}
-					}
-				}
-			}
-
-			::v-deep .scroll-view {
-				height: calc(100%);
-			}
-		}
-	}
-</style>

+ 123 - 0
pages/feedback/FeedbackList.vue

@@ -0,0 +1,123 @@
+<template>
+	<view class="feedback-list-view">
+		<pub-list-scroll ref="pubListScrollRef" @next="onScrollTolower" :loaded="loaded" :text="loadText" :status="status">
+			<view class="no-data" v-if="!listArray || listArray.length == 0">
+				<image mode="heightFix" src="/static/image/no-data.png" />
+				暂无数据
+			</view>
+			<view class="feedback-list" v-else>
+				<view v-for="(item,index) in listArray" :key="index" class="loop-list-item" @click="onClick(item)">
+					<view class="item-content">
+						<view class="item-title">
+							<view class="title-line">{{ item.title }}</view>
+							<view class="title-company" :class="filterApplicationBgColor(item.fkzt)">{{ filterApplicationStatus(item.fkzt) }}</view>
+						</view>
+						<view class="part-line"></view>
+						<view class="text-content">
+							<view v-for="(textItem,textIndex) in item.formattedData" :key="textIndex" class="other-loop-item">
+								<view class="textTitle">{{ textItem.title }}</view>
+								<view class="textValue">{{ textItem.value }}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</pub-list-scroll>
+	</view>
+</template>
+
+<script setup lang="ts">
+	import { defineProps,ref } from "vue";
+	import { filterApplicationStatus,filterApplicationBgColor } from '@/lib/util'
+
+	const emit = defineEmits(['click']) // 定义 success 事件,用于操作成功后的回调
+	// 定义 props 类型
+	const props = defineProps({
+		listArray: {
+			type: Object,
+			default: () => {}
+		}
+	});
+	const pubListScrollRef = ref(null)
+	const loaded = ref(false)
+	const loadText = ref('数据加载中...')
+	const status = ref('loading')
+	
+	const onScrollTolower = ()=> {
+		console.log("下一页了?")
+	}
+	const onClick = (item:any)=> {
+		emit("click",item)
+	}
+</script>
+
+
+
+
+<style lang="scss">
+	.feedback-list-view {
+		height: calc(100% - 60rpx);
+		overflow-y: auto;
+		background-color: #F6F7F8;
+		.feedback-list {
+			padding: 32rpx 40rpx 40rpx;
+			background-color: #F6F7F8;
+			.loop-list-item {
+				min-height: 200rpx;
+				margin-bottom: 24rpx;
+				border-radius: 10rpx;
+				background: #fff;
+				padding: 30rpx 40rpx 20rpx;
+				.item-content {
+					.item-title{
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						.title-company {
+							padding: 12rpx 16rpx;
+							border-radius: 8rpx;
+							font-size: 24rpx;
+							&.yellow {
+								background-color: #fef5fa;
+								color: #FD9F48;
+							}
+							&.blue {
+								background-color: #e7f2fe;
+								color: #1E92F0;
+							}
+							&.green {
+								background-color: #e4f7f0;
+								color: #00B578;
+							}
+						}
+					}
+					.part-line {
+						border: 1px solid #EFEFEF;
+						margin: 8rpx 0 18rpx;
+					}
+					.text-content {
+						display: flex;
+						flex-direction: column;
+						.other-loop-item {
+							margin-bottom: 10rpx;
+							display: flex;
+							align-items: center;
+							font-size: 24rpx;
+							font-weight: 350;
+							.textTitle {
+								color: #9B9B9B;
+								margin-right: 24rpx;
+							}
+							.textValue {
+								color: #3D3D3D;
+							}
+							&:last-child { 
+								margin-bottom: 0; 
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 144 - 0
pages/feedback/PickertType.vue

@@ -0,0 +1,144 @@
+<template>
+    <view class="picker-address">
+        <uni-popup ref="popRef">
+            <view class="picker-address-content">
+                <view class="picker-address-top">
+                    <view class="picker-address-action cancel" @click="onCancel">取消</view>
+                    <view class="picker-address-action confirm" @click="onConfirm">确定</view>
+                </view>
+                <picker-view indicator-class='is-selected' :value="[selectedFeedbackIndex]" @change="onFeedbackChange">
+                    <picker-view-column>
+                        <view class="addr-item" :class="selectedFeedbackIndex == index ? 'selected' : ''"
+                            v-for="(item, index) in feedbackList" :key="index">
+                            {{ item.name }}
+                        </view>
+                    </picker-view-column>
+                </picker-view>
+            </view>
+        </uni-popup>
+    </view>
+</template>
+
+<script lang="ts" setup>
+import { ref, onMounted, computed, watch } from 'vue';
+
+const emits = defineEmits(['change']);
+const props = defineProps({
+    feedbackArray: {
+        type: Array,
+        default: () => []
+    },
+    feedbackType: {
+        type: [String, Number],
+        default: ""
+    }
+});
+
+watch(() => props.feedbackType, () => {
+    if (props.feedbackType) {
+        updateFeedbackIndex(props.feedbackType);
+    }
+});
+
+const popRef = ref();
+const feedbackList = ref([]); // 反馈列表
+const selectedFeedbackIndex = ref(0); // 选中的反馈索引
+
+const selectedFeedback = computed(() => {
+    return feedbackList.value[selectedFeedbackIndex.value] || { name: '反馈', value: null };
+});
+
+const onCancel = () => {
+    popRef.value.close();
+};
+
+const onConfirm = () => {
+    emits('change', selectedFeedback.value);
+    onCancel();
+};
+
+const onFeedbackChange = (e) => {
+    selectedFeedbackIndex.value = e.detail.value[0];
+};
+
+const openPop = () => {
+	feedbackList.value = props.feedbackArray; 
+    popRef.value.open('bottom');
+};
+
+const updateFeedbackIndex = (feedbackType) => {
+    const index = feedbackList.value.findIndex(feedback => feedback.value === feedbackType);
+    selectedFeedbackIndex.value = index !== -1 ? index : 0;
+};
+
+onMounted(() => {
+    if (props.feedbackType) {
+        updateFeedbackIndex(props.feedbackType);
+    }
+});
+
+defineExpose({ openPop });
+</script>
+
+
+<style lang="scss" scoped>
+.picker-address {
+    .picker-address-content {
+        background-color: #fff;
+        border-radius: 16rpx 16rpx 0 0;
+
+        .picker-address-top {
+            height: 96rpx;
+            @include flex-between;
+            border-bottom: 1px solid $uni-border-color;
+
+            .picker-address-action {
+                font-size: $uni-font-size-xl;
+                line-height: $uni-line-height-xl;
+                @include flex;
+                padding: 0 32rpx;
+
+                &.cancel {
+                    color: $uni-text-color !important;
+                }
+
+                &.confirm {
+                    color: $uni-color-primary;
+                }
+            }
+        }
+
+        .addr-item {
+            height: 96rpx !important;
+            font-size: $uni-font-size-xl;
+            line-height: $uni-line-height-xl;
+            @include flex-center;
+
+            &.selected {
+                font-size: $uni-font-size-xxl;
+                line-height: $uni-line-height-xxl;
+            }
+        }
+    }
+
+    :deep(uni-picker-view) {
+        margin-top: 24rpx;
+    }
+
+    :deep(.is-selected) {
+        height: 96rpx !important;
+        color: $uni-text-color;
+        font-size: $uni-font-size-xxl;
+        line-height: $uni-line-height-xxl;
+    }
+
+    picker-view {
+        width: 100%;
+        height: 600rpx;
+        padding: 0 32rpx;
+        box-sizing: border-box;
+        overflow: hidden;
+    }
+}
+</style>
+

+ 368 - 0
pages/feedback/details.vue

@@ -0,0 +1,368 @@
+<template>
+	<view class="feedback-list-view">
+		<pub-loading-view :loaded="loaded" height="100%">
+			<uni-forms ref="formRef" :modelValue="formData" :rules="formRules" label-position="top" label-width="200px">
+				<view class="feedback-info">
+					<view class="feedback-info-title">登记人信息</view>
+					<uni-forms-item label="姓名" name="djr">
+						<uni-easyinput :disabled="disabledRef" class="pub-input" :inputBorder="false" trim="all" v-model="formData.djr"
+							placeholder="请输入"></uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item label="联系电话" name="lxdh">
+						<uni-easyinput :disabled="disabledRef" class="pub-input" :inputBorder="false" trim="all" v-model="formData.lxdh"
+							placeholder="请输入"></uni-easyinput>
+					</uni-forms-item>
+					<uni-forms-item label="医疗机构" name="yljgdm">
+						<view class="form-feedback" @click="openPickerDept">
+							<view class="form-feedback-input" :class="popupDeptText?'checked':''">
+								{{ popupDeptText ? popupDeptText : '请选择'}}
+							</view>
+							<view><text class="iconfont checkbox">&#xe656;</text></view>
+						</view>
+						<PickerType ref="pickerDeptRef" :feedbackArray="yljgList" :feedbackType="formData.yljgdm" @change="onChangeYljg" />
+					</uni-forms-item>
+				</view>
+				<view class="feedback-info feedback-formdate">
+					<uni-forms-item label="反馈类型" name="fklx">
+						<view class="form-feedback" @click="openPickerType">
+							<view class="form-feedback-input" :class="popupTypeText?'checked':''">
+								{{ popupTypeText ? popupTypeText : '请选择'}}
+							</view>
+							<view><text class="iconfont checkbox">&#xe656;</text></view>
+						</view>
+						<PickerType ref="pickerTypeRef" :feedbackArray="feedbackArray" :feedbackType="formData.fklx" @change="onChangeType" />
+					</uni-forms-item>
+					<uni-forms-item label="反馈详情" name="fkxq">
+						<uni-easyinput v-if="!disabledRef" :inputBorder="false" trim="all" type="textarea" v-model="formData.fkxq" placeholder="请输入"></uni-easyinput>
+						<view v-else class="other-text">{{ formData.fkxq }}</view>
+					</uni-forms-item>
+				</view>
+			</uni-forms>
+			<view v-if="disabledRef" class="feedback-schedule">
+				<view class="schedule-title">进度</view>
+				<view class="schedule-timeline">
+					 <view class="step-item" v-for="(item,index) in timeLine" :key="index">
+						<view class="step_great_circle"></view>
+						<view class="step-content">
+							<view class="step-title">{{ item.desc }}</view>
+							<view class="step-desc">{{ formatDate(item.time,'{y}-{m}-{d} {h}:{i}:{s}')}}</view>
+							 <div class="step-line" v-if="index + 1 == timeLine.length ? false : true" ></div>
+						</view>
+					</view>
+				</view>
+			</view>
+		</pub-loading-view>
+		<view v-if="!disabledRef" class="pub-button is-bg large" @click="onConfirm">确定</view>
+	</view>
+</template>
+<script lang="ts" setup>
+	import { ref, reactive } from 'vue'
+	import rest from '@/stores/rest'
+	import dlg from '@/lib/dlg.ts'
+	import * as link from '@/lib/link'
+	import { onLoad } from "@dcloudio/uni-app";
+	import PickerType from './PickertType.vue'
+	import { feedbackVO } from '../../lib/type';
+	import { formatDate } from '@/lib/util'
+
+	const formRules = reactive({
+		djr: {
+			rules: [{
+				required: true,
+				errorMessage: '姓名不能为空'
+			}]
+		},
+		lxdh: {
+			rules: [{
+				required: true,
+				errorMessage: '请填写手机号码',
+			}, {
+				validateFunction: function (rule, value, data, callback) {
+					let iphoneReg = (
+						/^(13[0-9]|14[1579]|15[0-3,5-9]|16[6]|17[0123456789]|18[0-9]|19[0-9])\d{8}$/
+					); //手机号码
+					if (!iphoneReg.test(value)) {
+						callback('手机号码格式不正确,请重新填写')
+					}
+				}
+			}]
+		},
+		yljgdm: {
+			rules: [{
+				required: true,
+				errorMessage: '医疗机构不能为空'
+			}]
+		},
+		fklx: {
+			rules: [{
+				required: true,
+				errorMessage: '反馈类型不能为空'
+			}]
+		},
+		fkxq: {
+			rules: [{
+				required: true,
+				errorMessage: '反馈详情不能为空'
+			}]
+		},
+	})
+	
+	const feedbackArray = ref([
+		{
+			name: '缺药补药',
+			value: 1,
+		},
+		{
+			name: '审方标准建议',
+			value: 2,
+		},
+		{
+			name: '其他建议',
+			value: 3,
+		},
+			
+	])
+	const itemId = ref()
+	const disabledRef= ref(false)
+	const pickerDeptRef = ref()
+	const popupDeptText = ref()
+	const yljgList = ref() // 医疗机构列表
+	const pickerTypeRef = ref()
+	const uniType = ref('add')
+	const formRef = ref()
+	const popupTypeText = ref()
+	const loaded = ref(false)
+	const formData = ref({
+		djr: '',
+		lxdh: '',
+		yljgmc: '',
+		yljgdm: '',
+		fklx: '',
+		fkxq: '',
+	})
+	const timeLine = ref([])
+	
+	const openPickerDept = ()=> {
+		if (!disabledRef.value) { 
+			pickerDeptRef.value?.openPop()
+		}
+	}
+	const openPickerType = ()=> {
+		if (!disabledRef.value){
+			pickerTypeRef.value?.openPop()
+		}
+	}
+	
+	const onChangeYljg = (e) => {
+		formData.value.yljgmc = e.name
+		formData.value.yljgdm = e.value
+		popupDeptText.value = e.name
+	}
+	const onChangeType = (e) => {
+		formData.value.fklx = e.value
+		popupTypeText.value = e.name
+	}
+
+
+	const onConfirm = async () => {
+		// 校验表单
+		formRef.value.validate().then(async res => {
+			// 提交请求
+			try {
+				if (uniType.value == 'add') {
+					await rest.post('/admin-api/zyyp/feedback/create', formData.value)
+					dlg.success('已新增反馈登记!')
+				}
+				link.back()
+			} catch (e) {
+				dlg.error(e)
+			}
+		}).catch(err => {
+			console.log('表单错误信息:', err);
+		})
+	}
+	
+	//  初始化数据
+	const getInfo = async () => {
+		try {
+			// 医疗机构列表
+			let res = await rest.get('/admin-api/system/dept/list-all-simple', { orgType: 1 })
+			if (!res) return
+			// 转换数据 
+			yljgList.value = (res as any[]).map(item => ({ 
+				name: item.orgName, 
+				value: item.orgCode ,
+			}));
+			// 
+			if (itemId.value){
+				let itemRes = await rest.get('/admin-api/zyyp/feedback/get', { id: itemId.value }) as feedbackVO
+				formData.value = itemRes
+				popupDeptText.value = itemRes.yljgmc
+				const matchedItem = feedbackArray.value.find(item => item.value === Number(itemRes.fklx));
+				popupTypeText.value = matchedItem ? matchedItem.name : '未找到匹配项';
+				timeLine.value = itemRes.jd
+				if (itemRes.fkzt == '1'){
+					timeLine.value.push({desc:'等待受理',time:null})
+				}
+				disabledRef.value = true
+			}
+		} catch (e) {
+			dlg.error(e)
+		}
+	}
+	
+
+	onLoad((data) => {
+		if (data.id){
+			itemId.value = data.id
+		}
+		getInfo()
+	})
+</script>
+
+<style lang="scss" scoped>
+	.feedback-list-view {
+		padding: $uni-spacing-col-s3 0 0;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+
+		// position: relative;
+		:deep(.pub-loading) {
+			flex: 1;
+		}
+
+		.feedback-info {
+			background: #fff;
+			padding: $uni-spacing-col-s4 $page-row-spacing $uni-spacing-col-s3;
+
+			.feedback-info-title {
+				font-size: $uni-font-size-lg;
+				line-height: $uni-line-height-lg;
+				font-weight: 800;
+				margin-bottom: 24rpx;
+			}
+
+			.form-feedback {
+				@include flex-between;
+				border-bottom: 1px solid $uni-border-color;
+				// height: 70rpx;
+				padding: 8rpx 0 24rpx;
+				// todo 模拟校验出错
+				font-size: $uni-font-size-lg;
+				line-height: $uni-line-height-lg;
+				color: $uni-text-color-light;
+
+				.form-feedback-input.checked {
+					color: $uni-text-color;
+				}
+			}
+			:deep(.is-disabled) {
+				background-color: #ffffff !important;
+				color: #363A44 !important;
+			}
+
+			:deep(.uni-forms-item__label) {
+				color: $uni-text-color-grey;
+				padding: 0rpx 0 0rpx 0; //12,4
+				font-size: $uni-font-size-base;
+				line-height: $uni-line-height-base;
+				height: auto;
+			}
+
+			:deep(.uni-easyinput__content) {
+				border-bottom: 1px solid $uni-border-color;
+				.uni-easyinput__content-input {
+					padding-left: 0 !important;
+					height: 70rpx;
+
+					.uni-input-wrapper {
+						.uni-input-placeholder {
+							font-size: $uni-font-size-lg;
+							line-height: $uni-line-height-lg;
+							color: $uni-text-color-light;
+						}
+
+						.uni-input-input {
+							font-size: $uni-font-size-lg;
+							line-height: $uni-line-height-lg;
+							color: $uni-text-color;
+						}
+					}
+				}
+			}
+			:deep(.uni-easyinput__content-textarea) {
+				 margin: 8rpx 0 4rpx;
+				 height: 220rpx;
+				 min-height: 220rpx;
+				 // overflow-y: auto !important;
+
+				.uni-easyinput__placeholder-class {
+					font-size: $uni-font-size-lg;
+					line-height: $uni-line-height-lg;
+					color: $uni-text-color-light;
+				}
+
+				.uni-textarea-textarea {
+					font-size: $uni-font-size-lg;
+					line-height: $uni-line-height-lg;
+					color: $uni-text-color;
+				}
+			}
+		}
+		.feedback-formdate {
+			margin-top: 20rpx;
+			:deep(.uni-forms-item:last-of-type .uni-easyinput__content) { 
+				border-bottom: none; 
+			}
+		}
+		.other-text {
+			margin-top: 10rpx;
+			font-size: $uni-font-size-lg;
+			line-height: $uni-line-height-lg;
+			color: $uni-text-color;
+		}
+		.feedback-schedule {
+			margin-top: 10rpx;
+			background-color: #fff;
+			padding: $uni-spacing-col-s4 $page-row-spacing $uni-spacing-col-s3;
+			.schedule-title {
+				font-size: 28rpx;
+				font-weight: 600;
+			}
+			.schedule-timeline {
+			    margin: 20px 10px 0;
+			    overflow: auto;
+			    .step-item {
+			      position: relative;
+			      display: flex;
+			      align-items: flex-start;
+			      margin-bottom: 10rpx;
+			      .step_great_circle {
+			        width: 20rpx;
+			        height: 20rpx;
+			        border-radius: 50%;
+			        background-color: #D8D8D8;
+			        margin: 12rpx 20rpx 0 0;
+			      }
+			      .step-content {
+			        width: 100%;
+			        padding: 4rpx 10rpx 20rpx;
+			        display: flex;
+			        flex-direction: column;
+			        color: #686B73;
+			      }
+			      .step-line {
+			        position: absolute;
+			        top: 38rpx;
+			        left: 8rpx;
+			        bottom: -15rpx;
+			        width: 2rpx;
+			        background-color: #EFEFEF;
+			      }
+			    }
+			  }
+		}
+	}
+</style>

+ 237 - 0
pages/feedback/index.vue

@@ -0,0 +1,237 @@
+<template>
+	<view class="switchRecord-container">
+		<!--顶部导航栏-->
+		<scroll-view class="scroll-view" scroll-x="true" @scroll="scroll">
+			<view class="scroll-view-item" v-for="(tab,index) in tabBars" :key="tab.id" :id="tab.id" :class="navIndex==index ? 'activite' : ''" @tap="checkIndex(index)">
+				{{tab.name}}
+			</view> 
+		</scroll-view>
+		<!-- 内容 -->
+		<swiper :current="navIndex" @change="tabChange" class="swiper_content">
+			<swiper-item class="swiper_item">
+				<FeedbackList :listArray="listArray" @click="onClick" />
+			</swiper-item>
+			<swiper-item class="swiper_item ">
+				<FeedbackList :listArray="listArray"  @click="onClick"  />
+			</swiper-item>
+			<swiper-item class="swiper_item ">
+				<FeedbackList :listArray="listArray"  @click="onClick"  />
+			</swiper-item>
+			<swiper-item class="swiper_item ">
+				<FeedbackList :listArray="listArray"  @click="onClick"  />
+			</swiper-item>
+		</swiper>
+		<!-- 新增 -->
+		<view class="feedback-add-icon" @click="onClickAdd">
+			<image class="add-icon" src="/static/image/add-icon.svg" mode="aspectFit"></image>
+		</view>
+	</view>
+</template>
+
+<script setup lang="ts">
+	import { ref,onMounted } from "vue"
+	import * as link from '@/lib/link'
+	import rest from '@/stores/rest'
+	import { formatDate } from '@/lib/util'
+	
+	import FeedbackList from './FeedbackList.vue'
+	
+	const queryParams = ref({
+		pageNo: 1,
+		pageSize: 10,
+		fkzt: '',
+	})
+	const scrollTop = ref(0)
+	const navIndex = ref(0)
+	const tabBars = ref([
+		{
+			name:'全部',
+			id: 0
+		},
+		{
+			name:'待受理',
+			id: 1
+		},
+		{
+			name:'受理中 ',
+			id: 2
+		},
+		{
+			name:'已办结 ',
+			id: 3
+		}
+	])
+	
+	const scroll = (e: any) => {
+		console.log("scroll",e); 
+		scrollTop.value = e.detail.scrollTop; 
+	};
+	const checkIndex = (idx:number) => {
+		if (navIndex.value !== idx){
+			navIndex.value = idx;
+			switch (idx) {
+				case 0:
+					queryParams.value.fkzt = ''
+					break;
+				case 1:
+					queryParams.value.fkzt = '1'
+					break;
+				case 2:
+					queryParams.value.fkzt = '2'
+					break;
+				case 3:
+					queryParams.value.fkzt = '3'
+					break;
+			}
+			getList()
+		}
+	}
+	const tabChange = async(e:any) => {
+		let _idx = e.detail.current
+		checkIndex(_idx)
+	}
+	
+	const listArray = ref([])
+	const list = ref() //处方列表
+	const total = ref(0)
+	
+	const getList = async () => {
+		try {
+			console.log("此时的",queryParams.value)
+			// loaded.value = true;
+			let res = await rest.get('/admin-api/zyyp/feedback/page', queryParams.value)
+			let _list = res.list
+	
+	
+			if (queryParams.value.pageNo === 1) {
+				list.value = _list;
+			} else {
+				list.value = list.value.concat(_list);
+			}
+			getFormattedData(list.value)
+			total.value = res.total
+			if (res.total && queryParams.value.pageNo >= total.value / queryParams.value.pageSize) {
+				status.value = "noMore"
+			}
+			
+		} catch (e) {
+		} finally {
+		}
+	}
+	
+	
+	const titleArray = [
+	  { title: '办件编号', key: 'id' },
+	  { title: '登记时间', key: 'createTime' },
+	];
+	
+	const getFormattedData = (listData) => {
+	  const formattedData = listData.map(item => {
+		const formattedItem = titleArray.map(titleItem => {
+		  let value = item[titleItem.key];
+		  if (titleItem.key === 'createTime') {
+		    value = formatDate(item[titleItem.key], '{y}-{m}-{d} {h}:{i}:{s}');
+		  }
+		  return {
+		    title: titleItem.title,
+		    value: value
+		  };
+		});
+		return { 
+			...item, 
+			title: '中医用药一件事反馈登记',
+			formattedData: formattedItem ,
+		};
+	  });
+	  listArray.value = formattedData;
+	};
+	
+	
+	const onClick = (e)=> {
+		link.goBJDetails(e.id)
+	}
+	const onClickAdd = ()=> {
+		link.goBJDetails()
+	}
+	
+	// 页面每次加载
+	onMounted(() => {
+		getList()
+	})
+</script>
+
+
+<style lang="scss">
+.switchRecord-container {
+  display: flex;
+  background-color: #f2f2f2;
+  flex-direction: column;
+  height: calc(100vh - 120rpx);
+  position: relative;
+
+  .scroll-view {
+    background-color: #fff;
+    color: #3D3D3D;
+    padding: 0 24rpx;
+    display: flex;
+    overflow-x: auto;
+    white-space: nowrap;
+    box-sizing: border-box;
+  }
+
+  .scroll-view-item {
+    display: inline-block;
+    width: calc(100% / 4);
+    height: 88rpx;
+    line-height: 88rpx;
+    text-align: center;
+    font-size: 24rpx;
+    font-weight: 350;
+    position: relative; /* 添加相对定位 */
+    box-sizing: border-box; /* 确保边框在总宽度内计算 */
+
+    &::after {
+      content: '';
+      display: inline-block;
+      width: 50%; /* 默认宽度为50% */
+      margin: 0 auto;
+      position: absolute;
+      bottom: 0;
+      left: 25%; /* 使其居中 */
+      height: 2rpx; /* 默认未选中的高度 */
+      background: #fff; /* 默认未选中的颜色 */
+      z-index: 1;
+    }
+
+    &.activite {
+      color: #1E92F0;
+
+      &::after {
+        background: #1E92F0;
+        height: 4rpx;
+        width: 50%;
+      }
+    }
+  }
+
+  .swiper_content {
+    background-color: #f2f2f2;
+    flex: 1;
+  }
+  .feedback-add-icon {
+	  position: absolute;
+	  bottom: 300rpx;
+	  right: 100rpx;
+	  width: 120rpx;
+	  height: 120rpx;
+	  @include flex-center;
+	  border-radius: 50%;
+	  background-color: #fff;
+	  box-shadow: 0px 4px 10px 0px rgba(216, 216, 216, 0.8),inset 0px 4px 10px 0px rgba(216, 216, 216, 0.3);
+	  .add-icon {
+		width: 60rpx;
+		height: 60rpx;
+	  }
+  }
+}
+</style>

+ 0 - 395
pages/index/CfAppraise.vue

@@ -1,395 +0,0 @@
-<template>
-	<view class="cf-appraise">
-		<pub-loading-view :loaded="loaded" height="100%">
-			<view class="cf-appraise-section" v-if="info">
-				<view class="cf-appraise-top-section">
-					<view class="cf-appraise-top">
-						<view class="cf-appraise-top-title">“中医用药一件事”满意度调查</view>
-						<view class="cf-appraise-top-comprehensive">
-							<view class="appraise-star-title">综合评价</view>
-							<view class="cf-appraise-top-comprehensive-item" :class="info.comprehensiveVal==1?'is-active':''"
-								@click="onClickComprehensive(1)">
-								<text class="iconfont">&#xe687;</text>差评
-							</view>
-							<view class="cf-appraise-top-comprehensive-item" :class="info.comprehensiveVal==2?'is-active':''"
-								@click="onClickComprehensive(2)">
-								<text class="iconfont">&#xe698;</text>中评
-							</view>
-							<view class="cf-appraise-top-comprehensive-item" :class="info.comprehensiveVal==3?'is-active':''"
-								@click="onClickComprehensive(3)">
-								<text class="iconfont">&#xe696;</text>好评
-							</view>
-						</view>
-						<CfAppraiseStar :isEdit="isEdit" title="就医效果" :starText="starText[0]" v-model:starval="info.starVal[0]" />
-						<CfAppraiseStar :isEdit="isEdit" title="开方医生" :starText="starText[1]" v-model:starval="info.starVal[1]" />
-						<CfAppraiseStar :isEdit="isEdit" title="煎药质量" :starText="starText[2]" v-model:starval="info.starVal[2]" />
-						<CfAppraiseStar :isEdit="isEdit" title="物流服务" :starText="starText[3]" v-model:starval="info.starVal[3]" />
-					</view>
-					<view class="cf-appraise-view" v-if="isEdit">
-						<view class="cf-appraise-view-text">{{info.text}}</view>
-						<view class="cf-appraise-view-imgs">
-							<uni-file-picker readonly :value="info.imgList" file-mediatype="image">
-							</uni-file-picker>
-						</view>
-					</view>
-					<view class="cf-appraise-edit" v-else>
-						<view class="cf-appraise-edit-textarea">
-							<!-- <textarea v-model="info.text" class="textarea" :disabled="false" placeholder-style="color:#B3B5B9"
-								maxlength="-1" placeholder="展开说说您对“中医用药一件事”的想法吧..." /> -->
-							<uni-easyinput class="pub-input" :inputBorder="false" autoHeight trim="all" :adjust-position="false"
-								type="textarea" maxlength="-1" v-model="info.text" placeholder="展开说说您对“中医用药一件事”的想法吧..."></uni-easyinput>
-						</view>
-						<!-- 最多三张 -->
-						<view class="picture-item">
-							<uni-file-picker class="file-picker" limit="3" :auto-upload="false" :del-icon="true"
-								file-extname='png,git,jpeg,pdf,jpg' file-mediatype="image" v-model="fileList" @select="onSelectFile"
-								@delete="onDelFile">
-								<view class="cf-appraise-edit-add">
-									<text class="iconfont">&#xe69f;</text>
-								</view>
-							</uni-file-picker>
-						</view>
-
-					</view>
-					<view class="cf-appraise-anonymous">
-						<view class="anonymous-text" @click="updateAnonymity">
-							<text class="iconfont" :class="info.anonymous?'is-active':''">&#xe63b;</text>匿名评价
-						</view>
-					</view>
-				</view>
-				<view class="cf-appraise-btn pub-button is-bg large" v-if="!isEdit" @click="onApply">提交评价</view>
-			</view>
-		</pub-loading-view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, PropType, watch } from 'vue'
-	import dlg from '@/lib/dlg.ts'
-	import rest from '@/stores/rest'
-
-
-	import CfAppraiseStar from './CfAppraiseStar.vue'
-
-	const emits = defineEmits(['update'])
-	const props = defineProps({
-		ptwybh: {
-			type: String,
-			default: ""
-		},
-		dataList: {
-			type: Object as PropType<any>,
-			default: () => ({})
-		},
-		isEdit: {
-			type: Boolean,
-			default: false
-		}
-	})
-
-
-	const loaded = ref(false)
-	const starText = [
-		['', '无效健康', '较差健康', '一般健康', '基本健康', '完全康复'],
-		['', '非常差', '差', '一般', '好', '非常好'],
-		['', '非常差', '差', '一般', '好', '非常好'],
-		['', '非常差', '差', '一般', '好', '非常好'],
-	]
-	const info = ref({
-		starVal: [0, 0, 0, 0],
-		comprehensiveVal: 3,
-		text: '',
-		imgList: [],
-		anonymous: true
-	})
-	const fileList = ref([])//用于显示图片列表
-	const files = ref([]) //上传post
-
-	// 上传图片
-	const onSelectFile = async (res) => {
-		if (!res.tempFilePaths.length) return;
-		uni.showLoading({
-			title: '正在上传...',
-			mask: true
-		});
-		for (var i = 0; i < res.tempFilePaths.length; i++) {
-			let uploadedFile = await rest.upload(res.tempFilePaths[i]);
-
-			if (!uploadedFile) {
-				dlg.error("上传失败,请重试!");
-				uni.hideLoading();
-				return;
-			}
-			files.value.push(uploadedFile);
-		}
-		uni.hideLoading();
-	}
-
-	// 删除图片
-	const onDelFile = (val) => {
-		if (val.index != -1) {
-			files.value.splice(val.index, 1);
-		}
-	}
-	// 修改
-	const updateAnonymity = () => {
-		if (props.isEdit) return
-		info.value.anonymous = !info.value.anonymous
-	}
-
-	const onClickComprehensive = (val : number) => {
-		if (props.isEdit) return
-		info.value.comprehensiveVal = val
-	}
-
-
-	const onApply = async () => {
-		const formData = {
-			orderId: props.ptwybh,
-			zhpj: info.value.comprehensiveVal,
-			jyxg: info.value.starVal[0],
-			kfys: info.value.starVal[1],
-			jyzl: info.value.starVal[2],
-			wlfw: info.value.starVal[3],
-			content: info.value.text,
-			image: JSON.stringify(files.value),
-			anonymity: info.value.anonymous ? 1 : 0
-		}
-		info.value.imgList = files.value
-		let fields = {
-			'orderId': '订单ID不能为空',
-			'zhpj': '综合评价不能为空',
-			'jyxg': '就医效果不能为空',
-			'kfys': '开方医生不能为空',
-			'jyzl': '煎药质量不能为空',
-			'wlfw': '物流服务不能为空'
-		};
-		for (let key in fields) {
-			if (!formData[key]) {
-				dlg.error(fields[key]);
-				return;
-			}
-		}
-		console.log("processedData", formData, files.value)
-		await rest.post('/app-api/zyyp/prescription-evaluate/create', formData)
-		dlg.success('操作成功')
-		emits('update');
-	}
-
-	const getInfo = async () => {
-		info.value.comprehensiveVal = props.dataList.zhpj
-		info.value.starVal = [props.dataList.jyxg, props.dataList.kfys, props.dataList.jyzl, props.dataList.wlfw]
-		info.value.text = props.dataList.content
-		info.value.imgList = props.dataList.imgList.map((item : string) => {
-			return { url: item }
-		})
-		info.value.anonymous = props.dataList.anonymity == 1 ? true : false
-	}
-
-	watch(() => props.isEdit, (newValue) => {
-		if (newValue) {
-			getInfo();
-		}
-	}, { immediate: true });
-
-	watch(() => props.dataList, (newValue) => {
-		if (props.isEdit) {
-			getInfo();
-		}
-	}, { immediate: true });
-</script>
-
-<style lang="scss" scoped>
-	.cf-appraise {
-		padding: 0 $page-row-spacing;
-		height: 100%;
-
-		.cf-appraise-section {
-			height: 100%;
-			position: relative;
-			display: flex;
-			flex-direction: column;
-
-			.cf-appraise-top-section {
-				flex: 1;
-				box-sizing: border-box;
-				overflow-y: auto;
-				min-height: 300rpx;
-
-				.cf-appraise-top {
-					background: #fff;
-					padding: $uni-spacing-col-s3 $page-row-spacing;
-					border-radius: 8rpx;
-
-					.cf-appraise-top-title {
-						text-align: center;
-						font-size: $uni-font-size-xl;
-						line-height: $uni-line-height-xl;
-						font-weight: 600;
-					}
-
-					.cf-appraise-top-comprehensive {
-						@include flex;
-						margin-top: 40rpx;
-
-						.cf-appraise-top-comprehensive-item {
-							margin-left: 48rpx;
-							@include flex;
-							color: $uni-text-color-light;
-
-							.iconfont {
-								font-size: 48rpx;
-								margin-right: 8rpx;
-								background: linear-gradient(180deg, #B3B5B9 0%, #899AB9 100%);
-								background-clip: text;
-								text-fill-color: transparent;
-								-webkit-background-clip: text;
-								-webkit-text-fill-color: transparent;
-							}
-
-							&:nth-child(2) {
-								margin-left: 32rpx;
-							}
-
-							&.is-active {
-								color: $uni-text-color;
-
-								.iconfont {
-									background: linear-gradient(180deg, #FFBD48 0%, $uni-color-orange 100%);
-									background-clip: text;
-									text-fill-color: transparent;
-									-webkit-background-clip: text;
-									-webkit-text-fill-color: transparent;
-								}
-							}
-						}
-					}
-				}
-
-				.cf-appraise-view {
-					background: #fff;
-					padding: $uni-spacing-col-s2 $uni-spacing-row-s3 $uni-spacing-col-s4;
-					border-radius: 8rpx;
-					margin-top: 24rpx;
-
-					.cf-appraise-view-imgs {
-						margin-top: 16rpx;
-
-						image {
-
-							width: 200rpx !important;
-							height: 200rpx !important;
-							border-radius: 8rpx;
-
-							&+image {
-								margin-left: 16rpx;
-							}
-						}
-					}
-				}
-
-				.cf-appraise-edit {
-					background: #fff;
-					padding: $uni-spacing-col-s4 $uni-spacing-row-s4;
-					border-radius: 8rpx;
-					margin-top: 24rpx;
-					color: $uni-text-color;
-
-					.cf-appraise-edit-textarea {
-						.textarea {
-							width: 100%;
-							height: 256rpx;
-							font-size: $uni-font-size-lg;
-							line-height: $uni-line-height-lg;
-
-							:deep(.uni-textarea-placeholder) {
-								color: $uni-text-color-light !important;
-							}
-						}
-
-						:deep(.uni-easyinput__content-textarea) {
-							margin: 8rpx 0 4rpx;
-							height: 120rpx;
-							min-height: 120rpx;
-
-							.uni-easyinput__placeholder-class {
-								font-size: $uni-font-size-lg;
-								line-height: $uni-line-height-lg;
-								color: $uni-text-color-light;
-							}
-
-							.uni-textarea-textarea {
-								font-size: $uni-font-size-lg;
-								line-height: $uni-line-height-lg;
-								color: $uni-text-color;
-							}
-						}
-					}
-
-					.picture-item {
-						margin-top: 32rpx;
-
-						.file-picker {
-							.cf-appraise-edit-add {
-								@include flex-center;
-								width: 200rpx;
-								height: 200rpx;
-								background: linear-gradient(0deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), #1E92F0;
-
-								.iconfont {
-									font-size: 76rpx;
-									color: $uni-color-primary;
-								}
-							}
-						}
-					}
-
-					.echoPicture {
-						margin-top: 16rpx;
-						display: flex;
-						flex-wrap: wrap;
-						padding-left: 2px;
-
-						.loop-item {
-							.image-sty {
-								height: 200rpx;
-								width: 200rpx;
-								margin: 5px 2px 0 0px;
-							}
-						}
-					}
-				}
-
-				.cf-appraise-anonymous {
-					display: flex;
-					margin: $uni-spacing-col-s4 0 $uni-spacing-col-s4 $uni-spacing-row-s4;
-
-					// font-size: $uni-font-size-sm;
-					// line-height: $uni-line-height-lg;
-					.anonymous-text {
-						@include flex;
-						flex-wrap: 0;
-					}
-
-					.iconfont {
-						margin-right: 16rpx;
-						font-size: 40rpx;
-						background: linear-gradient(180deg, #B3B5B9 0%, #899AB9 100%);
-						background-clip: text;
-						text-fill-color: transparent;
-						-webkit-background-clip: text;
-						-webkit-text-fill-color: transparent;
-
-						&.is-active {
-							background: linear-gradient(180deg, #46ACFF 0%, $uni-color-primary 100%);
-							background-clip: text;
-							text-fill-color: transparent;
-							-webkit-background-clip: text;
-							-webkit-text-fill-color: transparent;
-
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 73
pages/index/CfAppraiseStar.vue

@@ -1,73 +0,0 @@
-<template>
-	<view class="appraise-star">
-		<view class="appraise-star-title">{{title}}</view>
-		<view class="appraise-star-star" v-for="item in 5" :key="item" @click="onClickStar(item)">
-			<text class="iconfont" :class="item<=starval?'is-active':''">&#xe652;</text>
-		</view>
-		<view class="appraise-star-text" v-if="starText&&starval">{{starText[starval]}}</view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, PropType, onMounted, computed } from 'vue'
-
-	const emit = defineEmits(['update:starval'])
-	const props = defineProps({
-		isEdit: Boolean,
-		title: String,
-		starval: Number,
-		starText: {
-			type: Array as PropType<string[]>
-		},
-	})
-
-	const starval = computed({
-		get() {
-			return props.starval
-		},
-		set(val) {
-			emit('update:starval', val)
-		},
-	})
-
-	const onClickStar = (cur : number) => {
-		if (props.isEdit) return
-		starval.value = cur
-		console.log("curVal.value", starval.value)
-	}
-
-	onMounted(() => {
-
-	})
-</script>
-
-<style lang="scss" scoped>
-	.appraise-star {
-		@include flex;
-		margin-top: 32rpx;
-
-		.appraise-star-star {
-			margin-left: 24rpx;
-
-			.iconfont {
-				font-size: 48rpx;
-				background: linear-gradient(180deg, #B3B5B9 0%, #899AB9 100%);
-				background-clip: text;
-				text-fill-color: transparent;
-				-webkit-background-clip: text;
-				-webkit-text-fill-color: transparent;
-
-				&.is-active {
-					background: linear-gradient(180deg, #46ACFF 0%, $uni-color-primary 100%);
-					background-clip: text;
-					text-fill-color: transparent;
-					-webkit-background-clip: text;
-					-webkit-text-fill-color: transparent;
-				}
-			}
-		}
-
-		.appraise-star-text {
-			margin-left: 24rpx;
-		}
-	}
-</style>

+ 0 - 142
pages/index/CfContent.vue

@@ -1,142 +0,0 @@
-<template>
-	<view class="cf-content">
-		<pub-loading-view :loaded="loaded" height="100%">
-			<view class="cf-content-section" v-if="dataList">
-				<view class="cf-content-title">{{dataList.hosName}}</view>
-				<view class="cf-content-info">
-					<view class="cf-content-info-left">
-						<view class="label">患者</view>
-						<view>{{dataList.name}}</view>
-						<view>{{dataList.sex}}</view>
-						<view>{{dataList.age}}</view>
-					</view>
-					<view class="cf-content-info-right">
-						<view class="label">处方号</view>
-						<view>{{dataList.cfNo}}</view>
-					</view>
-				</view>
-				<view class="cf-content-list">
-					<view class="cf-content-item" v-for="item in dataList.list" :key="item">
-						<view>{{item.ypmc}}</view>
-						<view>{{ item.jl+item.ypdw }}</view>
-					</view>
-				</view>
-				<view class="cf-content-total">
-					<view>{{dataList.ts}}</view>
-					<view>{{dataList.fs}}</view>
-					<view>{{dataList.kd}}</view>
-				</view>
-				<view class="cf-content-doctor">
-					<view class="cf-content-doctor-left">
-						<view>医生:</view>
-						<view>{{dataList.doctor}}</view>
-					</view>
-					<view>{{dataList.date}}</view>
-				</view>
-				<view class="cf-content-note">{{dataList.note}}</view>
-			</view>
-		</pub-loading-view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, PropType } from 'vue'
-
-	const props = defineProps({
-		dataList: {
-			type: Object as PropType<any>,
-			default: () => ({})
-		},
-	})
-	const loaded = ref(false)
-</script>
-
-<style lang="scss" scoped>
-	.cf-content {
-		background: #fff;
-		padding: $uni-spacing-col-s3 $page-row-spacing;
-		height: 100%;
-		box-sizing: border-box;
-		overflow-y: auto;
-		text-align: center;
-
-		.cf-content-title {
-			font-size: $uni-font-size-xl;
-			line-height: $uni-line-height-xl;
-			font-weight: 600;
-		}
-
-		.cf-content-info {
-			@include flex-between;
-			border-bottom: 1px dashed $uni-border-color;
-			padding: 32rpx 24rpx;
-
-			.label {
-				color: $uni-text-color-grey;
-			}
-
-			.cf-content-info-left,
-			.cf-content-info-right {
-				@include flex;
-
-				>view {
-					&+view {
-						margin-left: 16rpx;
-					}
-				}
-			}
-		}
-
-		.cf-content-list {
-			display: flex;
-			flex-wrap: wrap;
-			padding: 20rpx 16rpx 20rpx;
-
-			.cf-content-item {
-				font-size: $uni-font-size-base;
-				line-height: $uni-line-height-base;
-				font-weight: 600;
-				margin: 20rpx 8rpx;
-				width: calc((100% - 48rpx)/3);
-				text-align: left;
-				display: flex;
-
-				>view {
-					&+view {
-						margin-left: 8rpx;
-					}
-				}
-			}
-		}
-
-		.cf-content-total {
-			@include flex;
-			padding: 0 24rpx 40rpx;
-			border-bottom: 1px dashed $uni-border-color;
-			color: $uni-text-color-grey;
-
-			>view {
-				&+view {
-					margin-left: 32rpx;
-				}
-			}
-		}
-
-		.cf-content-doctor {
-			// color: $uni-text-color-light;
-			padding: 16rpx 24rpx 40rpx;
-			@include flex-between;
-
-			.cf-content-doctor-left {
-				@include flex;
-			}
-		}
-
-		.cf-content-note {
-			color: $uni-text-color-light;
-			padding: 0 24rpx 32rpx;
-			text-align: left;
-			font-size: $uni-font-size-sm;
-			line-height: $uni-line-height-sm;
-		}
-	}
-</style>

+ 0 - 193
pages/index/CfLogistics.vue

@@ -1,193 +0,0 @@
-<template>
-	<view class="cf-logistics">
-		<pub-loading-view :loaded="loaded" height="100%">
-			<view class="no-data" v-if="!dataList.no || dataList.statusList.length == 0">
-				<image mode="heightFix" src="/static/image/no-data.png" />
-				暂无数据
-			</view>
-			<view v-else>
-				<view class="cf-logistics-top">
-					<view class="icon"><text class="iconfont">&#xe674;</text></view>
-					{{dataList.no}}
-					<view class="copy-icon" @click="onCopy(dataList.no)"> <text class="iconfont">&#xe620;</text></view>
-				</view>
-				<view class="logistics-list">
-					<view class="logistics-item" :class="item.className" v-for="item in dataList.statusList" :key="item.id">
-						<view class="logistics-item-left">
-							<view class="icon" v-if='item.icon'>
-								<text class="iconfont">&#xe602;</text>
-							</view>
-							<view class="icon" :class="item.className" v-else-if="item.className=='is-finish'">
-								收
-							</view>
-							<view class="dot" v-else></view>
-							<view class="line"></view>
-						</view>
-						<view class="logistics-item-right">
-							<view class="logistics-item-title" v-if="item.title">{{item.title}}</view>
-							<view class="logistics-item-time">{{item.time}}</view>
-							<view>{{item.message}}</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</pub-loading-view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, onMounted, PropType } from 'vue'
-
-	const props = defineProps({
-		dataList: {
-			type: Object as PropType<any>,
-			default: () => ({})
-		},
-	})
-
-
-	const loaded = ref(false)
-
-	const onCopy = (value : string) => {
-		uni.setClipboardData({
-			data: value, //要被复制的内容
-			success: () => { //复制成功的回调函数
-				uni.showToast({ //提示
-					title: '复制成功'
-				})
-			}
-		});
-	}
-
-	onMounted(() => {
-	})
-</script>
-
-<style lang="scss" scoped>
-	.cf-logistics {
-		background: #fff;
-		padding: $uni-spacing-col-s3 $page-row-spacing;
-		height: 100%;
-		box-sizing: border-box;
-		overflow-y: auto;
-
-		.icon {
-			width: 64rpx;
-			height: 64rpx;
-			background: $uni-bg-icon;
-			border-radius: 50%;
-			@include flex-center;
-
-			.iconfont {
-				background: linear-gradient(180deg, #46ACFF 0%, $uni-color-primary 100%);
-				background-clip: text;
-				text-fill-color: transparent;
-				-webkit-background-clip: text;
-				-webkit-text-fill-color: transparent;
-			}
-		}
-
-		.cf-logistics-top {
-			@include flex;
-			margin-bottom: 32rpx;
-
-			.icon {
-				background: $uni-color-primary-light;
-				margin-right: 24rpx;
-			}
-
-			.copy-icon {
-				margin-left: 16rpx;
-			}
-		}
-
-		.logistics-list {
-			overflow-y: auto;
-			flex: 1;
-
-			height: calc(100% - 96rpx);
-
-			.logistics-item {
-				color: $uni-text-color-grey;
-				display: flex;
-				min-height: 140rpx;
-
-
-				.logistics-item-left {
-					@include flex;
-					flex-direction: column;
-					margin-right: 24rpx;
-
-					.icon {
-						.iconfont {
-							background: linear-gradient(180deg, #C2CFE7 0%, #899AB9 100%);
-							background-clip: text;
-							text-fill-color: transparent;
-							-webkit-background-clip: text;
-							-webkit-text-fill-color: transparent;
-						}
-
-						&.is-finish {
-							background: $uni-color-primary;
-							color: #fff;
-						}
-					}
-
-					.dot {
-						width: 24rpx;
-						height: 24rpx;
-						background: $uni-border-color;
-						border-radius: 50%;
-						margin: 0 20rpx;
-					}
-
-					.line {
-						flex: 1;
-						// width: 1px;
-						border-left: 1px dashed $uni-border-color;
-						margin: 12rpx 0;
-					}
-				}
-
-				.logistics-item-right {
-					margin-bottom: 32rpx;
-					font-size: 24rpx;
-					line-height: $uni-line-height-sm;
-
-					.logistics-item-title {
-						font-size: 28rpx;
-						line-height: $uni-line-height-base;
-						margin-bottom: 8rpx;
-					}
-
-					.logistics-item-time {
-						margin-bottom: 8rpx;
-					}
-				}
-
-				&.is-finish {
-					.logistics-item-left {
-						.line {
-							border-left: 1px dashed $uni-color-primary;
-						}
-					}
-
-					.logistics-item-right {
-						color: $uni-text-color;
-
-						.logistics-item-title {
-							font-weight: 800;
-						}
-					}
-				}
-
-				&:last-child {
-					.logistics-item-left {
-						.line {
-							display: none;
-						}
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 120
pages/index/CfStatus.vue

@@ -1,120 +0,0 @@
-<template>
-	<view class="cf-status">
-		<pub-loading-view :loaded="loaded" height="100%">
-			<view class="status-item" :class="item.isCur?'is-current':''" v-for="(item,index) in dataList" :key="index">
-				<view class="status-item-left">
-					<view class="icon">
-						<text class="iconfont">{{ item.icon }}</text>
-					</view>
-					<view class="line"></view>
-				</view>
-				<view class="status-item-right">
-					<view class="status-item-title">{{item.title}}</view>
-					<view>{{item.time}}</view>
-				</view>
-			</view>
-		</pub-loading-view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, PropType, onMounted } from 'vue'
-
-	import { cfStatusVO } from '../../lib/type';
-
-
-	const props = defineProps({
-		ptwybh: {
-			type: String,
-			default: ""
-		},
-		dataList: {
-			type: Array as PropType<cfStatusVO[]>,
-			default: () => []
-		},
-	})
-
-	const loaded = ref(false)
-
-	onMounted(() => {
-	})
-</script>
-
-<style lang="scss" scoped>
-	.cf-status {
-		background: #fff;
-		padding: $uni-spacing-col-s3 $page-row-spacing;
-		height: 100%;
-		box-sizing: border-box;
-		overflow-y: auto;
-
-		.status-item {
-			color: $uni-text-color-grey;
-			display: flex;
-			height: 140rpx;
-
-			.status-item-left {
-				@include flex;
-				flex-direction: column;
-				margin-right: 24rpx;
-
-				.icon {
-					width: 64rpx;
-					height: 64rpx;
-					background: $uni-bg-icon;
-					border-radius: 50%;
-					@include flex-center;
-
-
-					.iconfont {
-						background: linear-gradient(180deg, #46ACFF 0%, $uni-color-primary 100%);
-						background-clip: text;
-						text-fill-color: transparent;
-						-webkit-background-clip: text;
-						-webkit-text-fill-color: transparent;
-						font-size: 40rpx;
-					}
-				}
-
-				.line {
-					flex: 1;
-					// width: 1px;
-					border-left: 1px solid $uni-border-color;
-					margin: 12rpx 0;
-				}
-			}
-
-			.status-item-right {
-				.status-item-title {
-					font-size: $uni-font-size-lg;
-					line-height: $uni-line-height-lg;
-					margin-bottom: 8rpx;
-				}
-			}
-
-			&.is-current {
-				.status-item-left {
-					.line {
-						border-left: 1px dashed $uni-color-primary;
-					}
-				}
-
-				.status-item-right {
-					color: $uni-text-color;
-
-					.status-item-title {
-						font-size: 32rpx;
-						font-weight: 800;
-					}
-				}
-			}
-
-			&:last-child {
-				.status-item-left {
-					.line {
-						display: none;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 224
pages/index/TopCard.vue

@@ -1,224 +0,0 @@
-<template>
-	<top-card-skeleton v-if="loading" :loading="loading"></top-card-skeleton>
-	<view class="top-card" v-else>
-		<view height="100%">
-			<view class="card-top" v-if="info">
-				<image :src="info.sex == '男' ? '/static/image/avatar_man.png' : '/static/image/avatar_woman.png'" mode="heightFix" />
-				<view class="card-top-right">
-					<view class="card-top-right-name">{{info.name}}<text class="iconfont"
-							@click="onClick">{{ showIcon ? '&#xe901;' : '&#xe8bf;' }}</text></view>
-					<view>{{info.addr}}<text class="iconfont" @click="jumpAddress">&#xe6ae;</text></view>
-					<view class="card-top-right-sex">{{info.sex}} | {{info.text}}</view>
-				</view>
-			</view>
-			<view class="card-bottom" v-if="info">
-				<view>
-					<view class="label">证件号码</view>
-					<view>{{info.idCard}}</view>
-				</view>
-				<view class="second">
-					<view class="label">最近就诊</view>
-					<view>{{info.date}}</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-<script lang="ts" setup>
-	import { ref, onMounted, PropType } from 'vue'
-	import rest from '@/stores/rest'
-	import { onLoad, onShow } from "@dcloudio/uni-app";
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption";
-	import * as link from '@/lib/link'
-	import {
-		formatDate,
-		getSexByCardNo,
-		maskCardNo,
-		maskName,
-	} from '@/lib/util'
-	import { BasicInfoVO } from '@/lib/type';
-	import { globalState } from '@/lib/util'
-
-	const props = defineProps({
-		data: {
-			type: Object as PropType<any>,
-			default: () => ({})
-		},
-	})
-
-
-	const showIcon = ref(true)
-	const originalInfo = ref({
-		name: '',
-		address: '',
-		addressDetails: '',
-		addr: '',
-		sex: '',
-		text: '近六个月就诊记录',
-		idCard: '',
-		date: ''
-	})
-	const info = ref({ ...originalInfo.value })
-	const dataList = ref({
-		hzsfzh: '',
-		hzxm: '',
-	})
-	const loading = ref(true)
-
-	const onClick = () => {
-		showIcon.value = !showIcon.value
-		globalState.showIcon = showIcon.value
-		onUpdate(showIcon.value)
-	}
-
-
-	// 地址信息拼接
-	const addressInfSplice = (basic : string, details : string, isShow) => {
-		if (isShow) {
-			return basic + details;
-		} else {
-			if (basic) {
-				return basic + '*'.repeat(details.length);
-			} else {
-				//别的地方新增的地址没有basic,只有details,查找‘区’,有则隐藏区后的值,无则显示一半的地址
-				let index = details.indexOf('区');
-				if (index == -1) {
-					index = Math.floor(details.length / 2)
-				}
-				let firstStr = details.substring(0, index + 1)
-				let nextStr = details.substring(index + 1)
-				return firstStr + '*'.repeat(nextStr.length)
-			}
-		}
-	}
-
-	const getInfo = async () => {
-		loading.value = true
-		let addressInfo = await rest.get('/default/consignee-info/list', { hzid: dataList.value.hzsfzh }) as BasicInfoVO
-		
-
-		originalInfo.value.name = dataList.value.hzxm
-		originalInfo.value.sex = getSexByCardNo(dataList.value.hzsfzh)
-		originalInfo.value.idCard = dataList.value.hzsfzh
-		originalInfo.value.date = globalState.lastVisitDate
-
-
-		if (Array.isArray(addressInfo.list) && addressInfo.list.length > 0) {
-			const firstAddressInfo = addressInfo.list[0]
-			originalInfo.value.address = `${firstAddressInfo.province || ''}${firstAddressInfo.city || ''}${firstAddressInfo.area || ''}`
-			originalInfo.value.addressDetails = firstAddressInfo.shrdzxxdz
-		}
-		onUpdate(showIcon.value)
-		loading.value = false
-	}
-
-	const onUpdate = (isMasked : boolean) => {
-		Object.assign(info.value, {
-			name: isMasked ? maskName(originalInfo.value.name) : originalInfo.value.name,
-			addr: addressInfSplice(originalInfo.value.address, originalInfo.value.addressDetails, !isMasked),
-			idCard: isMasked ? maskCardNo(originalInfo.value.idCard) : originalInfo.value.idCard,
-			sex: getSexByCardNo(originalInfo.value.idCard),
-			date: originalInfo.value.date
-		})
-	}
-
-	const jumpAddress = () => {
-		link.goAddressList(aesEncrypt(originalInfo.value.idCard))
-	}
-
-
-	onShow(() => {
-		showIcon.value = globalState.showIcon
-		dataList.value.hzxm = props.data.hzxm
-		dataList.value.hzsfzh = props.data.zjhm
-		setTimeout(() => getInfo(), 5)
-		// console.log("内容",loaded.value)
-	})
-</script>
-
-<style lang="scss" scoped>
-	.top-card {
-		border-radius: 0px 0px $uni-spacing-row-s2 $uni-spacing-row-s2;
-		background: $uni-color-primary;
-		padding: $uni-spacing-col-s2 $page-row-spacing $uni-spacing-col-s4;
-		border: 1px solid $uni-border-color;
-		min-height: 340rpx;
-
-		.card-top {
-			@include flex;
-			margin-bottom: $uni-spacing-col-s4;
-			color: #fff;
-
-			image {
-				width: 140rpx;
-				height: 140rpx;
-				display: block;
-				margin-right: $uni-spacing-row-s4;
-			}
-
-			.card-top-right {
-				flex: 1;
-				line-height: $uni-line-height-base;
-
-				.iconfont {
-					margin-left: 8rpx;
-				}
-
-				.card-top-right-name {
-					font-size: $uni-font-size-xxl;
-					line-height: $uni-line-height-xxl;
-					display: flex;
-					align-items: center;
-
-					.iconfont {
-						line-height: $uni-line-height-xxxl;
-						font-size: 32rpx;
-					}
-				}
-
-				.card-top-right-sex {
-					font-size: $uni-font-size-sm;
-					line-height: $uni-line-height-sm;
-				}
-			}
-		}
-
-		.card-bottom {
-			background-color: #fff;
-			color: $uni-text-color;
-			border-radius: $uni-spacing-row-s2;
-			padding: $uni-spacing-row-s4;
-			line-height: $uni-line-height-base;
-			@include flex;
-
-			>view {
-				flex: 1;
-				@include flex;
-				flex-direction: column;
-			}
-
-			.label {
-				color: $uni-text-color-grey;
-				margin-bottom: 24rpx;
-			}
-
-			.second {
-				position: relative;
-				flex: 0.8;
-
-				&::before {
-					content: '';
-					position: absolute;
-					left: 0;
-					background: $uni-border-color;
-					width: 1px;
-					height: 100rpx;
-					-webkit-transform: scaleX(0.5);
-					transform: scaleX(0.5);
-					-webkit-transform-origin: 0 0;
-					transform-origin: 0 0;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 277
pages/index/index.vue

@@ -1,277 +0,0 @@
-<template>
-	<view class="home">
-		<TopCard :data="userInfo" />
-		<!-- tab导航栏 -->
-		<view class="tabs">
-			<view v-for="(item, index) in navList" :key="index" class="tab" :class="{'is-active': tabCurId === item.id}"
-				@click="tabClick(index)">
-				{{item.text}}
-			</view>
-		</view>
-		<swiper :current="tabCurId" class="swiper-box" duration="300" @change="onChangeTab">
-			<swiper-item class="tab-content" v-for="(_tabItem,tabIndex) in navList" :key="tabIndex">
-				<CfStatus v-if="tabCurId==0" :dataList="cfztDataList" />
-				<CfLogistics v-if="tabCurId==1" :dataList="wlxxDataList" />
-				<CfContent v-if="tabCurId==2" :dataList="cfnrDataList" />
-				<CfAppraise v-if="tabCurId==3" :ptwybh="ptwybh" :dataList="cfpjDataList" :isEdit="isEdit" @update="getCfEvaluate" />
-			</swiper-item>
-		</swiper>
-	</view>
-</template>
-
-<script lang="ts" setup>
-	import { nextTick, ref } from 'vue'
-	import { onLoad } from "@dcloudio/uni-app";
-	import rest from '@/stores/rest'
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption";
-	import { CfStatusVO,CfLogisticsVO,RecipeContentVO, EvaluateVO } from '../../lib/type';
-
-	import {
-		formatDate,
-		filterStateTitle ,
-		filterStateIcon,
-		filterLogisticsTitle,
-		getSexByCardNo,
-		getAgeByCardNo,
-		DictLabelFYFSYF,
-		DictLabelFYFSLX,
-		maskName,
-		} from '@/lib/util'
-	import TopCard from './TopCard.vue'
-	import CfStatus from './CfStatus.vue'
-	import CfLogistics from './CfLogistics.vue'
-	import CfContent from './CfContent.vue'
-	import CfAppraise from './CfAppraise.vue'
-
-	
-	const ptwybh = ref('')
-	const topCardRef = ref()
-	
-	const tabCurId = ref(0)//当前tab选中Id
-	// const loaded = ref(false)
-	// const status = ref('loading')
-	// const loadText = ref('数据加载中...')
-	const navList = ref([{
-		id: 0,
-		text: '处方状态',
-	},
-	{
-		id: 1,
-		text: '物流信息',
-	},
-	{
-		id: 2,
-		text: '处方内容',
-	},
-	{
-		id: 3,
-		text: '处方评价',
-	}
-	])
-	const userInfo = ref({
-		zjhm: '',
-		hzxm:'',
-	})
-	const cfztDataList = ref([]) // 处方状态
-	const wlxxDataList = ref({ // 物流信息
-		no: '',
-		statusList: [],
-	})
-	const cfnrDataList = ref({}) // 处方内容
-	const cfpjDataList = ref({ // 处方评价
-		orderId: null, //订单id
-		zhpj:null,
-		jyxg: null,
-		kfys: null,
-		jyzl: null,
-		wlfw: null,
-		content: null,
-		imgList: [],
-		anonymity: 1
-	})
-	const isEdit = ref(false) // 是否评价
-
-	const swiperBoxStyle = () => {
-		let _h = `calc(100% - 72rpx - 
-	cfListDtos: boolean;${topCardRef.value?.offsetHeight})`;
-		console.log("_h", _h)
-		return {
-			height: '200px',
-		};
-	};
-
-	//顶部tab点击
-	const tabClick = (idx : number) => {
-		if (tabCurId.value !== idx) { 
-			tabCurId.value = idx; 
-			getData();
-		}
-	}
-	//滑动标签页
-	const onChangeTab = (e) => {
-		let _inx = e.detail.current;
-		tabClick(_inx);
-	}
-	
-	const getData = async ()=> {
-		switch (tabCurId.value) {
-			case 0:
-				getCfStatusData()
-				break;
-			case 1:
-				getLogisticsInfo()
-				break;
-			case 2:
-				getCfContent()
-				break;
-			case 3:
-				getCfEvaluate()
-				break;
-		}
-	}
-	
-	const getCfStatusData = async ()=> {
-		try {
-			cfztDataList.value = []
-			let statusRes = await rest.get('/app-api/bmfw/findCfStatus',{ptwybh:ptwybh.value}) as CfStatusVO
-			let res = statusRes.statusList
-			for (let i = 0; i < res.length; i++) {
-				let cflist = { time: '',title:'',icon:'',createTime:'',isCur: false }
-				if (res[i].prescriptionOperationType != '22'){
-					cflist.time = formatDate(res[i].createTime,'{y}-{m}-{d} {h}:{i}')
-					cflist.title = filterStateTitle(res[i].prescriptionOperationType)
-					cflist.icon = filterStateIcon(res[i].prescriptionOperationType)
-					cflist.createTime = res[i].createTime
-					cfztDataList.value.push(cflist)
-				}
-			}
-			cfztDataList.value.sort((a, b) => b.createTime - a.createTime)
-			if (cfztDataList.value.length > 0) { 
-				cfztDataList.value[0].isCur = true
-			}
-		}catch (e) {
-			console.log(e);
-		}
-	}
-	
-	const getLogisticsInfo = async()=> {
-		try {
-			let res = await rest.get('/app-api/bmfw/findCfWl',{ptwybh:ptwybh.value}) as CfLogisticsVO
-			for (let i = 0; i < res.cfList.length; i++) {
-				let msgList = JSON.parse(res.cfList[i].msg)
-				for (let j = 0; j< msgList.length;j++){
-					let listWl = {  time: '',title:'',icon:'',message:'' }
-					listWl.time = msgList[j].time2
-					listWl.title = filterLogisticsTitle(msgList[j].wlzt)
-					listWl.icon = '\ue674'
-					listWl.message = msgList[j].context
-					wlxxDataList.value.statusList.push(listWl)
-				}
-				wlxxDataList.value.no = res.cfList[i].ydh
-			}
-		}catch (e) {
-			console.log(e);
-		}
-	}
-	
-	
-	const getCfContent = async()=> {
-		try{
-			let res = await rest.get('/app-api/bmfw/findCfYp',{ptwybh:ptwybh.value}) as RecipeContentVO
-			cfnrDataList.value = {
-				hosName: res.yljgmc,
-				name: res.patient.hzxm,
-				sex: getSexByCardNo(res.patient.zjhm),
-				age: `${getAgeByCardNo(res.patient.zjhm)}岁`,
-				cfNo: `#${res.yncfbh}`,
-				list: res.detail,
-				ts: `${res.cfts}贴`,
-				fs: DictLabelFYFSYF(res.fyfsyf),
-				kd: DictLabelFYFSLX(res.fyfslx),
-				doctor: maskName(res.doctor?.nickname),
-				date: formatDate(res.createTime, '{y}-{m}-{d} {h}:{i}'),
-				note: '根据卫生部《处方管理办法》规定,处方当日有效除药品质量原因外,药品一经发出,不得退换'
-			}
-		}catch (e) {
-			console.log(e);
-		}
-	}
-	
-
-	const getCfEvaluate = async()=> {
-		try{
-			let res = await rest.get(
-				'/app-api/zyyp/prescription-evaluate/getByOrderId',
-				{ orderId:ptwybh.value },
-			) as EvaluateVO
-			if (res){
-				isEdit.value = true
-				cfpjDataList.value.orderId =  ptwybh.value
-				cfpjDataList.value.zhpj =  res.zhpj
-				cfpjDataList.value.jyxg =  res.jyxg
-				cfpjDataList.value.kfys =  res.kfys
-				cfpjDataList.value.jyzl =  res.jyzl
-				cfpjDataList.value.wlfw =  res.wlfw
-				cfpjDataList.value.imgList = res.image ? JSON.parse(res.image) : [];
-				cfpjDataList.value.content =  res.content
-				cfpjDataList.value.anonymity = res.anonymity
-			}
-		}catch (e) {
-			console.log(e);
-		}
-	}
-	
-
-	onLoad((data) => {
-		ptwybh.value = aesDecrypt(data.ptwybh)
-		userInfo.value.zjhm = aesDecrypt(data.hzsfzh)
-		userInfo.value.hzxm = aesDecrypt(data.hzxm)
-		getData();
-	})
-</script>
-
-<style lang="scss" scoped>
-	.home {
-		display: flex;
-		flex-direction: column;
-		height: 100%;
-
-		.tabs {
-			margin: $uni-spacing-row-s4 0 $uni-spacing-row-s3;
-			height: 88rpx;
-			background-color: #fff;
-			padding: 0 24rpx;
-			@include flex-between;
-
-			.tab {
-				height: 100%;
-				@include flex-center;
-
-				&.is-active {
-					color: $uni-color-primary;
-					position: relative;
-
-					&::after {
-						content: '';
-						position: absolute;
-						bottom: 0;
-						left: 0;
-						background: $uni-color-primary;
-						width: 100%;
-						height: 4rpx;
-					}
-				}
-			}
-		}
-
-		.swiper-box {
-			flex: 1;
-
-			.tab-content {
-				:deep(.pub-loading) {
-					height: 100%;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 132
pages/login/index.vue

@@ -1,132 +0,0 @@
-<template>
-	<view class="login">
-		<view class="login-content">
-			<view class="login-title">账号登录</view>
-			<uni-forms ref="formRef" :modelValue="formData" :rules="formRules" style="margin-top: 10px;">
-				<uni-forms-item name="hzxm">
-					<uni-easyinput class="pub-input" trim="all" v-model="formData.hzxm" placeholder="请输入姓名"></uni-easyinput>
-				</uni-forms-item>
-				<uni-forms-item name="hzsfzh">
-					<uni-easyinput class="pub-input" trim="all" v-model="formData.hzsfzh" placeholder="请输入身份证号"></uni-easyinput>
-				</uni-forms-item>
-			</uni-forms>
-			<view class=" pub-button is-bg large" @click="submit">登录</view>
-		</view>
-	</view>
-</template>
-
-<script lang="ts" setup>
-	import { ref, reactive, onMounted } from 'vue'
-	import dlg from '@/lib/dlg'
-	import { aesEncrypt, aesDecrypt } from "@/lib/encryption"
-	import { encrypt, decrypt } from "@/lib/gmCrypt"
-	import * as link from '@/lib/link'
-
-	const formData = ref({
-		hzxm: '',
-		hzsfzh: '',
-	})
-	const formRef = ref()
-	const formRules = reactive({
-		hzxm: {
-			rules: [{
-				required: true,
-				errorMessage: '姓名不能为空'
-			}]
-		},
-		hzsfzh: {
-			rules: [{
-				required: true,
-				errorMessage: '身份证号不能为空',
-			}, {
-				validateFunction: function (rule, value, data, callback) {
-					let CardNoReg = (
-						/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/
-					); //身份证
-					if (!CardNoReg.test(value)) {
-						callback('身份证格式不正确,请重新填写')
-					}
-				}
-			}]
-		},
-	})
-
-
-	const submit = async () => {
-		console.log("内容")
-		// 校验表单
-		formRef.value.validate().then(async res => {
-			// 提交请求
-			try {
-				link.goCFList(aesEncrypt(formData.value.hzsfzh),aesEncrypt(formData.value.hzxm))
-			} catch (e) {
-				dlg.error(e)
-			}
-		}).catch(err => {
-			console.log('表单错误信息:', err);
-		})
-	}
-	// onMounted(async () => {
-	// 	const text = '刘思浩'
-	// 	const text1 = encrypt(text)
-	// 	console.log("测试",text1)
-	// 	const text2 = decrypt(text1)
-	// 	console.log("测试",text2)
-	// })
-</script>
-
-<style lang="scss" scoped>
-	.login {
-		height: 100%;
-		width: 100%;
-		background-image: url("~@/static/image/logo_bg.png");
-		background-repeat: no-repeat;
-		background-position: center;
-		width: 100%;
-		background-size: cover;
-		position: relative;
-		text-align: center;
-
-		.login-content {
-			top: 360rpx;
-			left: 96rpx;
-			position: absolute;
-			background: #FFFFFF;
-			border-radius: $uni-border-radius-r1;
-			width: calc(100% - 194rpx);
-			padding: 40rpx $page-row-spacing 16rpx;
-			box-sizing: border-box;
-
-			.login-title {
-				font-size: $uni-font-size-xl;
-				line-height: $uni-line-height-xl;
-			}
-
-			.pub-input {
-				:deep(.uni-easyinput__content) {
-					border-color: $uni-border-color !important;
-					border-radius: 4rpx;
-
-					.uni-easyinput__content-input {
-						height: 88rpx;
-						font-size: $uni-font-size-lg;
-						line-height: $uni-line-height-lg;
-						color: $uni-text-color;
-
-						.uni-input-placeholder {
-							color: $uni-text-color-light;
-							font-size: $uni-font-size-lg;
-							line-height: $uni-line-height-lg;
-						}
-					}
-				}
-
-
-			}
-
-			.pub-button {
-				margin-top: 40rpx;
-			}
-		}
-	}
-</style>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1 - 0
static/image/add-icon.svg