¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢åå
¸æ°æ®å表 |
| | | export function listData(query) { |
| | | return request({ |
| | | url: '/system/dict/data/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢åå
¸æ°æ®è¯¦ç» |
| | | export function getData(dictCode) { |
| | | return request({ |
| | | url: '/system/dict/data/' + dictCode, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ ¹æ®åå
¸ç±»åæ¥è¯¢åå
¸æ°æ®ä¿¡æ¯ |
| | | export function getDicts(dictType) { |
| | | return request({ |
| | | url: '/system/dict/data/type/' + dictType, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢åå
¸æ°æ® |
| | | export function addData(data) { |
| | | return request({ |
| | | url: '/system/dict/data', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹åå
¸æ°æ® |
| | | export function updateData(data) { |
| | | return request({ |
| | | url: '/system/dict/data', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤åå
¸æ°æ® |
| | | export function delData(dictCode) { |
| | | return request({ |
| | | url: '/system/dict/data/' + dictCode, |
| | | method: 'delete' |
| | | }) |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢é¡¹ç®ä¿¡æ¯å表 |
| | | export function listProjectInfo(query) { |
| | | return request({ |
| | | url: '/bs/projectInfo/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢é¡¹ç®ä¿¡æ¯å表 |
| | | export function listProjectInfoNoPage(query) { |
| | | return request({ |
| | | url: '/bs/projectInfo/listNoPage', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢é¡¹ç®ä¿¡æ¯è¯¦ç» |
| | | export function getProjectInfo(projectId) { |
| | | return request({ |
| | | url: '/bs/projectInfo/' + projectId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢é¡¹ç®ä¿¡æ¯ |
| | | export function addProjectInfo(data) { |
| | | return request({ |
| | | url: '/bs/projectInfo', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹é¡¹ç®ä¿¡æ¯ |
| | | export function updateProjectInfo(data) { |
| | | return request({ |
| | | url: '/bs/projectInfo', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤é¡¹ç®ä¿¡æ¯ |
| | | export function delProjectInfo(projectId) { |
| | | return request({ |
| | | url: '/bs/projectInfo/' + projectId, |
| | | method: 'delete' |
| | | }) |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢å·¥æ¶æç»å表 |
| | | export function listWorkHourInfo(query) { |
| | | return request({ |
| | | url: '/am/workHourInfo/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function listWorkHourInfoNoPage(query) { |
| | | return request({ |
| | | url: '/am/workHourInfo/listNoPage', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function listWorkHourInfoCommon(query) { |
| | | return request({ |
| | | url: '/am/workHourInfoCommon/listWorkHourInfoCommon', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢å·¥æ¶æç»è¯¦ç» |
| | | export function getWorkHourInfo(workHourId) { |
| | | return request({ |
| | | url: '/am/workHourInfo/' + workHourId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢å·¥æ¶æç» |
| | | export function appAddWorkHourInfo(data) { |
| | | return request({ |
| | | url: '/am/workHourInfo/appAdd', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹å·¥æ¶æç» |
| | | export function appUpdateWorkHourInfo(data) { |
| | | return request({ |
| | | url: '/am/workHourInfo/appUpdate', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤å·¥æ¶æç» |
| | | export function delWorkHourInfo(workHourId) { |
| | | return request({ |
| | | url: '/am/workHourInfo/' + workHourId, |
| | | method: 'delete' |
| | | }) |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <uni-popup |
| | | ref="popup" |
| | | type="bottom" |
| | | @change="onPopupChange" |
| | | > |
| | | <view class="popup-content"> |
| | | <view class="popup-header"> |
| | | <text class="popup-title">éæ©é¡¹ç®</text> |
| | | <text class="popup-close" @click="handleClose">Ã</text> |
| | | </view> |
| | | <!-- æ·»å æç´¢æ¡ --> |
| | | <view class="popup-search"> |
| | | <uni-easyinput |
| | | v-model="searchKeyword" |
| | | placeholder="æ索项ç®" |
| | | prefixIcon="search" |
| | | /> |
| | | </view> |
| | | <scroll-view scroll-y class="popup-list"> |
| | | <!-- æ·»å å è½½ç¶ææ¾ç¤º --> |
| | | <view v-if="loading" class="loading-container"> |
| | | <uni-load-more status="loading" :content-text="loadingText"></uni-load-more> |
| | | </view> |
| | | <!-- æ·»å 空ç¶ææ¾ç¤º --> |
| | | <view v-else-if="!projectList.length" class="empty-container"> |
| | | <text class="empty-text">ææ 项ç®æ°æ®</text> |
| | | </view> |
| | | <!-- 项ç®å表 --> |
| | | <template v-else> |
| | | <view |
| | | class="popup-item" |
| | | v-for="item in filteredProjects" |
| | | :key="item.value" |
| | | @click="handleConfirm(item)" |
| | | > |
| | | {{ item.text }} |
| | | </view> |
| | | </template> |
| | | </scroll-view> |
| | | </view> |
| | | </uni-popup> |
| | | </template> |
| | | |
| | | <style> |
| | | .popup-content { |
| | | background-color: #fff; |
| | | border-radius: 16px 16px 0 0; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .popup-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #eee; |
| | | } |
| | | |
| | | .popup-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .popup-close { |
| | | font-size: 20px; |
| | | color: #666; |
| | | padding: 0 10px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .popup-search { |
| | | padding: 10px 0; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .popup-list { |
| | | margin-top: 10px; |
| | | max-height: 40vh; |
| | | } |
| | | |
| | | .popup-item { |
| | | padding: 12px 15px; |
| | | border-bottom: 1px solid #ebeef5; |
| | | transition: all 0.3s; |
| | | } |
| | | |
| | | .popup-item:hover { |
| | | background-color: #f5f7fa; |
| | | } |
| | | |
| | | .popup-item:active { |
| | | background-color: #e8f4ff; |
| | | } |
| | | |
| | | :deep(.uni-easyinput__content) { |
| | | background-color: #f5f5f5; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | /* æ·»å å è½½ç¶æå空ç¶ææ ·å¼ */ |
| | | .loading-container, |
| | | .empty-container { |
| | | padding: 20px 0; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | .empty-text { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | } |
| | | </style> |
| | | |
| | | <script> |
| | | import { listProjectInfoNoPage } from '@/api/dema/projectInfo.js' |
| | | |
| | | export default { |
| | | name: 'ProjectSelector', |
| | | props: { |
| | | value: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | loadingText: '', |
| | | searchKeyword: '', |
| | | selectedValue: '', |
| | | projectList: [], |
| | | loading: false, |
| | | } |
| | | }, |
| | | computed: { |
| | | filteredProjects() { |
| | | if (!this.searchKeyword) return this.projectList; |
| | | const keyword = this.searchKeyword.toLowerCase(); |
| | | return this.projectList.filter(item => |
| | | item.text.toLowerCase().includes(keyword) || |
| | | item.value.toLowerCase().includes(keyword) |
| | | ); |
| | | } |
| | | }, |
| | | created() { |
| | | // ç»ä»¶å建æ¶å 载项ç®å表 |
| | | this.getProjectList(); |
| | | }, |
| | | methods: { |
| | | // è·å项ç®å表 |
| | | async getProjectList() { |
| | | try { |
| | | this.loading = true; |
| | | const response = await listProjectInfoNoPage(); |
| | | if (response && response.rows) { |
| | | // 转æ¢APIè¿åçæ°æ®æ ¼å¼ |
| | | this.projectList = response.rows.map(item => ({ |
| | | value: item.projectCode, |
| | | text: item.projectName |
| | | })); |
| | | } |
| | | } catch (error) { |
| | | console.error('è·å项ç®å表失败:', error); |
| | | this.$modal.msgError('è·å项ç®å表失败'); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | show() { |
| | | // æ¯æ¬¡æ¾ç¤ºæ¶å·æ°é¡¹ç®å表 |
| | | this.getProjectList(); |
| | | this.$refs.popup.open(); |
| | | }, |
| | | handleClose() { |
| | | this.$refs.popup.close(); |
| | | this.searchKeyword = ''; |
| | | }, |
| | | handleConfirm(item) { |
| | | this.$emit('input', item.value); |
| | | this.$emit('change', { |
| | | value: item.value, |
| | | text: item.text, |
| | | }); |
| | | this.handleClose(); |
| | | }, |
| | | onPopupChange(e) { |
| | | if (!e.show) { |
| | | this.searchKeyword = ''; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import * as dd from 'dingtalk-jsapi'; |
| | | import {ddlogin} from "@/api/login"; |
| | | export function ddReady() { |
| | | return new Promise((resolve, reject) => { |
| | | var corpId = 'dingb6bf7fe744b1273835c2f4657eb6378f'; |
| | | // 使ç¨SDK è·åå
ç»ææç |
| | | dd.runtime.permission.requestAuthCode({ |
| | | corpId: corpId, |
| | | onSuccess: function (result) { |
| | | var code = result.code; |
| | | sessionStorage.setItem('code', code); |
| | | ddlogin({ authCode: code }).then(res => { |
| | | if (res.code === 200) { |
| | | resolve(res.data); // è¿åæ°æ® |
| | | } else { |
| | | reject(new Error('ç»å½å¤±è´¥')); // å¤çé误 |
| | | } |
| | | }).catch(error => { |
| | | reject(error); // å¤ç ddlogin çé误 |
| | | }); |
| | | }, |
| | | onFail: function (err) { |
| | | reject(err); // å¤ç requestAuthCode çé误 |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | export default { |
| | | dd |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="project-selector"> |
| | | <uni-popup ref="popup" type="center"> |
| | | <view class="popup-content"> |
| | | <view class="popup-header"> |
| | | <text class="title">éæ©é¡¹ç®</text> |
| | | <text class="close" @click="handleClose">Ã</text> |
| | | </view> |
| | | |
| | | <view class="search-box"> |
| | | <uni-easyinput |
| | | v-model="searchKeyword" |
| | | placeholder="æ索项ç®" |
| | | prefixIcon="search" |
| | | @input="handleSearch" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="list-container"> |
| | | <uni-list> |
| | | <uni-list-item v-for="item in filteredProjectList" :key="item.value"> |
| | | <template v-slot:header> |
| | | <radio-group @change="handleRadioChange"> |
| | | <radio :value="item.value" :checked="selectedValue === item.value" /> |
| | | </radio-group> |
| | | </template> |
| | | <template v-slot:body> |
| | | <text class="project-text">{{ item.text }}</text> |
| | | </template> |
| | | </uni-list-item> |
| | | </uni-list> |
| | | </view> |
| | | <view class="popup-footer"> |
| | | <button type="primary" @click="handleConfirm">ç¡®å®</button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'ProjectSelector', |
| | | props: { |
| | | value: { |
| | | type: [String, Number], |
| | | default: '' |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | selectedValue: '', |
| | | searchKeyword: '', |
| | | projectList: [ |
| | | { value: '0', text: "042æ¹å·æºè¯" }, |
| | | { value: '1', text: "040æ¥é£å¨å" }, |
| | | ] |
| | | } |
| | | }, |
| | | computed: { |
| | | filteredProjectList() { |
| | | if (!this.searchKeyword) return this.projectList; |
| | | return this.projectList.filter(item => |
| | | item.text.toLowerCase().includes(this.searchKeyword.toLowerCase()) |
| | | ); |
| | | } |
| | | }, |
| | | created() { |
| | | this.selectedValue = this.value |
| | | }, |
| | | methods: { |
| | | show() { |
| | | this.$refs.popup.open() |
| | | }, |
| | | handleClose() { |
| | | this.$refs.popup.close() |
| | | this.searchKeyword = '' |
| | | }, |
| | | handleRadioChange(e) { |
| | | this.selectedValue = e.detail.value |
| | | }, |
| | | handleConfirm() { |
| | | const selectedProject = this.projectList.find(item => item.value === this.selectedValue) |
| | | this.$emit('input', this.selectedValue) |
| | | this.$emit('change', selectedProject) |
| | | if (selectedProject) { |
| | | this.$emit('input', this.selectedValue) |
| | | this.$emit('change', { |
| | | value: selectedProject.value, |
| | | text: selectedProject.text, |
| | | }) |
| | | } |
| | | this.handleClose() |
| | | }, |
| | | handleSearch(value) { |
| | | this.searchKeyword = value |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style> |
| | | .project-selector { |
| | | width: 100%; |
| | | } |
| | | |
| | | .popup-content { |
| | | background-color: #fff; |
| | | width: 90vw; |
| | | border-radius: 10px; |
| | | padding: 10px; |
| | | } |
| | | |
| | | .popup-header { |
| | | padding: 2px; |
| | | border-bottom: 1px solid #eee; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .close { |
| | | font-size: 20px; |
| | | color: #666; |
| | | padding: 0 10px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .search-box { |
| | | padding: 10px; |
| | | border-bottom: 1px solid #eee; |
| | | } |
| | | |
| | | .list-container { |
| | | max-height: 60vh; |
| | | overflow-y: auto; |
| | | padding: 10px 0; |
| | | } |
| | | |
| | | .project-text { |
| | | margin-left: 10px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .popup-footer { |
| | | padding: 15px; |
| | | border-top: 1px solid #eee; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | .popup-footer button { |
| | | min-width: 100px; |
| | | } |
| | | |
| | | radio-group { |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | :deep(.uni-list-item) { |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | :deep(.uni-list-item__container) { |
| | | padding: 8px 15px; |
| | | } |
| | | |
| | | :deep(.uni-easyinput__content) { |
| | | background-color: #f5f5f5; |
| | | border-radius: 4px; |
| | | } |
| | | </style> |