zouling 1 rok temu
rodzic
commit
9bbf9ba82c

+ 98 - 0
api/mine/case.js

@@ -53,3 +53,101 @@ export function getInfoListFn(data) {
 	'data':data
   })
 }
+// 是否立案proposalInfo:info:isRecord
+export function getInfoisRecordFn(data) {
+  return request({
+    'url': '/proposalInfo/info/isRecord',
+    'method': 'post',
+	'data':data
+  })
+}
+// 提案交办proposalInfo:info:assign
+export function getInfoAssignFn(data) {
+  return request({
+    'url': '/proposalInfo/info/assign',
+    'method': 'post',
+	'data':data
+  })
+}
+// 单位答复proposal:unit:reply
+export function getInfoReplyFn(data) {
+  return request({
+    'url': '/proposal/unit/reply',
+    'method': 'post',
+	'data':data
+  })
+}
+// 办结审核proposalInfo:info:assignsh
+export function getInfoShFn(data) {
+  return request({
+    'url': '/proposalInfo/info/assignsh',
+    'method': 'post',
+	'data':data
+  })
+}
+// 委员意见proposalInfo:info:idea
+export function getInfoIdeaFn(data) {
+  return request({
+    'url': '/proposalInfo/info/idea',
+    'method': 'post',
+	'data':data
+  })
+}
+// 政协意见proposalInfo:info:zxIdea
+export function getInfozxIdeaFn(data) {
+  return request({
+    'url': '/proposalInfo/info/zxIdea',
+    'method': 'post',
+	'data':data
+  })
+}
+
+
+// 推荐重点proposalInfo:info:keyPoint
+export function getInfokeyPointFn(data) {
+  return request({
+    'url': '/proposalInfo/info/keyPoint',
+    'method': 'post',
+	'data':data
+  })
+}
+// 推荐优秀proposalInfo:info:outstanding
+export function getInfooutstandingFn(data) {
+  return request({
+    'url': '/proposalInfo/info/outstanding',
+    'method': 'post',
+	'data':data
+  })
+}
+//联名提案信息列表proposalInfo:info:jointlyList
+export function getInfojointlyListFn(data) {
+  return request({
+    'url': '/proposalInfo/info/jointlyList',
+    'method': 'get',
+	'data':data
+  })
+}
+//联名确认proposal:user:verify
+export function getUserverifyFn(data) {
+  return request({
+    'url': '/proposal/user/verify',
+    'method': 'post',
+	'data':data
+  })
+}
+//承办单位提案信息列表proposalInfo:info:unitList
+export function getInfounitListFn(data) {
+  return request({
+    'url': '/proposalInfo/info/unitList',
+    'method': 'get',
+	'data':data
+  })
+}
+//催办zxUrge:urge:add
+export function getInfourgeFn(data) {
+  return request({
+    'url': '/zxUrge/urge',
+    'method': 'post',
+	'data':data
+  })
+}

+ 7 - 0
api/mine/mine.js

@@ -7,4 +7,11 @@ export function getDeptList(data) {
   })
 }
 
+// 答复单位system/dept/list
+export function getDeptTree(data) {
+  return request({
+    'url': '/system/user/deptTree',
+    'method': 'get',
+  })
+}
 

+ 124 - 0
components/ba-tree-picker/README.md

@@ -0,0 +1,124 @@
+## 树形层级选择器
+### 简介
+为统一样式而生,树形层级选择器,picker弹窗形式的,样式和比例参照uniapp的picker和uni-data-picker组件
+* 支持单选、多选、父级选择,当然也支持单层选择
+* 支持Object对象属性自定义映射
+* 支持显示全部选中、部分选中、未选中三种状态
+* 支持快速自定义简单样式(分割线、按钮、标题、对齐等),深入样式可复写css
+
+### 使用方法
+在 `script` 中引入组件
+``` javascript
+	import baTreePicker from "@/components/ba-tree-picker/ba-tree-picker.vue"
+	export default {
+		components: {
+			baTreePicker
+		}
+```
+在 `template` 中使用组件
+``` javascript
+	<ba-tree-picker ref="treePicker" :multiple='false' @select-change="selectChange" title="选择城市"
+		:localdata="listData" valueKey="value" textKey="label" childrenKey="children" />
+```
+在 `script` 中定义打开方法,和选择监听
+``` javascript
+		methods: {
+			// 显示选择器
+			showPicker() {
+				this.$refs.treePicker._show();
+			},
+			//监听选择(ids为数组)
+			selectChange(ids, names) {
+				console.log(ids, names)
+			}
+		}
+```
+在 `template` 中调用打开
+``` javascript
+	<view @click="showPicker">调用选择器</view>
+```
+
+### 属性
+|属性名|类型|默认值|说明|
+|:-|:-:|:--:|-:|
+|localdata|Array|[]|源数据,目前支持tree结构,后续会考虑支持扁平化结构|
+|valueKey|String|id|指定 Object 中 key 的值作为节点数据id|
+|textKey|String|name|指定 Object 中 key 的值作为节点显示内容|
+|childrenKey|String|children|指定 Object 中 key 的值作为节点子集|
+|multiple|Boolean|false|是否多选,默认单选|
+|selectParent|Boolean|true|是否可以选父级,默认可以|
+|title|String| |标题|
+|titleColor|String||标题颜色|
+|confirmColor|String|#0055ff|确定按钮颜色|
+|cancelColor|String|#757575|取消按钮颜色|
+|switchColor|String|#666|节点切换图标颜色|
+|border|Boolean|false|是否有分割线,默认无|
+
+
+
+###  数据格式
+
+注意:必须有id、name(id可通过valueKey来配置为其它键值,如value)字段,且唯一
+
+``` json
+[
+    {
+        id: 1,
+        name: '公司1',
+        children: [{
+            id: 11,
+            name: '研发部',
+            children: [{
+                id: 111,
+                name: '张三',
+                
+            },{
+                id: 112,
+                name: '李四',
+                
+            }]
+        },{
+            id: 12,
+            name: '综合部',
+            
+        } ]
+    },
+    {
+        id: 2,
+        name: '公司2',
+        children: [{
+            id: 21,
+            name: '研发部',
+            
+        },{
+            id: 22,
+            name: '综合部',
+            
+        },{
+            id: 23,
+            name: '财务部',
+            
+        }, ]
+    },
+    {
+        id: 3,
+        name: '公司3'
+    },
+    {
+        id: 4,
+        name: '公司4',
+        children: [{
+            id: 41,
+            name: '研发部',
+            
+        }]
+    }
+]
+```
+</details>
+
+### 方法
+|方法名|参数|默认值|说明|
+|:-|:-:|:--:|-:|
+|_show()| | |显示选择器|
+|_hide()| | |隐藏选择器|

+ 650 - 0
components/ba-tree-picker/ba-tree-picker.vue

