Browse Source

大走访手机端

yin_yu820 5 months ago
parent
commit
3f6a65b162
52 changed files with 8215 additions and 68 deletions
  1. 24 0
      jp-mobile/api/auth/loginService.js
  2. 278 0
      jp-mobile/api/dzf/enterpriseVisit.js
  3. 1244 0
      jp-mobile/colorui/zcm-main.css
  4. 12 0
      jp-mobile/common/Global.js
  5. 69 0
      jp-mobile/common/store.js
  6. 295 0
      jp-mobile/common/util2.js
  7. 92 0
      jp-mobile/components/jp-picker2/jp-picker2.vue
  8. 11 4
      jp-mobile/package-lock.json
  9. 2 1
      jp-mobile/package.json
  10. 28 1
      jp-mobile/pages.json
  11. 96 9
      jp-mobile/pages/buildList/buildList.vue
  12. 934 0
      jp-mobile/pages/buildList/buildList2.vue
  13. 841 0
      jp-mobile/pages/buildList/buildList3.vue
  14. 14 3
      jp-mobile/pages/comEdit/comEdit.vue
  15. 14 3
      jp-mobile/pages/comInfo/comInfo.vue
  16. 71 4
      jp-mobile/pages/comList/comList.vue
  17. 52 0
      jp-mobile/pages/dzf/components/cadresItem.vue
  18. 22 0
      jp-mobile/pages/dzf/components/commonButton/index.vue
  19. 117 0
      jp-mobile/pages/dzf/components/enterpriseInfoItem.vue
  20. 497 0
      jp-mobile/pages/dzf/components/enterpriseSituateItem.vue
  21. 136 0
      jp-mobile/pages/dzf/components/enterpriseVisitorItem.vue
  22. 34 0
      jp-mobile/pages/dzf/components/gapsColumn.js
  23. 39 0
      jp-mobile/pages/dzf/components/interviewItem.vue
  24. 40 0
      jp-mobile/pages/dzf/components/manageItem.vue
  25. 242 0
      jp-mobile/pages/dzf/components/problemAppealItem.vue
  26. 149 0
      jp-mobile/pages/dzf/components/problemHandleItem.vue
  27. 45 0
      jp-mobile/pages/dzf/components/processProgress.vue
  28. 391 0
      jp-mobile/pages/dzf/components/questionHandleItem.vue
  29. 40 0
      jp-mobile/pages/dzf/components/questionItem.vue
  30. 69 0
      jp-mobile/pages/dzf/components/visitorItem.vue
  31. 27 0
      jp-mobile/pages/dzf/questionDetail.vue
  32. 1006 0
      jp-mobile/pages/index/Tabindex.vue
  33. 52 19
      jp-mobile/pages/index/index.vue
  34. 596 0
      jp-mobile/pages/policy/policyInfo.vue
  35. 578 0
      jp-mobile/pages/policy/policyList.vue
  36. 9 9
      jp-mobile/pages/product/productAdd.vue
  37. 49 15
      jp-mobile/pages/product/productInfo.vue
  38. BIN
      jp-mobile/static/img/cd1.png
  39. BIN
      jp-mobile/static/img/cd2.png
  40. BIN
      jp-mobile/static/img/cd3.png
  41. BIN
      jp-mobile/static/img/dcl.png
  42. BIN
      jp-mobile/static/img/dzfkb.png
  43. BIN
      jp-mobile/static/img/gxdj.png
  44. BIN
      jp-mobile/static/img/icon8.png
  45. BIN
      jp-mobile/static/img/jyqk.png
  46. BIN
      jp-mobile/static/img/laba.png
  47. BIN
      jp-mobile/static/img/qyqkMessage.png
  48. BIN
      jp-mobile/static/img/visitBannar.png
  49. BIN
      jp-mobile/static/img/workBenchBannar.jpg
  50. BIN
      jp-mobile/static/img/workBenchBannar.png
  51. BIN
      jp-mobile/static/img/wtfk.png
  52. BIN
      jp-mobile/static/img/wtfkMessage.png

+ 24 - 0
jp-mobile/api/auth/loginService.js

@@ -22,6 +22,22 @@ export default {
 		})
 	},
 	
