فهرست منبع

添加评分/当事人选项/当事人配置页

xieyunhui 4 سال پیش
والد
کامیت
16cebd0f65

+ 10 - 1
App.vue

@@ -9,13 +9,22 @@
 			// 		this.checkArguments(); // 检测启动参数
 			// 	});
 			// }
-			// if (uni.getSystemInfoSync().platform === 'android'){
+			// console.log(uni.getSystemInfoSync());
+			// const {platform,windowWidth} = uni.getSystemInfoSync();
+			// if (platform === 'android'&&windowWidth>768){
 			// 	//pad下锁死竖屏适配布局
 			// 	// #ifdef APP-PLUS
 			// 	   plus.screen.lockOrientation('portrait-primary');
 			// 	// #endif
 			// }
 			
+			if (uni.getSystemInfoSync().platform === 'android'){
+			                //pad下锁死竖屏适配布局
+			                // #ifdef APP-PLUS
+			                   plus.screen.lockOrientation('portrait-primary');
+			                // #endif
+			}
+			
 			
 			
 			

+ 150 - 0
components/index-list/index-list.vue

@@ -0,0 +1,150 @@
+<template>
+	<view class="container">
+		<scroll-view   scroll-y="true" class="scroll-Y" 
+		>
+			<view class="box" v-for="item in options">
+				  <view class="letter">{{item.letter}}</view>
+				  <view class="listWrap">
+				  	   <view class="list" v-for="val in item.data" @click="listClickHandle(val)">
+						     <view class="iconWrap">
+						     	  <image v-if="isSelectAll||checkedListIds.includes(val.id)" class="checkedIcon" src="../../static/check-checkbox.png" mode=""></image>
+						     </view>
+				  	   	     <text class="mainText">{{val.main}}</text>
+							 <text class="subText">{{val.sub}}</text>
+				  	   </view>
+				  </view>
+			</view>
+		</scroll-view> 
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"index-list",
+		props:{
+			checkedResponsibleList:Array,
+			options:Array,
+		},
+		data() {
+			return {
+				checkedList:[],
+				checkedListIds:[],
+				isSelectAll:false
+			};
+		},
+		computed:{
+             
+		},
+		watch:{
+	         checkedResponsibleList:function(newVal,oldVal){
+				  // console.log({newVal,oldVal});
+				  if(newVal.length != oldVal.length){
+					  this.checkedListIds = JSON.parse(JSON.stringify(newVal)).map(item=>item.id);
+					  this.checkedList = JSON.parse(JSON.stringify(newVal));
+					  this.$emit("listClick",this.checkedList);
+				  }
+				  
+			 }
+		},
+		mounted() {
+			this.checkedListIds = JSON.parse(JSON.stringify(this.checkedResponsibleList)).map(item=>item.id);
+			this.checkedList = JSON.parse(JSON.stringify(this.checkedResponsibleList));
+			// console.log(this.checkedListIds);
+		},
+		methods:{
+			listClickHandle(val){
+				const tempIdsArr = JSON.parse(JSON.stringify(this.checkedListIds));
+				const tempArr = JSON.parse(JSON.stringify(this.checkedList));
+				const data = JSON.parse(JSON.stringify(val));
+				// console.log({tempIdsArr,tempArr});
+				// console.log(tempIdsArr.includes(data.id));
+				
+				if(tempIdsArr.includes(data.id)){
+					  this.isSelectAll = false;
+					  tempIdsArr.splice(tempIdsArr.indexOf(data.id),1);
+					  this.checkedList = tempArr.filter(item=>item.id != data.id);
+					  this.checkedListIds = tempIdsArr;
+				}else {
+					  this.checkedList.push(data);
+					  this.checkedListIds.push(data.id);
+					  // console.log(this.checkedListIds);
+					  
+				}
+				this.$emit("listClick",this.checkedList);
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+    .container {
+		height: 100%;
+		overflow: scroll;
+		.scroll-Y {
+			// height: 100%;
+			 .box {
+			 	.letter {
+			 		height: 62.5rpx;
+			 		line-height: 62.5rpx;
+			 		font-size: 22.5rpx;
+			 		font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+			 		font-weight: 400;
+			 		color: #666F80;
+			 		padding: 0 25rpx;
+			 	}
+			 	.listWrap {
+			 		background-color: #FFFFFF;
+			 		.list {
+			 			position: relative;
+			 			display: flex;
+			 			flex-direction: row;
+			 			justify-content: flex-start;
+			 			align-items: center;
+			 			height:87.5rpx;
+			 			padding: 0 25rpx;
+			 			.iconWrap {
+			 				width: 25rpx;
+			 				height: 25rpx;
+			 				margin-right: 25rpx;
+			 				.checkedIcon {
+			 					width: 25rpx;
+			 					height: 25rpx;
+			 					
+			 				}
+			 			}
+			 			.mainText {
+			 				display: inline-block;
+			 				font-size: 22.5rpx;
+			 				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+			 				font-weight: 400;
+			 				color: #292C33;
+			                 margin-right: 50rpx;
+			 			}
+			 			.subText {
+			 				font-size: 22.5rpx;
+			 				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+			 				font-weight: 400;
+			 				color: #7A8499;
+			 			}
+			 			
+			 			&::after {
+			 				position: absolute;
+			 				right: 0;
+			 				bottom: 0;
+			 				display: block;
+			 				content: '';
+			 				width: 90%;
+			 				border-bottom: 1px solid #DADEE6;
+			 			}
+			 			
+			 			&:last-child {
+			 				&::after {
+			 					display: none;
+			 				}
+			 			}
+			 		}
+			 	}
+			 }
+		}
+	}
+</style>

+ 311 - 0
components/ld-select/ld-select.vue

@@ -0,0 +1,311 @@
+<template>
+	<view class="main">
+		<view class="input" :style="disabled?'background-color:#f5f7fa':''">
+			<input @click="showModal" v-model="_value" :style="disabled?'color:#c0c4cc':''" :placeholder="placeholder" disabled/>
+			<text v-if="clearable&&!disabled" @click="empty" class="selectIcon iconcross"></text>
+		</view>
+		<view class="select-modal" :class="isShowModal?'show':''" @tap="hideModal">
+			<view class="select-dialog" @tap.stop="" :style="{backgroundColor:bgColor}">
+				<view class="select-bar bg-white">
+					<view class="action text-blue" @tap="cancelClick">{{cancelText}}</view>
+					<view class="action text-green" @tap="confirmClick">{{confirmText}}</view>
+				</view>
+				<view class="select-content">
+					<view class="select-item" v-for="(item,index) in list" :key="index"
+					:style="valueIndexOf(item)?'color:'+selectColor+';background-color:'+selectBgColor+';':'color:'+color+';'"
+					 @click="select(item)">
+						<view class="title">{{getLabelKeyValue(item)}}</view>
+						<text class="selectIcon icongou" v-if="valueIndexOf(item)"></text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				isShowModal:false
+			};
+		},
+		props: {
+			value:{
+				type:[Number,String,Array,Object],
+				default:null
+			},
+			placeholder:{ // 占位符
+				default: "",
+				type: String
+			},
+			multiple:{ // 是否多选
+				default: false,
+				type: Boolean
+			},
+			list: {
+				default: () => [],
+				type: Array
+			},
+			valueKey:{ // 指定list中valueKey的值作为下拉框绑定内容
+				default: 'value',
+				type: String
+			},
+			labelKey:{ // 指定list中labelKey的值作为下拉框显示内容
+				default: 'label',
+				type: String
+			},
+			disabled: {
+				default: false,
+				type: Boolean
+			},
+			clearable:{
+				default: false,
+				type: Boolean
+			},
+			cancelText:{
+				default: "取消",
+				type: String
+			},
+			confirmText:{
+				default: "确定",
+				type: String
+			},
+			color:{
+				default: "#000000",
+				type: String
+			},
+			selectColor:{
+				default: "#0081ff",
+				type: String
+			},
+			bgColor:{
+				default: "#F1F1F1",
+				type: String
+			},
+			selectBgColor:{
+				default: "#FFFFFF",
+				type: String
+			}
+		},
+		computed: {
+			_value: {
+				get() {
+					return this.get_value(this.value);
+				},
+				set(val) {
+					this.$emit('change', val);
+				}
+			}
+		},
+		created() {
+		},
+		methods: {
+			get_value(val){ // 将数组值转换为以,隔开的字符串
+				if(val || val===0){
+					if(Array.isArray(val)){
+						let chooseAttr = []
+						val.forEach(item=>{
+							let choose = this.list.find(temp => {
+								let val_val = this.getValueKeyValue(temp)
+								return item === val_val
+							})
+							chooseAttr.push(choose)
+						})
+						let values = chooseAttr.map(temp => this.getLabelKeyValue(temp)).join(',')
+						return values
+					} else {
+						let choose = this.list.find(temp => {
+							let val_val = this.getValueKeyValue(temp)
+							return val === val_val
+						})
+						return this.getLabelKeyValue(choose)
+					}
+				} else {
+					return ""
+				}
+			},
+			select(item){ // 点击选项
+				let val = this.getValueKeyValue(item);
+				if(this.multiple){
+					let _value = this.value;
+					let index = _value.indexOf(val);
+					if(index!=-1){
+						_value.splice(index,1)
+						this.$emit('change', _value)
+					} else {
+						_value.push(val)
+						this.$emit('change', _value)
+					}
+				} else {
+					this.$emit('change', val)
+					this.hideModal()
+				}
+			},
+			valueIndexOf(item){
+				let val = this.getValueKeyValue(item);
+				if(Array.isArray(this.value)){
+					return this.value.indexOf(val)!=-1
+				} else {
+					return this.value === val
+				}
+			},
+			getLabelKeyValue(item){ // 获取label
+				return item[this.labelKey]
+			},
+			getValueKeyValue(item){ // 获取value
+				return item[this.valueKey]
+			},
+			empty(){ // 清空
+				if(this.multiple){
+					this.$emit('change', [])
+				} else {
+					this.$emit('change', '')
+				}
+			},
+			cancelClick(){ // 点击取消
+				this.$emit('cancel', this._value)
+				this.hideModal()
+			},
+			confirmClick(){ // 点击确定
+				this.$emit('confirm', this._value)
+				this.hideModal()
+			},
+			showModal(){ // 显示model
+				if(!this.disabled){
+					this.isShowModal = true
+				}
+			},
+			hideModal(){ // 隐藏model
+				this.isShowModal = false
+			}
+		}
+	}
+</script>
+<style>	
+	@font-face {font-family: "selectIcon";
+	  src: url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.eot?t=1590375117208'); /* IE9 */
+	  src: url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.eot?t=1590375117208#iefix') format('embedded-opentype'), /* IE6-IE8 */
+	  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAMEAAsAAAAABvQAAAK4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgqBRIFCATYCJAMMCwgABCAFhQUHNRsfBsg+QCa3uoO0oAJTMwhxVu965keqWBy1hkbwtfzWb2Z279/shRhJisKF6FApKLI7oyBbpAaHo3w24k+ca9EUJbDmjaeznUdZ/FOUlkWdJ33rizZY/Pw6J5Xw0qKYxHTMesePHVT6EFpaC4zV70sKi2bYgNPc1w0WHnDVC/e/UnNTgyP+4Jq6BBpIHoisgypLaIAFEtU0wgeaIG8Yu4nAIZwnUK1QgFfOT6nUUoBpgXjj2lqplTMpiuXtCW3N2iK+aPTS2/Qdnzny8d+5IEiaDMy99exklra//FrKnX48pChmgrq5QcYRQCEe17ruqgqLAKv8WntwqwhpLms/nB5yW/iHRxJEC0QOgT3NnfgF01NBKvOuIzNoZdh5gJuAeGrsozE8vOJ7u5D832oz55039W5G+S52K0H+zNf1TJz07k26kqoQybRfwVFV4rjDS/K8EXUyuF1cXnT3weKS9Rvdm/xe7h8oA1hLwOR18R+Y4n4zwpr4z5SU089Vc+cpfWL+mn5APmT3Z39jeOs/GbWjK+DnmsuL/u6ehMX4j4yedSVkAUUuPh3TY022MtKZUEOtPqCb8Bkvnr5XT6imU0gGrEJW7aAL/gw0OhegVV2F6pC7uTOppirKIA4MFQhTrpCM+AbZlDu64L/QmAkQWlMhQXU75D07O9Gtl0PUYjTBLyAzOLNQYtypIEEjvsXtBLQTooV2nrQrGEau2gKmZlR4L8gwnGtBJbUn1diCOOQUnEkTkRAOeci9KHOQxvFro+tx3ZcGAaeljstCSBNDJuArgIyBYyy6OdZxAhHIELu1IC9AtgShCVtLltEKrSff1XoHJo3RC33hM63o3j6pSNkmqmIWEAtxFHB2OwoRBAfyeqE3r2ogHeF42dBhs7gvf7CukH5MmlUGOCpHihxFfs6TehDyKCqVAA==') format('woff2'),
+	  url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.woff?t=1590375117208') format('woff'),
+	  url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.ttf?t=1590375117208') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+	  url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.svg?t=1590375117208#selectIcon') format('svg'); /* iOS 4.1- */
+	}
+	
+	.selectIcon {
+	  font-family: "selectIcon" !important;
+	  font-size: 16px;
+	  font-style: normal;
+	  -webkit-font-smoothing: antialiased;
+	  -moz-osx-font-smoothing: grayscale;
+	}
+	
+	.icongou:before {
+	  content: "\e61c";
+	}
+	
+	.iconcross:before {
+	  content: "\e61a";
+	}
+
+</style>
+<style lang="scss" scoped>
+	.main{
+		font-size: 28rpx;
+	}
+	.bg-white{
+		background-color: #FFFFFF;
+	}
+	.text-blue{
+		color: #0081ff;
+	}
+	.text-green{
+		color: #39b54a;
+	}
+	.input {
+		display: flex;
+		align-items:center;
+		font-size: 28rpx;
+		height: 60rpx;
+		padding: 10rpx 20rpx;
+		border-radius: 10rpx;
+		border-style: solid;
+		border-width: 1rpx;
+		border-color: rgba(0, 0, 0, 0.1);
+		input{
+			flex: 1;
+		}
+	}
+	.select-modal {
+		position: fixed;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		z-index: 9999;
+		opacity: 0;
+		outline: 0;
+		text-align: center;
+		-ms-transform: scale(1.185);
+		transform: scale(1.185);
+		backface-visibility: hidden;
+		perspective: 2000rpx;
+		background: rgba(0, 0, 0, 0.6);
+		transition: all 0.3s ease-in-out 0s;
+		pointer-events: none;
+		margin-bottom: -1000rpx;
+		&::before {
+			content: "\200B";
+			display: inline-block;
+			height: 100%;
+			vertical-align: bottom;
+		}
+		.select-dialog {
+			position: relative;
+			display: inline-block;
+			margin-left: auto;
+			margin-right: auto;
+			background-color: #f8f8f8;
+			overflow: hidden;
+			width: 100%;
+			border-radius: 0;
+			.select-content{
+				// background-color: #F1F1F1;
+				max-height: 420rpx;
+				overflow:auto;
+				.select-item{
+					padding: 20rpx;
+					display: flex;
+					.title{
+						flex: 1;
+					}
+				}
+			}
+		}
+	}
+	.select-modal.show {
+		opacity: 1;
+		transition-duration: 0.3s;
+		-ms-transform: scale(1);
+		transform: scale(1);
+		overflow-x: hidden;
+		overflow-y: auto;
+		pointer-events: auto;
+		margin-bottom: 0;
+	}
+	.select-bar {
+		padding: 0 20rpx;
+		display: flex;
+		position: relative;
+		align-items: center;
+		min-height: 80rpx;
+		justify-content: space-between;
+		.action {
+			display: flex;
+			align-items: center;
+			height: 100%;
+			justify-content: center;
+			max-width: 100%;
+		}
+	}
+</style>

