办事进度- 新
This commit is contained in:
		| @@ -1,43 +1,38 @@ | ||||
| <template> | ||||
|   <div class="progressNew"> | ||||
|     <div class="items" @click="goList(0)"> | ||||
|       <div class="tops"> | ||||
|         <span class="titles">民政类</span> | ||||
|  | ||||
|         <u-icon name="arrow-right"></u-icon> | ||||
|   <div class="progressList"> | ||||
|     <div class="search"> | ||||
|       <div class="search-container"> | ||||
|         <i class="iconfont"></i> | ||||
|         <input placeholder="请输入需要搜索的内容" placeholder-style="color:rgba(255,255,255,0.5)" v-model="param" @confirm="reset" :focus="focus" confirm-type="search" /> | ||||
|       </div> | ||||
|  | ||||
|       <div class="bottoms">低保、医疗救助、大病救助、临时救助低保、医疗救助、大病救助、临时救助</div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="items" @click="goList(1)"> | ||||
|       <div class="tops"> | ||||
|         <span class="titles">劳动保障类</span> | ||||
|  | ||||
|         <u-icon name="arrow-right"></u-icon> | ||||
|     <div class="progressList-list"> | ||||
|       <div class="item" v-for="(item, index) in list" :key="index" hover-class="bg-hover" @click="$linkTo('./progressDetail?id=' + item.id)"> | ||||
|         <div class="top"> | ||||
|           <h2>{{ item.processDefName }}</h2> | ||||
|           <!-- <AiIcon class="progressList-icon" :icon="iconList[item.approvalStatus]" size="56"></AiIcon> --> | ||||
|           <div class="item-info"> | ||||
|             <span>申请类型</span> | ||||
|             <div>{{ item.classificationName }}</div> | ||||
|           </div> | ||||
|           <div class="item-info"> | ||||
|             <span>申请日期</span> | ||||
|             <div>{{ item.createTime }}</div> | ||||
|           </div> | ||||
|           <div class="item-info"> | ||||
|             <span>完成日期</span> | ||||
|             <div>{{ item.overTime || '-' }}</div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="bottom"> | ||||
|           <em :style="{ background: mapColor(item.approvalStatus) }"></em> | ||||
|           <span :style="{ color: mapColor(item.approvalStatus) }">{{ $dict.getLabel('approvalStatus', item.approvalStatus) }}</span> | ||||
|         </div> | ||||
|       </div> | ||||
|       <AiEmpty v-if="!list.length"></AiEmpty> | ||||
|  | ||||
|       <div class="bottoms">养老保险、社保补贴、就业创业登记证</div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="items" @click="goList(2)"> | ||||
|       <div class="tops"> | ||||
|         <span class="titles">计划生育类</span> | ||||
|  | ||||
|         <u-icon name="arrow-right"></u-icon> | ||||
|       </div> | ||||
|  | ||||
|       <div class="bottoms">生育登记、独生子女扶助、生育抚恤金</div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="items" @click="goList(3)"> | ||||
|       <div class="tops"> | ||||
|         <span class="titles">残疾类</span> | ||||
|  | ||||
|         <u-icon name="arrow-right"></u-icon> | ||||
|       </div> | ||||
|  | ||||
|       <div class="bottoms">残疾证办理、困难生活补贴、燃油补贴</div> | ||||
|       <!-- <u-loadmore :status="loadingStatus" :margin-top="30" :margin-bottom="30" color="#999" font-size="26"/> --> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| @@ -45,67 +40,215 @@ | ||||
| <script> | ||||
| export default { | ||||
|   name: 'AppProgressNew', | ||||
|   appName: '办事指南-新', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   appName: '办事进度-新', | ||||
|   data() { | ||||
|     return { | ||||
|       id: '', | ||||
|       title: '', | ||||
|       subTitle: '', | ||||
|       current: 0, | ||||
|       focus: false, | ||||
|       param: '', | ||||
|       list: [], | ||||
|       loadingStatus: 'loadmore', | ||||
|       iconList: { | ||||
|         0: 'icon1', | ||||
|         1: 'icon2', | ||||
|         2: 'icon3', | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: {}, | ||||
|   onLoad() { | ||||
|     this.getList() | ||||
|  | ||||
|   onLoad(query) { | ||||
|     if (query.focus === '1') { | ||||
|       this.focus = true | ||||
|     } | ||||
|     this.id = query.id | ||||
|     this.title = query.title | ||||
|     this.subTitle = query.subTitle | ||||
|     this.$dict.load(['approvalStatus']).then(() => { | ||||
|       this.getList() | ||||
|     }) | ||||
|   }, | ||||
|   onShow() {}, | ||||
|  | ||||
|   methods: { | ||||
|     reset() { | ||||
|       this.current = 0 | ||||
|       this.loadingStatus = 'loading' | ||||
|  | ||||
|       this.$nextTick(() => { | ||||
|         this.getList() | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     mapColor(status) { | ||||
|       return { | ||||
|         0: '#FF883C', | ||||
|         1: '#42D784', | ||||
|         2: '#FF4466', | ||||
|       }[status] | ||||
|     }, | ||||
|  | ||||
|     getList() { | ||||
|       if (this.loadingStatus === 'nomore') return | ||||
|  | ||||
|       this.loadingStatus = 'loading' | ||||
|       this.$instance | ||||
|         .post('/app/appconvenientaddressbook/list', null, { | ||||
|         .post(`/app/approv-alapply-info/xcx-list`, null, { | ||||
|           params: { | ||||
|             size: 999, | ||||
|             current: this.current + 1, | ||||
|             size: 10, | ||||
|             param: this.param, | ||||
|           }, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             this.list = res.data.records | ||||
|           if (res.code === 0) { | ||||
|             if (!res.data.records.length) { | ||||
|               if (this.current === 0) this.list = [] | ||||
|               this.loadingStatus = 'nomore' | ||||
|               return false | ||||
|             } | ||||
|  | ||||
|             const data = res.data.records.map((item) => { | ||||
|               return item | ||||
|             }) | ||||
|             if (this.current === 0) this.list = [] | ||||
|  | ||||
|             this.list.push(...data) | ||||
|  | ||||
|             this.current = this.current + 1 | ||||
|             this.loadingStatus = 'loadmore' | ||||
|  | ||||
|             if (this.list.length < 10) { | ||||
|               this.loadingStatus = 'nomore' | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|     goList(index) { | ||||
|       this.$linkTo(`./list?index=${index}`) | ||||
|     }, | ||||
|   onReachBottom() { | ||||
|     this.getList() | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .progressNew { | ||||
|   height: 100%; | ||||
|   padding: 0 32px; | ||||
|   .items { | ||||
|     padding: 0 32px; | ||||
|     background: #fff; | ||||
|     margin-top: 24px; | ||||
|     box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.02); | ||||
|     border-radius: 8px; | ||||
|     .tops { | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|       align-items: center; | ||||
|       box-shadow: inset 0px -1px 0px 0px #eeeeee; | ||||
|       .titles { | ||||
|         padding: 32px 0 30px 0; | ||||
|         font-size: 36px; | ||||
|         font-weight: 500; | ||||
| div, | ||||
| label, | ||||
| i, | ||||
| view { | ||||
|   box-sizing: border-box; | ||||
| } | ||||
|  | ||||
| .progressList { | ||||
|   padding-bottom: 40px; | ||||
| } | ||||
|  | ||||
| .search { | ||||
|   position: fixed; | ||||
|   top: 0; | ||||
|   left: 0; | ||||
|   z-index: 11; | ||||
|   width: 100%; | ||||
|   height: 104px; | ||||
|   padding: 20px 32px; | ||||
|   box-sizing: border-box; | ||||
|   background: #4181ff; | ||||
|  | ||||
|   .search-container { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 64px; | ||||
|     padding: 032px; | ||||
|     border-radius: 32px; | ||||
|     background: rgba(0, 0, 0, 0.2); | ||||
|  | ||||
|     i { | ||||
|       padding-right: 12px; | ||||
|       font-size: 32px; | ||||
|       color: rgba(255, 255, 255, 0.5); | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|       flex: 1; | ||||
|       font-size: 26px; | ||||
|       color: #ffffff; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .progressList-list { | ||||
|   padding-top: 104px; | ||||
|  | ||||
|   .item { | ||||
|     position: relative; | ||||
|     width: 686px; | ||||
|     margin: 24px auto 0; | ||||
|     background: #ffffff; | ||||
|     border-radius: 16px; | ||||
|  | ||||
|     .top { | ||||
|       box-sizing: border-box; | ||||
|       padding: 32px; | ||||
|       border-bottom: 1px solid #dddddd; | ||||
|  | ||||
|       .progressList-icon { | ||||
|         position: absolute; | ||||
|         top: 0; | ||||
|         right: 0; | ||||
|         font-size: 56px; | ||||
|       } | ||||
|  | ||||
|       .item-info { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|         line-height: 42px; | ||||
|         margin-bottom: 8px; | ||||
|  | ||||
|         span { | ||||
|           color: #999999; | ||||
|           font-size: 26px; | ||||
|           line-height: 36px; | ||||
|           margin-right: 32px; | ||||
|         } | ||||
|  | ||||
|         div { | ||||
|           color: #343d65; | ||||
|           font-size: 30px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         margin-bottom: 24px; | ||||
|         padding-right: 56px; | ||||
|         color: #333333; | ||||
|         font-size: 32px; | ||||
|         text-align: justify; | ||||
|         font-weight: 600; | ||||
|       } | ||||
|     } | ||||
|     .bottoms { | ||||
|       font-size: 28px; | ||||
|       color: #666666; | ||||
|       padding: 16px 0 32px 0; | ||||
|  | ||||
|     .bottom { | ||||
|       height: 104px; | ||||
|       background: #ffffff; | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       padding-left: 32px; | ||||
|  | ||||
|       & > em { | ||||
|         width: 8px; | ||||
|         height: 8px; | ||||
|         border-radius: 50%; | ||||
|         background: #ff883c; | ||||
|         margin-right: 8px; | ||||
|       } | ||||
|  | ||||
|       & > span { | ||||
|         font-size: 28px; | ||||
|         font-weight: 400; | ||||
|         color: #ff883c; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -1,59 +0,0 @@ | ||||
| <template> | ||||
|   <div class="details"> | ||||
|     <div class="titles">城乡居民最低生活保障待遇</div> | ||||
|  | ||||
|     <div class="types">民政类</div> | ||||
|  | ||||
|     <div class="conts"> | ||||
|       为了推进我村民主法治建设,维护社会稳定,促进经济发展,规范村民清洁乡村卫生行为,改善村容村貌,推进“生态乡村”建设,树立良好的民风、村风,创造安居乐业的社会环境,经全体村民代表讨论通过,制定本村规民约。 一、社会治安 1.村民要学法、知法、守法、自觉维护法律尊严,积极同一切违法犯罪行为作斗争。 2.村民之间应团结友爱,和睦相处,不打架斗殴,不酗酒滋事,严禁侮辱、诽谤他人,严禁造谣惑众、拨弄是非。 3自觉维护社会秩序和公共安全,不扰乱公共秩序,不阻碍公务人员执行公务。二、消防安全违反上述规定的给予批评教育,公开检讨书,情节严重的交上级有关部门或提交司法处理。为了推进我村民主法治建设,维护社会稳定,促进经济发展,规范村民清洁乡村卫生行为,改善村容村貌,推进“生态乡村”建设,树立良好的民风、村风,创造安居乐业的社会环境,经全体村民代表讨论通过,制定本村规民约。 一、社会治安 | ||||
|       1.村民要学法、知法、守法、自觉维护法律尊严,积极同一切违法犯罪行为作斗争。 2.村民之间应团结友爱,和睦相处,不打架斗殴,不酗酒滋事,严禁侮辱、诽谤他人,严禁造谣惑众、拨弄是非。 3自觉维护社会秩序和公共安全,不扰乱公共秩序,不阻碍公务人员执行公务。二、消防安全违反上述规定的给予批评教育,公开检讨书,情节严重的交上级有关部门或提交司法处理。 | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'detail', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   data() { | ||||
|     return {} | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: {}, | ||||
|   onLoad() { | ||||
|     this.getDetail() | ||||
|   }, | ||||
|   onShow() {}, | ||||
|   methods: { | ||||
|     getDetail() { | ||||
|       var ids = 'f16e54058cab4099bf3ee6e03e750b93' | ||||
|       this.$instance.post(`/app/appvillageactivityinfo/queryDetailById?id=${ids}`).then((res) => { | ||||
|         if (res.code == 0) { | ||||
|           this.detail = res.data | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .details { | ||||
|   padding: 32px 32px 48px 32px; | ||||
|   .titles { | ||||
|     font-size: 48px; | ||||
|     font-weight: 600; | ||||
|   } | ||||
|   .types { | ||||
|     margin-top: 16px; | ||||
|     font-size: 30px; | ||||
|     color: #999999; | ||||
|   } | ||||
|   .conts { | ||||
|     margin-top: 64px; | ||||
|     font-size: 36px; | ||||
|     line-height: 1.7; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -1,53 +0,0 @@ | ||||
| <template> | ||||
|   <div class="lists"> | ||||
|     <div class="conts" @click="goDetail(0)">城乡居民最低生活保障待遇</div> | ||||
|  | ||||
|     <div class="conts">城乡居民医疗救助</div> | ||||
|  | ||||
|     <div class="conts">城市居民大病救助</div> | ||||
|  | ||||
|     <div class="conts">临时救助</div> | ||||
|  | ||||
|     <div class="conts">困境儿童申报</div> | ||||
|  | ||||
|     <div class="conts">孤儿申报</div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'list', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   data() { | ||||
|     return { | ||||
|       id: '', | ||||
|       detail: [], | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: {}, | ||||
|   onLoad() {}, | ||||
|   onShow() {}, | ||||
|   methods: { | ||||
|     goDetail(indexs) { | ||||
|       this.$linkTo(`./detail?index=${indexs}`) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .lists { | ||||
|   height: 100%; | ||||
|   padding: 0 32px; | ||||
|   .conts { | ||||
|     background: #ffffff; | ||||
|     box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.02); | ||||
|     border-radius: 8px; | ||||
|     padding: 34px 32px; | ||||
|     font-size: 32px; | ||||
|     margin-top: 24px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										744
									
								
								src/mods/AppProgressNew/progressDetail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										744
									
								
								src/mods/AppProgressNew/progressDetail.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,744 @@ | ||||
| <template> | ||||
|   <div class="progressDetail" v-if="pageShow"> | ||||
|     <div class="status" v-if="info.approvalStatus === '1'"> | ||||
|       <h2>审批通过:</h2> | ||||
|       <div class="status-content"> | ||||
|         <span>[{{ info.processDefName }}]已签署完成,</span> | ||||
|         <i @click="$linkTo('./progressAnnex?img=' + info.pdfPicFile.url + '&name=' + info.processDefName)">点击查看和保存</i> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="info"> | ||||
|       <h2 :style="{ maxWidth: info.approvalStatus !== '1' ? '100%' : '550rpx' }">{{ info.processDefName }}</h2> | ||||
|       <AiIcon class="info-status" v-if="info.approvalStatus === '1'" size="96" icon="iconsp-pass"></AiIcon> | ||||
|       <div class="info-user"> | ||||
|         <image v-if="info.createUserAvatar" :src="info.createUserAvatar" /> | ||||
|         <span v-else>{{ nameAvatar(info.createUserName) }}</span> | ||||
|         <div class="inf-user__right flex1"> | ||||
|           <h2>{{ info.createUserName }}</h2> | ||||
|           <p>{{ info.createTime }}</p> | ||||
|         </div> | ||||
|         <i :style="{ color: mapStatusColor(info.approvalStatus) }" v-if="info.approvalStatus !== '1'">{{ $dict.getLabel('approvalStatus', info.approvalStatus) }}</i> | ||||
|       </div> | ||||
|       <div class="info-list"> | ||||
|         <div class="info-item"> | ||||
|           <span>所属类型:</span> | ||||
|           <div>{{ info.classificationName || '-' }}</div> | ||||
|         </div> | ||||
|         <div class="info-item"> | ||||
|           <span>所属部门:</span> | ||||
|           <div>{{ $dict.getLabel('hbDepartment', info.department) || '-' }}</div> | ||||
|         </div> | ||||
|         <div class="info-item"> | ||||
|           <span>审批编号:</span> | ||||
|           <div>{{ info.serialNumber }}</div> | ||||
|         </div> | ||||
|         <div class="info-item"> | ||||
|           <span>附件资料:</span> | ||||
|           <div v-if="!!info.annexs && info.annexs.length"> | ||||
|             <div class="imgs" v-for="(item, index) in info.annexs" :key="index"> | ||||
|               <img :src="item.annexFile.url" mode="aspectFill" @click="preview(info.annexs, item.annexFile.url)" /> | ||||
|               <span>{{ item.annexName }}</span> | ||||
|             </div> | ||||
|           </div> | ||||
|           <div v-else>暂无附件</div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="detail"> | ||||
|       <div class="detail-tab"> | ||||
|         <div @click="currIndex = 0" :class="[currIndex === 0 ? 'active' : '']">申请表单</div> | ||||
|         <div @click="currIndex = 1" :class="[currIndex === 1 ? 'active' : '']">流程信息</div> | ||||
|       </div> | ||||
|       <!--申请表单--> | ||||
|       <div class="detail-form" v-if="currIndex == 0"> | ||||
|         <div class="detail-form__item" v-for="(item, index) in tableForm" :key="index"> | ||||
|           <div class="detail-form__item--title" @click="showMore(index)"> | ||||
|             <div class="left"> | ||||
|               <span></span> | ||||
|               <h2>{{ item[0].groupName }}</h2> | ||||
|             </div> | ||||
|             <i class="iconfont" :class="[index === formIndex ? 'title-active' : '']"></i> | ||||
|           </div> | ||||
|           <div class="detail-form__item--list" v-show="index === formIndex"> | ||||
|             <div class="detail-form__item--info" v-for="(field, i) in item" :key="i"> | ||||
|               <h2>{{ field.fieldName }}{{ field.fieldNameSuffix || '' }}</h2> | ||||
|               <span v-if="!field.dictionaryCode">{{ field.fieldValue || '-' }}</span> | ||||
|               <span v-if="field.dictionaryCode && field.fieldDataType !== '5'">{{ $dict.getLabel(field.dictionaryCode, field.fieldValue) || '-' }}</span> | ||||
|               <span v-if="field.dictionaryCode && field.fieldDataType === '5'">{{ getDictValue(field.dictionaryCode, field.fieldValue) }}</span> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <!--流程信息--> | ||||
|       <div class="detail-list" v-if="currIndex == 1"> | ||||
|         <div class="step-item" v-for="(item, index) in stepList" :key="index"> | ||||
|           <div class="line"></div> | ||||
|           <div class="detail-left"> | ||||
|             <image class="avatar" v-if="item.stepAvatar && item.userName" :src="item.stepAvatar" /> | ||||
|             <span v-if="!item.stepAvatar && item.userName">{{ item.userName.substr(item.userName.length - 2) }}</span> | ||||
|             <image v-if="index !== 0 && item.candidates && item.candidates.length > 1" class="detail-left__statusicon" src="/static/img/notice.png" /> | ||||
|             <image class="avatar" v-if="index !== 0 && item.candidates && item.candidates.length === 1 && item.candidates[0].avatar" :src="item.candidates[0].avatar" /> | ||||
|             <span v-if="index !== 0 && item.candidates && item.candidates.length === 1 && !item.candidates[0].avatar">{{ item.candidates[0].name.substr(item.candidates[0].name - 2) }}</span> | ||||
|             <image class="detail-left__icon" src="/static/img/gou.png" v-if="index === 0 || ['0', '1', '6', '5'].indexOf(item.stepType) > -1" /> | ||||
|             <image class="detail-left__icon" src="/static/img/point.png" v-else-if="item.stepType !== '2'" /> | ||||
|           </div> | ||||
|           <div class="detail-right"> | ||||
|             <div class="detail-right__title"> | ||||
|               <h2>{{ item.title }}</h2> | ||||
|               <span v-if="item.approvalTime">{{ item.approvalTime }}</span> | ||||
|             </div> | ||||
|             <div class="detail-right__subtitle" v-if="item.stepType === '0'"> | ||||
|               <span>{{ item.userName || '-' }}</span> | ||||
|               <i>({{ stepTypeList[item.stepType] }})</i> | ||||
|             </div> | ||||
|             <div class="detail-right__subtitle" v-else-if="item.stepType !== '2'"> | ||||
|               <span>{{ item.title2 }}</span> | ||||
|               <i v-if="item.title2Desc" :style="{ color: mapColor(item.stepType) }">{{ item.title2Desc }}</i> | ||||
|             </div> | ||||
|             <div class="detail-right__subtitle" v-else-if="item.stepType === '2'"> | ||||
|               <span>{{ item.title2 }} </span> | ||||
|               <i style="color: #f14242"> {{ item.title2Desc }}</i> | ||||
|             </div> | ||||
|             <div class="detail-right__subtitle" v-if="item.stepType === '2'"> | ||||
|               <span>审批意见</span> | ||||
|               <i style="color: #f14242">{{ item.opinion || '-' }}</i> | ||||
|             </div> | ||||
|             <div class="detail-right__subtitle detail-right__text" style="display: block" v-if="item.candidateFieldInfos && item.candidateFieldInfos.length" v-for="(candidateField, z) in item.candidateFieldInfos" :key="z"> | ||||
|               <span>{{ candidateField.fieldName }}</span> | ||||
|               <i style="color: #343d65; display: contents">{{ candidateField.dictionaryCode ? $dict.getLabel(candidateField.dictionaryCode, candidateField.fieldValue) || '-' : candidateField.fieldValue || '-' }}</i> | ||||
|             </div> | ||||
|             <div class="detail-right__imgs" v-if="item.pictureFiles && item.pictureFiles.length"> | ||||
|               <image :src="img.url" mode="aspectFill" v-for="(img, i) in item.pictureFiles" :key="i" @click="previewPic(item.pictureFiles, img.url)" /> | ||||
|             </div> | ||||
|             <div class="detail-right__doc" v-if="item.annexFiles && item.annexFiles.length"> | ||||
|               <div class="doc-item" v-for="(file, j) in item.annexFiles" :key="j" @click="saveFile(file)"> | ||||
|                 <h2>{{ file.name }}</h2> | ||||
|                 <span>{{ (file.size / 1024).toFixed(2) }}KB</span> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="detail-right__userlist" v-if="item.candidates && item.candidates.length"> | ||||
|               <div class="detail-right__userinfo" v-for="(user, z) in item.candidates" :key="z"> | ||||
|                 <image v-if="user.avatar" :src="user.avatar" /> | ||||
|                 <span v-else>{{ user.name.substr(user.name.length - 2) }}</span> | ||||
|                 <h2>{{ user.name }}</h2> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       title: '', | ||||
|       currIndex: 0, | ||||
|       id: '', | ||||
|       info: {}, | ||||
|       formIndex: 0, | ||||
|       tableForm: [], | ||||
|       pageShow: false, | ||||
|       nodeApprovalStatusList: { | ||||
|         0: '待审批', | ||||
|         1: '审批通过', | ||||
|         2: '审批驳回', | ||||
|       }, | ||||
|       stepTypeList: { | ||||
|         0: '发起', | ||||
|         1: '审批通过', | ||||
|         2: '审批拒绝', | ||||
|         3: '抄送', | ||||
|         4: '转办审批中', | ||||
|         5: '转办审批同意', | ||||
|         6: '转办审批拒绝', | ||||
|         7: '发起人撤回', | ||||
|         8: '待审批', | ||||
|         9: '未到达该节点', | ||||
|       }, | ||||
|       stepList: [], | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   onLoad(query) { | ||||
|     this.id = query.id | ||||
|     this.getInfo(query.id) | ||||
|   }, | ||||
|   methods: { | ||||
|     showMore(index) { | ||||
|       if (index === this.formIndex) { | ||||
|         this.formIndex = -1 | ||||
|       } else { | ||||
|         this.formIndex = index | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     mapStatusColor(status) { | ||||
|       return { | ||||
|         0: '#FF9B2B', | ||||
|         1: '#3078E1', | ||||
|         2: '#F14242', | ||||
|       }[status] | ||||
|     }, | ||||
|  | ||||
|     mapColor(status) { | ||||
|       if (status === '1') { | ||||
|         return '#2EA222' | ||||
|       } | ||||
|  | ||||
|       if (status === '2' || status === '6' || status === '7') { | ||||
|         return '#F14242' | ||||
|       } | ||||
|  | ||||
|       return '#FF8822' | ||||
|     }, | ||||
|  | ||||
|     saveFile(file) { | ||||
|       if (['.png', '.jpg', '.jpeg'].indexOf(file.postfix) > -1) { | ||||
|         uni.previewImage({ | ||||
|           urls: [file.url], | ||||
|           current: file.url, | ||||
|         }) | ||||
|  | ||||
|         return false | ||||
|       } | ||||
|  | ||||
|       uni.downloadFile({ | ||||
|         url: file.url, | ||||
|         success: (res) => { | ||||
|           const filePath = res.tempFilePath | ||||
|           this.$hideLoading() | ||||
|           wx.openDocument({ | ||||
|             filePath: filePath, | ||||
|             success: function (res) { | ||||
|               console.log('打开文档成功') | ||||
|             }, | ||||
|           }) | ||||
|         }, | ||||
|         fail: () => { | ||||
|           this.$hideLoading() | ||||
|           this.$toast('保存失败') | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     previewPic(imgList, img) { | ||||
|       uni.previewImage({ | ||||
|         urls: imgList.map((v) => v.url), | ||||
|         current: img, | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     preview(imgList, img) { | ||||
|       uni.previewImage({ | ||||
|         urls: imgList.map((v) => v.annexFile.url), | ||||
|         current: img, | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     getDictValue(dictKey, value) { | ||||
|       return value | ||||
|         .split(',') | ||||
|         .map((item) => { | ||||
|           return this.$dict.getLabel(dictKey, item) | ||||
|         }) | ||||
|         .join(',') | ||||
|     }, | ||||
|  | ||||
|     getInfo(id) { | ||||
|       this.$loading() | ||||
|       this.$instance.post(`/app/approv-alapply-info/info-id-table?id=${id}`).then((res) => { | ||||
|         if (res.code === 0) { | ||||
|           const groupFormIds = this.unique(res.data.tableInfo.tableFieldInfos.filter((v) => v.fieldType !== '1').map((v) => v.groupIndex)) | ||||
|           const dictKeys = res.data.tableInfo.tableFieldInfos.filter((v) => !!v.dictionaryCode).map((v) => v.dictionaryCode) | ||||
|           this.$dict.load([...dictKeys, 'hbDepartment', 'nodeApprovalStatus', 'nodeType']).then(() => { | ||||
|             this.info = res.data | ||||
|             this.$instance.post(`/app/approv-alapply-info/processinfo-id2?id=${id}`).then((res) => { | ||||
|               if (res.code === 0) { | ||||
|                 let dictKeys = [] | ||||
|                 res.data.forEach((item) => { | ||||
|                   if (item.candidateFieldInfos && item.candidateFieldInfos.length) { | ||||
|                     item.candidateFieldInfos.forEach((v) => { | ||||
|                       v.dictionaryCode && dictKeys.push(v.dictionaryCode) | ||||
|                     }) | ||||
|                   } | ||||
|                 }) | ||||
|  | ||||
|                 if (dictKeys.length) { | ||||
|                   this.$dict.load([...dictKeys]).then(() => { | ||||
|                     this.stepList = res.data | ||||
|                   }) | ||||
|                 } else { | ||||
|                   this.stepList = res.data | ||||
|                 } | ||||
|               } | ||||
|             }) | ||||
|             this.pageShow = true | ||||
|           }) | ||||
|           this.tableForm = groupFormIds.map((index) => { | ||||
|             return res.data.tableInfo.tableFieldInfos.filter((v) => v.fieldType !== '1' && v.groupIndex === index) | ||||
|           }) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * 数组去重 | ||||
|      */ | ||||
|     unique(arr) { | ||||
|       return arr.filter((item, index) => { | ||||
|         return arr.indexOf(item, 0) === index | ||||
|       }) | ||||
|     }, | ||||
|     nameAvatar(name) { | ||||
|       return name?.split('')?.slice(-2) || '游客' | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| div, | ||||
| label, | ||||
| i, | ||||
| view { | ||||
|   box-sizing: border-box; | ||||
| } | ||||
|  | ||||
| .progressDetail { | ||||
|   padding-bottom: 40px; | ||||
| } | ||||
|  | ||||
| .ellipsis { | ||||
|   overflow: hidden; | ||||
|   white-space: nowrap; | ||||
|   text-overflow: ellipsis; | ||||
| } | ||||
|  | ||||
| .detail-list { | ||||
|   padding: 40px 32px; | ||||
| } | ||||
|  | ||||
| .step-item { | ||||
|   display: flex; | ||||
|   position: relative; | ||||
|   padding-bottom: 88px; | ||||
|  | ||||
|   &:last-child { | ||||
|     padding-bottom: 0; | ||||
|  | ||||
|     .line { | ||||
|       display: none; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .detail-right__doc { | ||||
|     padding-top: 8px; | ||||
|  | ||||
|     .doc-item { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       margin-bottom: 16px; | ||||
|       padding: 16px; | ||||
|       background: #f7f7f7; | ||||
|       border-radius: 4px; | ||||
|       border: 1px solid #dddddd; | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-bottom: 16px; | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         color: #999999; | ||||
|         font-size: 24px; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         max-width: 444px; | ||||
|         line-height: 32px; | ||||
|         color: #333333; | ||||
|         font-size: 24px; | ||||
|         word-break: break-all; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .detail-right { | ||||
|     flex: 1; | ||||
|  | ||||
|     .detail-right__title { | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|       margin-bottom: 6px; | ||||
|  | ||||
|       span { | ||||
|         color: #999999; | ||||
|         font-size: 28px; | ||||
|       } | ||||
|  | ||||
|       & > h2 { | ||||
|         color: #333333; | ||||
|         font-size: 32px; | ||||
|         font-weight: 600; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .detail-right__userlist { | ||||
|       margin-top: 16px; | ||||
|       font-size: 0; | ||||
|  | ||||
|       .detail-right__userinfo { | ||||
|         display: inline-block; | ||||
|         margin-right: 32px; | ||||
|         margin-bottom: 32px; | ||||
|         text-align: center; | ||||
|  | ||||
|         image, | ||||
|         span { | ||||
|           display: inline-block; | ||||
|           width: 64px; | ||||
|           height: 64px; | ||||
|           line-height: 64px; | ||||
|           border-radius: 50%; | ||||
|           margin-bottom: 8px; | ||||
|           text-align: center; | ||||
|           color: #ffffff; | ||||
|           font-size: 26px; | ||||
|           border-radius: 50%; | ||||
|           background: #2266ff; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           overflow: hidden; | ||||
|           white-space: nowrap; | ||||
|           text-overflow: ellipsis; | ||||
|           color: #666666; | ||||
|           font-size: 24px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .detail-right__subtitle { | ||||
|       display: flex; | ||||
|       margin-bottom: 6px span { | ||||
|         margin-right: 10px; | ||||
|         color: #666666; | ||||
|         font-size: 28px; | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         flex: 1; | ||||
|         text-align: justify; | ||||
|         word-break: break-all; | ||||
|         color: #2ea222; | ||||
|         font-size: 28px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .detail-right__text { | ||||
|       // color: #343D65; | ||||
|       // font-size: 28px; | ||||
|       // margin: 6px 0; | ||||
|     } | ||||
|  | ||||
|     .detail-right__imgs { | ||||
|       font-size: 0; | ||||
|  | ||||
|       image { | ||||
|         display: inline-block; | ||||
|         width: 136px; | ||||
|         height: 136px; | ||||
|         margin-right: 8px; | ||||
|         margin-bottom: 8px; | ||||
|         margin-top: 8px; | ||||
|         border-radius: 4px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .line { | ||||
|     position: absolute; | ||||
|     left: 38px; | ||||
|     top: 80px; | ||||
|     width: 4px; | ||||
|     height: 100%; | ||||
|     background: #eeeeee; | ||||
|   } | ||||
|  | ||||
|   .detail-left { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     position: relative; | ||||
|     width: 80px; | ||||
|     height: 80px; | ||||
|     margin-right: 40px; | ||||
|     flex-shrink: 1; | ||||
|     border-radius: 50%; | ||||
|     background: #2266ff; | ||||
|  | ||||
|     .detail-left__statusicon { | ||||
|       width: 48px; | ||||
|       height: 48px; | ||||
|     } | ||||
|  | ||||
|     .detail-left__icon { | ||||
|       position: absolute; | ||||
|       top: 48px; | ||||
|       right: -4px; | ||||
|       width: 36px; | ||||
|       height: 36px; | ||||
|     } | ||||
|  | ||||
|     span, | ||||
|     .avatar { | ||||
|       display: block; | ||||
|       width: 80px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       color: #fff; | ||||
|       font-size: 28px; | ||||
|       text-align: center; | ||||
|       border-radius: 50%; | ||||
|       background: #2266ff; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .status { | ||||
|   width: 100%; | ||||
|   padding: 20px 32 px20px; | ||||
|   font-weight: 600; | ||||
|   background: #eff4ff; | ||||
|  | ||||
|   h2 { | ||||
|     margin-bottom: 10px; | ||||
|     color: #3a7ee2; | ||||
|     font-size: 28px; | ||||
|   } | ||||
|  | ||||
|   .status-content { | ||||
|     span { | ||||
|       display: inline; | ||||
|       font-size: 28px; | ||||
|       color: #3a7ee2; | ||||
|     } | ||||
|  | ||||
|     i { | ||||
|       display: inline; | ||||
|       font-size: 28px; | ||||
|       color: #3a7ee2; | ||||
|       text-decoration: underline; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .info { | ||||
|   position: relative; | ||||
|   padding: 32px 32px 20px; | ||||
|   background: #fff; | ||||
|  | ||||
|   & > h2 { | ||||
|     max-width: 550px; | ||||
|     margin-bottom: 8px; | ||||
|     font-size: 32px; | ||||
|     font-weight: 600; | ||||
|     color: #333333; | ||||
|   } | ||||
|  | ||||
|   .info-status { | ||||
|     position: absolute; | ||||
|     right: 0; | ||||
|     top: 0; | ||||
|     font-size: 96px; | ||||
|   } | ||||
|  | ||||
|   .info-user { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 112px; | ||||
|     border-bottom: 1px solid #d8dde6; | ||||
|  | ||||
|     i { | ||||
|       font-size: 28px; | ||||
|       color: #ff8822; | ||||
|     } | ||||
|  | ||||
|     span, | ||||
|     image { | ||||
|       width: 80px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       margin-right: 16px; | ||||
|       text-align: center; | ||||
|       color: #ffffff; | ||||
|       font-size: 28px; | ||||
|       border-radius: 50%; | ||||
|       background: #2266ff; | ||||
|     } | ||||
|  | ||||
|     p { | ||||
|       margin-top: 4px; | ||||
|       font-size: 24px; | ||||
|       color: #999999; | ||||
|     } | ||||
|  | ||||
|     h2 { | ||||
|       color: #333333; | ||||
|       font-size: 32px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .info-list { | ||||
|     padding-top: 32px; | ||||
|  | ||||
|     .info-item { | ||||
|       display: flex; | ||||
|       margin-bottom: 16px; | ||||
|  | ||||
|       &:first-child { | ||||
|         div { | ||||
|           color: #1365dd; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       .imgs { | ||||
|         display: inline-block; | ||||
|         position: relative; | ||||
|         margin-right: 8px; | ||||
|         margin-bottom: 8px; | ||||
|         font-size: 0; | ||||
|  | ||||
|         image { | ||||
|           width: 170px; | ||||
|           height: 170px; | ||||
|         } | ||||
|  | ||||
|         span { | ||||
|           position: absolute; | ||||
|           bottom: 0; | ||||
|           left: 0; | ||||
|           width: 100%; | ||||
|           height: 40px; | ||||
|           line-height: 40px; | ||||
|           text-align: center; | ||||
|           color: #fff; | ||||
|           font-size: 20px; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           white-space: nowrap; | ||||
|           background: rgba(0, 0, 0, 0.4); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         flex-shrink: 1; | ||||
|         color: #999999; | ||||
|         font-size: 30px; | ||||
|       } | ||||
|  | ||||
|       & > div { | ||||
|         flex: 1; | ||||
|         color: #343d65; | ||||
|         font-size: 30px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .detail { | ||||
|   margin-top: 16px; | ||||
|   background: #fff; | ||||
|  | ||||
|   .detail-tab { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     height: 96px; | ||||
|     border-bottom: 1px solid #d8dde6; | ||||
|  | ||||
|     div { | ||||
|       flex: 1; | ||||
|       height: 100%; | ||||
|       line-height: 96px; | ||||
|       text-align: center; | ||||
|       color: #999999; | ||||
|       font-size: 34px; | ||||
|       font-weight: 600; | ||||
|       border-bottom: 4px solid transparent; | ||||
|  | ||||
|       &.active { | ||||
|         color: #1365dd; | ||||
|         border-bottom: 4px solid #1365dd; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .detail-form { | ||||
|     .detail-form__item { | ||||
|       border-bottom: 1px solid #d8dde6; | ||||
|  | ||||
|       &:last-child { | ||||
|         border: none; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .detail-form__item--title { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       height: 96px; | ||||
|       padding: 0 32px; | ||||
|  | ||||
|       .left { | ||||
|         display: flex; | ||||
|         align-items: center; | ||||
|  | ||||
|         span { | ||||
|           width: 4px; | ||||
|           height: 32px; | ||||
|           margin-right: 12px; | ||||
|           background: #1365dd; | ||||
|         } | ||||
|  | ||||
|         h2 { | ||||
|           color: #333333; | ||||
|           font-size: 32px; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         position: relative; | ||||
|         font-size: 32px; | ||||
|         color: #cfcfcf; | ||||
|         transform: rotate(180deg); | ||||
|         transition: all 0.3s ease; | ||||
|  | ||||
|         &.title-active { | ||||
|           transform: rotate(-180deg); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .detail-form__item--list { | ||||
|       background: #fafafa; | ||||
|       padding: 0 32px; | ||||
|  | ||||
|       .detail-form__item--info { | ||||
|         display: flex; | ||||
|         justify-content: space-between; | ||||
|         padding: 10px 0; | ||||
|  | ||||
|         span { | ||||
|           text-align: right; | ||||
|           max-width: 500px; | ||||
|           padding-left: 10px; | ||||
|           word-break: break-all; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -1,75 +1,13 @@ | ||||
| <template> | ||||
|   <div class="ServiceOnlineNew"> | ||||
|     <div class="content"> | ||||
|       <div class="card"> | ||||
|         <div class="cards" @click="toSearch(0)"> | ||||
|           <div class="left"> | ||||
|             <img src="../../static/workOnline/icon3@2x.png" class="img-left" alt="" /> | ||||
|           </div> | ||||
|  | ||||
|           <div class="right"> | ||||
|             <div class="hint-left"> | ||||
|               <span class="title">就业失业</span> | ||||
|               <span class="hint">就业登记 失业登记</span> | ||||
|             </div> | ||||
|  | ||||
|             <div class="hint-right"> | ||||
|               <img src="../../static/workOnline/jt.png" class="img-icon" alt="" /> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="cards" @click="toSearch(1)"> | ||||
|           <div class="left"> | ||||
|             <img src="../../static/workOnline/icon11jyjn@2x.png" class="img-left" alt="" /> | ||||
|           </div> | ||||
|  | ||||
|           <div class="right"> | ||||
|             <div class="hint-left"> | ||||
|               <span class="title">职业资格</span> | ||||
|               <span class="hint">职业培训补贴申请 职业资格证书查询</span> | ||||
|             </div> | ||||
|  | ||||
|             <div class="hint-right"> | ||||
|               <img src="../../static/workOnline/jt.png" class="img-icon" alt="" /> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="cards" @click="toSearch(2)"> | ||||
|           <div class="left"> | ||||
|             <img src="../../static/workOnline/icon1@2x.png" class="img-left" alt="" /> | ||||
|           </div> | ||||
|  | ||||
|           <div class="right"> | ||||
|             <div class="hint-left"> | ||||
|               <span class="title">社保补贴</span> | ||||
|               <span class="hint">就业困难人员社保补贴 高校毕业生社保补贴</span> | ||||
|             </div> | ||||
|  | ||||
|             <div class="hint-right"> | ||||
|               <img src="../../static/workOnline/jt.png" class="img-icon" alt="" /> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="cards" @click="toSearch(3)"> | ||||
|           <div class="left"> | ||||
|             <img src="../../static/workOnline/icon22cybt@2x.png" class="img-left" alt="" /> | ||||
|           </div> | ||||
|  | ||||
|           <div class="right"> | ||||
|             <div class="hint-left"> | ||||
|               <span class="title">创业补贴</span> | ||||
|               <span class="hint">创业补贴申领 创业开业指导</span> | ||||
|             </div> | ||||
|  | ||||
|             <div class="hint-right"> | ||||
|               <img src="../../static/workOnline/jt.png" class="img-icon" alt="" /> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|   <div class="servie"> | ||||
|     <div class="serviceItem" v-for="(op, i) in list" :key="i" @click="toServiceList(op)" hover-class="bg-hover"> | ||||
|       <img :src="op.icon" /> | ||||
|       <div class="fill flex1"> | ||||
|         <div>{{ op.name }}</div> | ||||
|         <u-gap height="6" /> | ||||
|         <span>{{ op.desc }}</span> | ||||
|       </div> | ||||
|       <i class="iconfont"></i> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| @@ -78,82 +16,86 @@ | ||||
| export default { | ||||
|   name: 'AppServiceOnlineNew', | ||||
|   appName: '网上办事-新', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   data() { | ||||
|     return { | ||||
|       list: [], | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: {}, | ||||
|  | ||||
|   onLoad() { | ||||
|     // this.getList() | ||||
|     this.getList() | ||||
|   }, | ||||
|   onShow() {}, | ||||
|  | ||||
|   methods: { | ||||
|     toSearch(index) { | ||||
|       this.$linkTo(`./listType?index=${index}`) | ||||
|     toServiceList(item) { | ||||
|       this.$linkTo(`./serviceList?id=${item.id}&title=${item.name}&subTitle=${item.desc}`) | ||||
|     }, | ||||
|  | ||||
|     getList() { | ||||
|       let size = 999 | ||||
|       this.$instance | ||||
|         .post('/app/zwspapprovalclassification/list-xcx', null, { | ||||
|           params: { | ||||
|             size, | ||||
|           }, | ||||
|           withoutToken: true, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code === 0) { | ||||
|             this.list = res.data.records | ||||
|           } | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .ServiceOnlineNew { | ||||
| <style lang="scss" scoped> | ||||
| .servie { | ||||
|   min-height: 100vh; | ||||
|   background: #fff; | ||||
| } | ||||
|  | ||||
| .serviceItem { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   ::v-deep .u-navbar { | ||||
|     background-color: #2085f5; | ||||
|   height: 160px; | ||||
|   padding: 28px 40px 28px; | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   box-sizing: border-box; | ||||
|  | ||||
|   img { | ||||
|     width: 80px; | ||||
|     height: 80px; | ||||
|   } | ||||
|   .content { | ||||
|     width: 100%; | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
|     background-color: #fff; | ||||
|  | ||||
|     .card { | ||||
|       padding: 0 30px; | ||||
|       .cards { | ||||
|         display: flex; | ||||
|         justify-content: space-between; | ||||
|         height: 160px; | ||||
|         line-height: 160px; | ||||
|         .left { | ||||
|           .img-left { | ||||
|             width: 88px; | ||||
|             height: 88px; | ||||
|             margin-top: 30px; | ||||
|           } | ||||
|         } | ||||
|         .right { | ||||
|           width: 95%; | ||||
|           display: flex; | ||||
|           justify-content: space-between; | ||||
|           .hint-left { | ||||
|             display: flex; | ||||
|             flex-direction: column; | ||||
|             height: 50px; | ||||
|             line-height: 50px; | ||||
|             margin: 30px 0 0 10px; | ||||
|             .title { | ||||
|               // display: inline; | ||||
|             } | ||||
|             .hint { | ||||
|               font-size: 28px; | ||||
|   .fill { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     font-size: 30px; | ||||
|     font-weight: 600; | ||||
|     color: #3c435c; | ||||
|     margin: 0 16px; | ||||
|     overflow: hidden; | ||||
|     text-overflow: ellipsis; | ||||
|     white-space: nowrap; | ||||
|  | ||||
|               color: #bec1d0; | ||||
|             } | ||||
|           } | ||||
|           .hint-right { | ||||
|             .img-icon { | ||||
|               width: 36px; | ||||
|               height: 36px; | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     span { | ||||
|       display: block; | ||||
|       width: 100%; | ||||
|       margin-right: 20px; | ||||
|       font-size: 28px; | ||||
|       font-weight: 500; | ||||
|       color: #bec1d0; | ||||
|       overflow: hidden; | ||||
|       text-overflow: ellipsis; | ||||
|       white-space: nowrap; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   i { | ||||
|     font-size: 44px; | ||||
|     color: #979797; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,357 +0,0 @@ | ||||
| <template> | ||||
|   <div class="Page"> | ||||
|     <div class="step0" v-if="current == 0 && show"> | ||||
|       <div class="tops"> | ||||
|         <div class="titles">办理须知</div> | ||||
|         <span class="blods">【注意】欢迎申请使用提供的服务</span> | ||||
|         <span class="normal">请您(下列简称为“用户”)仔细阅读以下全部内容。</span> | ||||
|         <span class="blod">特别是粗体下划线标注的内容)</span> | ||||
|         <span class="normal"> 如果用户不同意本服务条款任意内容,请勿注册或使用服务。如用户通过进入注册程序并勾选“我同意机账号服务条款”,即表示用户已达成协议,自愿接受本服务条款的所有内容。此后,用户不得以未阅读本服务条款内容作任何形式的抗辩。</span> | ||||
|         <p class="number1">1.服务条款的确认和接纳</p> | ||||
|         <span class="normal">服务涉及到所有权以及相关软件的知识产权归公司所有。所提供的服务必须按照其发布的公司章程,服务条款和操作规则严格执行,本服务条款的效力范围及于将手机账号作为登录账号的公司产品和服务(以下简称“各单项服务”),用户在享受各单项服务时,应当受本服务条款的约束。</span> | ||||
|         <span class="blod">当用户使用各单项服务时,用户同意以单项服务要求的方式同意该单项服务的服务条款以及公司在该单项服务中发出的各类公告(下列简称“单项条款”),在此情况下单项条款与本服务条款同时对用户产生效力。若单项条款与本服务条款存在同类条款的冲突,则在单项条款约束范围内应以单项条款为准。</span> | ||||
|         <p class="number2">2.手机账号服务简介</p> | ||||
|         <span class="blod">本服务条款所称的“手机账号”是指用户以及手机号码作为账号注册的合法、有效的账号,手机账号注册成功后账号即为手机号。</span> | ||||
|         <span class="normal normals">公司运用自己的操作系统通过国际互联网络为用户提供各项服务。用户必须:</span> | ||||
|         <p class="number3">(1)提供设备,如个人电脑、手机或其他网上设备。</p> | ||||
|         <p class="number4">(2)个人上网和支付与此服务有关的费用。</p> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <u-steps :list="numList" mode="number" :current="current" v-if="current != 0"></u-steps> | ||||
|  | ||||
|     <div class="step1" v-if="current == 1"> | ||||
|       <div class="idCard"> | ||||
|         <div class="normal"> | ||||
|           <div class="label">身份证 (国徽面)</div> | ||||
|           <AiUploader :v-model="forms.files0" multiple placeholder="上传图片" :limit="1" action="/admin/file/add2"></AiUploader> | ||||
|         </div> | ||||
|  | ||||
|         <div class="noNormal"> | ||||
|           <div class="label">身份证 (头像面)</div> | ||||
|           <AiUploader :v-model="forms.files1" multiple placeholder="上传图片" :limit="1" action="/admin/file/add2"></AiUploader> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
|       <div class="label">户口本照片</div> | ||||
|       <AiUploader :v-model="forms.files1" multiple placeholder="上传图片" :limit="1" action="/admin/file/add2"></AiUploader> | ||||
|  | ||||
|       <div class="label">变更照片证明</div> | ||||
|       <AiUploader :v-model="forms.files1" multiple placeholder="上传图片" :limit="1" action="/admin/file/add2"></AiUploader> | ||||
|  | ||||
|       <div class="labels">上传样例</div> | ||||
|       <div class="idCards"> | ||||
|         <div class="topImg"> | ||||
|           <div class="leftImg"> | ||||
|             <img src="../../static/workOnline/池夏2.jpg" alt="" /> | ||||
|             <div class="hint">身份证国徽面</div> | ||||
|           </div> | ||||
|  | ||||
|           <div class="rightImg"> | ||||
|             <img src="../../static/workOnline/池夏2.jpg" alt="" /> | ||||
|             <div class="hint">身份证头像面</div> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="botImg"> | ||||
|           <img src="../../static/workOnline/池夏2.jpg" alt="" /> | ||||
|           <div class="hint">已盖章变更证明</div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="step2" v-if="current == 2"> | ||||
|       <div class="titles2">荣昌区农村宅基地和建房 (规划许可) 申请表</div> | ||||
|       <u-form class="u-form" :model="forms2" ref="uForm" label-width="auto"> | ||||
|         <u-form-item label="姓名" prop="name" required label-position="top"> | ||||
|           <u-input v-model="forms2.name" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="联系电话" prop="phone" required label-position="top"> | ||||
|           <u-input v-model="forms2.phone" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="身份证号" prop="idNumber" required label-position="top"> | ||||
|           <u-input v-model="forms2.idNumber" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="性别" prop="sex" required label-position="top"> | ||||
|           <u-input v-model="forms2.sex" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="年龄" prop="age" required label-position="top"> | ||||
|           <u-input v-model="forms2.age" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="户口所在地" prop="address" required label-position="top"> | ||||
|           <u-input v-model="forms2.address" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <div class="hint"> | ||||
|           <div class="leftIcon"></div> | ||||
|  | ||||
|           <div class="hintMsg">家庭成员信息</div> | ||||
|         </div> | ||||
|  | ||||
|         <u-form-item label="姓名" prop="name" required label-position="top"> | ||||
|           <u-input v-model="forms2.name" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="联系电话" prop="phone" required label-position="top"> | ||||
|           <u-input v-model="forms2.phone" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="身份证号" prop="idNumber" required label-position="top"> | ||||
|           <u-input v-model="forms2.idNumber" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="性别" prop="sex" required label-position="top"> | ||||
|           <u-input v-model="forms2.sex" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="年龄" prop="age" required label-position="top"> | ||||
|           <u-input v-model="forms2.age" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|  | ||||
|         <u-form-item label="户口所在地" prop="address" required label-position="top"> | ||||
|           <u-input v-model="forms2.address" placeholder="请输入姓名" maxlength="15" /> | ||||
|         </u-form-item> | ||||
|       </u-form> | ||||
|     </div> | ||||
|  | ||||
|     <div class="step3" v-if="current == 3"></div> | ||||
|  | ||||
|     <div class="bottoms"> | ||||
|       <div class="cancel" @click="cancel">{{ current != 0 ? '上一步' : '取消' }}</div> | ||||
|       <div class="ok" @click="isOk">{{ current != 0 ? '下一步' : '我已阅读并同意' }}</div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'detail', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   data() { | ||||
|     return { | ||||
|       show: true, | ||||
|       current: 2, | ||||
|       numList: [ | ||||
|         { | ||||
|           name: '办理须知', | ||||
|           current: 0, | ||||
|         }, | ||||
|         { | ||||
|           name: '资料上传', | ||||
|           current: 1, | ||||
|         }, | ||||
|         { | ||||
|           name: '表单填写', | ||||
|           current: 2, | ||||
|         }, | ||||
|         { | ||||
|           name: '签名提交', | ||||
|           current: 3, | ||||
|         }, | ||||
|       ], | ||||
|       forms: { | ||||
|         files0: [], | ||||
|         files1: [], | ||||
|       }, | ||||
|       forms2: {}, | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: {}, | ||||
|   onLoad() {}, | ||||
|   onShow() {}, | ||||
|   methods: { | ||||
|     cancel() { | ||||
|       if (this.current > 0) { | ||||
|         this.current = this.current - 1 | ||||
|       } | ||||
|       if (this.current == 0) { | ||||
|         uni.navigateBack({}) | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     isOk() { | ||||
|       this.show = false | ||||
|       this.current = this.current + 1 | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .Page { | ||||
|   .step0 { | ||||
|     padding: 0 30px; | ||||
|     .tops { | ||||
|       line-height: 1.6; | ||||
|       font-size: 28px; | ||||
|       padding-bottom: 140px; | ||||
|       .titles { | ||||
|         margin: 48px 0 40px 0; | ||||
|         text-align: center; | ||||
|         font-size: 34px !important; | ||||
|         font-weight: 600; | ||||
|       } | ||||
|       .blods { | ||||
|         font-weight: 500; | ||||
|       } | ||||
|       .blod { | ||||
|         font-weight: 500; | ||||
|         text-decoration: underline; | ||||
|       } | ||||
|       .number1, | ||||
|       .number2 { | ||||
|         margin: 28px 0 12px 0; | ||||
|       } | ||||
|       .normals, | ||||
|       .number3, | ||||
|       .number4 { | ||||
|         margin-top: 8px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   ::v-deep .u-steps { | ||||
|     padding: 38px 0 44px 0; | ||||
|     background: #fff; | ||||
|     box-shadow: 0px 8px 4px 0px rgba(0, 0, 0, 0.05); | ||||
|   } | ||||
|  | ||||
|   .step1 { | ||||
|     margin-top: 20px; | ||||
|     padding-bottom: 180px !important; | ||||
|     background: #fff; | ||||
|     padding: 0 32px; | ||||
|     .idCard { | ||||
|       display: flex; | ||||
|       .normal, | ||||
|       .noNormal { | ||||
|         .label { | ||||
|           padding: 20px 0; | ||||
|           font-size: 28px; | ||||
|           font-weight: 600; | ||||
|         } | ||||
|         ::v-deep .ai-uploader .upload { | ||||
|           width: 334px; | ||||
|           height: 210px; | ||||
|           margin-right: 16px; | ||||
|         } | ||||
|         ::v-deep .ai-uploader:nth-child(2) .upload { | ||||
|           margin-right: 0; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .label { | ||||
|       padding: 20px 0; | ||||
|       font-size: 28px; | ||||
|       font-weight: 600; | ||||
|     } | ||||
|  | ||||
|     ::v-deep .ai-uploader .upload { | ||||
|       width: 334px; | ||||
|       height: 210px; | ||||
|       margin-right: 16px; | ||||
|     } | ||||
|  | ||||
|     .labels { | ||||
|       font-size: 38px; | ||||
|       font-weight: 600; | ||||
|       padding: 40px 0 32px 0; | ||||
|     } | ||||
|  | ||||
|     .idCards { | ||||
|       .topImg { | ||||
|         display: flex; | ||||
|         .leftImg, | ||||
|         .rightImg { | ||||
|           margin-right: 16px; | ||||
|           img { | ||||
|             width: 334px; | ||||
|             height: 210px; | ||||
|           } | ||||
|           .hint { | ||||
|             margin-top: 24px; | ||||
|             font-size: 30px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       .botImg { | ||||
|         margin-top: 48px; | ||||
|         img { | ||||
|           width: 334px; | ||||
|           height: 210px; | ||||
|         } | ||||
|         .hint { | ||||
|           margin-top: 24px; | ||||
|           font-size: 30px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .step2 { | ||||
|     margin-top: 20px; | ||||
|     background: #fff; | ||||
|     padding: 0 32px 180px 32px; | ||||
|     .titles2 { | ||||
|       font-size: 34px; | ||||
|       padding-top: 38px; | ||||
|     } | ||||
|     ::v-deep .u-form { | ||||
|       .u-form-item { | ||||
|         border-bottom: 1px solid #ddd; | ||||
|       } | ||||
|       .hint { | ||||
|         display: flex; | ||||
|         margin: 34px 0 10px 0; | ||||
|         .leftIcon { | ||||
|           padding: 0 6px; | ||||
|           background: #1365dd; | ||||
|           margin-top: 4px; | ||||
|         } | ||||
|         .hintMsg { | ||||
|           font-size: 32px; | ||||
|           font-weight: 500; | ||||
|           margin-left: 12px; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .bottoms { | ||||
|     position: fixed; | ||||
|     bottom: 0; | ||||
|     box-sizing: border-box; | ||||
|     width: 100%; | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     padding: 16px 32px; | ||||
|     z-index: 999; | ||||
|     background: #f3f6f9; | ||||
|     .cancel, | ||||
|     .ok { | ||||
|       padding: 20px 0; | ||||
|       text-align: center; | ||||
|       border-radius: 16px; | ||||
|       font-size: 34px; | ||||
|       font-weight: 500; | ||||
|     } | ||||
|     .cancel { | ||||
|       width: 40%; | ||||
|       background: #fff; | ||||
|     } | ||||
|     .ok { | ||||
|       width: 55%; | ||||
|       background: #4181ff; | ||||
|       color: #fff; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
| @@ -1,169 +0,0 @@ | ||||
| <template> | ||||
|   <div class="Page"> | ||||
|     <div class="content"> | ||||
|       <div class="header-top"> | ||||
|         <div class="left" v-if="type == 0"> | ||||
|           <div class="title">就业失业</div> | ||||
|  | ||||
|           <div class="title-hint">就业登记 失业登记</div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="left" v-if="type == 1"> | ||||
|           <div class="title">职业资格</div> | ||||
|  | ||||
|           <div class="title-hint">职业培训补贴申请 职业资格证书查询</div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="left" v-if="type == 2"> | ||||
|           <div class="title">社保补贴</div> | ||||
|  | ||||
|           <div class="title-hint">就业困难人员社保补贴 高校毕业生社保补贴</div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="left" v-if="type == 3"> | ||||
|           <div class="title">创业补贴</div> | ||||
|  | ||||
|           <div class="title-hint">创业补贴申领 创业开业指导</div> | ||||
|         </div> | ||||
|  | ||||
|         <div class="right"></div> | ||||
|       </div> | ||||
|  | ||||
|       <div class="history"> | ||||
|         <div class="cards" v-for="(item, i) in list" :key="i" @click="toDetail(item.id)"> | ||||
|           <div class="left">{{ item.title }}</div> | ||||
|           <div class="right"> | ||||
|             <img src="../../static/workOnline/jt.png" class="img-icon" alt="" /> | ||||
|           </div> | ||||
|         </div> | ||||
|         <AiEmpty v-if="!list.length" /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: 'listType', | ||||
|   components: {}, | ||||
|   props: {}, | ||||
|   data() { | ||||
|     return { | ||||
|       type: '', | ||||
|       current: 1, | ||||
|       list: [{ value: 0, title: '弃捐勿复道,努力加餐饭' }], | ||||
|     } | ||||
|   }, | ||||
|   onLoad(option) { | ||||
|     if (option.type) { | ||||
|       this.type = option.type | ||||
|     } | ||||
|     this.getList() | ||||
|   }, | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.$instance | ||||
|         .post( | ||||
|           `/app/appitemconfigbasicinfo/listDiffType`, | ||||
|           { | ||||
|             type: 1, | ||||
|             type2: this.type, | ||||
|             size: 10, | ||||
|             current: this.current, | ||||
|           }, | ||||
|           { withoutToken: true } | ||||
|         ) | ||||
|         .then((res) => { | ||||
|           if (res.code == 0) { | ||||
|             if (this.current > res.data.pages) { | ||||
|               return | ||||
|             } | ||||
|             const records = this.current > 1 ? [...this.list, ...res.data.records] : res.data.records | ||||
|             this.list = records | ||||
|           } | ||||
|         }) | ||||
|     }, | ||||
|  | ||||
|     toDetail(id) { | ||||
|       this.$linkTo(`./detail?id=${id}`) | ||||
|     }, | ||||
|   }, | ||||
|   onReachBottom() { | ||||
|     this.current = this.current + 1 | ||||
|     this.getList() | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .Page { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   background-color: #fff; | ||||
|  | ||||
|   ::v-deep .u-navbar { | ||||
|     background-color: #2085f5; | ||||
|   } | ||||
|   .content { | ||||
|     width: 100%; | ||||
|     padding: 0; | ||||
|     margin: 0; | ||||
|     background-color: #fff; | ||||
|  | ||||
|     .header-top { | ||||
|       display: flex; | ||||
|       justify-content: space-between; | ||||
|       .left { | ||||
|         width: 50%; | ||||
|         .title { | ||||
|           margin-top: 46px; | ||||
|           margin-left: 32px; | ||||
|           font-size: 50px; | ||||
|           font-weight: 800; | ||||
|         } | ||||
|         .title-hint { | ||||
|           font-size: 30px; | ||||
|           font-weight: 500; | ||||
|           color: #999999; | ||||
|           margin: 16px 0 0 32px; | ||||
|           line-height: 1.7; | ||||
|         } | ||||
|       } | ||||
|       .right { | ||||
|         height: 236px; | ||||
|         width: 50%; | ||||
|         background: url(http://respub.sinoecare.net/20211130/chahua@2x-20211130183558.png) no-repeat; | ||||
|         background-size: 100% 100%; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .history { | ||||
|       margin-top: 24px; | ||||
|       .cards { | ||||
|         display: flex; | ||||
|         justify-content: space-between; | ||||
|         height: 116px; | ||||
|         line-height: 116px; | ||||
|         margin: 0 32px; | ||||
|         border-bottom: 1px solid #d8dde6; | ||||
|         .left { | ||||
|           font-size: 32px; | ||||
|           font-weight: 500; | ||||
|           overflow: hidden; | ||||
|           text-overflow: ellipsis; | ||||
|           display: -webkit-box; | ||||
|           -webkit-line-clamp: 1; | ||||
|           -webkit-box-orient: vertical; | ||||
|         } | ||||
|         .right { | ||||
|           .img-icon { | ||||
|             width: 36px; | ||||
|             height: 36px; | ||||
|             margin-top: 10px; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										838
									
								
								src/mods/AppServiceOnlineNew/serviceForm.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										838
									
								
								src/mods/AppServiceOnlineNew/serviceForm.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,838 @@ | ||||
| <template> | ||||
|   <div class="service-form" v-if="pageShow"> | ||||
|     <div class="step"> | ||||
|       <div class="step-item" :class="[currIndex > 0 ? 'active' : '']"> | ||||
|         <i class="line" :class="[currIndex > 1 ? 'line-active' : '']"></i> | ||||
|         <span>1</span> | ||||
|         <div>办理须知</div> | ||||
|       </div> | ||||
|       <div class="step-item" :class="[currIndex > 1 ? 'active' : '']"> | ||||
|         <i class="line" :class="[currIndex > 2 ? 'line-active' : '']"></i> | ||||
|         <span>2</span> | ||||
|         <div>资料上传</div> | ||||
|       </div> | ||||
|       <div class="step-item" :class="[currIndex > 2 ? 'active' : '']"> | ||||
|         <i class="line" :class="[currIndex > 3 ? 'line-active' : '']"></i> | ||||
|         <span>3</span> | ||||
|         <div>表单填写</div> | ||||
|       </div> | ||||
|       <div class="step-item" :class="[currIndex > 3 ? 'active' : '']"> | ||||
|         <span>4</span> | ||||
|         <div>完成提交</div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="step-item" v-if="currIndex === 2"> | ||||
|       <div class="service-upload"> | ||||
|         <div class="upload-item" v-for="(item, index) in info.processAnnexDefs" :key="index"> | ||||
|           <div class="upload-item__title"> | ||||
|             <i :style="{ opacity: item.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|             <h2>请上传{{ item.annexName }}</h2> | ||||
|           </div> | ||||
|           <div class="upload-item__wrapper" @click="upload(index)"> | ||||
|             <image v-if="item.src" mode="aspectFill" :src="item.src" /> | ||||
|             <i v-if="!item.src" class="iconfont"></i> | ||||
|             <h2 v-if="!item.src">上传照片</h2> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="service-example" v-if="exampleList.length"> | ||||
|         <h2>上传样例</h2> | ||||
|         <div class="service-example__list"> | ||||
|           <div class="service-example__item" v-for="(item, index) in exampleList" :key="index"> | ||||
|             <image :src="item.exampleFile.url" mode="aspectFill" @click="preview(exampleList, item.exampleFile.url)" /> | ||||
|             <h2>{{ item.annexName }}</h2> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="step-item" v-if="currIndex === 3"> | ||||
|       <div class="step-item__form"> | ||||
|         <h2>{{ info.tableInfo.tableName }}</h2> | ||||
|         <div class="step-item__form--group" :style="{ 'margin-top': index === 0 ? '20px' : '50px' }" v-for="(item, index) in tableForm" :key="index"> | ||||
|           <div class="group-title"> | ||||
|             <span></span> | ||||
|             <h3>{{ item[0].groupName }}</h3> | ||||
|           </div> | ||||
|           <view v-for="(field, i) in item" :key="i"> | ||||
|             <div class="form-item" v-if="field.fieldDataType === '1' || field.fieldDataType === '0'"> | ||||
|               <div class="form-title"> | ||||
|                 <i :style="{ opacity: field.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|                 <span>{{ field.fieldName }}{{ field.fieldNameSuffix || '' }}</span> | ||||
|               </div> | ||||
|               <div class="form-item__wrapper"> | ||||
|                 <input placeholder="请输入" :maxlength="field.fieldLength ? field.fieldLength : -1" v-model="field.fieldValue" :type="field.fieldDataType === '0' ? 'number' : 'text'" /> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="form-item" v-if="field.fieldDataType === '4'"> | ||||
|               <div class="form-title"> | ||||
|                 <i :style="{ opacity: field.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|                 <span>{{ field.fieldName }}</span> | ||||
|               </div> | ||||
|               <div class="form-check"> | ||||
|                 <u-radio-group v-model="field.fieldValue"> | ||||
|                   <u-radio v-for="(dict, j) in $dict.getDict(field.dictionaryCode)" :key="j" :name="dict.dictValue"> | ||||
|                     {{ dict.dictName }} | ||||
|                   </u-radio> | ||||
|                 </u-radio-group> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="form-item" v-if="field.fieldDataType === '5'"> | ||||
|               <div class="form-title"> | ||||
|                 <i :style="{ opacity: field.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|                 <span>{{ field.fieldName }}{{ field.fieldNameSuffix || '' }}</span> | ||||
|               </div> | ||||
|               <div class="form-check"> | ||||
|                 <u-checkbox-group> | ||||
|                   <u-checkbox @change="(e) => checkChange(e, index, i, j)" :data-index="index" :data-i="i" :data-j="j" v-for="(dict, j) in field.dictionaryList" :key="j" v-model="dict.checked" :name="dict.dictValue"> | ||||
|                     {{ dict.dictName }} | ||||
|                   </u-checkbox> | ||||
|                 </u-checkbox-group> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="form-item" v-if="field.fieldDataType === '8'"> | ||||
|               <div class="form-title"> | ||||
|                 <i :style="{ opacity: field.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|                 <span>{{ field.fieldName }}{{ field.fieldNameSuffix || '' }}</span> | ||||
|               </div> | ||||
|               <div class="form-item__wrapper"> | ||||
|                 <input placeholder="请选择" disabled :value="field.fieldValue || ''" /> | ||||
|                 <picker mode="date" :data-index="index" :data-i="i" @change="onDateChange"> | ||||
|                   <div class="form-item__choose" hover-class="text-hover">选择</div> | ||||
|                 </picker> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div class="form-item" v-if="field.fieldDataType === '9'"> | ||||
|               <div class="form-title"> | ||||
|                 <i :style="{ opacity: field.mustFill === '1' ? 1 : 0 }">*</i> | ||||
|                 <span>{{ field.fieldName }}{{ field.fieldNameSuffix || '' }}</span> | ||||
|               </div> | ||||
|               <div class="form-item__wrapper"> | ||||
|                 <input placeholder="请选择" disabled :value="field.fieldDictName || ''" /> | ||||
|                 <picker range-key="dictName" :range="$dict.getDict(field.dictionaryCode)" :data-index="index" :data-i="i" :data-dict="field.dictionaryCode" @change="onPickerChange"> | ||||
|                   <div class="form-item__choose" hover-class="text-hover">选择</div> | ||||
|                 </picker> | ||||
|               </div> | ||||
|             </div> | ||||
|           </view> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="service-btn" @click="next">{{ currIndex === 3 ? '签名并提交' : '下一步' }}</div> | ||||
|     <u-popup v-model="isShow" mode="bottom" :mask-custom-style="{ background: 'rgba(0, 0, 0, 0.2)' }" @close="clear"> | ||||
|       <div class="signature"> | ||||
|         <div class="signature-header"> | ||||
|           <div hover-class="text-hover" :hover-stay-time="100" @click=";(isShow = false), clear()">取消</div> | ||||
|         </div> | ||||
|         <div class="signature-canvas"> | ||||
|           <canvas class="handWriting" disable-scroll="true" @touchstart="uploadScaleStart" @touchmove="uploadScaleMove" @touchend="uploadScaleEnd" canvas-id="handWriting"> </canvas> | ||||
|         </div> | ||||
|         <div class="signature-footer"> | ||||
|           <div class="signature-footer__left" @click="clear" hover-class="text-hover" :hover-stay-time="100"> | ||||
|             <i class="iconfont"></i> | ||||
|             <span>重新签名</span> | ||||
|           </div> | ||||
|           <div class="signature-btn" hover-class="text-hover" :hover-stay-time="100" @click="submitSignature">提交</div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </u-popup> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from 'vuex' | ||||
| import Handwriting from '@/utils/signature.js' | ||||
|  | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       pageShow: false, | ||||
|       currIndex: 2, | ||||
|       isShow: false, | ||||
|       id: '', | ||||
|       list: [], | ||||
|       handwriting: '', | ||||
|       isHasSignature: false, | ||||
|       tableForm: [], | ||||
|       info: {}, | ||||
|       isTouch: false, | ||||
|       fileManage: null, | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   computed: { | ||||
|     ...mapState(['user']), | ||||
|  | ||||
|     exampleList() { | ||||
|       if (!this.info.processAnnexDefs) { | ||||
|         return [] | ||||
|       } | ||||
|  | ||||
|       return JSON.parse(JSON.stringify(this.info.processAnnexDefs)).filter((v) => v.exampleFileId) | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   onLoad(query) { | ||||
|     this.id = query.id | ||||
|     this.getInfo(query.id) | ||||
|   }, | ||||
|  | ||||
|   onReady() {}, | ||||
|  | ||||
|   methods: { | ||||
|     clear() { | ||||
|       this.isTouch = false | ||||
|       this.handwriting.retDraw() | ||||
|     }, | ||||
|  | ||||
|     uploadScaleStart(event) { | ||||
|       this.handwriting.uploadScaleStart(event) | ||||
|     }, | ||||
|  | ||||
|     uploadScaleMove(event) { | ||||
|       this.isTouch = true | ||||
|       this.handwriting.uploadScaleMove(event) | ||||
|     }, | ||||
|  | ||||
|     uploadScaleEnd(event) { | ||||
|       this.handwriting.uploadScaleEnd(event) | ||||
|     }, | ||||
|  | ||||
|     submitSignature() { | ||||
|       if (!this.isTouch) { | ||||
|         return this.$toast('签名不能为空') | ||||
|       } | ||||
|  | ||||
|       this.handwriting | ||||
|         .saveCanvas() | ||||
|         .then((res) => { | ||||
|           uni.getFileSystemManager().readFile({ | ||||
|             filePath: res, | ||||
|             encoding: 'base64', | ||||
|             success: (res) => { | ||||
|               this.$loading() | ||||
|               this.$instance | ||||
|                 .post(`/app/syssignaccount/xcx-draw-sign?openId=${this.user.openId}`, res.data, { | ||||
|                   headers: { | ||||
|                     'Content-Type': 'application/json', | ||||
|                   }, | ||||
|                 }) | ||||
|                 .then((res) => { | ||||
|                   if (res.code === 0) { | ||||
|                     this.signatureId = res.data | ||||
|                     this.isShow = false | ||||
|                     this.$toast('签名成功') | ||||
|  | ||||
|                     this.$nextTick(() => { | ||||
|                       this.submitForm() | ||||
|                     }) | ||||
|                   } | ||||
|                 }) | ||||
|             }, | ||||
|             fail: () => { | ||||
|               this.$toast('签名生成失败') | ||||
|             }, | ||||
|           }) | ||||
|         }) | ||||
|         .catch(() => { | ||||
|           this.$toast('签名绘制失败') | ||||
|         }) | ||||
|     }, | ||||
|  | ||||
|     IdCard(UUserCard, num) { | ||||
|       if (num == 1) { | ||||
|         return UUserCard.substring(6, 10) + '-' + UUserCard.substring(10, 12) + '-' + UUserCard.substring(12, 14) | ||||
|       } | ||||
|       if (num == 2) { | ||||
|         if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) { | ||||
|           return '1' | ||||
|         } else { | ||||
|           return '0' | ||||
|         } | ||||
|       } | ||||
|       if (num == 3) { | ||||
|         var myDate = new Date() | ||||
|         var month = myDate.getMonth() + 1 | ||||
|         var day = myDate.getDate() | ||||
|         var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1 | ||||
|         if (UUserCard.substring(10, 12) < month || (UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day)) { | ||||
|           age++ | ||||
|         } | ||||
|  | ||||
|         return age | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     getInfo(id) { | ||||
|       this.$loading() | ||||
|       this.$instance.post(`/app/approval-process-def/info-id?id=${id}`).then((res) => { | ||||
|         if (res.code === 0) { | ||||
|           this.$hideLoading() | ||||
|           this.info = res.data | ||||
|           uni.setNavigationBarTitle({ | ||||
|             title: res.data.processName, | ||||
|           }) | ||||
|           this.isHasSignature = !!res.data.tableInfo.tableFieldInfos.filter((v) => v.fieldType === '1').length | ||||
|           const groupFormIds = this.unique(res.data.tableInfo.tableFieldInfos.filter((v) => v.fieldType !== '1').map((v) => v.groupIndex)) | ||||
|           const dictKeys = res.data.tableInfo.tableFieldInfos.filter((v) => !!v.dictionaryCode).map((v) => v.dictionaryCode) | ||||
|           this.$dict.load(dictKeys).then(() => { | ||||
|             this.tableForm = groupFormIds.map((index) => { | ||||
|               return res.data.tableInfo.tableFieldInfos | ||||
|                 .filter((v) => v.fieldType !== '1' && v.groupIndex === index) | ||||
|                 .map((item) => { | ||||
|                   if (item.dictionaryCode) { | ||||
|                     item.dictionaryList = this.$dict.getDict(item.dictionaryCode) | ||||
|                   } | ||||
|  | ||||
|                   if (item.fieldDbName === 'name') { | ||||
|                     item.fieldValue = this.user.realName || '' | ||||
|                   } | ||||
|  | ||||
|                   if (item.fieldDbName === 'phone') { | ||||
|                     item.fieldValue = this.user.phone || '' | ||||
|                   } | ||||
|  | ||||
|                   // if (item.fieldDbName === 'sex') { | ||||
|                   //   item.fieldValue = this.IdCard(this.user.idNumber, 2) | ||||
|                   // } | ||||
|  | ||||
|                   if (item.fieldDbName === 'id_number') { | ||||
|                     item.fieldValue = this.user.idNumber || '' | ||||
|                   } | ||||
|  | ||||
|                   if (item.fieldDbName === 'age') { | ||||
|                     item.fieldValue = this.IdCard(this.user.idNumber, 3) | ||||
|                   } | ||||
|  | ||||
|                   if (item.fieldDbName === 'birthday') { | ||||
|                     item.fieldValue = this.IdCard(this.user.idNumber, 1) | ||||
|                   } | ||||
|  | ||||
|                   return item | ||||
|                 }) | ||||
|             }) | ||||
|           }) | ||||
|           this.pageShow = true | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     checkChange(e, index, i) { | ||||
|       this.$forceUpdate() | ||||
|  | ||||
|       this.$nextTick(() => { | ||||
|         const value = this.tableForm[index][i].dictionaryList | ||||
|           .filter((v) => v.checked) | ||||
|           .map((v) => v.dictValue) | ||||
|           .join(',') | ||||
|  | ||||
|         this.$set(this.tableForm[index][i], 'fieldValue', value) | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     onDateChange(e) { | ||||
|       const index = e.target.dataset.index | ||||
|       const i = e.target.dataset.i | ||||
|       const value = e.detail.value.split('-') | ||||
|  | ||||
|       this.$set(this.tableForm[index][i], 'fieldValue', `${value[0]}年${value[1]}月${value[2]}日`) | ||||
|     }, | ||||
|  | ||||
|     onPickerChange(e) { | ||||
|       const index = e.target.dataset.index | ||||
|       const i = e.target.dataset.i | ||||
|       const dict = e.target.dataset.dict | ||||
|       const value = e.detail.value | ||||
|       const key = this.$dict.getLabel(dict, value) | ||||
|  | ||||
|       this.$set(this.tableForm[index][i], 'fieldValue', value) | ||||
|       this.$set(this.tableForm[index][i], 'fieldDictName', key) | ||||
|     }, | ||||
|  | ||||
|     preview(list, url) { | ||||
|       const imgs = list.map((v) => v.exampleFile.url) | ||||
|       uni.previewImage({ | ||||
|         current: url, | ||||
|         urls: imgs, | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * 数组去重 | ||||
|      */ | ||||
|     unique(arr) { | ||||
|       return arr.filter((item, index) => { | ||||
|         return arr.indexOf(item, 0) === index | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * 图片上传 | ||||
|      */ | ||||
|     upload(index) { | ||||
|       uni.chooseImage({ | ||||
|         count: 1, | ||||
|         sizeType: ['compressed'], | ||||
|         sourceType: ['album', 'camera'], | ||||
|         success: (res) => { | ||||
|           const path = res.tempFilePaths[0] | ||||
|           this.$loading() | ||||
|           uni.uploadFile({ | ||||
|             url: this.$instance.baseURL + '/admin/file/add', | ||||
|             filePath: path, | ||||
|             name: 'file', | ||||
|             header: { | ||||
|               'Content-Type': 'multipart/form-data', | ||||
|               Authorization: uni.getStorageSync('token'), | ||||
|             }, | ||||
|             success: (res) => { | ||||
|               const data = JSON.parse(res.data) | ||||
|  | ||||
|               if (data.code === 0) { | ||||
|                 this.$set(this.info.processAnnexDefs[index], 'src', data.data[0].split(';')[0]) | ||||
|                 this.$set(this.info.processAnnexDefs[index], 'annexFileId', data.data[0].split(';')[1]) | ||||
|               } else { | ||||
|                 this.$toast(data.msg) | ||||
|               } | ||||
|             }, | ||||
|             complete: () => { | ||||
|               this.$hideLoading() | ||||
|             }, | ||||
|           }) | ||||
|         }, | ||||
|       }) | ||||
|     }, | ||||
|  | ||||
|     next() { | ||||
|       if (this.currIndex === 2) { | ||||
|         for (let item of this.info.processAnnexDefs) { | ||||
|           if (item.mustFill === '1' && !item.annexFileId) { | ||||
|             return this.$toast(`请上传${item.annexName}`) | ||||
|           } | ||||
|         } | ||||
|         this.currIndex = 3 | ||||
|       } else if (this.currIndex === 3) { | ||||
|         this.submitForm() | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     submitForm() { | ||||
|       let list = [] | ||||
|       let signature = '' | ||||
|  | ||||
|       if (this.isHasSignature) { | ||||
|         signature = { | ||||
|           ...this.info.tableInfo.tableFieldInfos.filter((v) => v.fieldType === '1')[0], | ||||
|           fieldValue: this.signatureId, | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       this.tableForm.forEach((item) => { | ||||
|         item.forEach((form) => { | ||||
|           list.push(form) | ||||
|         }) | ||||
|       }) | ||||
|  | ||||
|       for (let item of list) { | ||||
|         if (item.mustFill === '1' && !item.fieldValue) { | ||||
|           return this.$toast(`${item.fieldDataType === '0' || item.fieldDataType === '1' ? '请输入' : '请选择'}${item.fieldName}`) | ||||
|         } | ||||
|  | ||||
|         if (item.mustFill === '1' && item.verifyType) { | ||||
|           // const reg = item.verifyType === '0' ? new RegExp('(^\d{15}$)|(^\d{17}(\d|X|x)$)')  : new RegExp('^1[0-9]{10,10}$') | ||||
|           const reg = item.verifyType === '0' ? /(^\d{15}$)|(^\d{17}(\d|X|x)$)/ : /^1[0-9]{10,10}$/ | ||||
|  | ||||
|           if (!reg.test(item.fieldValue)) { | ||||
|             return this.$toast(`请输入正确的${item.fieldName}`) | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if (signature) { | ||||
|         list.push(signature) | ||||
|       } | ||||
|  | ||||
|       if (this.isHasSignature && !this.signatureId) { | ||||
|         this.handwriting = new Handwriting({ | ||||
|           lineColor: this.lineColor, | ||||
|           slideValue: this.slideValue, | ||||
|           canvasName: 'handWriting', | ||||
|         }) | ||||
|  | ||||
|         this.$nextTick(() => { | ||||
|           this.isShow = true | ||||
|         }) | ||||
|  | ||||
|         return false | ||||
|       } | ||||
|  | ||||
|       const annexs = this.info.processAnnexDefs | ||||
|         .map((item) => { | ||||
|           return { | ||||
|             annexFileId: item.annexFileId, | ||||
|             emptyFileId: item.emptyFileId, | ||||
|             exampleFileId: item.exampleFileId, | ||||
|             processAnnexDefId: item.id, | ||||
|             annexName: item.annexName, | ||||
|           } | ||||
|         }) | ||||
|         .filter((v) => !!v.annexFileId) | ||||
|  | ||||
|       const processNodeList = this.info.processNodeList | ||||
|       let tableInfo = this.info.tableInfo | ||||
|       tableInfo.tableFieldInfos = list | ||||
|  | ||||
|       this.$loading() | ||||
|       this.$instance | ||||
|         .post(`/app/approv-alapply-info/add`, { | ||||
|           processNodeList, | ||||
|           annexs, | ||||
|           tableInfo, | ||||
|           tableId: this.info.tableId, | ||||
|           processDefId: this.info.id, | ||||
|           processDefName: this.info.processName, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code === 0) { | ||||
|             this.$toast('申请成功') | ||||
|             uni.reLaunch({ | ||||
|               url: `./serviceResult?title=${this.info.processName}`, | ||||
|             }) | ||||
|           } else { | ||||
|             this.$hideLoading() | ||||
|           } | ||||
|         }) | ||||
|         .catch(() => { | ||||
|           this.$hideLoading() | ||||
|         }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .signature { | ||||
|   background: #fff; | ||||
|  | ||||
|   .signature-header { | ||||
|     height: 120px; | ||||
|     line-height: 120px; | ||||
|     padding: 0 32px; | ||||
|  | ||||
|     div { | ||||
|       color: #000000; | ||||
|       font-size: 30px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .signature-canvas { | ||||
|     width: 686px; | ||||
|     height: 464px; | ||||
|     margin: 0 auto 40px; | ||||
|     background: #fafafa; | ||||
|     border-radius: 8px; | ||||
|     border: 1px solid #dddddd; | ||||
|  | ||||
|     canvas { | ||||
|       width: 100%; | ||||
|       height: 100%; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .signature-footer { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: space-between; | ||||
|     height: 128px; | ||||
|     padding: 0 32px; | ||||
|     border-top: 1px solid #dddddd; | ||||
|  | ||||
|     .signature-footer__left { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|  | ||||
|       i { | ||||
|         margin-right: 4px; | ||||
|         font-size: 32px; | ||||
|         color: #4e8eee; | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         color: #4e8eee; | ||||
|         font-size: 28px; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .signature-btn { | ||||
|       width: 192px; | ||||
|       height: 80px; | ||||
|       line-height: 80px; | ||||
|       text-align: center; | ||||
|       color: #fff; | ||||
|       font-size: 32px; | ||||
|       background: #197df0; | ||||
|       border-radius: 4px; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .service-form { | ||||
|   min-height: 100vh; | ||||
|   padding-bottom: 124px; | ||||
|   box-sizing: border-box; | ||||
|   background-color: #fff; | ||||
| } | ||||
|  | ||||
| .upload-item__title { | ||||
|   display: flex; | ||||
|   position: relative; | ||||
|   align-items: center; | ||||
|   left: -16px; | ||||
|  | ||||
|   i { | ||||
|     font-size: 32px; | ||||
|     color: #ff4466; | ||||
|   } | ||||
| } | ||||
|  | ||||
| .step-item__form { | ||||
|   padding-top: 40px; | ||||
|  | ||||
|   .step-item__form--group { | ||||
|     margin-top: 50px; | ||||
|   } | ||||
|  | ||||
|   .group-title { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     padding: 0 32px; | ||||
|  | ||||
|     span { | ||||
|       width: 4px; | ||||
|       height: 32px; | ||||
|       margin-right: 6px; | ||||
|       background: #1365dd; | ||||
|     } | ||||
|  | ||||
|     h3 { | ||||
|       color: #333333; | ||||
|       font-size: 32px; | ||||
|       font-weight: 600; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   & > h2 { | ||||
|     padding: 0 32px; | ||||
|     color: #333333; | ||||
|     font-size: 34px; | ||||
|     font-weight: 600; | ||||
|   } | ||||
|  | ||||
|   .form-title { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     width: 100%; | ||||
|  | ||||
|     span { | ||||
|       font-size: 32px; | ||||
|       color: #333; | ||||
|       font-weight: 600; | ||||
|     } | ||||
|  | ||||
|     i { | ||||
|       margin-right: 2px; | ||||
|       color: #ff4466; | ||||
|       font-size: 32px; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   .form-check { | ||||
|     margin-left: 16px; | ||||
|     margin-top: 20px; | ||||
|     overflow: hidden; | ||||
|   } | ||||
|  | ||||
|   .form-item { | ||||
|     padding: 40px 0 0 0; | ||||
|     margin: 0 32px 0 16px; | ||||
|  | ||||
|     .form-item__wrapper { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       height: 70px; | ||||
|       margin-left: 16px; | ||||
|       padding-bottom: 12px; | ||||
|       border-bottom: 1px solid #dddddd; | ||||
|     } | ||||
|  | ||||
|     input { | ||||
|       flex: 1; | ||||
|       line-height: 70px; | ||||
|       padding-right: 20px; | ||||
|       box-sizing: border-box; | ||||
|     } | ||||
|  | ||||
|     .form-item__choose { | ||||
|       color: #4292f3; | ||||
|       font-size: 32px; | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .service-btn { | ||||
|   position: fixed; | ||||
|   bottom: 0; | ||||
|   left: 0; | ||||
|   z-index: 11; | ||||
|   width: 100%; | ||||
|   height: 114px; | ||||
|   line-height: 114px; | ||||
|   text-align: center; | ||||
|   color: #fff; | ||||
|   font-size: 34px; | ||||
|   background-color: #197df0; | ||||
| } | ||||
|  | ||||
| .service-example { | ||||
|   margin-top: 64px; | ||||
|   margin-bottom: 20px; | ||||
|  | ||||
|   & > h2 { | ||||
|     padding: 0 32px; | ||||
|     color: #333333; | ||||
|     font-size: 30px; | ||||
|   } | ||||
|  | ||||
|   .service-example__list { | ||||
|     display: flex; | ||||
|     flex-wrap: wrap; | ||||
|     padding: 0 32px; | ||||
|  | ||||
|     .service-example__item { | ||||
|       width: 215px; | ||||
|       margin-top: 24px; | ||||
|       margin-right: 24px; | ||||
|  | ||||
|       &:nth-of-type(3n) { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|  | ||||
|       image { | ||||
|         width: 216px; | ||||
|         height: 136px; | ||||
|         margin-bottom: 16px; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         color: #333333; | ||||
|         font-size: 30px; | ||||
|       } | ||||
|  | ||||
|       &:last-child { | ||||
|         margin-right: 0; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .service-upload { | ||||
|   margin-top: 40px; | ||||
|   padding: 0 32px; | ||||
|  | ||||
|   .upload-item { | ||||
|     margin-bottom: 64px; | ||||
|  | ||||
|     &:last-child { | ||||
|       margin-bottom: 0; | ||||
|     } | ||||
|  | ||||
|     & > h2 { | ||||
|       color: #333333; | ||||
|       font-size: 30px; | ||||
|     } | ||||
|  | ||||
|     .upload-item__wrapper { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: center; | ||||
|       flex-direction: column; | ||||
|       width: 310px; | ||||
|       height: 180px; | ||||
|       margin-top: 48px; | ||||
|       border-radius: 8px; | ||||
|       border: 2px dashed #aaa8a8; | ||||
|  | ||||
|       image { | ||||
|         width: 100%; | ||||
|         height: 100%; | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         margin-bottom: 8px; | ||||
|         color: #e4e4e4; | ||||
|         font-size: 68px; | ||||
|       } | ||||
|  | ||||
|       h2 { | ||||
|         color: #666666; | ||||
|         font-size: 28px; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| .step { | ||||
|   display: flex; | ||||
|   align-items: center; | ||||
|   height: 176px; | ||||
|   background: #ffffff; | ||||
|   box-shadow: 0 8px 4px 0 rgba(0, 0, 0, 0.05); | ||||
|  | ||||
|   .step-item { | ||||
|     position: relative; | ||||
|     flex: 1; | ||||
|     text-align: center; | ||||
|  | ||||
|     .line { | ||||
|       position: absolute; | ||||
|       top: 20px; | ||||
|       left: 70%; | ||||
|       width: 120px; | ||||
|       height: 2px; | ||||
|       background: #cccccc; | ||||
|  | ||||
|       &.line-active { | ||||
|         background: #467dfe; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     &.active { | ||||
|       div { | ||||
|         font-weight: 600; | ||||
|         color: #467dfe; | ||||
|       } | ||||
|  | ||||
|       span { | ||||
|         background: #467dfe; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     div { | ||||
|       font-size: 26px; | ||||
|       color: #999999; | ||||
|     } | ||||
|  | ||||
|     span { | ||||
|       display: block; | ||||
|       width: 40px; | ||||
|       height: 40px; | ||||
|       line-height: 40px; | ||||
|       margin: 0 auto 18px; | ||||
|       text-align: center; | ||||
|       color: #fff; | ||||
|       font-size: 26px; | ||||
|       border-radius: 50%; | ||||
|       background: #d0d1d6; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										124
									
								
								src/mods/AppServiceOnlineNew/serviceList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/mods/AppServiceOnlineNew/serviceList.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| <template> | ||||
|   <div class="service"> | ||||
|     <div class="service-list"> | ||||
|       <div class="service-item" hover-class="bg-hover" @click="toDetail('./serviceNotice?id=' + item.id)" v-for="(item, index) in list" :key="index"> | ||||
|         <div class="service-item__wrapper"> | ||||
|           <h2>{{ item.processName }}</h2> | ||||
|           <i class="iconfont"></i> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <u-loadmore :status="loadingStatus" :margin-top="30" :margin-bottom="30" color="#999" font-size="26" /> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       id: '', | ||||
|       title: '', | ||||
|       subTitle: '', | ||||
|       current: 0, | ||||
|       list: [], | ||||
|       loadingStatus: 'loadmore', | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   onLoad(query) { | ||||
|     this.id = query.id | ||||
|     this.getList() | ||||
|     uni.setNavigationBarTitle({ | ||||
|       title: query.title, | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.loadingStatus = 'loading' | ||||
|       this.$instance | ||||
|         .post(`/app/approval-process-def/list-xcx?processType=0`, null, { | ||||
|           params: { | ||||
|             size: 10000, | ||||
|             classificationId: this.id, | ||||
|           }, | ||||
|           withoutToken: true, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code === 0) { | ||||
|             if (!res.data.records.length) { | ||||
|               this.loadingStatus = 'nomore' | ||||
|               return false | ||||
|             } | ||||
|  | ||||
|             const data = res.data.records.map((item) => { | ||||
|               return item | ||||
|             }) | ||||
|             if (this.current === 0) this.list = [] | ||||
|  | ||||
|             this.list.push(...data) | ||||
|             this.current = this.current + 1 | ||||
|             this.loadingStatus = 'loadmore' | ||||
|  | ||||
|             if (this.list.length < 10) { | ||||
|               this.loadingStatus = 'nomore' | ||||
|             } | ||||
|           } | ||||
|         }) | ||||
|     }, | ||||
|  | ||||
|     toDetail(url) { | ||||
|       this.$linkTo(url) | ||||
|     }, | ||||
|   }, | ||||
|  | ||||
|   onReachBottom() { | ||||
|     this.getList() | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .service { | ||||
|   padding-bottom: 40px; | ||||
| } | ||||
|  | ||||
| .service-list { | ||||
|   background-color: #fff; | ||||
|  | ||||
|   .service-item { | ||||
|     height: 116px; | ||||
|     padding: 0 32px; | ||||
|  | ||||
|     &:last-child { | ||||
|       .service-item__wrapper { | ||||
|         border-bottom: none; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     .service-item__wrapper { | ||||
|       display: flex; | ||||
|       align-items: center; | ||||
|       justify-content: space-between; | ||||
|       height: 116px; | ||||
|       border-bottom: 1px solid #d8dde6; | ||||
|  | ||||
|       h2 { | ||||
|         color: #333333; | ||||
|         font-size: 32px; | ||||
|         overflow: hidden; | ||||
|         text-overflow: ellipsis; | ||||
|         white-space: nowrap; | ||||
|       } | ||||
|  | ||||
|       i { | ||||
|         position: relative; | ||||
|         right: -4px; | ||||
|         font-size: 36px; | ||||
|         color: #c9c9cd; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										136
									
								
								src/mods/AppServiceOnlineNew/serviceNotice.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								src/mods/AppServiceOnlineNew/serviceNotice.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| <template> | ||||
|   <div class="service-notice" v-if="pageShow"> | ||||
|     <h2>办理须知</h2> | ||||
|     <div class="service-content"> | ||||
|       <u-parse :imageProp="imageProp" className="articalContent" :content="content" /> | ||||
|       <!-- <div v-html="content" class="articalContent"></div> --> | ||||
|       <!-- <u-parse className="articalContent" :html="content"></u-parse> --> | ||||
|     </div> | ||||
|     <div class="service-btn" v-if="processType != 2" @click="toSubmit">我已阅读并同意</div> | ||||
|     <AiLogin ref="login"></AiLogin> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from 'vuex' | ||||
|  | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       content: '', | ||||
|       imageProp: { | ||||
|         mode: 'widthFix', | ||||
|         padding: 0, | ||||
|         lazyLoad: false, | ||||
|         domain: '', | ||||
|       }, | ||||
|       id: '', | ||||
|       title: '', | ||||
|       pageShow: false, | ||||
|       processType: '', | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(['global', 'user', 'token']), | ||||
|   }, | ||||
|   onLoad(query) { | ||||
|     this.id = query.id | ||||
|     this.getInfo(query.id) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getInfo(id) { | ||||
|       // this.$loading() | ||||
|       this.$instance | ||||
|         .post(`/app/approval-process-def/info-id?id=${id}`, null, { | ||||
|           withoutToken: true, | ||||
|         }) | ||||
|         .then((res) => { | ||||
|           if (res.code === 0) { | ||||
|             this.title = res.data.processName | ||||
|             this.content = res.data.needToKnow | ||||
|             this.processType = res.data.processType | ||||
|             uni.setNavigationBarTitle({ | ||||
|               title: res.data.processName, | ||||
|             }) | ||||
|             this.pageShow = true | ||||
|             // this.$hideLoading() | ||||
|           } | ||||
|         }) | ||||
|     }, | ||||
|  | ||||
|     // handleGoto(url, type) { | ||||
|     //   if (type) { | ||||
|     //     if (this.token) { | ||||
|     //       if (type == 'token') { | ||||
|     //         this.$linkTo(url) | ||||
|     //       } | ||||
|     //       if (type == 'idNumber') { | ||||
|     //         if (this.user.status == 0) { | ||||
|     //           if (!this.user.phone) { | ||||
|     //             this.$linkTo('/pages/phone/bingPhoneNumber?from=auth') | ||||
|     //           } else { | ||||
|     //             this.$linkTo('/pages/auth/authenticationInfo') | ||||
|     //           } | ||||
|     //         } else { | ||||
|     //           this.$linkTo(url) | ||||
|     //         } | ||||
|     //       } | ||||
|     //     } else { | ||||
|     //       this.login() | ||||
|     //     } | ||||
|     //   } else { | ||||
|     //     this.$linkTo(url) | ||||
|     //   } | ||||
|     // }, | ||||
|  | ||||
|     // login() { | ||||
|     //   this.$refs.login.show() | ||||
|     // }, | ||||
|  | ||||
|     toSubmit() { | ||||
|       this.linkTo('./serviceForm?id=' + this.id, 'idNumber') | ||||
|     }, | ||||
|   }, | ||||
|   onShareAppMessage() { | ||||
|     return { | ||||
|       title: this.title, | ||||
|       path: `./serviceNotice?id=${this.id}`, | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .service-notice { | ||||
|   min-height: 100vh; | ||||
|   padding-bottom: 122px; | ||||
|   box-sizing: border-box; | ||||
|   background-color: #fff; | ||||
|  | ||||
|   .service-btn { | ||||
|     position: fixed; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     width: 100%; | ||||
|     height: 112px; | ||||
|     line-height: 112px; | ||||
|     text-align: center; | ||||
|     font-size: 34px; | ||||
|     color: #fff; | ||||
|     background: #197df0; | ||||
|   } | ||||
|  | ||||
|   h2 { | ||||
|     padding: 40px 0; | ||||
|     text-align: center; | ||||
|     font-size: 34px; | ||||
|     color: #333; | ||||
|     font-weight: 600; | ||||
|   } | ||||
|  | ||||
|   .service-content { | ||||
|     padding: 0 32px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										81
									
								
								src/mods/AppServiceOnlineNew/serviceResult.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								src/mods/AppServiceOnlineNew/serviceResult.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| <template> | ||||
|   <div class="service-result"> | ||||
|     <image src="/static/img/service-success.png" /> | ||||
|     <h2>申请成功,等待审批!</h2> | ||||
|     <div class="text"> | ||||
|       <span>可在</span> | ||||
|       <i>我的-办事进度</i> | ||||
|       <span>中查看</span> | ||||
|     </div> | ||||
|     <div class="service-btn" hover-class="text-hover" @click="back">确定</div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   data() { | ||||
|     return {} | ||||
|   }, | ||||
|  | ||||
|   onLoad(query) { | ||||
|     uni.setNavigationBarTitle({ | ||||
|       title: query.title, | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     back() { | ||||
|       uni.reLaunch({ | ||||
|         url: './AppServiceOnlineNew', | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .service-result { | ||||
|   min-height: 100vh; | ||||
|   padding-top: 96px; | ||||
|   text-align: center; | ||||
|   background: #fff; | ||||
|   box-sizing: border-box; | ||||
|  | ||||
|   .service-btn { | ||||
|     width: 558px; | ||||
|     height: 88px; | ||||
|     line-height: 88px; | ||||
|     margin: 120px auto 0; | ||||
|     text-align: center; | ||||
|     background: #197df0; | ||||
|     font-size: 36px; | ||||
|     color: #fff; | ||||
|     box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.02); | ||||
|     border-radius: 8px; | ||||
|   } | ||||
|  | ||||
|   h2 { | ||||
|     margin-bottom: 32px; | ||||
|     color: #333333; | ||||
|     font-size: 36px; | ||||
|     font-weight: 600; | ||||
|   } | ||||
|  | ||||
|   .text { | ||||
|     display: flex; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     font-size: 28px; | ||||
|     color: #333; | ||||
|  | ||||
|     i { | ||||
|       color: #467dfe; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   image { | ||||
|     width: 192px; | ||||
|     height: 192px; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
		Reference in New Issue
	
	Block a user