+	policyList: function (params) {
+	    return request({
+	        url: '/enterpriseelectricity/enterpriseElectricity/list',
+	        method: 'get',
+	        params: params
+	    })
+	},
+	
+	policyInfo: function (params) {
+	    return request({
+	        url: '/enterpriseelectricity/enterpriseElectricity/queryById',
+	        method: 'get',
+	        params: params
+	    })
+	},
+	
 	InfoStatistics: function (params) {
 	    return request({
 	        url: '/dp/dp/InfoStatistics',
@@ -76,6 +92,14 @@ export default {
 			params: params
 		})
 	},
+	
+	Loginlist: function(params) {
+		return request({
+			url: '/enterpriseinfo/enterpriseInfo/Loginlist',
+			method: 'get',
+			params: params
+		})
+	},
 
 	// /parkmanagement/parkManagement/list
 	getAreaList: function(params) {

+ 278 - 0
jp-mobile/api/dzf/enterpriseVisit.js

@@ -0,0 +1,278 @@
+import request from "../../common/request"
+
+export default {
+	
+	// 查询我提交的问题反馈单
+	myQuestionFeedbackList: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/getMyQuestionFeedbackList',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 查询我提交的企业经营单
+	myEnterpriseOpeList: function(params) {
+		return request({
+			url:  '/api/chain/enterpriseOperation/getMyEnterpriseOpeList',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 待处理数据统计
+	myDealingCount: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/myDealingCount',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 新建问题反馈单
+	createQuestionFeedback: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/createQuestionFeedback',
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	// 处理问题单
+	dealQuestionFeedback: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/dealQuestionFeedback',
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	
+	// 保存问题明细
+	saveQuestProcess: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/saveQuestProcess',
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	
+	// 查询待处理的问题反馈单
+	getMyDealingQuestionFeedback: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/getMyDealingQuestionFeedback',
+			method: 'GET', // method 可以不传,默认get
+			data
+		})
+	},
+	// 查询是否存在草稿状态的问题单
+	getMyQuestionFeedback: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/getMyQuestionFeedback',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 查询当前登录用户的角色类型
+	getMyRole: function(params) {
+		return request({
+			url:  '/api/chain/questionFeedback/getMyRole',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 根据问题单id查询问题单详情
+	getQuestionFeedbackDetail(id) {
+		return request({
+			url:  `/api/chain/questionFeedback/getQuestionFeedbackDetail/${id}`,
+			method: 'GET' // method 可以不传,默认get
+		})
+	},
+	
+	assignEditFlag(id) {
+		return request({
+			url:  `/api/chain/questionFeedback/assignEditFlag/${id}`,
+			method: 'GET' // method 可以不传,默认get
+		})
+	},
+	
+	// 查询待处理的企业经营单
+	getMyDealingEnterpriseOpe: function(params) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/getMyDealingEnterpriseOpe`,
+			method: 'GET', // method 可以不传,默认get
+			data
+		})
+	},
+	// 处理企业经营单
+	dealEnterpriseOpe: function(params) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/dealEnterpriseOpe`,
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	// 待评价的问题列表
+	evaluateList: function(params) {
+		return request({
+			url:  `/api/chain/questionEvaluate/evaluateList`,
+			method: 'GET', // method 可以不传,默认get
+			data
+		})
+	},
+	// 创建问题评价记录
+	evaluateCreate: function(params) {
+		return request({
+			url:  `/api/chain/questionEvaluate/create`,
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	// 绑定企业
+	bindEnterprise: function(params) {
+		return request({
+			url:  '/api/chain/enterpriseCadreRel/bindEnterprise',
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	// 批量查询企业和挂钩干部
+	fetchAllEnterpriseCadre: function(params) {
+		return request({
+			url:  '/api/chain/enterpriseCadreRel/fetchAllEnterpriseCadre',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 新增/修改企业经营情况
+	enterpriseOperationModify: function(params) {
+		return request({
+			url:  '/api/chain/enterpriseOperation/modify',
+			method: 'POST', // method 可以不传,默认get
+			data
+		})
+	},
+	// 获取企业经营情况详情
+	enterpriseOperationDetail(id) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/detail/${id}`,
+			method: 'GET' // method 可以不传,默认get
+		})
+	},
+	// 获取绑定干部下的企业列表
+	fetchOwnManagerEnterprise: function(params) {
+		return request({
+			url:  '/api/chain/enterpriseCadreRel/fetchOwnManagerEnterprise',
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 查询是否存在草稿状态的问题单
+	enterpriseOperationStatus: function(params) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/getDraft`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 问题反馈、经营情况操作记录相关接口
+	recordCreate: function(params) {
+		return request({
+			url:  `/api/chain/questionOpeRecord/create`,
+			method: 'POST', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 问题反馈/经营情况处理结果消息统计
+	countNotice: function(params) {
+		return request({
+			url:  `/api/chain/questionResultNotice/countNotice`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	// 问题反馈/经营情况处理结果消息列表
+	noticeList: function(params) {
+		return request({
+			url:  `/api/chain/questionResultNotice/list`,
+			method: 'GET', // method 可以不传,默认get
+			data
+		})
+	},
+	// 问题反馈/经营情况处理结果消息列表
+	noticeRead: function(params) {
+		return request({
+			url:  `/api/chain/questionResultNotice/read`,
+			method: 'GET', // method 可以不传,默认get
+			data
+		})
+	},
+	// 字典项接口
+	dict: function(params) {
+		return request({
+			url:  `/api/system/DictionaryData/getListByTypeCode`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+			
+		})
+	},
+	
+	
+	//看板接口
+	//看板统计接口
+	count: function(params) {
+		return request({
+			url:  `/api/chain/lookBoard/count`,
+			method: 'POST', // method 可以不传,默认get
+			params: params
+		})
+	},
+	//看板饼图接口
+	viewQuestionPie: function(params) {
+		return request({
+			url:  `/api/chain/questionFeedback/viewQuestionPie`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+		})
+	},
+	
+	//走访明细接口
+	viewDetailByArea: function(params) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/viewDetailByArea`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+		})
+	},
+	
+	//走访记录
+	pageViewDate: function(params) {
+		return request({
+			url:  `/api/chain/enterpriseOperation/pageViewDate`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+		})
+	},
+	
+	//问题反馈-看板
+	pageQuestions: function(params) {
+		return request({
+			url:  `/api/chain/questionFeedback/pageQuestions`,
+			method: 'GET', // method 可以不传,默认get
+			params: params
+		})
+	},
+	
+
+
+}
+
+
+
+
+

+ 1244 - 0
jp-mobile/colorui/zcm-main.css

@@ -0,0 +1,1244 @@
+/* 防止图片闪一下 */
+image {
+	will-change: transform
+}
+
+/* scroll-view */
+.scroll-row {
+	width: 100%;
+	white-space: nowrap;
+	line-height: 50rpx;
+}
+
+.scroll-row-item {
+	display: inline-block !important;
+}
+
+body {}
+
+/* 阴影 */
+.shadow-sm {
+	box-shadow: #e0e6ee 1px 1px 1px 1px !important;
+}
+
+.shadow {
+	box-shadow: 0 8rpx 16rpx rgba(114, 130, 138, 0.2) !important;
+}
+
+.shadow-lg {
+	box-shadow: 0 16rpx 48rpx rgba(114, 130, 138, 0.2) !important;
+}
+
+/* 定位 */
+.position-absolute {
+	position: absolute;
+}
+
+.position-fixed {
+	position: fixed;
+}
+
+.position-relative {
+	position: relative;
+}
+
+.left-0 {
+	left: 0;
+}
+
+.top-0 {
+	top: 0;
+}
+
+.bottom-0 {
+	bottom: 0;
+}
+
+.right-0 {
+	right: 0;
+}
+
+/* 宽高 */
+.w-100 {
+	width: 100%;
+}
+
+.w-50 {
+	width: 50%;
+}
+
+.w-25 {
+	width: 25%;
+}
+
+.w-33 {
+	width: 33.33%;
+}
+
+.w-70 {
+	width: 70%;
+}
+
+.w-80 {
+	width: 80%;
+}
+
+.w-90 {
+	width: 90%;
+}
+
+.h-100 {
+	height: 1250rpx;
+}
+
+.h-50 {
+	height: 625rpx;
+}
+
+/* 字体 */
+.font-sssm {
+	font-size: 18rpx;
+}
+
+.font-ssm {
+	font-size: 20rpx;
+}
+
+.font-sm {
+	font-size: 22rpx;
+}
+
+.font {
+	font-size: 24rpx;
+}
+
+.font-md {
+	font-size: 30rpx;
+}
+
+.font-lg {
+	font-size: 40rpx;
+}
+
+.font-big {
+	font-size: 60rpx;
+}
+
+.font-weight {
+	font-weight: bold !important;
+}
+
+.font-weight-100 {
+	font-weight: 100 !important;
+}
+
+.line-h0 {
+	line-height: 0 !important;
+}
+
+.line-h {
+	line-height: 1 !important;
+}
+
+.line-h-sm {
+	line-height: 1.2 !important;
+}
+
+.line-h-md {
+	line-height: 1.5 !important;
+}
+
+.line-h-lg {
+	line-height: 2 !important;
+}
+
+.line-h-big {
+	line-height: 3 !important;
+}
+
+.line-through {
+	text-decoration: line-through;
+}
+
+.text-center {
+	text-align: center;
+}
+
+.text-left {
+	text-align: left;
+}
+
+.text-right {
+	text-align: right;
+}
+
+.row {
+	box-sizing: border-box !important;
+	display: flex !important;
+	flex-direction: row !important;
+	flex-wrap: wrap;
+}
+
+[class*='col-'],
+[class*='span-'],
+[class*='span24-'] {
+	min-height: 1px;
+	box-sizing: border-box !important;
+}
+
+/* 栅栏一 */
+.col-1 {
+	width: 62.5rpx;
+}
+
+.col-2 {
+	width: 125rpx;
+}
+
+.col-3 {
+	width: 187.5rpx;
+}
+
+.col-4 {
+	width: 250rpx;
+}
+
+.col-5 {
+	width: 312.5rpx;
+}
+
+.col-6 {
+	width: 375rpx;
+}
+
+.col-7 {
+	width: 437.5rpx;
+}
+
+.col-8 {
+	width: 500rpx;
+}
+
+.col-9 {
+	width: 562.5rpx;
+}
+
+.col-10 {
+	width: 625rpx;
+}
+
+.col-11 {
+	width: 687.5rpx;
+}
+
+.col-12 {
+	width: 750rpx;
+}
+
+/* 栅栏二 */
+.span-1 {
+	width: 5%;
+}
+
+.span-2 {
+	width: 10%;
+}
+
+.span-3 {
+	width: 15%;
+}
+
+.span-4 {
+	width: 20%;
+}
+
+.span-5 {
+	width: 25%;
+}
+
+.span-6 {
+	width: 30%;
+}
+
+.span-7 {
+	width: 35%;
+}
+
+.span-8 {
+	width: 40%;
+}
+
+.span-9 {
+	width: 45%;
+}
+
+.span-10 {
+	width: 50%;
+}
+
+.span-11 {
+	width: 55%;
+}
+
+.span-12 {
+	width: 60%;
+}
+
+.span-13 {
+	width: 65%;
+}
+
+.span-14 {
+	width: 70%;
+}
+
+.span-15 {
+	width: 75%;
+}
+
+.span-16 {
+	width: 80%;
+}
+
+.span-17 {
+	width: 85%;
+}
+
+.span-18 {
+	width: 90%;
+}
+
+.span-19 {
+	width: 95%;
+}
+
+.span-20 {
+	width: 100%;
+}
+
+/* 栅栏三 */
+.span24-1 {
+	width: 4.17%;
+}
+
+.span24-2 {
+	width: 8.33%;
+}
+
+.span24-3 {
+	width: 12.5%;
+}
+
+.span24-4 {
+	width: 16.67%;
+}
+
+.span24-5 {
+	width: 20.83%;
+}
+
+.span24-6 {
+	width: 25%;
+}
+
+.span24-7 {
+	width: 29.17%;
+}
+
+.span24-8 {
+	width: 33.33%;
+}
+
+.span24-9 {
+	width: 37.5%;
+}
+
+.span24-10 {
+	width: 41.67%;
+}
+
+.span24-11 {
+	width: 45.83%;
+}
+
+.span24-12 {
+	width: 50%;
+}
+
+.span24-13 {
+	width: 54.17%;
+}
+
+.span24-14 {
+	width: 58.33%;
+}
+
+.span24-15 {
+	width: 62.5%;
+}
+
+.span24-16 {
+	width: 66.67%;
+}
+
+.span24-17 {
+	width: 70.83%;
+}
+
+.span24-18 {
+	width: 75%;
+}
+
+.span24-19 {
+	width: 79.17%;
+}
+
+.span24-20 {
+	width: 83.33%;
+}
+
+.span24-21 {
+	width: 87.5%;
+}
+
+.span24-22 {
+	width: 91.67%;
+}
+
+.span24-23 {
+	width: 95.83%;
+}
+
+.span24-24 {
+	width: 100%;
+}
+
+
+/* flex布局 */
+.d-flex {
+	display: flex;
+	flex-direction: row !important;
+}
+
+.d-block {
+	display: block;
+}
+
+.d-inline-block {
+	display: inline-block;
+}
+
+.flex-1 {
+	flex: 1;
+}
+
+.flex-column {
+	flex-direction: column !important;
+}
+
+.flex-row {
+	flex-direction: row;
+}
+
+.flex-wrap {
+	flex-wrap: wrap;
+}
+
+.flex-nowrap {
+	flex-wrap: nowrap;
+}
+
+.flex-shrink {
+	flex-shrink: 0;
+}
+
+.j-start {
+	justify-content: flex-start;
+}
+
+.j-center {
+	justify-content: center !important;
+}
+
+.j-end {
+	justify-content: flex-end;
+}
+
+.j-sb {
+	justify-content: space-between;
+}
+
+.j-sa {
+	justify-content: space-around;
+}
+
+.a-center {
+	align-items: center !important;
+}
+
+.a-start {
+	align-items: flex-start;
+}
+
+.a-end {
+	align-items: flex-end;
+}
+
+.a-stretch {
+	align-items: stretch;
+}
+
+.a-self-start {
+	align-self: flex-start;
+}
+
+.a-self-auto {
+	align-self: auto;
+}
+
+.a-self-end {
+	align-self: flex-end;
+}
+
+.a-self-stretch {
+	align-self: stretch;
+}
+
+.a-self-baseline {
+	align-self: baseline;
+}
+
+/* Border */
+.border {
+	border-width: 1rpx;
+	border-style: solid;
+	border-color: rgba(153, 153, 153, 0.1);
+}
+
+.border-top {
+	border-top-width: 1rpx;
+	border-top-style: solid;
+	border-top-color: rgba(153, 153, 153, 0.1);
+}
+
+.border-right {
+	border-right-width: 1rpx;
+	border-right-style: solid;
+	border-right-color: rgba(153, 153, 153, 0.1);
+}
+
+.border-bottom {
+	border-bottom-width: 1rpx;
+	border-bottom-style: solid;
+	border-bottom-color: rgba(153, 153, 153, 0.1);
+}
+
+.border-left {
+	border-left-width: 1rpx;
+	border-left-style: solid;
+	border-left-color: rgba(153, 153, 153, 0.1);
+}
+
+.border-10 {
+	border-width: 20rpx;
+}
+
+.border-0 {
+	border-width: 0;
+}
+
+.border-top-0 {
+	border-top-width: 0;
+}
+
+.border-right-0 {
+	border-right-width: 0;
+}
+
+.border-bottom-0 {
+	border-bottom-width: 0;
+}
+
+.border-left-0 {
+	border-left-width: 0;
+}
+
+.border-primary {
+	border-color: #22C8DB !important
+}
+
+.border-secondary {
+	border-color: #D19D00 !important
+}
+
+.border-success {
+	border-color: #31CF94 !important
+}
+
+.border-danger {
+	border-color: #F35C49 !important
+}
+
+.border-warning {
+	border-color: #FAAD14 !important
+}
+
+.border-info {
+	border-color: #17a2b8 !important
+}
+
+.border-light {
+	border-color: #666666 !important
+}
+
+.border-light-opc {
+	border-color: rgba(153, 153, 153, 0.1) !important
+}
+
+.border-dark {
+	border-color: #000000 !important
+}
+
+.border-white {
+	border-color: #ffffff !important
+}
+
+.border-light-secondary {
+	border-color: #0895AA !important;
+}
+
+.rounded {
+	border-radius: 10rpx;
+}
+
+.rounded-circle {
+	border-radius: 100%;
+}
+
+.rounded-0 {
+	border-radius: 0;
+}
+
+.rounded16 {
+	border-radius: 16rpx;
+}
+
+.rounded8 {
+	border-radius: 8rpx;
+}
+
+/* color */
+.text-primary {
+	color: #333333 !important;
+}
+
+.text-secondary {
+	color: #666666 !important;
+}
+
+.text-success {
+	color: #31CF94 !important;
+}
+
+.text-danger {
+	color: #F35C49 !important;
+}
+
+.text-warning {
+	color: #227FB8 !important;
+}
+
+.text-info {
+	color: #999999 !important;
+}
+
+.text-light {
+	color: #666666 !important;
+}
+
+.text-dark {
+	color: #000000 !important;
+}
+
+.text-muted {
+	color: #757575 !important;
+}
+
+.text-light-muted {
+	color: #0895AA !important;
+}
+
+.text-white {
+	color: #ffffff !important;
+}
+
+.bg-primary {
+	background-color: #22C8DB !important;
+}
+
+.bg-secondary {
+	background-color: #D19D00 !important;
+}
+
+.bg-success {
+	background-color: #31CF94 !important;
+}
+
+.bg-danger {
+	background-color: #F35C49 !important;
+}
+
+.bg-warning {
+	background-color: #FAAD14 !important;
+}
+
+.bg-info {
+	background-color: #17a2b8 !important;
+}
+
+.bg-light {
+	background-color: orange !important;
+}
+
+.bg-dark {
+	background-color: #000000 !important;
+}
+
+.bg-white {
+	background-color: #ffffff !important;
+}
+
+.bg-light-secondary {
+	background-color: #F1F1F1 !important;
+}
+
+/* Spacing */
+.m-0 {
+	margin-left: 0;
+	margin-right: 0;
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+.m {
+	margin-left: 5rpx;
+	margin-right: 5rpx;
+	margin-top: 5rpx;
+	margin-bottom: 5rpx;
+}
+
+.m-1 {
+	margin-left: 10rpx;
+	margin-right: 10rpx;
+	margin-top: 10rpx;
+	margin-bottom: 10rpx;
+}
+
+.m-2 {
+	margin-left: 20rpx;
+	margin-right: 20rpx;
+	margin-top: 20rpx;
+	margin-bottom: 20rpx;
+}
+
+.m-3 {
+	margin-left: 30rpx;
+	margin-right: 30rpx;
+	margin-top: 30rpx;
+	margin-bottom: 30rpx;
+}
+
+.m-4 {
+	margin-left: 40rpx;
+	margin-right: 40rpx;
+	margin-top: 40rpx;
+	margin-bottom: 40rpx;
+}
+
+.m-5 {
+	margin-left: 50rpx;
+	margin-right: 50rpx;
+	margin-top: 50rpx;
+	margin-bottom: 50rpx;
+}
+
+.mx-0 {
+	margin-left: 0;
+	margin-right: 0;
+}
+
+.mx {
+	margin-left: 5rpx;
+	margin-right: 5rpx;
+}
+
+.mx-1 {
+	margin-left: 10rpx;
+	margin-right: 10rpx;
+}
+
+.mx-2 {
+	margin-left: 20rpx;
+	margin-right: 20rpx;
+}
+
+.mx-3 {
+	margin-left: 30rpx;
+	margin-right: 30rpx;
+}
+
+.mx-4 {
+	margin-left: 40rpx;
+	margin-right: 40rpx;
+}
+
+.mx-5 {
+	margin-left: 50rpx;
+	margin-right: 50rpx;
+}
+
+.my-0 {
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+.my {
+	margin-top: 5rpx;
+	margin-bottom: 5rpx;
+}
+
+.my-1 {
+	margin-top: 10rpx;
+	margin-bottom: 10rpx;
+}
+
+.my-2 {
+	margin-top: 20rpx;
+	margin-bottom: 20rpx;
+}
+
+.my-3 {
+	margin-top: 30rpx;
+	margin-bottom: 30rpx;
+}
+
+.my-4 {
+	margin-top: 40rpx;
+	margin-bottom: 40rpx;
+}
+
+.my-5 {
+	margin-top: 50rpx;
+	margin-bottom: 50rpx;
+}
+
+.mt-0 {
+	margin-top: 0;
+}
+
+.mt {
+	margin-top: 5rpx;
+}
+
+.mt-auto {
+	margin-top: auto;
+}
+
+.mt-1 {
+	margin-top: 10rpx;
+}
+
+.mt-2 {
+	margin-top: 20rpx;
+}
+
+.mt-3 {
+	margin-top: 30rpx;
+}
+
+.mt-4 {
+	margin-top: 40rpx;
+}
+
+.mt-5 {
+	margin-top: 50rpx;
+}
+
+.mb-0 {
+	margin-bottom: 0;
+}
+
+.mb {
+	margin-bottom: 5rpx;
+}
+
+.mb-auto {
+	margin-bottom: auto;
+}
+
+.mb-1 {
+	margin-bottom: 10rpx;
+}
+
+.mb-2 {
+	margin-bottom: 20rpx;
+}
+
+.mb-3 {
+	margin-bottom: 30rpx;
+}
+
+.mb-4 {
+	margin-bottom: 40rpx;
+}
+
+.mb-5 {
+	margin-bottom: 50rpx;
+}
+
+.ml-0 {
+	margin-left: 0;
+}
+
+.ml {
+	margin-left: 5rpx;
+}
+
+.ml-auto {
+	margin-left: auto;
+}
+
+.ml-1 {
+	margin-left: 10rpx;
+}
+
+.ml-2 {
+	margin-left: 20rpx;
+}
+
+.ml-3 {
+	margin-left: 30rpx;
+}
+
+.ml-4 {
+	margin-left: 40rpx;
+}
+
+.ml-5 {
+	margin-left: 50rpx;
+}
+
+.mr-0 {
+	margin-right: 0;
+}
+
+.mr {
+	margin-right: 5rpx;
+}
+
+.mr-1 {
+	margin-right: 10rpx;
+}
+
+.mr-2 {
+	margin-right: 20rpx;
+}
+
+.mr-3 {
+	margin-right: 30rpx;
+}
+
+.mr-4 {
+	margin-right: 40rpx;
+}
+
+.mr-5 {
+	margin-right: 50rpx;
+}
+
+.p-0 {
+	padding-left: 0;
+	padding-right: 0;
+	padding-top: 0;
+	padding-bottom: 0;
+}
+
+.p {
+	padding-left: 5rpx;
+	padding-right: 5rpx;
+	padding-top: 5rpx;
+	padding-bottom: 5rpx;
+}
+
+.p-1 {
+	padding-left: 10rpx;
+	padding-right: 10rpx;
+	padding-top: 10rpx;
+	padding-bottom: 10rpx;
+}
+
+.p-2 {
+	padding-left: 20rpx;
+	padding-right: 20rpx;
+	padding-top: 20rpx;
+	padding-bottom: 20rpx;
+}
+
+.p-3 {
+	padding-left: 30rpx;
+	padding-right: 30rpx;
+	padding-top: 30rpx;
+	padding-bottom: 30rpx;
+}
+
+.p-4 {
+	padding-left: 40rpx;
+	padding-right: 40rpx;
+	padding-top: 40rpx;
+	padding-bottom: 40rpx;
+}
+
+.p-5 {
+	padding-left: 50rpx;
+	padding-right: 50rpx;
+	padding-top: 50rpx;
+	padding-bottom: 50rpx;
+}
+
+.px-0 {
+	padding-left: 0;
+	padding-right: 0;
+}
+
+.px {
+	padding-left: 5rpx;
+	padding-right: 5rpx;
+}
+
+.px-1 {
+	padding-left: 10rpx;
+	padding-right: 10rpx;
+}
+
+.px-2 {
+	padding-left: 20rpx;
+	padding-right: 20rpx;
+}
+
+.px-3 {
+	padding-left: 30rpx;
+	padding-right: 30rpx;
+}
+
+.px-4 {
+	padding-left: 40rpx;
+	padding-right: 40rpx;
+}
+
+.px-5 {
+	padding-left: 50rpx;
+	padding-right: 50rpx;
+}
+
+.py-0 {
+	padding-top: 0;
+	padding-bottom: 0;
+}
+
+.py {
+	padding-top: 5rpx;
+	padding-bottom: 5rpx;
+}
+
+.py-1 {
+	padding-top: 10rpx;
+	padding-bottom: 10rpx;
+}
+
+.py-2 {
+	padding-top: 20rpx;
+	padding-bottom: 20rpx;
+}
+
+.py-3 {
+	padding-top: 30rpx;
+	padding-bottom: 30rpx;
+}
+
+.py-4 {
+	padding-top: 40rpx;
+	padding-bottom: 40rpx;
+}
+
+.py-5 {
+	padding-top: 50rpx;
+	padding-bottom: 50rpx;
+}
+
+.pt-0 {
+	padding-top: 0;
+}
+
+.pt {
+	padding-top: 5rpx;
+}
+
+.pt-1 {
+	padding-top: 10rpx;
+}
+
+.pt-2 {
+	padding-top: 20rpx;
+}
+
+.pt-3 {
+	padding-top: 30rpx;
+}
+
+.pt-4 {
+	padding-top: 40rpx;
+}
+
+.pt-5 {
+	padding-top: 50rpx;
+}
+
+.pb-0 {
+	padding-bottom: 0;
+}
+
+.pb {
+	padding-bottom: 5rpx;
+}
+
+.pb-1 {
+	padding-bottom: 10rpx;
+}
+
+.pb-2 {
+	padding-bottom: 20rpx;
+}
+
+.pb-3 {
+	padding-bottom: 30rpx;
+}
+
+.pb-4 {
+	padding-bottom: 40rpx;
+}
+
+.pb-5 {
+	padding-bottom: 50rpx;
+}
+
+.pl-0 {
+	padding-left: 0;
+}
+
+.pl {
+	padding-left: 5rpx;
+}
+
+.pl-1 {
+	padding-left: 10rpx;
+}
+
+.pl-2 {
+	padding-left: 20rpx;
+}
+
+.pl-3 {
+	padding-left: 30rpx;
+}
+
+.pl-4 {
+	padding-left: 40rpx;
+}
+
+.pl-5 {
+	padding-left: 50rpx;
+}
+
+.pr-0 {
+	padding-right: 0;
+}
+
+.pr {
+	padding-right: 5rpx;
+}
+
+.pr-1 {
+	padding-right: 10rpx;
+}
+
+.pr-2 {
+	padding-right: 20rpx;
+}
+
+.pr-3 {
+	padding-right: 30rpx;
+}
+
+.pr-4 {
+	padding-right: 40rpx;
+}
+
+.pr-5 {
+	padding-right: 50rpx;
+}
+
+.mul-line {
+	//单行
+	display: -webkit-box; //将对象作为弹性伸缩盒子模型显示
+	-webkit-box-orient: vertical; //设置伸缩盒子对象的子元素的排列方式
+	-webkit-line-clamp: 1; //用来限制在一个块元素显示的文本的行数
+	overflow: hidden; //超出部分隐藏
+	text-overflow: ellipsis; // 不完全显示的末尾加上省略号
+	word-break: break-all; //兼容数字或英文不换行问题
+}
+
+.mul-line-2 {
+	//2行
+	display: -webkit-box; //将对象作为弹性伸缩盒子模型显示
+	-webkit-box-orient: vertical; //设置伸缩盒子对象的子元素的排列方式
+	-webkit-line-clamp: 2; //用来限制在一个块元素显示的文本的行数
+	overflow: hidden; //超出部分隐藏
+	text-overflow: ellipsis; // 不完全显示的末尾加上省略号
+	word-break: break-all; //兼容数字或英文不换行问题
+}
+
+.mul-line-3 {
+	//3行
+	display: -webkit-box; //将对象作为弹性伸缩盒子模型显示
+	-webkit-box-orient: vertical; //设置伸缩盒子对象的子元素的排列方式
+	-webkit-line-clamp: 3; //用来限制在一个块元素显示的文本的行数
+	overflow: hidden; //超出部分隐藏
+	text-overflow: ellipsis; // 不完全显示的末尾加上省略号
+	word-break: break-all; //兼容数字或英文不换行问题
+}
+
+.mul-line-4 {
+	//4行
+	display: -webkit-box; //将对象作为弹性伸缩盒子模型显示
+	-webkit-box-orient: vertical; //设置伸缩盒子对象的子元素的排列方式
+	-webkit-line-clamp: 4; //用来限制在一个块元素显示的文本的行数
+	overflow: hidden; //超出部分隐藏
+	text-overflow: ellipsis; // 不完全显示的末尾加上省略号
+	word-break: break-all; //兼容数字或英文不换行问题
+}
+
+.questionDesc .u-form-item__body__left {
+	align-items: baseline !important;
+}
+
+.selected-list {
+	padding: 10rpx 0 !important;
+}
+
+.placeholder {
+	color: rgb(192, 196, 204) !important;
+}
+
+iframe {
+	border-width: 0 !important;
+}

+ 12 - 0
jp-mobile/common/Global.js

@@ -0,0 +1,12 @@
+import BASE_URL from './config.js'
+class Global {
+	static baseUrl = BASE_URL;
+	static tokenKey =  "ZGSZ_Token"
+	static typeKey =  "ZGSZ_Type"
+	static userKey =  "ZGSZ_User"
+	static tokenHeader = 'Authorization'
+}
+
+export {
+	Global
+}

+ 69 - 0
jp-mobile/common/store.js

@@ -0,0 +1,69 @@
+import {Global} from "../common/Global.js";
+
+class Store {
+
+    static login = 'isLogin'
+
+    static save(key, value) {
+        uni.setStorageSync(key,value)
+    }
+	static saveUserInfo (value) {
+        uni.setStorageSync(Global.userKey,value);
+    }
+    static saveToken( value) {
+        this.setIsLogin(true)
+        uni.setStorageSync(Global.tokenKey,value)
+    }
+	static saveType( value) {
+	    // this.setIsLogin(true)
+	    uni.setStorageSync(Global.typeKey,value)
+	}
+	static removeType( value) {
+	    // this.setIsLogin(false)
+	    uni.removeStorageSync(Global.typeKey)
+	}
+	static removeUser( value) {
+	    // this.setIsLogin(false)
+	    uni.removeStorageSync(Global.userKey)
+	}
+	static removeToken( value) {
+	    // this.setIsLogin(false)
+	    uni.removeStorageSync(Global.tokenKey)
+	}
+	
+
+    static isLogin() {
+        return this.get(this.login)
+    }
+
+    static get(key) {
+        return  uni.getStorageSync(key)
+    }
+
+    static getToken() {
+        return this.get(Global.tokenKey)
+    }
+	
+	static getUser() {
+	    return this.get(Global.userKey)
+	}
+	
+	static getType() {
+	    return this.get(Global.typeKey)
+	}
+
+    static setIsLogin(isLogin) {
+        uni.$emit('isLogin',{ isLogin:isLogin })
+        Store.save(Store.login, isLogin)
+    }
+
+    static isExist (key) {
+        const value = this.get(key)
+        return value !== null && value !==undefined && value !==''
+    }
+
+}
+
+export {
+    Store
+}

+ 295 - 0
jp-mobile/common/util2.js

@@ -0,0 +1,295 @@
+/**函数防抖
+ * @param { function } func
+ * @param { number } wait 延迟执行毫秒数
+ * @param { boolean } immediate  true 表立即执行,false 表非立即执行
+ */
+function debounce(func, wait = 100, immediate = false) {
+	let timeout
+	return function() {
+		let context = this
+		let args = arguments
+
+		if (timeout) clearTimeout(timeout)
+		if (immediate) {
+			let callNow = !timeout
+			timeout = setTimeout(() => {
+				timeout = null
+			}, wait)
+			if (callNow) func.apply(context, args)
+		} else {
+			timeout = setTimeout(() => {
+				func.apply(context, args)
+			}, wait)
+		}
+	}
+}
+
+/**函数节流
+ * @param { function } func 函数
+ * @param { number } wait 延迟执行毫秒数
+ * @param { number } type 1 表时间戳版,2 表定时器版
+ */
+function throttle(func, wait = 100, type = 2) {
+	let previous, timeout
+	if (type === 1) {
+		previous = 0
+	} else if (type === 2) {
+		timeout = null
+	}
+	return function() {
+		let context = this
+		let args = arguments
+		if (type === 1) {
+			let now = Date.now()
+
+			if (now - previous > wait) {
+				func.apply(context, args)
+				previous = now
+			}
+		} else if (type === 2) {
+			if (!timeout) {
+				timeout = setTimeout(() => {
+					timeout = null
+					func.apply(context, args)
+				}, wait)
+			}
+		}
+	}
+}
+
+function forMatNum(num) {
+	return num < 10 ? '0' + num : num + '';
+}
+
+function initDays(year, month) {
+	let totalDays = new Date(year, month, 0).getDate();
+	let dates = [];
+	for (let d = 1; d <= totalDays; d++) {
+		dates.push(forMatNum(d));
+	};
+	return dates;
+}
+
+function initPicker(start, end, mode = "date", step) {
+	let initstartDate = new Date(start);
+	let endDate = new Date(end);
+	let startYear = initstartDate.getFullYear();
+	let startMonth = initstartDate.getMonth();
+	let endYear = endDate.getFullYear();
+	let years = [],
+		months = [],
+		days = [],
+		hours = [],
+		minutes = [],
+		seconds = [];
+	let totalDays = new Date(startYear, startMonth, 0).getDate();
+	for (let s = startYear; s <= endYear; s++) {
+		years.push(s + '');
+	};
+	for (let m = 1; m <= 12; m++) {
+		months.push(forMatNum(m));
+	};
+	for (let d = 1; d <= totalDays; d++) {
+		days.push(forMatNum(d));
+	}
+	for (let h = 0; h < 24; h++) {
+		hours.push(forMatNum(h));
+	}
+	for (let m = 0; m < 60; m += step * 1) {
+		minutes.push(forMatNum(m));
+	}
+	for (let s = 0; s < 60; s++) {
+		seconds.push(forMatNum(s));
+	}
+	switch (mode) {
+		case "date":
+			return {
+				years,
+				months,
+				days
+			}
+			break;
+		case "yearMonth":
+			return {
+				years,
+				months
+			}
+			break;
+		case "dateTime":
+			return {
+				years,
+				months,
+				days,
+				hours,
+				minutes,
+				seconds
+			}
+			break;
+		case "time":
+			return {
+				hours,
+				minutes,
+				seconds
+			}
+			break;
+	}
+}
+
+function getDate(type) {
+	const date = new Date();
+	let year = date.getFullYear();
+	if (type === 'start') {
+		year = year - 60;
+	} else if (type === 'end') {
+		year = year + 2;
+	}
+	return `${year}`;
+}
+
+function formatTime(time) {
+	if (typeof time !== 'number' || time < 0) {
+		return time
+	}
+
+	var hour = parseInt(time / 3600)
+	time = time % 3600
+	var minute = parseInt(time / 60)
+	time = time % 60
+	var second = time
+
+	return ([hour, minute, second]).map(function(n) {
+		n = n.toString()
+		return n[1] ? n : '0' + n
+	}).join(':')
+}
+
+function formatLocation(longitude, latitude) {
+	if (typeof longitude === 'string' && typeof latitude === 'string') {
+		longitude = parseFloat(longitude)
+		latitude = parseFloat(latitude)
+	}
+
+	longitude = longitude.toFixed(2)
+	latitude = latitude.toFixed(2)
+
+	return {
+		longitude: longitude.toString().split('.'),
+		latitude: latitude.toString().split('.')
+	}
+}
+var dateUtils = {
+	UNITS: {
+		'年': 31557600000,
+		'月': 2629800000,
+		'天': 86400000,
+		'小时': 3600000,
+		'分钟': 60000,
+		'秒': 1000
+	},
+	humanize: function(milliseconds) {
+		var humanize = '';
+		for (var key in this.UNITS) {
+			if (milliseconds >= this.UNITS[key]) {
+				humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
+				break;
+			}
+		}
+		return humanize || '刚刚';
+	},
+	format: function(dateStr) {
+		var date = this.parse(dateStr)
+		var diff = Date.now() - date.getTime();
+		if (diff < this.UNITS['天']) {
+			return this.humanize(diff);
+		}
+		var _format = function(number) {
+			return (number < 10 ? ('0' + number) : number);
+		};
+		return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDay()) + '-' +
+			_format(date.getHours()) + ':' + _format(date.getMinutes());
+	},
+	parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
+		var a = str.split(/[^0-9]/);
+		return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
+	}
+};
+
+function formatDate(value, fmt) {
+	let regPos = /^\d+(\.\d+)?$/;
+	if (regPos.test(value)) {
+		//如果是数字
+		let getDate = new Date(value);
+		let o = {
+			'M+': getDate.getMonth() + 1,
+			'd+': getDate.getDate(),
+			'h+': getDate.getHours(),
+			'm+': getDate.getMinutes(),
+			's+': getDate.getSeconds(),
+			'q+': Math.floor((getDate.getMonth() + 3) / 3),
+			'S': getDate.getMilliseconds()
+		};
+		if (/(y+)/.test(fmt)) {
+			fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))
+		}
+		for (let k in o) {
+			if (new RegExp('(' + k + ')').test(fmt)) {
+				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
+					.length)))
+			}
+		}
+		return fmt;
+	} else {
+		//TODO
+		value = value.trim();
+		return value.substr(0, fmt.length);
+	}
+}
+//获取当前的平台(终端类型 1 android 2 ios 3 h5 4 微信小程序 5 web)
+function getPlatform() {
+	//默认web
+	let platform = 5;
+	//#ifdef APP-PLUS || APP-NVUE
+	const system = uni.getSystemInfoSync();
+	if (system.platform === "ios") {
+		platform = 1;
+	} else {
+		platform = 2;
+	}
+	//#endif
+
+	//#ifdef H5
+	platform = 3;
+	//#endif
+
+	//#ifdef MP-WEIXIN
+	platform = 4;
+	//#endif
+	return platform;
+};
+
+//判断浏览器是否是微信浏览器
+function checkIsWechatBrowser() {
+	let platform = getPlatform();
+	if (platform === 3) {
+		return (
+			navigator.userAgent.toLowerCase().match(/MicroMessenger/i) ==
+			"micromessenger"
+		);
+	} else {
+		return false;
+	}
+};
+module.exports = {
+	formatTime: formatTime,
+	formatLocation: formatLocation,
+	dateUtils: dateUtils,
+	getDate: getDate,
+	initPicker: initPicker,
+	forMatNum: forMatNum,
+	initDays: initDays,
+	getPlatform: getPlatform,
+	checkIsWechatBrowser: checkIsWechatBrowser,
+	debounce: debounce,
+	throttle: throttle,
+	formatDate: formatDate
+}

+ 92 - 0
jp-mobile/components/jp-picker2/jp-picker2.vue

@@ -0,0 +1,92 @@
+<template>
+	<view>
+		<picker @change="PickerChange" :value="index" :disabled="disabled" :range-value="rangeValue"  :range-key="rangeKey" :range="range">
+			<view class=" picker action">
+				<view class=" ">
+					{{label}}▾
+				</view>
+			</view>
+		</picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				index: -1,
+				label: '请选择'
+			};
+		},
+		props: {
+		    value: String,
+			empty: {
+				type: String,
+				default: ''
+			},
+			rangeKey: {
+				type: String,
+				default: 'label'
+			},
+			rangeValue: {
+				type: String,
+				default: 'value'
+			},
+			range: {
+				type: Array,
+				default: []
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			onChangeNew: {
+				type: Function,
+				default: null,
+			}
+		},
+		mounted() {
+			if (this.empty) {
+				this.label = this.empty
+			}
+		},
+		watch:{
+			value: {
+				handler (val) {
+					if(val) {
+						let options = this.range.filter((option)=>{
+							return option.value === val
+						})
+						// if(options.length === 0){
+						// 	this.label = '请选择'
+						// } else {
+							this.label = options[0][this.rangeKey]
+						//}
+					}
+				},
+				immediate: true,
+				deep: false
+			}
+		},
+		methods:{
+			PickerChange(e) {
+				this.index = e.detail.value;
+				//if(this.index !== -1){
+					this.label = this.range[this.index][this.rangeKey]
+					this.$emit('input', this.range[this.index][this.rangeValue])
+				// }else{
+				// 	this.label = '请选择'
+				// 	this.$emit('input', null)
+				// }
+				if (this.onChangeNew) {
+					this.onChangeNew()
+				}
+				
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 11 - 4
jp-mobile/package-lock.json

@@ -9,14 +9,21 @@
       "version": "1.0.0",
       "license": "ISC",
       "dependencies": {
+        "@dcloudio/uni-ui": "^1.4.27",
         "lodash": "^4.17.20",
         "lodash.pick": "^3.1.0",
-        "moment": "^2.27.0",
+        "moment": "^2.29.4",
         "prettier": "^1.12.1",
         "qs": "^6.9.4",
         "weixin-js-sdk": "^1.6.5"
       }
     },
+    "node_modules/@dcloudio/uni-ui": {
+      "version": "1.4.27",
+      "resolved": "https://registry.npmjs.org/@dcloudio/uni-ui/-/uni-ui-1.4.27.tgz",
+      "integrity": "sha512-rum85gViMdOsmbVlb+iWV7V0ZEczaefpCvNaUE8mKjYfgY5NA5XeDOdG+K2Ki4BJ0gAwz8r+2w2EW2lu8XLImg==",
+      "deprecated": "@1.4.29"
+    },
     "node_modules/call-bind-apply-helpers": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -244,9 +251,9 @@
       }
     },
     "node_modules/moment": {
-      "version": "2.30.1",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
-      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+      "version": "2.29.4",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+      "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
       "engines": {
         "node": "*"
       }

+ 2 - 1
jp-mobile/package.json

@@ -4,9 +4,10 @@
   "description": "<p style=\"text-align: center;\"><img src=\"https://image.weilanwl.com/uni/UniAppReadme.jpg\" alt=\"ColorUI简介\"></img></p>",
   "main": "main.js",
   "dependencies": {
+    "@dcloudio/uni-ui": "^1.4.27",
     "lodash": "^4.17.20",
     "lodash.pick": "^3.1.0",
-    "moment": "^2.27.0",
+    "moment": "^2.29.4",
     "prettier": "^1.12.1",
     "qs": "^6.9.4",
     "weixin-js-sdk": "^1.6.5"

+ 28 - 1
jp-mobile/pages.json

@@ -5,6 +5,25 @@
 			"path": "pages/index/index",
 			"style": {}
 		},
+		//大走访start
+		{
+			"path": "pages/dzf/questionDetail",
+			"style": {}
+		},
+		
+		//大走访end
+		{
+			"path": "pages/index/Tabindex",
+			"style": {}
+		},
+		{
+			"path": "pages/policy/policyList",
+			"style": {}
+		},
+		{
+			"path": "pages/policy/policyInfo",
+			"style": {}
+		},
 		{
 			"path": "pages/login/login",
 			"style": {
@@ -42,6 +61,14 @@
 			"path": "pages/buildList/buildList",
 			"style": {}
 		},
+		{
+			"path": "pages/buildList/buildList2",
+			"style": {}
+		},
+		{
+			"path": "pages/buildList/buildList3",
+			"style": {}
+		},
 		{
 			"path": "pages/product/productList",
 			"style": {}
@@ -422,7 +449,7 @@
 				"ly-tree-node": "/components/ly-tree/ly-tree-node"
 			},
 		"navigationBarBackgroundColor": "#0081ff",
-		"navigationBarTitleText": "盐都区工业企业产品发布平台",
+		"navigationBarTitleText": "‘都企供需’线上平台",
 		"navigationStyle": "custom",
 		"navigationBarTextStyle": "white"
 	},

+ 96 - 9
jp-mobile/pages/buildList/buildList.vue

@@ -1,13 +1,27 @@
 <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>
 
-		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture2" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
 		</swiper>
 
 
@@ -98,7 +112,7 @@
 				  </view>
 				</view>
 			
-			    <view @click="showMoreFilters = !showMoreFilters" style="width: 100%;text-align: center;">
+			    <view @click="showMoreFilters = !showMoreFilters" style="width: 100%;text-align: center;" v-if="isshowMoreFilters">
 					{{ showMoreFilters ? '收起' : '点击展示更多筛选' }}
 				</view>
 				
@@ -234,17 +248,27 @@
 		},
 		data() {
 			return {
+				isBack: true, // 是否显示返回按钮
+				backText: '返回', // 返回按钮的文本
+				bgColor: 'bg-blue', // 背景颜色
+				title: '',
+				picture2:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
 				isLogin:"",
 				pageInfo: {},
 				loginid:"",
 				showMoreFilters: false,
+				isshowMoreFilters: true,
 				tabs: [
 						{ name: '全部' },
-				        { name: '三个新兴产业' },
+				        { name: '三新兴产业' },
 				        { name: '三大未来产业' },
 				        { name: 'N个特色产业' }
 				      ],
 			    tabs2: [
+						
 					  { name: '东山系' },
 					  { name: '长盈系' },
 					  { name: '融和系' },
@@ -289,9 +313,18 @@
 				if (query && query.w=='1' ) {
 					this.md = "1";
 					this.searchForm.des7="";
+					this.title="产品分布";
+					
+					//隐藏三个分类,直接展示筛选
+					this.md = "3";
+					this.isshowMoreFilters=false;
+					this.showMoreFilters=true;
+					
 				}else if(query && query.w=='2'){
 					this.md = "2";
-					this.searchForm.des8=1;
+					this.searchForm.des8="1";
+					this.isshowMoreFilters=false;
+					this.title="链主企业";
 				}	
 			}			
 		},
@@ -588,13 +621,20 @@
 			},
 			switchTab2(index) {
 			  this.activeTab = index;
-			  if(index==0){
-			  		this.searchForm.des8="";
-			  }else{
-			  		this.searchForm.des8=this.activeTab;
-			  }
+			  // if(index==0){
+			  // 		this.searchForm.des8="";
+			  // }else{
+			  // 		this.searchForm.des8=this.activeTab;
+			  // }
+			  
+			  this.searchForm.des8=this.activeTab+1;
 			  this.doSearch();
 			  
+			},
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			      console.log('返回按钮被点击');
 			}
 		}
 	}
@@ -1002,4 +1042,51 @@
 	.tab-item-content.v-if {
 	  display: block;
 	}
+	
+	
+	/* 返回 */
+	.item-img {
+		width: 160rpx;
+		height: 160rpx;
+	}
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
 </style>

+ 934 - 0
jp-mobile/pages/buildList/buildList2.vue

@@ -0,0 +1,934 @@
+<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>
+
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+			<swiper-item>
+				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
+			</swiper-item>
+			<swiper-item>
+				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
+			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture2" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
+		</swiper>
+
+
+		<view class="line-box">
+			
+			<view :style="[{top:CustomBar + 'px'}]">
+				
+			
+				<view class="tabs" v-if="md=='1'">
+				  <view 
+					v-for="(tab, index) in tabs" 
+					:key="index" 
+					class="tab-item" 
+					:class="{ active: activeTab === index }" 
+					@click="switchTab(index)"
+				  >
+					{{ tab.name }}
+				  </view>
+				</view>
+				
+				<view class="tabs" v-if="md=='2'">
+				  <view 
+					v-for="(tab, index) in tabs2" 
+					:key="index" 
+					class="tab-item" 
+					:class="{ active: activeTab === index }" 
+					@click="switchTab2(index)"
+				  >
+					{{ tab.name }}
+				  </view>
+				</view>
+			
+			    
+							
+				<image :src="picture"  mode="widthFix" class="img-item" >
+					
+				</image>
+							
+			</view>
+			
+			
+			
+			
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	import loginService from "@/api/auth/loginService";
+	import uniFab from '@/components/uni-fab/uni-fab.vue';
+	import DoublePicker from '@/components/DoublePicker/DoublePicker.vue'
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import {mapActions} from 'vuex'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		name: "apps",
+		components: {
+			uniFab,
+			DoublePicker
+		},
+		data() {
+			return {
+				isBack: true, // 是否显示返回按钮
+				backText: '返回', // 返回按钮的文本
+				bgColor: 'bg-blue', // 背景颜色
+				title: '',
+				
+				isLogin:"",
+				pageInfo: {},
+				loginid:"",
+				showMoreFilters: false,
+				picture2:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
+				tabs: [					
+				        { name: '三大新兴产业' },
+				        { name: '三大未来产业' },
+				        { name: 'N个特色产业' }
+				      ],
+					  picture:"https://miniapp.huidutech.com.cn/yd_qycpfbH5/cp1.png",
+			    tabs2: [
+					  { name: '东山系' },
+					  { name: '长盈系' },
+					  { name: '融和系' },
+					  { name: '其他链主企业' }
+					],
+				      activeTab: 0,
+				stype: "", // 企业 => 3  楼宇 => 2  园区 => 1  zfadmin => 4  admin=> 5
+				md:"1",
+				searchForm: {
+					des1:"",
+					industry:"",
+					name:"",
+					des7:"",
+					des8:"",
+				},
+				
+				curWord: "", //当前搜索关键词
+				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.md = "1";
+					this.searchForm.des7="";
+					this.title="产业图谱";
+				}else if(query && query.w=='2'){
+					this.md = "2";
+					this.searchForm.des8=1;
+					this.title="链主企业";
+				}	
+			}			
+		},
+		onShow() {
+			this.isLogin=this.$auth.checkisLogin();
+		},
+		
+		created() {
+			//this.getPageInfo();
+			this.getParkList()
+			this.getParkList2()	
+			this.getParkList3()	
+		},
+
+
+		methods: {
+			...mapActions(['refreshUserInfo']),
+			
+			//选择产业链上下游
+			getParkList3() {
+				loginService.getIndustryChainList({
+				}).then(({
+					data
+				}) => {
+					// this.parkList3 = data.map((item) => {
+					// 	return {
+					// 		label: item.bz2,
+					// 		value: item.bz2
+					// 	}
+					// });
+					this.parkList3=[{label: '上游',value: '上游'},{label: '中游',value: '中游'},{label: '下游',value: '下游'}]
+					
+					this.parkList4 = data
+					    .map((item) => {
+					        const match = item.bz2.match(/\((.*?)\)/); // 匹配括号内的内容
+					        if (match) {
+					            return {
+					                label: match[1], // 括号内的内容
+					                value: match[1] // 括号内的内容
+					            };
+					        }
+					        return null; // 如果没有括号,返回 null
+					    })
+					    .filter((item) => item !== null) // 过滤掉 null 值
+						.reduce((acc, current) => {
+							// 使用 Set 去重
+							const existingItem = acc.find((item) => item.value === current.value);
+							if (!existingItem) {
+							  acc.push(current);
+							}
+							return acc;
+						  }, []);
+					
+					this.parkList3.unshift({
+					    label: "全部",
+					    value: ""
+					});
+					this.parkList4.unshift({
+					    label: "全部",
+					    value: ""
+					});
+					
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			//选择属地
+			getParkList2() {
+				loginService.getAreaList({
+				}).then(({
+					data
+				}) => {
+					this.parkList2 = data.map((item) => {
+						return {
+							label: item.des1,
+							value: item.des1
+						}
+					})
+					this.parkList2.unshift({
+					    label: "盐都区",
+					    value: ""
+					});
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			//选择行业
+			getParkList() {
+				loginService.getHyList({
+				}).then(({
+					data
+				}) => {
+					this.parkList = data.map((item) => {
+						return {
+							label: item.industry,
+							value: item.industry
+						}
+					})
+					this.parkList.unshift({
+					    label: "全部",
+					    value: ""
+					});
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			/*获取数据列表 */
+			upCallback(page) {
+				this.loading = true
+				loginService.comlist({
+					current: page.num,
+					size: page.size,
+					name: this.curWord,
+					des1: this.parkId,
+					orders: [{ column: 'a.create_date', asc: false }],
+					...this.searchForm
+				}).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();
+				})
+			},
+			
+			gotoBuildInfo(id) {
+				// uni.navigateTo({
+				// 	url: `/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				// })
+				
+				window.location.href=`/yd_qycpfbH5/#/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				
+			},
+			
+			updateCities(newCities) {
+			      this.cities = newCities;
+			},
+			
+			
+			// 搜索
+			doSearch() {				
+				if(this.ddd1.column2!=''&&this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1+'('+this.ddd1.column2+')';
+				}else if(this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1;
+				}
+				
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+			
+			totongxunlu(){
+				uni.navigateTo({
+					url: '/pages/comList/comList'
+				})
+			},
+			
+			totongxunlu2(){
+				uni.showModal({
+					title: '功能暂未开放,请至后台导入!',
+					showCancel: true,
+					success: (res) => {
+						
+					}
+				});
+			},
+			
+			
+			
+			getPageInfo() {
+			  loginService.InfoStatistics({}).then(({ data }) => {
+			    this.pageInfo = data;
+			  });
+			
+			
+			},
+			
+			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
+			},
+			
+			switchTab(index) {
+			  this.activeTab = index;
+			  // if(index==0){
+				 //  this.searchForm.des7="";
+			  // }else{
+				 //  this.searchForm.des7=this.activeTab;
+			  // }
+			  
+			  if(index==0){
+			  		this.picture="https://miniapp.huidutech.com.cn/yd_qycpfbH5/cp1.png";
+			  }else if(index==1){
+			  		this.picture="https://miniapp.huidutech.com.cn/yd_qycpfbH5/cp2.png";
+			  }else{
+					this.picture="https://miniapp.huidutech.com.cn/yd_qycpfbH5/cp3.png";
+			  }
+			  			  
+			  //this.doSearch();
+			  
+			},
+			switchTab2(index) {
+			  this.activeTab = index;
+			  if(index==0){
+			  		this.searchForm.des8="";
+			  }else{
+			  		this.searchForm.des8=this.activeTab;
+			  }
+			  //this.doSearch();
+			  
+			},
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			      console.log('返回按钮被点击');
+			}
+		}
+	}
+</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;
+	}
+
+	.btn-box-5 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn3.png');
+		background-size: 100% 100%;
+	}
+
+	.btn-box-6 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn6.png');
+		background-size: 100% 100%;
+	}
+
+	.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: 20rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title{
+		position: relative;
+		display: flex;
+		justify-content: space-between;
+		font-size: 30rpx;
+		color: #010101;
+		font-weight: bold;
+		align-items: center;
+	}
+	
+	.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;
+	}
+	
+	.item-name3{
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #676D99;
+	}
+	
+	.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: 20px;
+	}
+	
+	.tab-item {
+	  padding: 3px 3px;
+	  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;
+	}
+	
+	
+	/* 返回 */
+	.item-img {
+		width: 160rpx;
+		height: 160rpx;
+	}
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+	
+	.img-item {
+		width: 100%;
+		
+	}
+</style>

+ 841 - 0
jp-mobile/pages/buildList/buildList3.vue

@@ -0,0 +1,841 @@
+<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>
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture2" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
+		</swiper>
+
+
+		<view class="line-box">
+											
+			<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)">
+							<view class="item-title">
+								
+								<view>
+									{{item.name}}									
+								</view>
+			
+							</view>
+							<view class="item-line">
+								<view v-if="item.bz3!=''&&item.bz3!=undefined" class="item-name">{{item.bz1}}、{{item.bz3}}</view>		
+								<view v-if="item.bz3==''||item.bz3==undefined" class="item-name">{{item.bz1}}</view>	
+							</view>
+							<view class="item-line">
+								<view class="item-name2">{{item.industry}}</view>
+								<view class="item-name3">{{item.des1}}</view>
+							</view>
+			
+						</view>
+											
+						
+					</view>
+				</mescroll-body>
+				<uni-fab :pattern=" {
+								color: '#7A7E83',
+								backgroundColor: '#fff',
+								selectedColor: '#007AFF',
+								buttonColor: '#007AFF'
+							}" horizontal="right" vertical="bottom" @fabClick="add" v-if="stype == 5"></uni-fab>
+							
+				
+							
+			</view>
+			
+			
+			
+			
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	import loginService from "@/api/auth/loginService";
+	import uniFab from '@/components/uni-fab/uni-fab.vue';
+	import DoublePicker from '@/components/DoublePicker/DoublePicker.vue'
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import {mapActions} from 'vuex'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		name: "apps",
+		components: {
+			uniFab,
+			DoublePicker
+		},
+		data() {
+			return {
+				isBack: true, // 是否显示返回按钮
+				backText: '返回', // 返回按钮的文本
+				bgColor: 'bg-blue', // 背景颜色
+				title: '',
+				picture2:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
+				isLogin:"",
+				pageInfo: {},
+				loginid:"",
+
+				stype: "", // 企业 => 3  楼宇 => 2  园区 => 1  zfadmin => 4  admin=> 5
+				searchForm: {
+					des1:"",
+					industry:"",
+					name:"",
+					des7:"",
+					des8:"",
+				},
+				
+				curWord: "", //当前搜索关键词
+				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.title="当日活跃企业";
+					this.curWord="1";
+					console.log('1111')
+					
+				}else if(query && query.w=='2'){
+					this.title="当月活跃企业";
+					this.curWord="2";
+				}	
+			}			
+		},
+		onShow() {
+			this.isLogin=this.$auth.checkisLogin();
+		},
+		
+		created() {
+			
+		},
+
+
+		methods: {
+			...mapActions(['refreshUserInfo']),
+			
+			
+			
+			/*获取数据列表 */
+			upCallback(page) {
+				console.log(this.curWord)
+				this.loading = true
+				loginService.Loginlist({
+					current: page.num,
+					size: page.size,
+					name: this.curWord,
+					orders: [{ column: 'a.create_date', asc: false }]
+				}).then(({
+					data
+				}) => {
+					
+					for(var i = 0; i < data.records.length; i++){
+						if(data.records[i].lyname=='管理员'){
+							data.records[i].name='管理员'
+							data.records[i].industry='暂无'
+						}else if(data.records[i].lyname=='政府管理员'){
+							data.records[i].name='政府管理员'
+							data.records[i].industry='暂无'
+						}else if(data.records[i].lyname=='盐都领导'){
+							data.records[i].name='盐都领导'
+							data.records[i].industry='暂无'
+						}else if(data.records[i].lyname=='盐都领导2'){
+							data.records[i].name='盐都领导2'
+							data.records[i].industry='暂无'
+						}
+						
+					}
+					
+					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();
+				})
+			},
+			
+			gotoBuildInfo(id) {
+				// uni.navigateTo({
+				// 	url: `/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				// })
+				console.log(id);
+				if(id==undefined){
+					uni.showModal({
+						title: '管理员账号无企业详情!',
+						showCancel: true,
+						success: (res) => {
+							
+						}
+					});
+				}else{
+					window.location.href=`/yd_qycpfbH5/#/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				}			
+								
+			},
+			
+			updateCities(newCities) {
+			      this.cities = newCities;
+			},
+			
+			
+			// 搜索
+			doSearch() {				
+				if(this.ddd1.column2!=''&&this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1+'('+this.ddd1.column2+')';
+				}else if(this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1;
+				}
+				
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+			
+			totongxunlu(){
+				uni.navigateTo({
+					url: '/pages/comList/comList'
+				})
+			},
+			
+			totongxunlu2(){
+				uni.showModal({
+					title: '功能暂未开放,请至后台导入!',
+					showCancel: true,
+					success: (res) => {
+						
+					}
+				});
+			},
+			
+			
+			
+			getPageInfo() {
+			  loginService.InfoStatistics({}).then(({ data }) => {
+			    this.pageInfo = data;
+			  });
+			
+			
+			},
+			
+			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
+			},
+			
+			switchTab(index) {
+			  this.activeTab = index;
+			  if(index==0){
+				  this.searchForm.des7="";
+			  }else{
+				  this.searchForm.des7=this.activeTab;
+			  }
+			  			  
+			  this.doSearch();
+			  
+			},
+			switchTab2(index) {
+			  this.activeTab = index;
+			  // if(index==0){
+			  // 		this.searchForm.des8="";
+			  // }else{
+			  // 		this.searchForm.des8=this.activeTab;
+			  // }
+			  
+			  this.searchForm.des8=this.activeTab+1;
+			  this.doSearch();
+			  
+			},
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			      console.log('返回按钮被点击');
+			}
+		}
+	}
+</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;
+	}
+
+	.btn-box-5 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn3.png');
+		background-size: 100% 100%;
+	}
+
+	.btn-box-6 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn6.png');
+		background-size: 100% 100%;
+	}
+
+	.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: 20rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title{
+		position: relative;
+		display: flex;
+		justify-content: space-between;
+		font-size: 30rpx;
+		color: #010101;
+		font-weight: bold;
+		align-items: center;
+	}
+	
+	.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;
+	}
+	
+	.item-name3{
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #676D99;
+	}
+	
+	.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: 20px;
+	}
+	
+	.tab-item {
+	  padding: 3px 3px;
+	  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;
+	}
+	
+	
+	/* 返回 */
+	.item-img {
+		width: 160rpx;
+		height: 160rpx;
+	}
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+</style>

+ 14 - 3
jp-mobile/pages/comEdit/comEdit.vue

@@ -27,13 +27,19 @@
 		  </view>
 
 		
-		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture2" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
 		</swiper>
 		
 		<form class="cu-list menu">
@@ -177,6 +183,8 @@
 				 {{inputForm.qyDes}}
 			</view>	
 			
+			<view style="height: 30rpx;background-color: white;"></view>
+			
 			<view v-if="inputForm.bz3!=''&&inputForm.bz3!=undefined" style="height: 50rpx;background-color: white;"></view>
 
 					
@@ -205,6 +213,10 @@
 			    backText: '返回', // 返回按钮的文本
 			    bgColor: 'bg-blue', // 背景颜色
 				autoUpload: false,
+				picture2:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
 				inputForm: {
 					id: '',
 					name: '',
@@ -447,7 +459,7 @@
 			          }
 			          //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去(link的链接可以自己拼,无须与当前页面的后缀参数之类的内容完全一致)
 			          let shareData = {
-			            title: '盐都区工业企业产品发布平台',
+			            title: '‘都企供需’线上平台',
 			            desc: '点击直接登录',
 			            imgUrl: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/static/img/titlebg.jpg',
 			            link: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/pages/index/index?loginid='+data.Id + "&t=" + data.timestamp + "&Content=1", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致																		
@@ -694,7 +706,6 @@
 	.text221{
 		text-indent: 2em;
 		flex: 1;
-		min-height: 700rpx;
 		color: #666666;
 		padding: 28rpx;
 		font-size: 29rpx;

+ 14 - 3
jp-mobile/pages/comInfo/comInfo.vue

@@ -27,6 +27,15 @@
 			  <view class="content-text">{{title}}</view>
 			</view>
 		  </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">园区详情</view>
+		  	</view>
+		    </view>
 
 		
 		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
@@ -82,7 +91,7 @@
 				</view>				
 			</view> -->
 			
-			<view class="titlebg2" style="margin-top:10rpx ;">
+			<view class="titlebg2" style="margin-top:10rpx ;" v-if="inputForm.picture!=''">
 				<view class="titlet1" ></view>
 				<view class="titlet2" >产业布局</view>								
 			</view>
@@ -406,7 +415,7 @@
 			          }
 			          //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去(link的链接可以自己拼,无须与当前页面的后缀参数之类的内容完全一致)
 			          let shareData = {
-			            title: '盐都区工业企业产品发布平台',
+			            title: '‘都企供需’线上平台',
 			            desc: '点击直接登录',
 			            imgUrl: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/static/img/titlebg.jpg',
 			            link: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/pages/index/index?loginid='+data.Id + "&t=" + data.timestamp + "&Content=1", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致																		
@@ -445,8 +454,10 @@
 					
 				}
 				
+				if(this.inputForm.picture!=""){
+					this.inputForm.picture="http://47.97.69.114:8089"+this.inputForm.picture;
+				}
 				
-				this.inputForm.picture="http://47.97.69.114:8089"+this.inputForm.picture;
 				
 				
 			},

+ 71 - 4
jp-mobile/pages/comList/comList.vue

@@ -1,13 +1,28 @@
 <template>
 	<view>
 		
-		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		<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">重点园区</view>
+			</view>
+		  </view>
+		
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
 		</swiper>
 		
 		<view :style="[{top:CustomBar + 'px'}]">
@@ -102,12 +117,20 @@
 		},
 		data() {
 			return {
+				isBack: true, // 是否显示返回按钮
+				backText: '返回', // 返回按钮的文本
+				bgColor: 'bg-blue', // 背景颜色
+				
 				isLogin:"",
 				searchForm: {
 					des1:"",
 					industry:"",
 					name:"",
 				},
+				picture:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
 				parkList2: [],
 				curWord: "", //当前搜索关键词
 				dataList: [], // 数据列表
@@ -268,6 +291,11 @@
 					this.modalName = null
 				}
 				this.listTouchDirection = null
+			},
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			      console.log('返回按钮被点击');
 			}
 		}
 	}
@@ -437,8 +465,7 @@
 	
 	.item-box{
 		
-		display: flex;
-		
+		display: flex;		
 		width: 710rpx;
 		margin-left: 20rpx;
 		background: #FFFFFF;
@@ -476,9 +503,49 @@
 		-webkit-box-orient: vertical; /* 垂直排列 */
 		
 	}
-	
+	/* 返回 */
 	.item-img {
 		width: 160rpx;
 		height: 160rpx;
 	}
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
 </style>

+ 52 - 0
jp-mobile/pages/dzf/components/cadresItem.vue

@@ -0,0 +1,52 @@
+<template>
+	<view>
+		<view class="font-md text-dark font-weight pt-2">挂钩干部</view>
+		<view class="py-2 border-bottom">
+			<text class="text-primary">姓名:</text>
+			<text class="text-secondary">{{hookName ? hookName : cadresData.realName}}</text>
+		</view>
+		<!-- <view class="py-2 border-bottom d-flex a-center">
+			<text class="text-primary">联系电话:</text>
+			<u--input v-model="cadresData.mobilePhone" color="#666666" :readonly="onlyFlag"
+				:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入手机号码' : ''"></u--input>
+		</view> -->
+	</view>
+</template>
+
+<script>
+	import {Store} from "@/common/store.js";
+	export default {
+		name: 'cadresItem',
+		props: {
+			cadresData: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return this.readOnlyFlag
+			}
+		},
+		data() {
+			return {
+        hookName: ""
+      }
+		},
+		mounted() {
+      this.hookName = this.cadresData.realName
+      const userInfo = Store.getUser() ? JSON.parse(Store.getUser()) : {}
+      if( userInfo?.roleLevel == '2'){
+        this.hookName = userInfo.userName
+      }
+		},
+		methods: {}
+	}
+</script>
+
+<style>
+</style>

+ 22 - 0
jp-mobile/pages/dzf/components/commonButton/index.vue

@@ -0,0 +1,22 @@
+<template>
+	<view class="commonButton position-fixed bg-white left-0">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+</script>
+
+<style lang="scss" scoped>
+	.commonButton {
+		width: 100vw;
+		height: 156rpx;
+		/*兼容 IOS<11.2*/
+		padding-bottom: constant(safe-area-inset-bottom);
+		/*兼容 IOS>11.2*/
+		padding-bottom: env(safe-area-inset-bottom);
+		z-index: 100;
+		bottom: var(--window-bottom);
+		box-sizing: border-box;
+	}
+</style>

+ 117 - 0
jp-mobile/pages/dzf/components/enterpriseInfoItem.vue

@@ -0,0 +1,117 @@
+<template>
+	<view>
+		<view class="font-md text-dark font-weight">企业信息</view>
+		<view class="border-bottom py-2 d-flex j-sb">
+			<view class="d-flex a-center w-100">
+				<text class="text-primary">企业名称:</text>
+				<song-data-picker class="flex-1" style="width: 100%;" @click.native="songClick" :clearIcon="false"
+					:readonly="!(!readOnlyFlag && userData.enterpriseCadreFlag)" :localdata="companyColumn" placeholder="请选择企业"
+					popup-title="请选择企业" @nodeclick="onnodeclick">
+					<slot>
+						<view class="d-flex a-center j-sb">
+							<view class="">
+								<text v-show="itemDate.companyName" class="text-secondary">{{itemDate.companyName}}</text>
+								<text v-show="!itemDate.companyName" class="font-md" style="color: rgb(192, 196, 204);">请选择企业</text>
+							</view>
+							<u-icon v-if="!readOnlyFlag && userData.enterpriseCadreFlag" name="arrow-down" color="#666666 " size="20">
+							</u-icon>
+						</view>
+					</slot>
+				</song-data-picker>
+			</view>
+
+		</view>
+		<view class="border-bottom py-2">
+			<text class="text-primary">属地:</text>
+			<text class="text-secondary">{{itemDate.areaChargeNameLabel}}</text>
+		</view>
+		<view class="border-bottom py-2">
+			<text class="text-primary">企业负责人:</text>
+			<text class="text-secondary">{{itemDate.userName}}</text>
+		</view>
+		<view class="border-bottom py-2">
+			<text class="text-primary">负责人号码:</text>
+			<text class="text-secondary">{{itemDate.userMobile}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+
+	import {enterpriseVisit} from "@/api/dzf/enterpriseVisit.js";
+	export default {
+		props: {
+			enterpriseInfoData: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			},
+			status: {
+				type: String,
+				default: ''
+			},
+			userInfo: {
+				type: Object,
+				default: () => {}
+			}
+		},
+		data() {
+			return {
+				companyColumn: []
+			}
+		},
+		computed: {
+			itemDate() {
+				return this.enterpriseInfoData
+			},
+			userData() {
+				return this.userInfo
+			}
+		},
+		mounted() {
+			if (this.readOnlyFlag) return
+			this.getCompanyList()
+		},
+		methods: {
+			// 检索功能
+			mySearchFn(searchList, searchWord) {
+				// console.log(searchList)
+				// console.log(searchWord)
+				// if(!searchWord){
+				// 	return searchList
+				// }
+				return searchList.filter(x => x.text.includes(searchWord));
+			},
+			// 获取挂钩干部企业列表
+			async getCompanyList() {
+				const data = await enterpriseVisit.fetchOwnManagerEnterprise()
+				const tempData = (data || []).map(ele => {
+					const obj = ele
+					Object.assign(obj, {
+						text: ele.companyName,
+						value: ele.enterpriseId
+					})
+					return obj
+				})
+				this.companyColumn = data || []
+				if (this.status) return
+				this.$emit('updateCompanyInfo', tempData[0])
+			},
+			// 企业选择确认操作
+			onnodeclick(ele) {
+				console.log('ele', ele);
+				this.$emit('updateCompanyInfo', ele)
+			},
+			// 问题类型--->点击
+			songClick() {
+				uni.hideKeyboard()
+			},
+		}
+	}
+</script>
+
+<style>
+</style>

+ 497 - 0
jp-mobile/pages/dzf/components/enterpriseSituateItem.vue

@@ -0,0 +1,497 @@
+<template>
+	<view class="enterpriseSituateItem">
+		<view class="d-flex px-4">
+			<view class="w-100 font-md text-dark font-weight">情况反馈</view>
+		</view>
+		<view class="px-4">
+			<u--form labelPosition="left" :model="model" ref="situateForm" labelWidth="80">
+				<u-form-item label="员工总数:" prop="staffTotal" ref="situateItem">
+					<u--input v-model="model.staffTotal" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入员工总数' : ''"></u--input>
+				</u-form-item>
+				<!-- <u-form-item label="在岗人数:" prop="onlineStaffTotal" ref="situateItem">
+					<u--input v-model="model.onlineStaffTotal" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入在岗人数' : ''"></u--input>
+				</u-form-item> -->
+				<u-form-item label="主导产品及年产能:" prop="productCapacity" ref="situateItem" class="questionDesc">
+					<u--textarea v-model="model.productCapacity" :disabled="onlyFlag" :border="onlyFlag ? 'none' : 'surround'"
+						:placeholder="!onlyFlag ? '请填写主导产品及年产能' : ''">
+					</u--textarea>
+				</u-form-item>
+			<!-- 	<u-form-item label="企业下游客户名称:" prop="lowerCustomer" ref="situateItem" class="questionDesc">
+					<u--textarea v-model="model.lowerCustomer" :disabled="onlyFlag" :border="onlyFlag ? 'none' : 'surround'"
+						:placeholder="!onlyFlag ? '请填写企业下游客户名称' : ''">
+					</u--textarea>
+				</u-form-item> -->
+				<u-form-item label="目前在手订单金额(万元)(每月更新):" prop="orderAmount" ref="situateItem">
+					<u--input v-model="model.orderAmount" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入目前在手订单金额' : ''"></u--input>
+				</u-form-item>
+				<!-- <u-form-item label="持续到哪个月:" prop="endDate" @click="endDateTap">
+					<u--input v-model="model.endDate" readonly :border="onlyFlag ? 'none' : 'surround'"
+						:placeholder="!onlyFlag ? '请选择持续到哪个月' : ''">
+					</u--input>
+				</u-form-item> -->
+				<!-- <u-form-item label="产品库存金额(万元):" prop="productStockAmount" ref="situateItem">
+					<u--input v-model="model.productStockAmount" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入产品库存金额' : ''"></u--input>
+				</u-form-item> -->
+				<!-- <u-form-item label="主要原材料名称:" prop="rawMaterialName" ref="situateItem" labelPosition="top"
+					class="questionDesc">
+					<u--textarea v-model="model.rawMaterialName" :disabled="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请填写主要原材料名称' : ''">
+					</u--textarea>
+				</u-form-item> -->
+				<u-form-item label="原材料价格及增幅:" prop="rawMaterialSupplier" ref="situateItem" labelPosition="top"
+					class="questionDesc">
+					<u--textarea v-model="model.rawMaterialSupplier" :disabled="onlyFlag" :border="onlyFlag ? 'none' : 'surround'"
+						:placeholder="!onlyFlag ? '请填写原材料价格及增幅' : ''">
+					</u--textarea>
+				</u-form-item>
+				<u-form-item label="2023年开票销售实际(万元):" prop="lastYearInvoicingSaleActual" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastYearInvoicingSaleActual" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2023年开票销售实际(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2023年开票销售增幅(%):" prop="lastYearInvoicingSaleGrowth" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastYearInvoicingSaleGrowth" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '2023年开票销售增幅(%)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2024年全年实时开票销售预测:" prop="yearInvoicingSalePlan" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.yearInvoicingSalePlan" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2024年全年实时开票销售预测' : ''">
+					</u--input>
+				</u-form-item>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthInvoicingSalePlan', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthInvoicingSalePlan.month || '请选择月份'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计实时开票销售(万元):</view>
+					</view>
+					<u--input v-model="model.monthInvoicingSalePlan.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入月累计实时开票销售(万元)' : ''">
+					</u--input>
+				</view>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthInvoicingSaleGrowth', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthInvoicingSaleGrowth.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计实时开票销增幅(%):</view>
+					</view>
+					<u--input v-model="model.monthInvoicingSaleGrowth.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入月累计实时开票销增幅(%)' : ''">
+					</u--input>
+				</view>
+				<u-form-item label="2023年工业总产值(万元):" prop="lastIndustryTotal" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastIndustryTotal" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2023年工业总产值(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2023年工业总产值增幅(%):" prop="lastIndustryGrowth" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastIndustryGrowth" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '2023年工业总产值增幅(%)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2024年全年工业总产值预测(万元):" prop="industryTotalPlan" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.industryTotalPlan" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2024年全年工业总产值预测(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthIndustryTotal', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthIndustryTotal.month || '请选择月份'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计工业总产值(万元):</view>
+					</view>
+					<u--input v-model="model.monthIndustryTotal.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入月累计工业总产值(万元)' : ''">
+					</u--input>
+				</view>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthIndustryTotalGrowth', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthIndustryTotalGrowth.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计工业总产值增幅(%):</view>
+					</view>
+					<u--input v-model="model.monthIndustryTotalGrowth.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入月累计工业总产值增幅(%)' : ''">
+					</u--input>
+				</view>
+				
+				
+				<u-form-item label="2023年利润(万元):" prop="lastProfit" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastProfit" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2023年利润(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2023年利润增幅(%):" prop="lastProfitGrowth" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastProfitGrowth" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '2023年利润增幅(%)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2024年全年利润预测(万元):" prop="profitPlan" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.profitPlan" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2024年全年利润预测(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthProfit', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthProfit.month || '请选择月份'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计利润(万元):</view>
+					</view>
+					<u--input v-model="model.monthProfit.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '月累计利润(万元)' : ''">
+					</u--input>
+				</view>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthProfitGrowth', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthProfitGrowth.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计利润增幅(%):</view>
+					</view>
+					<u--input v-model="model.monthProfitGrowth.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入月累计利润增幅(%)' : ''">
+					</u--input>
+				</view>
+				
+				
+				
+				<u-form-item label="2023年工业用电量(千瓦时):" prop="industryPower" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.industryPower" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2023年工业用电量(千瓦时)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2024全年预计工业用电量:" prop="yearReceiptTaxPlan" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.yearReceiptTaxPlan" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '2024全年预计工业用电量' : ''">
+					</u--input>
+				</u-form-item>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthPower', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthPower.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计工业用电量(千瓦时):</view>
+					</view>
+					<u--input v-model="model.monthPower.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '月累计工业用电量(千瓦时)' : ''">
+					</u--input>
+				</view>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthPowerGrowth', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthPowerGrowth.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计工业用电量增幅(%):</view>
+					</view>
+					<u--input v-model="model.monthPowerGrowth.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '月累计工业用电量增幅(%)' : ''">
+					</u--input>
+				</view>
+				<u-form-item label="2023年入库税收实绩(万元):" prop="lastYearReceiptTaxActual" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.lastYearReceiptTaxActual" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入2023年入库税收实绩(万元)' : ''">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="2024全年预计入库税收:" prop="yearReceiptTaxGrowth" ref="situateItem" labelWidth="110">
+					<u--input v-model="model.yearReceiptTaxGrowth" type="number" :readonly="onlyFlag"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '2024全年预计入库税收' : ''">
+					</u--input>
+				</u-form-item>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthReceiptTax', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthReceiptTax.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计入库税收(万元):</view>
+					</view>
+					<u--input v-model="model.monthReceiptTax.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '月累计入库税收(万元)' : ''">
+					</u--input>
+				</view>
+				<view class="d-flex a-center py-2">
+					<view class="d-flex flex-wrap j-sb a-start commomWidth">
+						<view class="border border-light-opc px-2 d-flex month">
+							<song-data-picker class="flex-1" style="width: 100%;" @click.native="hideKeyboard" :clearIcon="false"
+								:readonly="readOnlyFlag" :localdata="monthColumn" placeholder="请选择月份" popup-title="请选择月份"
+								@nodeclick="monthTypeTap('monthReceiptTaxGrowth', $event)">
+								<slot>
+									<view class="d-flex j-sb a-center">
+										<text class="text-secondary">{{model.monthReceiptTaxGrowth.month || '请选择'}}</text>
+										<u-icon v-if="!readOnlyFlag" name="arrow-down" color="#303133" size="15">
+										</u-icon>
+									</view>
+								</slot>
+							</song-data-picker>
+						</view>
+						<view class="text-primary font-md monthDesc">月累计入库税收增幅(%):</view>
+					</view>
+					<u--input v-model="model.monthReceiptTaxGrowth.value" :readonly="onlyFlag" type="number"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '月累计入库税收增幅(%)' : ''">
+					</u--input>
+				</view>
+				<u-form-item label="企业3-5年发展计划:" prop="developmentFuture" ref="situateItem" class="questionDesc">
+					<u--textarea v-model="model.developmentFuture" :disabled="onlyFlag" maxlength="300"
+						:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '企业3-5年发展计划' : ''">
+					</u--textarea>
+				</u-form-item>
+			</u--form>
+			<!-- 年月控件 -->
+			<u-datetime-picker :show="showDatetime" mode="year-month" @confirm="calendarConfirm" @close="showDatetime=false"
+				@cancel="showDatetime=false" :minDate="1672531200000" confirmDisabledText="请选择截止日期" closeOnClickOverlay>
+			</u-datetime-picker>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {formatDate} from "@/common/util2.js"
+	export default {
+		props: {
+			model: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				showDatetime: false,
+				monthColumn: [{
+						text: '1',
+						value: '1'
+					},
+					{
+						text: '1~2',
+						value: '1~2'
+					},
+					{
+						text: '1~3',
+						value: '1~3'
+					},
+					{
+						text: '1~4',
+						value: '1~4'
+					},
+					{
+						text: '1~5',
+						value: '1~5'
+					},
+					{
+						text: '1~6',
+						value: '1~6'
+					},
+					{
+						text: '1~7',
+						value: '1~7'
+					},
+					{
+						text: '1~8',
+						value: '1~8'
+					},
+					{
+						text: '1~9',
+						value: '1~9'
+					},
+					{
+						text: '1~10',
+						value: '1~10'
+					},
+					{
+						text: '1~11',
+						value: '1~11'
+					},
+					{
+						text: '1~12',
+						value: '1~12'
+					}
+					// ['1', '1~2', '1~3', '1~4', '1~5', '1~6', '1~7', '1~8', '1~9', '1~10', '1~11', '1~12']
+				],
+				monthType: '',
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return this.readOnlyFlag
+			}
+		},
+		methods: {
+			// 月份选择切换
+			monthTypeTap(type, ele) {
+				if (this.readOnlyFlag) return
+				this.monthType = type;
+				this.monthSelect(ele)
+				this.hideKeyboard()
+			},
+			// 持续到哪个月-->点击
+			endDateTap() {
+				if (this.readOnlyFlag) return
+				this.showDatetime = true;
+				this.hideKeyboard()
+			},
+			// 持续到哪个月-->日期选择确认
+			calendarConfirm(e) {
+				this.showDatetime = false
+				this.model.endDate = formatDate(e.value, 'yyyy-MM')
+			},
+			// 月份选择确认
+			monthSelect(e) {
+				switch (this.monthType) {
+					case 'monthInvoicingSalePlan':
+						this.model.monthInvoicingSalePlan.month = e['value']
+						break;
+					case 'monthInvoicingSaleGrowth':
+						this.model.monthInvoicingSaleGrowth.month = e['value']
+						break;
+					case 'monthPower':
+						this.model.monthPower.month = e['value']
+						break;
+					case 'monthPowerGrowth':
+						this.model.monthPowerGrowth.month = e['value']
+						break;
+					case 'monthIndustryTotal':
+						this.model.monthIndustryTotal.month = e['value']
+						break;
+					case 'monthIndustryTotalGrowth':
+						this.model.monthIndustryTotalGrowth.month = e['value']
+						break;
+					case 'monthReceiptTax':
+						this.model.monthReceiptTax.month = e['value']
+						break;
+					case 'monthReceiptTaxGrowth':
+						this.model.monthReceiptTaxGrowth.month = e['value']
+						break;
+					case 'monthProfitGrowth':
+						this.model.monthProfitGrowth.month = e['value']
+						break;
+					case 'monthProfit':
+						this.model.monthProfit.month = e['value']
+						break;
+					default:
+						break;
+				}
+			},
+			// 隐藏键盘
+			hideKeyboard() {
+				uni.hideKeyboard()
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.enterpriseSituateItem {
+		.commomWidth {
+			width: 400rpx;
+
+			.month {
+				width: 150rpx;
+			}
+
+			.monthDesc {
+				width: 230rpx;
+			}
+		}
+	}
+</style>

+ 136 - 0
jp-mobile/pages/dzf/components/enterpriseVisitorItem.vue

@@ -0,0 +1,136 @@
+<template>
+	<view class="enterpriseSituateItem">
+		<view class="d-flex px-4">
+			<view class="w-100 font-md text-dark font-weight">对接方式</view>
+		</view>
+		<view class="px-4">
+			<u--form labelPosition="left" :model="model" ref="situateForm" labelWidth="100">
+				<u-form-item label="" prop="dealResult">
+					<u-radio-group v-model="model.staffTotal" placement="row" @change="groupChange">
+						<u-radio :label="item.name" :name="item.value" class="mx-1" v-for="(item,index) in list"
+							:key="index"></u-radio>
+					</u-radio-group>
+				</u-form-item>
+				<u-form-item :label="list[model.staffTotal?model.staffTotal-1:0]['name']+'记录时间:'" prop="endDate"
+					@click="endDateTap">
+					<u--input v-model="model.endDate" readonly :border="onlyFlag ? 'none' : 'surround'"
+						:placeholder="!onlyFlag ? '请选择近期与企业沟通时间' : ''">
+					</u--input>
+				</u-form-item>
+			</u--form>
+			<!-- 年月控件 -->
+			<!-- <u-datetime-picker :show="showDatetime" mode="date" @confirm="calendarConfirm" @close="showDatetime=false"
+				@cancel="showDatetime=false" :minDate="1704038400000" confirmDisabledText="请选择截止日期" closeOnClickOverlay>
+			</u-datetime-picker> -->
+		</view>
+
+		<u-calendar :minDate="minDate" :maxDate="maxDate" :show="showDatetime" @close="showDatetime=false"
+			@confirm="calendarConfirm"></u-calendar>
+	</view>
+</template>
+
+<script>
+	import {formatDate} from "@/common/util2.js"
+	export default {
+		props: {
+			model: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				showDatetime: false,
+				monthType: '',
+				list: [{
+						name: "上门沟通",
+						value: '1'
+					},
+					{
+						name: "电话联系",
+						value: '2'
+					},
+					{
+						name: "平台沟通",
+						value: '3'
+					},
+				]
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return this.readOnlyFlag
+			},
+			minDate() {
+				const now = new Date();
+				console.log(now.getFullYear())
+				const previousMonth = this.getPreviousMonth(now.getFullYear(), now.getMonth() + 1, now.getDate());
+				return previousMonth
+			},
+			maxDate() {
+				const now = new Date();
+				const nextMonth = this.getNextMonth(now.getFullYear(), now.getMonth() + 1, now.getDate());
+				return nextMonth
+			}
+		},
+		methods: {
+			getPreviousMonth(year, month, day) {
+				if (month === 1) {
+					// 如果是1月,则前一个月是上一年的12月
+					return year - 1 + '-12-' + day;
+				} else {
+					// 对于其他月份,直接减1即可
+					return year + '-' + (month - 1) + '-' + day;
+				}
+			},
+			getNextMonth(year, month, day) {
+				if (month === 12) {
+					// 如果是12月,则下一个月是下年的1月
+					return year + 1 + '-01-' + day;
+				} else {
+					// 对于其他月份,直接加1即可
+					return year + '-' + (month + 1) + '-' + day;
+				}
+			},
+			// 持续到哪个月-->点击
+			endDateTap(e) {
+
+				if (this.readOnlyFlag) return
+				this.showDatetime = true;
+				this.hideKeyboard()
+			},
+			// 持续到哪个月-->日期选择确认
+			calendarConfirm(e) {
+				this.showDatetime = false
+				this.model.endDate = e[0]
+			},
+			// 隐藏键盘
+			hideKeyboard() {
+				uni.hideKeyboard()
+			},
+			groupChange(ele) {
+				this.model.staffTotal = ele
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.enterpriseSituateItem {
+		.commomWidth {
+			width: 400rpx;
+
+			.month {
+				width: 150rpx;
+			}
+
+			.monthDesc {
+				width: 230rpx;
+			}
+		}
+	}
+</style>

+ 34 - 0
jp-mobile/pages/dzf/components/gapsColumn.js

@@ -0,0 +1,34 @@
+const gapsColumn = {
+	// 用工
+	'YG': [
+		[
+			'1-20人',
+			'20-50人',
+			'50-100人',
+			'100人以上'
+		]
+	],
+	// 资金
+	'ZJ': [
+		[
+			'500万以下',
+			'500万-1000万',
+			'1000万-2000万',
+			'2000万-5000万',
+			'5000万-1亿',
+			'1亿以上'
+		]
+	],
+	// 用地
+	'YDI': [
+		[
+			'20亩以下',
+			'20亩-50亩',
+			'50亩-100亩',
+			'100亩以上',
+		]
+	]
+}
+export {
+	gapsColumn
+}

+ 39 - 0
jp-mobile/pages/dzf/components/interviewItem.vue

@@ -0,0 +1,39 @@
+<template>
+	<view class="border border-light-opc rounded mb-2 p-2 shadow-sm">
+		<view class="">
+			<text class="text-primary">企业名称:</text>
+			<text class="text-secondary">{{itemData.companyName}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">提交时间:</text>
+			<text class="text-secondary">{{itemData.createTime}}</text>
+		</view>
+		<view class="">
+			<text class="text-primary">提交人:</text>
+			<text class="text-secondary">{{itemData.raisePerson}}</text>
+		</view>
+		<view class="pt-2">
+			<text class="text-primary">挂钩干部:</text>
+			<text class="text-secondary">{{itemData.realName}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			interviewData: {
+				type: Object,
+				default: () => {}
+			}
+		},
+		computed: {
+			itemData() {
+				return this.interviewData
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 40 - 0
jp-mobile/pages/dzf/components/manageItem.vue

@@ -0,0 +1,40 @@
+<template>
+	<view class="border border-light-opc rounded mb-2 p-2 shadow-sm">
+		<view class="">
+			<text class="text-primary">企业名称:</text>
+			<text class="text-secondary">{{itemData.enterpriseName}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">提交时间:</text>
+			<text class="text-secondary">{{itemData.submitTime || itemData.createTime}}</text>
+		</view>
+		<view class="">
+			<text class="text-primary">提交人:</text>
+			<text class="text-secondary">{{itemData.submitName}}</text>
+		</view>
+		<view class="pt-2">
+			<text class="text-primary">挂钩干部:</text>
+			<text class="text-secondary">{{itemData.hookName}}</text>
+		</view>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			manageData: {
+				type: Object,
+				default: () => {}
+			}
+		},
+		computed: {
+			itemData() {
+				return this.manageData
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 242 - 0
jp-mobile/pages/dzf/components/problemAppealItem.vue

@@ -0,0 +1,242 @@
+<template>
+	<view class="problemHandleItem">
+		<view class="text-black font-weight-bold font-md">
+			问题{{indexNo}}
+		</view>
+		<u--form labelPosition="left" :model="model" labelWidth="80">
+			<u-form-item label="问题名称:" :required="!onlyFlag" prop="questionName">
+				<u--input v-model="model.questionName" :readonly="onlyFlag" :border="onlyFlag ? 'none' : 'surround'"
+					:placeholder="!onlyFlag ? '请填写问题名称' : ''">
+				</u--input>
+			</u-form-item>
+			<view class="error-tip" v-if="!model.questionName && errorTip">
+				请填写问题名称
+			</view>
+			<u-form-item label="问题类型:" :required="!onlyFlag" prop="questionTypeName">
+				<song-data-picker style="width: 100%;" @click.native="songClick" :readonly="onlyFlag" :clearIcon="false"
+					:localdata="questionTypeColumn" :placeholder="!onlyFlag ? '请选择问题类型' : ''" popup-title="请选择问题类型"
+					@nodeclick="onnodeclick">
+					<slot name="data">
+						<view class="d-flex j-sb a-center border p-1 rounded8" style="border-color: rgb(218, 219, 222, 0.5);">
+							<view class="text-secondary">
+								<text v-show="model.questionTypeName">{{model.questionTypeName}}</text>
+								<text v-show="!model.questionTypeName" style="color: rgb(192, 196, 204);" class="font-md">请选择问题类型</text>
+							</view>
+							<u-icon v-if="!onlyFlag" name="arrow-down" color="#303133" size="15">
+							</u-icon>
+						</view>
+					</slot>
+				</song-data-picker>
+			</u-form-item>
+			<view class="error-tip" v-if="!model.questionTypeName && errorTip">
+				请选择问题类型
+			</view>
+			<block
+				v-if="model.questionType == 'YG' || model.questionType == 'ZJ' || model.questionType == 'YDI' || model.questionType == 'CF'">
+				<u-form-item label="缺口数:" :required="!onlyFlag" prop="gaps">
+					<view class="d-flex a-center" v-if="model.questionType == 'YG'">
+						<u--input v-model="model.gaps" v-if="!onlyFlag" type="number" :readonly="onlyFlag"
+							:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入缺口数' : ''">
+						</u--input>
+						<text class="ml-1"><text v-if="onlyFlag" class="pr">{{model.gaps}}</text>人</text>
+					</view>
+					<view class="d-flex a-center" v-if="model.questionType == 'ZJ'">
+						<u--input v-model="model.gaps" v-if="!onlyFlag" type="number" :readonly="onlyFlag"
+							:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入缺口数' : ''">
+						</u--input>
+						<text class="ml-1"><text v-if="onlyFlag" class="pr">{{model.gaps}}</text>万元</text>
+					</view>
+					<view class="d-flex a-center" v-if="model.questionType == 'YDI'">
+						<u--input v-model="model.gaps" v-if="!onlyFlag" type="number" :readonly="onlyFlag"
+							:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入缺口数' : ''">
+						</u--input>
+						<text class="ml-1"><text class="pr" v-if="onlyFlag">{{model.gaps}}</text>亩</text>
+					</view>
+					<view class="d-flex a-center" v-if="model.questionType == 'CF'">
+						<u--input v-model="model.gaps" v-if="!onlyFlag" type="number" :readonly="onlyFlag"
+							:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请输入缺口数' : ''">
+						</u--input>
+						<text class="ml-1"><text class="pr" v-if="onlyFlag">{{model.gaps}}</text></text>
+					</view>
+				</u-form-item>
+				<view class="error-tip" v-if="!model.gaps && errorTip">
+					请输入缺口数
+				</view>
+			</block>
+			<u-form-item label="问题描述:" :required="!onlyFlag" prop="questionDescription" class="questionDesc">
+				<u--textarea v-model="model.questionDescription" :disabled="onlyFlag" maxlength='-1'
+					:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请填写问题描述' : ''">
+				</u--textarea>
+			</u-form-item>
+			<view class="error-tip" v-if="!model.questionDescription && errorTip">
+				请填写问题描述
+			</view>
+			<u-form-item label="附件:" prop="files" v-if="model.fileList&&model.fileList.length">
+				<view class="d-flex flex-wrap">
+					<view class="w-100 d-flex" v-for="(item,index) in model.fileList" :key="index">
+						<u--text type="primary" :text="item.name" @tap="downloadFile(index)"></u--text>
+					</view>
+				</view>
+			</u-form-item>
+
+		</u--form>
+
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import {Global} from "@/common/Global.js";
+	import {enterpriseVisit} from "@/api/dzf/enterpriseVisit.js";
+	import {Store} from "@/common/store.js";
+	import {formatDate} from "@/common/util2.js"
+	export default {
+		props: {
+			model: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			},
+			showErrorTip: {
+				type: Boolean,
+				default: false
+			},
+			column: {
+				type: Array,
+				default: () => []
+			},
+			dealProgressDict: {
+				type: Array,
+				default: () => []
+			},
+			modelIndex: {
+				type: Number,
+				default: 0
+			},
+		},
+		data() {
+			return {
+				preTimeShow: false,
+				outCharge: false
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return Boolean(this.readOnlyFlag)
+			},
+			errorTip() {
+				return this.showErrorTip
+			},
+			questionTypeColumn() {
+				const column = (this.column || []).map(ele => {
+					const obj = {}
+					obj.text = ele.fullName
+					obj.value = ele.enCode
+					return obj
+				})
+				return column
+			},
+			dealProgressColumn() {
+				const column = (this.dealProgressDict || []).map(ele => {
+					const obj = {}
+					obj.text = ele.fullName
+					obj.value = ele.enCode
+					return obj
+				})
+				return column
+			},
+			indexNo() {
+				return this.modelIndex + 1
+			}
+		},
+		mounted() {
+			const userInfo = Store.getUser() ? JSON.parse(Store.getUser()) : {}
+			this.outCharge = userInfo?.roleLevel === '5'
+
+			console.log("this.outCharge:", this.outCharge)
+			console.log("this.readOnlyFlag:", this.readOnlyFlag)
+			console.log("this.(model.preTime:", this.model)
+
+		},
+		methods: {
+			downloadFile(index) {
+				const downloadLink = Global.baseUrl + this.model.fileList[index].url;
+				window.open(downloadLink, '_blank'); //h5直接进行跳转页面打开就可以了
+				uni.downloadFile({ //调用uni中的下载方法
+					url: Global.baseUrl + this.model.fileList[index].url, //后端返回的完整路径
+					success: (res) => {
+						console.log(res.tempFilePath, "下载");
+						if (res.statusCode === 200) {
+							const tempFilePath = res.tempFilePath;
+							// 显示文件
+							uni.openDocument({
+								filePath: tempFilePath,
+								success: (res) => {
+									console.log(res, '打开文件成功');
+								},
+							});
+						}
+					},
+					fail: (err) => {
+						console.log('下载文件失败', err);
+					}
+				});
+			},
+			clearIcon(e) {
+				this.$set(this.model, 'preTime', null)
+			},
+			// 问题类型选择变化操作
+			onnodeclick(ele) {
+				this.$set(this.model, 'questionTypeName', ele.text)
+				this.$set(this.model, 'questionType', ele.value)
+				this.model.gaps = ''
+			},
+			// 问题类型选择变化操作
+			ondealprogressclick(ele) {
+				this.$set(this.model, 'dealProgressName', ele.text)
+				this.$set(this.model, 'dealProgress', ele.value)
+			},
+			choosePreTime() {
+				if (!(this.model.status == '4' && this.outCharge)) return
+				this.preTimeShow = true;
+				uni.hideKeyboard()
+			},
+			preTimeConfirm(e) {
+				this.preTimeShow = false
+				console.log("preTime:", e.value)
+				this.$set(this.model, 'preTime', formatDate(e.value, 'yyyy-MM-dd'))
+			},
+			// 问题类型--->点击
+			songClick() {
+				uni.hideKeyboard()
+			},
+			// 问题类型--->点击
+			dealProgressClick() {
+				uni.hideKeyboard()
+			},
+			// 判断是否有必填项为填写
+			isRequired() {
+				const query = uni.createSelectorQuery().in(this);
+				let dataLength = 0
+				query.selectAll('.error-tip').boundingClientRect(data => {
+					dataLength = data.length
+					if (dataLength) {
+						uni.$u.toast('请填写完整问题诉求')
+					}
+				}).exec();
+				return dataLength
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.error-tip {
+		font-size: 12px;
+		color: #f56c6c;
+		margin-left: 160rpx;
+	}
+</style>

+ 149 - 0
jp-mobile/pages/dzf/components/problemHandleItem.vue

@@ -0,0 +1,149 @@
+<template>
+	<view class="problemHandleItem">
+<!--		<view class="font-md text-dark font-weight">问题处理</view>-->
+		<u--form labelPosition="left" :model="problemHandleData" labelWidth="80">
+			<u-form-item label="问题处理:" required prop="dealResult">
+				<u-radio-group v-model="problemHandleData.dealResult" placement="column" @change="radioChange">
+<!--					<u-radio label="退回修改" name="2" :disabled="onlyFlag" class="mb-2"></u-radio>-->
+					<u-radio label="办结" name="3" :disabled="onlyFlag" class="mb-2"></u-radio>
+					<u-radio label="反馈大走访活动办"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag)" name="4"
+						:disabled="onlyFlag"></u-radio>
+          <u-radio label="正在办理"
+                   v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag || userInfo.assignedDeptFlag)" name="10"
+                   :disabled="onlyFlag" ></u-radio>
+          <u-radio label="难以化解"
+                   v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag" name="11"
+                   :disabled="onlyFlag"></u-radio>
+          <u-radio label="持续跟踪"
+                   v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag" name="12"
+                   :disabled="onlyFlag"></u-radio>
+          <u-radio label="提请会办"
+                   v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag" name="13"
+                   :disabled="onlyFlag"></u-radio>
+					<u-radio label="交办" v-if="typeName == 'question' && userInfo.ydGxjLeaderFlag" name="5" :disabled="onlyFlag"
+						class="mt-2">
+					</u-radio>
+				</u-radio-group>
+			</u-form-item>
+			<view class="error-tip" v-if="!problemHandleData.dealResult && errorTip">
+				请选择处理结果
+			</view>
+			<u-form-item label="交办单位:" required prop="assignedDeptName" v-if="problemHandleData.dealResult == '5'"
+				@click="unitDataTap">
+				<u--input v-model="problemHandleData.assignedDeptName" readonly :border="onlyFlag ? 'none' : 'surround'"
+					:placeholder="!onlyFlag ? '请选择交办单位' : ''">
+				</u--input>
+			</u-form-item>
+			<view class="error-tip"
+				v-if="problemHandleData.dealResult == '5' && !problemHandleData.assignedDeptName && errorTip">
+				请选择交办单位
+			</view>
+			<u-form-item label="处理建议:" required prop="dealSuggestion">
+				<u--textarea v-model="problemHandleData.dealSuggestion" :disabled="onlyFlag"
+					:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请填写处理建议' : ''">
+				</u--textarea>
+			</u-form-item>
+			<view class="error-tip" v-if="!problemHandleData.dealSuggestion && errorTip">
+				请填写处理建议
+			</view>
+		</u--form>
+		<!-- 交办单位 -->
+		<u-picker :show="showUnit" :columns="unitColumn" keyName="fullName" title="请选择交办单位" @cancel="showMonth = false"
+			@confirm="unitSelect">
+		</u-picker>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			problemType: {
+				type: String,
+				default: ''
+			},
+			problemHandleData: {
+				type: Object,
+				default: () => {}
+			},
+			userInfo: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			},
+			showErrorTip: {
+				type: Boolean,
+				default: false
+			},
+			column: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				showUnit: false
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return this.readOnlyFlag
+			},
+			errorTip() {
+				return this.showErrorTip
+			},
+			typeName() {
+				return this.problemType
+			},
+			unitColumn() {
+				return this.column
+			}
+		},
+		methods: {
+			// 处理结果点击确认
+			radioChange() {
+				if (this.problemHandleData.dealResult != '5') {
+					this.problemHandleData.assignedDeptName = ''
+					this.problemHandleData.assignedDept = ''
+				}
+			},
+			// 交办单位--->点击
+			unitDataTap() {
+				if (this.readOnlyFlag) return
+				this.showUnit = true;
+				uni.hideKeyboard()
+			},
+			// 交办单位选择确认操作
+			unitSelect({
+				value
+			}) {
+				this.problemHandleData.assignedDeptName = value[0].fullName
+				this.problemHandleData.assignedDept = value[0].enCode
+				this.showUnit = false
+			},
+			// 判断是否有必填项为填写
+			isRequired() {
+				const query = uni.createSelectorQuery().in(this);
+				let dataLength = 0
+				query.selectAll('.error-tip').boundingClientRect(data => {
+					dataLength = data.length
+					if (dataLength) {
+						uni.$u.toast('请完善必填项内容')
+					}
+				}).exec();
+				return dataLength
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.error-tip {
+		font-size: 12px;
+		color: #f56c6c;
+		margin-left: 160rpx;
+	}
+</style>

+ 45 - 0
jp-mobile/pages/dzf/components/processProgress.vue

@@ -0,0 +1,45 @@
+<template>
+	<view>
+		<view class="font-md text-dark">目前进展</view>
+		<u-steps current="0" direction="column" dot>
+			<u-steps-item :title="item.opeTypeName" v-for="(item, index) in itemData" :key="index">
+				<view slot="desc" class="">
+					<view class="text-secondary">
+						{{item.remarks}}
+					</view>
+					<view class="text-secondary" v-if="item.preTime">
+						预计办结时间:{{item.preTime}}
+					</view>
+					<view class="d-flex j-sb a-center">
+						<view class="">
+							<text
+								v-show="item.roleLevelLabel">{{item.roleLevel == '5' ? item.roleName :  item.roleLevelLabel}},</text>
+							<text v-show="item.createByName">{{item.createByName}}</text>
+							<text v-show="item.phoneNumber">,{{item.phoneNumber}}</text>
+						</view>
+						<text>{{item.createTime}}</text>
+					</view>
+				</view>
+			</u-steps-item>
+		</u-steps>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			progressData: {
+				type: Array,
+				default: () => []
+			}
+		},
+		computed: {
+			itemData() {
+				return this.progressData
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 391 - 0
jp-mobile/pages/dzf/components/questionHandleItem.vue

@@ -0,0 +1,391 @@
+<template>
+	<view class="problemHandleItem">
+		<!--		<view class="font-md text-dark">问题处理</view>-->
+		<u--form labelPosition="left" :model="problemHandleData" labelWidth="80">
+			<u-form-item label="问题处理" prop="dealResult">
+				<u-radio-group v-model="problemHandleData.dealResult" placement="column" @change="groupChange">
+					<!--					<u-radio label="退回修改" name="2" :disabled="onlyFlag" class="mb-2" @change="radioChange"></u-radio>-->
+					<u-radio label="办结" name="3" :disabled="onlyFlag" class="mb-2" @change="radioChange"></u-radio>
+					<u-radio label="反馈大走访活动办"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag)" name="4"
+						:disabled="onlyFlag" @change="radioChange" class="mb-2"></u-radio>
+					<u-radio label="正在办理"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag || userInfo.assignedDeptFlag)"
+						name="10" :disabled="onlyFlag" @change="radioChange" class="mb-2"></u-radio>
+					<u-radio label="难以化解"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag"
+						name="11" :disabled="onlyFlag" @change="radioChange" class="mb-2"></u-radio>
+					<u-radio label="持续跟踪"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag"
+						name="12" :disabled="onlyFlag" @change="radioChange" class="mb-2"></u-radio>
+					<u-radio label="提请会办"
+						v-if="typeName == 'question' && (userInfo.enterpriseAreaFlag || userInfo.enterpriseCadreFlag) || userInfo.assignedDeptFlag"
+						name="13" :disabled="onlyFlag" @change="radioChange" class="mb-2"></u-radio>
+					<u-radio label="交办" v-if="typeName == 'question' && userInfo.ydGxjLeaderFlag" name="5" :disabled="onlyFlag"
+						@change="radioChange">
+					</u-radio>
+				</u-radio-group>
+			</u-form-item>
+			<u-form-item label="预计办结时间:" @click="choosePreTime" prop="preTime"
+				v-if="!onlyFlag || ((problemHandleData.preTime && !outCharge) || outCharge)" labelWidth="120">
+				<u--input v-model="problemHandleData.preTime" readonly :border="onlyFlag ? 'none' : 'surround'"
+					:placeholder="'请选择预计办结时间'">
+				</u--input>
+				<view class="icon-clear" @click.stop="clearIcon" v-if="!onlyFlag">
+					<uni-icons type="clear" color="#e1e1e1" size="24"></uni-icons>
+				</view>
+			</u-form-item>
+			<!-- <view class="error-tip" v-if="!problemHandleData.dealResult openAssignPick&& errorTip">
+				请选择处理结果
+			</view> -->
+			<u-form-item label="交办单位:" prop="assignedDeptName" v-if="problemHandleData.dealResult == '5'"
+				@click.native="openAssignPick">
+				<slot>
+					<view class="d-flex j-sb a-center">
+						<text v-show="problemHandleData.assignedDeptName"
+							class="text-secondary">{{problemHandleData.assignedDeptName}}</text>
+						<text v-show="!problemHandleData.assignedDeptName" class="font-md"
+							style="color: rgb(192, 196, 204);">请选择交办单位</text>
+						<u-icon v-if="!onlyFlag" name="arrow-down" color="#303133" size="15">
+						</u-icon>
+					</view>
+				</slot>
+			</u-form-item>
+			<u-form-item label="退回单位:" prop="backDept" v-if="problemHandleData.dealResult == '2'&&roleLevel=='4'">
+				<song-data-picker style="width: 100%;" @click.native="songClick" :readonly="onlyFlag" :clearIcon="false"
+					:localdata="columns" :placeholder="!onlyFlag ? '请选择退回单位' : ''" popup-title="请选择退回单位"
+					@nodeclick="onnodeclick2">
+					<slot name="data">
+						<view class="d-flex j-sb a-center border p-1 rounded8" style="border-color: rgb(218, 219, 222, 0.5);">
+							<view class="text-secondary">
+								<text v-show="problemHandleData.backDeptName">{{problemHandleData.backDeptName}}</text>
+								<text v-show="!problemHandleData.backDeptName" style="color: rgb(192, 196, 204);"
+									class="font-md">请选择退回单位</text>
+							</view>
+							<u-icon v-if="!onlyFlag" name="arrow-down" color="#303133" size="15">
+							</u-icon>
+						</view>
+					</slot>
+				</song-data-picker>
+			</u-form-item>
+			<u-form-item :label="labelTitle" prop="dealSuggestion">
+				<u--textarea v-model="problemHandleData.dealSuggestion" :disabled="onlyFlag"
+					:border="onlyFlag ? 'none' : 'surround'" :placeholder="!onlyFlag ? '请填写处理建议' : ''">
+				</u--textarea>
+			</u-form-item>
+			<u-form-item label="附件:" prop="file" v-if="!qiYeFlag">
+				<u-upload accept="file" :disabled="onlyFlag" @afterRead="afterRead" name="1" multiple :maxCount="10">
+					<u-button type="primary" icon="plus" text="上传附件"></u-button>
+				</u-upload>
+			</u-form-item>
+			<u-form-item label=" " prop="">
+				<view class="d-flex flex-wrap">
+					<view class="w-100 d-flex" v-for="(item,index) in problemHandleData.fileList" :key="index">
+						<u--text type="primary" :text="item.name" @tap="downloadFile(index)"></u--text>
+						<u-icon class="ml-1" name="close-circle" color="#F56C6C" size="16" v-if="!onlyFlag"
+							@tap="deletePic(index)"></u-icon>
+					</view>
+				</view>
+			</u-form-item>
+			<!-- <view class="error-tip" v-if="!problemHandleData.dealSuggestion && errorTip">
+				请填写处理建议
+			</view> -->
+
+		</u--form>
+		<m-multiple-picker ref="multiplePicker" :pickerTitle="{text: '交办单位',color:'#101010',fontSize:'32rpx'}"
+			:cancelBtn="{text: '取消',color:'#666666',fontSize:'32rpx'}"
+			:confirmBtn="{text: '确定',color:'#2f77f1',fontSize:'32rpx'}" :mapKeys="{ label: 'label', value: 'value' }"
+			searchPlaceholder="筛选交办单位" :openSearch="true" textAlign="left" :dataList="radarOverlyingList"
+			:checkedVals="radarOverVals" @mulConfirm="multipleConfirm"></m-multiple-picker>
+		<u-datetime-picker :show="preTimeShow" :confirmDisabledText=" '请选择预计办结时间'" closeOnClickOverlay mode="date"
+			@confirm="preTimeConfirm" @cancel="preTimeShow=false" @close="preTimeShow=false" :minDate="1704038400000">
+		</u-datetime-picker>
+	</view>
+</template>
+
+<script>
+	import {Global} from "@/common/Global.js";
+	import {Store} from "@/common/store.js";
+	import {formatDate} from "@/common/util2.js"
+	export default {
+		props: {
+			problemType: {
+				type: String,
+				default: ''
+			},
+			roleLevel: {
+				type: String,
+				default: ''
+			},
+			problemHandleData: {
+				type: Object,
+				default: () => {}
+			},
+			userInfo: {
+				type: Object,
+				default: () => {}
+			},
+			readOnlyFlag: {
+				type: Boolean,
+				default: false
+			},
+			showErrorTip: {
+				type: Boolean,
+				default: false
+			},
+			column: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				preTimeShow: false,
+				outCharge: false,
+				radarOverVals: [],
+				num: 0, //用于区分是否是重复选中,
+				show: false,
+				columns: [{
+						text: "企业",
+						value: "10"
+					},
+					{
+						text: "挂钩干部",
+						value: "20"
+					},
+					{
+						text: "属地干部",
+						value: "30"
+					},
+				],
+				qiYeFlag: true,
+				labelTitle: '处理建议 '
+			}
+		},
+		watch: {
+			'problemHandleData.assignedDept': {
+				handler(newVal, oldVal) {
+					if (!newVal) return
+					this.column.forEach(ele => {
+						if (ele.enCode === newVal) {
+							this.$set(this.problemHandleData, 'assignedDeptName', ele.fullName)
+						}
+					})
+				}
+			}
+		},
+		computed: {
+			onlyFlag() {
+				return this.readOnlyFlag
+			},
+			errorTip() {
+				return this.showErrorTip
+			},
+			typeName() {
+				return this.problemType
+			},
+			unitColumn() {
+				const column = (this.column || []).map(ele => {
+					const obj = {}
+					obj.text = ele.fullName
+					obj.value = ele.enCode
+					return obj
+				})
+				return column
+			},
+			radarOverlyingList() {
+				const column = (this.column || []).map(ele => {
+					const obj = {}
+					obj.label = ele.fullName
+					obj.value = ele.enCode
+					return obj
+				})
+				console.log("radarOverlyingList: ", column)
+				return column
+			}
+		},
+
+		mounted() {
+			const userInfo = Store.getUser() ? JSON.parse(Store.getUser()) : {}
+			this.qiYeFlag = userInfo?.roleLevel === '1'
+			this.outCharge = userInfo?.roleLevel === '5'
+			if (userInfo?.roleLevel === '4') {
+				this.labelTitle = '交办要求'
+			}
+
+			console.log("userInfo?.roleLevel: ", userInfo?.roleLevel)
+		},
+		methods: {
+			clearIcon(e) {
+				this.$set(this.problemHandleData, 'preTime', null)
+			},
+			choosePreTime() {
+				// if (!(this.problemHandleData.status == '4' && this.outCharge) || this.onlyFlag) return
+				if (this.onlyFlag) return
+				this.preTimeShow = true;
+				uni.hideKeyboard()
+			},
+			preTimeConfirm(e) {
+				this.preTimeShow = false
+				this.$set(this.problemHandleData, 'preTime', formatDate(e.value, 'yyyy-MM-dd'))
+			},
+			songClick() {
+				uni.hideKeyboard()
+			},
+			onnodeclick2(ele) {
+				this.$set(this.problemHandleData, 'backDeptName', ele.text)
+				this.$set(this.problemHandleData, 'backDept', ele.value)
+			},
+			downloadFile(index) {
+				const downloadLink = Global.baseUrl + this.problemHandleData.fileList[index].url;
+				window.open(downloadLink, '_blank'); //h5直接进行跳转页面打开就可以了
+				uni.downloadFile({ //调用uni中的下载方法
+					url: Global.baseUrl + this.problemHandleData.fileList[index].url, //后端返回的完整路径
+					success: (res) => {
+						console.log(res.tempFilePath, "下载");
+						if (res.statusCode === 200) {
+							const tempFilePath = res.tempFilePath;
+							// 显示文件
+							uni.openDocument({
+								filePath: tempFilePath,
+								success: (res) => {
+									console.log(res, '打开文件成功');
+								},
+							});
+						}
+					},
+					fail: (err) => {
+						console.log('下载文件失败', err);
+					}
+				});
+			},
+			deletePic(index) {
+				this.problemHandleData.fileList.splice(index, 1)
+			},
+			async afterRead(event) {
+				// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				console.log('lists', lists)
+				let fileListLen = this.problemHandleData.fileList ? this.problemHandleData.fileList.length : 0
+				lists.map((item) => {
+					if (!this.problemHandleData.fileList) {
+						this.problemHandleData.fileList = [{
+							...item,
+							status: 'uploading',
+							message: '上传中'
+						}]
+					} else {
+						this.problemHandleData.fileList.push({
+							...item,
+							status: 'uploading',
+							message: '上传中'
+						})
+					}
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url)
+					let item = this.problemHandleData.fileList[fileListLen]
+					this.problemHandleData.fileList.splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+				}
+				console.log('全部上传完了', this.problemHandleData.fileList)
+			},
+			uploadFilePromise(url) {
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: Global.baseUrl + '/api/file/Uploader/chain', // 仅为示例,非真实的接口地址
+						filePath: url,
+						name: 'file',
+						formData: {
+							user: 'test'
+						},
+						success: (res) => {
+							console.log('upload', res)
+							if (res.data) {
+								let response = JSON.parse(res.data)
+								if (response.data) {
+									setTimeout(() => {
+										resolve(response.data.url)
+									}, 1000)
+								}
+							}
+
+						}
+					});
+				})
+			},
+			// 交办单位检索
+			mySearchFn(searchList, searchWord) {
+				return searchList.filter(x => x.text.includes(searchWord));
+			},
+			// 交办单位选择变化操作
+			onnodeclick(ele) {
+				console.log("ele: ", ele)
+				this.$set(this.problemHandleData, 'assignedDeptName', ele.text)
+				this.$set(this.problemHandleData, 'assignedDept', ele.value)
+			},
+			openAssignPick() {
+				this.$refs.multiplePicker.openMulpicker()
+			},
+
+			multipleConfirm(item) {
+				const selectItems = item.value
+				const objValues = item.objValue
+				this.radarOverVals = selectItems
+				this.$set(this.problemHandleData, 'assignedDept', selectItems.toString())
+				if (objValues.length > 0) {
+					const labelName = objValues.map(t => t.label)
+					this.$set(this.problemHandleData, 'assignedDeptName', labelName.toString())
+				}
+			},
+			// 处理结果点击确认
+			groupChange(ele) {
+				if (ele == this.problemHandleData.dealResult && this.num == 0) {
+					this.num++ // 第一次相等即执行以下代码
+				} else {
+					// 第一次后相等即执行以下代码 --> 置空 radioGroupValue 即取消选中的值
+					this.problemHandleData.dealResult = ''
+					this.num = 0 // 初始化 num
+				}
+				if (this.problemHandleData.dealResult != '5') {
+					this.problemHandleData.assignedDeptName = ''
+					this.problemHandleData.assignedDept = ''
+					this.problemHandleData.dealSuggestion = ''
+				} else {
+					this.problemHandleData.assignedDeptName = this.column[0].fullName
+					this.problemHandleData.assignedDept = this.column[0].enCode
+					this.radarOverVals = [this.column[0].enCode]
+					this.problemHandleData.dealSuggestion = '请2日内回应,10内反馈办理结果,如办结请上传加盖公章的书面材料'
+				}
+			},
+			radioChange(v) {
+				this.problemHandleData.dealResult = v
+				this.num = 0 // 切换选项后需要初始化 num
+			},
+			// 判断是否有必填项为填写
+			isRequired() {
+				const query = uni.createSelectorQuery().in(this);
+				let dataLength = 0
+				query.selectAll('.error-tip').boundingClientRect(data => {
+					dataLength = data.length
+					if (dataLength) {
+						uni.$u.toast('请完善必填项内容')
+					}
+				}).exec();
+				return dataLength
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.error-tip {
+		font-size: 12px;
+		color: #f56c6c;
+		margin-left: 160rpx;
+	}
+</style>

+ 40 - 0
jp-mobile/pages/dzf/components/questionItem.vue

@@ -0,0 +1,40 @@
+<template>
+	<view class="border border-light-opc rounded mb-2 p-2 shadow-sm">
+		<view class="">
+			<text class="text-primary">企业名称:</text>
+			<text class="text-secondary">{{itemData.enterpriseName}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">提交时间:</text>
+			<text class="text-secondary">{{itemData.submitTime || itemData.createTime}}</text>
+		</view>
+		<view class="">
+			<text class="text-primary">提交人:</text>
+			<text class="text-secondary">{{itemData.submitName || itemData.userName}}</text>
+		</view>
+		<view class="pt-2">
+			<text class="text-primary">办结时间:</text>
+			<text class="text-secondary">{{itemData.submitTime || itemData.finishedTime || '----'}}</text>
+		</view>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			questionData: {
+				type: Object,
+				default: () => {}
+			}
+		},
+		computed: {
+			itemData() {
+				return this.questionData
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 69 - 0
jp-mobile/pages/dzf/components/visitorItem.vue

@@ -0,0 +1,69 @@
+<template>
+	<view class="border border-light-opc rounded mb-2 p-2 shadow-sm">
+		<view class="">
+			<text class="text-primary">企业名称:</text>
+			<text class="text-secondary">{{itemData.enterpriseName}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">对接方式:</text>
+			<text class="text-secondary">{{list[itemData.staffTotal?itemData.staffTotal-1:0].name}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">{{list[itemData.staffTotal?itemData.staffTotal-1:0].name}}记录时间:</text>
+			<text class="text-secondary">{{itemData.endDate}}</text>
+		</view>
+		<view class="my-2">
+			<text class="text-primary">挂钩干部:</text>
+			<text class="text-secondary">{{hookName}}</text>
+		</view>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+import {
+  Store
+} from "@/common/store.js";
+	export default {
+		props: {
+			manageData: {
+				type: Object,
+				default: () => {}
+			}
+		},
+		computed: {
+			itemData() {
+				return this.manageData
+			}
+		},
+		data() {
+			return {
+				list: [{
+						name: "上门沟通",
+						value: '1'
+					},
+					{
+						name: "电话联系",
+						value: '2'
+					},
+					{
+						name: "平台沟通",
+						value: '3'
+					},
+				],
+        hookName: ''
+			}
+		},
+
+    mounted() {
+      this.hookName = this.itemData.hookName
+      const userInfo = Store.getUser() ? JSON.parse(Store.getUser()) : {}
+      if( userInfo?.roleLevel == '2'){
+        this.hookName = userInfo.userName
+      }
+    },
+	}
+</script>
+
+<style>
+</style>

+ 27 - 0
jp-mobile/pages/dzf/questionDetail.vue

@@ -0,0 +1,27 @@
+<template>
+	
+</template>
+
+<script>
+	// import questionHandleItem from "@/pages/dzf/components/questionHandleItem.vue"	
+	import {Store} from "@/common/store.js";
+	import {enterpriseVisit} from "@/api/dzf/enterpriseVisit.js";
+	
+	
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		padding-bottom: 160rpx;
+	}
+
+	.slotContent {
+		height: 700rpx;
+		overflow-y: auto;
+	}
+
+	.scrollLock {
+		width: 100%;
+		position: fixed;
+	}
+</style>

+ 1006 - 0
jp-mobile/pages/index/Tabindex.vue

@@ -0,0 +1,1006 @@
+<template name="apps">
+	<view>
+
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+			<swiper-item>
+				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
+			</swiper-item>
+			<swiper-item>
+				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
+			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
+		</swiper>
+
+		<view >
+			<view class="btn-box-1-1 mart-t">
+				涉企政策集锦
+			</view>
+		</view>
+		
+		<view @click="totongxunlu5" style="display: flex;margin-top: 30rpx;margin-left: 20rpx;padding-left:20rpx ;margin-right:20rpx ;background-color: #FFFF0021;height: 92rpx;align-items: center;">
+			<image src="/static/img/laba.png" style="width: 42rpx;height: 42rpx;"></image>
+			<swiper class="swiper2" vertical circular  :autoplay="true" :interval="3000" :duration="800">
+			  <swiper-item v-for="(item, index) in picture" :key="index">
+			      <view style="color: #F9AE3D; font-size: 28rpx;padding-left: 10rpx;display: flex;align-items: center;"> 盐城市关于加快推进新型工业化若干政策措施的通知 </view>
+			  </swiper-item>
+			</swiper>
+			
+		</view>
+				
+
+		<view class="line-box">
+			
+			
+			<view class="center-box">
+				<view class="kuai-text">快捷入口</view>
+								
+				<!-- <view class="center-left-box">
+					<view class="btn-Imbox" @click="totongxunlu3">
+						<image  class="center-img" src="/static/img/cd1.png"></image>
+						<p>企业大走访</p>
+					</view>
+					
+					<view class="btn-Imbox" @click="totongxunlu4">
+						<image  class="center-img" src="/static/img/cd2.png"></image>
+						<p>都企供需</p>
+					</view> 
+					<view class="btn-Imbox" @click="totongxunlu5">
+						<image  class="center-img" src="/static/img/cd3.png"></image>
+						<p>涉企政策</p>
+					</view>
+													
+				</view> -->
+				
+				
+				<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)">
+							
+							
+							<image v-if="item.name=='企业大走访'" src="/static/img/cd1.png" class="item-img"></image>
+							<image v-if="item.name=='都企供需'" src="/static/img/cd2.png" class="item-img"></image>
+							<image v-if="item.name=='涉企政策'" src="/static/img/cd3.png" class="item-img"></image>
+							<view class="item-title-L">
+								
+								<view class="item-title">
+									{{item.name}}
+								</view>
+				
+								<view class="item-des">
+									{{item.des}}
+								</view>
+							</view>
+							
+				
+						</view>
+											
+						
+					</view>
+				</mescroll-body>
+				
+				
+				
+			</view>
+			
+			
+			<!-- <view :style="[{top:CustomBar + 'px'}]">
+				<view class="search-box">
+					<view class="search-box1">
+						<view class="choose-box">
+												
+							<input type="text"  placeholder="输入或选择属地" v-model="searchForm.des1" confirm-type="search" style="padding-left: 28rpx;"
+							></input>
+							
+							<jp-picker class="choose-boxp" v-model="searchForm.des1" rangeKey="label" rangeValue="value"
+								:range="parkList2"  >
+							</jp-picker>
+						</view>
+						<view class="choose-box">
+							
+							<input type="text"  placeholder="输入或选择行业" v-model="searchForm.industry" confirm-type="search" style="padding-left: 28rpx;"
+							></input>
+							
+							<jp-picker class="choose-boxp" v-model="searchForm.industry" rangeKey="label" rangeValue="value"
+								:range="parkList"  >
+							</jp-picker>
+							
+						</view>
+					</view>
+					
+					<view class="choose-box2" style="margin-top: 20rpx;">
+						<view class="choose-box3">											
+							
+							<view style="width: 300rpx;display: flex;align-items: center;color: #666666;font-size: 33rpx;">
+								产业链上下游:
+							</view>
+							
+							<DoublePicker
+							      :column1Label="''"
+							      :column2Label="''"
+							      :column1Data="parkList3"
+							      :column2Data="parkList4"
+							      v-model="ddd1"
+							      @update:column2Data="updateCities"
+							    />
+
+							
+						</view>
+						
+					</view>
+							
+					<view class="choose-box2" style="margin-top: 20rpx;">
+						<view style="width: 520rpx;">
+							<input type="text"  placeholder="输入关键词产品或企业名称" v-model="searchForm.name" confirm-type="search"
+							></input>
+						</view>
+						
+						<text style="padding-left: 40rpx;flex: 1;" class="cuIcon-search color-white" @click="doSearch"></text>
+					</view>
+														
+				</view>-->
+				
+						
+				
+				
+				
+				<!--<uni-fab :pattern=" {
+								color: '#7A7E83',
+								backgroundColor: '#fff',
+								selectedColor: '#007AFF',
+								buttonColor: '#007AFF'
+							}" horizontal="right" vertical="bottom" @fabClick="add" v-if="stype == 5"></uni-fab>
+							
+				
+							
+			</view> -->
+			
+			<view   @click="outlogin" class="fixed-bottom-right" v-if="isLogin!=null">
+				<image  class="center-img2" src="/static/img/icon_logout.png"></image>
+			</view>
+			
+			
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	import loginService from "@/api/auth/loginService";
+	import uniFab from '@/components/uni-fab/uni-fab.vue';
+	import DoublePicker from '@/components/DoublePicker/DoublePicker.vue'
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	import {mapActions} from 'vuex'
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		name: "apps",
+		components: {
+			uniFab,
+			DoublePicker
+		},
+		data() {
+			return {
+				isLogin:"",
+				pageInfo: {},
+				loginid:"",
+				
+				stype: "", // 企业 => 3  楼宇 => 2  园区 => 1  zfadmin => 4  admin=> 5
+				
+				searchForm: {
+					des1:"",
+					industry:"",
+					name:"",
+				},
+				picture:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/workBenchBannar.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
+				curWord: "", //当前搜索关键词
+				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();
+				}			
+			}			
+		},
+		onShow() {
+			this.isLogin=this.$auth.checkisLogin();
+		},
+		
+		created() {
+			this.getPageInfo();
+			this.getParkList()
+			this.getParkList2()	
+			this.getParkList3()	
+		},
+
+
+		methods: {
+			...mapActions(['refreshUserInfo']),
+			
+			//选择产业链上下游
+			getParkList3() {
+				loginService.getIndustryChainList({
+				}).then(({
+					data
+				}) => {
+					// this.parkList3 = data.map((item) => {
+					// 	return {
+					// 		label: item.bz2,
+					// 		value: item.bz2
+					// 	}
+					// });
+					this.parkList3=[{label: '上游',value: '上游'},{label: '中游',value: '中游'},{label: '下游',value: '下游'}]
+					
+					this.parkList4 = data
+					    .map((item) => {
+					        const match = item.bz2.match(/\((.*?)\)/); // 匹配括号内的内容
+					        if (match) {
+					            return {
+					                label: match[1], // 括号内的内容
+					                value: match[1] // 括号内的内容
+					            };
+					        }
+					        return null; // 如果没有括号,返回 null
+					    })
+					    .filter((item) => item !== null) // 过滤掉 null 值
+						.reduce((acc, current) => {
+							// 使用 Set 去重
+							const existingItem = acc.find((item) => item.value === current.value);
+							if (!existingItem) {
+							  acc.push(current);
+							}
+							return acc;
+						  }, []);
+					
+					this.parkList3.unshift({
+					    label: "全部",
+					    value: ""
+					});
+					this.parkList4.unshift({
+					    label: "全部",
+					    value: ""
+					});
+					
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			//选择属地
+			getParkList2() {
+				loginService.getAreaList({
+				}).then(({
+					data
+				}) => {
+					this.parkList2 = data.map((item) => {
+						return {
+							label: item.des1,
+							value: item.des1
+						}
+					})
+					this.parkList2.unshift({
+					    label: "盐都区",
+					    value: ""
+					});
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			//选择行业
+			getParkList() {
+				loginService.getHyList({
+				}).then(({
+					data
+				}) => {
+					this.parkList = data.map((item) => {
+						return {
+							label: item.industry,
+							value: item.industry
+						}
+					})
+					this.parkList.unshift({
+					    label: "全部",
+					    value: ""
+					});
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			/*获取数据列表 */
+			upCallback(page) {
+				//this.loading = true
+				this.mescroll.endBySize(3, 3);
+				this.dataList=[{"name":"企业大走访","des":"企业在遇到问题时,可随时填写问题反馈,相关部门会协助企业解决问题,及时跟进相关问题,更好的服务企业。"},
+				{"name":"都企供需","des":"企业供需、产业图谱、重点园区、产品分布是区域经济发展的重要组成部分。产业图谱解析产业链上下游关系,重点园区承载产业集聚发展,产品分布反映区域产业特色,共同推动区域经济高质量发展。"},
+				{"name":"涉企政策","des":"对企业的相关优惠政策,我们会及时更公布,让企业更好更精准的了解相关政策优惠,决定企业走向。"}];
+				
+				
+				// loginService.comlist({
+				// 	current: page.num,
+				// 	size: page.size,
+				// 	name: this.curWord,
+				// 	des1: this.parkId,
+				// 	orders: [{ column: 'a.create_date', asc: false }],
+				// 	...this.searchForm
+				// }).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();
+				// })
+			},
+			
+			gotoBuildInfo(id) {
+				// uni.navigateTo({
+				// 	url: `/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				// })
+				
+				window.location.href=`/yd_qycpfbH5/#/pages/comEdit/comEdit?id=${id}&ischeck=1`
+				
+			},
+			
+			updateCities(newCities) {
+			      this.cities = newCities;
+			},
+			
+			
+			// 搜索
+			doSearch() {				
+				if(this.ddd1.column2!=''&&this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1+'('+this.ddd1.column2+')';
+				}else if(this.ddd1!=''){
+					this.searchForm.bz2=this.ddd1.column1;
+				}
+				
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+			
+			totongxunlu(){
+				uni.navigateTo({
+					url: '/pages/comList/comList'
+				})
+			},
+			
+			totongxunlu2(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList2?w=1'
+				})
+			},
+			totongxunlu3(){		
+				console.log("1");
+				window.location.href = "https://dlt.yczgsz.com/mini/pageEnterpriseVisit/workbench/workbench"
+			},
+			totongxunlu6(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList?w=1'
+				})
+			},
+			totongxunlu4(){
+				uni.navigateTo({
+					url: '/pages/index/index'
+				})
+			},
+			totongxunlu5(){
+								
+				
+				uni.navigateTo({
+					url: '/pages/policy/policyList'
+				})
+			},
+			
+			totongxunlu22(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList3?w=1'
+				})
+			},
+			totongxunlu23(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList3?w=2'
+				})
+			},
+			
+			getPageInfo() {
+			  loginService.InfoStatistics({}).then(({ data }) => {
+			    this.pageInfo = data;
+				
+				//103改为 14/103
+				
+				//this.pageInfo.industryc="14/"+this.pageInfo.industryc;
+				
+			  });
+			
+			
+			},
+			
+			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);
+						});
+				}
+				
+			},
+			
+			toOut() {
+				//window.location.href = "https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/"
+				window.location.href = "https://dlt.yczgsz.com/mini/pageEnterpriseVisit/workbench/workbench"
+				
+			},
+
+            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
+			}
+		}
+	}
+</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%;		
+		margin-top: 20rpx;
+		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-1-1 {
+		height: 30rpx;
+		text-align: left;
+		color: #269ff8;
+		font-size:large;
+		margin-left:30rpx ;
+		font-weight: 600;
+	}
+
+	.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: 70rpx;
+		height: 70rpx;
+		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;
+		margin-bottom: 20rpx;
+	}
+
+	.btn-box-5 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn3.png');
+		background-size: 100% 100%;
+	}
+
+	.btn-box-6 {
+		width: 337rpx;
+		height: 200rpx;
+		background-image: url('../../static/img/btn6.png');
+		background-size: 100% 100%;
+	}
+
+	.h-200 {
+		height: 200rpx;
+	}
+
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+	
+	.swiper2 {
+		width: 750rpx;
+		height: 42rpx;
+		
+	}
+	
+	.swiper2-item {
+		width: 750rpx;
+		height: 42rpx;
+		background-color: #F9AE3D;
+	}
+
+	.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: 20rpx;
+		padding-left: 38rpx;
+		padding-right: 10rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title{
+		position: relative;
+		display: flex;
+		justify-content: space-between;
+		font-size: 30rpx;
+		color: #010101;
+		font-weight: bold;
+		align-items: center;
+	}
+	
+	.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;
+	}
+	
+	.item-name3{
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #676D99;
+	}
+	
+	.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; /* 距离右侧的距离 */
+	}
+	
+	
+	.item-box{
+		
+		display: flex;
+		
+		width: 710rpx;
+		margin-left: 20rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 1px 3px 0px rgba(9,2,4,0.1);
+		border-radius: 10px;
+		padding-top: 20rpx;
+		padding-left: 20rpx;
+		padding-right: 10rpx;
+		padding-bottom: 20rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title-L{
+		display: flex;
+		width: 70%;
+		margin-left: 28rpx;
+		flex-direction: column;
+	}
+	
+	.item-title{
+		font-size: 30rpx;
+		color: #333;
+		font-weight: bold;
+		align-items: center;
+	}
+	.item-des{
+		margin-top: 10rpx;
+		color: #565656;		
+			
+		font-size: 24rpx;
+		overflow: hidden; /* 超出部分隐藏 */
+		text-overflow: ellipsis; /* 超出部分显示省略号 */
+		display: -webkit-box; /* 使用Webkit的行盒模型 */
+		-webkit-line-clamp: 3; /* 限制最多显示2行 */
+		-webkit-box-orient: vertical; /* 垂直排列 */
+		
+	}
+	/* 返回 */
+	.item-img {
+		width: 100rpx;
+		height: 100rpx;
+	}
+</style>

+ 52 - 19
jp-mobile/pages/index/index.vue

@@ -1,13 +1,19 @@
 <template name="apps">
 	<view>
 
-		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>
 			<swiper-item>
 				<image src="../../static/img/titlebg.jpg" class="swiper-item"></image>
 			</swiper-item>			
+		</swiper> -->
+		
+		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		  <swiper-item v-for="(item, index) in picture" :key="index">
+		    <image :src="item" class="swiper-item"></image>
+		  </swiper-item>
 		</swiper>
 
 
@@ -17,10 +23,10 @@
 					<view class="btn-box-1 mart-t">
 						{{pageInfo.enterprisec}}
 					</view>
-					<view class="btn-box-2 mart-t">
+					<view class="btn-box-2 mart-t" @click="totongxunlu22">
 						{{pageInfo.todayc}}
 					</view>
-					<view class="btn-box-3 mart-t">
+					<view class="btn-box-3 mart-t" @click="totongxunlu23">
 						{{pageInfo.samemonthc}}
 					</view>
 					<view class="btn-box-4 mart-t">
@@ -30,7 +36,7 @@
 				</view>
 				<view class="center-left-box">
 					<view class="btn-box-text mart-t">
-						入库企业数
+						平台企业数
 					</view>
 					<view class="btn-box-text mart-t">
 						当日活跃数
@@ -39,7 +45,7 @@
 						当月活跃数
 					</view>
 					<view class="btn-box-text mart-t">
-						企业行业数
+						细分行业数
 					</view>
 				</view>
 			</view>
@@ -54,19 +60,24 @@
 					</view> 
 					<view class="btn-Imbox" @click="totongxunlu2">
 						<image  class="center-img" src="/static/img/icon2.png"></image>
-						<p>产图谱</p>
+						<p>产图谱</p>
 					</view>
 
-					<view class="btn-Imbox" @click="totongxunlu3">
-						<image  class="center-img" src="/static/img/icon3.png"></image>
-						<p>链主企业</p>
+					<view class="btn-Imbox" @click="totongxunlu6">
+						<image  class="center-img" src="/static/img/icon4.png"></image>
+						<p>产品分布</p>
 					</view>
 													
 				</view>
 				
 				<view class="center-left-box">
+					<view class="btn-Imbox" @click="totongxunlu3">
+						<image  class="center-img" src="/static/img/icon3.png"></image>
+						<p>链主企业</p>
+					</view>
+					
 					<view class="btn-Imbox" @click="totongxunlu4">
-						<image  class="center-img" src="/static/img/icon4.png"></image>
+						<image  class="center-img" src="/static/img/icon8.png"></image>
 						<p>产品供需</p>
 					</view> 
 					<view class="btn-Imbox" @click="totongxunlu5">
@@ -74,7 +85,7 @@
 						<p>我的发布</p>
 					</view>
 				
-					<view class="btn-Imbox" v-if="isLogin!=null" @click="outlogin">
+					<!-- <view class="btn-Imbox" v-if="isLogin!=null" @click="outlogin">
 						<image  class="center-img" src="/static/img/icon7.png"></image>
 						<p>退出登录</p>
 					</view>
@@ -82,7 +93,7 @@
 					<view class="btn-Imbox" v-if="isLogin==null" @click="outlogin">
 						<image  class="center-img" src="/static/img/icon6.png"></image>
 						<p>立即登录</p>
-					</view>
+					</view> -->
 													
 				</view>
 			</view>
@@ -181,13 +192,13 @@
 								buttonColor: '#007AFF'
 							}" horizontal="right" vertical="bottom" @fabClick="add" v-if="stype == 5"></uni-fab>
 							
-				<view   @click="outlogin" class="fixed-bottom-right" v-if="isLogin!=null">
-					<image  class="center-img2" src="/static/img/icon_logout.png"></image>
-				</view>
+				
 							
 			</view> -->
 			
-			
+			<view   @click="outlogin" class="fixed-bottom-right" v-if="isLogin!=null">
+				<image  class="center-img2" src="/static/img/icon_logout.png"></image>
+			</view>
 			
 			
 		</view>
@@ -223,7 +234,10 @@
 					industry:"",
 					name:"",
 				},
-				
+				picture:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
 				curWord: "", //当前搜索关键词
 				dataList: [], // 数据列表
 				modalName: null,
@@ -416,7 +430,7 @@
 			
 			totongxunlu2(){
 				uni.navigateTo({
-					url: '/pages/buildList/buildList?w=1'
+					url: '/pages/buildList/buildList2?w=1'
 				})
 			},
 			totongxunlu3(){
@@ -424,6 +438,11 @@
 					url: '/pages/buildList/buildList?w=2'
 				})
 			},