@@ -0,0 +1,650 @@
+<!-- 树形层级选择器-->
+<!-- 1、支持单选、多选 -->
+<template>
+	<view>
+		<!-- <view class="tree-cover" :class="{'show':showDialog}" @tap="_cancel"></view> -->
+		<!-- <view class="tree-dialog" :class="{'show':showDialog}"> -->
+			<!-- <view class="tree-bar">
+				<view class="tree-bar-cancel" :style="{'color':cancelColor}" hover-class="hover-c" @tap="_cancel">取消
+				</view>
+				<view class="tree-bar-title" :style="{'color':titleColor}">{{title}}</view>
+				<view class="tree-bar-confirm" :style="{'color':confirmColor}" hover-class="hover-c" @tap="_confirm">
+					{{multiple?'确定':''}}
+				</view>
+			</view> -->
+			<view class="tree-view">
+				<scroll-view class="tree-list" :scroll-y="true">
+					<block v-for="(item, index) in treeList" :key="index">
+						<view class="tree-item" :style="[{
+							paddingLeft: item.level*30 + 'rpx'
+						}]" :class="{
+							itemBorder: border === true,
+							show: item.isShow
+						}">
+							<view class="item-label">
+								<view class="item-icon flexcc" @tap.stop="_onItemSwitch(item, index)">
+									<view v-if="!item.isLastLevel&&item.isShowChild" class="switch-on"
+										:style="{'border-left-color':switchColor}">
+									</view>
+									<view v-else-if="!item.isLastLevel&&!item.isShowChild" class="switch-off"
+										:style="{'border-top-color':switchColor}">
+									</view>
+									<view v-else class="item-last-dot" :style="{'border-top-color':switchColor}">
+									</view>
+								</view>
+								<view class="flexc uni-inline-item" @tap.stop="_onItemSelect(item, index)">
+									
+									<view class="item-check" v-if="selectParent?true:item.isLastLevel">
+										<view class="item-check-yes" v-if="item.checkStatus==1"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-part"
+												:style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-yes" v-else-if="item.checkStatus==2"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-all" :style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-no" v-else :class="{'radio':!multiple}"
+											:style="{'border-color':confirmColor}"></view>
+									</view>
+									<view class="item-name"> {{item.name+(item.childCount?"("+item.childCount+")":'')}}</view>
+								</view>
+							</view>
+
+						</view>
+					</block>
+				</scroll-view>
+			</view>
+		<!-- </view> -->
+	</view>
+</template>
+
+<script>
+	export default {
+		emits: ['select-change'],
+		name: "ba-tree-picker",
+		props: {
+			valueKey: {
+				type: String,
+				default: 'id'
+			},
+			textKey: {
+				type: String,
+				default: 'name'
+			},
+			childrenKey: {
+				type: String,
+				default: 'children'
+			},
+			localdata: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			localTreeList: { //在已经格式化好的数据
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			selectedData: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			multiple: { // 是否可以多选
+				type: Boolean,
+				default: true
+			},
+			selectParent: { //是否可以选父级
+				type: Boolean,
+				default: true
+			},
+			confirmColor: { // 确定按钮颜色
+				type: String,
+				default: '' // #FE5706
+			},
+			cancelColor: { // 取消按钮颜色
+				type: String,
+				default: '' // #757575
+			},
+			titleColor: { // 标题颜色
+				type: String,
+				default: '' //
+			},
+			switchColor: { // 节点切换图标颜色
+				type: String,
+				default: '' // #666
+			},
+			border: { // 是否有分割线
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				showDialog: true,
+				treeList: []
+			}
+		},
+		computed: {},
+		methods: {
+			_show() {
+				this.showDialog = true
+			},
+			_hide() {
+				this.showDialog = false
+			},
+			_cancel() {
+				// this._hide()
+				// this.$emit("cancel", '');
+			},
+			_confirm() { //多选
+				let selectedList = []; //如果子集全部选中,只返回父级 id
+				let selectedNames;
+				let currentLevel = -1;
+				this.treeList.forEach((item, index) => {
+					// console.log(item,1)
+					if (currentLevel >= 0 && item.level > currentLevel) {
+
+					} else {
+						if (item.checkStatus === 2) {
+							// 判断有无子元素
+							currentLevel = item.level;
+							if(item.children&&item.children.length){
+								var children=item.children;
+								
+								children.forEach(ite=>{
+									var obj={
+										deptId:ite.id,
+										deptName:ite.label
+									}
+									selectedList.push(obj);
+								})
+							}else{
+								var obj={
+									deptId:item.id,
+									deptName:item.name
+								}
+								selectedList.push(obj);
+							}
+							
+							// selectedNames = selectedNames ? selectedNames + ' / ' + item.name : item.name;
+						} else {
+							currentLevel = -1;
+						}
+					}
+				})
+				// this._hide()
+				// this.$emit("select-change", selectedList, selectedNames);
+				this.$emit("select-change", selectedList);
+			},
+			//格式化原数据(原数据为tree结构)
+			_formatTreeData(list = [], level = 0, parentItem, isShowChild = true) {
+				let nextIndex = 0;
+				let parentId = -1;
+				let initCheckStatus = 0;
+				if (parentItem) {
+					nextIndex = this.treeList.findIndex(item => item.id === parentItem.id) + 1;
+					parentId = parentItem.id;
+					if (!this.multiple) { //单选
+						initCheckStatus = 0;
+					} else
+						initCheckStatus = parentItem.checkStatus == 2 ? 2 : 0;
+				}
+				list.forEach(item => {
+					let isLastLevel = true;
+					if (item && item[this.childrenKey]) {
+						let children = item[this.childrenKey];
+						if (Array.isArray(children) && children.length > 0) {
+							isLastLevel = false;
+						}
+					}
+					let itemT = {
+						id: item[this.valueKey],
+						name: item[this.textKey],
+						level,
+						isLastLevel,
+						isShow: isShowChild,
+						isShowChild: false,
+						checkStatus: initCheckStatus,
+						orCheckStatus: 0,
+						parentId,
+						children: item[this.childrenKey],
+						childCount: item[this.childrenKey] ? item[this.childrenKey].length : 0,
+						childCheckCount: 0,
+						childCheckPCount: 0
+					};
+					if (this.selectedData.indexOf(itemT.id) >= 0) {
+						itemT.checkStatus = 2;
+						itemT.orCheckStatus = 2;
+						itemT.childCheckCount = itemT.children ? itemT.children.length : 0;
+						this._onItemParentSelect(itemT, nextIndex);
+					}
+
+					this.treeList.splice(nextIndex, 0, itemT);
+					nextIndex++;
+				})
+				//console.log(this.treeList);
+			},
+			// 节点打开、关闭切换
+			_onItemSwitch(item, index) {
+				// console.log(item)
+				//console.log('_itemSwitch')
+				if (item.isLastLevel === true) {
+					return;
+				}
+				item.isShowChild = !item.isShowChild;
+				if (item.children) {
+					this._formatTreeData(item.children, item.level + 1, item);
+					item.children = undefined;
+				} else {
+					this._onItemChildSwitch(item, index);
+				}
+			},
+			_onItemChildSwitch(item, index) {
+				//console.log('_onItemChildSwitch')
+				const firstChildIndex = index + 1;
+				if (firstChildIndex > 0)
+					for (var i = firstChildIndex; i < this.treeList.length; i++) {
+						let itemChild = this.treeList[i];
+						if (itemChild.level > item.level) {
+							if (item.isShowChild) {
+								if (itemChild.parentId === item.id) {
+									itemChild.isShow = item.isShowChild;
+									if (!itemChild.isShow) {
+										itemChild.isShowChild = false;
+									}
+								}
+							} else {
+								itemChild.isShow = item.isShowChild;
+								itemChild.isShowChild = false;
+							}
+						} else {
+							return;
+						}
+					}
+			},
+			// 节点选中、取消选中
+			_onItemSelect(item, index) {
+				//console.log('_onItemSelect')
+				//console.log(item)
+				if (!this.multiple) { //单选
+					item.checkStatus = item.checkStatus == 0 ? 2 : 0;
+
+					this.treeList.forEach((v, i) => {
+						if (i != index) {
+							this.treeList[i].checkStatus = 0
+						} else {
+							this.treeList[i].checkStatus = 2
+						}
+					})
+
+					let selectedList = [];
+					let selectedNames;
+					selectedList.push(item.id);
+					selectedNames = item.name;
+					// this._hide()
+					this.$emit("select-change", selectedList, selectedNames);
+					return
+				}
+
+				let oldCheckStatus = item.checkStatus;
+				switch (oldCheckStatus) {
+					case 0:
+						item.checkStatus = 2;
+						item.childCheckCount = item.childCount;
+						item.childCheckPCount = 0;
+						break;
+					case 1:
+					case 2:
+						item.checkStatus = 0;
+						item.childCheckCount = 0;
+						item.childCheckPCount = 0;
+						break;
+					default:
+						break;
+				}
+				//子节点 全部选中
+				this._onItemChildSelect(item, index);
+				//父节点 选中状态变化
+				this._onItemParentSelect(item, index, oldCheckStatus);
+				// 选择返回
+				this._confirm()
+				// this.$emit("select-change", selectedList, selectedNames);
+			},
+			_onItemChildSelect(item, index) {
+				//console.log('_onItemChildSelect')
+				let allChildCount = 0;
+				if (item.childCount && item.childCount > 0) {
+					index++;
+					while (index < this.treeList.length && this.treeList[index].level > item.level) {
+						let itemChild = this.treeList[index];
+						itemChild.checkStatus = item.checkStatus;
+						if (itemChild.checkStatus == 2) {
+							itemChild.childCheckCount = itemChild.childCount;
+							itemChild.childCheckPCount = 0;
+						} else if (itemChild.checkStatus == 0) {
+							itemChild.childCheckCount = 0;
+							itemChild.childCheckPCount = 0;
+						}
+						// console.log('>>>>index:', index, 'item:', itemChild.name, '  status:', itemChild
+						// 	.checkStatus)
+						index++;
+					}
+				}
+			},
+			_onItemParentSelect(item, index, oldCheckStatus) {
+				//console.log('_onItemParentSelect')
+				//console.log(item)
+				const parentIndex = this.treeList.findIndex(itemP => itemP.id == item.parentId);
+				//console.log('parentIndex:' + parentIndex)
+				if (parentIndex >= 0) {
+					let itemParent = this.treeList[parentIndex];
+					let count = itemParent.childCheckCount;
+					let oldCheckStatusParent = itemParent.checkStatus;
+
+					if (oldCheckStatus == 1) {
+						itemParent.childCheckPCount -= 1;
+					} else if (oldCheckStatus == 2) {
+						itemParent.childCheckCount -= 1;
+					}
+					if (item.checkStatus == 1) {
+						itemParent.childCheckPCount += 1;
+					} else if (item.checkStatus == 2) {
+						itemParent.childCheckCount += 1;
+					}
+
+					if (itemParent.childCheckCount <= 0 && itemParent.childCheckPCount <= 0) {
+						itemParent.childCheckCount = 0;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 0;
+					} else if (itemParent.childCheckCount >= itemParent.childCount) {
+						itemParent.childCheckCount = itemParent.childCount;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 2;
+					} else {
+						itemParent.checkStatus = 1;
+					}
+					//console.log('itemParent:', itemParent)
+					this._onItemParentSelect(itemParent, parentIndex, oldCheckStatusParent);
+				}
+			},
+			// 重置数据
+			_reTreeList() {
+				this.treeList.forEach((v, i) => {
+					this.treeList[i].checkStatus = v.orCheckStatus
+				})
+			},
+			_initTree() {
+				this.treeList = [];
+				this._formatTreeData(this.localdata);
+			}
+		},
+		watch: {
+			localdata() {
+				this._initTree();
+			},
+			localTreeList() {
+				this.treeList = this.localTreeList;
+			}
+		},
+		mounted() {
+			this._initTree();
+		}
+	}
+</script>
+
+<style scoped>
+	.tree-cover {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		z-index: 100;
+		background-color: rgba(0, 0, 0, .4);
+		opacity: 0;
+		transition: all 0.3s ease;
+		visibility: hidden;
+	}
+
+	.tree-cover.show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tree-dialog {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		background-color: #fff;
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 100002;
+		top: 20%;
+		transition: all 0.3s ease;
+		transform: translateY(100%);
+	}
+
+	.tree-dialog.show {
+		transform: translateY(0);
+	}
+
+	.tree-bar {
+		/* background-color: #fff; */
+		height: 90rpx;
+		padding-left: 25rpx;
+		padding-right: 25rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		box-sizing: border-box;
+		border-bottom-width: 1rpx !important;
+		border-bottom-style: solid;
+		border-bottom-color: #f5f5f5;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 1;
+	}
+
+	.tree-bar-confirm {
+		color: #FE5706;
+		padding: 15rpx;
+	}
+
+	.tree-bar-title {}
+
+	.tree-bar-cancel {
+		color: #757575;
+		padding: 15rpx;
+	}
+
+	.tree-view {
+		flex: 1;
+		padding: 20rpx;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		overflow: hidden;
+		height: 100%;
+	}
+
+	.tree-list {
+		flex: 1;
+		height: 100%;
+		overflow: hidden;
+	}
+
+	.tree-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		line-height: 1;
+		height: 0;
+		opacity: 0;
+		transition: 0.2s;
+		overflow: hidden;
+	}
+
+	.tree-item.show {
+		height: 90rpx;
+		opacity: 1;
+	}
+
+	.tree-item.showchild:before {
+		transform: rotate(90deg);
+	}
+
+	.tree-item.last:before {
+		opacity: 0;
+	}
+
+	.switch-on {
+		width: 0;
+		height: 0;
+		border-left: 16rpx solid transparent;
+		border-right: 16rpx solid transparent;
+		border-top: 20rpx solid #666;
+	}
+
+	.switch-off {
+		width: 0;
+		height: 0;
+		border-bottom: 16rpx solid transparent;
+		border-top: 16rpx solid transparent;
+		border-left: 20rpx solid #666;
+	}
+
+	.item-last-dot {
+		position: absolute;
+		width: 12rpx;
+		height: 12rpx;
+		border-radius: 100%;
+		background: #666;
+	}
+
+	.item-icon {
+		width: 26rpx;
+		height: 30rpx;
+		margin-right: 8rpx;
+		padding-right: 20rpx;
+		padding-left: 20rpx;
+	}
+
+	.item-label {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		height: 100%;
+		line-height: 1.2;
+	}
+
+	.item-name {
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		/* width: 450rpx; */
+		font-size: 34rpx;
+		font-weight: bold;
+		line-height: 1;
+	}
+
+	.item-check {
+		width: 40px;
+		height: 40px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.item-check-yes,
+	.item-check-no {
+		width: 32rpx;
+		height: 32rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		border-top-width: 1rpx;
+		border-left-width: 1rpx;
+		border-bottom-width: 1rpx;
+		border-right-width: 1rpx;
+		border-style: solid;
+		border-color: #FE5706;
+		border-radius: 8rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		 /* background-color: #FE5706; */
+	}
+	.item-check-yes{
+		border: none;
+		background-color: #FE5706;
+	}
+
+	.item-check-yes-part {
+		width: 24rpx;
+		height: 6rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		background-color: #ffffff;
+	}
+
+	.item-check-yes-all {
+		margin-bottom: 5px;
+		border: 2px solid #ffffff;
+		border-left: 0;
+		border-top: 0;
+		height: 12px;
+		width: 6px;
+		transform-origin: center;
+		/* #ifndef APP-NVUE */
+		transition: all 0.3s;
+		/* #endif */
+		transform: rotate(45deg);
+		/* border: none;
+		background-color: #FE5706; */
+	}
+
+	.item-check .radio {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.item-check .radio .item-check-yes-b {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.hover-c {
+		opacity: 0.6;
+	}
+
+	.itemBorder {
+		border-bottom: 1px solid #e5e5e5;
+	}
+</style>

+ 664 - 0
components/ba-tree-picker/ba-tree-pickerfixed.vue

@@ -0,0 +1,664 @@
+<!-- 树形层级选择器-->
+<!-- 1、支持单选、多选 -->
+<template>
+	<view>
+		<view class="tree-cover" :class="{'show':showDialog}" @tap="_cancel"></view>
+		<view class="tree-dialog" :class="{'show':showDialog}">
+			<view class="tree-bar">
+				<view class="tree-bar-cancel" :style="{'color':cancelColor}" hover-class="hover-c" @tap="_cancel">取消
+				</view>
+				<view class="tree-bar-title" :style="{'color':titleColor}">{{title}}</view>
+				<view class="tree-bar-confirm" :style="{'color':confirmColor}" hover-class="hover-c" @tap="_confirm">
+					{{multiple?'确定':''}}
+				</view>
+			</view>
+			<view class="tree-view">
+				<scroll-view class="tree-list" :scroll-y="true">
+					<block v-for="(item, index) in treeList" :key="index">
+						<view class="tree-item" :style="[{
+							paddingLeft: item.level*30 + 'rpx'
+						}]" :class="{
+							itemBorder: border === true,
+							show: item.isShow
+						}">
+							<view class="item-label">
+								<view class="item-icon flexcc" @tap.stop="_onItemSwitch(item, index)">
+									<view v-if="!item.isLastLevel&&item.isShowChild" class="switch-on"
+										:style="{'border-left-color':switchColor}">
+									</view>
+									<view v-else-if="!item.isLastLevel&&!item.isShowChild" class="switch-off"
+										:style="{'border-top-color':switchColor}">
+									</view>
+									<view v-else class="item-last-dot" :style="{'border-top-color':switchColor}">
+									</view>
+								</view>
+								<view class="flexc uni-inline-item" @tap.stop="_onItemSelect(item, index)">
+									
+									<view class="item-check" v-if="selectParent?true:item.isLastLevel">
+										<view class="item-check-yes" v-if="item.checkStatus==1"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-part"
+												:style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-yes" v-else-if="item.checkStatus==2"
+											:class="{'radio':!multiple}" :style="{'border-color':confirmColor}">
+											<view class="item-check-yes-all" :style="{'background-color':confirmColor}">
+											</view>
+										</view>
+										<view class="item-check-no" v-else :class="{'radio':!multiple}"
+											:style="{'border-color':confirmColor}"></view>
+									</view>
+									<view class="item-name"> {{item.name+(item.childCount?"("+item.childCount+")":'')}}</view>
+								</view>
+							</view>
+
+						</view>
+					</block>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		emits: ['select-change'],
+		name: "ba-tree-picker",
+		props: {
+			valueKey: {
+				type: String,
+				default: 'id'
+			},
+			textKey: {
+				type: String,
+				default: 'name'
+			},
+			childrenKey: {
+				type: String,
+				default: 'children'
+			},
+			localdata: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			localTreeList: { //在已经格式化好的数据
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			selectedData: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			deptType:{
+				type: String,
+				default: ''
+			},
+			multiple: { // 是否可以多选
+				type: Boolean,
+				default: true
+			},
+			selectParent: { //是否可以选父级
+				type: Boolean,
+				default: true
+			},
+			confirmColor: { // 确定按钮颜色
+				type: String,
+				default: '' // #1D64E2
+			},
+			cancelColor: { // 取消按钮颜色
+				type: String,
+				default: '' // #757575
+			},
+			titleColor: { // 标题颜色
+				type: String,
+				default: '' //
+			},
+			switchColor: { // 节点切换图标颜色
+				type: String,
+				default: '' // #666
+			},
+			border: { // 是否有分割线
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				showDialog: false,
+				treeList: []
+			}
+		},
+		computed: {},
+		methods: {
+			_show() {
+				this.showDialog = true
+			},
+			_hide() {
+				this.showDialog = false
+			},
+			_cancel() {
+				this._hide()
+				this.$emit("cancel", '');
+			},
+			_confirm() { //多选
+				var that=this;
+				let selectedList = []; //如果子集全部选中,只返回父级 id
+				let selectedNames;
+				let currentLevel = -1;
+				this.treeList.forEach((item, index) => {
+					// console.log(item,1)
+					if (currentLevel >= 0 && item.level > currentLevel) {
+
+					} else {
+						
+						if (item.checkStatus === 2) {
+							// 判断有无子元素
+							currentLevel = item.level;
+							if(item.children&&item.children.length){
+								var children=item.children;
+								
+								children.forEach(ite=>{
+									var obj={
+										deptId:ite.id,
+										deptName:ite.label,
+										type:that.deptType
+									}
+									selectedList.push(obj);
+								})
+							}else{
+								var obj={
+									deptId:item.id,
+									deptName:item.name,
+									type:that.deptType
+								}
+								selectedList.push(obj);
+							}
+							
+							// selectedNames = selectedNames ? selectedNames + ' / ' + item.name : item.name;
+						} else {
+							currentLevel = -1;
+						}
+					}
+				})
+				// console.log(selectedList,1)
+				// return
+				
+				// this.$emit("select-change", selectedList, selectedNames);
+				this.$nextTick(function(){
+					this._hide()
+					this.$emit("select-change", selectedList);
+				})
+				
+			},
+			//格式化原数据(原数据为tree结构)
+			_formatTreeData(list = [], level = 0, parentItem, isShowChild = true) {
+				let nextIndex = 0;
+				let parentId = -1;
+				let initCheckStatus = 0;
+				if (parentItem) {
+					nextIndex = this.treeList.findIndex(item => item.id === parentItem.id) + 1;
+					parentId = parentItem.id;
+					if (!this.multiple) { //单选
+						initCheckStatus = 0;
+					} else
+						initCheckStatus = parentItem.checkStatus == 2 ? 2 : 0;
+				}
+				list.forEach(item => {
+					let isLastLevel = true;
+					if (item && item[this.childrenKey]) {
+						let children = item[this.childrenKey];
+						if (Array.isArray(children) && children.length > 0) {
+							isLastLevel = false;
+						}
+					}
+					let itemT = {
+						id: item[this.valueKey],
+						name: item[this.textKey],
+						level,
+						isLastLevel,
+						isShow: isShowChild,
+						isShowChild: false,
+						checkStatus: initCheckStatus,
+						orCheckStatus: 0,
+						parentId,
+						children: item[this.childrenKey],
+						childCount: item[this.childrenKey] ? item[this.childrenKey].length : 0,
+						childCheckCount: 0,
+						childCheckPCount: 0
+					};
+					if (this.selectedData.indexOf(itemT.id) >= 0) {
+						itemT.checkStatus = 2;
+						itemT.orCheckStatus = 2;
+						itemT.childCheckCount = itemT.children ? itemT.children.length : 0;
+						this._onItemParentSelect(itemT, nextIndex);
+					}
+
+					this.treeList.splice(nextIndex, 0, itemT);
+					nextIndex++;
+				})
+				//console.log(this.treeList);
+			},
+			// 节点打开、关闭切换
+			_onItemSwitch(item, index) {
+				// console.log(item)
+				//console.log('_itemSwitch')
+				if (item.isLastLevel === true) {
+					return;
+				}
+				item.isShowChild = !item.isShowChild;
+				if (item.children) {
+					this._formatTreeData(item.children, item.level + 1, item);
+					item.children = undefined;
+				} else {
+					this._onItemChildSwitch(item, index);
+				}
+			},
+			_onItemChildSwitch(item, index) {
+				//console.log('_onItemChildSwitch')
+				const firstChildIndex = index + 1;
+				if (firstChildIndex > 0)
+					for (var i = firstChildIndex; i < this.treeList.length; i++) {
+						let itemChild = this.treeList[i];
+						if (itemChild.level > item.level) {
+							if (item.isShowChild) {
+								if (itemChild.parentId === item.id) {
+									itemChild.isShow = item.isShowChild;
+									if (!itemChild.isShow) {
+										itemChild.isShowChild = false;
+									}
+								}
+							} else {
+								itemChild.isShow = item.isShowChild;
+								itemChild.isShowChild = false;
+							}
+						} else {
+							return;
+						}
+					}
+			},
+			// 节点选中、取消选中
+			_onItemSelect(item, index) {
+				//console.log('_onItemSelect')
+				//console.log(item)
+				if (!this.multiple) { //单选
+					item.checkStatus = item.checkStatus == 0 ? 2 : 0;
+
+					this.treeList.forEach((v, i) => {
+						if (i != index) {
+							this.treeList[i].checkStatus = 0
+						} else {
+							this.treeList[i].checkStatus = 2
+						}
+					})
+
+					let selectedList = [];
+					let selectedNames;
+					selectedList.push(item.id);
+					selectedNames = item.name;
+					// this._hide()
+					this.$emit("select-change", selectedList, selectedNames);
+					return
+				}
+
+				let oldCheckStatus = item.checkStatus;
+				switch (oldCheckStatus) {
+					case 0:
+						item.checkStatus = 2;
+						item.childCheckCount = item.childCount;
+						item.childCheckPCount = 0;
+						break;
+					case 1:
+					case 2:
+						item.checkStatus = 0;
+						item.childCheckCount = 0;
+						item.childCheckPCount = 0;
+						break;
+					default:
+						break;
+				}
+				//子节点 全部选中
+				this._onItemChildSelect(item, index);
+				//父节点 选中状态变化
+				this._onItemParentSelect(item, index, oldCheckStatus);
+				// 选择返回
+				// this._confirm()
+				// this.$emit("select-change", selectedList, selectedNames);
+			},
+			_onItemChildSelect(item, index) {
+				//console.log('_onItemChildSelect')
+				let allChildCount = 0;
+				if (item.childCount && item.childCount > 0) {
+					index++;
+					while (index < this.treeList.length && this.treeList[index].level > item.level) {
+						let itemChild = this.treeList[index];
+						itemChild.checkStatus = item.checkStatus;
+						if (itemChild.checkStatus == 2) {
+							itemChild.childCheckCount = itemChild.childCount;
+							itemChild.childCheckPCount = 0;
+						} else if (itemChild.checkStatus == 0) {
+							itemChild.childCheckCount = 0;
+							itemChild.childCheckPCount = 0;
+						}
+						// console.log('>>>>index:', index, 'item:', itemChild.name, '  status:', itemChild
+						// 	.checkStatus)
+						index++;
+					}
+				}
+			},
+			_onItemParentSelect(item, index, oldCheckStatus) {
+				//console.log('_onItemParentSelect')
+				//console.log(item)
+				const parentIndex = this.treeList.findIndex(itemP => itemP.id == item.parentId);
+				//console.log('parentIndex:' + parentIndex)
+				if (parentIndex >= 0) {
+					let itemParent = this.treeList[parentIndex];
+					let count = itemParent.childCheckCount;
+					let oldCheckStatusParent = itemParent.checkStatus;
+
+					if (oldCheckStatus == 1) {
+						itemParent.childCheckPCount -= 1;
+					} else if (oldCheckStatus == 2) {
+						itemParent.childCheckCount -= 1;
+					}
+					if (item.checkStatus == 1) {
+						itemParent.childCheckPCount += 1;
+					} else if (item.checkStatus == 2) {
+						itemParent.childCheckCount += 1;
+					}
+
+					if (itemParent.childCheckCount <= 0 && itemParent.childCheckPCount <= 0) {
+						itemParent.childCheckCount = 0;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 0;
+					} else if (itemParent.childCheckCount >= itemParent.childCount) {
+						itemParent.childCheckCount = itemParent.childCount;
+						itemParent.childCheckPCount = 0;
+						itemParent.checkStatus = 2;
+					} else {
+						itemParent.checkStatus = 1;
+					}
+					//console.log('itemParent:', itemParent)
+					this._onItemParentSelect(itemParent, parentIndex, oldCheckStatusParent);
+				}
+			},
+			// 重置数据
+			_reTreeList() {
+				this.treeList.forEach((v, i) => {
+					this.treeList[i].checkStatus = v.orCheckStatus
+				})
+			},
+			_initTree() {
+				this.treeList = [];
+				this._formatTreeData(this.localdata);
+			}
+		},
+		watch: {
+			localdata() {
+				this._initTree();
+			},
+			localTreeList() {
+				this.treeList = this.localTreeList;
+			}
+		},
+		mounted() {
+			this._initTree();
+		}
+	}
+</script>
+
+<style scoped>
+	.tree-cover {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		z-index: 100;
+		background-color: rgba(0, 0, 0, .4);
+		opacity: 0;
+		transition: all 0.3s ease;
+		visibility: hidden;
+	}
+
+	.tree-cover.show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tree-dialog {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		background-color: #fff;
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 100002;
+		top: 20%;
+		transition: all 0.3s ease;
+		transform: translateY(100%);
+	}
+
+	.tree-dialog.show {
+		transform: translateY(0);
+	}
+
+	.tree-bar {
+		/* background-color: #fff; */
+		height: 90rpx;
+		padding-left: 25rpx;
+		padding-right: 25rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		box-sizing: border-box;
+		border-bottom-width: 1rpx !important;
+		border-bottom-style: solid;
+		border-bottom-color: #f5f5f5;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 1;
+	}
+
+	.tree-bar-confirm {
+		color: #1D64E2;
+		padding: 15rpx;
+	}
+
+	.tree-bar-title {}
+
+	.tree-bar-cancel {
+		color: #757575;
+		padding: 15rpx;
+	}
+
+	.tree-view {
+		flex: 1;
+		padding: 20rpx;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		overflow: hidden;
+		height: 100%;
+	}
+
+	.tree-list {
+		flex: 1;
+		height: 100%;
+		overflow: hidden;
+	}
+
+	.tree-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		line-height: 1;
+		height: 0;
+		opacity: 0;
+		transition: 0.2s;
+		overflow: hidden;
+	}
+
+	.tree-item.show {
+		height: 80rpx;
+		opacity: 1;
+	}
+
+	.tree-item.showchild:before {
+		transform: rotate(90deg);
+	}
+
+	.tree-item.last:before {
+		opacity: 0;
+	}
+
+	.switch-on {
+		width: 0;
+		height: 0;
+		border-left: 16rpx solid transparent;
+		border-right: 16rpx solid transparent;
+		border-top: 20rpx solid #666;
+	}
+
+	.switch-off {
+		width: 0;
+		height: 0;
+		border-bottom: 16rpx solid transparent;
+		border-top: 16rpx solid transparent;
+		border-left: 20rpx solid #666;
+	}
+
+	.item-last-dot {
+		position: absolute;
+		width: 12rpx;
+		height: 12rpx;
+		border-radius: 100%;
+		background: #666;
+	}
+
+	.item-icon {
+		width: 26rpx;
+		height: 30rpx;
+		margin-right: 8rpx;
+		padding-right: 20rpx;
+		padding-left: 20rpx;
+	}
+
+	.item-label {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		height: 100%;
+		line-height: 1.2;
+	}
+
+	.item-name {
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		/* width: 450rpx; */
+		font-size: 30rpx;
+		font-weight: bold;
+		line-height: 1;
+	}
+
+	.item-check {
+		width: 60rpx;
+		height: 60rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.item-check-yes,
+	.item-check-no {
+		width: 32rpx;
+		height: 32rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		border-top-width: 1rpx;
+		border-left-width: 1rpx;
+		border-bottom-width: 1rpx;
+		border-right-width: 1rpx;
+		border-style: solid;
+		border-color: #1D64E2;
+		border-radius: 8rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		 /* background-color: #1D64E2; */
+	}
+	.item-check-yes{
+		border: none;
+		background-color: #1D64E2;
+	}
+
+	.item-check-yes-part {
+		width: 24rpx;
+		height: 6rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		background-color: #ffffff;
+	}
+
+	.item-check-yes-all {
+		margin-bottom: 5px;
+		border: 2px solid #ffffff;
+		border-left: 0;
+		border-top: 0;
+		height: 12px;
+		width: 6px;
+		transform-origin: center;
+		/* #ifndef APP-NVUE */
+		transition: all 0.3s;
+		/* #endif */
+		transform: rotate(45deg);
+		/* border: none;
+		background-color: #1D64E2; */
+	}
+
+	.item-check .radio {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.item-check .radio .item-check-yes-b {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.hover-c {
+		opacity: 0.6;
+	}
+
+	.itemBorder {
+		border-bottom: 1px solid #e5e5e5;
+	}
+</style>

+ 406 - 0
components/ba-tree-picker/danpicker.vue

@@ -0,0 +1,406 @@
+<!-- 树形层级选择器-->
+<!-- 1、支持单选、多选 -->
+<template>
+	<view class="xmmain">
+		<view class="tree-cover" :class="{'show':showDialog}" @tap="_cancel"></view>
+		<view class="tree-dialog" :class="{'show':showDialog}">
+			<view class="tree-bar">
+				<view class="tree-bar-cancel" :style="{'color':cancelColor}" hover-class="hover-c" @tap="_cancel">取消
+				</view>
+				<view class="tree-bar-title" :style="{'color':titleColor}">{{title}}</view>
+				<view class="tree-bar-confirm" :style="{'color':confirmColor}" hover-class="hover-c" @tap="_confirm">
+					{{multiple?'确定':''}}
+				</view>
+			</view>
+			<view class="tree-view">
+				<scroll-view class="tree-list" :scroll-y="true">
+					<uni-data-checkbox selectedTextColor='#343434'  :map="map" :multiple="multiple" v-model="bgvalue" :localdata="localdata" @change="checkboxChangeadr"></uni-data-checkbox>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		emits: ['select-change'],
+		name: "ba-tree-picker",
+		props: {
+			map:{
+				type: Object,
+				default: {},
+			},
+			mvalue:{
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			valueKey: {
+				type: String,
+				default: 'id'
+			},
+			textKey: {
+				type: String,
+				default: 'name'
+			},
+			childrenKey: {
+				type: String,
+				default: 'children'
+			},
+			localdata: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			localTreeList: { //在已经格式化好的数据
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			selectedData: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			deptType:{
+				type: String,
+				default: ''
+			},
+			multiple: { // 是否可以多选
+				type: Boolean,
+				default: true
+			},
+			selectParent: { //是否可以选父级
+				type: Boolean,
+				default: true
+			},
+			confirmColor: { // 确定按钮颜色
+				type: String,
+				default: '' // #FE5706
+			},
+			cancelColor: { // 取消按钮颜色
+				type: String,
+				default: '' // #757575
+			},
+			titleColor: { // 标题颜色
+				type: String,
+				default: '' //
+			},
+			switchColor: { // 节点切换图标颜色
+				type: String,
+				default: '' // #666
+			},
+			border: { // 是否有分割线
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				showDialog: false,
+				treeList: [],
+				checkArr:[],
+				bgvalue:[1,2]
+			}
+		},
+		computed: {},
+		methods: {
+			checkboxChangeadr(e){
+				this.checkArr=e.detail.data;
+			},
+			_show() {
+				this.showDialog = true
+			},
+			_hide() {
+				this.showDialog = false
+			},
+			_cancel() {
+				this._hide()
+				this.$emit("cancel", '');
+			},
+			_confirm() { //多选
+				
+				this._hide()
+				if(this.checkArr.length>0){
+					this.$emit("select-change", this.checkArr);
+				}
+				// this.$emit("select-change", selectedList, selectedNames);	
+			},
+		},
+		watch: {
+			mvalue(data){
+				console.log(data,1)
+				this.bgvalue=data
+			}
+		},
+		mounted() {
+			this.bgvalue=this.mvalue;
+			// this._initTree();
+		}
+	}
+</script>
+
+<style scoped>
+.xmmain /deep/ .uni-data-checklist	.checklist-group{display: block;}
+.xmmain /deep/ .uni-data-checklist .checklist-group .checklist-box{padding: 28rpx 0;margin: 0;}
+ 
+ .xmmain /deep/ .uni-data-checklist .checklist-group .checklist-box .checklist-text{color: #343434;font-size: 34rpx;font-weight: bold;}
+.xmmain /deep/ .uni-data-checklist .checklist-group .checklist-box .checkbox__inner{margin-right: 32rpx;}
+.xmmain  /deep/ .uni-data-checklist .checklist-group .checklist-box.is--default.is-checked .checkbox__inner{border-color: #FF440B; background-color: #FF440B;}
+ .xmmain /deep/ .uni-data-checklist .checklist-group .checklist-box.is--default.is-checked .checklist-text{color: #343434;}
+.xmbtn{height: 100rpx;display: flex;align-items: center;justify-content: center;
+ &.btn1{width: 200rpx;}
+ &.btn2{background-color: $uni-color-fa;}
+}
+	.tree-cover {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		z-index: 100;
+		background-color: rgba(0, 0, 0, .4);
+		opacity: 0;
+		transition: all 0.3s ease;
+		visibility: hidden;
+	}
+
+	.tree-cover.show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tree-dialog {
+		position: fixed;
+		top: 0rpx;
+		right: 0rpx;
+		bottom: 0rpx;
+		left: 0rpx;
+		background-color: #fff;
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 100002;
+		top: 20%;
+		transition: all 0.3s ease;
+		transform: translateY(100%);
+	}
+
+	.tree-dialog.show {
+		transform: translateY(0);
+	}
+
+	.tree-bar {
+		/* background-color: #fff; */
+		height: 90rpx;
+		padding-left: 25rpx;
+		padding-right: 25rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		box-sizing: border-box;
+		border-bottom-width: 1rpx !important;
+		border-bottom-style: solid;
+		border-bottom-color: #f5f5f5;
+		font-size: 32rpx;
+		color: #757575;
+		line-height: 1;
+	}
+
+	.tree-bar-confirm {
+		color: #FE5706;
+		padding: 15rpx;
+	}
+
+	.tree-bar-title {}
+
+	.tree-bar-cancel {
+		color: #757575;
+		padding: 15rpx;
+	}
+
+	.tree-view {
+		flex: 1;
+		padding: 20rpx 36rpx;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		overflow: hidden;
+		height: 100%;
+	}
+
+	.tree-list {
+		flex: 1;
+		height: 100%;
+		overflow: hidden;
+	}
+
+	.tree-item {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		line-height: 1;
+		height: 0;
+		opacity: 0;
+		transition: 0.2s;
+		overflow: hidden;
+	}
+
+	.tree-item.show {
+		height: 90rpx;
+		opacity: 1;
+	}
+
+	.tree-item.showchild:before {
+		transform: rotate(90deg);
+	}
+
+	.tree-item.last:before {
+		opacity: 0;
+	}
+
+	.switch-on {
+		width: 0;
+		height: 0;
+		border-left: 16rpx solid transparent;
+		border-right: 16rpx solid transparent;
+		border-top: 20rpx solid #666;
+	}
+
+	.switch-off {
+		width: 0;
+		height: 0;
+		border-bottom: 16rpx solid transparent;
+		border-top: 16rpx solid transparent;
+		border-left: 20rpx solid #666;
+	}
+
+	.item-last-dot {
+		position: absolute;
+		width: 12rpx;
+		height: 12rpx;
+		border-radius: 100%;
+		background: #666;
+	}
+
+	.item-icon {
+		width: 26rpx;
+		height: 30rpx;
+		margin-right: 8rpx;
+		padding-right: 20rpx;
+		padding-left: 20rpx;
+	}
+
+	.item-label {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		height: 100%;
+		line-height: 1.2;
+	}
+
+	.item-name {
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		/* width: 450rpx; */
+		font-size: 34rpx;
+		font-weight: bold;
+		line-height: 1;
+	}
+
+	.item-check {
+		width: 40px;
+		height: 40px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.item-check-yes,
+	.item-check-no {
+		width: 32rpx;
+		height: 32rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		border-top-width: 1rpx;
+		border-left-width: 1rpx;
+		border-bottom-width: 1rpx;
+		border-right-width: 1rpx;
+		border-style: solid;
+		border-color: #FE5706;
+		border-radius: 8rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		 /* background-color: #FE5706; */
+	}
+	.item-check-yes{
+		border: none;
+		background-color: #FE5706;
+	}
+
+	.item-check-yes-part {
+		width: 24rpx;
+		height: 6rpx;
+		border-top-left-radius: 20%;
+		border-top-right-radius: 20%;
+		border-bottom-right-radius: 20%;
+		border-bottom-left-radius: 20%;
+		background-color: #ffffff;
+	}
+
+	.item-check-yes-all {
+		margin-bottom: 5px;
+		border: 2px solid #ffffff;
+		border-left: 0;
+		border-top: 0;
+		height: 12px;
+		width: 6px;
+		transform-origin: center;
+		/* #ifndef APP-NVUE */
+		transition: all 0.3s;
+		/* #endif */
+		transform: rotate(45deg);
+		/* border: none;
+		background-color: #FE5706; */
+	}
+
+	.item-check .radio {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.item-check .radio .item-check-yes-b {
+		border-top-left-radius: 50%;
+		border-top-right-radius: 50%;
+		border-bottom-right-radius: 50%;
+		border-bottom-left-radius: 50%;
+	}
+
+	.hover-c {
+		opacity: 0.6;
+	}
+
+	.itemBorder {
+		border-bottom: 1px solid #e5e5e5;
+	}
+</style>

+ 568 - 0
components/ba-tree-picker/selectMorePicker.vue

@@ -0,0 +1,568 @@
+<template name="aui-picker">
+	<view class="aui-picker" v-if="SHOW" :class="{
+		'aui-picker-in': FADE==1,
+		'aui-picker-out': FADE==0}"
+	>
+		
+		<view class="aui-picker-main">
+			<view class="aui-mask" @click.stop="close"></view>
+	        <view class="aui-picker-header">
+				<view @click.stop="close" class="aui-picker-close" >取消</view>
+	            <view class="aui-picker-title" v-if="title">{{title}}</view>
+	            <!-- <view class="aui-picker-close iconfont iconclose" ></view> -->
+				<!-- <view class="aui-picker-sure" @click.stop="getSure" v-if="titflag">确定</view> -->
+				<view class="aui-picker-sure" @click.stop="getSure" >确定</view>
+	        </view>
+	        <view class="aui-picker-nav">
+				<view class="aui-picker-navitem"
+					v-if="nav.length>0"
+					v-for="(item, index) in nav" 
+					:key="index" 
+					:data-index="index" 
+					:class="[index==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+index]" 
+		
+					@click.stop="_changeNav($event)"
+				>{{item.name}}</view>	
+							<!-- :style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}" -->
+				<view class="aui-picker-navitem"									
+					:key="nav.length" 
+					:data-index="nav.length"
+					:class="[nav.length==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+nav.length]" 
+					
+					@click.stop="_changeNav($event)"
+				>请选择</view>
+				<!-- :style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}" -->
+				<view class="aui-picker-navborder" :style="{left: navBorderLeft+'px'}"></view>
+			</view>
+	        <view class="aui-picker-content">
+	            <view class="aui-picker-lists">
+					<view class="aui-picker-list"
+						v-for="(list, index) in queryItems.length + 1"
+						:key="index" 
+						:data-index="index" 
+						:class="[index==navCurrentIndex ? 'active' : '']"
+					>
+						<view class="aui-picker-list-warp" v-if="index == 0">
+							<view class="aui-picker-item" 
+								v-for="(item, key) in items" 
+								v-if="item.pid=='0'"
+								:key="key"
+								:data-pindex="index"
+								:data-index="key"
+								:data-areaid="item.areaId" 
+								:data-pid="item.pid"
+								:data-name="item.name"
+								:class="{'active': result.length>index && result[index].areaid==item.areaId}"
+								:style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"
+								@click.stop="_chooseItem($event)"
+								@touchstart="_btnTouchStart($event)"
+								@touchmove="_btnTouchEnd($event)"
+								@touchend="_btnTouchEnd($event)"
+							>{{item.name}}</view>
+						</view>
+						<view class="aui-picker-list-warp" v-else>
+							<view class="aui-picker-item" 
+								v-for="(item, key) in queryItems[index-1]"
+								:key="key"
+								:data-pindex="index"
+								:data-index="key"
+								:data-areaid="item.areaId"
+								:data-pid="item.pid"
+								:data-name="item.name"
+								:class="{'active': result.length>index && result[index].areaid==item.areaId}"
+								:style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"
+								@click.stop="_chooseItem($event)"
+								@touchstart="_btnTouchStart($event)"
+								@touchmove="_btnTouchEnd($event)"
+								@touchend="_btnTouchEnd($event)"
+							>{{item.name}}</view>
+						</view>
+					</view>
+				</view>
+	        </view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {getarealist} from "@/api/work/addsk.js"
+	export default {
+		name: 'aui-picker',
+		props: {
+			title: { //标题
+				type: String,
+				default: ''
+			},
+			titflag:{
+				type: Boolean,
+				default: false,
+			},
+			layer: { //控制几级联动,默认无限级(跟随数据有无下级)
+				type: Number,
+				default: null
+			},
+			data: { //数据 如:[{id: '', name: '', children: [{id: '', name: ''}]}]
+				type: Array,
+				default (){
+					return [
+						// [{id: '', name: '', children: [{id: '', name: ''}]}]
+					]
+				}
+			}
+		},
+		data(){
+			return {
+				SHOW: false,
+				FADE: -1,
+				nav: [],
+				items: [],
+				queryItems: [],
+				navCurrentIndex: 0,
+				navBorderLeft: 25,
+				result: [],
+				touchConfig: {
+					index: -1,
+					pindex: -1,
+					style: {
+						color: '#197DE0',
+						background: '#EFEFEF'
+					} 
+				},
+				loadflag:false
+			}
+		},
+		created(){
+			const _this = this;
+		},
+		watch:{
+			data(){
+				
+				const _this = this;
+				const data = _this.data;
+				_this.items = _this._flatten(data, '0')
+	    }  
+	  },
+		mounted(){
+			
+		},
+		methods:{
+			// 打开
+			open(e){
+				const _this = this;	
+					_this.loadflag=false;
+					if(e==1){
+						_this.reset(); //打开时重置picker
+					}
+	
+				return new Promise(function(resolve, reject){
+					_this.SHOW = true;
+					_this.FADE = 1;
+					resolve();
+				});
+			},
+			// 关闭
+			close(){
+				const _this = this;
+				return new Promise(function(resolve, reject){
+					_this.FADE = 0;
+					const _hidetimer = setTimeout(()=>{
+						_this.SHOW = false;
+						_this.FADE = -1;
+						clearTimeout(_hidetimer);
+						resolve();						
+					},100)	
+				});
+			},
+			//重置
+			reset(){
+				const _this = this;
+				_this.queryItems = [];
+				_this.nav = [];
+				_this.navBorderLeft = 25;
+				_this.navCurrentIndex = 0;
+				_this.result = [];
+			},
+			//导航栏切换
+			_changeNav(e){
+				const _this = this;
+				const index = Number(e.currentTarget.dataset.index);
+				_this.navCurrentIndex = index;
+				const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-"+index);
+				_el.boundingClientRect(data => {
+					_this.navBorderLeft = data.left + 15;
+				}).exec();
+			},
+			//数据选择
+			_chooseItem(e){
+				// 加载的时候禁止点击
+				if(this.loadflag){
+					return
+				}
+				this.loadflag=true;
+				const _this = this;
+				const areaid = e.currentTarget.dataset.areaid;
+				const name = e.currentTarget.dataset.name;
+				const pid = e.currentTarget.dataset.pid;
+				const _arr = [];
+				// 获取新数据
+				_this.result[_this.navCurrentIndex] = {areaid: areaid, name: name, pid: pid};
+				// 只选择两级
+				if(_this.navCurrentIndex==1){
+					this.loadflag=false;
+					_this.close().then(()=>{
+						_this.$emit("callback", {status: 0, data: _this.result});
+					});
+					return
+				}
+				getarealist(areaid).then(res=>{
+					this.loadflag=false;
+					if(res.data.length>0){
+						if(_this.navCurrentIndex == _this.queryItems.length)
+						{ //选择数据
+							_this.queryItems.push(res.data);
+							_this.nav.push({name: name});
+						}
+						else
+						{ //重新选择数据
+							_this.queryItems.splice(_this.navCurrentIndex+1);
+							_this.nav.splice(_this.navCurrentIndex+1);
+							_this.queryItems.splice(_this.navCurrentIndex, 1, res.data);
+							_this.nav.splice(_this.navCurrentIndex, 1, {name: name});
+							//清空后面的选择
+							_this.result.splice(Number(_this.navCurrentIndex+1))
+						}
+						_this.navCurrentIndex = _this.navCurrentIndex + 1;
+						const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-"+_this.navCurrentIndex);
+						setTimeout(()=>{
+							_el.boundingClientRect(data => {
+								_this.navBorderLeft = data.left + 15;
+							}).exec();
+						},100)
+					}else{
+						//无下级数据
+						_this.close().then(()=>{
+							_this.$emit("callback", {status: 0, data: _this.result});
+						});
+					}
+				})
+				// _this.result[_this.navCurrentIndex] = {areaId: areaId, name: name, pid: pid};
+				// if(
+				// 	(!_this._isDefine(_this.layer) && _this._isDefine(_this._deepQuery(_this.data, areaId).children)) 
+				// 	|| 
+				// 	(_this.navCurrentIndex < (Number(_this.layer) - 1) && _this._isDefine(_this._deepQuery(_this.data, areaId).children))
+				// )
+				// { //有下级数据
+				// 	_this._deepQuery(_this.data, areaId).children.forEach(function(item, index){
+				// 		_arr.push({areaId: item.areaId, name: item.name, pid: id});
+				// 	});
+				// 	if(_this.navCurrentIndex == _this.queryItems.length)
+				// 	{ //选择数据
+				// 		_this.queryItems.push(_arr);
+				// 		_this.nav.push({name: name});
+				// 	}
+				// 	else
+				// 	{ //重新选择数据
+				// 		_this.queryItems.splice(_this.navCurrentIndex+1, 1);
+				// 		_this.nav.splice(_this.navCurrentIndex+1, 1);
+				// 		_this.queryItems.splice(_this.navCurrentIndex, 1, _arr);
+				// 		_this.nav.splice(_this.navCurrentIndex, 1, {name: name});
+				// 	}
+				// 	_this.navCurrentIndex = _this.navCurrentIndex + 1;
+				// 	const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-"+_this.navCurrentIndex);
+				// 	setTimeout(()=>{
+				// 		_el.boundingClientRect(data => {
+				// 			_this.navBorderLeft = data.left + 20;
+				// 		}).exec();
+				// 	},100)
+				// }
+				// else
+				// { //无下级数据
+				// 	_this.close().then(()=>{
+				// 		_this.$emit("callback", {status: 0, data: _this.result});
+				// 	});
+				// }
+			},	
+			getSure(){
+				this.close().then(()=>{
+					this.$emit("callback", {status: 0, data: this.result});
+				});
+			},
+			//递归遍历——将树形结构数据转化为数组格式
+			_flatten(tree, pid) {
+				return tree.reduce((arr, {areaId, name, children = []}) =>
+				arr.concat([{areaId, name, pid}], this._flatten(children, areaId)), [])
+			},
+			//根据id查询对应的数据(如查询id=10100对应的对象)
+			_deepQuery(tree, areaId) {
+			    let isGet = false;
+			    let retNode = null;
+			    function deepSearch(tree, areaId){
+			        for(let i = 0; i < tree.length; i++) {
+			            if(tree[i].children && tree[i].children.length > 0) {
+			                deepSearch(tree[i].children, areaId);
+			            }
+			            if(areaId === tree[i].areaId || isGet) {
+			                isGet||(retNode = tree[i]);
+			                isGet = true;
+			                break;
+			            }
+			        }
+			    }
+			    deepSearch(tree, areaId);
+			    return retNode;
+			},
+			/***判断字符串是否为空
+			   @param {string} str 变量
+			   @example: aui.isDefine("变量");
+			*/
+			_isDefine(str){
+				if (str==null || str=="" || str=="undefined" || str==undefined || str=="null" || str=="(null)" || str=='NULL' || typeof (str)=='undefined'){
+					return false;
+				}else{
+					str = str + "";
+					str = str.replace(/\s/g, "");
+					if (str == ""){return false;}
+					return true;
+				}
+			},
+			_btnTouchStart(e){
+				const _this = this,
+					index = Number(e.currentTarget.dataset.index),
+					pindex = Number(e.currentTarget.dataset.pindex);
+				_this.touchConfig.index = index;
+				_this.touchConfig.pindex = pindex;
+			},
+			_btnTouchEnd(e){
+				const _this = this,
+					index = Number(e.currentTarget.dataset.index),
+					pindex = Number(e.currentTarget.dataset.pindex);
+				_this.touchConfig.index = -1;
+				_this.touchConfig.pindex = -1;
+			},	
+		}
+	}
+</script>
+
+<style scoped>
+	/* ====================
+		多级联动弹窗
+	 =====================*/
+	.aui-picker{
+		width: 100vw;
+		height: 100vh;
+		/* opacity: 0;		 */
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 1200;
+		background: rgba(0,0,0,0.5);
+		/* display: none; */
+	}
+	.aui-picker.aui-picker-in{
+		-moz-animation: aui-fade-in .1s ease-out forwards;
+		-ms-animation: aui-fade-in .1s ease-out forwards;
+		-webkit-animation: aui-fade-in .1s ease-out forwards;
+		animation: aui-fade-in .1s ease-out forwards;
+	}
+	.aui-picker.aui-picker-out{
+		-moz-animation: aui-fade-out .1s ease-out forwards;
+		-ms-animation: aui-fade-out .1s ease-out forwards;
+		-webkit-animation: aui-fade-out .1s ease-out forwards;
+		animation: aui-fade-out .1s ease-out forwards;
+	}
+	.aui-picker-main{
+		width: 100vw;
+		height: 50vh;
+		background: #FFF;
+		border-radius: 15px 15px 0 0;
+		position: absolute;
+		left: 0px;
+		/* bottom: -50vh;		 */
+		bottom: 0vh;		
+		z-index: 999;
+	}
+	.aui-picker.aui-picker-in .aui-picker-main{
+		-moz-animation: aui-slide-up-screen .2s ease-out forwards;
+		-ms-animation: aui-slide-up-screen .2s ease-out forwards;
+		-webkit-animation: aui-slide-up-screen .2s ease-out forwards;
+		animation: aui-slide-up-screen .2s ease-out forwards;
+	}
+	.aui-picker.aui-picker-out .aui-picker-main{
+		-moz-animation: aui-slide-down-screen .2s ease-out forwards;
+		-ms-animation: aui-slide-down-screen .2s ease-out forwards;
+		-webkit-animation: aui-slide-down-screen .2s ease-out forwards;
+		animation: aui-slide-down-screen .2s ease-out forwards;
+	}
+	.aui-picker-header{
+		width: 100%;
+		height: 50px;
+		position: relative;
+		z-index: 999;
+		background: #F2F2F2;
+		border-radius: 15px 15px 0 0;
+		display: flex;
+		align-items: center;
+	}
+	.aui-picker-header::after{
+		content: '';
+		width: 100%;
+		height: 1px;
+		background: rgba(100,100,100,.3);
+		-moz-transform: scaleY(.3);
+		-ms-transform: scaleY(.3);
+		-webkit-transform: scaleY(.3);
+		transform: scaleY(.3);
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 999;
+	}
+	.aui-picker-title{
+		line-height: 20px;
+		text-align: center;
+		font-size: 17px;
+		color: #333;
+		padding: 15px;
+		box-sizing: border-box;
+		flex: 1;
+		text-align: center;
+		/* position: absolute;
+		left: 50px;
+		right: 50px;
+		top: 0; */
+	}
+	.aui-picker-close{
+		font-size: 15px;
+		color: #333333;
+		flex: 0 0 auto;
+		height: 50px;
+		width: 60px;
+		text-align: center;
+		line-height: 50px;
+	}
+	.aui-picker-sure{
+		flex: 0 0 auto;
+		font-size: 15px;
+		color: #197DE0;
+		height: 50px;
+		width: 60px;
+		text-align: center;
+		line-height: 50px;
+	}
+	/* .aui-picker-close.iconfont{
+		width: 50px;
+		height: 50px;
+		line-height: 50px;
+		text-align: center;
+		font-size: 20px;
+		color: #aaa;
+		border-radius: 0 10px 0 0;
+		position: absolute;
+		right: 0;
+		top: 0;
+	} */
+	.aui-picker-content{
+		width: 100%;
+		height: -webkit-calc(100% - 100px);
+		height: calc(100% - 100px);
+	}
+	.aui-picker-nav{
+		width: 100%;
+		height: 50px;
+		text-align: left;
+		padding: 0 20rpx;
+		margin: 0 0 1px 0;
+		justify-content: flex-start;
+		white-space: nowrap;
+		box-sizing: border-box;
+		position: relative;
+		display: flex;
+		align-items: center;
+	}
+	.aui-picker-nav::after{
+		content: '';
+		width: 100%;
+		height: 1px;
+		background: rgba(100,100,100,.3);
+		-moz-transform: scaleY(.3);
+		-ms-transform: scaleY(.3);
+		-webkit-transform: scaleY(.3);
+		transform: scaleY(.3);
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 999;
+	}
+	.aui-picker-navitem{
+		flex: 1;
+		max-width:70px ;
+		/* width: 80px; */
+		line-height: 50px;
+		font-size: 16px;
+		
+		text-align: center;
+		display: inline-block;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+	.aui-picker-navitem.active{
+		color: #197DE0;
+	}
+	.aui-picker-navborder{
+		width: 40px;
+		height: 3px;
+		background: #197DE0;
+		border-radius: 5px;
+		transition: left .15s;
+		position: absolute;
+		left: 25px;
+		bottom: 0;
+	}
+	.aui-picker-lists{
+		width: 100%;
+		height: 100%;
+		justify-content: space-around;
+		white-space: nowrap;
+	}
+	.aui-picker-list{
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+		overflow-y: scroll;
+		display: none;
+		vertical-align: top;
+	}
+	.aui-picker-list.active{
+		display: inline-block;
+	}
+	.aui-picker-list-warp{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 15px 0;
+		display: inline-block;
+	}
+	.aui-picker-item{
+		width: 100%;
+		height: 50px;
+		line-height: 50px;
+		padding: 0 15px;
+		box-sizing: border-box;
+		font-size: 15px;
+		color: #333;
+		position: relative;
+	}
+	.aui-picker-item.active{
+		color: #197DE0;
+	}
+	.aui-picker-item.active::after{
+		content: '✔';
+		font-size: 15px;
+		color: #197DE0;
+		position: absolute;
+		top: 0px;
+		right: 10px;
+	}
+
+</style>

+ 569 - 0
components/ba-tree-picker/selectnoreMorePicker.vue

@@ -0,0 +1,569 @@
+<template name="aui-picker">
+	<view class="aui-picker" v-if="SHOW" :class="{
+		'aui-picker-in': FADE==1,
+		'aui-picker-out': FADE==0}">
+
+		<view class="aui-picker-main">
+			<view class="aui-mask" @click.stop="close"></view>
+			<view class="aui-picker-header">
+				<view @click.stop="close" class="aui-picker-close">取消</view>
+				<view class="aui-picker-title" v-if="title">{{title}}</view>
+				<!-- <view class="aui-picker-close iconfont iconclose" ></view> -->
+				<!-- <view class="aui-picker-sure" @click.stop="getSure" v-if="titflag">确定</view> -->
+				<view class="aui-picker-sure" @click.stop="getSure">确定</view>
+			</view>
+			<view class="aui-picker-nav">
+				<view class="aui-picker-navitem" v-if="nav.length>0" v-for="(item, index) in nav" :key="index"
+					:data-index="index" :class="[index==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+index]"
+					@click.stop="_changeNav($event)">{{item.label}}</view>
+				<!-- :style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}" -->
+				<view class="aui-picker-navitem" :key="nav.length" :data-index="nav.length"
+					:class="[nav.length==navCurrentIndex ? 'active' : '', 'aui-picker-navitem-'+nav.length]"
+					@click.stop="_changeNav($event)">请选择</view>
+				<!-- :style="{margin: nav.length>2 ? '0 10px 0 0' : '0 30px 0 0'}" -->
+				<view class="aui-picker-navborder" :style="{left: navBorderLeft+'px'}"></view>
+			</view>
+			<view class="aui-picker-content">
+				<view class="aui-picker-lists">
+					<view class="aui-picker-list" v-for="(list, index) in queryItems.length + 1" :key="index"
+						:data-index="index" :class="[index==navCurrentIndex ? 'active' : '']">
+						<view class="aui-picker-list-warp" v-if="index == 0">
+							<view class="aui-picker-item" v-for="(item, key) in items" :key="key" :data-pindex="index"
+								:data-index="key" :data-id="item.id" :data-label="item.label"
+								:class="{'active': result.length>index && result[index].id==item.id}"
+								:style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"
+								@click.stop="_chooseItem($event)" @touchstart="_btnTouchStart($event)"
+								@touchmove="_btnTouchEnd($event)" @touchend="_btnTouchEnd($event)">{{item.label}}</view>
+						</view>
+						<view class="aui-picker-list-warp" v-else>
+							<view class="aui-picker-item" v-for="(item, key) in queryItems[index-1]" :key="key"
+								:data-pindex="index" :data-index="key" :data-id="item.id" :data-label="item.label"
+								:class="{'active': result.length>index && result[index].id==item.id}"
+								:style="{'background': touchConfig.index==key && touchConfig.pindex==index ? touchConfig.style.background : ''}"
+								@click.stop="_chooseItem($event)" @touchstart="_btnTouchStart($event)"
+								@touchmove="_btnTouchEnd($event)" @touchend="_btnTouchEnd($event)">{{item.label}}</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		label: 'aui-picker',
+		props: {
+			title: { //标题
+				type: String,
+				default: ''
+			},
+			titflag: {
+				type: Boolean,
+				default: false,
+			},
+			layer: { //控制几级联动,默认无限级(跟随数据有无下级)
+				type: Number,
+				default: null
+			},
+			data: { //数据 如:[{id: '', label: '', children: [{id: '', label: ''}]}]
+				type: Array,
+				default () {
+					return [
+						// [{id: '', label: '', children: [{id: '', label: ''}]}]
+					]
+				}
+			}
+		},
+		data() {
+			return {
+				SHOW: false,
+				FADE: -1,
+				nav: [],
+				items: [],
+				queryItems: [],
+				navCurrentIndex: 0,
+				navBorderLeft: 25,
+				result: [],
+				touchConfig: {
+					index: -1,
+					pindex: -1,
+					style: {
+						color: '#197DE0',
+						background: '#EFEFEF'
+					}
+				},
+				loadflag: false
+			}
+		},
+		created() {
+			const _this = this;
+		},
+		watch: {
+			data() {
+
+				const _this = this;
+				const data = _this.data;
+				// _this.items = _this._flatten(data, '0')
+				_this.items = data
+			}
+		},
+		mounted() {
+		},
+		methods: {
+			// 打开
+			open(e) {
+				const _this = this;
+				if (e == 1) {
+					_this.reset(); //打开时重置picker
+				}
+
+				return new Promise(function(resolve, reject) {
+					_this.SHOW = true;
+					_this.FADE = 1;
+					resolve();
+				});
+			},
+			// 关闭
+			close() {
+				const _this = this;
+				return new Promise(function(resolve, reject) {
+					_this.FADE = 0;
+					const _hidetimer = setTimeout(() => {
+						_this.SHOW = false;
+						_this.FADE = -1;
+						clearTimeout(_hidetimer);
+						resolve();
+					}, 100)
+				});
+			},
+			//重置
+			reset() {
+				const _this = this;
+				_this.queryItems = [];
+				_this.nav = [];
+				_this.navBorderLeft = 25;
+				_this.navCurrentIndex = 0;
+				_this.result = [];
+			},
+			//导航栏切换
+			_changeNav(e) {
+				const _this = this;
+				const index = Number(e.currentTarget.dataset.index);
+				_this.navCurrentIndex = index;
+				const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-" + index);
+				_el.boundingClientRect(data => {
+					_this.navBorderLeft = data.left + 15;
+				}).exec();
+			},
+			//数据选择
+			_chooseItem(e) {
+				// 加载的时候禁止点击
+				// if (this.loadflag) {
+				// 	return
+				// }
+				// this.loadflag = true;
+				const _this = this;
+				const id = e.currentTarget.dataset.id;
+				const label = e.currentTarget.dataset.label;
+				// const deptId = e.currentTarget.dataset.deptId;
+				const _arr = [];
+				// 获取新数据
+				// _this.result[_this.navCurrentIndex] = {id: id, label: label, deptId: deptId};
+				// _this.$http.post('boman-system/chinaArea/treeSelect',{deptId: id}).then(res=>{
+				// 	this.loadflag=false;
+				// 	if(res.data.length>0){
+				// 		if(_this.navCurrentIndex == _this.queryItems.length)
+				// 		{ //选择数据
+				// 			_this.queryItems.push(res.data);
+				// 			_this.nav.push({label: label});
+				// 		}
+				// 		else
+				// 		{ //重新选择数据
+				// 			_this.queryItems.splice(_this.navCurrentIndex+1);
+				// 			_this.nav.splice(_this.navCurrentIndex+1);
+				// 			_this.queryItems.splice(_this.navCurrentIndex, 1, res.data);
+				// 			_this.nav.splice(_this.navCurrentIndex, 1, {label: label});
+				// 			//清空后面的选择
+				// 			_this.result.splice(Number(_this.navCurrentIndex+1))
+				// 		}
+				// 		_this.navCurrentIndex = _this.navCurrentIndex + 1;
+				// 		const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-"+_this.navCurrentIndex);
+				// 		setTimeout(()=>{
+				// 			_el.boundingClientRect(data => {
+				// 				_this.navBorderLeft = data.left + 15;
+				// 			}).exec();
+				// 		},100)
+				// 	}else{
+				// 		//无下级数据
+				// 		_this.close().then(()=>{
+				// 			_this.$emit("callback", {status: 0, data: _this.result});
+				// 		});
+				// 	}
+				// })
+				
+				_this.result.splice(Number(_this.navCurrentIndex+1))
+				_this.result[_this.navCurrentIndex] = {
+					id: id,
+					label: label,
+				};
+				// console.log(id)
+				// console.log(_this._deepQuery(_this.data, id),7)
+				if (
+					(!_this._isDefine(_this.layer) && _this._isDefine(_this._deepQuery(_this.data, id).children)) ||
+					(_this.navCurrentIndex < (Number(_this.layer) - 1) && _this._isDefine(_this._deepQuery(_this.data, id).children))
+				) { //有下级数据
+					_this._deepQuery(_this.data, id).children.forEach(function(item, index) {
+						_arr.push({
+							id: item.id,
+							label: item.label,
+						});
+					});
+					if (_this.navCurrentIndex == _this.queryItems.length) { //选择数据
+						_this.queryItems.push(_arr);
+						_this.nav.push({
+							label: label
+						});
+					} else { //重新选择数据
+						_this.queryItems.splice(_this.navCurrentIndex + 1, 1);
+						_this.nav.splice(_this.navCurrentIndex + 1, 1);
+						_this.queryItems.splice(_this.navCurrentIndex, 1, _arr);
+						_this.nav.splice(_this.navCurrentIndex, 1, {
+							label: label
+						});
+					}
+					_this.navCurrentIndex = _this.navCurrentIndex + 1;
+					const _el = uni.createSelectorQuery().in(this).select(".aui-picker-navitem-" + _this.navCurrentIndex);
+					setTimeout(() => {
+						_el.boundingClientRect(data => {
+							_this.navBorderLeft = data.left + 20;
+						}).exec();
+					}, 100)
+				} else { //无下级数据
+					_this.close().then(() => {
+						_this.$emit("callback", {
+							status: 0,
+							data: _this.result
+						});
+					});
+				}
+			},
+			getSure() {
+				this.close().then(() => {
+					this.$emit("callback", {
+						status: 0,
+						data: this.result
+					});
+				});
+			},
+			//递归遍历——将树形结构数据转化为数组格式
+			_flatten(tree, deptId) {
+				return tree.reduce((arr, {
+						id,
+						label,
+						children = []
+					}) =>
+					arr.concat([{
+						id,
+						label,
+					}], this._flatten(id)), [])
+			},
+			//根据id查询对应的数据(如查询id=10100对应的对象)
+			_deepQuery(tree, id) {
+				let isGet = false;
+				let retNode = null;
+				function deepSearch(tree, id) {
+					for (let i = 0; i < tree.length; i++) {
+						if (tree[i].children && tree[i].children.length > 0) {
+							deepSearch(tree[i].children, id);
+						}
+						if (id == tree[i].id || isGet) {
+							isGet || (retNode = tree[i]);
+							isGet = true;
+							break;
+						}
+					}
+				}
+				deepSearch(tree, id);
+				return retNode;
+			},
+			/***判断字符串是否为空
+			   @param {string} str 变量
+			   @example: aui.isDefine("变量");
+			*/
+			_isDefine(str) {
+				if (str == null || str == "" || str == "undefined" || str == undefined || str == "null" || str ==
+					"(null)" || str == 'NULL' || typeof(str) == 'undefined') {
+					return false;
+				} else {
+					str = str + "";
+					str = str.replace(/\s/g, "");
+					if (str == "") {
+						return false;
+					}
+					return true;
+				}
+			},
+			_btnTouchStart(e) {
+				const _this = this,
+					index = Number(e.currentTarget.dataset.index),
+					pindex = Number(e.currentTarget.dataset.pindex);
+				_this.touchConfig.index = index;
+				_this.touchConfig.pindex = pindex;
+			},
+			_btnTouchEnd(e) {
+				const _this = this,
+					index = Number(e.currentTarget.dataset.index),
+					pindex = Number(e.currentTarget.dataset.pindex);
+				_this.touchConfig.index = -1;
+				_this.touchConfig.pindex = -1;
+			},
+		}
+	}
+</script>
+
+<style scoped>
+	/* ====================
+		多级联动弹窗
+	 =====================*/
+	.aui-picker {
+		width: 100vw;
+		height: 100vh;
+		/* opacity: 0;		 */
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 1200;
+		background: rgba(0, 0, 0, 0.5);
+		/* display: none; */
+	}
+
+	.aui-picker.aui-picker-in {
+		-moz-animation: aui-fade-in .1s ease-out forwards;
+		-ms-animation: aui-fade-in .1s ease-out forwards;
+		-webkit-animation: aui-fade-in .1s ease-out forwards;
+		animation: aui-fade-in .1s ease-out forwards;
+	}
+
+	.aui-picker.aui-picker-out {
+		-moz-animation: aui-fade-out .1s ease-out forwards;
+		-ms-animation: aui-fade-out .1s ease-out forwards;
+		-webkit-animation: aui-fade-out .1s ease-out forwards;
+		animation: aui-fade-out .1s ease-out forwards;
+	}
+
+	.aui-picker-main {
+		width: 100vw;
+		height: 50vh;
+		background: #FFF;
+		border-radius: 15px 15px 0 0;
+		position: absolute;
+		left: 0px;
+		/* bottom: -50vh;		 */
+		bottom: 0vh;
+		z-index: 999;
+	}
+
+	.aui-picker.aui-picker-in .aui-picker-main {
+		-moz-animation: aui-slide-up-screen .2s ease-out forwards;
+		-ms-animation: aui-slide-up-screen .2s ease-out forwards;
+		-webkit-animation: aui-slide-up-screen .2s ease-out forwards;
+		animation: aui-slide-up-screen .2s ease-out forwards;
+	}
+
+	.aui-picker.aui-picker-out .aui-picker-main {
+		-moz-animation: aui-slide-down-screen .2s ease-out forwards;
+		-ms-animation: aui-slide-down-screen .2s ease-out forwards;
+		-webkit-animation: aui-slide-down-screen .2s ease-out forwards;
+		animation: aui-slide-down-screen .2s ease-out forwards;
+	}
+
+	.aui-picker-header {
+		width: 100%;
+		height: 50px;
+		position: relative;
+		z-index: 999;
+		background: #F2F2F2;
+		border-radius: 15px 15px 0 0;
+		display: flex;
+		align-items: center;
+	}
+
+	.aui-picker-header::after {
+		content: '';
+		width: 100%;
+		height: 1px;
+		background: rgba(100, 100, 100, .3);
+		-moz-transform: scaleY(.3);
+		-ms-transform: scaleY(.3);
+		-webkit-transform: scaleY(.3);
+		transform: scaleY(.3);
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 999;
+	}
+
+	.aui-picker-title {
+		line-height: 20px;
+		text-align: center;
+		font-size: 17px;
+		color: #333;
+		padding: 15px;
+		box-sizing: border-box;
+		flex: 1;
+		text-align: center;
+		/* position: absolute;
+		left: 50px;
+		right: 50px;
+		top: 0; */
+	}
+
+	.aui-picker-close {
+		font-size: 15px;
+		color: #333333;
+		flex: 0 0 auto;
+		height: 50px;
+		width: 60px;
+		text-align: center;
+		line-height: 50px;
+	}
+
+	.aui-picker-sure {
+		flex: 0 0 auto;
+		font-size: 15px;
+		color: #197DE0;
+		height: 50px;
+		width: 60px;
+		text-align: center;
+		line-height: 50px;
+	}
+
+	/* .aui-picker-close.iconfont{
+		width: 50px;
+		height: 50px;
+		line-height: 50px;
+		text-align: center;
+		font-size: 20px;
+		color: #aaa;
+		border-radius: 0 10px 0 0;
+		position: absolute;
+		right: 0;
+		top: 0;
+	} */
+	.aui-picker-content {
+		width: 100%;
+		height: -webkit-calc(100% - 100px);
+		height: calc(100% - 100px);
+	}
+
+	.aui-picker-nav {
+		width: 100%;
+		height: 50px;
+		text-align: left;
+		padding: 0 20rpx;
+		margin: 0 0 1px 0;
+		justify-content: flex-start;
+		white-space: nowrap;
+		box-sizing: border-box;
+		position: relative;
+		display: flex;
+		align-items: center;
+	}
+
+	.aui-picker-nav::after {
+		content: '';
+		width: 100%;
+		height: 1px;
+		background: rgba(100, 100, 100, .3);
+		-moz-transform: scaleY(.3);
+		-ms-transform: scaleY(.3);
+		-webkit-transform: scaleY(.3);
+		transform: scaleY(.3);
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 999;
+	}
+
+	.aui-picker-navitem {
+		flex: 1;
+		max-width: 70px;
+		/* width: 80px; */
+		line-height: 50px;
+		font-size: 16px;
+
+		text-align: center;
+		display: inline-block;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.aui-picker-navitem.active {
+		color: #197DE0;
+	}
+
+	.aui-picker-navborder {
+		width: 40px;
+		height: 3px;
+		background: #197DE0;
+		border-radius: 5px;
+		transition: left .15s;
+		position: absolute;
+		left: 25px;
+		bottom: 0;
+	}
+
+	.aui-picker-lists {
+		width: 100%;
+		height: 100%;
+		justify-content: space-around;
+		white-space: nowrap;
+	}
+
+	.aui-picker-list {
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+		overflow-y: scroll;
+		display: none;
+		vertical-align: top;
+	}
+
+	.aui-picker-list.active {
+		display: inline-block;
+	}
+
+	.aui-picker-list-warp {
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 15px 0;
+		display: inline-block;
+	}
+
+	.aui-picker-item {
+		width: 100%;
+		height: 50px;
+		line-height: 50px;
+		padding: 0 15px;
+		box-sizing: border-box;
+		font-size: 15px;
+		color: #333;
+		position: relative;
+	}
+
+	.aui-picker-item.active {
+		color: #197DE0;
+	}
+
+	.aui-picker-item.active::after {
+		content: '✔';
+		font-size: 15px;
+		color: #197DE0;
+		position: absolute;
+		top: 0px;
+		right: 10px;
+	}
+</style>

+ 16 - 1
components/popup/popup.vue

@@ -15,7 +15,19 @@
 				<view class="btns btn2" @click="getClose">立即确认</view>
 			</view>
 		</view>
-		
+		<!-- 暂存提案的弹窗 -->
+		<view class="fixedbox" v-if="type=='zcta'">
+			<view class="ttit">提示</view>
+			<view  class="boxs">
+				<view class="ztit">您有一条暂存提案还未提交</view>
+				<view class="ztit">是否继续编辑?</view>
+				<view class="ztit mb32">查看<text @click="getFaFn('old')">暂存提案</text></view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getFaFn('new')">重新发布</view>
+				<view class="btns btn2" @click="getFaFn('old')">继续发布</view>
+			</view>
+		</view>
 	</view>
 </template>
 
@@ -51,6 +63,9 @@
 			getClose(){
 				this.$emit("getClose")
 			},
+			getFaFn(type){
+				this.$emit('getFaFn',type)
+			},
 		}
 	}
 </script>

+ 16 - 4
pages/index/index.vue

@@ -17,7 +17,7 @@
 			<image :src="bgimg" class="bgimg"></image>
 			<view class="zxmain">
 				<view class="flexc mb27">
-					<view class="htop" @click="getAddCase">
+					<view class="htop" @click="getAddCase" v-if="checkPermi(['proposalInfo:info:add'])">
 						<view class="imgs">
 							<image :src="htopa" class="imga"></image>
 						</view>
@@ -49,7 +49,7 @@
 					<view class="mt22">
 						<view class="htit">快捷入口</view>
 						<view class="mt18 flexcw">
-							<view class="htbox" @click="getZxCaseFn">
+							<view class="htbox" @click="getZxCaseFn" v-if="checkPermi(['proposalInfo:info:list'])">
 								<image :src="hrbga" class="hrbg"></image>
 								<view class="htboxa flexc">
 									<view class="flex1 mr10">
@@ -114,7 +114,7 @@
 				</view>
 			</view>
 		</view>
-	<pop-up :type='ptype' @getClose="getClose"></pop-up>
+	<pop-up :type='ptype' @getClose="getClose" @getFaFn="getFaFn"></pop-up>
 	<footers v-if="isfootflag" :footlist="footlist" :footerindex="footerindex" :color_checked="color_checked" :color_nochecked="color_nochecked" :isHomeIndex="true"></footers>
   </view>
 </template>
@@ -246,7 +246,19 @@
 			}).exec();
 		},
 		getAddCase(){
-			this.$tab.navigateTo('/work/pages/case/add')
+			if(uni.getStorageSync('tjtaList')){
+				// var newObj=JSON.parse(JSON.stringify(uni.getStorageSync('tjtaList')))
+				this.ptype='zcta'
+			}else{
+				this.$tab.navigateTo('/work/pages/case/add')
+			}
+		},
+		getFaFn(type){
+			this.ptype="";
+			if(type=='new'){
+				uni.removeStorageSync('tjtaList')
+			}
+			this.$tab.navigateTo('/work/pages/case/add?type='+type)	
 		},
 		getZxCaseFn(){
 			this.$tab.navigateTo('/work/pages/case/mine')

+ 2 - 0
uni_modules/uni-section/changelog.md

@@ -0,0 +1,2 @@
+## 0.0.1(2022-07-22)
+- 初始化

+ 167 - 0
uni_modules/uni-section/components/uni-section/uni-section.vue

@@ -0,0 +1,167 @@
+<template>
+	<view class="uni-section">
+		<view class="uni-section-header" @click="onClick">
+				<view class="uni-section-header__decoration" v-if="type" :class="type" />
+        <slot v-else name="decoration"></slot>
+
+        <view class="uni-section-header__content">
+          <text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text>
+          <text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text>
+        </view>
+
+        <view class="uni-section-header__slot-right">
+          <slot name="right"></slot>
+        </view>
+		</view>
+
+		<view class="uni-section-content" :style="{padding: _padding}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+
+	/**
+	 * Section 标题栏
+	 * @description 标题栏
+	 * @property {String} type = [line|circle|square] 标题装饰类型
+	 * 	@value line 竖线
+	 * 	@value circle 圆形
+	 * 	@value square 正方形
+	 * @property {String} title 主标题
+	 * @property {String} titleFontSize 主标题字体大小
+	 * @property {String} titleColor 主标题字体颜色
+	 * @property {String} subTitle 副标题
+	 * @property {String} subTitleFontSize 副标题字体大小
+	 * @property {String} subTitleColor 副标题字体颜色
+	 * @property {String} padding 默认插槽 padding
+	 */
+
+	export default {
+		name: 'UniSection',
+    emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			title: {
+				type: String,
+				required: true,
+				default: ''
+			},
+      titleFontSize: {
+        type: String,
+        default: '14px'
+      },
+			titleColor:{
+				type: String,
+				default: '#333'
+			},
+			subTitle: {
+				type: String,
+				default: ''
+			},
+      subTitleFontSize: {
+        type: String,
+        default: '12px'
+      },
+      subTitleColor: {
+        type: String,
+        default: '#999'
+      },
+			padding: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+    computed:{
+      _padding(){
+        if(typeof this.padding === 'string'){
+          return this.padding
+        }
+
+        return this.padding?'10px':''
+      }
+    },
+		watch: {
+			title(newVal) {
+				if (uni.report && newVal !== '') {
+					uni.report('title', newVal)
+				}
+			}
+		},
+    methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	$uni-primary: #2979ff !default;
+
+	.uni-section {
+		background-color: #fff;
+    .uni-section-header {
+      position: relative;
+      /* #ifndef APP-NVUE */
+      display: flex;
+      /* #endif */
+      flex-direction: row;
+      align-items: center;
+      padding: 12px 10px;
+      font-weight: normal;
+
+      &__decoration{
+        margin-right: 6px;
+        background-color: $uni-primary;
+        &.line {
+          width: 4px;
+          height: 12px;
+          border-radius: 10px;
+        }
+
+        &.circle {
+          width: 8px;
+          height: 8px;
+          border-top-right-radius: 50px;
+          border-top-left-radius: 50px;
+          border-bottom-left-radius: 50px;
+          border-bottom-right-radius: 50px;
+        }
+
+        &.square {
+          width: 8px;
+          height: 8px;
+        }
+      }
+
+      &__content {
+        /* #ifndef APP-NVUE */
+        display: flex;
+        /* #endif */
+        flex-direction: column;
+        flex: 1;
+        color: #333;
+
+        .distraction {
+          flex-direction: row;
+          align-items: center;
+        }
+        &-sub {
+          margin-top: 2px;
+        }
+      }
+
+      &__slot-right{
+        font-size: 14px;
+      }
+    }
+
+    .uni-section-content{
+      font-size: 14px;
+    }
+	}
+</style>

+ 87 - 0
uni_modules/uni-section/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uni-section",
+  "displayName": "uni-section 标题栏",
+  "version": "0.0.1",
+  "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-scss"
+    ],
+    "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"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 8 - 0
uni_modules/uni-section/readme.md

@@ -0,0 +1,8 @@
+## Section 标题栏
+> **组件名:uni-section**
+> 代码块: `uSection`
+
+uni-section 组件主要用于文章、列表详情等标题展示
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-section)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839