+ 13 - 2
pages.json

@@ -187,9 +187,18 @@
             }
             
         }
+        ,{
+            "path" : "pages/responsibleList/responsibleList",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "选择当事人",
+                "enablePullDownRefresh": false
+            }
+            
+        }
     ],
 	"globalStyle": {
-		"navigationStyle": "custom",
+		"navigationStyle": "default",
 		"autoBackButton": true,
 		// "homeButton": true,
 		"navigationBarTextStyle": "black",
@@ -199,7 +208,9 @@
 		"app-plus": {
 			"background": "#efeff4"
 		},
-		"rpxCalcMaxDeviceWidth":9999,
+		"rpxCalcMaxDeviceWidth": 960, // rpx 计算所支持的最大设备宽度,单位 px,默认值为 960
+		"rpxCalcBaseDeviceWidth": 375, // rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px,默认值为 375
+		"rpxCalcIncludeWidth": 750, // rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx,默认值为 750
 		"onReachBottomDistance": 184
 	}
 }

+ 122 - 13
pages/checkMainPoints/checkMainPoints.vue

@@ -29,7 +29,7 @@
 				</view>
 			</view>
 		</tm-modal>
-		<scroll-view  scroll-y="true" class="scroll-Y" >
+		<scroll-view @scroll="scrollHandle"  scroll-y="true" :class="(detailList.length>0&&active != 2&&finishedStatus != 1)?'scroll-Y':'scroll-Y noBtn'" >
 		<view class="list" v-for="(item, index) in detailList" :key="index">
 			<view class="title" v-if="item.responseList.length > 0">查核要点:{{item.checkPointName}}</view>
 			<view class="item" v-for="(child, n) in item.responseList" @click="childClick(child,item.checkPointId)"
@@ -65,17 +65,34 @@
 		</view>
 		</scroll-view>
 		<tm-callback-listpage />