+			totongxunlu6(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList?w=1'
+				})
+			},
 			totongxunlu4(){
 				uni.navigateTo({
 					url: '/pages/product/productList?w=1'
@@ -452,11 +471,25 @@
 				
 			},
 			
-			
+			totongxunlu22(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList3?w=1'
+				})
+			},
+			totongxunlu23(){
+				uni.navigateTo({
+					url: '/pages/buildList/buildList3?w=2'
+				})
+			},
 			
 			getPageInfo() {
 			  loginService.InfoStatistics({}).then(({ data }) => {
 			    this.pageInfo = data;
+				
+				//103改为 14/103
+				
+				//this.pageInfo.industryc="14/"+this.pageInfo.industryc;
+				
 			  });
 			
 			

+ 596 - 0
jp-mobile/pages/policy/policyInfo.vue

@@ -0,0 +1,596 @@
+<template>
+	<view>
+		<view class="overlay" v-if="showfx" @click="showwx">
+			<image style="height: 100%;width: 100%;" src="/static/img/zz.png"></image>
+						
+		</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">涉企政策详情</view>
+		  	</view>
+		    </view>
+
+		
+		<form class="cu-list menu">
+			
+			<view class="show1">
+				
+				<view class="textbg">
+					<view class="text1">
+						 {{inputForm.des1}}
+					</view>		
+				</view>
+								
+				<view class="textbg">
+					<view class="text2">
+						政策发文日期:{{inputForm.stime}}
+					</view>		
+				</view>
+				
+				<view class="textbg">
+					<view class="text2">
+						政策类型:{{inputForm.des2}}
+					</view>		
+				</view>
+				
+				<view class="textbg">
+					<view class="text2">
+						政策级别:{{inputForm.des3}}
+					</view>		
+				</view>
+			</view>
+
+			<view class="titlebg2">
+				<view class="titlet1" ></view>
+				<view class="titlet2" >政策内容</view>								
+			</view>
+			
+			
+			<view class="textbg">
+				<view class="text12">
+					 <rich-text :nodes="inputForm.des4"></rich-text>
+				</view>			
+			</view>
+			
+				
+			<view  style="height: 50rpx;background-color: white;"></view>
+
+					
+			
+			<view style="height: 40rpx;"></view>
+
+		</form>
+	</view>
+</template>
+
+<script>
+	import loginService from '@/api/auth/loginService.js'
+	import { wxShare } from "@/common/wxutils.js";
+	export default {
+		onShow() {
+			//this.$auth.checkLogin()
+		},
+		data() {
+			return {
+				title: '新建企业信息',
+				imgurl: "", 
+				isBack: true, // 是否显示返回按钮
+			    backText: '返回', // 返回按钮的文本
+			    bgColor: 'bg-blue', // 背景颜色
+				autoUpload: false,
+				inputForm: {
+					id: '',
+					stime: '',
+					des1: '',
+					des2: '',
+					des3: '',
+					des4: '',
+					
+				},
+				text1:'',
+				text2:'',
+				parkList: [],
+				ischeck: false,
+				isLogin:"",
+				username:"",
+				isadmin:false,
+				lyIndex: '',
+				showLYList: [],
+				showfx:false,
+			}
+		},
+		created() {
+		},
+		mounted() {
+			
+		},
+		onLoad(query) {
+			this.isLogin=this.$auth.checkisLogin();
+			this.username=this.$auth.getUserInfo();
+			if(this.username!=undefined&&this.username!=''&&this.username!=null&&this.isLogin!=null){
+				if(this.username.loginName=='admin'){
+					this.isadmin=true;
+				}
+			}
+			
+			if (query && query.ischeck) {
+				this.ischeck = true
+				this.title = "查看企业信息";
+			}
+			if (query && query.id && !query.ischeck) {
+				this.title = "修改企业信息";
+			}
+			
+			
+			
+			
+			
+			this.getComById(query)
+			
+
+			
+		},
+		methods: {
+			getParkList(query) {
+				loginService.list({
+					current: 1,
+					size: 1000000,
+				}).then(({
+					data
+				}) => {
+					this.parkList = data.records.map((item) => {
+						return {
+							label: item.buildingName,
+							value: item.id
+						}
+					})
+					this.showLYList = this.parkList.map(item => item.label)
+					if (query && query.id) {
+						loginService.queryByIdCom(query.id).then(({
+							data
+						}) => {
+							this.inputForm = this.recover(this.inputForm, data)
+							this.lyIndex = this.parkList.findIndex(item => item.value == this.inputForm.des1)
+							console.log(this.lyIndex, '=====================>lyIndex')
+						}).catch((e) => {
+						
+						})
+						
+					}
+				}).catch(e => {
+					console.log(e)
+				})
+			},
+			
+			handleBack() {
+			      // 返回逻辑,比如跳转至上一页
+				  this.$router.go(-1);
+			      console.log('返回按钮被点击');
+			},
+			showwx() {
+			     this.showfx=false;
+			},
+			
+			getComById(query) {
+				loginService.policyInfo({
+					id: query.id,
+				}).then(({
+					data
+				}) => {
+
+					this.setData(data);
+
+				}).catch((e) => {
+				
+				})
+			},
+			
+			
+			//账号分享
+			sharezz(){
+				var that=this;
+				setTimeout(function() {
+				  that.showfx=true;
+				  console.log("1"+ this.showfx);
+				}, 500); // 2000毫秒后执行
+				
+				loginService.getloginstr(this.inputForm.phone).then(({
+					data
+				}) => {
+					//未登录
+					if(data.Id=='0'){
+						uni.showModal({
+							title: '您无权限分享账号,请联系管!',
+							showCancel: true,
+							success: (res) => {
+								
+							}
+						});
+												
+					}else{
+						
+						this.weixin(data);
+						
+						// const textArea = document.createElement("textarea");
+						// textArea.value = 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/pages/index/index?loginid='+data.Id;
+						// document.body.appendChild(textArea);
+						// textArea.focus();
+						// textArea.select();
+						// try {
+						//   document.execCommand('copy');
+						//   uni.showModal({
+						//   	title: '已将登录链接复制到剪切板,直接打开微信好友粘贴分享!',
+						//   	showCancel: true,
+						//   	success: (res) => {
+						  		
+						//   	}
+						//   });
+						// } catch (err) {
+						//   console.error('Could not copy text', err);
+						//   uni.showModal({
+						//   	title: '当前不支持分享功能!',
+						//   	showCancel: true,
+						//   	success: (res) => {
+						  		
+						//   	}
+						//   });
+						// } finally { 
+						//   document.body.removeChild(textArea); 
+						// }
+					}
+					
+				}).catch((e) => {
+				
+				})
+				
+				
+				
+
+				
+				  
+				
+				
+				
+				
+			},
+			
+			
+			// async initUser() {
+			//       const { data = {} } = await api.fetchUserInfo();
+			//       if (Object.keys(data).length > 0) {
+			//         // 设置用户基本信息
+			//         this.setUser(data);
+			//         const browser = window.navigator.userAgent.toLowerCase();
+			//         //匹配browser中是否含有MicroMessenger字符串
+			//         if (browser.match(/MicroMessenger/i) == "micromessenger") {
+			//           this.weixin(data);
+			//         } else {
+			//           const params = new URLSearchParams(window.location.search);
+			//           const id = params.get("id");
+			//           if (!id || (id && id !== data.uid)) {
+			//             // 如果不是微信浏览器,则跳转页面带id后缀
+			//             const url_a = window.location.origin;
+			//             window.location.href = url_a + "?id=" + data.uid;
+			//           }
+			//         }
+			//       }
+			//     },
+			    async weixin(data) {
+					
+
+			      try {
+
+			        if ( data) {
+			          //微信加签
+			          var obj = {
+			            appId: data.appid,
+			            nonceStr: data.nonceStr,
+			            signature: data.signature,
+			            timestamp: data.timestamp,
+						Id: data.Id,
+			          }
+			          //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去(link的链接可以自己拼,无须与当前页面的后缀参数之类的内容完全一致)
+			          let shareData = {
+			            title: '‘都企供需’线上平台',
+			            desc: '点击直接登录',
+			            imgUrl: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/static/img/titlebg.jpg',
+			            link: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/pages/index/index?loginid='+data.Id + "&t=" + data.timestamp + "&Content=1", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致																		
+						
+			          };
+
+			          //引用
+			          wxShare(obj, shareData);
+					  
+			        } else {
+					  uni.showModal({
+					  	title: '获取sdk参数失败!',
+					  	showCancel: true,
+					  	success: (res) => {
+					  		
+					  	}
+					  });
+			        }
+			      } catch (err) {
+			        //
+			      } finally {
+			        //
+			      }
+			    },
+			
+			
+			setData(data){
+				
+
+				if(data.des2=="1"){
+					data.des2="工业";
+				}else if(data.des2=="2"){
+					data.des2="科技";
+				}else if(data.des2=="3"){
+					data.des2="发改";
+				}else if(data.des2=="4"){
+					data.des2="商务";
+				}else if(data.des2=="5"){
+					data.des2="人才政策";
+				}
+				
+				
+				if(data.des3=="1"){
+					data.des3="国家";
+				}else if(data.des3=="2"){
+					data.des3="省级";
+				}else if(data.des3=="3"){
+					data.des3="市级";
+				}else if(data.des3=="4"){
+					data.des3="区级";
+				}
+				
+				
+				this.inputForm = this.recover(this.inputForm, data)
+				
+				
+				// console.log(this.inputForm.buildingName);
+				// if(this.inputForm.buildingName=='盐都经开区'){
+				// 	this.imgurl="https://miniapp.huidutech.com.cn/yd_qycpfbH5/jin.jpg";
+				// }else if(this.inputForm.buildingName=='盐城高新区'){
+				// 	this.imgurl="https://miniapp.huidutech.com.cn/yd_qycpfbH5/gao.jpg";
+				// }else if(this.inputForm.buildingName=='龙冈产业园'){
+				// 	this.imgurl="https://miniapp.huidutech.com.cn/yd_qycpfbH5/long.jpg";
+					
+				// }
+				
+				// if(this.inputForm.picture!=""){
+				// 	this.inputForm.picture="http://47.97.69.114:8089"+this.inputForm.picture;
+				// }
+				
+				
+				
+			},
+			
+			goToCompany(companyName) {
+				  //https://www.qcc.com/web/search?key=
+					
+				  window.open("https://www.qcc.com/web/search?key="+companyName);
+			      //window.location.href = `https://www.qcc.com/company/${encodeURIComponent(companyName)}`;
+			},
+			
+			call1(){
+				
+				// uni.navigateTo({
+				// 	url: '/pages/index/AudioToWord'
+				// })
+				
+				// uni.navigateTo({
+				// 	url: '/pages/comList/comList'
+				// })
+				
+				//未登录
+				if(this.isLogin==null){
+					uni.showModal({
+						title: '您还未登录,是否跳转登录页面?',
+						showCancel: true,
+						success: (res) => {
+							if (res.confirm) {
+								
+								uni.reLaunch({
+									url: '/pages/login/login'
+								})
+								
+							}
+						}
+					});
+				}else{
+					window.location.href = 'tel:'+this.inputForm.phone;
+				}
+								
+			},
+			
+			call2(){
+				//未登录
+				if(this.isLogin==null){
+					uni.showModal({
+						title: '您还未登录,是否跳转登录页面?',
+						showCancel: true,
+						success: (res) => {
+							if (res.confirm) {
+								
+								uni.reLaunch({
+									url: '/pages/login/login'
+								})
+								
+							}
+						}
+					});
+				}else{
+					window.location.href = 'tel:'+this.inputForm.bz6;
+				}
+			},
+			
+
+
+
+
+
+			
+		}
+	}
+</script>
+<style>
+	/* .file-title) {
+	    font-size: 17px !important;
+	} */
+	input,textarea{
+		color: #8799a3;
+	}
+	
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+	
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+	.show1{
+		background-color: #2752eb;
+		padding-left: 8rpx;
+	}
+	.textbg{
+		display: flex;
+		background-color: white;
+		padding-top: 29rpx;
+	}
+	
+		
+	.text2{
+		flex: 1;
+		color: #000000;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+	}
+	.text22{
+		flex: 1;
+		color: #666666;
+		font-size: 29rpx;
+		padding-bottom: 2rpx;
+	}
+	
+	
+	.text3{
+		display: flex;
+		color: #000000;
+	}
+	.phone{
+		display: flex;
+		color: #1E8AD7;
+		padding-left: 5rpx;
+		padding-right: 5rpx;
+		font-size: 30rpx;
+		align-items: center
+	}
+	.phoneimg{
+		margin-left: 10rpx;
+		width: 35rpx;
+		height: 35rpx;
+	}
+	.titlebg2{
+		display: flex;
+		background-color: white;
+		padding-left: 22rpx;
+		padding-top: 35rpx;
+		padding-bottom: 25rpx;
+		margin-bottom: 2rpx;
+	}
+	.titlet1{
+		width: 7rpx;
+		margin-top: 7rpx;
+		margin-bottom: 7rpx;
+		background-color: #2752eb;
+		margin-right: 8rpx;
+	}
+	.titlet2{
+		font-weight: 800;
+		color: #2752eb;
+	}
+	.overlay{
+	  position: fixed; /* 固定定位,覆盖整个页面 */
+	  top: 0;
+	  left: 0;
+	  width: 100%;
+	  height: 100%;
+	  background-color: rgba(255, 255, 255, 0.5); /* 半透明白色背景 */
+	  z-index: 1000; /* 确保遮罩在页面内容之上 */
+	}
+	
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+	
+	.text1{
+		width: 100%;
+		margin-left: 30rpx;
+		font-size: 28rpx;
+		color: #333;
+		font-weight: bold;
+	}
+	.text2{
+		width: 100%;
+		margin-left: 30rpx;
+		font-size: 28rpx;
+		color: #333;
+	}
+	
+	.text12{
+		width: 100%;
+		margin-left: 30rpx;
+		color: #000000;
+		margin-bottom: 20rpx;
+		font-size: 29rpx;
+	}
+	
+	.img-item {
+		width: 100%;
+		
+	}
+</style>

+ 578 - 0
jp-mobile/pages/policy/policyList.vue

@@ -0,0 +1,578 @@
+<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">涉企政策</view>
+			</view>
+		  </view>
+
+		
+		<view :style="[{top:CustomBar + 'px'}]">
+					
+			
+			<view class="search-box1">
+				<view class="choose-box">
+															
+					<jp-picker2 class="choose-boxp" v-model="searchForm.des2" empty="选择政策类型" rangeKey="label" rangeValue="value"
+						:range="parkList2"  >						
+					</jp-picker2>
+
+					
+				</view>
+				<view class="choose-box">
+																				
+					<jp-picker2 class="choose-boxp" v-model="searchForm.des3" empty="选择政策级别" rangeKey="label" rangeValue="value"
+						:range="parkList"  >
+					</jp-picker2>
+					
+				</view>
+			</view>
+			
+			
+					
+			<view class="choose-box2" style="margin-top: 20rpx;margin-left: 20rpx;margin-right: 20rpx;">
+				<view style="width: 560rpx;">
+					<input type="text"  placeholder="输入政策标题关键词" v-model="searchForm.des1" confirm-type="search"
+					></input>
+				</view>
+				
+				<text style="padding-left: 40rpx;flex: 1;" class="cuIcon-search color-white" @click="doSearch"></text>
+			</view>
+			
+			<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)">
+						
+						
+						<view class="item-title-L">
+							
+							<view class="item-title">
+								{{item.des1}}
+							</view>
+
+							<view class="item-des">									
+								政策发文日期:{{item.stime}}
+							</view>
+						</view>
+						
+
+					</view>
+										
+					
+				</view>
+			</mescroll-body>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniFab from '@/components/uni-fab/uni-fab.vue';
+	import loginService from '@/api/auth/loginService.js'
+	import DoublePicker from '@/components/DoublePicker/DoublePicker.vue'
+	import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
+	import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js";
+	export default {
+		mixins: [MescrollMixin, MescrollMoreItemMixin], // 使用mixin (在main.js注册全局组件)
+		onShow(option) {
+			//this.$auth.checkLogin()
+			
+			
+			this.isLogin=this.$auth.checkisLogin();
+			console.log("是否登录:"+this.isLogin);
+		},
+		components: {
+			uniFab
+		},
+		data() {
+			return {
+				isBack: true, // 是否显示返回按钮
+				backText: '返回', // 返回按钮的文本
+				bgColor: 'bg-blue', // 背景颜色
+				
+				isLogin:"",
+				searchForm: {
+					des1:"",
+					des2:"",
+					des3:"",
+				},
+				picture:["https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg1.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg2.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg3.jpg",
+				"https://miniapp.huidutech.com.cn/yd_qycpfbH5/bg4.jpg"],
+				parkList2: [ {label: '全部',value: ''},{label: '工业',value: '1'},{label: '科技',value: '2'}
+				,{label: '发改',value: '3'},{label: '商务',value: '4'},{label: '人才政策',value: '5'}
+				],
+				curWord: "", //当前搜索关键词
+				dataList: [], // 数据列表
+				modalName: null,
+				tablePage: {
+					total: 0,
+					currentPage: 1,
+					pageSize: 10,
+					orders: []
+				},
+				loading: false,
+				parkId: '',
+				parkList: [{label: '全部',value: ''},{label: '国家',value: '1'},{label: '省级',value: '2'}
+				,{label: '市级',value: '3'},{label: '区级',value: '4'}],
+			}
+		},
+		created() {
+
+			//this.getParkList()
+			//this.getParkList2()			
+		},
+		methods: {
+			
+			// //选择属地
+			// getParkList2() {
+			// 	loginService.getAreaList({
+			// 	}).then(({
+			// 		data
+			// 	}) => {
+			// 		this.parkList2 = data.map((item) => {
+			// 			return {
+			// 				label: item.des1,
+			// 				value: item.des1
+			// 			}
+			// 		})
+			// 	}).catch(e => {
+			// 		console.log(e)
+			// 	})
+			// },
+			
+			//选择行业
+			// getParkList() {
+			// 	loginService.getHyList({
+			// 	}).then(({
+			// 		data
+			// 	}) => {
+			// 		this.parkList = data.map((item) => {
+			// 			return {
+			// 				label: item.industry,
+			// 				value: item.industry
+			// 			}
+			// 		})
+			// 	}).catch(e => {
+			// 		console.log(e)
+			// 	})
+			// },
+			
+			
+			// 新增
+			add() {
+				uni.navigateTo({
+					url: '/pages/comEdit/comEdit'
+				})
+			},
+			// 修改
+			edit(id) {
+				uni.navigateTo({
+					url: '/pages/comEdit/comEdit?id=' + id
+				})
+			},
+			gotoBuildInfo(id) {
+				uni.navigateTo({
+					url: `/pages/policy/policyInfo?id=${id}&ischeck=1`
+				})
+			},
+			// 删除
+			del(id) {
+				uni.showModal({
+					title: '提示',
+					content: '您确认要删除数据吗',
+					showCancel: true,
+					success: (res) => {
+						if (res.confirm) {
+							loginService.deleteCom(id).then(({
+								data
+							}) => {
+								uni.showToast({
+									title: data,
+									icon: "success"
+								})
+								this.doSearch()
+							})
+						}
+					}
+				});
+			},
+			/*获取数据列表 */
+			upCallback(page) {
+				console.log("upCallback")
+				this.loading = true
+				loginService.policyList({
+					current: page.num,
+					size: page.size,
+					orders: [{ column: 'a.create_date', asc: false }],
+					...this.searchForm
+				}).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();
+				})
+			},
+			
+			remoteMethod  (query) {
+			  if (query) {
+			    this.loading = true
+			    setTimeout(() => {
+			      this.loading = false
+			      this.parkList = this.parkList.filter((item) => {
+			        return item.label.toLowerCase().includes(query.toLowerCase())
+			      })
+			    }, 200)
+			  } else {
+			    this.parkList = []
+			  }
+			},
+			
+			// 输入监听
+			inputWord(e) {
+				
+			},
+			// 搜索
+			doSearch() {
+				this.dataList = []; // 先清空列表,显示加载进度
+				this.mescroll.resetUpScroll();
+			},
+			// 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);
+			      console.log('返回按钮被点击');
+			}
+		}
+	}
+</script>
+
+<style>
+	.ellipsis-description {
+		font-size: 12px;
+		line-height: $line-height-base;
+		display: -webkit-box;
+		/*作为弹性伸缩盒子模型显示*/
+		-webkit-line-clamp: 1;
+		/*显示的行数;如果要设置2行加...则设置为2*/
+		overflow: hidden;
+		/*超出的文本隐藏*/
+		text-overflow: ellipsis;
+		/* 溢出用省略号*/
+		-webkit-box-orient: vertical;
+		/*伸缩盒子的子元素排列:从上到下*/
+	}
+
+	.cu-bar .search-form {
+		background-color: white;
+	}
+	
+	
+	
+	
+	.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: 30rpx;
+		color: #333;
+	}
+	
+	.item-name2{
+		font-size: 29rpx;
+		color: #8387AA;
+	}
+	
+	.item-name3{
+		display: flex;
+		width: 100%;
+		padding-right: 30rpx;
+		flex: 1;
+		justify-content: flex-end;
+		font-size: 29rpx;
+		color: #8387AA;
+	}
+	
+	.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: #fff;
+		font-size: 40rpx;
+		line-height: 60rpx;
+	}
+	
+	.search-box{
+		background: #36A7F3;
+		display: flex;
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+		padding-bottom: 10rpx;
+	}
+	
+	.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: 350rpx;
+		border-radius: 30rpx;
+		height: 60rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-right: 20rpx;
+	}
+	
+	.choose-boxp{
+		font-size: 32rpx;
+		width: 80%;
+	}
+	
+	
+	.swiper {
+		width: 750rpx;
+		height: 310rpx;
+	}
+	
+	.swiper-item {
+		width: 750rpx;
+		height: 310rpx;
+		background-color: aliceblue;
+	}
+	
+	
+	
+	
+	.item-box{
+		
+		display: flex;
+		
+		width: 710rpx;
+		margin-left: 20rpx;
+		background: #FFFFFF;
+		box-shadow: 0px 1px 3px 0px rgba(9,2,4,0.1);
+		border-radius: 10px;
+		padding-top: 20rpx;
+		padding-left: 20rpx;
+		padding-right: 10rpx;
+		padding-bottom: 20rpx;
+		margin-top: 20rpx;
+	}
+	
+	.item-title-L{
+		display: flex;
+		width: 100%;
+		margin-left: 10rpx;
+		flex-direction: column;
+	}
+	
+	.item-title{
+		font-size: 29rpx;
+		color: #333;
+		font-weight: bold;
+		align-items: center;
+	}
+	.item-des{
+		margin-top: 10rpx;
+		color: #565656;		
+			
+		font-size: 24rpx;
+		overflow: hidden; /* 超出部分隐藏 */
+		text-overflow: ellipsis; /* 超出部分显示省略号 */
+		display: -webkit-box; /* 使用Webkit的行盒模型 */
+		-webkit-line-clamp: 3; /* 限制最多显示2行 */
+		-webkit-box-orient: vertical; /* 垂直排列 */
+		
+	}
+	/* 返回 */
+	.item-img {
+		width: 160rpx;
+		height: 160rpx;
+	}
+	
+	.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; /* 返回按钮文本颜色 */
+	}
+	.back-text {
+	  color: white; /* 返回按钮文本颜色 */
+	}
+	
+	.content-container {
+	  flex: 1;
+	  text-align: center;
+	}
+	
+	.content-text {
+	  color: white; /* 标题文本颜色 */
+	  font-weight: bold;
+	}
+	
+	/* 背景颜色 */
+	.bg-blue {
+	  background-color: #4285f4; /* 假设这是一个蓝色背景 */
+	}
+	
+	.choose-box2{
+		background: #fff;
+		width: 94%;
+		border-radius: 23rpx;
+		height: 70rpx;
+		display: flex;
+		padding-left: 29rpx;
+		align-items: center;
+		border: 1rpx  solid #808080;
+	}
+	
+	.choose-box3{
+		display: flex;
+	}
+	
+	.search-box1{
+		display: flex;
+		margin-top: 20rpx;
+		margin-left: 20rpx;
+		margin-right: 12rpx;
+	}
+	
+	
+	
+	.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;
+	}
+	.color-white{
+		color: #808080;
+		font-size: 40rpx;
+		line-height: 60rpx;
+	}
+</style>

