Bläddra i källkod

Merge remote-tracking branch 'origin/master'

yin_yu820 1 vecka sedan
förälder
incheckning
a19258e315

+ 37 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/controller/DzfQuestionController.java

@@ -231,6 +231,43 @@ public class DzfQuestionController {
 		HashMap<Object,String> result = dzfQuestionService.getProgressStatistics(start,end);
 		return ResponseEntity.ok ( result );
 	}
+	/**
+	 * 问题诉求列表数据
+	 */
+	@ApiLog("查询问题诉求列表数据")
+	@ApiOperation(value = "查询问题诉求列表数据")
+	@PreAuthorize("hasAuthority('question:dzfQuestion:list')")
+	@GetMapping("list2")
+	public ResponseEntity<IPage<DzfQuestionDTO>> list2(String state, Page<DzfQuestionDTO> page) throws Exception {
+
+//		UserDTO userDTO = UserUtils.getCurrentUserDTO();
+//		//企业(能看到自己企业的问题)
+//		if(userDTO.getRoleIds().equals("38a14f1f42ed424eab4cb5d489596b0d")){
+//			EnterpriseInfoDTO ei=enterpriseInfoService.findByUserid ( userDTO.getLoginName());
+//			dzfQuestionDTO.setQyId(ei.getId());
+//		}
+//
+//		QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (dzfQuestionDTO, DzfQuestionDTO.class);
+//		//挂钩干部(能看到对应企业)
+//		if(userDTO.getRoleIds().equals("1910141956174053377")){
+//			queryWrapper.eq ("ei.bz6", userDTO.getLoginName() ); // 排除已经删除
+//		}
+//		//办公室(能看到所有提交的问题)
+//		if(userDTO.getRoleIds().equals("1910175386924417025")){
+//			queryWrapper.ne ("a.states", "0" ); // 排除已经删除
+//		}
+//		//办理部门
+//		if(userDTO.getRoleIds().equals("1910175949166673921")){
+//			queryWrapper.eq ("c.des3", userDTO.getLoginName() ); // 筛选流程中涉及到自己的
+//			IPage<DzfQuestionDTO> result = dzfQuestionService.findPage2 (page, queryWrapper);
+//			return ResponseEntity.ok (result);
+//		}else{
+//			IPage<DzfQuestionDTO> result = dzfQuestionService.findPage (page, queryWrapper);
+//			return ResponseEntity.ok (result);
+//		}
+		IPage<DzfQuestionDTO> result = dzfQuestionService.findPage3 (page, state);
+			return ResponseEntity.ok (result);
+	}
 
 	/**
      * 导出问题诉求数据

+ 2 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/mapper/DzfQuestionMapper.java

@@ -40,4 +40,6 @@ public interface DzfQuestionMapper extends BaseMapper<DzfQuestion> {
     HashMap<Object, Object> getProgressMonth(@Param("start")String start,@Param("end")String end);
 
     HashMap<Object, Object> getProgressYear(@Param("start")String start,@Param("end")String end);
+
+    IPage<DzfQuestionDTO> findList3(Page<DzfQuestionDTO> page, String state);
 }

+ 19 - 4
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/mapper/xml/DzfQuestionMapper.xml

@@ -70,15 +70,30 @@
 	</select>
 
 	<select id="getProgressMonth" resultType="Map"  parameterType="String">
-		SELECT COUNT(*) allque, COUNT(IF(states != 3,1,NULL )) AS unfinish
-		FROM dzf_question WHERE del_flag = 0
+		SELECT COUNT(*) allque, COUNT(IF(states != 0 or states IS NULL ,1,NULL )) AS unfinish
+		FROM dzf_question_detil WHERE del_flag = 0
 		AND DATE_FORMAT(create_date, '%Y-%m-%d') >= #{start} AND DATE_FORMAT(create_date, '%Y-%m-%d') &lt;= #{end};
 	</select>
 
 	<select id="getProgressYear" resultType="Map" parameterType="String">
-		SELECT COUNT(*) allque, COUNT(IF(states = 3,1,NULL )) AS finish
-		FROM dzf_question WHERE del_flag = 0
+		SELECT COUNT(*) allque, COUNT(IF(states = 0,1,NULL )) AS finish
+		FROM dzf_question_detil WHERE del_flag = 0
 		AND DATE_FORMAT(create_date,'%Y') = DATE_FORMAT(#{end},'%Y');
 	</select>
 
+	<select id="findList3" resultType="com.jeeplus.question.service.dto.DzfQuestionDTO" >
+		SELECT
+		<include refid="dzfQuestionColumns"/>
+		FROM dzf_question a
+		<include refid="dzfQuestionJoins2"/>
+		WHERE a.del_flag = 0 AND b.del_flag = 0
+		<if test="state == 999">
+			AND (b.states != 0 OR b.states IS NULL)
+		</if>
+		<if test="state != 999">
+			AND b.states = #{state}
+		</if>
+		group by a.id
+	</select>
+
 </mapper>

+ 4 - 0
jp-console/jeeplus-module/ly/src/main/java/com/jeeplus/question/service/DzfQuestionService.java

@@ -124,4 +124,8 @@ public class DzfQuestionService extends ServiceImpl<DzfQuestionMapper, DzfQuesti
 		allNum.put("finishAcount", String.valueOf(f2));
 		return allNum;
     }
+
+	public IPage<DzfQuestionDTO> findPage3(Page<DzfQuestionDTO> page, String state) {
+		return  baseMapper.findList3 (page, state);
+	}
 }

+ 8 - 0
jp-mobile/api/question/dzfQuestionService.js

@@ -47,6 +47,14 @@ export default {
 			}
 		})
 	},
+	
+	list2: function(params) {
+		return request({
+			url: '/question/dzfQuestion/list2',
+			method: 'get',
+			params: params
+		})
+	},
 
 	exportTemplate: function() {
 		return request({

+ 4 - 0
jp-mobile/pages.json

@@ -44,6 +44,10 @@
 			"path": "pages/progress/progressStatistics",
 			"style": {}
 		},
+		{
+			"path": "pages/progress/ProgressQuestionList",
+			"style": {}
+		},
 		{
 			"path": "pages/login/login",
 			"style": {

+ 1 - 1
jp-mobile/pages/index/Dzfindex.vue

@@ -356,7 +356,7 @@
 			totongxunlu5(){
 											
 				uni.navigateTo({
-					url: '/pages/policy/policyList'
+					url: '/pages/progress/progressStatistics'
 				})
 			},
 			

+ 787 - 0
jp-mobile/pages/progress/ProgressQuestionList.vue

@@ -0,0 +1,787 @@
+<template>
+	<view>
+		<view :class="['custom-header', { 'is-back': isBack }, bgColor]">
+			<view class="back-container" @click="handleBack">
+				<view class="back-text">返回</view>
+			</view>
+			<view class="content-container">
+				<view class="content-text">{{title}}</view>
+			</view>
+		</view>
+
+		
+		<view class="line-box">
+			<uni-data-select v-if="finish" v-model="curWord" :localdata="range" @change="change"></uni-data-select>
+			<view :style="[{top:CustomBar + 'px'}]">
+				<mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" :up="upOption"
+					@up="upCallback">
+					<view class="cu-item" :class="modalName=='move-box-'+ index?'move-cur':''"
+						v-for="(item, index) in dataList" :key="index" @touchstart="ListTouchStart"
+						@touchmove="ListTouchMove" @touchend="ListTouchEnd" :data-target="'move-box-' + index">
+
+
+						<view class="item-box" @click="gotoBuildInfo(item.id,item.phone,item.states)">
+							<view class="item-title">
+								企业名称:{{item.qyName}}
+							</view>
+							<view class="item-title">
+								提交时间:{{item.createDate}}
+							</view>
+							<view class="item-title">
+								提交人:{{item.qyFzr}}
+							</view>
+							<view class="item-title">
+								办结时间:{{item.des5||'----'}}
+							</view>
+
+						</view>
+
+
+					</view>
+				</mescroll-body>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import * as $auth from "@/common/auth.js"
+	import loginService from "@/api/auth/loginService";
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import dzfQuestionService from '@/api/question/dzfQuestionService.js'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		data() {
+			return {
+				canAdd: false,
+				userid: "",
+				isLogin: "",
+				pageInfo: {},
+				loginid: "",
+				title: "",
+				isBack: true, // 是否显示返回按钮
+				bgColor: 'bg-blue', // 背景颜色
+				finish:true,
+				curWord: "", //当前搜索关键词
+				range: [
+				          { value: 999, text: "全部" },
+				          { value: 1, text: "反馈大走访" },
+				          { value: 2, text: "正在办理" },
+						  { value: 3, text: "难以化解" },
+						  { value: 4, text: "持续跟踪" },
+						  { value: 5, text: "提请会办" },
+				        ],
+				dataList: [], // 数据列表
+				modalName: null,
+				tablePage: {
+					total: 0,
+					currentPage: 1,
+					pageSize: 10,
+					orders: []
+				},
+				loading: false,
+				parkId: '',
+				parkList: [],
+				parkList2: [],
+				parkList3: [],
+				parkList4: [],
+				ddd1: "",
+			};
+		},
+		onLoad(query) {
+			if (query != undefined && query != null && query != '') {
+				if (query.loginid != undefined) {
+					this.loginid = query.loginid
+					this.autoLogin();
+				}
+				
+				if (query && query.w == 1) {
+					this.curWord = 999
+				} else if (query && query.w == 2) {
+					this.curWord = 0
+					this.finish = false
+				}
+			}
+
+			//只有企业角色才能发起问题诉求			
+			if ($auth.getUserInfo().roleIds == "38a14f1f42ed424eab4cb5d489596b0d") {
+				this.canAdd = true;
+			}
+
+
+		},
+		onShow() {
+			this.isLogin = this.$auth.checkisLogin();
+		},
+
+		created() {
+
+			this.userid = $auth.getUserInfo().loginName;
+
+		},
+		methods: {
+			/*获取数据列表 */
+			upCallback(page) {
+				this.loading = true
+				dzfQuestionService.list2({
+					current: page.num,
+					size: page.size,
+					orders: [{
+						column: 'a.create_date',
+						asc: false
+					}],
+					state:this.curWord
+				}).then(({
+					data
+				}) => {
+					let curPageData = data.records
+					this.mescroll.endBySize(curPageData.length, data.total);
+					//如果是第一页需手动制空列表
+					if (page.num == 1)
+						this.dataList = [];
+					//追加新数据
+					this.dataList = this.dataList.concat(curPageData);
+				}).catch(e => {
+					//联网失败, 结束加载
+					this.mescroll.endErr();
+				})
+			},
+			change(val){
+				this.dataList = []
+				if(this.curWord == ''){this.curWord = 999}
+				this.upCallback(this.tablePage)
+			},
+
+			gotoBuildInfo(id, phone, states) {
+				//此条信息的发起人是当前账号				
+				if (phone == this.userid && states == '0') {
+
+					uni.navigateTo({
+						url: `/pages/question/questionAdd?id=${id}&ischeck=1`
+					})
+
+					//此条信息是处理人	
+				} else {
+					uni.navigateTo({
+						url: `/pages/question/questionInfo?id=${id}&ischeck=1`
+					})
+				}
+
+			},
+
+			updateCities(newCities) {
+				this.cities = newCities;
+			},
+
+			// 搜索
+			doSearch() {
+
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+
+			autoLogin() {
+				console.log("登录id" + this.loginid);
+				loginService.loginid(this.loginid).then(({
+					data
+				}) => {
+					this.$store.commit('SET_TOKEN', data.token);
+					this.refreshUserInfo();
+
+				}).catch(e => {
+					console.error(e)
+				})
+			},
+
+			getRole() {
+				let userInfo = uni.getStorageSync('WMS-userinfo')
+				var officeId = userInfo.officeDTO.id;
+				var roleIds = userInfo.roleIds;
+				if (roleIds.indexOf("17bac1f980264e3e8193bc965538e2c6") != -1) {
+					//// 管理员
+					this.stype = 5
+					uni.setStorageSync('stype', this.stype);
+				} else if (roleIds.indexOf("ade960e8f02544998b07397304c059c1") != -1) {
+					// 政府管理员
+					this.stype = 4
+					uni.setStorageSync('stype', this.stype);
+				} else {
+					console.log('==================>这里走了么', '================>存一个stape')
+					loginService
+						.getOtherIdByOffceid({
+							officeid: officeId,
+						})
+						.then(({
+							data
+						}) => {
+							console.log(data, "====================>getOtherIdByOffceid");
+							this.stype = data.stype;
+							uni.setStorageSync('stype', this.stype);
+						});
+				}
+
+			},
+
+			outloginset() {
+				loginService.logout().then(({
+					data
+				}) => {
+					this.$store.commit('logout');
+					uni.clearStorage();
+
+				})
+
+				this.$store.commit('logout');
+				uni.clearStorage();
+				this.isLogin = this.$auth.checkisLogin();
+				uni.hideLoading()
+			},
+
+			outlogin() {
+				uni.showModal({
+					title: '您确认退出么?',
+					showCancel: true,
+					success: (res) => {
+						if (res.confirm) {
+							uni.showLoading()
+							this.outloginset();
+							// uni.reLaunch({
+							// 	url: '/pages/login/login'
+							// })
+						}
+					}
+				});
+			},
+			tces() {
+				uni.navigateTo({
+					url: '/pages/index/AudioToWord'
+				})
+			},
+
+			// ListTouch触摸开始
+			ListTouchStart(e) {
+				this.listTouchStart = e.touches[0].pageX
+			},
+
+			// ListTouch计算方向
+			ListTouchMove(e) {
+				this.listTouchDirection = e.touches[0].pageX - this.listTouchStart > -60 ? 'right' : 'left'
+			},
+
+			// ListTouch计算滚动
+			ListTouchEnd(e) {
+				if (this.listTouchDirection == 'left') {
+					this.modalName = e.currentTarget.dataset.target
+				} else {
+					this.modalName = null
+				}
+				this.listTouchDirection = null
+			},
+			handleBack() {
+				// 返回逻辑,比如跳转至上一页
+				this.$router.go(-1);
+			},
+
+			add() {
+
+				if (this.isLogin == null) {
+					uni.showModal({
+						title: '您还未登录,现在去登录?',
+						showCancel: true,
+						success: (res) => {
+							if (res.confirm) {
+								uni.showLoading()
+								uni.reLaunch({
+									url: '/pages/login/login'
+								})
+							}
+						}
+					});
+				} else {
+					uni.navigateTo({
+						url: '/pages/question/questionAdd'
+					})
+				}
+
+
+			},
+			switchTab(index) {
+				this.activeTab = index;
+				if (this.activeTab == 0) {
+					this.searchForm.des1 = "";
+				} else {
+					this.searchForm.des1 = this.activeTab;
+				}
+
+				this.doSearch();
+
+			}
+		}
+	}
+</script>
+
+<style>
+	.page {
+		height: 100vh;
+	}
+
+	.line-box {
+
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+		margin-top: 20rpx;
+
+	}
+
+	.mart-t {
+		margin-top: 30rpx;
+	}
+
+	.center-box {
+		margin-top: 20rpx;
+		width: 100%;
+		border-radius: 25rpx;
+		border-radius: 25rpx;
+		background: #fff;
+		box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.center-left-box {
+		width: 100%;
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.btn-box-text {
+		flex: 1;
+		height: 20rpx;
+		text-align: center;
+		color: #000000;
+		font-size: 14px;
+		font-weight: 700;
+	}
+
+	.btn-box-1 {
+		flex: 1;
+		height: 30rpx;
+		text-align: center;
+		color: #36A7F3;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-2 {
+		flex: 1;
+		height: 30rpx;
+		text-align: center;
+		color: #F3365A;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-3 {
+		flex: 1;
+		height: 30rpx;
+		text-align: center;
+		color: #15D578;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-box-4 {
+		flex: 1;
+		height: 30rpx;
+		text-align: center;
+		color: #F1A31B;
+		font-size: x-large;
+		font-weight: 700;
+	}
+
+	.btn-Imbox {
+		flex: 1;
+		height: 150rpx;
+		padding-top: 8rpx;
+		text-align: center;
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		/* 子元素内部内容竖向居中 */
+		align-items: center;
+		/* 子元素内部内容水平居中 */
+		text-align: center;
+		/* 文字居中 */
+
+	}
+
+	.btn-Imbox p {
+		font-size: 14px;
+		/* 文字大小,可根据需要调整 */
+		margin: 0;
+		/* 去掉默认的外边距 */
+		font-weight: 700;
+	}
+
+	.center-img {
+		width: 90rpx;
+		height: 90rpx;
+		margin-bottom: 10rpx;
+		text-align: center;
+	}
+
+	.center-img2 {
+		width: 70rpx;
+		height: 70rpx;
+		margin-top: 10rpx;
+		margin-bottom: 20rpx;
+		text-align: center;
+	}
+
+	.kuai-text {
+		color: #000000;
+		font-weight: 900;
+		font-size: 34rpx;
+		padding-top: 20rpx;
+		padding-left: 20rpx;
+	}
+
+
+	.h-200 {
+		height: 200rpx;
+	}
+
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+
+	.font-size-35 {
+		font-size: 35px !important;
+	}
+
+	.img-size {
+		width: 80rpx;
+		height: 80rpx;
+	}
+
+	.content-box {
+		width: 437rpx;
+		height: 200rpx;
+	}
+
+	.my-app .padding-sm {
+		padding: 6px;
+	}
+
+	.grid .padding-sm .bg-white {
+		box-shadow: 0 1px 4px #f9f9f9, 1px 1px 40px rgba(0, 0, 0, .06);
+	}
+
+	.bg-blue {
+		background: #fff;
+		color: #0081ff !important;
+	}
+
+	.text-white,
+	.line-white,
+	.lines-white {
+		color: #0081ff !important;
+	}
+
+
+
+
+	.cu-bar .search-form {
+		background-color: white;
+	}
+
+
+	.item-box {
+		width: 710rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 1px 3px 0px rgba(9, 2, 4, 0.1);
+		border-radius: 10px;
+		padding-top: 12rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		padding-bottom: 15rpx;
+		margin-top: 20rpx;
+	}
+
+	.item-title {
+
+
+
+		font-size: 30rpx;
+		margin-top: 12rpx;
+		color: #010101;
+	}
+
+	.item-line {
+		display: flex;
+		height: 48rpx;
+		margin-top: 20rpx;
+
+	}
+
+	.item-line2 {
+
+		height: 48rpx;
+		margin-top: 20rpx;
+	}
+
+	.subtitle {
+		color: #E5880E;
+	}
+
+	.item-name {
+		margin-top: 5rpx;
+		font-size: 29rpx;
+		color: #666666;
+	}
+
+	.item-name2 {
+		font-size: 29rpx;
+		color: #676D99;
+		height: 40rpx;
+		/* 这里假设两行的高度是80rpx */
+		overflow: hidden;
+		/* 超出部分隐藏 */
+		text-overflow: ellipsis;
+		/* 超出部分显示省略号 */
+		display: -webkit-box;
+		/* 使用Webkit的行盒模型 */
+		-webkit-line-clamp: 1;
+		/* 限制最多显示2行 */
+		-webkit-box-orient: vertical;
+		/* 垂直排列 */
+
+	}
+
+
+	.item-name3 {
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #FF4500;
+	}
+
+	.item-name31 {
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #2E8B57;
+	}
+
+	.item-content {
+		color: #1497EF;
+		font-size: 30rpx;
+	}
+
+	.btn-box {
+		display: flex;
+	}
+
+	.line-zs {
+		width: 2rpx;
+		height: 30rpx;
+		background: #36A7F3;
+	}
+
+	.edit-botton {
+		width: 100rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		color: #fff;
+		font-size: 28rpx;
+		margin-right: 20rpx;
+		border-radius: 10rpx;
+		background: #5A9EE9;
+		text-align: center;
+	}
+
+	.del-botton {
+		width: 100rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		color: #fff;
+		font-size: 28rpx;
+		margin-right: 20rpx;
+		border-radius: 10rpx;
+		background: #F27C85;
+		text-align: center;
+	}
+
+	.color-white {
+		color: #808080;
+		font-size: 40rpx;
+		line-height: 60rpx;
+	}
+
+	.search-box {
+
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+		padding-top: 20rpx;
+		margin-top: 20rpx;
+		width: 100%;
+		border-radius: 25rpx;
+		border-radius: 25rpx;
+		background: #fff;
+		box-shadow: 0px 8px 16px 2px rgba(101, 101, 101, 0.2);
+		padding-bottom: 30rpx;
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.search-box1 {
+		display: flex;
+	}
+
+
+
+	.input-box {
+		background: #fff;
+		height: 65rpx;
+		width: 640rpx;
+		display: flex;
+		align-items: center;
+		border-radius: 30rpx;
+		padding-left: 30rpx;
+		margin-right: 20rpx;
+	}
+
+	.input-boxinput {
+		height: 75rpx;
+		font-size: 15rpx;
+	}
+
+
+
+	.choose-box {
+		background: #fff;
+		width: 325rpx;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-right: 20rpx;
+		border: 1rpx solid #808080;
+	}
+
+	.choose-box2 {
+		background: #fff;
+		width: 100%;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		padding-left: 29rpx;
+		align-items: center;
+		border: 1rpx solid #808080;
+	}
+
+	.choose-box3 {
+		display: flex;
+	}
+
+	.choose-boxp {
+		font-size: 32rpx;
+		width: 80rpx;
+	}
+
+	.fixed-bottom-right {
+		padding: 20rpx;
+		position: fixed;
+		bottom: 20px;
+		/* 距离底部的距离 */
+		right: 20px;
+		/* 距离右侧的距离 */
+	}
+
+	.tabs {
+		display: flex;
+		justify-content: space-around;
+		margin-bottom: 10px;
+	}
+
+	.tab-item {
+		padding: 10px 10px;
+		cursor: pointer;
+		transition: all 0.3s;
+	}
+
+	.tab-item.active {
+		color: #66b1ff;
+		border-bottom: 2px solid #66b1ff;
+	}
+
+	.tab-content {
+		padding: 20px;
+	}
+
+	.tab-item-content {
+		display: none;
+	}
+
+	.tab-item-content.v-if {
+		display: block;
+	}
+
+
+	.custom-header {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 10px;
+		width: 100%;
+	}
+
+	.is-back {
+		position: relative;
+	}
+
+	.back-container {
+		position: absolute;
+		left: 10px;
+		cursor: pointer;
+	}
+
+	.back-text {
+		color: white;
+		/* 返回按钮文本颜色 */
+	}
+
+	/* 背景颜色 */
+	.bg-blue {
+		background-color: #4285f4;
+		/* 假设这是一个蓝色背景 */
+	}
+
+	.content-container {
+		flex: 1;
+		text-align: center;
+	}
+
+	.content-text {
+		color: white;
+		/* 标题文本颜色 */
+		font-weight: bold;
+	}
+</style>

+ 52 - 3
jp-mobile/pages/progress/progressStatistics.vue

@@ -1,5 +1,13 @@
 <template>
 	<view style="background-color: #fff;height: 100vh;">
+		<view :class="['custom-header', { 'is-back': isBack }, bgColor]">
+			<view class="back-container" @click="handleBack">
+			  <view class="back-text">返回</view>
+			</view>
+			<view class="content-container">
+			  
+			</view>
+		  </view>
 		<uni-datetime-picker v-model="range" v-show="activeIndex == 0" type="daterange" @change="maskClick" />
 		<uni-datetime-picker v-model="year" v-show="activeIndex == 1" type="daterange" @change="maskClick" />
 		<view class="alarmList">
@@ -12,7 +20,7 @@
 			<view class="progress_list">
 				<uni-row :gutter="5">
 					<uni-col :span="12">
-						<view>
+						<view @click="goInfo(1)">
 							<uni-card margin="5px" shadow="0px 0px 3px 1px #36A7F3">
 								<view class="progress_section_1"></view><text>未办结问题数</text>
 								<view><text class="progress_num">{{unfinish}}</text>个</view>
@@ -22,7 +30,7 @@
 						</view>
 					</uni-col>
 					<uni-col :span="12">
-						<view>
+						<view @click="goInfo(2)">
 							<uni-card margin="5px" shadow="0px 0px 3px 1px #36A7F3">
 								<view class="progress_section_2"></view><text>办结问题数</text>
 								<view><text class="progress_num">{{finish}}</text>个</view>
@@ -43,6 +51,8 @@
 	export default {
 		data() {
 			return {
+				isBack: true, // 是否显示返回按钮
+				bgColor: 'bg-blue', // 背景颜色
 				range: ['2021-02-1', '2021-3-28'],
 				year:['',''],
 				datetimerange: [],
@@ -112,13 +122,52 @@
 			},
 			maskClick(e){
 				this.getData(e[0],e[1]);
-			}
+			},
+			 goInfo(e){
+				uni.navigateTo({
+					url: `/pages/progress/ProgressQuestionList?w=${e}`
+				})
+			 }
 			
 		}
 	}
 </script>
 
 <style>
+	.custom-header {
+	  display: flex;
+	  align-items: center;
+	  justify-content: center;
+	  padding: 10px;
+	  width: 100%;
+	  height: 40px;
+	}
+	
+	.is-back {
+	  position: relative;
+	}
+	
+	.back-container {
+	  position: absolute;
+	  left: 10px;
+	  cursor: pointer;
+	}
+	
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
 	.alarmList {
 		font-size: 14px;
 		height: 100%;

+ 43 - 0
jp-mobile/uni_modules/uni-data-select/changelog.md

@@ -0,0 +1,43 @@
+## 1.0.10(2025-04-14)
+- 修复 清除按钮不展示问题
+## 1.0.9(2025-03-26)
+- 优化 默认背景为白色与整体组件保持风格统一
+## 1.0.8(2024-03-28)
+- 修复 在vue2下:style动态绑定导致编译失败的bug
+## 1.0.7(2024-01-20)
+- 修复 长文本回显超过容器的bug,超过容器部分显示省略号
+## 1.0.6(2023-04-12)
+- 修复 微信小程序点击时会改变背景颜色的 bug
+## 1.0.5(2023-02-03)
+- 修复 禁用时会显示清空按钮
+## 1.0.4(2023-02-02)
+- 优化 查询条件短期内多次变更只查询最后一次变更后的结果
+- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue
+## 1.0.3(2023-01-16)
+- 修复 不关联服务空间报错的问题
+## 1.0.2(2023-01-14)
+- 新增  属性 `format` 可用于格式化显示选项内容
+## 1.0.1(2022-12-06)
+- 修复  当where变化时,数据不会自动更新的问题
+## 0.1.9(2022-09-05)
+- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框
+## 0.1.8(2022-08-29)
+- 修复 点击的位置不准确
+## 0.1.7(2022-08-12)
+- 新增 支持 disabled 属性
+## 0.1.6(2022-07-06)
+- 修复 pc端宽度异常的bug
+## 0.1.5
+- 修复 pc端宽度异常的bug
+## 0.1.4(2022-07-05)
+- 优化 显示样式
+## 0.1.3(2022-06-02)
+- 修复 localdata 赋值不生效的 bug
+- 新增 支持  uni.scss 修改颜色
+- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用)
+## 0.1.2(2022-05-08)
+- 修复 当 value 为 0 时选择不生效的 bug
+## 0.1.1(2022-05-07)
+- 新增 记住上次的选项(仅 collection 存在时有效)
+## 0.1.0(2022-04-22)
+- 初始化

+ 562 - 0
jp-mobile/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue

@@ -0,0 +1,562 @@
+<template>
+	<view class="uni-stat__select">
+		<span v-if="label" class="uni-label-text hide-on-phone">{{label + ':'}}</span>
+		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
+			<view class="uni-select" :class="{'uni-select--disabled':disabled}">
+				<view class="uni-select__input-box" @click="toggleSelector">
+					<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
+					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
+					<view key="clear-button" v-if="current && clear && !disabled" @click.stop="clearVal">
+						<uni-icons type="clear" color="#c0c4cc" size="24" />
+					</view>
+					<view key="arrow-button" v-else>
+						<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
+					</view>
+				</view>
+				<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
+				<view class="uni-select__selector" :style="getOffsetByPlacement" v-if="showSelector">
+					<view :class="placement=='bottom'?'uni-popper__arrow_bottom':'uni-popper__arrow_top'"></view>
+					<scroll-view scroll-y="true" class="uni-select__selector-scroll">
+						<view class="uni-select__selector-empty" v-if="mixinDatacomResData.length === 0">
+							<text>{{emptyTips}}</text>
+						</view>
+						<view v-else class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData" :key="index"
+							@click="change(item)">
+							<text :class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * DataChecklist 数据选择器
+	 * @description 通过数据渲染的下拉框组件
+	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
+	 * @property {String} value 默认值
+	 * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
+	 * @property {Boolean} clear 是否可以清空已选项
+	 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
+	 * @property {String} label 左侧标题
+	 * @property {String} placeholder 输入框的提示文字
+	 * @property {Boolean} disabled 是否禁用
+	 * @property {String} placement 弹出位置
+	 * 	@value top   		顶部弹出
+	 * 	@value bottom		底部弹出(default)
+	 * @event {Function} change  选中发生变化触发
+	 */
+
+	export default {
+		name: "uni-data-select",
+		mixins: [uniCloud.mixinDatacom || {}],
+		props: {
+			localdata: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '请选择'
+			},
+			emptyTips: {
+				type: String,
+				default: '无选项'
+			},
+			clear: {
+				type: Boolean,
+				default: true
+			},
+			defItem: {
+				type: Number,
+				default: 0
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
+			format: {
+				type: String,
+				default: ''
+			},
+			placement: {
+				type: String,
+				default: 'bottom'
+			}
+		},
+		data() {
+			return {
+				showSelector: false,
+				current: '',
+				mixinDatacomResData: [],
+				apps: [],
+				channels: [],
+				cacheKey: "uni-data-select-lastSelectedValue",
+			};
+		},
+		created() {
+			this.debounceGet = this.debounce(() => {
+				this.query();
+			}, 300);
+			if (this.collection && !this.localdata.length) {
+				this.debounceGet();
+			}
+		},
+		computed: {
+			typePlaceholder() {
+				const text = {
+					'opendb-stat-app-versions': '版本',
+					'opendb-app-channels': '渠道',
+					'opendb-app-list': '应用'
+				}
+				const common = this.placeholder
+				const placeholder = text[this.collection]
+				return placeholder ?
+					common + placeholder :
+					common
+			},
+			valueCom() {
+				// #ifdef VUE3
+				return this.modelValue;
+				// #endif
+				// #ifndef VUE3
+				return this.value;
+				// #endif
+			},
+			textShow() {
+				// 长文本显示
+				let text = this.current;
+				return text;
+			},
+			getOffsetByPlacement() {
+				switch (this.placement) {
+					case 'top':
+						return "bottom:calc(100% + 12px);";
+					case 'bottom':
+						return "top:calc(100% + 12px);";
+				}
+			}
+		},
+
+		watch: {
+			localdata: {
+				immediate: true,
+				handler(val, old) {
+					if (Array.isArray(val) && old !== val) {
+						this.mixinDatacomResData = val
+					}
+				}
+			},
+			valueCom(val, old) {
+				this.initDefVal()
+			},
+			mixinDatacomResData: {
+				immediate: true,
+				handler(val) {
+					if (val.length) {
+						this.initDefVal()
+					}
+				}
+			},
+
+		},
+		methods: {
+			debounce(fn, time = 100) {
+				let timer = null
+				return function(...args) {
+					if (timer) clearTimeout(timer)
+					timer = setTimeout(() => {
+						fn.apply(this, args)
+					}, time)
+				}
+			},
+			// 执行数据库查询
+			query() {
+				this.mixinDatacomEasyGet();
+			},
+			// 监听查询条件变更事件
+			onMixinDatacomPropsChange() {
+				if (this.collection) {
+					this.debounceGet();
+				}
+			},
+			initDefVal() {
+				let defValue = ''
+				if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
+					defValue = this.valueCom
+				} else {
+					let strogeValue
+					if (this.collection) {
+						strogeValue = this.getCache()
+					}
+					if (strogeValue || strogeValue === 0) {
+						defValue = strogeValue
+					} else {
+						let defItem = ''
+						if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
+							defItem = this.mixinDatacomResData[this.defItem - 1].value
+						}
+						defValue = defItem
+					}
+					if (defValue || defValue === 0) {
+						this.emit(defValue)
+					}
+				}
+				const def = this.mixinDatacomResData.find(item => item.value === defValue)
+				this.current = def ? this.formatItemName(def) : ''
+			},
+
+			/**
+			 * @param {[String, Number]} value
+			 * 判断用户给的 value 是否同时为禁用状态
+			 */
+			isDisabled(value) {
+				let isDisabled = false;
+
+				this.mixinDatacomResData.forEach(item => {
+					if (item.value === value) {
+						isDisabled = item.disable
+					}
+				})
+
+				return isDisabled;
+			},
+
+			clearVal() {
+				this.emit('')
+				this.current = ''
+				if (this.collection) {
+					this.removeCache()
+				}
+			},
+			change(item) {
+				if (!item.disable) {
+					this.showSelector = false
+					this.current = this.formatItemName(item)
+					this.emit(item.value)
+				}
+			},
+			emit(val) {
+				this.$emit('input', val)
+				this.$emit('update:modelValue', val)
+				this.$emit('change', val)
+				if (this.collection) {
+					this.setCache(val);
+				}
+			},
+			toggleSelector() {
+				if (this.disabled) {
+					return
+				}
+
+				this.showSelector = !this.showSelector
+			},
+			formatItemName(item) {
+				let {
+					text,
+					value,
+					channel_code
+				} = item
+				channel_code = channel_code ? `(${channel_code})` : ''
+
+				if (this.format) {
+					// 格式化输出
+					let str = "";
+					str = this.format;
+					for (let key in item) {
+						str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
+					}
+					return str;
+				} else {
+					return this.collection.indexOf('app-list') > 0 ?
+						`${text}(${value})` :
+						(
+							text ?
+							text :
+							`未命名${channel_code}`
+						)
+				}
+			},
+			// 获取当前加载的数据
+			getLoadData() {
+				return this.mixinDatacomResData;
+			},
+			// 获取当前缓存key
+			getCurrentCacheKey() {
+				return this.collection;
+			},
+			// 获取缓存
+			getCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				return cacheData[name];
+			},
+			// 设置缓存
+			setCache(value, name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				cacheData[name] = value;
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+			// 删除缓存
+			removeCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				delete cacheData[name];
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-base-color: #6a6a6a !default;
+	$uni-main-color: #333 !default;
+	$uni-secondary-color: #909399 !default;
+	$uni-border-3: #e5e5e5;
+
+	/* #ifndef APP-NVUE */
+	@media screen and (max-width: 500px) {
+		.hide-on-phone {
+			display: none;
+		}
+	}
+
+	/* #endif */
+	.uni-stat__select {
+		display: flex;
+		align-items: center;
+		// padding: 15px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+		width: 100%;
+		flex: 1;
+		box-sizing: border-box;
+	}
+
+	.uni-stat-box {
+		background-color: #fff;
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-stat__actived {
+		width: 100%;
+		flex: 1;
+		// outline: 1px solid #2979ff;
+	}
+
+	.uni-label-text {
+		font-size: 14px;
+		font-weight: bold;
+		color: $uni-base-color;
+		margin: auto 0;
+		margin-right: 5px;
+	}
+
+	.uni-select {
+		font-size: 14px;
+		border: 1px solid $uni-border-3;
+		box-sizing: border-box;
+		border-radius: 4px;
+		padding: 0 5px;
+		padding-left: 10px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		user-select: none;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		border-bottom: solid 1px $uni-border-3;
+		width: 100%;
+		flex: 1;
+		height: 35px;
+
+		&--disabled {
+			background-color: #f5f7fa;
+			cursor: not-allowed;
+		}
+	}
+
+	.uni-select__label {
+		font-size: 16px;
+		// line-height: 22px;
+		height: 35px;
+		padding-right: 10px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__input-box {
+		height: 35px;
+		width: 0px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-select__input {
+		flex: 1;
+		font-size: 14px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-select__input-plac {
+		font-size: 14px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 3;
+		padding: 4px 0;
+	}
+
+	.uni-select__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	/* #ifdef H5 */
+	@media (min-width: 768px) {
+		.uni-select__selector-scroll {
+			max-height: 600px;
+		}
+	}
+
+	/* #endif */
+
+	.uni-select__selector-empty,
+	.uni-select__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 35px;
+		font-size: 14px;
+		text-align: center;
+		/* border-bottom: solid 1px $uni-border-3; */
+		padding: 0px 10px;
+	}
+
+	.uni-select__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-select__selector-empty:last-child,
+	.uni-select__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	.uni-select__selector__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	/* picker 弹出层通用的指示小三角 */
+	.uni-popper__arrow_bottom,
+	.uni-popper__arrow_bottom::after,
+	.uni-popper__arrow_top,
+	.uni-popper__arrow_top::after,
+	{
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	border-color: transparent;
+	border-style: solid;
+	border-width: 6px;
+	}
+
+	.uni-popper__arrow_bottom {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow_bottom::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-popper__arrow_top {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		bottom: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-bottom-width: 0;
+		border-top-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow_top::after {
+		content: " ";
+		bottom: 1px;
+		margin-left: -6px;
+		border-bottom-width: 0;
+		border-top-color: #fff;
+	}
+
+
+	.uni-select__input-text {
+		// width: 280px;
+		width: 100%;
+		color: $uni-main-color;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		overflow: hidden;
+	}
+
+	.uni-select__input-placeholder {
+		color: $uni-base-color;
+		font-size: 12px;
+	}
+
+	.uni-select--mask {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		z-index: 2;
+	}
+</style>

+ 88 - 0
jp-mobile/uni_modules/uni-data-select/package.json

@@ -0,0 +1,88 @@
+{
+  "id": "uni-data-select",
+  "displayName": "uni-data-select 下拉框选择器",
+  "version": "1.0.10",
+  "description": "通过数据驱动的下拉框选择器",
+  "keywords": [
+    "uni-ui",
+    "select",
+    "uni-data-select",
+    "下拉框",
+    "下拉选"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-load-more"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+            "app-vue": "y",
+            "app-nvue": "n",
+            "app-harmony": "u",
+            "app-uvue": "u"
+        },
+        "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",
+          "阿里": "u",
+          "百度": "u",
+          "字节跳动": "u",
+        "QQ": "u",
+        "京东": "u"
+        },
+        "快应用": {
+          "华为": "u",
+          "联盟": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}

+ 8 - 0
jp-mobile/uni_modules/uni-data-select/readme.md

@@ -0,0 +1,8 @@
+## DataSelect 下拉框选择器
+> **组件名:uni-data-select**
+> 代码块: `uDataSelect`
+
+当选项过多时,使用下拉菜单展示并选择内容
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839