-		<view v-if="detailList.length>0&&active != 2&&finishedStatus != 1" @click="onkeyCheckHandle" class="botOneKeyCheck">完成</view>
+		<view class="bottomBtnGroup">
+			<view class="score">
+				<view class="box">
+					<text class="label">得分</text>
+					<text class="currentScore">{{currentScore}}</text>
+				</view>
+				<view class="midLine"></view>
+				<view class="box">
+					<text class="label">总分</text>
+					<text class="totalScore">{{totalScore}}</text>
+				</view>
+			</view>
+			<view v-if="detailList.length>0&&active != 2&&finishedStatus != 1" @click="onkeyCheckHandle" class="botOneKeyCheck">完成</view>
+		</view>
+		<!-- <view v-if="detailList.length>0&&active != 2&&finishedStatus != 1" @click="onkeyCheckHandle" class="botOneKeyCheck">完成</view> -->
 	</view>
 </template>
 
 <script>
 	import {
 		_stopPropagation
-	} from "../../utils/compatible.js";
-	export default {
+	} from "../../utils/compatible.js";
+	
+	export default {
+		
 		data() {
-			return {
+			return {
+				
 				btnArr: [{
 						id: 0,
 						label: '全部'
@@ -102,7 +119,10 @@
 				active: 0,
 				checkId: '',
 				deptId: '',
-				finishedStatus:0,//所有计划里的查核项是否都以完成
+				currentScrollHeight:0,
+				finishedStatus:0,//所有计划里的查核项是否都以完成
+				totalScore:0,
+				currentScore:0,
 			};
 		},
 		computed: {
@@ -122,21 +142,32 @@
 			this.checkTaskDetailList({
 				deptId,
 				checkId
-			});
+			});
+			
+			
 		},
 		onShow: function() {	
+			
 			if(this.ifFromChildPage){
 				//页面重新拉取数据
 				this.checkTaskDetailList({
 					'deptId':this.deptId,
 					'checkId':this.checkId
 				});
+				uni.pageScrollTo({
+				    scrollTop: this.currentScrollHeight,
+				    duration: 300
+				});
 			}
 		},
 		beforeDestroy(){
 			this.ifFromChildPage=false;
 		},
 		methods: {
+			//滚动监听事件,记录滚动高度
+			scrollHandle(e){
+				this.currentScrollHeight = e.detail.scrollTop;
+			},
 			//一键查核
 			onkeyCheckHandle(){
 				uni.showModal({
@@ -198,10 +229,29 @@
 					deptId
 				}).then((data) => {
 					if (data) {
-						// console.log({data});
-						this.detailList = data;
-						this.copyDetailList = data;
-						data.map(({
+						// console.log({data});
+						this.$store.commit('checkMainPoints/comChangeState',{key:'detailList',data:data.checkDetailMapResponses});
+						if(!data.isBindResponsible){
+							uni.showModal({
+							    title: '提示',
+							    content: '目前未批量分配当事人,是否前往选择?',
+							    success:(res)=>{
+							        if (res.confirm) {
+							            uni.navigateTo({
+							              url: `/pages/responsibleList/responsibleList?deptId=${this.deptId}&isFromCheckMainPoints=true`,
+							            });
+							        } else if (res.cancel) {
+							            console.log('用户点击取消');
+							        }
+							    }
+							});
+						}
+						
+						this.detailList = data.checkDetailMapResponses;
+						this.copyDetailList = data.checkDetailMapResponses;
+						this.currentScore = data.getScore;
+						this.totalScore = data.totalScore;
+						data.checkDetailMapResponses.map(({
 							checkPointId,
 							checkPointName
 						}) => {
@@ -322,17 +372,73 @@
 		height: 100%;
 		font-size: 22.5rpx;
 		line-height: 33.75rpx;
-		background-color: #F5F6FA;
-        .botOneKeyCheck {
+		background-color: #F5F6FA;
+		.botOneKeyCheck {
 			text-align: center;
 			height: 75rpx;
+			width: 100%;
 			line-height: 75rpx;
 			font-size: 22.5rpx;
 			font-family: SourceHanSansCN-Normal, SourceHanSansCN;
 			font-weight: 400;
 			color: #FFFFFF;
 			background: #3377FF;
+		}
+		.bottomBtnGroup {
+			position: fixed;
+			width: 100%;
+			left:0;
+			bottom: 0;
+			display: flex;
+			flex-direction: row;
+			border-top:1px solid #DADEE6;
+			background-color: #fff;
+			.score {
+				display: flex;
+				width: 50%;
+				flex-direction: row;
+				justify-content: center;
+				align-items: center;
+				height: 75rpx;
+				.box {
+					width: 50%;
+					text-align: center;
+					white-space: nowrap;
+					vertical-align:bottom;
+					.label {
+						color: #666E80;
+						font-size: 17.5rpx;
+						margin-right: 10rpx;
+					}
+					.currentScore {
+						font-size:30rpx;
+						font-weight: bold;
+						color: #3377FF;
+					}
+					.totalScore {
+						font-size:30rpx;
+						font-weight: bold;
+						color: #292C33;
+					}
+				}
+				.midLine {
+					height:17.5rpx;
+					border-left: 1px solid #DADEE6;
+				}
+			}
+			.botOneKeyCheck {
+				text-align: center;
+				height: 75rpx;
+				flex-grow: 1;
+				line-height: 75rpx;
+				font-size: 22.5rpx;
+				font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				font-weight: 400;
+				color: #FFFFFF;
+				background: #3377FF;
+			}
 		}
+        
 		.top-search {
 			display: flex;
 			flex-direction: row;
@@ -426,6 +532,9 @@
 		}
         .scroll-Y {
 			height: calc(100% - 75rpx);
+			&.noBtn {
+				height: 100%;
+			}
 		}
 		.list {
 			.title {

+ 1 - 0
pages/checkMainPoints/model.js

@@ -5,6 +5,7 @@ export default {
   state: {
      // 查核列表
      checkList: [],
+	 detailList:[],//查核项集合
   },
   mutations: {
 		comChangeState(state, {key, data}) {

+ 10 - 5
pages/editCheckList/editCheckList.vue

@@ -48,7 +48,7 @@
 		<view class="fixed-buttom-btn" @click="submit" v-if="multiple == 'true'">
 			<text class="btn-text">完成</text>
 		</view>
-		<view class="bottomBtnGroup"  v-if="multiple != 'true'">
+		<view class="bottomBtnGroup"  v-if="multiple != 'true'&&ifAllPlanListHasDistribution==false">
 			<view class="leftBtn" @click="bottomBtnClickHandle('left')">{{`(全部${checkList.length}项)全选分配`}}</view>
 			<view class="rightBtn" @click="bottomBtnClickHandle('right')">{{`(已选${checkedList.length}项)批量分配`}}</view>
 		</view>
@@ -65,7 +65,12 @@
 		computed: {
 			...mapState({
 				checkList: state => state.editCheckList.checkList
-			})
+			}),
+			//计算当所有查核计划都已分配完时掩藏底部批量按钮
+			ifAllPlanListHasDistribution:function(){
+				const tempData = this.checkList.filter(item=>(!item.empId&&!item.empName));
+				return tempData.length==0
+			}
 		},
 		data() {
 			return {
@@ -316,7 +321,8 @@
 			 * @param {Number} endTimestamp 计划结束时间戳
 			 * @param {Number} diffTimestamp 第一次计划中的时间差
 			 * @param {String} endDateStr 计划结束时间字符串
-			 */
+			 */
+			
 			getDateStr(startTimestamp, endTimestamp, diffTimestamp, endDateStr) {
 				if ((startTimestamp + diffTimestamp) > endTimestamp) { // 超出计划结束时间, 则取计划结束时间
 					return endDateStr;
@@ -398,8 +404,7 @@
 						  	    url: `/pages/batchDistribution/batchDistribution?details=${encodeURIComponent(JSON.stringify(_detailsTwo))}`
 						  	});
 					}
-					
-					
+	
 				}
 			},
 			// 获取查核列表

+ 2 - 2
pages/login/login.vue

@@ -26,7 +26,7 @@
 				 	  <view class="modalBar">开发者模式</view>
 					  <input class="keyInutArea" type="text" @input='setHospSign' placeholder="请输入hospSign" />
 					  <button class="commitActBtn" @click="updateHospSign(true)" type="default">确定</button>
-					  <button class="commitActBtn" @click="updateHospSign(false)" type="default">确定</button>
+					  <button class="commitActBtn" @click="updateHospSign(false)" type="default">取消</button>
 				 </view>
 			</view>
 		</tm-modal>
@@ -39,7 +39,7 @@
 		data() {
 			return {
 				index:0,
-				appHospSign:'tYAoFaa20yCAgaiy',//app端更新hospSign
+				appHospSign:'8CJYqxlGIdLEIwaG',//app端更新hospSign
 				showInputModal:false,
 				hospSign: '', // 医院标识
 				username: '', // 用户名

+ 305 - 34
pages/mainPointsDetail/mainPointsDetail.vue

@@ -5,8 +5,12 @@
 			 <view class="modalContent">
 			 	  <view class="modalBar">请选择查核结果</view>
 				  <scroll-view class="scroll" scroll-y="true" >
-				  	<view v-for="item in checkItemResultList" class="list" :key="item.id" @click="selectResultHandle(item.resultName)" >{{item.resultName}}</view>
+				  	<view v-for="item in checkItemResultList" :class="[checkedSelectResultListIds.includes(item.id)?'list on':'list']" :key="item.id" @click.stop="selectResultHandle(item)" >
+						<image class="checkIcon" src="../../static/check-checkbox.png" mode=""></image>
+					   {{item.resultName}}
+					</view>
 				  </scroll-view>
+				  <view class="comfirmBtn" @click="commitSelectResult">确定</view>
 			 </view>
 		</view>
 	</tm-modal>
@@ -83,6 +87,27 @@
               ></image>
             </view>
           </view>
+		 <view class="multipleResponsible">
+			 <view class="inner" @click="toSelectResponsible">
+			 	 <text class="label">当事人</text>
+			 	 <input type="text" disabled v-model="checkedResponsibleList.join(',')" placeholder="请选择当事人(可多选)" class="value" placeholder-class="valuePlaceholder"  />
+			 	 <image class="arrow" src="../../static/incon-more.png" mode=""></image>
+			 </view>
+		  </view>
+		  <view class="score">
+			<view class="box">
+				<text class="lable">总分</text>
+				<text class="totalScore">{{totalScore}}</text>
+			</view>
+			<view class="box">
+				<text class="lable">本次得分</text>
+				<text class="currentScore">{{currentScore}}</text>
+			</view>
+		  </view>
+		  <view class="inputScore">
+		  	<text class="label">本项评分</text>
+			<input class="value" @input="onInputScore" type="number" value="" placeholder="请输入分值" placeholder-class="placeholder" />
+		  </view>
         </view>
       </view>
       <view v-if="data.checkModelName == '访谈'" class="talk">
@@ -97,7 +122,11 @@
             <view class="talkResult">
 			  <view class="seeResultFloorOne">
                    <text class="seeName">查核结果</text>
-				   <text v-if="checkItemResultList.length>0" class="threePoint" @click="openSelectModal(i)">⋮</text>
+				   <view class="plusAction" v-if="checkItemResultList.length>0" @click="openSelectModal">
+				   				<image class="plusIcon" src="../../static/icon-add.png" mode=""></image>
+				   	<text class="threePoint"  >缺陷</text>
+				   </view>
+				   <!-- <text v-if="checkItemResultList.length>0" class="threePoint" @click="openSelectModal(i)">⋮</text> -->
 			  </view>
               <textarea
                 maxlength="300"
@@ -123,7 +152,11 @@
         <view class="seeResult">
 		  <view class="seeResultFloorOne">
 		  	  <text class="seeName">查核结果</text>
-			  <text class="threePoint" v-if="checkItemResultList.length>0" @click="openSelectModal">⋮</text>
+			  <view class="plusAction" v-if="checkItemResultList.length>0" @click="openSelectModal">
+				<image class="plusIcon" src="../../static/icon-add.png" mode=""></image>
+			  	<text class="threePoint"  >缺陷</text>
+			  </view>
+			  <!-- <text class="threePoint" v-if="checkItemResultList" @click="openSelectModal">⋮</text> -->
 		  	  <!-- <dropdown :list="checkItemResultList" :current="currentSelect" @onClick="dropDownChange"></dropdown> -->
 		  </view>
           <textarea
@@ -158,14 +191,16 @@
 			<image class="threeLineMenuIcon" src="/static/threeLineMenu.png" ></image>
 		</view>
 		<view class="prevBtn" @click="switchItem(1)">下一项</view>
-		<view class="nextBtn" @click="sureDetail" v-if="data.display?data.display:false">完成</view>
+		<view class="nextBtn" @click="sureDetail('back')" v-if="data.display?data.display:false">完成</view>
 	</view>
   </view>
 </template>
 
 <script>
 import {_goBackFresh} from '../../utils/compatible.js';
+// import ldSelect from '@/components/ld-select/ld-select.vue'
 export default {
+  // components:{ldSelect},
   data() {
     return {
 	  value:'',
@@ -185,12 +220,43 @@ export default {
 	  itemId:'',
 	  currentEditTextAreaIndex:'',
 	  checkItemResultList:[],//查核结果说明下拉列表
+	  checkedSelectResultList:[],//下拉结果选中集合
+	  checkedSelectResultListIds:[],
 	  currentSelect:'',
 	  checkItemScore:null,//查核选中的分数
 	  checkItemValue:null,//查核选中的分数占比
 	  checkConfiglist:[],//查核情况可配置列表
+	  totalScore:10,//总分
+	  // currentScore:0,//当前得分
+	  inputScore:0,//手动填写分值
+	  selectedScore:0,//缺失项分值
+	  checkedResponsibleList:[],
+	  deptId:'',//病区id
+	  checkedResponsibleData:[],
+	  checkedSelectResultListData:[],
     };
   },
+  onShow() {
+	const {responsibleList} = this.$store.state;
+	this.checkedResponsibleData = responsibleList.checkedResponsibleList;
+  	this.checkedResponsibleList = responsibleList.checkedResponsibleList.map(item=>item.main);
+  },
+  computed:{
+	  currentScore:function(){
+		   return (this.totalScore-this.inputScore-this.selectedScore-this.checkItemScore).toFixed(2);
+	  },
+	  deductPoint:function(){
+		  // console.log(Number(this.inputScore)+Number(this.selectedScore)+Number(this.checkItemScore));
+		  return (Number(this.inputScore)+Number(this.selectedScore)+Number(this.checkItemScore)).toFixed(2)
+	  }
+  },
+  watch:{
+	  checkedResponsibleList:function(){
+		   const {responsibleList} = this.$store.state;
+		   // console.log({responsibleList});
+		   return responsibleList.checkedResponsibleList.map(item=>item.main);
+	  }
+  },
   mounted() {
     this.checkTaskDetail(this.id);
     this.getPeizhiList();
@@ -201,21 +267,57 @@ export default {
 		this.showSelectModal = false;
 	},
 	openSelectModal(index){
-		console.log({index});
+		// console.log({index});
 		if(index>=0){
 			 this.currentEditTextAreaIndex = index;
 		}
 		this.showSelectModal = true;
 	},
-    selectResultHandle(val){
+	//跳转选择当事人
+	toSelectResponsible(){
+		// console.log(this.deptId);
+		uni.navigateTo({
+		  url: `/pages/responsibleList/responsibleList?deptId=${this.deptId}&checkId=${this.id}`,
+		});
+	},
+	onInputScore(e){
+		this.inputScore = e.target.value;
+	},
+    selectResultHandle(item){
 		// console.log({val});
 		// console.log('currentEditTextAreaIndex',this.currentEditTextAreaIndex);
+		if(this.checkedSelectResultListIds.includes(item.id)){
+			const tempIdsArr = JSON.parse(JSON.stringify(this.checkedSelectResultListIds));
+			const tempArr = JSON.parse(JSON.stringify(this.checkedSelectResultList));
+			const tempArrData = JSON.parse(JSON.stringify(this.checkedSelectResultListData));
+			tempIdsArr.splice(tempIdsArr.indexOf(item.id),1);
+			tempArr.splice(tempArr.indexOf(item.resultName),1);
+			tempArrData.splice(tempArrData.indexOf(item.id),1);
+			this.checkedSelectResultListIds = tempIdsArr;
+			this.checkedSelectResultList = tempArr;
+			this.checkedSelectResultListData = tempArrData;
+		}else {
+			this.checkedSelectResultListIds.push(item.id);
+			this.checkedSelectResultList.push(item.resultName);
+			this.checkedSelectResultListData.push(item);
+		}
+	},
+	commitSelectResult(){
 		if(this.data.checkModelName == '访谈'){
-			this.talkList[this.currentEditTextAreaIndex].talkResult = val;
+			this.talkList[this.currentEditTextAreaIndex].talkResult = this.checkedSelectResultList.join(',');
 		}else {
-			this.recordList[0].seeResult = val;
+			this.recordList[0].seeResult = this.checkedSelectResultList.join(',');
 		}
-	    this.showSelectModal = false;
+		const tempArr = this.checkedSelectResultListData.map(item=>item.percentScore);
+		const tempScore = tempArr.reduce((prev,cur)=>{
+			   return (prev/100)+(cur/100)
+		},0);
+		
+		this.selectedScore = this.totalScore*tempScore;
+		// console.log({tempScore});
+		// console.log(this.selectedScore);
+		
+		this.showSelectModal = false;
 	},
     checkTaskDetail(id) {
       this.$store.dispatch({
@@ -227,7 +329,22 @@ export default {
             },
           },
         }).then((res) => {
+		  // console.log({res});
 		  this.id = id;
+		  this.deptId = res.deptId;
+		  //用于当时人页面回显
+		  if(res.responsibleUserName){
+			  const tempResponsibleUserName = res.responsibleUserName.split(',');
+			  const tempResponsibleUserId = res.responsibleUserId.split(',');
+			  this.checkedResponsibleList = tempResponsibleUserName;
+			  const arr = tempResponsibleUserName.map((item,index)=>({
+				   main:item,
+				   id:parseInt(tempResponsibleUserId[index])
+			  }));
+			 
+			  this.$store.commit('responsibleList/updateCheckedResponsibleList',arr);
+		  }
+		  
           if (res) {
             this.data = res;			
             if (res && res.lastResult == "不适用") {
@@ -260,7 +377,7 @@ export default {
 	//查核点击回调
     checkedOne(data) {
 		const parsedData = JSON.parse(JSON.stringify(data));
-		console.log({parsedData})
+		// console.log({parsedData})
 		this.Index = parsedData.attr;
 		this.data.checkResult = parsedData.attr;
 		this.checkItemScore = parsedData.score;
@@ -320,14 +437,18 @@ export default {
     imgClick(i) {
       this.editIndex = i;
     },
-    sureDetail(e) {
+    sureDetail(key) {
       if (this.Index) {
         let params = {
           id: this.data.id,
           checkResult: this.data.checkResult,
           checkResultRequestList: [],
 		  checkItemScore:this.checkItemScore,
-		  value:this.checkItemValue
+		  value:this.checkItemValue,
+		  // responsibleUserId:(this.checkedResponsibleData.map(item=>item.id)).join(','),
+		  // responsibleUserName:(this.checkedResponsibleData.map(item=>item.main)).join(','),
+		  score:Number(this.currentScore),
+		  deductPoint:Number(this.deductPoint),
         };
         if (this.data.checkModelName == "访谈") {
           let list = [];
@@ -346,8 +467,6 @@ export default {
               checkResultUrl: path,
             };
 			
-			// console.log({'访谈':item});
-			// return;
             list.push(item);
           }
           params.checkResultRequestList = list;
@@ -366,14 +485,12 @@ export default {
             checkResultDescribe: this.recordList[0].seeResult,
             checkResultUrl: path,
           };
-		  // console.log({item});
-		  // return;
+
           list.push(item);
           params.checkResultRequestList = list;
         }
 		const checkConfiglist = JSON.parse(JSON.stringify(this.checkConfiglist));
-		
-  //     	console.log({params});
+		// console.log({params});
 		// return;
         this.$store.dispatch({
             type: "mainPointsDetail/commActions",
@@ -384,7 +501,7 @@ export default {
               },
             },
           }).then((res) => {
-			// console.log({'res':res,'checkConfiglist':this.checkConfiglist});
+			console.log({'res':res,'checkConfiglist':checkConfiglist});
             if (res) {
               for (let i = 0; i < checkConfiglist.length; i++) {
                 if (
@@ -427,16 +544,22 @@ export default {
 					}).then(() => {
 					  
 					});
-                }
+                }else {
+					 console.log('改善条件为false');
+				}
               }
-			  //返回
-			  _goBackFresh('pages/checkMainPoints/checkMainPoints');
-			  
+			  if(key=='back'){
+				  //点完成时返回
+				  _goBackFresh('pages/checkMainPoints/checkMainPoints');
+			  }
+			  // _goBackFresh('pages/checkMainPoints/checkMainPoints');
 			  //去查核详情页
 			  // uni.navigateTo({
 			  //   url: `/pages/auditItemDetails/auditItemDetails?id=${this.data.id}&checkPointId=${this.checkPointId}`,
 			  // });
-            }
+            }else {
+				console.log('res为false');
+			}
           });
       } else {
         uni.showModal({
@@ -491,7 +614,8 @@ export default {
 	goToPrevPage(){
 		_goBackFresh('pages/checkMainPoints/checkMainPoints');
 	},
-	switchItem(num){
+	switchItem:async function(num){
+		await this.sureDetail();
 		let current = this.itemBelongGroup.filter(item=>{
 			  return item.id == this.id;
 		});
@@ -543,6 +667,13 @@ export default {
 			}
 		}).then(data=>{
 			// console.log({data});
+			// const temp = [
+			// 	{resultName:'1',id:0},
+			// 	{resultName:'2',id:1},
+			// 	{resultName:'3',id:2},
+			// 	{resultName:'4',id:3}
+			// ]
+			// this.checkItemResultList = temp;
 			this.checkItemResultList = data;
 		})
 	},
@@ -589,8 +720,9 @@ export default {
 	  align-items: center;
 	  .modalContent {
 		   width: 90%;
-		   height:500rpx;
-		   border-radius: 20rpx;
+		   height:600rpx;
+		   border-radius: 10rpx;
+		   overflow: hidden;
 		   background-color: #FFFFFF;
 		   .modalBar{
 			   display: flex;
@@ -599,16 +731,40 @@ export default {
 			   height: 80rpx;
 			   color: #4E78FF;
 			   font-size: 22.5rpx;
+			   box-shadow: 0 6rpx 6rpx #E5E5E5;
 			   border-bottom: 0.1rpx solid #E5E5E5;
 		   }
+		   .comfirmBtn {
+			   font-size: 22rpx;
+			   color: #FFFFFF;
+			   height: 80rpx;
+			   line-height: 80rpx;
+			   text-align: center;
+			   background-color: #3377FF;
+		   }
 		   .scroll {
-			   height: calc(100% - 80rpx);
+			   height: calc(100% - 160rpx);
 			   .list {
+				   position: relative;
 				   display: flex;
 				   height: 80rpx;
 				   justify-content: center;
 				   align-items: center;
 				   border-bottom: 0.1rpx solid #E5E5E5;
+				   .checkIcon {
+					   display: none;
+					   position: absolute;
+					   left:5%;
+					   width: 25rpx;
+					   height:25rpx;
+				   }
+				   
+				   &.on {
+					   color: #3377FF;
+					   .checkIcon {
+						   display: block;
+					   }
+				   }
 			   }
 		   }
 	  }
@@ -751,6 +907,108 @@ export default {
           height: 21.21rpx;
         }
       }
+	  .multipleResponsible {
+		  padding-top:15rpx;
+		  background-color:#F5F6FA;
+		  .inner {
+			  position: relative;
+			  display: flex;
+			  height: 87.5rpx;
+			  z-index: 10;
+			  flex-direction: row;
+			  justify-content: flex-start;
+			  align-items: center;
+			  padding: 0 25rpx;
+			  background-color: #FFFFFF;
+			  .label {
+				  display: inline-block;
+				  font-size: 22.5rpx;
+				  font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				  font-weight: 400;
+				  color: #525866;
+				  margin-right: 105rpx;
+			  }
+			  .value {
+				  flex: 0.9;
+				  font-size: 22.5rpx;
+				  overflow:hidden; //超出的文本隐藏
+				  text-overflow:ellipsis; //溢出用省略号显示
+				  white-space:nowrap; //溢出不换行
+			  }
+			  .valuePlaceholder {
+				  font-size: 22.5rpx;
+				  font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				  font-weight: 400;
+				  color: #B8BECC;
+			  }
+			  .arrow {
+				  position: absolute;
+				  right:25rpx;
+				  width: 12.5rpx;
+				  height: 20rpx;
+			  }
+		  }
+	  }
+	  .score {
+		 display: flex;
+		 height: 87.5rpx;
+		 flex-direction:row;
+		 justify-content: space-between;
+		 align-items: center;
+		 padding: 0 25rpx;
+		 background: #F5F6FA;
+		 .box {
+			 text-align: center;
+			 vertical-align: bottom;
+			 .lable {
+				 display: inline-block;
+				 font-size: 22.5rpx;
+				 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				 font-weight: 400;
+				 color: #525866;
+				 margin-right: 10rpx;
+			 }
+			 .totalScore {
+				 font-size: 30rpx;
+				 font-family: SourceHanSansCN-Bold, SourceHanSansCN;
+				 font-weight: bold;
+				 color: #292C33;
+			 }
+			
+			 .currentScore {
+				 font-size: 30rpx;
+				 font-family: SourceHanSansCN-Bold, SourceHanSansCN;
+				 font-weight: bold;
+				 color: #3377FF;
+			 }
+		 }
+	  }
+	  .inputScore {
+		  display: flex;
+		  flex-direction: row;
+		  justify-content: flex-start;
+		  align-items:center;
+		  height: 87.5rpx;
+		  padding: 0 25rpx;
+		  background-color: #FFFFFF;
+		  .label {
+			  display: inline-block;
+			  font-size: 22.5rpx;
+			  font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+			  font-weight: 400;
+			  color: #525866;
+			  margin-right: 81.25rpx;
+		  }
+		  .value {
+		  	  font-size: 22.5rpx;
+		  }
+		  .placeholder {
+			  font-size: 22.5rpx;
+			  font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+			  font-weight: 400;
+			  color: #B8BECC;
+		  }
+	  }
     }
   }
   .see {
@@ -770,11 +1028,24 @@ export default {
 		  align-items: center;
 		  margin-bottom: 25rpx;
 		  padding-right: 25rpx;
-		  .threePoint {
-			  padding-left: 12.5rpx;
-			  font-size: 20rpx;
-			  font-weight:700;
-		  }
+		  .plusAction {
+			  display: flex;
+			  flex-direction: row;
+			  justify-content: center;
+			  align-items: center;
+			  .plusIcon {
+				  width: 25rpx;
+				  height: 25rpx;
+				  margin-right: 10rpx;
+			  }
+		      .threePoint {
+				   font-size: 22.5rpx;
+				   font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+				   font-weight: 400;
+				   color: #7A8599;
+		      }
+	      }
+		  
 	  }
       .seeName {
         width: 175rpx;
@@ -784,7 +1055,7 @@ export default {
         display: inline-block;
       }
       .seeTextarea {
-        width: 531.25rpx;
+        width: 97%;
         height: 155rpx;
         display: inline-block;
         font-size: 22.5rpx;

+ 3 - 1
pages/model.js

@@ -18,6 +18,7 @@ import suggestionsFeedback from './suggestionsFeedback/model.js';
 import resetInfo from './resetInfo/model.js';
 import batchDistribution from './batchDistribution/model.js';
 import checkMainPoints from './checkMainPoints/model.js';
+import responsibleList from './responsibleList/model.js';
 
 
 export default module = {
@@ -43,5 +44,6 @@ export default module = {
   suggestionsFeedback,
   resetInfo,
   batchDistribution,
-  checkMainPoints
+  checkMainPoints,
+  responsibleList
 }

+ 19 - 0
pages/responsibleList/model.js

@@ -0,0 +1,19 @@
+import { commServer } from './server.js';
+
+export default {
+  namespaced: true,
+  state: {
+	  checkedResponsibleList:[]
+  },
+  mutations: {
+	  updateCheckedResponsibleList (state,arr){
+		   state.checkedResponsibleList = arr;
+	  }
+  },
+  actions: {
+		commActions({ commit, state }, { payload }) {
+			// payload = {key,data} // data是请求数据,key是请求接口id
+      return commServer(payload);
+		},
+  }
+}

+ 332 - 0
pages/responsibleList/responsibleList.vue

@@ -0,0 +1,332 @@
+<template>
+	<view class="container">
+		<view class="top">
+			<view class="searchBar">
+				<input class="inputArea" @input="keywordsHandle" type="text" v-model="keywords" placeholder="搜索当事人" placeholder-class="placeholder" />
+				<view class="searchActiver" @click="searchHandle">
+					<image class="searchIcon" src="../../static/search.png" mode=""></image>
+				</view>
+			</view>
+			<view class="tabWrap">
+				<view @click="tabClick(0)" :class="[currentTabIndex==0?'tab on':'tab']">全院</view>
+				<view @click="tabClick(1)" :class="[currentTabIndex==1?'tab on':'tab']">当前病区</view>
+			</view>
+		</view>
+		<view class="content">
+			<index-list v-on:listClick="listClickHandle" :checkedResponsibleList='checkedResponsibleList' :options="list"></index-list>
+		</view>
+		<view class="bottom">
+			<view class="selectAll" @click="selectAllHandle">
+				<image v-if="selectAll" class="icon" src="../../static/selectAll.png" mode=""></image>
+				<image v-if="!selectAll" class="icon" src="../../static/selectAllnoclor.png" mode=""></image>
+				<text :class="[selectAll?'text on':'text']">全选</text>
+			</view>
+			<view class="cancelBtn" @click="cancelCheck">取消</view>
+			<view class="comfirm" @click="sureCheck">确定</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import indexList from '../../components/index-list/index-list.vue';
+	export default {
+		data() {
+			return {
+				currentTabIndex:0,
+				checkedResponsibleListTemp:[],
+				checkedResponsibleList:[],//已选择的当事人列表
+				list:[],
+				checkId:'',
+				// list:[{
+				// 	"letter": "A",
+				// 	"data": [
+				// 		{id:0,main:"阿克苏机场",sub:'sub'},
+				// 		{id:1,main:"阿拉山口机场",sub:'sub'},
+				// 		{id:2,main:"阿勒泰机场",sub:'sub'},
+				// 		{id:3,main:"阿里昆莎机场",sub:'sub'},
+				// 		{id:4,main:"安庆天柱山机场",sub:'sub'},
+				// 		{id:5,main:"澳门国际机场",sub:'sub'},
+				// 	]
+				// }, {
+				// 	"letter": "B",
+				// 	"data": [
+				// 		{id:6,main:"阿克苏机场",sub:'sub'},
+				// 		{id:7,main:"阿拉山口机场",sub:'sub'},
+				// 		{id:8,main:"阿勒泰机场",sub:'sub'},
+				// 		{id:9,main:"阿里昆莎机场",sub:'sub'},
+				// 		{id:10,main:"安庆天柱山机场",sub:'sub'},
+				// 		{id:11,main:"澳门国际机场",sub:'sub'},
+				// 	]
+				// }],
+				deptId:'',
+				keywords:'',
+				deptIdTemp:'',
+				selectAll:false,
+				isFromCheckMainPoints:false,
+			};
+		},
+		onLoad({deptId,isFromCheckMainPoints,checkId}) {
+			this.deptIdTemp = deptId;
+			this.isFromCheckMainPoints = isFromCheckMainPoints;
+			if(checkId)this.checkId = checkId
+		},
+		onShow() {
+			const {responsibleList} = this.$store.state;
+			console.log({responsibleList});
+			this.checkedResponsibleList = responsibleList.checkedResponsibleList;
+		},
+		mounted(){
+			
+			this.getResponsibleList();
+		},
+		methods:{
+			bindClick(){
+				
+			},
+			selectAllHandle(){
+				
+				this.selectAll = true;
+				const getResponsibleListIds = (arr,index)=>{
+					if(index == arr.length-1){
+						return arr[index].data
+					}
+					return arr[index].data.concat(getResponsibleListIds(arr,index+1))
+				}
+				this.checkedResponsibleList = getResponsibleListIds(this.list,0);
+				// console.log('selectAllHandle',this.checkedResponsibleList);
+			},
+			keywordsHandle(e){
+				if(e.target.value.length==0){
+					this.getResponsibleList();
+				}
+				this.keywords = e.target.value;
+			},
+			searchHandle(){
+				this.getResponsibleList();
+			},
+			//获取当时人列表
+			getResponsibleList(){
+				this.$store.dispatch({
+				    type: "responsibleList/commActions",
+				    payload: {
+				      key: "getResponsibleList",
+				      data: {
+				         deptId:this.deptId,
+						 keywords:this.keywords
+				      },
+				    }
+				}).then((data)=>{
+					  this.list = data;
+				})
+			},
+			//当事人列表点击handle
+			listClickHandle(checkedList){
+				this.checkedResponsibleListTemp = checkedList;
+			},
+			sureCheck(){
+				const responsibleUserIds = this.checkedResponsibleListTemp.map(item=>item.id);
+				const responsibleUserNames = this.checkedResponsibleListTemp.map(item=>item.main);
+				if(this.isFromCheckMainPoints){
+					//批量保存当事人
+					const {checkMainPoints:{detailList}} = this.$store.state;
+					const detailListFlat = (arr,index)=>{
+						if(index == arr.length-1){
+							return arr[index].responseList
+						}
+						return arr[index].responseList.concat(getResponsibleListIds(arr,index+1))
+					}
+					const tempCheckIds = detailListFlat(detailList,0);
+					const checkIds = tempCheckIds.map(item=>item.id);
+					console.log({tempCheckIds});
+				
+					this.$store.dispatch({
+					    type: "responsibleList/commActions",
+					    payload: {
+					      key: "bindCheckDetailResponsibleUser",
+					      data: {
+					         responsibleUserId:responsibleUserIds.join(','),
+							 responsibleUserName:responsibleUserNames.join(','),
+							 checkIds:checkIds,
+					      },
+					    }
+					}).then((data)=>{
+						  uni.showModal({
+						      title: '提示',
+						      content: '批量分配当事人成功!',
+						      showCancel:false,
+							  success:(res)=>{
+								   if (res.confirm) {
+									  uni.navigateBack({
+									      delta: 1
+									  });
+								   }
+							  }
+						  });
+					})
+				}else {
+					this.$store.dispatch({
+					    type: "responsibleList/commActions",
+					    payload: {
+					      key: "bindCheckDetailResponsibleUser",
+					      data: {
+					         responsibleUserId:responsibleUserIds.join(','),
+							 responsibleUserName:responsibleUserNames.join(','),
+							 checkIds:[parseInt(this.checkId)],
+					      },
+					    }
+					});
+					this.$store.commit('responsibleList/updateCheckedResponsibleList',this.checkedResponsibleListTemp);
+					uni.navigateBack({
+					    delta: 1
+					});
+				}
+				
+				
+			},
+			cancelCheck(){
+				uni.navigateBack({
+				    delta: 1
+				});
+			},
+			tabClick(index){
+				 if(index==1){
+					 this.deptId = this.deptIdTemp;
+				 }else {
+					 this.deptId ='';
+				 }
+				 this.getResponsibleList();
+				 this.currentTabIndex = index;
+			}
+		}
+	}
+</script>
+
+<style lang="less">
+	.container {
+		display: flex;
+		height: 100%;
+		flex-direction: column;
+		.top {
+				 height: 170rpx;
+				 padding: 0 25rpx;
+				 padding-top: 18.75rpx;
+				 background-color: #FFFFFF;
+				 box-sizing: border-box;
+				 box-shadow: 0px 3.75rpx 12.5rpx 0px rgba(0, 13, 51, 0.1);
+				 .searchBar {
+					 display: flex;
+					 flex-direction: row;
+					 justify-content: space-evenly;
+					 align-items: center;
+					 height: 55rpx;
+					 background: #F0F2F7;
+					 border-radius: 5rpx;
+					 padding-left: 25rpx;
+					 .inputArea {
+						 flex-grow:0.9;
+						 font-size: 22.5rpx;
+						 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						 font-weight: 400;
+					 }
+					 .placeholder {
+						 font-size: 22.5rpx;
+						 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						 font-weight: 400;
+						 color: #A1A7B3;
+					 }
+					 .searchActiver {
+						 display: flex;
+						 justify-content: center;
+						 align-items: center;
+						 flex-grow: 0.1;
+						 height:100%;
+						 .searchIcon {
+							 width: 21.25rpx;
+							 height: 21.25rpx;
+						 }
+					 }
+				 }
+				 .tabWrap {
+					 display: flex;
+					 flex-direction: row;
+					 justify-content: space-around;
+					 align-items: center;
+					 margin-top: 25rpx;
+					 .tab {
+						 display: flex;
+						 justify-content: center;
+						 align-items: center;
+						 width: 325rpx;
+						 height: 50rpx;
+						 font-size: 22.5rpx;
+						 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						 font-weight: 400;
+						 color: #292C33;
+						 background: #EBEFF7;
+						 border-radius: 25rpx;
+						 
+						 &.on {
+							 color: #FFFFFF;
+							 background: #3377FF;
+						 }
+					 }
+				 }
+		}
+		.content {
+				 flex-grow: 1;
+				 overflow: hidden;
+		}
+		.bottom {
+			     display: flex;
+				 flex-direction: row;
+				 height:75rpx;
+				 border-top: 0.62rpx solid #DADEE6;
+				 background-color: #FFFFFF;
+				 .selectAll {
+					 display: flex;
+					 width: 20%;
+					 flex-direction: row;
+					 justify-content: center;
+					 align-items: center;
+					 .icon {
+						 width: 25rpx;
+						 height: 24.37rpx;
+						 margin-right: 15rpx;
+					 }
+					 .text {
+						 font-size: 22.5rpx;
+						 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+						 font-weight: 400;
+						 color: #8F9BB3;
+						 &.on {
+							 color:#3377FF;
+						 }
+					 }
+				 }
+				 .cancelBtn {
+					 display: flex;
+					 width: 40%;
+					 height: 100%;
+					 justify-content: center;
+					 align-items: center;
+					 font-size: 22.5rpx;
+					 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					 font-weight: 400;
+					 color: #3377FF;
+					 border-left: 0.62rpx solid #DADEE6;
+				 }
+				 .comfirm {
+					 display: flex;
+					 width: 40%;
+					 height: 100%;
+					 font-size: 22.5rpx;
+					 font-family: SourceHanSansCN-Normal, SourceHanSansCN;
+					 font-weight: 400;
+					 color: #FFFFFF;
+					 justify-content: center;
+					 align-items: center;
+					 background: #3377FF;
+				 }
+		}
+	}
+</style>

+ 19 - 0
pages/responsibleList/server.js

@@ -0,0 +1,19 @@
+import { creatRequest } from '../../utils/request.js';
+
+const requestList = {
+	//获取当事人表
+	getResponsibleList:{
+		method:'GET',
+		url: 'user/getAllUser'
+	},
+	//批量保存当事人
+	bindCheckDetailResponsibleUser:{
+		method:'POST',
+		url: 'checkTask/bindCheckDetailResponsibleUser'
+	},
+
+};
+export const commServer = ({ key, data }) => {
+  let obj = requestList[key];
+  return creatRequest(obj, data);
+}

BIN
static/searchIcon.png


BIN
static/selectAll.png


BIN
static/selectAllnoclor.png


+ 4 - 0
uni_modules/uni-icons/changelog.md

@@ -0,0 +1,4 @@
+## 1.1.5(2021-05-12)
+- 新增 组件示例地址
+## 1.1.4(2021-02-05)
+- 调整为uni_modules目录规范

+ 132 - 0
uni_modules/uni-icons/components/uni-icons/icons.js

@@ -0,0 +1,132 @@
+export default {
+	"pulldown": "\ue588",
+	"refreshempty": "\ue461",
+	"back": "\ue471",
+	"forward": "\ue470",
+	"more": "\ue507",
+	"more-filled": "\ue537",
+	"scan": "\ue612",
+	"qq": "\ue264",
+	"weibo": "\ue260",
+	"weixin": "\ue261",
+	"pengyouquan": "\ue262",
+	"loop": "\ue565",
+	"refresh": "\ue407",
+	"refresh-filled": "\ue437",
+	"arrowthindown": "\ue585",
+	"arrowthinleft": "\ue586",
+	"arrowthinright": "\ue587",
+	"arrowthinup": "\ue584",
+	"undo-filled": "\ue7d6",
+	"undo": "\ue406",
+	"redo": "\ue405",
+	"redo-filled": "\ue7d9",
+	"bars": "\ue563",
+	"chatboxes": "\ue203",
+	"camera": "\ue301",
+	"chatboxes-filled": "\ue233",
+	"camera-filled": "\ue7ef",
+	"cart-filled": "\ue7f4",
+	"cart": "\ue7f5",
+	"checkbox-filled": "\ue442",
+	"checkbox": "\ue7fa",
+	"arrowleft": "\ue582",
+	"arrowdown": "\ue581",
+	"arrowright": "\ue583",
+	"smallcircle-filled": "\ue801",
+	"arrowup": "\ue580",
+	"circle": "\ue411",
+	"eye-filled": "\ue568",
+	"eye-slash-filled": "\ue822",
+	"eye-slash": "\ue823",
+	"eye": "\ue824",
+	"flag-filled": "\ue825",
+	"flag": "\ue508",
+	"gear-filled": "\ue532",
+	"reload": "\ue462",
+	"gear": "\ue502",
+	"hand-thumbsdown-filled": "\ue83b",
+	"hand-thumbsdown": "\ue83c",
+	"hand-thumbsup-filled": "\ue83d",
+	"heart-filled": "\ue83e",
+	"hand-thumbsup": "\ue83f",
+	"heart": "\ue840",
+	"home": "\ue500",
+	"info": "\ue504",
+	"home-filled": "\ue530",
+	"info-filled": "\ue534",
+	"circle-filled": "\ue441",
+	"chat-filled": "\ue847",
+	"chat": "\ue263",
+	"mail-open-filled": "\ue84d",
+	"email-filled": "\ue231",
+	"mail-open": "\ue84e",
+	"email": "\ue201",
+	"checkmarkempty": "\ue472",
+	"list": "\ue562",
+	"locked-filled": "\ue856",
+	"locked": "\ue506",
+	"map-filled": "\ue85c",
+	"map-pin": "\ue85e",
+	"map-pin-ellipse": "\ue864",
+	"map": "\ue364",
+	"minus-filled": "\ue440",
+	"mic-filled": "\ue332",
+	"minus": "\ue410",
+	"micoff": "\ue360",
+	"mic": "\ue302",
+	"clear": "\ue434",
+	"smallcircle": "\ue868",
+	"close": "\ue404",
+	"closeempty": "\ue460",
+	"paperclip": "\ue567",
+	"paperplane": "\ue503",
+	"paperplane-filled": "\ue86e",
+	"person-filled": "\ue131",
+	"contact-filled": "\ue130",
+	"person": "\ue101",
+	"contact": "\ue100",
+	"images-filled": "\ue87a",
+	"phone": "\ue200",
+	"images": "\ue87b",
+	"image": "\ue363",
+	"image-filled": "\ue877",
+	"location-filled": "\ue333",
+	"location": "\ue303",
+	"plus-filled": "\ue439",
+	"plus": "\ue409",
+	"plusempty": "\ue468",
+	"help-filled": "\ue535",
+	"help": "\ue505",
+	"navigate-filled": "\ue884",
+	"navigate": "\ue501",
+	"mic-slash-filled": "\ue892",
+	"search": "\ue466",
+	"settings": "\ue560",
+	"sound": "\ue590",
+	"sound-filled": "\ue8a1",
+	"spinner-cycle": "\ue465",
+	"download-filled": "\ue8a4",
+	"personadd-filled": "\ue132",
+	"videocam-filled": "\ue8af",
+	"personadd": "\ue102",
+	"upload": "\ue402",
+	"upload-filled": "\ue8b1",
+	"starhalf": "\ue463",
+	"star-filled": "\ue438",
+	"star": "\ue408",
+	"trash": "\ue401",
+	"phone-filled": "\ue230",
+	"compose": "\ue400",
+	"videocam": "\ue300",
+	"trash-filled": "\ue8dc",
+	"download": "\ue403",
+	"chatbubble-filled": "\ue232",
+	"chatbubble": "\ue202",
+	"cloud-download": "\ue8e4",
+	"cloud-upload-filled": "\ue8e5",
+	"cloud-upload": "\ue8e6",
+	"cloud-download-filled": "\ue8e9",
+	"headphones":"\ue8bf",
+	"shop":"\ue609"
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 10 - 0
uni_modules/uni-icons/components/uni-icons/uni-icons.vue


BIN
uni_modules/uni-icons/components/uni-icons/uni.ttf


+ 82 - 0
uni_modules/uni-icons/package.json

@@ -0,0 +1,82 @@
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons 图标",
+  "version": "1.1.5",
+  "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "图标"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 46 - 0
uni_modules/uni-icons/readme.md

@@ -0,0 +1,46 @@
+
+
+## Icons 图标
+> **组件名:uni-icons**
+> 代码块: `uIcons`
+
+
+用于展示 icons 图标 。
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+<uni-icons type="contact" size="30"></uni-icons>
+```
+
+
+
+## API
+
+### Icons Props
+
+|属性名	|类型		|默认值	|说明				|
+|:-:	|:-:		|:-:	|:-:				|
+|size	|Number		|24		|图标大小			|
+|type	|String		|-		|图标图案,参考示例	|
+|color	|String		|-		|图标颜色			|
+
+
+### Icons Events
+|事件名	|说明			|返回值|
+|:-:	|:-:			|:-:  |
+|@click|点击 Icon 触发事件|-    |
+
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons](https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons)

+ 10 - 0
uni_modules/uni-indexed-list/changelog.md

@@ -0,0 +1,10 @@
+## 1.0.11(2021-05-12)
+- 新增 组件示例地址
+## 1.0.10(2021-04-21)
+- 优化 添加依赖 uni-icons, 导入后自动下载依赖
+## 1.0.9(2021-02-05)
+- 优化 组件引用关系,通过uni_modules引用组件
+
+## 1.0.8(2021-02-05)
+- 调整为uni_modules目录规范
+- 新增 支持 PC 端

+ 141 - 0
uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue

@@ -0,0 +1,141 @@
+<template>
+	<view>
+		<view v-if="loaded || list.itemIndex < 15" class="uni-indexed-list__title-wrapper">
+			<text v-if="list.items && list.items.length > 0" class="uni-indexed-list__title">{{ list.key }}</text>
+		</view>
+		<view v-if="(loaded || list.itemIndex < 15) && list.items && list.items.length > 0" class="uni-indexed-list__list">
+			<view v-for="(item, index) in list.items" :key="index" class="uni-indexed-list__item" hover-class="uni-indexed-list__item--hover">
+				<view class="uni-indexed-list__item-container" @click="onClick(idx, index)">
+					<view class="uni-indexed-list__item-border" :class="{'uni-indexed-list__item-border--last':index===list.items.length-1}">
+						<view v-if="showSelect" style="margin-right: 20rpx;">
+							<uni-icons :type="item.checked ? 'checkbox-filled' : 'circle'" :color="item.checked ? '#007aff' : '#aaa'" size="24" />
+						</view>
+						<text class="uni-indexed-list__item-content">{{ item.name }}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniIndexedList',
+		props: {
+			loaded: {
+				type: Boolean,
+				default: false
+			},
+			idx: {
+				type: Number,
+				default: 0
+			},
+			list: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			showSelect: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			onClick(idx, index) {
+				this.$emit("itemClick", {
+					idx,
+					index
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-indexed-list__list {
+		background-color: $uni-bg-color;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		border-top-style: solid;
+		border-top-width: 1px;
+		border-top-color: $uni-border-color;
+	}
+
+	.uni-indexed-list__item {
+		font-size: $uni-font-size-lg;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.uni-indexed-list__item-container {
+		padding-left: $uni-spacing-row-lg;
+		flex: 1;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-indexed-list__item-border {
+		flex: 1;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		align-items: center;
+		height: 50px;
+		padding: $uni-spacing-row-lg;
+		padding-left: 0;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+		border-bottom-color: $uni-border-color;
+	}
+
+	.uni-indexed-list__item-border--last {
+		border-bottom-width: 0px;
+	}
+
+	.uni-indexed-list__item-content {
+		flex: 1;
+		font-size: 14px;
+	}
+
+	.uni-indexed-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-indexed-list__title-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		width: 100%;
+		/* #endif */
+		background-color: #f7f7f7;
+	}
+
+	.uni-indexed-list__title {
+		padding: 6px 12px;
+		line-height: 24px;
+		font-size: $uni-font-size-sm;
+	}
+</style>

+ 358 - 0
uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue

@@ -0,0 +1,358 @@
+<template>
+	<view class="uni-indexed-list" ref="list" id="list">
+		<!-- #ifdef APP-NVUE -->
+		<list class="uni-indexed-list__scroll" scrollable="true" show-scrollbar="false">
+			<cell v-for="(list, idx) in lists" :key="idx" :ref="'uni-indexed-list-' + idx">
+				<!-- #endif -->
+				<!-- #ifndef APP-NVUE -->
+				<scroll-view :scroll-into-view="scrollViewId" class="uni-indexed-list__scroll" scroll-y>
+					<view v-for="(list, idx) in lists" :key="idx" :id="'uni-indexed-list-' + idx">
+						<!-- #endif -->
+						<indexed-list-item :list="list" :loaded="loaded" :idx="idx" :showSelect="showSelect" @itemClick="onClick"></indexed-list-item>
+						<!-- #ifndef APP-NVUE -->
+					</view>
+				</scroll-view>
+				<!-- #endif -->
+				<!-- #ifdef APP-NVUE -->
+			</cell>
+		</list>
+		<!-- #endif -->
+		<view class="uni-indexed-list__menu" :class="touchmove ? 'uni-indexed-list__menu--active' : ''" @touchstart="touchStart"
+		 @touchmove.stop.prevent="touchMove" @touchend="touchEnd" @mousedown.stop="mousedown" @mousemove.stop.prevent="mousemove"
+		 @mouseleave.stop="mouseleave">
+			<view v-for="(list, key) in lists" :key="key" class="uni-indexed-list__menu-item">
+				<text class="uni-indexed-list__menu-text" :class="touchmoveIndex == key ? 'uni-indexed-list__menu-text--active' : ''">{{ list.key }}</text>
+			</view>
+		</view>
+		<view v-if="touchmove" class="uni-indexed-list__alert-wrapper">
+			<text class="uni-indexed-list__alert">{{ lists[touchmoveIndex].key }}</text>
+		</view>
+	</view>
+</template>
+<script>
+	import indexedListItem from './uni-indexed-list-item.vue'
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom');
+	// #endif
+	// #ifdef APP-PLUS
+	function throttle(func, delay) {
+		var prev = Date.now();
+		return function() {
+			var context = this;
+			var args = arguments;
+			var now = Date.now();
+			if (now - prev >= delay) {
+				func.apply(context, args);
+				prev = Date.now();
+			}
+		}
+	}
+
+	function touchMove(e) {
+		let pageY = e.touches[0].pageY
+		let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+		if (this.touchmoveIndex === index) {
+			return false
+		}
+		let item = this.lists[index]
+		if (item) {
+			// #ifndef APP-NVUE
+			this.scrollViewId = 'uni-indexed-list-' + index
+			this.touchmoveIndex = index
+			// #endif
+			// #ifdef APP-NVUE
+			dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
+				animated: false
+			})
+			this.touchmoveIndex = index
+			// #endif
+		}
+	}
+	const throttleTouchMove = throttle(touchMove, 40)
+	// #endif
+
+	/**
+	 * IndexedList 索引列表
+	 * @description 用于展示索引列表
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=375
+	 * @property {Boolean} showSelect = [true|false] 展示模式
+	 * 	@value true 展示模式
+	 * 	@value false 选择模式
+	 * @property {Object} options 索引列表需要的数据对象
+	 * @event {Function} click 点击列表事件 ,返回当前选择项的事件对象
+	 * @example <uni-indexed-list options="" showSelect="false" @click=""></uni-indexed-list>
+	 */
+	export default {
+		name: 'UniIndexedList',
+		components: {
+			indexedListItem
+		},
+		props: {
+			options: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			showSelect: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				lists: [],
+				winHeight: 0,
+				itemHeight: 0,
+				winOffsetY: 0,
+				touchmove: false,
+				touchmoveIndex: -1,
+				scrollViewId: '',
+				touchmovable: true,
+				loaded: false,
+				isPC: false
+			}
+		},
+		watch: {
+			options: {
+				handler: function() {
+					this.setList()
+				},
+				deep: true
+			}
+		},
+		mounted() {
+			// #ifdef H5
+			this.isPC = this.IsPC()
+			// #endif
+			setTimeout(() => {
+				this.setList()
+			}, 50)
+			setTimeout(() => {
+				this.loaded = true
+			}, 300);
+		},
+		methods: {
+			setList() {
+				let index = 0;
+				this.lists = []
+				this.options.forEach((value, index) => {
+					if (value.data.length === 0) {
+						return
+					}
+					let indexBefore = index
+					let items = value.data.map(item => {
+						let obj = {}
+						obj['key'] = value.letter
+						obj['name'] = item
+						obj['itemIndex'] = index
+						index++
+						obj.checked = item.checked ? item.checked : false
+						return obj
+					})
+					this.lists.push({
+						title: value.letter,
+						key: value.letter,
+						items: items,
+						itemIndex: indexBefore
+					})
+				})
+				// #ifndef APP-NVUE
+				uni.createSelectorQuery()
+					.in(this)
+					.select('#list')
+					.boundingClientRect()
+					.exec(ret => {
+						this.winOffsetY = ret[0].top
+						this.winHeight = ret[0].height
+						this.itemHeight = this.winHeight / this.lists.length
+					})
+				// #endif
+				// #ifdef APP-NVUE
+				dom.getComponentRect(this.$refs['list'], (res) => {
+					this.winOffsetY = res.size.top
+					this.winHeight = res.size.height
+					this.itemHeight = this.winHeight / this.lists.length
+				})
+				// #endif
+			},
+			touchStart(e) {
+				this.touchmove = true
+				let pageY = this.isPC ? e.pageY : e.touches[0].pageY
+				let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+				let item = this.lists[index]
+				if (item) {
+					this.scrollViewId = 'uni-indexed-list-' + index
+					this.touchmoveIndex = index
+					// #ifdef APP-NVUE
+					dom.scrollToElement(this.$refs['uni-indexed-list-' + index][0], {
+						animated: false
+					})
+					// #endif
+				}
+			},
+			touchMove(e) {
+				// #ifndef APP-PLUS
+				let pageY = this.isPC ? e.pageY : e.touches[0].pageY
+				let index = Math.floor((pageY - this.winOffsetY) / this.itemHeight)
+				if (this.touchmoveIndex === index) {
+					return false
+				}
+				let item = this.lists[index]
+				if (item) {
+					this.scrollViewId = 'uni-indexed-list-' + index
+					this.touchmoveIndex = index
+				}
+				// #endif
+				// #ifdef APP-PLUS
+				throttleTouchMove.call(this, e)
+				// #endif
+			},
+			touchEnd() {
+				this.touchmove = false
+				this.touchmoveIndex = -1
+			},
+
+			/**
+			 * 兼容 PC @tian
+			 */
+
+			mousedown(e) {
+				if (!this.isPC) return
+				this.touchStart(e)
+			},
+			mousemove(e) {
+				if (!this.isPC) return
+				this.touchMove(e)
+			},
+			mouseleave(e) {
+				if (!this.isPC) return
+				this.touchEnd(e)
+			},
+
+			// #ifdef H5
+			IsPC() {
+				var userAgentInfo = navigator.userAgent;
+				var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
+				var flag = true;
+				for (let v = 0; v < Agents.length - 1; v++) {
+					if (userAgentInfo.indexOf(Agents[v]) > 0) {
+						flag = false;
+						break;
+					}
+				}
+				return flag;
+			},
+			// #endif
+
+
+			onClick(e) {
+				let {
+					idx,
+					index
+				} = e
+				let obj = {}
+				for (let key in this.lists[idx].items[index]) {
+					obj[key] = this.lists[idx].items[index][key]
+				}
+				let select = []
+				if (this.showSelect) {
+					this.lists[idx].items[index].checked = !this.lists[idx].items[index].checked
+					this.lists.forEach((value, idx) => {
+						value.items.forEach((item, index) => {
+							if (item.checked) {
+								let obj = {}
+								for (let key in this.lists[idx].items[index]) {
+									obj[key] = this.lists[idx].items[index][key]
+								}
+								select.push(obj)
+							}
+						})
+					})
+				}
+				this.$emit('click', {
+					item: obj,
+					select: select
+				})
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-indexed-list {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-indexed-list__scroll {
+		flex: 1;
+	}
+
+	.uni-indexed-list__menu {
+		width: 24px;
+		background-color: lightgrey;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-indexed-list__menu-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		align-items: center;
+		justify-content: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-indexed-list__menu-text {
+		line-height: 20px;
+		font-size: 12px;
+		text-align: center;
+		color: #aaa;
+	}
+
+	.uni-indexed-list__menu--active {
+		background-color: rgb(200, 200, 200);
+	}
+
+	.uni-indexed-list__menu-text--active {
+		color: #007aff;
+	}
+
+	.uni-indexed-list__alert-wrapper {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-indexed-list__alert {
+		width: 80px;
+		height: 80px;
+		border-radius: 80px;
+		text-align: center;
+		line-height: 80px;
+		font-size: 35px;
+		color: #fff;
+		background-color: rgba(0, 0, 0, 0.5);
+	}
+</style>

+ 83 - 0
uni_modules/uni-indexed-list/package.json

@@ -0,0 +1,83 @@
+{
+  "id": "uni-indexed-list",
+  "displayName": "uni-indexed-list 索引列表",
+  "version": "1.0.11",
+  "description": "索引列表",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "索引列表"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "前端组件",
+      "通用组件"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "微信浏览器(Android)": "y",
+          "QQ浏览器(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "小程序": {
+          "微信": "y",
+          "阿里": "y",
+          "百度": "y",
+          "字节跳动": "y",
+          "QQ": "y"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        }
+      }
+    }
+  }
+}

+ 67 - 0
uni_modules/uni-indexed-list/readme.md

@@ -0,0 +1,67 @@
+
+
+## IndexedList 索引列表
+> **组件名:uni-indexed-list**
+> 代码块: `uIndexedList`
+
+
+用于展示索引列表。
+
+### 安装方式
+
+本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。
+
+如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+### 基本用法
+
+在 ``template`` 中使用组件
+
+```html
+<uni-indexed-list :options="list" :showSelect="false" @click="bindClick"></uni-indexed-list>
+```
+
+## API
+
+### IndexedList Props
+
+|属性名		|类型	|默认值	|说明														|
+|:-:		|:-:	|:-:	|:-:														|
+|options	|Object	|-		|索引列表需要的数据对象										|
+|showSelect	|Boolean|-		| 展示模式,true 为展示默认,false 为选择模式,默认为 false	|
+
+**options 数据格式说明**
+
+```json
+[{
+	"letter": "A",
+	"data": [
+		"阿克苏机场",
+		"阿拉山口机场",
+		"阿勒泰机场",
+		"阿里昆莎机场",
+		"安庆天柱山机场",
+		"澳门国际机场"
+	]
+}, {
+	"letter": "B",
+	"data": [
+		"保山机场",
+		"包头机场",
+		"北海福成机场",
+		"北京南苑机场",
+		"北京首都国际机场"
+	]
+}]
+```
+
+### IndexedList Events
+
+|事件名	|说明															|返回值	|
+|:-:		|:-:															|:-:	|
+|click	|点击列表事件 ,返回当前选择项的事件对象	|-		|
+
+
+## 组件示例
+
+点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/indexed-list/indexed-list](https://hellouniapp.dcloud.net.cn/pages/extUI/indexed-list/indexed-list)

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است