+ 9 - 9
jp-mobile/pages/product/productAdd.vue

@@ -89,13 +89,13 @@
 					des4: '',
 					des6: '',			
 				},
-				t1: '产品名称',
-				t1s: '请填写产品名称',
-				t2: '产品产能',
-				t2s: '请填写产品产能',
+				t1: '可供产品',
+				t1s: '请填写可供产品',
+				t2: '可供数量',
+				t2s: '请填写可供数量',
 				t3: '详细描述',
 				t3s: '请填写详细描述',
-				
+								
 				autoUpload: false,
 				picLists: [],
 				picUrl: [],
@@ -169,10 +169,10 @@
 			
 			bindPickerChange: function(e) {
 				if(e.detail.value==0){
-					this.t1='产品名称';
-					this.t1s= '请填写产品名称';
-					this.t2= '产品产能';
-					this.t2s= '请填写产品产能';
+					this.t1='可供产品';
+					this.t1s= '请填写可供产品';
+					this.t2= '可供数量';
+					this.t2s= '请填写可供数量';
 				}else{
 					this.t1='需求名称';
 					this.t1s= '请填写需求名称';

+ 49 - 15
jp-mobile/pages/product/productInfo.vue

@@ -15,14 +15,19 @@
 		  </view>
 
 			
-		<swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
+		<!-- <swiper class="swiper" circular :indicator-dots="true" :autoplay="true" :interval="3000" :duration="800">
 		  <swiper-item v-for="(item, index) in swiperList" :key="index">
 		    <image :src="item.url" class="swiper-item"></image>
 		  </swiper-item>
-		</swiper>
+		</swiper> -->
 		
 		<form class="cu-list menu">
 			
+			<view class="titlebg2">
+				<view class="titlet1" ></view>
+				<view class="titlet2" >发布企业</view>								
+			</view>
+			
 			<view class="show1">
 				
 				<view class="textbg">
@@ -38,7 +43,7 @@
 					<view class="text1">
 						 供需类型
 					</view>
-					<view class="text2" >
+					<view class="text2" :class="inputForm.des1 === '需' ? 'text33' : 'text44'" >
 						 {{inputForm.des1}}
 					</view>				
 				</view>
@@ -86,6 +91,17 @@
 				</view>				
 			</view>
 			
+			<view style="height: 30rpx;background-color: white;"></view>
+			
+			<view class="titlebg2" v-if="swiperList.length>0" >
+				<view class="titlet1" ></view>
+				<view class="titlet2" >图文详情</view>								
+			</view>
+			
+			<view v-for="(item, index) in swiperList" :key="index" style="width: 100%;">
+				<image :src="item.url"  mode="widthFix" style="width: 100%;" >					
+				</image>
+			</view>
 			
 
 					
@@ -114,9 +130,7 @@
 			    backText: '返回', // 返回按钮的文本
 			    bgColor: 'bg-blue', // 背景颜色
 				autoUpload: false,
-				swiperList: [
-				        // 可以继续添加更多图片
-				      ],
+				swiperList: [],
 				inputForm: {
 					id: '',
 					name: '',
@@ -323,7 +337,7 @@
 			          }
 			          //分享数据,这段主要是为了在hash模式下分享出去的链接不被浏览器截取,保证完全把链接分享出去(link的链接可以自己拼,无须与当前页面的后缀参数之类的内容完全一致)
 			          let shareData = {
-			            title: '盐都区工业企业产品发布平台',
+			            title: '‘都企供需’线上平台',
 			            desc: '点击直接登录',
 			            imgUrl: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/static/img/titlebg.jpg',
 			            link: 'https://miniapp.huidutech.com.cn/yd_qycpfbH5/#/pages/index/index?loginid='+data.Id + "&t=" + data.timestamp + "&Content=1", // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致																		
@@ -354,9 +368,9 @@
 				this.inputForm = this.recover(this.inputForm, data)
 				
 				
-				if(this.inputForm=='供'){
-					this.t1='产品名称';
-					this.t2= '产品产能';
+				if(this.inputForm.des1=='供'){
+					this.t1='可供产品';
+					this.t2= '可供数量';
 				}else{
 					this.t1='需求名称';
 					this.t2= '需求数量';
@@ -364,12 +378,17 @@
 				
 				
 				let pics=this.inputForm.des6.split(",");
-				
+				console.log(pics)
 				pics.forEach(item => {
-					this.swiperList.push({
-						'url': "http://47.97.69.114:8089/yd_qycpfbWeb/"+item,
-					})
+					if(item!=''){
+						this.swiperList.push({
+							'url': "http://47.97.69.114:8089/yd_qycpfbWeb/"+item,
+						})
+					}
+					
 				})
+				
+				console.log(this.swiperList)
 
 			},
 			
@@ -487,6 +506,22 @@
 		font-size: 30rpx;
 		padding-bottom: 2rpx;
 	}
+	
+	.text33{
+		flex: 1;
+		color: #FF4500;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+	}
+	
+	.text44{
+		flex: 1;
+		color: #2E8B57;
+		font-size: 30rpx;
+		padding-bottom: 2rpx;
+		
+	}
+	
 	.text22{
 		flex: 1;
 		color: #666666;
@@ -496,7 +531,6 @@
 	
 	.text221{
 		flex: 1;
-		min-height: 700rpx;
 		color: #666666;
 		font-size: 29rpx;
 		padding-right:15rpx ;

BIN
jp-mobile/static/img/cd1.png


BIN
jp-mobile/static/img/cd2.png


BIN
jp-mobile/static/img/cd3.png


BIN
jp-mobile/static/img/dcl.png


BIN
jp-mobile/static/img/dzfkb.png


BIN
jp-mobile/static/img/gxdj.png


BIN
jp-mobile/static/img/icon8.png


BIN
jp-mobile/static/img/jyqk.png


BIN
jp-mobile/static/img/laba.png


BIN
jp-mobile/static/img/qyqkMessage.png


BIN
jp-mobile/static/img/visitBannar.png


BIN
jp-mobile/static/img/workBenchBannar.jpg


BIN
jp-mobile/static/img/workBenchBannar.png


BIN
jp-mobile/static/img/wtfk.png


BIN
jp-mobile/static/img/wtfkMessage.png