+ 23 - 1
utils/common.js

@@ -37,7 +37,7 @@ export function selectDictValue(datas, value) {
 	})
 	return actions.join('');
 }
-export function selectValue(datas, value) {
+export function selectValueKey(datas, value) {
 	var actions = [];
 	var idx=0;
 	Object.keys(datas).some((key) => {
@@ -53,6 +53,28 @@ export function selectValue(datas, value) {
 	}
 	return newObj
 }
+export function selectValue(datas, value) {
+	var actions = [];
+	var idx=0;
+	Object.keys(datas).some((key) => {
+		if (datas[key].value == ('' + value)) {
+			actions.push(datas[key].label);
+			return true;
+		}
+	})
+	return actions.join('')
+}
+export function selectValuetext(datas, value) {
+	var actions = [];
+	var idx=0;
+	Object.keys(datas).some((key) => {
+		if (datas[key].value == ('' + value)) {
+			actions.push(datas[key].text);
+			return true;
+		}
+	})
+	return actions.join('')
+}
 /**
 * 参数处理
 * @param params 参数

+ 159 - 175
work/components/case/list.vue

@@ -2,198 +2,134 @@
   <view>
 	<view v-if="datalist.length>0">
 		<!-- 我的提案 -->
-		<block v-if="type==1">
+		<block v-if="listtype=='case'">
 			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.proposalId)">
 				<view class="tit overtwo">{{ite.title}}</view>
-				<view class="ftxt">
-					<text>提案类别</text>
-					<view>{{ite.categoryName}}</view>
-				</view>
-				<view class="ftxt">
-					<text>提交时间</text>
-					<view>{{ite.createTime}}</view>
-				</view>
-				<view class="ftxt">
-					<text>提案状态</text>
-					<view class="co0b">{{kaType(ite.proposalProgress)}}</view>
-				</view>
-				<!-- 委员反馈 -->
-				<view class="casebtn flexc">
-					<view class="ftit">办理状态<text>待反馈</text></view>
-					
-					<view class="btn btn1" v-if="ite.satisfaction">已反馈</view>
-					<view class="btn btn2" v-else>反馈意见</view>
-				</view>
-			</view>
-		</block>
-		<!-- 联名提案 -->
-		<block v-if="type==2">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
+				
+				<view class="flexcw" >
+					<view class="ftxt" v-if="type!='wdta'&&type!='gkta'">
 						<text>提案者</text>
-						<view>何潇潇</view>
+						<view>{{ite.proposalName}}</view>
 					</view>
-					<view class="ftxt">
+					<view class="ftxt" v-if="type=='lmta'||type=='tjyx'||type=='tjzd'||type=='lmta'||type=='gkta'">
 						<text>案号</text>
-						<view>222</view>
+						<view>{{ite.proposalType}}</view>
 					</view>
+					<view class="ftxt" v-if="type=='tasc'||type=='tajb'||type=='tabl'||type=='bjsh'||type=='tacb'">
+						<text>提案类型</text>
+						<view>{{ite.proposalType==0?'大会提案':'平时提案'}}</view>
+					</view>
+				</view>
+				<view class="ftxt" v-if="type=='tjyx'||type=='tjzd'">
+					<text>推荐截止</text>
+					<view>{{ite.categoryName}}</view>
+				</view>
+				<block v-if="type!='tjyx'&&type!='tjzd'">
 					<view class="ftxt">
 						<text>提案类别</text>
-						<view>社会建设类/教育事业</view>
+						<view>{{ite.categoryName}}</view>
 					</view>
 					<view class="ftxt">
 						<text>提交时间</text>
-						<view>2024-02-22 14:12:38</view>
+						<view>{{ite.createTime}}</view>
 					</view>
 					<view class="ftxt">
-						<text>联名状态</text>
-						<view class="co0b">办理中</view>
+						<text>提案状态</text>
+						<view class="co0b">{{kaType(ite.proposalProgress)}}</view>
 					</view>
-				</view>
+				</block>
 				
-				<view class="casebtn flexc">
-					<view class="lftit">您的联名提案未反馈</view>
-					<!-- <view class="lftit">您的联名提案已反馈,查看<text class="lfdet">反馈详情</text></view> -->
-					<view class="btn  btn1">反对</view>
-					<view class="btn btn2">同意</view>
-					<view class="btn btn3">已同意</view>
+				<!-- 委员反馈 提案办理 -->
+				<view class="casebtn flexc" v-if="type=='tabl'||type=='tasc'">
+					<view class="ftit">办理状态<text>待反馈</text></view>
+					<view class="btn btn3" v-if="ite.satisfaction">已反馈</view>
+					<view class="btn btn2" v-else>反馈意见</view>
 				</view>
-			</view>
-		</block>
-		<!-- 推荐优秀 -->
-		<block v-if="type==3">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
-						<text>提案者</text>
-						<view>何潇潇</view>
-					</view>
-					<view class="ftxt">
-						<text>案号</text>
-						<view>222</view>
-					</view>
-					<view class="ftxt">
-						<text>推荐截止</text>
-						<view>2024-02-22</view>
-					</view>
+				<!-- 提案审查 -->
+				<view class="casebtn flexc" v-if="type=='tasc'">
+					<block v-if="!ite.isRecord">
+						<view class="lftit">该提案暂未审查立案</view>
+						<view class="btn btn1" @click.stop="getTuiFn(ite,'scfk','1')">不予立案</view>
+						<view class="btn btn2" @click.stop="getTuiFn(ite,'scfk','0')">立案</view>
+					</block>
+					<block v-if="ite.isRecord=='0'">
+						<view class="lftit">该提案已审查立案,查看<text class="lfdet">审查反馈</text></view>
+						<view class="btn btn3">已立案</view>
+					</block>
+					<block v-if="ite.isRecord==1">
+						<view class="lftit">该提案暂未通过审查立案</view>
+					</block>
 				</view>
-				<view class="casebtn flexc">
-					<view class="lftit">该提案暂未推荐为优秀</view>
-					<!-- <view class="lftit">该提案已推荐为优秀,查看<text class="lfdet">推荐理由</text></view> -->
-					<!-- <view class="btn btn2"><image :src="zanimg" class="zanimg"></image>推荐优秀</view> -->
-					<view class="btn btn3" @click="getTuiFn('tjyx')"><image :src="nzanimg" class="zanimg"></image>推荐优秀</view>
+				<!--提案交办  -->
+				<view class="casebtn flexc" v-if="type=='tajb'">
+					<block v-if="ite.isRecord=='0'">
+						<view class="lftit">该提案已进行交办,查看<text class="lfdet">交办详情</text></view>
+						<view class="btn btn3">已交办</view>
+					</block>
+					<block v-if="ite.isRecord==1">
+						<view class="lftit">该提案暂未进行交办</view>
+						<view class="btn btn2" @click.stop="getTuiFn(ite,'tajb')">交办</view>
+					</block>
 				</view>
-			</view>
-		</block>
-		<!-- 推荐重点 -->
-		<block v-if="type==4">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
-						<text>提案者</text>
-						<view>何潇潇</view>
-					</view>
-					<view class="ftxt">
-						<text>案号</text>
-						<view>222</view>
-					</view>
-					<view class="ftxt">
-						<text>推荐截止</text>
-						<view>2024-02-22</view>
-					</view>
+				<!--办结审核  -->
+				<view class="casebtn flexc" v-if="type=='jbsh'">
+					<block v-if="ite.isRecord=='0'">
+						<view class="lftit">该提案已办结,查看<text class="lfdet">办结审核情况</text></view>
+						<view class="btn btn3">已办结</view>
+					</block>
+					<block v-if="ite.isRecord==1">
+						<view class="lftit">该提案暂未办结</view>
+						<view class="btn btn2" @click.stop="getTuiFn(ite,'jbsh')">交办审核</view>
+					</block>
 				</view>
-				<view class="casebtn flexc">
-					<view class="lftit">该提案暂未推荐为重点</view>
-					<!-- <view class="lftit">该提案已推荐为重点,查看<text class="lfdet">推荐理由</text></view> -->
-					<view class="btn btn2"><image :src="start" class="staimg"></image>推荐重点</view>
-					<!-- <view class="btn btn3"><image :src="nstart" class="staimg"></image>推荐重点</view> -->
+				<!--催办  -->
+				<view class="casebtn flexc" v-if="type=='tacb'">
+					<block v-if="ite.isRecord=='0'">
+						<view class="lftit">该提案已被催办 <text class="co1d">1次</text></view>
+						<view class="btn btn3">再次催办</view>
+					</block>
+					<block v-if="ite.isRecord==1">
+						<view class="lftit">该提案暂未被催办</view>
+						<view class="btn btn2" @click.stop="getTuiFn(ite,'tacb')">催办</view>
+					</block>
 				</view>
-			</view>
-		</block>
-		<!-- 公开提案 -->
-		<block v-if="type==5">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
-						<text>案号</text>
-						<view>222</view>
-					</view>
-					<view class="ftxt">
-						<text>提案类别</text>
-						<view>社会建设类/教育事业</view>
-					</view>
-					<view class="ftxt">
-						<text>提交时间</text>
-						<view>2024-02-22 14:12:38</view>
-					</view>
-					<view class="ftxt">
-						<text>办理状态</text>
-						<view class="co0b">审核中</view>
-					</view>
+				<!-- 联名提案 -->
+				<view class="casebtn flexc" v-if="type=='lmta'">
+					<view class="lftit">您的联名提案未反馈</view>
+					<!-- <view class="lftit">您的联名提案已反馈,查看<text class="lfdet">反馈详情</text></view> -->
+					<view class="btn  btn1" @click.stop="getTuiFn(ite,'lmta','2')">反对</view>
+					<view class="btn btn2" @click.stop="getTuiFn(ite,'lmta','1')">同意</view>
+					<view class="btn btn3">已同意</view>
 				</view>
-			</view>
-		</block>
-		<!-- 办理质量评议 -->
-		<block v-if="type==6">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
-						<text>案号</text>
-						<view>222</view>
-					</view>
-					<view class="ftxt">
-						<text>承办单位</text>
-						<view>市教育局</view>
-					</view>
+				<!-- 推荐优秀 -->
+				<view class="casebtn flexc" v-if="type=='tjyx'">
+					<block v-if="ite.isOutstanding==0">
+						<view class="lftit" >该提案已推荐为优秀,查看<text class="lfdet">推荐理由</text></view>
+						<view class="btn btn2"><image :src="zanimg" class="zanimg"></image>推荐优秀</view>
+					</block>
+					<block v-else>
+						<view class="lftit">该提案暂未推荐为优秀</view>
+						<view class="btn btn3"  @click.stop="getTuiFn(ite,'tjyx')"><image :src="nzanimg" class="zanimg"></image>推荐优秀</view>
+					</block>
+				</view>
+				<!-- 推荐重点 -->
+				<view class="casebtn flexc" v-if="type=='tjzd'">
+					<block v-if="ite.isKeyPoint==0">
+						<view class="lftit" >该提案已推荐为重点,查看<text class="lfdet">推荐理由</text></view>
+						<view class="btn btn2"  @click.stop="getTuiFn(ite,'tjzd')"><image :src="start" class="staimg"></image>推荐重点</view>
+					</block>
+					<block v-else>
+						<view class="lftit" >该提案暂未推荐为重点</view>
+						<view class="btn btn3"><image :src="nstart" class="staimg"></image>推荐重点</view>
+					</block>
 				</view>
-				<view class="casebtn flexc">
+				<!-- 质量评议 -->
+				<!-- <view class="casebtn flexc" v-if="type=='lmta'">
 					<view class="lftit">该提案暂未进行质量评议</view>
-					<!-- <view class="lftit">该提案已评议,查看<text class="lfdet">评议详情</text></view> -->
+					<view class="lftit">该提案已评议,查看<text class="lfdet">评议详情</text></view>
 					<view class="btn btn2" @click="getTuiFn('zlpy')"><image :src="flower" class="staimg"></image>质量评议</view>
-					<!-- <view class="btn btn3"><image :src="nflower" class="staimg"></image>已评议</view> -->
-				</view>
-			</view>
-		</block>
-		<!-- 提案审查 -->
-		<block v-if="type==7">
-			<view class="caselist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
-				<view class="tit overtwo">关于拓展市校合作,助推高质量发展的建议</view>
-				<view class="flexw">
-					<view class="ftxt">
-						<text>提案人</text>
-						<view>刘本吉</view>
-					</view>
-					<view class="ftxt">
-						<text>提案类型</text>
-						<view>大会提案</view>
-					</view>
-					<view class="ftxt">
-						<text>提案类别</text>
-						<view>社会建设类/教育事业</view>
-					</view>
-					<view class="ftxt">
-						<text>提交时间</text>
-						<view>2024-02-22  14:12:38</view>
-					</view>
-					<view class="ftxt">
-						<text>提案状态</text>
-						<!-- <view class="co0b">待审查</view> -->
-						<view>已审查</view>
-					</view>
-				</view>
-				<view class="casebtn flexc">
-					<!-- <view class="lftit">该提案暂未审查立案</view> -->
-					<view class="lftit">该提案已审查立案,查看<text class="lfdet">审查反馈</text></view>
-					<!-- <view class="btn btn1" @click="getTuiFn('zlpy')">不予立案</view>
-					<view class="btn btn2" @click="getTuiFn('zlpy')">立案</view> -->
-					<view class="btn btn3">立案</view>
-				</view>
+					<view class="btn btn3"><image :src="nflower" class="staimg"></image>已评议</view>
+				</view> -->
 			</view>
 		</block>
 		<view class="shax" v-if="wtdt">{{wtdt}}</view>
@@ -233,6 +169,12 @@
 				return ''
 			}
 		},
+		listtype:{
+			type: [String,Number],
+			default () {
+				return ''
+			}
+		}
 	},
 	components:{
 		noData
@@ -251,18 +193,60 @@
 	},
 	methods:{
 		kaType(ite){
-			var aite=selectValue(this.tajdlist, ite);
-			return aite.actions;
+			return selectValue(this.tajdlist, ite);
 		},
 		getDetail(e){
 			this.$emit('getDetail',e)
 		},
-		getTuiFn(txt){
-			var obj={
-				type:txt,
-				id:1,
+		getTuiFn(ite,txt,sh){
+			var that=this;
+			if(txt=='scfk'&&sh==0){
+				uni.showModal({
+					title: '确认立案',
+					content: "是否确认立案",
+					cancelText: '取消',
+					confirmText: '确认',
+					success: function(res) {
+						if (res.confirm) {
+							var obj={
+								id:ite.proposalId,
+								type:txt,
+								sh:sh,
+							}
+							that.$emit('getTuiFn',obj)
+						} else if (res.cancel) {
+							// console.log('用户点击取消');
+						}
+					}
+				});
+			}else if(txt=='lmta'&&sh==1){
+				uni.showModal({
+					title: '确认联名',
+					content: "是否确认联名",
+					cancelText: '取消',
+					confirmText: '确认',
+					success: function(res) {
+						if (res.confirm) {
+							var obj={
+								id:ite.proposalId,
+								type:txt,
+								sh:sh,
+							}
+							that.$emit('getTuiFn',obj)
+						} else if (res.cancel) {
+							// console.log('用户点击取消');
+						}
+					}
+				});
+			}else{
+				var obj={
+					id:ite.proposalId,
+					type:txt,
+					sh:sh,
+				}
+				this.$emit('getTuiFn',obj)
 			}
-			this.$emit('getTuiFn',obj)
+			
 		},
 		typeFn(data){
 			if(data){

+ 495 - 28
work/components/popup/popup.vue

@@ -4,7 +4,7 @@
 		<view class="bgbox" @click="getClose" v-if="type"></view>
 		<!-- 弹窗 -->
 		<!-- 推荐优秀 -->
-		<view class="fixedbox" v-if="type=='tjyx'">
+		<view class="fixedbox" v-if="type=='tjyx'||type=='tjzd'">
 			<view class="ttit">推荐为优秀</view>
 			<view  class="boxs">
 				<view class="flexcj mb14">
@@ -14,11 +14,11 @@
 						<view>语音输入</view>
 					</view>
 				</view>
-				<textarea class="textar mb25" @blur="getBlur" v-model="yxly" placeholder="请输入推荐意见,也可点击右上角进行 语音输入…" maxlength="1000" ></textarea>
+				<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="请输入推荐意见,也可点击右上角进行 语音输入…" maxlength="1000" ></textarea>
 			</view>
 			<view class="fixedbtn flexcj">
 				<view class="btns btn1" @click="getClose">取消</view>
-				<view class="btns btn2" @click="getyjSubmit">提交</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
 			</view>
 		</view>
 		<!-- 质量评议 -->
@@ -122,6 +122,7 @@
 				<view class="btns btn2" @click="getFaFn('old')">继续发布</view>
 			</view>
 		</view>
+		
 		<!-- 联名提案弹窗 -->
 		<view class="fixedbox" v-if="type=='lmta'">
 			<view class="ttit">提示</view>
@@ -134,29 +135,96 @@
 				<view class="btns btn2" @click="getFaFn('old')">立即确认</view>
 			</view>
 		</view>
-		<!-- 审查反馈 -->
+		<!-- 暂存提案的弹窗 -->
+		<view class="fixedbox" v-if="type=='zcta'">
+			<view class="ttit">提示</view>
+			<view  class="boxs">
+				<view class="ztit">您有一条暂存提案还未提交</view>
+				<view class="ztit">是否继续编辑?</view>
+				<view class="ztit mb32">查看<text @click="getFaFn('old')">暂存提案</text></view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getFaFn('new')">重新发布</view>
+				<view class="btns btn2" @click="getFaFn('old')">继续发布</view>
+			</view>
+		</view>
+		<!-- 2审查反馈 -->
 		<view class="fixedbox" v-if="type=='scfk'">
 			<view class="ttit">审查反馈</view>
 			<view  class="boxs">
 				<view class="mb16">
-					<view class="ttxt mb18"><text class="cof0">*</text>是否并案</view>
-					<uni-section title="本地数据" type="line">
-					     <uni-data-select
-					       v-model="value"
-					       :localdata="sfrange"
-					       @change="change"
-					     ></uni-data-select>
-					</uni-section>
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>是否立案</view>
+					<uni-data-select
+					  v-model="isRecord"
+					  placeholder="请选择立案/不予立案"
+					  :localdata="larange"
+					  
+					></uni-data-select>
 				</view>
-				<view class="mb16">
+				<view class="mb16" >
 					<view class="ttxt mb18"><text class="cof0">*</text>答复单位</view>
-					<uni-section title="本地数据" type="line">
-					     <uni-data-select
-					       v-model="value"
-					       :localdata="sfrange"
-					       @change="change"
-					     ></uni-data-select>
-					</uni-section>
+					<view @click="getRecorddwFn" class="chosebox flexc">
+						<view class="tit" :class="recorddw?'':'coa'">{{recorddw||'若选择不予立案,请指定答复单位'}}</view>
+					</view>
+					
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		<!-- 3提案交办 -->
+		<view class="fixedbox" v-if="type=='tajb'">
+			<view class="ttit">提案交办</view>
+			<view  class="boxs">
+				<view class="mb16" >
+					<view class="ttxt mb18"><text class="cof0">*</text>主办单位</view>
+					<view @click="getRecorddwFn" class="chosebox flexc">
+						<view class="tit" :class="recorddw?'':'coa'">{{recorddw||'请选择主办单位'}}</view>
+					</view>
+				</view>
+				<view class="mb16" >
+					<view class="ttxt mb18"><text class="cof0">*</text>协办单位</view>
+					<view @click="getRecorddwMoreFn" class="chosebox flexc">
+						<view class="tit" :class="recorddwm?'':'coa'">{{recorddwm||'请选择协办单位'}}</view>
+					</view>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		<!-- 4,办理方式 -->
+		<view class="fixedbox" v-if="type=='dffk'">
+			<view class="ttit">答复反馈</view>
+			<view  class="boxs">
+				<view class="mb16" @click="handling='电话,网络'">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>办理方式</view>
+					<!-- 多选 -->
+					<uni-data-select
+					  v-model="handling"
+					  placeholder="请选择办理方式"
+					  :localdata="larange"
+					  
+					></uni-data-select>
+				</view>
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>办理程度</view>
+					<uni-data-select
+					  v-model="degree"
+					  placeholder="请选择办理程度"
+					  :localdata="blcdlist"
+					></uni-data-select>
+				</view>
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>答复内容</view>
+					<textarea class="textar texthe mb25" @blur="getBlur" v-model="content" placeholder="请输入答复内容" maxlength="1000" ></textarea>
 				</view>
 				<view class="mb16">
 					<view class="flexcj mb10">
@@ -181,7 +249,7 @@
 						<view class="fjlists"  v-for="(ite,idx) in filelist" :key='idx'>
 							<view class="flext f15 c6" @click="getDown(ite.path)">
 								<view class="imgl"><image :src="fjimg" ></image></view>
-								<view class="tit">{{ite.fjName}}</view>
+								<view class="tit">{{ite.name}}</view>
 							</view>
 							<!-- 删除 -->
 							<view class="delimg flex0" @click.stop="getDelFj(idx)">
@@ -193,9 +261,163 @@
 			</view>
 			<view class="fixedbtn flexcj">
 				<view class="btns btn1" @click="getClose">取消</view>
-				<view class="btns btn2" @click="getyjSubmit">提交</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
 			</view>
 		</view>
+		<!-- 5,交办审核 -->
+		<view class="fixedbox" v-if="type=='jbsh'">
+			<view class="ttit">审核</view>
+			<view  class="boxs">
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>是否通过</view>
+					<uni-data-select
+					  v-model="jbshtxt"
+					  placeholder="通过/不通过"
+					  :localdata="jbsharange"
+					  
+					></uni-data-select>
+				</view>
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>反馈理由</view>
+					<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="选择不通过必须填写反馈意见,限1000 字内…" maxlength="1000" ></textarea>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		<!-- 5提案办理 承办答复 -->
+		<view class="fixedbox" v-if="type=='dwdf'">
+			<view class="ttit">答复反馈</view>
+			<view  class="boxs">
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>答复内容</view>
+					<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="请输入答复内容" maxlength="1000" ></textarea>
+				</view>
+				<view class="mb16">
+					<view class="flexcj mb10">
+						<view class="ttxt">添加附件</view>
+						<view class="fjadd"><lsj-upload
+							    ref="lsjUpload"
+							    childId="upload1"
+							    :width="width"
+							    :height="height"
+							    :option="option"
+							    :size="size"
+							    :formats="formats"
+							    :debug="debug"
+							    :instantly="instantly"
+							    @progress=""
+								@uploadEnd="onuploadEnd" >
+							        <view class="btn" :style="{width: width,height: height}">上传附件</view>
+							</lsj-upload>
+						</view>
+					</view>
+					<view class="ptb2" v-if="filelist&&filelist.length">
+						<view class="fjlists"  v-for="(ite,idx) in filelist" :key='idx'>
+							<view class="flext f15 c6" @click="getDown(ite.path)">
+								<view class="imgl"><image :src="fjimg" ></image></view>
+								<view class="tit">{{ite.name}}</view>
+							</view>
+							<!-- 删除 -->
+							<view class="delimg flex0" @click.stop="getDelFj(idx)">
+								<image :src="delimg"></image>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+
+		<!-- 6满意反馈 -->
+		<view class="fixedbox" v-if="type=='wymyfk'||type=='zxmyfk'">
+			<view class="ttit">答复反馈</view>
+			<view  class="boxs">
+				<!-- <view class="mb16">
+					<view class="ttxt mb18"><text class="cof0">*</text>是否办结</view>
+					<uni-data-select
+					  v-model="isRecord"
+					  placeholder="请选择办结/不予办结"
+					  :localdata="larange"	  
+					></uni-data-select>
+				</view> -->
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>满意程度</view>
+					<uni-data-select
+					  v-model="mycdtxt"
+					  placeholder="请选择满意程度"
+					  :localdata="mycdlist"  
+					></uni-data-select>
+				</view>
+				<view class="mb16">
+					<view class="ttxt mb18"><text class="cof0">*</text>评价</view>
+					<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="请输入评价内容…" maxlength="1000" ></textarea>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		
+		<!-- 催办 -->
+		<view class="fixedbox" v-if="type=='tacb'">
+			<view class="ttit">催办</view>
+			<view  class="boxs">
+				<view class="mb16">
+					<view class="ttxt mb18"><text class="cof0">*</text>备注</view>
+					<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="请输入" maxlength="1000" ></textarea>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		<!-- 联名填 -->
+		<view class="fixedbox" v-if="type=='lmta'">
+			<view class="ttit">审核</view>
+			<view  class="boxs">
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>是否同意</view>
+					<uni-data-select
+					  v-model="jbshtxt"
+					  placeholder="同意/不同意"
+					  :localdata="agreelist"  
+					></uni-data-select>
+				</view>
+				<view class="mb16">
+					<!-- @change="change" -->
+					<view class="ttxt mb18"><text class="cof0">*</text>反馈理由</view>
+					<textarea class="textar mb25" @blur="getBlur" v-model="content" placeholder="选择不通过必须填写反馈意见,限1000 字内…" maxlength="1000" ></textarea>
+				</view>
+			</view>
+			<view class="fixedbtn flexcj">
+				<view class="btns btn1" @click="getClose">取消</view>
+				<view class="btns btn2" @click="getupSubmit">提交</view>
+			</view>
+		</view>
+		<selectnore-more-picker
+			ref="dfdwpicker"
+			:title="dfdwpicker.title"
+			:layer="dfdwpicker.layer"
+			:titflag='dfdwpicker.titflag'
+			:data="deptTree"
+			@callback="dfdwpickerCallback"
+		></selectnore-more-picker>
+		<!-- 协办单位 -->
+		<batree-pickerfixed deptType='3' ref="treePickerxtdw" :multiple='true' @select-change="selectChangextdw" title="选择协办单位"
+		:localdata="deptTree" valueKey="id" textKey="label" childrenKey="children"></batree-pickerfixed>
 		<!-- 语音识别 -->
 		<view class="bgbox bgvoice"  v-if="voiceflag"  @click="getClosevoice"></view>
 		<view class="voice" v-if="voiceflag">
@@ -242,6 +464,8 @@
 </template>
 
 <script>
+	import selectnoreMorePicker from "@/components/ba-tree-picker/selectnoreMorePicker.vue"
+	import batreePickerfixed from "@/components/ba-tree-picker/ba-tree-pickerfixed.vue"
 	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
 	const recorderManager = uni.getRecorderManager();
 	//播放录音
@@ -251,6 +475,7 @@
 	const baseUrl = config.baseUrl
 	import { getToken } from '@/utils/auth'
 	export default{
+		components:{selectnoreMorePicker,batreePickerfixed},
 		props:{
 			type: {
 				type: String,
@@ -266,13 +491,44 @@
 			},
 			iteminfo:{},
 			xmjzinfo:{},
+			dataTree:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			blfsList:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			blcdlist:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			mycdlist:{
+				type: Array,
+				default () {
+					return []
+				}
+			}
 		},
 		data(){
 			return{
+				deptTree:[],//答复单位
+				dfdwpicker: {
+					title: '选择所属产业',
+					layer: null,
+					titflag:true,
+					data: []
+				},
 				//附件
 				option: {
 				    // 上传服务器地址,需要替换为你的接口地址
-				    // url: baseUrl+'/common/upload', // 该地址非真实路径,需替换为你项目自己的接口地址
+				    url: baseUrl+'/common/upload', // 该地址非真实路径,需替换为你项目自己的接口地址
 				    // 上传附件的key
 				    name: 'file',
 				    // 根据你接口需求自定义请求头,默认不要写content-type,让浏览器自适配
@@ -289,7 +545,7 @@
 				width: '',
 				height: '48rpx',
 				// 限制允许上传的格式,空串=不限制,默认为空
-				formats: 'doc,docx,xls,ppt,txt,pdf,zip,rar,word',
+				formats: 'doc,docx,xls,xlsx,ppt,txt,pdf,zip,rar,word',
 				// 文件上传大小限制
 				size: 100,
 				// 文件数量限制 默认10
@@ -300,14 +556,27 @@
 				wxFiles: [],
 				// 是否打印日志
 				debug: false,
-				filelist:[{name:'关于加强危化品安全监管的建议文档.word',path:"123"}], 
+				filelist:[], 
 				fjimg:require("@/work/static/images/fjimg.png"),
 				delimg:require("@/work/static/images/delimg.png"),
 				
 				speechimgs:require('@/work/static/images/voice.png'),
 				range: [{ value: 0, text: "满意" },{ value: 1, text: "不满意" },],
 				sfrange: [{ value: 0, text: "是" },{ value: 1, text: "否" },],
+				larange:[{ value: 0, text: "立案" },{ value: 1, text: "不立案" }],
+				jbsharange:[{ value: 7, text: "不通过" },{ value: 8, text: "通过" }],
+				agreelist:[{ value: 1, text: "同意" },{ value: 2, text: "不同意" }],
 				value: 0,
+				isRecord:'',//是否立案
+				jbshtxt:'',//审核通过不通过
+				handling:'',//办理方式
+				degree:'',//办理程度
+				mycdtxt:'',//满意程度
+				recorddw:'',
+				recorddwm:'',//协办单位
+				recorddwlist:[],
+				recorddwmlist:[],//协办单位
+				content:'',//文本输入
 				
 				
 				voiceflag:false,
@@ -393,6 +662,195 @@
 		},
 		methods:{
 			checkPermi, checkRole,
+			getRecorddwFn(){
+				console.log(this.dataTree)
+				this.deptTree=this.dataTree
+				this.$refs.dfdwpicker.open(0).then(function() {
+				
+				});
+			},
+			getRecorddwMoreFn(){
+				this.$refs.treePickerxtdw._show();
+			},
+			selectChangextdw(e){
+				if(e.length){
+					var newArr=[]
+					e.forEach(ite=>{
+						newArr.push(ite.deptName)
+					})
+					this.recorddwm=newArr.join('/')
+				}
+				this.recorddwmlist=JSON.parse(JSON.stringify(e))
+			},
+			dfdwpickerCallback(e){
+				var newArr=e.data;
+				var dwList=[]
+				var len=Number(newArr.length)-1;
+				var obj={
+					deptId:newArr[len].id,
+					deptname:newArr[len].label,
+				}
+				if(this.type=='tajb'){
+					obj.type=2
+				}else if(this.type=='scfk'){
+					obj.type=1
+				}
+				dwList.push(obj)
+				this.recorddwlist=dwList;
+				this.recorddw=newArr[len].label;
+			},
+			getupSubmit(){
+				var type=this.type;
+				if(type=='scfk'){
+					var isRecord=this.isRecord;
+					if(isRecord===''){
+						this.$toast('请选择会否立案')
+						return
+					}
+					
+					var obj={
+						isRecord:this.isRecord
+					}
+					if(this.isRecord==1&&!this.recorddw){
+						this.$toast('请选择答复单位')
+						return
+					}
+					if(this.isRecord==1){
+						obj.proposalUnitReplyList=this.recorddwlist
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='tajb'){
+					var newArr=this.recorddwlist;
+					var xbdwList=this.recorddwmlist;
+					if(newArr.length<1){
+						this.$toast('请选择主办单位')
+						return
+					}
+					if(xbdwList.length<1){
+						this.$toast('请选择协办单位')
+						return
+					}
+					var obj={
+						proposalUnitReplyList:xbdwList,
+						zbUnitReply:newArr
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='dffk'){
+					if(!this.handling){
+						this.$toast('请选择处理方式')
+						return
+					}
+					if(!this.degree){
+						this.$toast('请选择办理程度')
+						return
+					}
+					if(!this.content){
+						this.$toast('请输入答复内容')
+						return
+					}
+					var obj={
+						content:this.content,
+						handling:this.handling,
+						degree:this.degree
+					}
+					if(this.filelist.length){
+						obj.zxFjList=this.filelist
+					}
+					this.$emit('getupSubmit',obj)
+				
+				}else if(type=='jbsh'){
+					if(!this.jbshtxt){
+						this.$toast('请选择是否通过')
+						return
+					}
+					var obj={
+						proposalProgress:this.jbshtxt,
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='dwdf'){
+					if(!this.content){
+						this.$toast('请输入答复反馈')
+						return
+					}
+					var obj={
+						content:this.content,
+					}
+					if(this.filelist.length){
+						obj.zxFjList=this.filelist
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='wymyfk'){
+					if(!this.mycdtxt){
+						this.$toast('请选择满意程度')
+						return
+					}
+					var obj={
+						membersOpinion:this.content,
+						satisfaction:this.mycdtxt
+					}
+					if(this.filelist.length){
+						obj.zxFjList=this.filelist
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='zxmyfk'){
+					if(!this.mycdtxt){
+						this.$toast('请选择满意程度')
+						return
+					}
+					var obj={
+						zxOpinion:this.content,
+						zxSatisfaction:this.mycdtxt
+					}
+					if(this.filelist.length){
+						obj.zxFjList=this.filelist
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='tacb'){
+					// if(!this.content){
+					// 	this.$toast('请输入催办内容')
+					// 	return
+					// }
+					var obj={
+						urgeContent:this.content,
+						urgeType:1
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='tjyx'){
+					// if(!this.content){
+					// 	this.$toast('请输入催办内容')
+					// 	return
+					// }
+					var obj={
+						outstandingArgument:this.content,
+						isOutstanding:0
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='tjzd'){
+					// if(!this.content){
+					// 	this.$toast('请输入催办内容')
+					// 	return
+					// }
+					var obj={
+						keyPointArgument:this.content,
+						isKeyPoint:0
+					}
+					this.$emit('getupSubmit',obj)
+				}else if(type=='lmta'){
+					if(!this.jbshtxt){
+						this.$toast('请选择是否同意')
+						return
+					}
+					var obj={
+						isAgree:this.jbshtxt,
+					}
+					this.$emit('getupSubmit',obj)
+				}
+				
+				
+			},
+			
+			
+			
 			onuploadEnd(item) {
 				var newobj={}
 				var responseText=JSON.parse(item.responseText)
@@ -591,8 +1049,10 @@
 // .choseimg{width: 34rpx;height: 34rpx;position: absolute;left: 36rpx;top: 54rpx;z-index: 22;}
  // .uni-stat__select{background-color: #EEEEEE;}
 .fixedbox /deep/ .uni-select{border: none;background-color: #EEEEEE;height: 88rpx;}
+.fixedbox /deep/ .uni-select__input-placeholder{font-size: 30rpx;color: #AAAAAA;}
+.fixedbox /deep/ .uni-textarea-placeholder{font-size: 30rpx;color: #AAAAAA;}
 .fixedbox{position: fixed;left: 48rpx;right: 48rpx;background: #fff;border-radius: 10rpx;min-height: 468rpx;top: 50%;transform: translateY(-50%);z-index: 10;padding: 32rpx 40rpx 50rpx;max-height: calc(100vh - 300rpx);overflow: auto;box-sizing: border-box;
-	.ttit{position: relative;text-align: center;font-weight: bold;font-size: 36rpx;color: #222327;margin-bottom: 38rpx;}
+	.ttit{position: relative;text-align: center;font-weight: bold;font-size: 36rpx;color: #222327;margin-bottom: 34rpx;}
 	.boxs{
 		.ttxt{font-weight: bold;font-size: 30rpx;color: #222327;
 			text{margin-right: 6rpx;}
@@ -600,6 +1060,11 @@
 		.ztit{font-weight: 500;font-size: 26rpx;color: #222327;text-align: center;line-height: 56rpx;text-align: center;
 			text{color: #1D64E2;text-decoration: underline;margin: 0 6rpx;}
 		}
+		.chosebox{width: 100%;height: 88rpx;background: #EEEEEE;border-radius: 10rpx;padding: 0 10rpx;box-sizing: border-box;padding-left: 20rpx;
+			.tit{color: #333;font-size: 30rpx;
+				&.coa{color: #AAAAAA;}
+			}
+		}
 		// 语音按钮
 		.speech{
 			width: 190rpx;height:56rpx;background: linear-gradient(180deg, #4480EB 0%, #1D64E2 100%);border-radius: 28rpx;
@@ -607,9 +1072,11 @@
 			view{font-size: 26rpx;font-weight: 500;color: #ffffff;}
 		}
 		.input{height: 88rpx;width: 100%;background: #EEEEEE;border-radius: 10rpx;font-size: 30rpx;font-weight: 500;color: #222327;padding: 0 24rpx;}
-		.textar{width: 100%;border-radius: 10rpx;padding: 26rpx 30rpx;font-size: 30rpx;color: #222327;height: 400rpx;background: #EEEEEE;}
+		.textar{width: 100%;border-radius: 10rpx;padding: 26rpx 30rpx;font-size: 30rpx;color: #222327;height: 400rpx;background: #EEEEEE;
+			&.texthe{height: 190rpx;}
+		}
 	}
-	.fixedbtn{
+	.fixedbtn{padding-top: 18rpx;
 		.btns{width: 254rpx;height: 80rpx;border-radius: 40rpx;font-weight: bold;
 font-size: 30rpx;display: flex;align-items: center;justify-content: center;box-sizing: border-box;
 			&.btn1{color: #1D64E2;border: 2rpx solid #1D64E2;}

+ 1 - 2
work/components/report/list.vue

@@ -112,8 +112,7 @@
 	},
 	methods:{
 		kaType(ite){
-			var aite=selectValue(this.tajdlist, ite);
-			return aite.actions;
+			return selectValue(this.tajdlist, ite);
 		},
 		getDetail(e){
 			this.$emit('getDetail',e)

+ 70 - 23
work/pages/case/add.vue

@@ -18,7 +18,7 @@
 					<view class="titinf">
 						<view class="txt"><text>提案者:</text>{{datainfo.proposalName}}</view>
 						<view class="txt"><text>联系方式:</text>{{datainfo.proposalPhone}}</view>
-						<view class="txt"><text>界别:</text>{{datainfo.boundary}}</view>
+						<view class="txt"><text>界别:</text>{{kayType(datainfo.boundary,jblist)}}</view>
 						<view class="txt"><text>党派:</text>{{datainfo.partyAffiliation}}</view>
 						<view class="txt"><text>联系地址:</text>{{datainfo.contactAddress}}</view>
 					</view>
@@ -110,7 +110,7 @@
 						<uni-data-checkbox v-model="datainfo.isJointly" :localdata="sfList" />
 					</view>
 				</uni-forms-item>
-				<uni-forms-item label="联名提案人员" name="proposalUserList" v-if="datainfo.isJointly==0">
+				<uni-forms-item label="联名提案人员" name="proposalUserList" v-if="datainfo.isJointly=='是'">
 					<view class="openbox" @click="getlmtaFn" :class="tary?'':'coa'">{{tary||"请选择联名提案人员"}}</view>
 				</uni-forms-item>
 				<uni-forms-item label="同意公开" name="isPublicity">
@@ -160,6 +160,7 @@
 	import config from '@/config'
 	const baseUrl = config.baseUrl
 	import { getToken } from '@/utils/auth'
+	import { selectValue } from '@/utils/common.js';
 	import {getCaseAddFn,getCaseDetailFn,getCaseEditFn} from "@/api/mine/case.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
 	export default{
@@ -207,35 +208,25 @@
 				infobg:require("@/work/static/images/infobg.png"),
 				datainfo:{
 					"proposalUserId":this.$store.state.user.userId,//提案人ID
-					// "proposalNumber":"",//提案号
 					"title":"",//标题
 					"proposalName":this.$store.state.user.name,//提案人姓名
 					"proposalPhone":this.$store.state.user.phonenumber,//提案人手机号码
-					"boundary":"20届",//界别
+					"boundary":"1",//界别
 					"partyAffiliation":"中国共产党",//党派
 					"contactAddress":"潜山市政协委员",//联系地址
 					"categoryId":"",//提案类别id
 					"categoryName":"",//提案类别
-					"proposalType":1,//提案类型(0大会提案 1平时提案)
+					"proposalType":'1',//提案类型(0大会提案 1平时提案)
 					"proposalContent":"",//提案内容
-					"isJointly":1,//联名提案(0是 1否)
-					"isPublicity":0,//同意公开(0是 1否)
-					"contentPublicity":0,//内容公开(0是 1否)
-					"isSurvey":1,//经过调研(0是 1否)
-					"isFirst":1,//第一次提出(0是 1否)
-					"isPerson":1,//由本人撰写(0是 1否)
-					"isRecord":1,//是否立案(0是 1否)
+					"isJointly":'否',//联名提案(0是 1否)
+					"isPublicity":'是',//同意公开(0是 1否)
+					"contentPublicity":'是',//内容公开(0是 1否)
+					"isSurvey":'否',//经过调研(0是 1否)
+					"isFirst":'否',//第一次提出(0是 1否)
+					"isPerson":'否',//由本人撰写(0是 1否)
 					"negotiateType":"",//需要办理的协商方式
 					"proposedContractor":"",//建议承办单位
-					// "proposalProgress":" ",//提案进度(0:提交提案,1:提案审查,2:提案立案,3:提案交办,4:办理提案,5:提案反馈,6:办结审核,7:已办结)
-					// "rollingProcess":"",//滚动办理(0是 1否)
-					// "complexType":" ",//提案答复类型(A:A类,B:B类,C:C类)
-					// "isCasesTogether":"",//是否被并案(0是 1否)
-					// "uniteProposalId":"",//被并案的案件id
-					// "satisfaction":"",//委员满意程度(0:不满意,1:一般,2:满意,3:非常满意) 
-					// "membersOpinion":"",//委员意见
 					"proposalUserList":[////提案人员
-						// { "name":"姓名","unit":"职务","type":"地址类型 1:领衔,2:附议"},
 					],
 					"zxFjList":[//提案附件
 						// { "name":"附件名称","url":"附件地址"},
@@ -243,8 +234,9 @@
 					
 				},
 				typeList:[{text: '大会提案',value: '0'},{text: '平时提案',value: '1'}],
-				sfList:[{text: '是',value: '0'},{text: '否',value: '1'}],
+				sfList:[{text: '是',value: '是'},{text: '否',value: '否'}],
 				matterlist:[],
+				jblist:[],
 				checkidx:[],
 				editorCtx:'',
 				tary:'',
@@ -272,8 +264,29 @@
 				this.pagetype='edit'
 				this.getDetail()
 			}
+			if(e.type=='old'&&uni.getStorageSync('tjtaList')){
+				var newObj=JSON.parse(JSON.stringify(uni.getStorageSync('tjtaList')))
+				var params=newObj.params;
+				this.datainfo=params;
+				this.editinfo=params.proposalContent;
+				if(params.zxFjList&&params.zxFjList.length){
+					this.filelist=JSON.parse(JSON.stringify(params.zxFjList))
+				}
+				var taryList=params.proposalUserList;
+				if(taryList&&taryList.length){
+					var newArr=[]
+					taryList.forEach(ite=>{
+						newArr.push(ite.name)
+					})
+					this.tary=newArr.join('/')
+				}
+				this.checkidx=newObj.checkidx
+			}
 		},
 		methods:{
+			kayType(ite,list){
+				return selectValue(list, ite);
+			},
 			init(){
 				getDictionaryFn('negotiation_mode').then(res=>{
 					if(res.code==200&&res.data.length){
@@ -285,6 +298,28 @@
 						})
 					}
 				})
+				// 界别circles
+				getDictionaryFn('circles').then(res=>{
+					if(res.code==200&&res.data.length){
+						this.jblist = res.data.map(v => {
+							return {
+								label: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+				// 党派
+				// getDictionaryFn('political_parties').then(res=>{
+				// 	if(res.code==200&&res.data.length){
+				// 		this.jblist = res.data.map(v => {
+				// 			return {
+				// 				label: v.dictLabel,
+				// 				value: v.dictValue
+				// 			}
+				// 		})
+				// 	}
+				// })
 			},
 			getDetail(){
 				var that=this;
@@ -342,8 +377,14 @@
 						// that.datainfo.zxFjList=JSON.parse(JSON.stringify(that.filelist));
 						var params=that.datainfo;
 						params.proposalContent=data.html;
-						
-						uni.setStorageSync('tjtaList', JSON.parse(JSON.stringify(params)))
+						if(that.checkidx&&that.checkidx.length>0){
+							params.negotiateType=that.checkidx.join(',')
+						}
+						var obj={
+							params:params,
+							checkidx:that.checkidx
+						}
+						uni.setStorageSync('tjtaList', JSON.parse(JSON.stringify(obj)))
 						that.$toast("暂存成功")
 					}  
 				})
@@ -374,6 +415,12 @@
 							getCaseAddFn(params).then(res=>{
 								if(res.code==200){
 									that.$toast("提交成功")
+									uni.$emit("refreshlist")
+									setTimeout(function(){
+										uni.navigateBack({
+											delta: 1 //返回层数,2则上上页
+										});
+									},1200)
 								}
 							})
 						}else{

+ 221 - 56
work/pages/case/details.vue

@@ -23,7 +23,7 @@
 				</view> -->
 				<view class="titinf">
 					<view class="txt"><text>提案者</text>{{datainfo.proposalName}}</view>
-					<view class="txt"><text>界别</text>{{datainfo.boundary}}</view>
+					<view class="txt"><text>界别</text>{{typeFormat(datainfo.boundary,jblist)}}</view>
 					<view class="txt"><text>党派</text>{{datainfo.partyAffiliation}}</view>
 					<view class="txt"><text>联系方式</text>{{datainfo.proposalPhone}}</view>
 					<view class="txt"> <text>提案类别</text>{{datainfo.categoryName}}</view>
@@ -33,10 +33,11 @@
 				</view>
 				<view class="titinf " :class="zheList[0].zheflag?'nact':'act'">
 					<view class="bortop"></view>
-					<view class="txt"><text>联名提案</text>{{datainfo.isJointly==0?'是':'否'}}</view>
-					<view class="txt"><text>经过调研</text>{{datainfo.isSurvey==0?'是':'否'}}</view>
-					<view class="txt"><text>第一次提出</text>{{datainfo.isFirst==0?'是':'否'}}</view>
-					<view class="txt"><text>本人撰写</text>{{datainfo.isPerson==0?'是':'否'}}</view>
+					<view class="txt"><text>联名提案</text>{{datainfo.isJointly}}</view>
+					<view class="txt" v-if="datainfo.isJointly=='是'"><text>联名提案人员</text>{{tary}}</view>
+					<view class="txt"><text>经过调研</text>{{datainfo.isSurvey}}</view>
+					<view class="txt"><text>第一次提出</text>{{datainfo.isFirst}}</view>
+					<view class="txt"><text>本人撰写</text>{{datainfo.isPerson}}</view>
 					<view class="txt"> <text>需要办理的协商方式</text>{{kaType(datainfo.negotiateType)}}</view>
 					<view class="txt"><text>建议承办的单位</text>{{datainfo.proposedContractor}}</view>
 				</view>
@@ -77,33 +78,41 @@
 						<view>办理情况</view>
 					</view>
 				</view>
-				<view>
-					<view class="dbtabs flexc mb20">
-						<view class="dbtab" :class="ite.val==dwVal?'act':''" v-for="(ite,idx) in dwList" :key="idx" @click="getDwFn(ite.val)">{{ite.tit}}</view>
-					</view>
-					<view class="titinf">
-						<view class="txt wb100"><text>主办单位</text>市公安局</view>
-						<view class="txt"><text>办理方式</text>网络</view>
-						<view class="txt"><text>办理程度</text>{{typeFormat(datainfo.complexType,dflxList)}}</view>
-						<view class="txt"><text>签收时间</text>2024-01-03 17:56</view>
-						<view class="txt"> <text>办结时间</text>2024-01-03 18:31</view>
-						<view class="txt" :class="zheList[2].zheflag?'nact':'act'"><text>答复内容</text>
-							<view>我市作为全省重要的化工城市,化工企业主要集中在大观区和高新区。2018年,安庆石化将投入大量资金建设化工项目,城区危化品安全管理难度进一步加大,而万华油品“4.2”事故已经暴露出城区危化品安全监管基层基础力量薄弱,缺乏专业化监管队伍、无危化品物流园等问题。</view>
+				<view class="dbtabs flexc mb20">
+					<view class="dbtab" :class="ite.val==dwVal?'act':''" v-for="(ite,idx) in dwList" :key="idx" @click="getDwFn(ite.val)">{{ite.tit}}</view>
+				</view>
+				<block v-for="(ite,idx) in datainfo.proposalUnitReplyList" :key="idx">
+					<view v-if="dwVal==ite.type">
+						<view class="titinf" v-if="ite.type==2||ite.type==3">
+							<view class="txt wb100"><text>{{ite.type==2?'主办单位':'协办单位'}}</text>{{ite.deptName}}</view>
+							<view class="txt"><text>办理方式</text>{{ite.handling}}</view>
+							<view class="txt"><text>办理程度</text>{{ite.degree}}</view>
+							<view class="txt"><text>签收时间</text>{{ite.startTime}}</view>
+							<view class="txt"> <text>办结时间</text>{{ite.endTime}}</view>
+							<view class="txt" :class="zheList[2].zheflag?'nact':'act'"><text>答复内容</text>
+								<rich-text :nodes="ite.content"></rich-text>
+							</view>
+						</view>
+						<!-- 折叠 -->
+						<view class="zhebox" :class="zheList[2].zheflag?'':'act'" @click="getZheFn(2)">
+							<image :src="upsimg"></image>
+							<view>{{zheList[2].zheflag?'展开信息':'折叠信息'}}</view>
+						</view>
+						<view class="bortop"></view>
+						<view class="ftit mb14">答复函</view>
+						<view class="fjlists flext"  v-for="(item,idx) in ite.zxFjList" :key='item.id' @click="getDown(item.path)">
+							<view class="imgl"><image :src="fjimg" ></image></view>
+							<view class="tit">{{item.name}}</view>
+							<view class="fjlook">查看</view>
 						</view>
 					</view>
-				</view>
-				<!-- 折叠 -->
-				<view class="zhebox" :class="zheList[2].zheflag?'':'act'" @click="getZheFn(2)">
-					<image :src="upsimg"></image>
-					<view>{{zheList[2].zheflag?'展开信息':'折叠信息'}}</view>
-				</view>
-				<view class="bortop"></view>
-				<view class="ftit mb14">答复函</view>
-				<view class="fjlists flext"  v-for="(ite,idx) in filelist" :key='idx' @click="getDown(ite.path)">
-					<view class="imgl"><image :src="fjimg" ></image></view>
-					<view class="tit">{{ite.name}}</view>
-					<view class="fjlook">查看</view>
-				</view>
+					<!-- 暂无反馈 -->
+					<!-- <block v-else>
+						<no-data></no-data>
+					</block> -->
+					
+				</block>
+				
 			</view>
 			<view class="dbox">
 				<view class="titbox mb16">
@@ -113,48 +122,92 @@
 					</view>
 				</view>
 				<view class="titinf">
-					<view class="txt wb100" style="align-items: center;"><text class="w65">对办理情况是否满意</text>{{typeFormat(datainfo.satisfaction,mycdlist)}}</view>
+					<view class="ftit mb10">委员反馈</view>
+					<view class="txt wb100" style="align-items: center;"><text class="w65">对办理情况是否满意</text>{{typeFormattext(datainfo.satisfaction,mycdlist)}}</view>
 					<view class="txt"><text class="w65">有何进一步意见和建议</text>
 						{{datainfo.membersOpinion}}
 					</view>
 				</view>
+				<view class="titinf">
+					<view class="ftit mb10 mt2">政协反馈</view>
+					<view class="txt wb100" style="align-items: center;"><text class="w65">对办理情况是否满意</text>{{typeFormattext(datainfo.zxSatisfaction,mycdlist)}}</view>
+					<view class="txt"><text class="w65">有何进一步意见和建议</text>
+						{{datainfo.zxOpinion}}
+					</view>
+				</view>
 			</view>
-			<view class="fbtns">
-				<view class="btn btn1" @click="getDelFn">删除</view>
-				<view class="btn btn1" @click="getEditFn">修改提案</view>
-				<view class="btn btn2" @click="getScfkFn">审查反馈</view>
+			<view class="fbtns" style="flex-wrap: wrap;">
+				<!-- 按角色选择按钮 -->
+				<view class="btn btn1" @click="getDelFn" v-if="checkPermi(['proposalInfo:info:query'])">删除</view>
+				<view class="btn btn1" @click="getEditFn" v-if="checkPermi(['proposalInfo:info:edit'])">修改</view>
+				<view class="btn btn2" @click="getScfkFn('scfk')" v-if="checkPermi(['proposalInfo:info:isRecord'])">2审查反馈</view>
+				<view class="btn btn2" @click="getScfkFn('tajb')" v-if="checkPermi(['proposalInfo:info:assign'])">3提案交办</view>
+				<view class="btn btn2" @click="getScfkFn('dffk')" v-if="checkPermi(['proposalInfo:info:reply'])">4答复反馈</view>
+				<view class="btn btn2" @click="getScfkFn('jbsh')" v-if="checkPermi(['proposalInfo:info:assignsh'])">5交办审核</view>
+				<view class="btn btn2" @click="getScfkFn('dwdf')" v-if="checkPermi(['proposalInfo:info:reply'])">5答复反馈</view>
+				<view class="btn btn2" @click="getScfkFn('wymyfk')" v-if="checkPermi(['proposalInfo:info:idea'])">6办结审核</view>
+				<view class="btn btn2" @click="getScfkFn('zxmyfk')" v-if="checkPermi(['proposalInfo:info:zxIdea'])">7办结审核</view>
+				<!--委员答复填内容,委员填满意度 -->
+				<!--协办单位,主办单位 填办理方式,办理程度,内容 附件 -->
+				<!-- 4.承办单位答复,交办单位审核(通过,不通过), -->
+				
+				<!-- 交办单位  审核后,承办单位答复(),委员直接提交评价(满意程度)-->
+				<!-- 流程 -->
+				<!-- 提案进度(0:提交提案,1:提案审查,2:提案立案,3:提案交办,4:办理提案,5:提案反馈,6:办结审核,7:已办结) -->
+				<!-- 1.委员录入
+				2.提案委立案是否,否 指定答复(交办)单位
+				3.交办 选择答复(承办)单位(主办,协办)
+				4.承办单位 答复反馈(办理方式,办理程度,内容)    
+				5.交办单位审核(通过,不通过),承办单位答复交办单位审核(内容,附件)
+				6.委员提交满意度,评价
+				7.政协 提交满意度(办结审核) -->
+				
+				<!-- 只要提案就可以 推荐重点,推荐优秀
+				提案办理,催办,联名,单列表 -->
+				<!-- 征集通知 ,提案查重,暂不需要 -->
+				<!-- 政协评价 -->
+				
 			</view>
 			
 		</view>
-		<pop-up :type='ptype' @getClose="getClose"></pop-up>
+		<pop-up :type='ptype' :blfsList="matterList" :blcdlist="blcdlist" :mycdlist="mycdlist" :dataTree="deptTree" @getClose="getClose" @getupSubmit="getupSubmit"></pop-up>
 	</view>
 </template>
 
 <script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
 	import popUp from "@/work/components/popup/popup.vue"
-	import { selectValue } from '@/utils/common.js';
-	import {getCaseDetailFn,getCasDelFn} from "@/api/mine/case.js"
+	import noData from "@/components/nodata/nodata.vue"
+	import {getDeptTree} from"@/api/mine/mine.js"
+	import { selectValue,selectValuetext } from '@/utils/common.js';
+	import {getCaseDetailFn,getCasDelFn,getInfoisRecordFn,getInfoAssignFn,getInfoReplyFn,getInfoShFn,getInfoIdeaFn,getInfozxIdeaFn} from "@/api/mine/case.js"
 	import {getDictionaryFn} from "@/api/mine/register.js"
 	export default{
-		components:{popUp},
+		components:{popUp,noData},
 		data(){
 			return{
 				bgimg:require("@/static/images/bg.png"),
 				fjimg:require("@/work/static/images/fjimg.png"),
 				filelist:[], 
-				stepList:[],
+				
 				tabidx:5,
 				titimg:require("@/work/static/images/titbg.png"),
 				upsimg:require("@/work/static/images/ups.png"),
 				zheList:[{val:0,zheflag:true,moreflag:true},{val:0,zheflag:true,moreflag:true},{val:0,zheflag:true,moreflag:true},{val:0,zheflag:true,moreflag:true},],
-				dwList:[{tit:'主办单位',val:0},{tit:'协办单位',val:1}],
+				dwList:[{tit:'主办单位',val:2},{tit:'协办单位',val:3}],
 				dwdetList:[],
-				dwVal:0,
+				dwVal:2,
 				ptype:'',
 				datainfo:{},
-				matterList:[],
-				mycdlist:[],
+				
 				dflxList:[],
+				stepList:[],//提案状态
+				jblist:[],//界别
+				matterList:[],//方式
+				blcdlist:[],//办理程度
+				deptTree:[],//答复单位
+				mycdlist:[],//满意程度
+				tary:''
 			}
 		},
 		onUnload(){
@@ -167,8 +220,10 @@
 			uni.$on('refreshdetail', (e) => {
 				this.getDetail()
 			})
+			// this.deptTree=[{id:100,label:"若依科技",children:[{id:200,label:"吃完",},{id:201,label:"vf",}]}]
 		},
 		methods:{
+			checkPermi, checkRole,
 			kaType(ite){
 				if(ite){
 					var newArr=ite.split(',')
@@ -186,10 +241,18 @@
 				}
 			},
 			typeFormat(ite,list){
-				var aite=selectValue(list, ite);
-				return aite.actions;
+				return selectValue(list, ite);
+			},
+			typeFormattext(ite,list){
+				return selectValuetext(list, ite);
 			},
 			init(){
+				// 协办单位
+				getDeptTree().then(res=>{
+					if(res.code==200){
+						this.deptTree=res.data
+					}
+				})
 				//提案状态
 				getDictionaryFn('proposal_progress').then(res=>{
 					if(res.code==200&&res.data.length){
@@ -201,10 +264,10 @@
 						})
 					}
 				})
-				// 答复类型
-				getDictionaryFn('proposal_complex_type').then(res=>{
+				// 界别circles
+				getDictionaryFn('circles').then(res=>{
 					if(res.code==200&&res.data.length){
-						this.dflxList = res.data.map(v => {
+						this.jblist = res.data.map(v => {
 							return {
 								label: v.dictLabel,
 								value: v.dictValue
@@ -212,7 +275,7 @@
 						})
 					}
 				})
-				// 协商方式
+				// 办理方式
 				getDictionaryFn('negotiation_mode').then(res=>{
 					if(res.code==200&&res.data.length){
 						this.matterList = res.data.map(v => {
@@ -223,26 +286,120 @@
 						})
 					}
 				})
+				// 办理程度degree
+				getDictionaryFn('degree').then(res=>{
+					if(res.code==200&&res.data.length){
+						this.blcdlist = res.data.map(v => {
+							return {
+								text: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
 				// 满意程度
 				getDictionaryFn('member_satisfaction').then(res=>{
 					if(res.code==200&&res.data.length){
 						this.mycdlist = res.data.map(v => {
 							return {
-								label: v.dictLabel,
+								text: v.dictLabel,
 								value: v.dictValue
 							}
 						})
 					}
 				})
 			},
+			getInfoisRecordFn(){
+				getInfoisRecordFn().then(res=>{
+					
+				})
+			},
+			getupSubmit(e){
+				var that=this;
+				var type=this.ptype;
+				if(type=='scfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoisRecordFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("立案成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)
+							
+						}
+					})
+				}else if(type=='tajb'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoAssignFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)
+						}
+					})
+				}else if(type=='dffk'||type=='dwdf'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoReplyFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("答复反馈成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)	
+						}
+					})
+				}else if(type=='jbsh'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoShFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("交办审核成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)	
+						}
+					})
+				}else if(type=='wymyfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoIdeaFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)	
+						}
+					})
+				}else if(type=='zxmyfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfozxIdeaFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.getDetail()
+							},1200)	
+						}
+					})
+				}
+			},
 			getEditFn(){
 				this.$tab.navigateTo('/work/pages/case/add?type=edit&id='+this.id)
 			},
 			getClose(){
 				this.ptype=""
 			},
-			getScfkFn(){
-				this.ptype="scfk"
+			getScfkFn(type){
+				this.ptype=type
 			},
 			getZheFn(idx){
 				this.zheList[idx].zheflag=!this.zheList[idx].zheflag
@@ -259,7 +416,7 @@
 					confirmText: '确认',
 					success: function(res) {
 						if (res.confirm) {
-							getCasDelFn(this.id).then(res=>{
+							getCasDelFn(that.id).then(res=>{
 								if(res.code==200){
 									that.$toast('删除成功')
 									uni.$emit("refreshlist")
@@ -283,6 +440,14 @@
 						if(res.data.zxFjList&&res.data.zxFjList.length){
 							this.filelist=JSON.parse(JSON.stringify(res.data.zxFjList))
 						}
+						var taryList=res.data.proposalUserList;
+						if(taryList&&taryList.length){
+							var newArr=[]
+							taryList.forEach(ite=>{
+								newArr.push(ite.name)
+							})
+							this.tary=newArr.join('/')
+						}
 						this.dwdetList=res.data.proposalUnitReplyList;
 					}
 				})
@@ -369,9 +534,9 @@
 	
 }
 // 按钮
-	.fbtns{display: flex;align-items: center;justify-content: space-between;padding: 54rpx 12rpx 34rpx;
+	.fbtns{display: flex;align-items: center;justify-content: space-between;padding: 54rpx 12rpx 34rpx;display: flex;flex-wrap: wrap;
 		.btn{height: 80rpx;font-weight: bold;font-size: 30rpx;box-sizing: border-box;border-radius: 40rpx;display: flex;align-items: center;
-		justify-content: center;margin:0 12rpx;flex:1;
+		justify-content: center;margin:0 12rpx;flex:1;flex: 0 0 auto;
 			&.btn1{border: 2rpx solid #1D64E2;background: #ffffff;color: #1D64E2;}
 			&.btn2{background: #1D64E2;color: #ffffff;}
 		}

+ 386 - 26
work/pages/case/mine.vue

@@ -1,5 +1,5 @@
 <template>
-	<view class="pb50" :style="'padding-top:'+nvaHeight+'px;'">
+	<view :style="'padding-top:'+nvaHeight+'px;'">
 		<view class="navbox">
 			<uni-nav-bar  color="#ffffff" rightWidth="150rpx" title="政协提案" @clickLeft="getBack" @clickRight="getChFn"  :background-color="backgroundColor" :border="false" statusBar='true' fixed="true">
 				<block slot="left">
@@ -17,41 +17,68 @@
 			<view class="plr12 mt18">
 				<view class="search flex0 mb10">
 					<image :src="searchimg"></image>
-					<input placeholder="输入关键字进行查询" />
+					<input placeholder="输入关键字进行查询" v-model="title" @confirm="getConfirm"/>
 				</view>
 			</view>
 			<view class="tablists flexc mb20">
-				<view v-for="(ite,idx) in tabList" @click="getTabFn(ite.val)" :class="{act:tabidx==ite.val}" :key="idx">{{ite.tit}}</view>
+				<block v-for="(ite,idx) in tabList" >
+					<view  v-if="checkPermi([ite.limit])" @click="getTabFn(ite)" :class="{act:tabidx==ite.val}" :key="idx">{{ite.tit}}</view>
+				</block>
+				
 			</view>
 			<view style="height: 56rpx;"></view>
 			<view class="lbtab flexc">
 				<image :src="lbicoimg" class="limg"></image>
 				<view class="lbtabs flexc">
-					<view class="lbtabp" v-for="(ite,idx) in litablist" :key="idx">
-						<picker  range-key='label' :value="talbidx" :range="taztList"  @change='bindDateChangea'>
-							<view :class="datainfo.dqjz?'':'f16 co80'">{{datainfo.talb || ite.tit}}</view>
+					<view class="lbtabp" @click="getTalbFn">
+						<view style="padding: 0 18rpx;" :class="tnlbname?'':'f16 co80'">{{tnlbname || "提案类别"}}</view>
+						<image :src="upimg" class="upimg"></image>
+					</view>
+					<view class="lbtabp">
+						<picker  range-key='label' :value="talbidx" :range="talxList"  @change='bindDateChangea'>
+							<view :class="talx?'':'f16 co80'">{{talx || "提案类型"}}</view>
 						</picker>
 						<image :src="upimg" class="upimg"></image>
 					</view>
+					<view class="lbtabp">
+						<picker mode="date" fields="year"  range-key='label' :value="talbidx"   @change='bindDateChangeb'>
+							<view :class="tatime?'':'f16 co80'">{{tatime || "选择年份"}}</view>
+						</picker>
+						<image :src="upimg" class="upimg"></image>
+					</view>
+					<!-- <view class="lbtabp">
+						<picker  range-key='label' :value="talbidx" :range="taztList"  @change='bindDateChangea'>
+							<view :class="datainfo.dqjz?'':'f16 co80'">{{datainfo.talb || "单位答复"}}</view>
+						</picker>
+						<image :src="upimg" class="upimg"></image>
+					</view> -->
 				</view>
 			</view>
 		</view>
 		<!-- 列表 -->
 		<view class="mbox">
-			<case-list :datalist="list" :wtdt="wtdt" :tajdlist='tajdlist' :type='tabidx' @getDetail="getDetail" @getTuiFn="getTuiFn"></case-list>
+			<case-list :datalist="list" :listtype="listtype" :wtdt="wtdt" :tajdlist='tajdlist' :type='tabidx' @getDetail="getDetail"  @getTuiFn="getTuiFn"></case-list>
+		</view>
+		<view v-if="checkPermi(['proposalInfo:info:add'])">
+			<view style="height: 100rpx;"></view>
+			<view class="fwbtns" @click="getAddCase">提交提案</view>
 		</view>
-		<view class="fwbtns">提交提案</view>
+		
 		
 		<!-- 弹窗 -->
-		<pop-up :type='ptype' @getClose="getClose"></pop-up>
+		<pop-up :type='ptype' :blfsList="matterList" :blcdlist="blcdlist" :mycdlist="mycdlist" :dataTree="deptTree" @getClose="getClose" @getupSubmit="getupSubmit"></pop-up>
 	</view>
 </template>
 
 <script>
-	import {getCaseListFn} from "@/api/mine/case.js"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import {getCaseListFn,getInfoisRecordFn,getInfoAssignFn,getInfoReplyFn,getInfoShFn,getInfoIdeaFn,getInfozxIdeaFn,
+	getInfourgeFn,getInfokeyPointFn,getInfooutstandingFn,getUserverifyFn 
+	} from "@/api/mine/case.js"
 	import popUp from "@/work/components/popup/popup.vue"
 	import caseList from "@/work/components/case/list.vue"
 	import {getDictionaryFn} from "@/api/mine/register.js"
+	import {getDeptTree} from"@/api/mine/mine.js"
 	export default{
 		components:{caseList,popUp},
 		data(){
@@ -62,15 +89,23 @@
 				backimg:require("@/work/static/images/back.png"),
 				upimg:require("@/work/static/images/up.png"),
 				backgroundColor:"#1D64E2",
-				tabidx:7,
-				tabList:[{tit:'征集通知',val:0},{tit:'提案审查',val:7},{tit:'我的提案',val:1},{tit:'联名提案',val:2},{tit:'推荐优秀',val:3},
-				{tit:'推荐重点',val:4},{tit:'公开提案',val:5},{tit:'办理质量评议',val:6}],
-				litablist:[{tit:'提案类别',val:0},{tit:'提案状态',val:1},{tit:'办理状态',val:2},{tit:'联名状态',val:1},{tit:'评议状态',val:1},{tit:'承办单位',val:2},{tit:'选择年份',val:1},{tit:'选择会议',val:3},
-					{tit:'推荐状态',val:0},{tit:'开始日期',val:1},{tit:'结束日期',val:2},
+				tabidx:'tasc',
+				tabtype:'1',//进度查询
+				// {tit:'征集通知',val:0}, 提案催办 目前看所有
+				tabList:[{tit:'提案审查',jd:1,val:'tasc',limit:'proposalInfo:info:isRecord'},{tit:'提案交办',jd:3,val:'tajb',},
+				{tit:'提案办理',jd:4,val:'tabl',},{tit:'办结审核',jd:6,val:'jbsh',},
+				{tit:'提案催办',val:'tacb',},
+				{tit:'我的提案',val:'wdta',},{tit:'联名提案',val:'lmta',},{tit:'推荐优秀',val:'tjyx'},
+				{tit:'推荐重点',val:'tjzd'},{tit:'公开提案',val:'gkta'},
 				],
+				litablist:[{tit:'提案类别',val:0},{tit:'提案类型',val:1},{tit:'单位类型',val:2},{tit:'选择年份',val:3},],
+				// {tit:'开始日期',val:1},{tit:'结束日期',val:2},
+				// "proposalProgress":"提案进度(0:提交提案,1:提案审查,2:提案立案,3:提案交办,4:办理提案,5:提案反馈,6:办结审核,7:已办结) ",
 				nvaHeight:44,
 				talbList:[{},],
 				taztList:[{label:'是',value:'0'},{label:'否',value:'1'}],
+				talxList:[{label:'大会提案',value:'0'},{label:'平时提案',value:'1'}],
+				dwlxList:[{label:'答复单位',value:'1'},{label:'主办单位',value:'2'},{label:'协办单位',value:'3'}],
 				talbidx:'',
 				datainfo:{
 					talb:'',
@@ -81,12 +116,24 @@
 				pageNum: 1,
 				reachflag: true,
 				wtdt:'',
-				tajdlist:[]
-				
+				tajdlist:[],
+				listtype:'case',
+				tnlbname:'',//提案类别
+				talbid:'',//提案类别id
+				talx:'',//提案类型
+				talxid:'',
+				tatime:'',//提案时间
+				title:'',
+				deptTree:[],
+				matterList:[],
+				blcdlist:[],
+				mycdlist:[],
+				id:'',
 			}
 		},
 		onUnload(){
 			uni.$off('refreshlist')
+			uni.$off('refreshtalb')
 		},
 		onLoad(e) {
 			this.getDataFn()
@@ -94,11 +141,20 @@
 			uni.$on('refreshlist', (e) => {
 				this.getDataFn()
 			})
+			uni.$on('refreshtalb', (e) => {
+				this.tnlbname=e.categoryName;
+				this.talbid=e.categoryId;
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			})
 		},
 		mounted() {
 			this.getHeightFn()
 		},
 		methods:{
+			checkPermi, checkRole,
 			// 提案状态
 			init(){
 				getDictionaryFn('proposal_progress').then(res=>{
@@ -111,6 +167,273 @@
 						})
 					}
 				})
+				
+				// 协办单位
+				getDeptTree().then(res=>{
+					if(res.code==200){
+						this.deptTree=res.data
+					}
+				})
+				// 办理方式
+				getDictionaryFn('negotiation_mode').then(res=>{
+					if(res.code==200&&res.data.length){
+						this.matterList = res.data.map(v => {
+							return {
+								label: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+				// 办理程度degree
+				getDictionaryFn('degree').then(res=>{
+					if(res.code==200&&res.data.length){
+						this.blcdlist = res.data.map(v => {
+							return {
+								text: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+				// 满意程度
+				getDictionaryFn('member_satisfaction').then(res=>{
+					if(res.code==200&&res.data.length){
+						this.mycdlist = res.data.map(v => {
+							return {
+								text: v.dictLabel,
+								value: v.dictValue
+							}
+						})
+					}
+				})
+			},
+			getConfirm(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTuiFn(data){
+				var sh=data.sh;
+				this.id=data.id;
+				var type=data.type;
+				console.log(data,2)
+				if(type=='scfk'){
+					if(sh==1){
+						this.ptype=data.type;
+					}else{
+						var params={
+							proposalId:data.id,
+							isRecord:0,
+						}
+						getInfoisRecordFn(params).then(res=>{
+							if(res.code==200){
+								this.$toast("立案成功");
+								setTimeout(function(){
+									that.ptype='';
+									that.pageNum=1;
+									that.list=[];
+									that.reachflag=true;
+									that.getDataFn()
+								},1200)
+								
+							}
+						})
+					}
+				}else if(type=='lmta'){
+					if(sh==2){
+						this.ptype=data.type;
+					}else{
+						var params={
+							proposalId:data.id,
+							isAgree:1,
+						}
+						getUserverifyFn(params).then(res=>{
+							if(res.code==200){
+								this.$toast("确认联名提案成功");
+								setTimeout(function(){
+									that.ptype='';
+									that.pageNum=1;
+									that.list=[];
+									that.reachflag=true;
+									that.getDataFn()
+								},1200)
+								
+							}
+						})
+					}
+				}else{
+					this.ptype=type
+				}	
+			},
+			getupSubmit(e){
+				var that=this;
+				var type=this.ptype;
+				if(type=='scfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoisRecordFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("立案成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)
+							
+						}
+					})
+				}else if(type=='tajb'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoAssignFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)
+						}
+					})
+				}else if(type=='dffk'||type=='dwdf'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoReplyFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("答复反馈成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='jbsh'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoShFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("交办审核成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='wymyfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfoIdeaFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='zxmyfk'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfozxIdeaFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='tacb'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.scoreId=this.id
+					getInfourgeFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("提案办结成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='tjyx'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfooutstandingFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("推荐优秀成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='tjzd'){
+					var params=JSON.parse(JSON.stringify(e))
+					params.proposalId=this.id
+					getInfokeyPointFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast("推荐重点成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}else if(type=='lmta'){
+					var params=JSON.parse(JSON.stringify(e))
+					var str='同意'
+					if(params.isAgree==2){
+						str="反对"
+					}
+					params.proposalId=this.id
+					getUserverifyFn(params).then(res=>{
+						if(res.code==200){
+							this.$toast(str+"成功");
+							setTimeout(function(){
+								that.ptype='';
+								that.pageNum=1;
+								that.list=[];
+								that.reachflag=true;
+								that.getDataFn()
+							},1200)	
+						}
+					})
+				}
+			},
+			getAddCase(){
+				if(uni.getStorageSync('tjtaList')){
+					// var newObj=JSON.parse(JSON.stringify(uni.getStorageSync('tjtaList')))
+					this.ptype='zcta'
+				}else{
+					this.$tab.navigateTo('/work/pages/case/add')
+				}
 			},
 			getHeightFn(){
 				var s=uni.getSystemInfoSync().statusBarHeight;
@@ -123,8 +446,13 @@
 			getClose(){
 				this.ptype=""
 			},
-			getTabFn(idx){
-				this.tabidx=idx;
+			getTabFn(ite){
+				this.tabidx=ite.val;
+				this.pageNum=1;
+				this.list=[],
+				this.reachflag=true;
+				this.tabtype=ite.jd||"";
+				this.getDataFn()
 			},
 			getBack(){
 				uni.navigateBack({
@@ -132,23 +460,55 @@
 				})
 			},
 			bindDateChangea(e){
-				console.log(e,2)
+				var val=e.detail.value;
+				this.talx=this.talxList[val].label;
+				this.talxid=this.talxList[val].value;
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTalbFn(){
+				var obj={
+					id:this.talbid,
+					name:this.tnlbname,
+				}
+				this.$tab.navigateTo('/work/pages/case/talbclass?data='+encodeURIComponent(JSON.stringify(obj)))
 			},
 			getChFn(){
 				this.$tab.navigateTo('/work/pages/case/tacheck')
 			},
-			getTuiFn(ite){
-				this.ptype=ite.type
-			},
+			
 			getDetail(data){
 				this.$tab.navigateTo('/work/pages/case/details?id='+data)	
 			},
 			getDataFn(){
+				var tab=this.tabidx;
 				var params={
 					pageSize:this.pageSize,
 					pageNum: this.pageNum,
-					// visitType:3
 				}
+				// if(this.tabtype){
+				// 	params.proposalProgress=this.tabtype
+				// }
+				// if(this.talx){
+				// 	params.proposalType=this.talxid
+				// }
+				// if(this.tnlbname){
+				// 	params.categoryId=this.talbid
+				// }
+				// if(this.title){
+				// 	params.title=this.title
+				// }
+				// if(tab=='lmta'){
+				// 	params.isJointly="是"
+				// }else if(tab=='tjyx'){
+				// 	params.isOutstanding="0"
+				// }else if(tab=='tjzd'){
+				// 	params.isKeyPoint="0"
+				// }else if(tab=='gkta'){
+				// 	params.isKeyPoint="是"
+				// }
 				getCaseListFn(params).then(res=>{
 					if(res.code==200){
 						if (res.rows.length < this.pageSize) {
@@ -199,8 +559,8 @@
 	}
 	.lbtab{height: 114rpx;background: #FFFFFF;border-radius: 30rpx;padding-left: 24rpx;position: absolute;left:24rpx;right: 24rpx;bottom: -58rpx;
 		.limg{width: 40rpx;height: 34rpx;margin-right: 10rpx;flex:0 0 auto;}
-		.lbtabs{overflow: auto;flex-wrap: nowrap;
-			.lbtabp{display: flex;align-items: center;flex: 0 0 auto;margin-right: 24rpx;}
+		.lbtabs{overflow: auto;flex-wrap: nowrap;flex: 1;
+			.lbtabp{display: flex;align-items: center;flex: 1;margin-right: 24rpx;}
 			.upimg{width: 18rpx;height: 10rpx;}
 			
 		}

+ 2 - 2
work/pages/news/add.vue

@@ -91,7 +91,7 @@
 <script>
 	import {getDictionaryFn} from "@/api/mine/register.js"
 	import {getNoticeAdd,getNoticeDetail} from "@/api/mine/news.js"
-	import { selectValue } from '@/utils/common.js';
+	import { selectValueKey } from '@/utils/common.js';
 	import config from '@/config'
 	const baseUrl = config.baseUrl
 	import { getToken } from '@/utils/auth'
@@ -167,7 +167,7 @@
 		
 		methods:{
 			statusFormat(ite) {
-				var aite=selectValue(this.tzlbList, ite);
+				var aite=selectValueKey(this.tzlbList, ite);
 				this.tzlbidx=aite.key;
 				return aite.actions;
 			},

+ 2 - 2
work/pages/report/addscore.vue

@@ -63,7 +63,7 @@
 <script>
 	import {getDictionaryFn} from "@/api/mine/register.js"
 	import {getNoticeAdd,getNoticeDetail} from "@/api/mine/news.js"
-	import { selectValue } from '@/utils/common.js';
+	import { selectValueKey } from '@/utils/common.js';
 	import config from '@/config'
 	const baseUrl = config.baseUrl
 	import { getToken } from '@/utils/auth'
@@ -103,7 +103,7 @@
 		
 		methods:{
 			statusFormat(ite) {
-				var aite=selectValue(this.tzlbList, ite);
+				var aite=selectValueKey(this.tzlbList, ite);
 				this.tzlbidx=aite.key;
 				return aite.actions;
 			},

+ 1 - 2
work/pages/report/details.vue

@@ -222,8 +222,7 @@
 				}
 			},
 			typeFormat(ite,list){
-				var aite=selectValue(list, ite);
-				return aite.actions;
+				return selectValue(list, ite);
 			},
 			init(){
 				//提案状态