| New file |
| | |
| | | <template> |
| | | <view class="attachment-upload-container"> |
| | | <view class="detail-section"> |
| | | <view class="section-title"> |
| | | {{ title }} |
| | | <button class="upload-btn" @click="showUploadDialog">ä¸ä¼ éä»¶</button> |
| | | </view> |
| | | <view v-if="attachmentList && attachmentList.length > 0"> |
| | | <view class="attachment-item" v-for="(item, index) in attachmentList" :key="item.attachmentId"> |
| | | <view class="attachment-thumbnail" @click="viewAttachment(item)"> |
| | | <image :src="getImageUrl(item)" mode="aspectFill" class="thumbnail-image"></image> |
| | | </view> |
| | | <view class="attachment-info"> |
| | | <view class="attachment-category"> |
| | | <text class="category-tag">{{ getCategoryName(item.attachmentCategory) }}</text> |
| | | </view> |
| | | <view class="attachment-meta"> |
| | | <text class="upload-time">{{ formatTime(item.uploadTime) }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="attachment-actions"> |
| | | <button class="action-btn view-btn" @click="viewAttachment(item)">æ¥ç</button> |
| | | <button class="action-btn delete-btn" @click="deleteAttachment(item.attachmentId, index)">å é¤</button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else class="no-attachment"> |
| | | <text>ææ éä»¶</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- éä»¶ä¸ä¼ å¯¹è¯æ¡ --> |
| | | <uni-popup ref="uploadPopup" type="bottom"> |
| | | <view class="upload-dialog"> |
| | | <view class="dialog-header"> |
| | | <text class="dialog-title">ä¸ä¼ éä»¶</text> |
| | | <uni-icons type="closeempty" size="24" @click="closeUploadDialog"></uni-icons> |
| | | </view> |
| | | <view class="dialog-content"> |
| | | <view class="form-item"> |
| | | <view class="form-label">éä»¶åç±»</view> |
| | | <picker @change="onCategoryChange" :value="selectedCategoryIndex" :range="categoryList" range-key="label"> |
| | | <view class="picker-value"> |
| | | {{ categoryList[selectedCategoryIndex].label }} |
| | | <uni-icons type="arrowdown" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | <view class="form-item"> |
| | | <view class="form-label">éæ©å¾ç</view> |
| | | <button class="choose-image-btn" @click="chooseImage"> |
| | | <uni-icons type="image" size="20"></uni-icons> |
| | | <text>ç¹å»éæ©</text> |
| | | </button> |
| | | </view> |
| | | <view class="preview-area" v-if="tempImagePath"> |
| | | <image :src="tempImagePath" mode="aspectFit" class="preview-image"></image> |
| | | </view> |
| | | </view> |
| | | <view class="dialog-footer"> |
| | | <button class="cancel-btn" @click="closeUploadDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmUpload" :disabled="!tempImagePath">ç¡®å®ä¸ä¼ </button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getAttachmentList, uploadAttachmentFromWechat, deleteAttachment, getWechatAccessToken } from '@/api/task' |
| | | import { formatDateTime } from '@/utils/common' |
| | | |
| | | export default { |
| | | name: 'AttachmentUpload', |
| | | props: { |
| | | // ä»»å¡ID |
| | | taskId: { |
| | | type: [String, Number], |
| | | required: true |
| | | }, |
| | | // æ é¢ |
| | | title: { |
| | | type: String, |
| | | default: 'ä»»å¡éä»¶' |
| | | }, |
| | | // æ¯å¦èªå¨å è½½éä»¶å表 |
| | | autoLoad: { |
| | | type: Boolean, |
| | | default: true |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | attachmentList: [], |
| | | categoryList: [ |
| | | { label: 'ç¥æ
åæä¹¦', value: '1' }, |
| | | { label: 'ç
äººèµæ', value: '2' }, |
| | | { label: 'æä½è®°å½', value: '3' }, |
| | | { label: 'åºè½¦å', value: '4' }, |
| | | { label: 'åºè½¦å', value: '5' }, |
| | | { label: 'ç³»å®å
¨å¸¦', value: '6' } |
| | | ], |
| | | selectedCategoryIndex: 0, |
| | | tempImagePath: null, |
| | | isWechatMiniProgram: false |
| | | } |
| | | }, |
| | | mounted() { |
| | | // æ£æµæ¯å¦æ¯å¾®ä¿¡å°ç¨åºç¯å¢ |
| | | // #ifdef MP-WEIXIN |
| | | this.isWechatMiniProgram = true |
| | | // #endif |
| | | |
| | | // èªå¨å è½½éä»¶å表 |
| | | if (this.autoLoad && this.taskId) { |
| | | this.loadAttachmentList() |
| | | } |
| | | }, |
| | | watch: { |
| | | // çå¬taskIdååï¼éæ°å è½½éä»¶å表 |
| | | taskId(newVal) { |
| | | if (newVal && this.autoLoad) { |
| | | this.loadAttachmentList() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | // å è½½éä»¶å表 |
| | | loadAttachmentList() { |
| | | if (!this.taskId) { |
| | | return |
| | | } |
| | | |
| | | getAttachmentList(this.taskId).then(response => { |
| | | this.attachmentList = response.data || response || [] |
| | | this.$emit('loaded', this.attachmentList) |
| | | }).catch(error => { |
| | | console.error('å è½½éä»¶å表失败:', error) |
| | | this.$emit('error', error) |
| | | }) |
| | | }, |
| | | |
| | | // æ¾ç¤ºä¸ä¼ å¯¹è¯æ¡ |
| | | showUploadDialog() { |
| | | this.selectedCategoryIndex = 0 |
| | | this.tempImagePath = null |
| | | this.$refs.uploadPopup.open() |
| | | }, |
| | | |
| | | // å
³éä¸ä¼ å¯¹è¯æ¡ |
| | | closeUploadDialog() { |
| | | this.$refs.uploadPopup.close() |
| | | }, |
| | | |
| | | // åç±»éæ©åå |
| | | onCategoryChange(e) { |
| | | this.selectedCategoryIndex = e.detail.value |
| | | }, |
| | | |
| | | // éæ©å¾ç |
| | | chooseImage() { |
| | | const that = this |
| | | uni.chooseImage({ |
| | | count: 1, |
| | | sizeType: ['compressed'], |
| | | sourceType: ['album', 'camera'], |
| | | success: function(res) { |
| | | that.tempImagePath = res.tempFilePaths[0] |
| | | }, |
| | | fail: function(err) { |
| | | console.error('éæ©å¾ç失败:', err) |
| | | that.$modal.showToast('éæ©å¾ç失败') |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | // 确认ä¸ä¼ |
| | | confirmUpload() { |
| | | if (!this.tempImagePath) { |
| | | this.$modal.showToast('请å
éæ©å¾ç') |
| | | return |
| | | } |
| | | |
| | | const that = this |
| | | const category = this.categoryList[this.selectedCategoryIndex].value |
| | | |
| | | // 微信å°ç¨åºç¯å¢ï¼å
è·åAccessTokenï¼åä¸ä¼ å°å¾®ä¿¡æå¡å¨ï¼æåæäº¤mediaIdå°å端 |
| | | // #ifdef MP-WEIXIN |
| | | if (this.isWechatMiniProgram) { |
| | | uni.showLoading({ |
| | | title: 'ä¸ä¼ ä¸...' |
| | | }) |
| | | |
| | | // ç¬¬ä¸æ¥ï¼ä»å端è·åAccessToken |
| | | getWechatAccessToken().then(tokenResponse => { |
| | | // æ¥å£è¿åæ ¼å¼ï¼{"msg":"tokenå¼","code":200} |
| | | console.log('è·åAccessTokenæå:', tokenResponse) |
| | | const accessToken = tokenResponse.msg || tokenResponse.data || tokenResponse |
| | | if (!accessToken) { |
| | | uni.hideLoading() |
| | | that.$modal.showToast('è·åAccessToken失败') |
| | | console.error('è·åAccessToken失败ï¼ååºæ°æ®:', tokenResponse) |
| | | return |
| | | } |
| | | |
| | | console.log('è·åå°AccessToken:', accessToken) |
| | | |
| | | // ç¬¬äºæ¥ï¼ä¸ä¼ å°å¾®ä¿¡æå¡å¨ |
| | | const uploadUrl = `https://api.weixin.qq.com/cgi-bin/media/upload?access_token=${accessToken}&type=image` |
| | | |
| | | uni.uploadFile({ |
| | | url: uploadUrl, |
| | | filePath: that.tempImagePath, |
| | | name: 'media', |
| | | success: function(res) { |
| | | console.log('微信ä¸ä¼ ååº:', res) |
| | | try { |
| | | const data = JSON.parse(res.data) |
| | | if (data.media_id) { |
| | | // ç¬¬ä¸æ¥ï¼æäº¤mediaIdå°å端 |
| | | uploadAttachmentFromWechat(that.taskId, data.media_id, category).then(response => { |
| | | uni.hideLoading() |
| | | that.$modal.showToast('ä¸ä¼ æå') |
| | | that.closeUploadDialog() |
| | | that.loadAttachmentList() |
| | | that.$emit('uploaded', response) |
| | | }).catch(error => { |
| | | uni.hideLoading() |
| | | console.error('æäº¤mediaId失败:', error) |
| | | that.$modal.showToast('ä¸ä¼ 失败ï¼' + (error.msg || '请éè¯')) |
| | | that.$emit('error', error) |
| | | }) |
| | | } else { |
| | | uni.hideLoading() |
| | | const errMsg = data.errmsg || 'æªç¥é误' |
| | | console.error('微信è¿åé误:', data) |
| | | that.$modal.showToast('微信ä¸ä¼ 失败ï¼' + errMsg) |
| | | } |
| | | } catch (e) { |
| | | uni.hideLoading() |
| | | console.error('è§£æå¾®ä¿¡ååºå¤±è´¥:', e, res.data) |
| | | that.$modal.showToast('ä¸ä¼ 失败ï¼ååºè§£æé误') |
| | | } |
| | | }, |
| | | fail: function(err) { |
| | | uni.hideLoading() |
| | | console.error('ä¸ä¼ å°å¾®ä¿¡å¤±è´¥:', err) |
| | | that.$modal.showToast('ä¸ä¼ 失败ï¼' + (err.errMsg || 'è¯·æ£æ¥ç½ç»')) |
| | | that.$emit('error', err) |
| | | } |
| | | }) |
| | | }).catch(error => { |
| | | uni.hideLoading() |
| | | console.error('è·åAccessToken失败:', error) |
| | | that.$modal.showToast('è·åAccessToken失败') |
| | | that.$emit('error', error) |
| | | }) |
| | | return |
| | | } |
| | | // #endif |
| | | |
| | | // é微信å°ç¨åºç¯å¢ï¼ç´æ¥ä¸ä¼ å°å端æå¡å¨ |
| | | uni.showLoading({ |
| | | title: 'ä¸ä¼ ä¸...' |
| | | }) |
| | | |
| | | uni.uploadFile({ |
| | | url: that.$baseUrl + '/task/attachment/upload/' + that.taskId, |
| | | filePath: that.tempImagePath, |
| | | name: 'file', |
| | | formData: { |
| | | 'category': category |
| | | }, |
| | | header: { |
| | | 'Authorization': 'Bearer ' + uni.getStorageSync('token') |
| | | }, |
| | | success: function(uploadRes) { |
| | | uni.hideLoading() |
| | | |
| | | if (uploadRes.statusCode === 200) { |
| | | const result = JSON.parse(uploadRes.data) |
| | | if (result.code === 200) { |
| | | that.$modal.showToast('ä¸ä¼ æå') |
| | | that.closeUploadDialog() |
| | | that.loadAttachmentList() |
| | | that.$emit('uploaded', result) |
| | | } else { |
| | | that.$modal.showToast(result.msg || 'ä¸ä¼ 失败') |
| | | that.$emit('error', result) |
| | | } |
| | | } else { |
| | | that.$modal.showToast('ä¸ä¼ 失败') |
| | | that.$emit('error', uploadRes) |
| | | } |
| | | }, |
| | | fail: function(err) { |
| | | uni.hideLoading() |
| | | console.error('ä¸ä¼ 失败:', err) |
| | | that.$modal.showToast('ä¸ä¼ 失败') |
| | | that.$emit('error', err) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | // æ¥çéä»¶ |
| | | viewAttachment(item) { |
| | | // 妿æ¯å¾çï¼ä½¿ç¨å¾çé¢è§ |
| | | const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp'] |
| | | const fileExt = item.fileName.split('.').pop().toLowerCase() |
| | | |
| | | if (imageTypes.includes(fileExt)) { |
| | | // ä¼å
使ç¨fileUrlåæ®µï¼åç«¯æ¼æ¥å¥½ç宿´URLï¼ |
| | | let imageUrl = item.fileUrl |
| | | // å¦ææ²¡æfileUrlï¼å使ç¨ä¸è½½æ¥å£ |
| | | if (!imageUrl) { |
| | | imageUrl = this.$baseUrl + '/task/attachment/download/' + item.attachmentId |
| | | } |
| | | |
| | | // 微信å°ç¨åºä¸é¢è§å¾ç |
| | | // #ifdef MP-WEIXIN |
| | | // 微信å°ç¨åºéè¦å
ä¸è½½å°æ¬å°åé¢è§ |
| | | uni.showLoading({ title: 'å è½½ä¸...' }) |
| | | uni.downloadFile({ |
| | | url: imageUrl, |
| | | success: function(res) { |
| | | uni.hideLoading() |
| | | if (res.statusCode === 200) { |
| | | uni.previewImage({ |
| | | urls: [res.tempFilePath], |
| | | current: res.tempFilePath |
| | | }) |
| | | } else { |
| | | uni.showToast({ title: 'å è½½å¾ç失败', icon: 'none' }) |
| | | } |
| | | }, |
| | | fail: function() { |
| | | uni.hideLoading() |
| | | uni.showToast({ title: 'ä¸è½½å¤±è´¥', icon: 'none' }) |
| | | } |
| | | }) |
| | | // #endif |
| | | |
| | | // é微信å°ç¨åºç¯å¢ï¼ç´æ¥é¢è§ |
| | | // #ifndef MP-WEIXIN |
| | | uni.previewImage({ |
| | | urls: [imageUrl], |
| | | current: imageUrl |
| | | }) |
| | | // #endif |
| | | } else { |
| | | this.$modal.showToast('ä»
æ¯æé¢è§å¾ç') |
| | | } |
| | | |
| | | this.$emit('view', item) |
| | | }, |
| | | |
| | | // å é¤éä»¶ |
| | | deleteAttachment(attachmentId, index) { |
| | | const that = this |
| | | this.$modal.confirm('ç¡®å®è¦å é¤è¯¥éä»¶åï¼').then(() => { |
| | | deleteAttachment(attachmentId).then(response => { |
| | | that.$modal.showToast('å 餿å') |
| | | that.attachmentList.splice(index, 1) |
| | | that.$emit('deleted', attachmentId) |
| | | }).catch(error => { |
| | | console.error('å é¤é件失败:', error) |
| | | that.$modal.showToast('å é¤å¤±è´¥') |
| | | that.$emit('error', error) |
| | | }) |
| | | }).catch(() => {}) |
| | | }, |
| | | |
| | | // è·ååç±»åç§° |
| | | getCategoryName(category) { |
| | | console.log('category', category) |
| | | const item = this.categoryList.find(c => c.value === category) |
| | | return item ? item.label : 'æªåç±»' |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¶é´ |
| | | formatTime(time) { |
| | | if (!time) return '' |
| | | return formatDateTime(time, 'YYYY-MM-DD HH:mm') |
| | | }, |
| | | |
| | | // æ ¼å¼åæä»¶å¤§å° |
| | | formatFileSize(size) { |
| | | if (!size) return '0B' |
| | | if (size < 1024) return size + 'B' |
| | | if (size < 1024 * 1024) return (size / 1024).toFixed(2) + 'KB' |
| | | return (size / 1024 / 1024).toFixed(2) + 'MB' |
| | | }, |
| | | |
| | | // è·åå¾çURL |
| | | getImageUrl(item) { |
| | | |
| | | // ä¼å
使ç¨fileUrlåæ®µï¼åç«¯æ¼æ¥å¥½ç宿´URLï¼ |
| | | if (item.fileUrl) { |
| | | return item.fileUrl |
| | | } |
| | | // 使ç¨ä¸è½½æ¥å£ |
| | | if (item.attachmentId) { |
| | | return this.$baseUrl + '/task/attachment/download/' + item.attachmentId |
| | | } |
| | | // é»è®¤å ä½å¾ |
| | | return '/static/images/default-image.png' |
| | | }, |
| | | |
| | | // å·æ°éä»¶å表ï¼ä¾å¤é¨è°ç¨ï¼ |
| | | refresh() { |
| | | this.loadAttachmentList() |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .attachment-upload-container { |
| | | .detail-section { |
| | | background-color: white; |
| | | border-radius: 15rpx; |
| | | padding: 30rpx; |
| | | margin-bottom: 20rpx; |
| | | box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
| | | |
| | | .section-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | margin-bottom: 20rpx; |
| | | color: #333; |
| | | border-bottom: 1rpx solid #f0f0f0; |
| | | padding-bottom: 10rpx; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | |
| | | .upload-btn { |
| | | font-size: 24rpx; |
| | | padding: 8rpx 20rpx; |
| | | background-color: #007AFF; |
| | | color: white; |
| | | border-radius: 8rpx; |
| | | border: none; |
| | | } |
| | | } |
| | | |
| | | .no-attachment { |
| | | text-align: center; |
| | | padding: 40rpx 0; |
| | | color: #999; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | .attachment-item { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 20rpx; |
| | | margin-bottom: 15rpx; |
| | | background-color: #f9f9f9; |
| | | border-radius: 10rpx; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .attachment-thumbnail { |
| | | width: 120rpx; |
| | | height: 120rpx; |
| | | border-radius: 8rpx; |
| | | overflow: hidden; |
| | | margin-right: 20rpx; |
| | | flex-shrink: 0; |
| | | background-color: #f0f0f0; |
| | | |
| | | .thumbnail-image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | } |
| | | |
| | | .attachment-info { |
| | | flex: 1; |
| | | margin-right: 20rpx; |
| | | |
| | | .attachment-category { |
| | | margin-bottom: 8rpx; |
| | | |
| | | .category-tag { |
| | | display: inline-block; |
| | | padding: 4rpx 12rpx; |
| | | background-color: #007AFF; |
| | | color: white; |
| | | font-size: 22rpx; |
| | | border-radius: 4rpx; |
| | | } |
| | | } |
| | | |
| | | .attachment-meta { |
| | | font-size: 24rpx; |
| | | color: #999; |
| | | |
| | | .upload-time { |
| | | margin-right: 20rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .attachment-actions { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 10rpx; |
| | | |
| | | .action-btn { |
| | | padding: 8rpx 20rpx; |
| | | font-size: 24rpx; |
| | | border-radius: 6rpx; |
| | | border: none; |
| | | |
| | | &.view-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | |
| | | &.delete-btn { |
| | | background-color: #ff3b30; |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .upload-dialog { |
| | | background-color: white; |
| | | border-radius: 20rpx 20rpx 0 0; |
| | | padding: 30rpx; |
| | | |
| | | .dialog-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 30rpx; |
| | | |
| | | .dialog-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .dialog-content { |
| | | .form-item { |
| | | margin-bottom: 30rpx; |
| | | |
| | | .form-label { |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | margin-bottom: 15rpx; |
| | | } |
| | | |
| | | .picker-value { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 20rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .choose-image-btn { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 30rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | border: 2rpx dashed #ccc; |
| | | color: #666; |
| | | font-size: 28rpx; |
| | | |
| | | text { |
| | | margin-left: 10rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .preview-area { |
| | | margin-top: 20rpx; |
| | | |
| | | .preview-image { |
| | | width: 100%; |
| | | height: 400rpx; |
| | | border-radius: 10rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .dialog-footer { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | margin-top: 30rpx; |
| | | |
| | | button { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 30rpx; |
| | | border: none; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | background-color: #f5f5f5; |
| | | color: #666; |
| | | } |
| | | |
| | | .confirm-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | |
| | | &:disabled { |
| | | background-color: #ccc; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </view> |
| | | |
| | | <!-- éä»¶ä¿¡æ¯ --> |
| | | <view class="detail-section"> |
| | | <view class="section-title"> |
| | | ä»»å¡éä»¶ |
| | | <button class="upload-btn" @click="showUploadDialog">ä¸ä¼ éä»¶</button> |
| | | </view> |
| | | <view v-if="attachmentList && attachmentList.length > 0"> |
| | | <view class="attachment-item" v-for="(item, index) in attachmentList" :key="item.attachmentId"> |
| | | <view class="attachment-info"> |
| | | <view class="attachment-category"> |
| | | <text class="category-tag">{{ getCategoryName(item.attachmentCategory) }}</text> |
| | | </view> |
| | | <view class="attachment-name">{{ item.fileName }}</view> |
| | | <view class="attachment-meta"> |
| | | <text class="upload-time">{{ formatTime(item.uploadTime) }}</text> |
| | | <text class="file-size">{{ formatFileSize(item.fileSize) }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="attachment-actions"> |
| | | <button class="action-btn view-btn" @click="viewAttachment(item)">æ¥ç</button> |
| | | <button class="action-btn delete-btn" @click="deleteAttachment(item.attachmentId, index)">å é¤</button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else class="no-attachment"> |
| | | <text>ææ éä»¶</text> |
| | | </view> |
| | | </view> |
| | | <AttachmentUpload |
| | | :taskId="taskId" |
| | | title="ä»»å¡éä»¶" |
| | | @uploaded="onAttachmentUploaded" |
| | | @deleted="onAttachmentDeleted" |
| | | /> |
| | | |
| | | <!-- ç¦ç¥è½¦ä»»å¡ç¹æä¿¡æ¯ --> |
| | | <view class="detail-section" v-if="taskDetail.taskType === 'WELFARE' && taskDetail.welfareInfo"> |
| | |
| | | |
| | | <!-- 已宿/已忶: 䏿¾ç¤ºæé® --> |
| | | </view> |
| | | |
| | | <!-- éä»¶ä¸ä¼ å¯¹è¯æ¡ --> |
| | | <uni-popup ref="uploadPopup" type="bottom"> |
| | | <view class="upload-dialog"> |
| | | <view class="dialog-header"> |
| | | <text class="dialog-title">ä¸ä¼ éä»¶</text> |
| | | <uni-icons type="closeempty" size="24" @click="closeUploadDialog"></uni-icons> |
| | | </view> |
| | | <view class="dialog-content"> |
| | | <view class="form-item"> |
| | | <view class="form-label">éä»¶åç±»</view> |
| | | <picker @change="onCategoryChange" :value="selectedCategoryIndex" :range="categoryList" range-key="label"> |
| | | <view class="picker-value"> |
| | | {{ categoryList[selectedCategoryIndex].label }} |
| | | <uni-icons type="arrowdown" size="16"></uni-icons> |
| | | </view> |
| | | </picker> |
| | | </view> |
| | | <view class="form-item"> |
| | | <view class="form-label">éæ©å¾ç</view> |
| | | <button class="choose-image-btn" @click="chooseImage"> |
| | | <uni-icons type="image" size="20"></uni-icons> |
| | | <text>ç¹å»éæ©</text> |
| | | </button> |
| | | </view> |
| | | <view class="preview-area" v-if="tempImagePath"> |
| | | <image :src="tempImagePath" mode="aspectFit" class="preview-image"></image> |
| | | </view> |
| | | </view> |
| | | <view class="dialog-footer"> |
| | | <button class="cancel-btn" @click="closeUploadDialog">åæ¶</button> |
| | | <button class="confirm-btn" @click="confirmUpload" :disabled="!tempImagePath">ç¡®å®ä¸ä¼ </button> |
| | | </view> |
| | | </view> |
| | | </uni-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getTask, changeTaskStatus } from '@/api/task' |
| | | import { getAttachmentList, uploadAttachmentFromWechat, deleteAttachment, getWechatAccessToken } from '@/api/task' |
| | | import { formatDateTime } from '@/utils/common' |
| | | import AttachmentUpload from '@/components/AttachmentUpload.vue' |
| | | |
| | | export default { |
| | | components: { |
| | | AttachmentUpload |
| | | }, |
| | | data() { |
| | | return { |
| | | taskDetail: null, |
| | | taskId: null, |
| | | attachmentList: [], |
| | | categoryList: [ |
| | | { label: 'ç¥æ
åæä¹¦', value: '1' }, |
| | | { label: 'ç
äººèµæ', value: '2' }, |
| | | { label: 'æä½è®°å½', value: '3' }, |
| | | { label: 'åºè½¦å', value: '4' }, |
| | | { label: 'åºè½¦å', value: '5' }, |
| | | { label: 'ç³»å®å
¨å¸¦', value: '6' } |
| | | ], |
| | | selectedCategoryIndex: 0, |
| | | tempImagePath: null, |
| | | isWechatMiniProgram: false // æ¯å¦æ¯å¾®ä¿¡å°ç¨åºç¯å¢ |
| | | taskId: null |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | onLoad(options) { |
| | | this.taskId = options.id |
| | | this.loadTaskDetail() |
| | | this.loadAttachmentList() |
| | | |
| | | // æ£æµæ¯å¦æ¯å¾®ä¿¡å°ç¨åºç¯å¢ |
| | | // #ifdef MP-WEIXIN |
| | | this.isWechatMiniProgram = true |
| | | // #endif |
| | | }, |
| | | methods: { |
| | | // å 载任å¡è¯¦æ
|
| | |
| | | if (size < 1024) return size + 'B' |
| | | if (size < 1024 * 1024) return (size / 1024).toFixed(2) + 'KB' |
| | | return (size / 1024 / 1024).toFixed(2) + 'MB' |
| | | }, |
| | | |
| | | // éä»¶ä¸ä¼ æååè° |
| | | onAttachmentUploaded(response) { |
| | | console.log('éä»¶ä¸ä¼ æå:', response) |
| | | }, |
| | | |
| | | // éä»¶å 餿ååè° |
| | | onAttachmentDeleted(attachmentId) { |
| | | console.log('éä»¶å 餿å:', attachmentId) |
| | | } |
| | | } |
| | | } |
| | |
| | | padding: 20rpx; |
| | | border-radius: 10rpx; |
| | | } |
| | | |
| | | .no-attachment { |
| | | text-align: center; |
| | | padding: 40rpx 0; |
| | | color: #999; |
| | | font-size: 28rpx; |
| | | } |
| | | |
| | | .attachment-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 20rpx; |
| | | margin-bottom: 15rpx; |
| | | background-color: #f9f9f9; |
| | | border-radius: 10rpx; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .attachment-info { |
| | | flex: 1; |
| | | margin-right: 20rpx; |
| | | |
| | | .attachment-category { |
| | | margin-bottom: 8rpx; |
| | | |
| | | .category-tag { |
| | | display: inline-block; |
| | | padding: 4rpx 12rpx; |
| | | background-color: #007AFF; |
| | | color: white; |
| | | font-size: 22rpx; |
| | | border-radius: 4rpx; |
| | | } |
| | | } |
| | | |
| | | .attachment-name { |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | margin-bottom: 8rpx; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .attachment-meta { |
| | | font-size: 24rpx; |
| | | color: #999; |
| | | |
| | | .upload-time { |
| | | margin-right: 20rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .attachment-actions { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 10rpx; |
| | | |
| | | .action-btn { |
| | | padding: 8rpx 20rpx; |
| | | font-size: 24rpx; |
| | | border-radius: 6rpx; |
| | | border: none; |
| | | |
| | | &.view-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | } |
| | | |
| | | &.delete-btn { |
| | | background-color: #ff3b30; |
| | | color: white; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .loading { |
| | |
| | | |
| | | &:last-child { |
| | | margin-right: 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .upload-dialog { |
| | | background-color: white; |
| | | border-radius: 20rpx 20rpx 0 0; |
| | | padding: 30rpx; |
| | | |
| | | .dialog-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 30rpx; |
| | | |
| | | .dialog-title { |
| | | font-size: 32rpx; |
| | | font-weight: bold; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .dialog-content { |
| | | .form-item { |
| | | margin-bottom: 30rpx; |
| | | |
| | | .form-label { |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | margin-bottom: 15rpx; |
| | | } |
| | | |
| | | .picker-value { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 20rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | font-size: 28rpx; |
| | | color: #333; |
| | | } |
| | | |
| | | .choose-image-btn { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 30rpx; |
| | | background-color: #f5f5f5; |
| | | border-radius: 10rpx; |
| | | border: 2rpx dashed #ccc; |
| | | color: #666; |
| | | font-size: 28rpx; |
| | | |
| | | text { |
| | | margin-left: 10rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .preview-area { |
| | | margin-top: 20rpx; |
| | | |
| | | .preview-image { |
| | | width: 100%; |
| | | height: 400rpx; |
| | | border-radius: 10rpx; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .dialog-footer { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | margin-top: 30rpx; |
| | | |
| | | button { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | border-radius: 10rpx; |
| | | font-size: 30rpx; |
| | | border: none; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | background-color: #f5f5f5; |
| | | color: #666; |
| | | } |
| | | |
| | | .confirm-btn { |
| | | background-color: #007AFF; |
| | | color: white; |
| | | |
| | | &:disabled { |
| | | background-color: #ccc; |
| | | } |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | # ä»»å¡é件忥ImageDataåè½è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | æ¬åè½å®ç°äºå°ä»»å¡éä»¶ï¼sys_task_attachment表ï¼èªå¨åæ¥å°ImageData表çè½åãå½ä»»å¡å
³èäºæå¡åï¼serviceOrderIdï¼æè°åº¦åï¼dispatchOrdIdï¼åï¼ç³»ç»ä¼èªå¨å°ä»»å¡é件忥å°ImageData表ï¼ä»¥ä¾¿å¨æ§ç³»ç»ä¸æ¥çå使ç¨ã |
| | | |
| | | ## æ ¸å¿åè½ |
| | | |
| | | ### 1. èªå¨åæ¥ |
| | | - ä¸ä¼ éä»¶æ¶ï¼å¦æä»»å¡å·²å
³èæå¡åæè°åº¦åï¼èªå¨åæ¥å°ImageData |
| | | - æ¯ææ®éæä»¶ä¸ä¼ å微信ä¸ä¼ ä¸¤ç§æ¹å¼ |
| | | - åæ¥å¤±è´¥ä¸å½±åéä»¶ä¸ä¼ ç主æµç¨ |
| | | |
| | | ### 2. æå¨åæ¥ |
| | | - æä¾APIæ¥å£ï¼æ¯ææå¨è§¦å忥 |
| | | - æ¯ææ¹é忥任å¡çææéä»¶ |
| | | - æ¯ææ£æ¥éä»¶æ¯å¦å·²åæ¥ |
| | | |
| | | ### 3. éä»¶åç±»æ å° |
| | | éä»¶åç±»èªå¨æ å°å°ImageDataçå¾çç±»åï¼ |
| | | - 1-ç¥æ
åæä¹¦ â ImageType 0 |
| | | - 2-ç
äººèµæ â ImageType 1 |
| | | - 3-æä½è®°å½ â ImageType 2 |
| | | - 4-åºè½¦å â ImageType 3 |
| | | - 5-åºè½¦å â ImageType 4 |
| | | - 6-ç³»å®å
¨å¸¦ â ImageType 5 |
| | | |
| | | ## æ°æ®åºåæ´ |
| | | |
| | | ### sys_task_attachment 表æ°å¢å段 |
| | | |
| | | ```sql |
| | | -- æ¯å¦å·²åæ¥å°ImageData (0-æªåæ¥ 1-已忥) |
| | | synced_to_image_data TINYINT(1) DEFAULT 0 |
| | | |
| | | -- 忥æ¶é´ |
| | | sync_time DATETIME |
| | | |
| | | -- å
³èçImageData ID |
| | | image_data_id BIGINT |
| | | ``` |
| | | |
| | | ### æ§è¡SQLèæ¬ |
| | | |
| | | ```bash |
| | | æ§è¡æä»¶: sql/update_sys_task_attachment_sync_fields.sql |
| | | ``` |
| | | |
| | | ## æ°å¢æä»¶ |
| | | |
| | | ### 1. æå¡æ¥å£ |
| | | - `ITaskAttachmentSyncService.java` - é件忥æå¡æ¥å£ |
| | | - `TaskAttachmentSyncServiceImpl.java` - é件忥æå¡å®ç° |
| | | |
| | | ### 2. Controller |
| | | - `TaskAttachmentSyncController.java` - é件忥æ§å¶å¨ |
| | | |
| | | ### 3. SQLèæ¬ |
| | | - `update_sys_task_attachment_sync_fields.sql` - æ°æ®åºæ´æ°èæ¬ |
| | | |
| | | ## ä¿®æ¹æä»¶ |
| | | |
| | | ### 1. å®ä½ç±» |
| | | - `SysTaskAttachment.java` - æ·»å 忥ç¸å
³å段 |
| | | |
| | | ### 2. Mapper |
| | | - `SysTaskAttachmentMapper.xml` - æ´æ°SQLè¯å¥ |
| | | |
| | | ### 3. æå¡å®ç° |
| | | - `SysTaskServiceImpl.java` - éæèªå¨åæ¥é»è¾ |
| | | |
| | | ## APIæ¥å£ |
| | | |
| | | ### 1. æå¨åæ¥ä»»å¡éä»¶ |
| | | |
| | | **æ¥å£**: `POST /task/attachment/sync/task/{taskId}` |
| | | |
| | | **æé**: `task:general:edit` |
| | | |
| | | **åæ°**: |
| | | - `taskId`: ä»»å¡IDï¼è·¯å¾åæ°ï¼ |
| | | |
| | | **è¿å示ä¾**: |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æå忥 3 个éä»¶" |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ£æ¥éä»¶åæ¥ç¶æ |
| | | |
| | | **æ¥å£**: `GET /task/attachment/sync/check/{attachmentId}` |
| | | |
| | | **æé**: `task:general:query` |
| | | |
| | | **åæ°**: |
| | | - `attachmentId`: éä»¶IDï¼è·¯å¾åæ°ï¼ |
| | | |
| | | **è¿å示ä¾**: |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "已忥", |
| | | "data": true |
| | | } |
| | | ``` |
| | | |
| | | ## 使ç¨åºæ¯ |
| | | |
| | | ### åºæ¯1ï¼æ°ä¸ä¼ éä»¶èªå¨åæ¥ |
| | | |
| | | 1. ç¨æ·å¨å°ç¨åºä¸ä¼ ä»»å¡éä»¶ |
| | | 2. ç³»ç»ä¿åéä»¶å°sys_task_attachment表 |
| | | 3. æ£æµä»»å¡æ¯å¦å·²å
³èæå¡å/è°åº¦å |
| | | 4. 妿已å
³èï¼èªå¨åæ¥å°ImageData表 |
| | | 5. æ´æ°éä»¶çåæ¥ç¶æåæ®µ |
| | | |
| | | ### åºæ¯2ï¼æå¨æ¹é忥 |
| | | |
| | | 1. ä»»å¡åæå
³èäºæå¡å/è°åº¦å |
| | | 2. è°ç¨æå¨åæ¥æ¥å£åæ¥åå²éä»¶ |
| | | 3. ç³»ç»æ¹éåæ¥è¯¥ä»»å¡çæææªåæ¥éä»¶ |
| | | 4. è¿å忥æåçéä»¶æ°é |
| | | |
| | | ### åºæ¯3ï¼æ§ç³»ç»æ¥çéä»¶ |
| | | |
| | | 1. ç¨æ·å¨æ§ç³»ç»ä¸æ¥çè°åº¦å |
| | | 2. è°ç¨ImageDataæ¥å£è·åå¾çå表 |
| | | 3. æ¾ç¤ºéè¿æ°ç³»ç»ä¸ä¼ çä»»å¡éä»¶ |
| | | 4. å®ç°æ°æ§ç³»ç»æ°æ®äºé |
| | | |
| | | ## ææ¯å®ç° |
| | | |
| | | ### 1. 忥æå¡ |
| | | |
| | | ```java |
| | | @Service |
| | | public class TaskAttachmentSyncServiceImpl implements ITaskAttachmentSyncService { |
| | | |
| | | // 忥å个éä»¶ |
| | | public boolean syncAttachmentToImageData( |
| | | SysTaskAttachment attachment, |
| | | Long serviceOrderId, |
| | | Long dispatchOrdId); |
| | | |
| | | // æ¹é忥任å¡éä»¶ |
| | | public int syncTaskAttachmentsToImageData( |
| | | Long taskId, |
| | | Long serviceOrderId, |
| | | Long dispatchOrdId); |
| | | } |
| | | ``` |
| | | |
| | | ### 2. èªå¨åæ¥è§¦å |
| | | |
| | | å¨ä¸ä¼ éä»¶æ¶èªå¨è§¦åï¼ |
| | | |
| | | ```java |
| | | // ä¸ä¼ éä»¶æåå |
| | | if (result > 0) { |
| | | // å°è¯èªå¨åæ¥å°ImageData |
| | | tryAutoSyncAttachment(attachment, taskId); |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æ°æ®æºåæ¢ |
| | | |
| | | 忥å°ImageDataæ¶èªå¨åæ¢å°SQL Serveræ°æ®æºï¼ |
| | | |
| | | ```java |
| | | @DataSource(DataSourceType.SQLSERVER) |
| | | public boolean syncAttachmentToImageData(...) { |
| | | // å¨SQL Serveræ°æ®æºä¸æ§è¡ |
| | | imageDataService.insertImageData(imageData); |
| | | } |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. æ°æ®æºé
ç½® |
| | | - ç¡®ä¿SQL Serveræ°æ®æºé
ç½®æ£ç¡® |
| | | - ç¡®ä¿ImageData表åå¨ä¸å¯è®¿é® |
| | | |
| | | ### 2. æä»¶è·¯å¾ |
| | | - éä»¶è·¯å¾ä½¿ç¨ç¸å¯¹è·¯å¾åå¨ |
| | | - 忥æ¶ä¿æè·¯å¾æ ¼å¼ä¸è´ |
| | | |
| | | ### 3. äºå¡ç®¡ç |
| | | - åæ¥å¤±è´¥ä¸å½±å主æµç¨ |
| | | - é误信æ¯ä»
è®°å½æ¥å¿ |
| | | |
| | | ### 4. æ§è½èè |
| | | - èªå¨åæ¥æ¯å¼æ¥çï¼ä¸å½±åç¨æ·ä½éª |
| | | - æ¹é忥æ¶é个å¤çï¼é¿å
äºå¡è¶
æ¶ |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### Q1: å¦ä½å¤æéä»¶æ¯å¦éè¦åæ¥ï¼ |
| | | A: æ£æ¥ä»»å¡æ¯å¦å
³èäºserviceOrderIdædispatchOrdId |
| | | |
| | | ### Q2: åæ¥å¤±è´¥ä¼å½±åéä»¶ä¸ä¼ åï¼ |
| | | A: ä¸ä¼ï¼åæ¥å¤±è´¥åªè®°å½æ¥å¿ï¼ä¸å½±å主æµç¨ |
| | | |
| | | ### Q3: å¦ä½éæ°åæ¥å¤±è´¥çéä»¶ï¼ |
| | | A: è°ç¨æå¨åæ¥æ¥å£ï¼ç³»ç»ä¼èªå¨è·³è¿å·²åæ¥çéä»¶ |
| | | |
| | | ### Q4: ImageDataçå¾çç±»åå¦ä½ç¡®å®ï¼ |
| | | A: æ ¹æ®éä»¶åç±»èªå¨æ å°å°å¯¹åºçImageType |
| | | |
| | | ## æ©å±å»ºè®® |
| | | |
| | | ### 1. 宿¶åæ¥ä»»å¡ |
| | | å¯ä»¥æ·»å 宿¶ä»»å¡ï¼å®ææ£æ¥å¹¶åæ¥æªåæ¥çéä»¶ |
| | | |
| | | ### 2. åæ¥ç¶æéç¥ |
| | | å¯ä»¥å¨åæ¥å®æååééç¥ç»ç¸å
³äººå |
| | | |
| | | ### 3. 忥æ¥å¿ |
| | | å¯ä»¥æ·»å 详ç»ç忥æ¥å¿è¡¨ï¼è®°å½æ¯æ¬¡åæ¥ç详ç»ä¿¡æ¯ |
| | | |
| | | ### 4. æ¹éæä½ |
| | | å¯ä»¥æ·»å æ¹é忥å¤ä¸ªä»»å¡éä»¶çåè½ |
| | |
| | | package com.ruoyi.web.controller.task; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | |
| | | import com.ruoyi.common.utils.WechatUtils; |
| | | import com.ruoyi.common.config.WechatConfig; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskEmergency; |
| | | import com.ruoyi.system.service.ISysTaskEmergencyService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | import com.ruoyi.system.service.ITaskAttachmentSyncService; |
| | | import com.ruoyi.system.task.ITaskAttachmentService; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | @Autowired |
| | | private ISysUserService sysUserService; |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentSyncService taskAttachmentSyncService; |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentService taskAttachmentService; |
| | | |
| | | @Autowired |
| | | private WechatConfig wechatConfig; |
| | | |
| | | @Autowired |
| | | private ISysTaskEmergencyService sysTaskEmergencyService; |
| | | |
| | | @Autowired |
| | | private ISysUserService userService; |
| | | /** |
| | | * æ¥è¯¢ä»»å¡éä»¶å表 |
| | | */ |
| | |
| | | @RequestParam("file") MultipartFile file, |
| | | @RequestParam(value = "category", required = false) String category) { |
| | | try { |
| | | int result = sysTaskService.uploadAttachment(taskId, file, category); |
| | | if (result > 0) { |
| | | Long attachmentId= sysTaskService.uploadAttachment(taskId, file, category); |
| | | if (attachmentId > 0) { |
| | | //å¨è¿éè¿è¡åæ¥ |
| | | SyncAttachmentToImageData(taskId,sysTaskService.getTaskDetail(taskId).getCreatorId(),attachmentId); |
| | | return success("ä¸ä¼ æå"); |
| | | } else { |
| | | return error("ä¸ä¼ 失败"); |
| | |
| | | } |
| | | } |
| | | |
| | | private void SyncAttachmentToImageData(Long taskId,Long taskCreatorId, Long attachmentId) { |
| | | Integer oaUserId= sysUserService.selectUserById(taskCreatorId).getOaUserId(); |
| | | SysTaskEmergency taskEmergency= sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); |
| | | if(taskEmergency!=null ){ |
| | | Long serviceOrderId= taskEmergency.getLegacyServiceOrdId(); |
| | | Long dispathOrdId=taskEmergency.getLegacyDispatchOrdId(); |
| | | |
| | | if(serviceOrderId!=null && dispathOrdId!=null){ |
| | | SysTaskAttachment attachment=sysTaskService.getAttachmentById(attachmentId); |
| | | Long imageDataId= taskAttachmentSyncService.syncAttachmentToImageData(attachment, serviceOrderId, dispathOrdId,oaUserId); |
| | | //忥æå |
| | | if(imageDataId>0){ |
| | | attachment.setSyncedToImageData(1); |
| | | attachment.setSyncTime(new Date()); |
| | | attachment.setImageDataId(imageDataId); |
| | | taskAttachmentService.updateAttachment(attachment); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | | */ |
| | |
| | | } |
| | | |
| | | // éè¿mediaIdä¸ä¼ éä»¶ |
| | | int result = sysTaskService.uploadAttachmentFromWechat(taskId, accessToken, mediaId, category); |
| | | if (result > 0) { |
| | | Long attachmentId = sysTaskService.uploadAttachmentFromWechat(taskId, accessToken, mediaId, category); |
| | | SysTask task=sysTaskService.getTaskDetail(taskId); |
| | | if (attachmentId > 0) { |
| | | this.SyncAttachmentToImageData(taskId,task.getCreatorId(),attachmentId); |
| | | return success("ä¸ä¼ æå"); |
| | | } else { |
| | | return error("ä¸ä¼ 失败"); |
| New file |
| | |
| | | package com.ruoyi.web.controller.task; |
| | | |
| | | import com.ruoyi.common.annotation.Log; |
| | | import com.ruoyi.common.core.controller.BaseController; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | import com.ruoyi.system.service.ISysUserService; |
| | | import com.ruoyi.system.service.ITaskAttachmentSyncService; |
| | | import com.ruoyi.system.task.ITaskAttachmentService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡é件忥Controller |
| | | * ç¨äºå°ä»»å¡é件忥å°ImageData表 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/task/attachment/sync") |
| | | public class TaskAttachmentSyncController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentSyncService taskAttachmentSyncService; |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentService taskAttachmentService; |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | @Autowired |
| | | private ISysUserService sysUserService; |
| | | |
| | | /** |
| | | * æå¨åæ¥å个任å¡çéä»¶å°ImageData |
| | | * |
| | | * @param taskId ä»»å¡ID |
| | | * @return åæ¥ç»æ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:edit')") |
| | | @Log(title = "ä»»å¡é件忥", businessType = BusinessType.OTHER) |
| | | @PostMapping("/task/{taskId}") |
| | | public AjaxResult syncTaskAttachments(@PathVariable("taskId") Long taskId) { |
| | | try { |
| | | // æ¥è¯¢ä»»å¡è¯¦æ
|
| | | SysTask task = sysTaskService.getTaskDetail(taskId); |
| | | SysUser user = sysUserService.selectUserById(task.getCreatorId()); |
| | | Integer oaUserId=user.getOaUserId(); |
| | | if (task == null) { |
| | | return error("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | // è·åserviceOrderIdådispatchOrdId |
| | | Long serviceOrderId = null; |
| | | Long dispatchOrdId = null; |
| | | |
| | | if (task.getEmergencyInfo() != null) { |
| | | serviceOrderId = task.getEmergencyInfo().getLegacyServiceOrdId(); |
| | | dispatchOrdId = task.getEmergencyInfo().getLegacyDispatchOrdId(); |
| | | } |
| | | |
| | | if (serviceOrderId == null && dispatchOrdId == null) { |
| | | return error("任塿ªå
³èæå¡åæè°åº¦åï¼æ æ³åæ¥"); |
| | | } |
| | | List<SysTaskAttachment> attachmentList=sysTaskService.getAttachmentsByTaskId(taskId); |
| | | // æ§è¡åæ¥ |
| | | List<SysTaskAttachment> attachments = taskAttachmentSyncService.syncTaskAttachmentsToImageData( |
| | | attachmentList, serviceOrderId, dispatchOrdId,oaUserId); |
| | | |
| | | for(SysTaskAttachment attachment:attachments){ |
| | | |
| | | taskAttachmentService.updateAttachment(attachment); |
| | | } |
| | | |
| | | return success("æå忥 " + attachments.stream().count() + " 个éä»¶"); |
| | | } catch (Exception e) { |
| | | logger.error("忥任å¡é件失败", e); |
| | | return error("åæ¥å¤±è´¥ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ£æ¥éä»¶æ¯å¦å·²åæ¥ |
| | | * |
| | | * @param attachmentId éä»¶ID |
| | | * @return åæ¥ç¶æ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('task:general:query')") |
| | | @GetMapping("/check/{attachmentId}") |
| | | public AjaxResult checkAttachmentSynced(@PathVariable("attachmentId") Long attachmentId) { |
| | | try { |
| | | boolean synced = taskAttachmentService.isAttachmentSynced(attachmentId); |
| | | return AjaxResult.success(synced ? "已忥" : "æªåæ¥", synced); |
| | | } catch (Exception e) { |
| | | logger.error("æ£æ¥éä»¶åæ¥ç¶æå¤±è´¥", e); |
| | | return error("æ£æ¥å¤±è´¥ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | } |
| | |
| | | addressEnabled: false |
| | | # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ |
| | | captchaType: math |
| | | # å¾çèµæºååï¼ç¨äºè®¿é®éä»¶å¾çï¼ |
| | | imageUrl: https://dsp.966120.com.cn/images/ |
| | | |
| | | |
| | | # å¼åç¯å¢é
ç½® |
| New file |
| | |
| | | package com.ruoyi.common.config; |
| | | |
| | | import org.springframework.boot.context.properties.ConfigurationProperties; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * å¾çURLé
ç½® |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Component |
| | | @ConfigurationProperties(prefix = "ruoyi") |
| | | public class ImageUrlConfig { |
| | | |
| | | /** |
| | | * å¾çèµæºåå |
| | | */ |
| | | private String imageUrl; |
| | | |
| | | public String getImageUrl() { |
| | | return imageUrl; |
| | | } |
| | | |
| | | public void setImageUrl(String imageUrl) { |
| | | this.imageUrl = imageUrl; |
| | | } |
| | | } |
| | |
| | | package com.ruoyi.quartz.task; |
| | | |
| | | import com.ruoyi.system.service.ITaskAttachmentSyncService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | |
| | | @Autowired |
| | | private ITaskStatusPushService taskStatusPushService; |
| | | |
| | | |
| | | |
| | | /** |
| | | * æ¹é忥æªåæ¥çæ¥æè½¬è¿ä»»å¡å°æ§ç³»ç» |
| | |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.fasterxml.jackson.annotation.JsonIgnore; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | |
| | | /** |
| | | * ä»»å¡é件对象 sys_task_attachment |
| | |
| | | @Excel(name = "æä»¶ç±»å") |
| | | private String fileType; |
| | | |
| | | |
| | | /** éä»¶åç±» */ |
| | | @Excel(name = "éä»¶åç±»") |
| | | private String attachmentCategory; |
| | |
| | | /** ä¸ä¼ è
*/ |
| | | @Excel(name = "ä¸ä¼ è
") |
| | | private String uploadBy; |
| | | |
| | | /** æ¯å¦å·²åæ¥å°ImageData (0-æªåæ¥ 1-已忥) */ |
| | | private Integer syncedToImageData; |
| | | |
| | | /** 忥æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date syncTime; |
| | | |
| | | /** å
³èçImageData ID */ |
| | | private Long imageDataId; |
| | | |
| | | /** 宿´æä»¶URLï¼ä¸åå¨ï¼ç¨äºè¿åç»åç«¯ï¼ */ |
| | | private String fileUrl; |
| | | |
| | | public void setAttachmentId(Long attachmentId) { |
| | | this.attachmentId = attachmentId; |
| | |
| | | public String getUploadBy() { |
| | | return uploadBy; |
| | | } |
| | | |
| | | public void setFileUrl(String fileUrl) { |
| | | this.fileUrl = fileUrl; |
| | | } |
| | | |
| | | public String getFileUrl() { |
| | | return fileUrl; |
| | | } |
| | | |
| | | public void setSyncedToImageData(Integer syncedToImageData) { |
| | | this.syncedToImageData = syncedToImageData; |
| | | } |
| | | |
| | | public Integer getSyncedToImageData() { |
| | | return syncedToImageData; |
| | | } |
| | | |
| | | public void setSyncTime(Date syncTime) { |
| | | this.syncTime = syncTime; |
| | | } |
| | | |
| | | public Date getSyncTime() { |
| | | return syncTime; |
| | | } |
| | | |
| | | public void setImageDataId(Long imageDataId) { |
| | | this.imageDataId = imageDataId; |
| | | } |
| | | |
| | | public Long getImageDataId() { |
| | | return imageDataId; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | |
| | | /** è°åº¦å忥éè¯¯ä¿¡æ¯ */ |
| | | private String dispatchSyncErrorMsg; |
| | | |
| | | |
| | | |
| | | public Long getId() { |
| | | return id; |
| | | } |
| | |
| | | log.info("å¼å§ä¸ä¼ æä»¶å°PHPæ¥å£: fileName={}, targetPath={}", fileName, targetPath); |
| | | |
| | | // è°ç¨PHPä¸ä¼ æ¥å£ |
| | | String response = HttpUtils.postFile(legacyConfig.getFileServerUrl(), params, fileName); |
| | | String response = HttpUtils.postFile(legacyConfig.getFileUploadUrl(), params, fileName); |
| | | |
| | | log.info("PHPæ¥å£ååº: {}", response); |
| | | |
| | |
| | | int end = dataSection.indexOf("\"", start); |
| | | if (start > 11 && end > start) { |
| | | String filePath = dataSection.substring(start, end); |
| | | // å»é¤è½¬ä¹å符 |
| | | filePath = filePath.replace("\\", ""); |
| | | log.info("æåå°æä»¶è·¯å¾: {}", filePath); |
| | | return filePath; |
| | | } |
| | |
| | | if (start > 16 && end > start) { |
| | | String thumbnailPath = dataSection.substring(start, end); |
| | | log.info("æåå°ç¼©ç¥å¾è·¯å¾: {}", thumbnailPath); |
| | | thumbnailPath = thumbnailPath.replace("\\", ""); // å»é¤è½¬ä¹å符 |
| | | return thumbnailPath; |
| | | } |
| | | } |
| | |
| | | if (start > 16 && end > start) { |
| | | String thumbnailPath = response.substring(start, end); |
| | | log.info("æåå°ç¼©ç¥å¾è·¯å¾(æ§æ ¼å¼): {}", thumbnailPath); |
| | | thumbnailPath = thumbnailPath.replace("\\", ""); // å»é¤è½¬ä¹å符 |
| | | return thumbnailPath; |
| | | } |
| | | } |
| | |
| | | return uploadResponse; |
| | | } |
| | | |
| | | // 妿æ¯å¾çï¼çæç¼©ç¥å¾ |
| | | if (isImage && uploadResponse.getFilePath() != null) { |
| | | String originalPath = uploadResponse.getFilePath(); |
| | | String thumbnailPath = generateThumbnailPath(originalPath); |
| | | |
| | | // çæç¼©ç¥å¾ |
| | | if (createThumbnail(originalPath, thumbnailPath, 100, 0)) { |
| | | uploadResponse.setThumbnailPath(thumbnailPath); |
| | | log.info("缩ç¥å¾çææåï¼{}", thumbnailPath); |
| | | } else { |
| | | log.warn("缩ç¥å¾çæå¤±è´¥ï¼{}", originalPath); |
| | | } |
| | | } |
| | | |
| | | log.info("ä¸ä¼ æä»¶æå æä»¶:{} 缩ç¥:{}",uploadResponse.getFilePath(),uploadResponse.getThumbnailPath()); |
| | | return uploadResponse; |
| | | |
| | | } catch (Exception e) { |
| | |
| | | if (dispatchOrdID != null && dispatchOrdID > 0) { |
| | | return processDispatchOrderImage(dispatchOrdID, serviceOrdID, mediaId, imageTypeEnum, adminId); |
| | | } |
| | | // å¦æåªæOAç¨æ·IDï¼åæ´æ°ç¨æ·å¤´å |
| | | else if (oaid != null && oaid > 0) { |
| | | return updateUserAvatar(oaid, mediaId); |
| | | } |
| | | else { |
| | | return "åæ°é误ï¼ç¼ºå°å¿
è¦çåæ°"; |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°ç¨æ·å¤´å |
| | | */ |
| | | private String updateUserAvatar(Integer oaid, String mediaId) { |
| | | try { |
| | | // è¿ééè¦è°ç¨OAç¨æ·æå¡æ¥æ´æ°å¤´å |
| | | // ç±äºæ²¡æOAç¨æ·æå¡çå
·ä½å®ç°ï¼è¿éåªæ¯ç¤ºä¾ |
| | | String avatarUrl = "/upload/" + oaid + "_" + mediaId + ".jpg"; |
| | | |
| | | // TODO: è°ç¨OAç¨æ·æå¡æ´æ°å¤´å |
| | | // oaUserService.updateAvatar(oaid, avatarUrl); |
| | | |
| | | return "ç¨æ·å¤´åæ´æ°æå"; |
| | | } catch (Exception e) { |
| | | return "æ´æ°ç¨æ·å¤´å失败ï¼" + e.getMessage(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çæå¾çURL |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°ç¨æ·å¤´åï¼å
嫿件URLï¼ |
| | | */ |
| | | private String updateUserAvatarWithFile(Integer oaid, String mediaId, String imageUrl) { |
| | | try { |
| | | // è¿ééè¦è°ç¨OAç¨æ·æå¡æ¥æ´æ°å¤´å |
| | | // TODO: è°ç¨OAç¨æ·æå¡æ´æ°å¤´å |
| | | // oaUserService.updateAvatar(oaid, imageUrl); |
| | | |
| | | return "ç¨æ·å¤´åæ´æ°æåï¼URLï¼" + imageUrl; |
| | | } catch (Exception e) { |
| | | return "æ´æ°ç¨æ·å¤´å失败ï¼" + e.getMessage(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ£æ¥æä»¶å
¼å®¹æ§ï¼ç¡®ä¿ä¸æ§ç³»ç»å
¼å®¹ï¼ |
| | |
| | | ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); |
| | | return processDispatchOrderImageWithFiles(dispatchOrdID, serviceOrdID, null, |
| | | imageTypeEnum, adminId, imageUrl, thumbnailUrl); |
| | | } else if (oaid != null && oaid > 0) { |
| | | // OAç¨æ·å¤´å |
| | | return updateUserAvatarWithFile(oaid, null, imageUrl); |
| | | } else { |
| | | return "åæ°é误ï¼ç¼ºå°å¿
è¦çåæ°ï¼è°åº¦åIDæOAç¨æ·IDï¼"; |
| | | } |
| | |
| | | if (dispatchOrdID != null && dispatchOrdID > 0) { |
| | | return processDispatchOrderImageWithFiles(dispatchOrdID, null, mediaId, |
| | | ImageTypeEnum.getByCode(imageType), adminId, originalImageUrl, thumbnailUrl); |
| | | } else if (oaid != null && oaid > 0) { |
| | | return updateUserAvatarWithFile(oaid, mediaId, originalImageUrl); |
| | | } |
| | | |
| | | return "å¾çä¸ä¼ æåï¼æä»¶è·¯å¾ï¼" + originalImageUrl; |
| | |
| | | * @param sysTaskAttachment ä»»å¡éä»¶ |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysTaskAttachment(SysTaskAttachment sysTaskAttachment); |
| | | public Long insertSysTaskAttachment(SysTaskAttachment sysTaskAttachment); |
| | | |
| | | /** |
| | | * ä¿®æ¹ä»»å¡éä»¶ |
| | |
| | | * @param category éä»¶åç±» |
| | | * @return ç»æ |
| | | */ |
| | | public int uploadAttachment(Long taskId, MultipartFile file, String category); |
| | | public Long uploadAttachment(Long taskId, MultipartFile file, String category); |
| | | |
| | | /** |
| | | * ä»å¾®ä¿¡mediaIdä¸ä¼ ä»»å¡éä»¶ |
| | |
| | | * @param accessToken 微信AccessToken |
| | | * @param mediaId 微信mediaId |
| | | * @param category éä»¶åç±» |
| | | * @return ç»æ |
| | | * @return |
| | | */ |
| | | public int uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category); |
| | | public Long uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category); |
| | | |
| | | /** |
| | | * å é¤ä»»å¡éä»¶ |
| | |
| | | */ |
| | | public SysTaskAttachment getAttachmentById(Long attachmentId); |
| | | |
| | | |
| | | public List<SysTaskAttachment> getAttachmentsByTaskId(Long taskId); |
| | | /** |
| | | * åé
车è¾ç»ä»»å¡ |
| | | * |
| New file |
| | |
| | | package com.ruoyi.system.service; |
| | | |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡é件忥æå¡æ¥å£ |
| | | * ç¨äºå°ä»»å¡é件忥å°ImageData表 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public interface ITaskAttachmentSyncService { |
| | | |
| | | /** |
| | | * 忥å个éä»¶å°ImageData |
| | | * |
| | | * @param attachment ä»»å¡é件对象 |
| | | * @param serviceOrderId æå¡åID |
| | | * @param dispatchOrdId è°åº¦åID |
| | | * @return æ¯å¦åæ¥æå |
| | | */ |
| | | Long syncAttachmentToImageData(SysTaskAttachment attachment, Long serviceOrderId, Long dispatchOrdId,Integer oaUserId); |
| | | |
| | | /** |
| | | * æ¹é忥任å¡çææéä»¶å°ImageData |
| | | * |
| | | * @param attachmentList ä»»å¡å表 |
| | | * @param serviceOrderId æå¡åID |
| | | * @param dispatchOrdId è°åº¦åID |
| | | * @return 忥æåçéä»¶æ°é |
| | | */ |
| | | List<SysTaskAttachment> syncTaskAttachmentsToImageData(List<SysTaskAttachment> attachmentList, Long serviceOrderId, Long dispatchOrdId, Integer oaUserId); |
| | | |
| | | |
| | | } |
| | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | import com.ruoyi.system.domain.*; |
| | | import com.ruoyi.system.service.*; |
| | | import com.ruoyi.system.task.ITaskAttachmentService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskEmergency; |
| | | import com.ruoyi.system.domain.SysTaskVehicle; |
| | | import com.ruoyi.system.domain.SysTaskAssignee; |
| | | import com.ruoyi.system.domain.VehicleInfo; |
| | | import com.ruoyi.system.domain.vo.TaskCreateVO; |
| | | import com.ruoyi.system.mapper.SysTaskMapper; |
| | | import com.ruoyi.system.mapper.SysTaskEmergencyMapper; |
| | |
| | | import com.ruoyi.system.mapper.VehicleInfoMapper; |
| | | import com.ruoyi.system.mapper.SysUserMapper; |
| | | import com.ruoyi.system.mapper.SysDeptMapper; |
| | | import com.ruoyi.system.service.ILegacySystemSyncService; |
| | | import com.ruoyi.system.utils.TaskStatusConverter; |
| | | import com.ruoyi.system.service.IDispatchOrdService; |
| | | import com.ruoyi.system.service.ISysTaskEmergencyService; |
| | | |
| | | /** |
| | | * æ§ç³»ç»åæ¥Serviceä¸å¡å±å¤ç |
| | |
| | | |
| | | @Autowired |
| | | private ISysTaskEmergencyService sysTaskEmergencyService; |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentSyncService taskAttachmentSyncService; |
| | | |
| | | @Autowired |
| | | private ISysTaskService sysTaskService; |
| | | |
| | | @Autowired |
| | | private ITaskAttachmentService taskAttachmentService; |
| | | |
| | | /** |
| | | * åæ¥æ¥æè½¬è¿ä»»å¡å°æ§ç³»ç» |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 忥任å¡éä»¶å°æ§ç³»ç» |
| | | * @param taskAttachments |
| | | * @param serviceOrdId |
| | | * @param dispatchOrdId |
| | | * @param oaUserID |
| | | */ |
| | | public void syncAttachmentToLegacy(List<SysTaskAttachment> taskAttachments, Long serviceOrdId,Long dispatchOrdId,Integer oaUserID) { |
| | | taskAttachments.forEach((taskAttachment)->{ |
| | | Long imageDataId= taskAttachmentSyncService.syncAttachmentToImageData(taskAttachment,serviceOrdId,dispatchOrdId,oaUserID); |
| | | if (imageDataId != null && imageDataId > 0) { |
| | | |
| | | taskAttachment.setSyncedToImageData(1); |
| | | taskAttachment.setSyncTime(new Date()); |
| | | taskAttachment.setImageDataId(imageDataId); |
| | | taskAttachmentService.updateAttachment(taskAttachment); |
| | | } |
| | | }); |
| | | } |
| | | /** |
| | | * 忥è°åº¦åå°æ§ç³»ç»ï¼admin_save_24.aspï¼ |
| | | */ |
| | |
| | | log.info("è°åº¦å已忥è¿ï¼ä»»å¡ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); |
| | | return emergency.getLegacyDispatchOrdId(); |
| | | } |
| | | |
| | | |
| | | Long serviceOrdId=emergency.getLegacyServiceOrdId(); |
| | | // å¿
é¡»å
忥æå¡å |
| | | if (emergency.getLegacyServiceOrdId() == null || emergency.getLegacyServiceOrdId() <= 0) { |
| | | if (serviceOrdId == null || serviceOrdId <= 0) { |
| | | log.warn("æå¡åæªåæ¥ï¼æ æ³åæ¥è°åº¦åï¼ä»»å¡ID: {}", taskId); |
| | | return null; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // æ´æ°åæ¥ç¶æä¸ºåæ¥ä¸ |
| | | emergency.setDispatchSyncStatus(1); |
| | | sysTaskEmergencyService.updateSysTaskEmergency(emergency); |
| | | |
| | | SysUser u=sysUserMapper.selectUserById(task.getCreatorId()); |
| | | Integer oaUserID= u.getOaUserId(); |
| | | |
| | | // æå»ºè¯·æ±åæ° |
| | | Map<String, String> params = buildDispatchOrderParams(task, emergency); |
| | |
| | | emergency.setDispatchSyncTime(new Date()); |
| | | emergency.setDispatchSyncErrorMsg(null); |
| | | sysTaskEmergencyService.updateSysTaskEmergency(emergency); |
| | | |
| | | |
| | | List<SysTaskAttachment> taskAttachments= sysTaskService.getAttachmentsByTaskId(taskId); |
| | | if (taskAttachments != null && !taskAttachments.isEmpty()) { |
| | | //忥éä»¶ |
| | | this.syncAttachmentToLegacy(taskAttachments,serviceOrdId,dispatchOrdId,oaUserID); |
| | | } |
| | | |
| | | log.info("è°åº¦å忥æåï¼ä»»å¡ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId); |
| | | return dispatchOrdId; |
| | | } else { |
| | |
| | | for (SysTaskEmergency emergency : pendingTasks) { |
| | | log.info("å¼å§åæ¥è°åº¦åï¼ä»»å¡ID: {}", emergency.getTaskId()); |
| | | Long dispatchOrdId = syncDispatchOrderToLegacy(emergency.getTaskId()); |
| | | |
| | | if (dispatchOrdId != null && dispatchOrdId > 0) { |
| | | pageSuccessCount++; |
| | | } |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Collections; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.ArrayList; |
| | |
| | | import java.net.HttpURLConnection; |
| | | import java.net.URL; |
| | | |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.system.mapper.*; |
| | | import com.ruoyi.system.utils.TaskCodeGenerator; |
| | | import com.ruoyi.common.config.ImageUrlConfig; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import com.ruoyi.system.domain.vo.TaskUpdateVO; |
| | | import com.ruoyi.system.domain.vo.TaskStatisticsVO; |
| | | import com.ruoyi.system.domain.enums.TaskStatus; |
| | | import com.ruoyi.system.mapper.SysTaskMapper; |
| | | import com.ruoyi.system.mapper.SysTaskVehicleMapper; |
| | | import com.ruoyi.system.mapper.SysTaskAttachmentMapper; |
| | | import com.ruoyi.system.mapper.SysTaskLogMapper; |
| | | import com.ruoyi.system.mapper.SysTaskEmergencyMapper; |
| | | import com.ruoyi.system.mapper.SysTaskWelfareMapper; |
| | | import com.ruoyi.system.mapper.SysTaskAssigneeMapper; |
| | | import com.ruoyi.system.mapper.VehicleInfoMapper; |
| | | import com.ruoyi.system.domain.VehicleInfo; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | import com.ruoyi.system.service.ILegacySystemSyncService; |
| | | import com.ruoyi.system.service.ITaskAttachmentSyncService; |
| | | import com.ruoyi.system.event.TaskCreatedEvent; |
| | | import com.ruoyi.system.event.TaskAssignedEvent; |
| | | import com.ruoyi.system.event.TaskStatusChangedEvent; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.ApplicationEventPublisher; |
| | | |
| | |
| | | */ |
| | | @Service |
| | | public class SysTaskServiceImpl implements ISysTaskService { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(SysTaskServiceImpl.class); |
| | | |
| | | @Autowired |
| | | private SysTaskMapper sysTaskMapper; |
| | |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | @Autowired |
| | | private ImageUrlConfig imageUrlConfig; |
| | | |
| | | @Autowired(required = false) |
| | | private ITaskAttachmentSyncService taskAttachmentSyncService; |
| | | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡ç |
| | |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int uploadAttachment(Long taskId, MultipartFile file, String category) { |
| | | public Long uploadAttachment(Long taskId, MultipartFile file, String category) { |
| | | try { |
| | | // ä¸ä¼ æä»¶ |
| | | // ä¸ä¼ æä»¶ï¼è¿åç¸å¯¹è·¯å¾ï¼å¦ï¼/task/2025/01/15/xxx.jpgï¼ |
| | | String fileName = FileUploadUtils.upload("/task", file); |
| | | String filePath = FileUploadUtils.getDefaultBaseDir() + fileName; |
| | | |
| | | SysTaskAttachment attachment = new SysTaskAttachment(); |
| | | attachment.setTaskId(taskId); |
| | | attachment.setFileName(file.getOriginalFilename()); |
| | | attachment.setFilePath(filePath); |
| | | // ä¿åç¸å¯¹è·¯å¾ï¼ä¸å
å« baseDir |
| | | attachment.setFilePath(fileName); |
| | | attachment.setFileSize(file.getSize()); |
| | | attachment.setFileType(getFileType(file.getOriginalFilename())); |
| | | attachment.setAttachmentCategory(category); |
| | | attachment.setUploadTime(DateUtils.getNowDate()); |
| | | attachment.setUploadBy(SecurityUtils.getUsername()); |
| | | |
| | | int result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); |
| | | Long result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | |
| | | recordTaskLog(taskId, "UPDATE", "ä¸ä¼ éä»¶", null, |
| | | "ä¸ä¼ æä»¶ï¼" + file.getOriginalFilename() + "(åç±»ï¼" + categoryDesc + ")", |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | |
| | | |
| | | } |
| | | |
| | | return result; |
| | |
| | | * @param accessToken 微信AccessToken |
| | | * @param mediaId 微信mediaId |
| | | * @param category éä»¶åç±» |
| | | * @return ç»æ |
| | | * @return è¿åéä»¶ID |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public int uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category) { |
| | | public Long uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category) { |
| | | try { |
| | | // ä»å¾®ä¿¡æå¡å¨ä¸è½½æä»¶ |
| | | String wechatUrl = String.format( |
| | |
| | | fos.write(fileBytes); |
| | | } |
| | | |
| | | // çæç¸å¯¹è·¯å¾ï¼ä¸å
å«baseDirï¼ |
| | | String relativeFilePath = "/task/" + datePath + "/" + fileName; |
| | | |
| | | // ä¿åéä»¶è®°å½ |
| | | SysTaskAttachment attachment = new SysTaskAttachment(); |
| | | attachment.setTaskId(taskId); |
| | | attachment.setFileName(fileName); |
| | | attachment.setFilePath(filePath); |
| | | // ä¿åç¸å¯¹è·¯å¾ |
| | | attachment.setFilePath(relativeFilePath); |
| | | attachment.setFileSize((long) fileBytes.length); |
| | | attachment.setFileType("jpg"); |
| | | attachment.setAttachmentCategory(category); |
| | | attachment.setUploadTime(DateUtils.getNowDate()); |
| | | attachment.setUploadBy(SecurityUtils.getUsername()); |
| | | |
| | | int result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); |
| | | Long result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | |
| | | recordTaskLog(taskId, "UPDATE", "ä¸ä¼ éä»¶", null, |
| | | "éè¿å¾®ä¿¡ä¸ä¼ æä»¶ï¼" + fileName + "(åç±»ï¼" + categoryDesc + ")", |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | |
| | | |
| | | } |
| | | |
| | | return result; |
| | | return attachment.getAttachmentId(); |
| | | } catch (Exception e) { |
| | | throw new RuntimeException("ä»å¾®ä¿¡ä¸ä¼ æä»¶å¤±è´¥ï¼" + e.getMessage()); |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public SysTaskAttachment getAttachmentById(Long attachmentId) { |
| | | return sysTaskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); |
| | | SysTaskAttachment attachment = sysTaskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); |
| | | if (attachment != null) { |
| | | // æ¼æ¥å®æ´URL |
| | | buildAttachmentUrl(attachment); |
| | | } |
| | | return attachment; |
| | | } |
| | | |
| | | @Override |
| | | public List<SysTaskAttachment> getAttachmentsByTaskId(Long taskId) { |
| | | return sysTaskAttachmentMapper.selectSysTaskAttachmentByTaskId(taskId); |
| | | } |
| | | |
| | | /** |
| | |
| | | // æ¥è¯¢å
³èè½¦è¾ |
| | | task.setAssignedVehicles(sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId)); |
| | | // æ¥è¯¢éä»¶ |
| | | task.setAttachments(sysTaskAttachmentMapper.selectSysTaskAttachmentByTaskId(taskId)); |
| | | List<SysTaskAttachment> attachments = sysTaskAttachmentMapper.selectSysTaskAttachmentByTaskId(taskId); |
| | | // 为æ¯ä¸ªéä»¶æ¼æ¥å®æ´URL |
| | | if (attachments != null && !attachments.isEmpty()) { |
| | | attachments.forEach(this::buildAttachmentUrl); |
| | | } |
| | | task.setAttachments(attachments); |
| | | // æ¥è¯¢æä½æ¥å¿ |
| | | task.setOperationLogs(sysTaskLogMapper.selectSysTaskLogByTaskId(taskId)); |
| | | // å è½½æ¥æè½¬è¿æ©å±ä¿¡æ¯ |
| | |
| | | default: return "å
¶ä»"; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå»ºéä»¶ç宿´URL |
| | | * |
| | | * @param attachment é件对象 |
| | | */ |
| | | private void buildAttachmentUrl(SysTaskAttachment attachment) { |
| | | if (attachment != null && StringUtils.isNotEmpty(attachment.getFilePath())) { |
| | | String imageUrl = imageUrlConfig.getImageUrl(); |
| | | if (StringUtils.isNotEmpty(imageUrl)) { |
| | | // æ¼æ¥å®æ´URLï¼åå + ç¸å¯¹è·¯å¾ |
| | | attachment.setFileUrl(imageUrl + attachment.getFilePath()); |
| | | } else { |
| | | // 妿æªé
ç½®ååï¼ç´æ¥ä½¿ç¨ç¸å¯¹è·¯å¾ |
| | | attachment.setFileUrl(attachment.getFilePath()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.config.LegacySystemConfig; |
| | | import com.ruoyi.common.config.RuoYiConfig; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | | import com.ruoyi.system.domain.ImageData; |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.file.FileUploadResponse; |
| | | import com.ruoyi.system.file.IFileUploadService; |
| | | import com.ruoyi.system.imagedata.IImageDataService; |
| | | import com.ruoyi.system.mapper.SysTaskAttachmentMapper; |
| | | import com.ruoyi.system.service.ITaskAttachmentSyncService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.io.File; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡é件忥æå¡å®ç° |
| | | * å°ä»»å¡é件忥å°ImageData表 |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Service |
| | | @DataSource(DataSourceType.SQLSERVER) |
| | | public class TaskAttachmentSyncServiceImpl implements ITaskAttachmentSyncService { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(TaskAttachmentSyncServiceImpl.class); |
| | | |
| | | |
| | | @Autowired |
| | | private IImageDataService imageDataService; |
| | | |
| | | @Autowired |
| | | private LegacySystemConfig legacyConfig; |
| | | |
| | | @Autowired |
| | | private IFileUploadService fileUploadService; |
| | | |
| | | @Autowired |
| | | private RuoYiConfig ruoYiConfig; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 忥å个éä»¶å°ImageData |
| | | */ |
| | | @Override |
| | | public Long syncAttachmentToImageData(SysTaskAttachment attachment, Long serviceOrderId, Long dispatchOrdId,Integer oaUserId) { |
| | | if (attachment == null) { |
| | | log.error("éä»¶å¯¹è±¡ä¸ºç©ºï¼æ æ³åæ¥"); |
| | | return 0L; |
| | | } |
| | | |
| | | // æ£æ¥æ¯å¦å·²åæ¥ |
| | | if (attachment.getSyncedToImageData() != null && attachment.getSyncedToImageData() == 1) { |
| | | log.info("éä»¶ID={} 已忥ï¼è·³è¿", attachment.getAttachmentId()); |
| | | return 0L; |
| | | } |
| | | |
| | | // æ£æ¥å¿
è¦åæ° |
| | | if (dispatchOrdId == null || serviceOrderId == null) { |
| | | log.error("è°åº¦åIDåæå¡åIDé½ä¸ºç©ºï¼æ æ³åæ¥éä»¶ID={}", attachment.getAttachmentId()); |
| | | return 0L; |
| | | } |
| | | |
| | | try { |
| | | // è·åéä»¶å类对åºçImageType |
| | | Integer imageType = getImageTypeByCategory(attachment.getAttachmentCategory()); |
| | | |
| | | // è·åéä»¶æ¬å°æä»¶è·¯å¾ |
| | | String filePath = attachment.getFilePath(); |
| | | if (!StringUtils.hasText(filePath)) { |
| | | log.error("éä»¶ID={} çæä»¶è·¯å¾ä¸ºç©º", attachment.getAttachmentId()); |
| | | return 0L; |
| | | } |
| | | |
| | | // æå»ºå®æ´çæ¬å°æä»¶è·¯å¾ |
| | | String fullFilePath = ruoYiConfig.getProfile() + filePath; |
| | | File file = new File(fullFilePath); |
| | | |
| | | if (!file.exists()) { |
| | | log.error("éä»¶ID={} 对åºçæä»¶ä¸åå¨: {}", attachment.getAttachmentId(), fullFilePath); |
| | | return 0L; |
| | | } |
| | | |
| | | // çæç®æ è·¯å¾ï¼ä½¿ç¨dispatchOrdIdä½ä¸ºç®å½ï¼ |
| | | String targetPath = dispatchOrdId != null ? dispatchOrdId.toString() : "default"; |
| | | |
| | | // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä¸ä¼ å°æä»¶æå¡å¨ï¼å
å«ç¼©ç¥å¾çæï¼ |
| | | log.info("å¼å§ä¸ä¼ éä»¶ID={} å°æä»¶æå¡å¨ï¼ç®æ è·¯å¾={}", attachment.getAttachmentId(), targetPath); |
| | | FileUploadResponse uploadResponse = fileUploadService.uploadLocalFileWithThumbnail(file, targetPath); |
| | | |
| | | if (!uploadResponse.isSuccess()) { |
| | | log.error("éä»¶ID={} ä¸ä¼ å°æä»¶æå¡å¨å¤±è´¥: {}", attachment.getAttachmentId(), uploadResponse.getMessage()); |
| | | return 0L; |
| | | } |
| | | |
| | | log.info("éä»¶ID={} ä¸ä¼ æåï¼åå¾è·¯å¾={}, 缩ç¥å¾è·¯å¾={}", |
| | | attachment.getAttachmentId(), uploadResponse.getFilePath(), uploadResponse.getThumbnailPath()); |
| | | |
| | | // å建ImageData对象 |
| | | ImageData imageData = new ImageData(); |
| | | imageData.setDOrdIDDt(dispatchOrdId); |
| | | imageData.setSOrdIDDt(serviceOrderId); |
| | | imageData.setImageType(imageType); |
| | | imageData.setImageUrl(uploadResponse.getFilePath()); |
| | | imageData.setImageUrls(uploadResponse.getThumbnailPath()); // 缩ç¥å¾è·¯å¾ |
| | | imageData.setUpImageTime(attachment.getUploadTime() != null ? attachment.getUploadTime() : new Date()); |
| | | imageData.setUpImageOAid(oaUserId); |
| | | imageData.setImageDel(0); |
| | | |
| | | // æå
¥ImageData |
| | | int result = imageDataService.insertImageData(imageData); |
| | | |
| | | if (result > 0) { |
| | | |
| | | log.info("æå忥éä»¶ID={} å°ImageDataï¼ImageDataId={}", |
| | | attachment.getAttachmentId(), imageData.getId()); |
| | | return imageData.getId(); |
| | | } else { |
| | | log.error("忥éä»¶ID={} å°ImageData失败", attachment.getAttachmentId()); |
| | | return 0L; |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("忥éä»¶ID={} å°ImageDataæ¶åçå¼å¸¸", attachment.getAttachmentId(), e); |
| | | return 0L; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¹é忥任å¡çææéä»¶å°ImageData |
| | | */ |
| | | @Override |
| | | public List<SysTaskAttachment> syncTaskAttachmentsToImageData(List<SysTaskAttachment> attachments, Long serviceOrderId, Long dispatchOrdId,Integer oaUserId) { |
| | | |
| | | |
| | | if (attachments == null || attachments.isEmpty()) { |
| | | log.info("没æéä»¶ï¼æ é忥"); |
| | | return null; |
| | | } |
| | | |
| | | int successCount = 0; |
| | | for (SysTaskAttachment attachment : attachments) { |
| | | Long imageDataId = syncAttachmentToImageData(attachment, serviceOrderId, dispatchOrdId,oaUserId); |
| | | if (imageDataId>0) |
| | | { |
| | | attachment.setSyncedToImageData(1); |
| | | attachment.setSyncTime(new Date()); |
| | | attachment.setImageDataId(imageDataId); |
| | | successCount++; |
| | | } |
| | | } |
| | | |
| | | log.info(" å
±åæ¥ {}/{} 个éä»¶å°ImageData", |
| | | successCount, attachments.size()); |
| | | |
| | | return null; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * æ ¹æ®éä»¶åç±»è·å对åºçImageType |
| | | * |
| | | * éä»¶åç±»æ å°ï¼ |
| | | * 1-ç¥æ
åæä¹¦ -> 0 |
| | | * 2-ç
äººèµæ -> 1 |
| | | * 3-æä½è®°å½ -> 2 |
| | | * 4-åºè½¦å -> 3 |
| | | * 5-åºè½¦å -> 4 |
| | | * 6-ç³»å®å
¨å¸¦ -> 5 |
| | | */ |
| | | private Integer getImageTypeByCategory(String category) { |
| | | if (category == null) { |
| | | return 1; |
| | | } |
| | | |
| | | switch (category) { |
| | | case "1": // ç¥æ
åæä¹¦ |
| | | return 1; |
| | | case "2": // ç
äººèµæ |
| | | return 2; |
| | | case "3": // æä½è®°å½ |
| | | return 3; |
| | | case "4": // åºè½¦å |
| | | return 4; |
| | | case "5": // åºè½¦å |
| | | return 5; |
| | | case "6": // ç³»å®å
¨å¸¦ |
| | | return 6; |
| | | default: |
| | | return 1; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.task; |
| | | |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | |
| | | public interface ITaskAttachmentService { |
| | | boolean isAttachmentSynced(Long taskId); |
| | | |
| | | boolean updateAttachment(SysTaskAttachment attachment); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.task; |
| | | |
| | | import com.ruoyi.system.domain.SysTaskAttachment; |
| | | import com.ruoyi.system.mapper.SysTaskAttachmentMapper; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | @Service |
| | | public class TaskAttachmentServiceImpl implements ITaskAttachmentService{ |
| | | |
| | | @Autowired |
| | | private SysTaskAttachmentMapper taskAttachmentMapper; |
| | | |
| | | /** |
| | | * æ£æ¥éä»¶æ¯å¦å·²åæ¥ |
| | | */ |
| | | @Override |
| | | public boolean isAttachmentSynced(Long attachmentId) { |
| | | if (attachmentId == null) { |
| | | return false; |
| | | } |
| | | |
| | | SysTaskAttachment attachment = taskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); |
| | | if (attachment == null) { |
| | | return false; |
| | | } |
| | | |
| | | return attachment.getSyncedToImageData() != null && attachment.getSyncedToImageData() == 1; |
| | | } |
| | | |
| | | @Override |
| | | public boolean updateAttachment(SysTaskAttachment attachment) { |
| | | return taskAttachmentMapper.updateSysTaskAttachment(attachment) > 0; |
| | | } |
| | | } |
| | |
| | | <result property="attachmentCategory" column="attachment_category" /> |
| | | <result property="uploadTime" column="upload_time" /> |
| | | <result property="uploadBy" column="upload_by" /> |
| | | <result property="syncedToImageData" column="synced_to_image_data" /> |
| | | <result property="syncTime" column="sync_time" /> |
| | | <result property="imageDataId" column="image_data_id" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysTaskAttachmentVo"> |
| | | select attachment_id, task_id, file_name, file_path, file_size, file_type, attachment_category, upload_time, upload_by |
| | | select attachment_id, task_id, file_name, file_path, file_size, file_type, attachment_category, upload_time, upload_by, synced_to_image_data, sync_time, image_data_id |
| | | from sys_task_attachment |
| | | </sql> |
| | | |
| | |
| | | <if test="attachmentCategory != null and attachmentCategory != ''">attachment_category,</if> |
| | | <if test="uploadTime != null">upload_time,</if> |
| | | <if test="uploadBy != null and uploadBy != ''">upload_by,</if> |
| | | <if test="syncedToImageData != null">synced_to_image_data,</if> |
| | | <if test="syncTime != null">sync_time,</if> |
| | | <if test="imageDataId != null">image_data_id,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="taskId != null">#{taskId},</if> |
| | |
| | | <if test="attachmentCategory != null and attachmentCategory != ''">#{attachmentCategory},</if> |
| | | <if test="uploadTime != null">#{uploadTime},</if> |
| | | <if test="uploadBy != null and uploadBy != ''">#{uploadBy},</if> |
| | | <if test="syncedToImageData != null">#{syncedToImageData},</if> |
| | | <if test="syncTime != null">#{syncTime},</if> |
| | | <if test="imageDataId != null">#{imageDataId},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | |
| | | <if test="attachmentCategory != null and attachmentCategory != ''">attachment_category = #{attachmentCategory},</if> |
| | | <if test="uploadTime != null">upload_time = #{uploadTime},</if> |
| | | <if test="uploadBy != null and uploadBy != ''">upload_by = #{uploadBy},</if> |
| | | <if test="syncedToImageData != null">synced_to_image_data = #{syncedToImageData},</if> |
| | | <if test="syncTime != null">sync_time = #{syncTime},</if> |
| | | <if test="imageDataId != null">image_data_id = #{imageDataId},</if> |
| | | </trim> |
| | | where attachment_id = #{attachmentId} |
| | | </update> |
| New file |
| | |
| | | -- 为sys_task_attachment表添å 忥ç¸å
³å段 |
| | | -- ç¨äºå°ä»»å¡é件忥å°ImageData表 |
| | | |
| | | -- æ·»å æ¯å¦å·²åæ¥å°ImageDataåæ®µ |
| | | ALTER TABLE sys_task_attachment ADD COLUMN synced_to_image_data TINYINT(1) DEFAULT 0 COMMENT 'æ¯å¦å·²åæ¥å°ImageData (0-æªåæ¥ 1-已忥)'; |
| | | |
| | | -- æ·»å 忥æ¶é´å段 |
| | | ALTER TABLE sys_task_attachment ADD COLUMN sync_time DATETIME COMMENT '忥æ¶é´'; |
| | | |
| | | -- æ·»å å
³èçImageData IDåæ®µ |
| | | ALTER TABLE sys_task_attachment ADD COLUMN image_data_id BIGINT COMMENT 'å
³èçImageData表çID'; |
| | | |
| | | -- æ·»å ç´¢å¼ä»¥æé«æ¥è¯¢æ§è½ |
| | | CREATE INDEX idx_synced_to_image_data ON sys_task_attachment(synced_to_image_data); |
| | | CREATE INDEX idx_image_data_id ON sys_task_attachment(image_data_id); |
| | | CREATE INDEX idx_task_id_synced ON sys_task_attachment(task_id, synced_to_image_data); |