app/api/task.js
@@ -61,11 +61,14 @@ } // é件管çAPI export function uploadAttachment(taskId, file) { export function uploadAttachment(taskId, file, category) { const formData = new FormData() formData.append('file', file) if (category) { formData.append('category', category) } return request({ url: '/task/' + taskId + '/attachment', url: '/task/attachment/upload/' + taskId, method: 'post', data: formData, headers: { @@ -74,6 +77,24 @@ }) } export function uploadAttachmentFromWechat(taskId, mediaId, category) { return request({ url: '/task/attachment/uploadFromWechat/' + taskId, method: 'post', params: { mediaId: mediaId, category: category } }) } export function getAttachmentList(taskId) { return request({ url: '/task/attachment/list/' + taskId, method: 'get' }) } export function deleteAttachment(attachmentId) { return request({ url: '/task/attachment/' + attachmentId, @@ -81,6 +102,14 @@ }) } // è·å微信AccessToken export function getWechatAccessToken() { return request({ url: '/wechat/accessToken', method: 'get' }) } // ç»è®¡API export function getTaskStatistics() { return request({ app/pages/task/detail.vue
@@ -194,6 +194,35 @@ </view> </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> <!-- ç¦ç¥è½¦ä»»å¡ç¹æä¿¡æ¯ --> <view class="detail-section" v-if="taskDetail.taskType === 'WELFARE' && taskDetail.welfareInfo"> <view class="section-title">ä¹å®¢ä¿¡æ¯</view> @@ -314,18 +343,66 @@ <!-- 已宿/已忶: 䏿¾ç¤ºæé® --> </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' export default { data() { return { taskDetail: null, taskId: 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 // æ¯å¦æ¯å¾®ä¿¡å°ç¨åºç¯å¢ } }, computed: { @@ -387,6 +464,12 @@ onLoad(options) { this.taskId = options.id this.loadTaskDetail() this.loadAttachmentList() // æ£æµæ¯å¦æ¯å¾®ä¿¡å°ç¨åºç¯å¢ // #ifdef MP-WEIXIN this.isWechatMiniProgram = true // #endif }, methods: { // å 载任å¡è¯¦æ @@ -592,6 +675,249 @@ }) } }) }, // å è½½éä»¶å表 loadAttachmentList() { if (!this.taskId) { return } getAttachmentList(this.taskId).then(response => { this.attachmentList = response.data || response || [] }).catch(error => { console.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 => { const accessToken = tokenResponse.data || tokenResponse if (!accessToken) { uni.hideLoading() that.$modal.showToast('è·åAccessToken失败') return } // ç¬¬äºæ¥ï¼ä¸ä¼ å°å¾®ä¿¡æå¡å¨ 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() }).catch(error => { uni.hideLoading() console.error('æäº¤mediaId失败:', error) that.$modal.showToast('ä¸ä¼ 失败ï¼' + (error.msg || '请éè¯')) }) } 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 || 'è¯·æ£æ¥ç½ç»')) } }) }).catch(error => { uni.hideLoading() console.error('è·åAccessToken失败:', error) that.$modal.showToast('è·åAccessToken失败') }) 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() } else { that.$modal.showToast(result.msg || 'ä¸ä¼ 失败') } } else { that.$modal.showToast('ä¸ä¼ 失败') } }, fail: function(err) { uni.hideLoading() console.error('ä¸ä¼ 失败:', err) that.$modal.showToast('ä¸ä¼ 失败') } }) }, // æ¥çéä»¶ viewAttachment(item) { // 妿æ¯å¾çï¼ä½¿ç¨å¾çé¢è§ const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp'] const fileExt = item.fileName.split('.').pop().toLowerCase() if (imageTypes.includes(fileExt)) { // æå»ºå¾ç访é®å°å // 妿æ¯filePathæ¯å®æ´è·¯å¾ï¼éè¦éè¿ä¸è½½æ¥å£è®¿é® const 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('ä» æ¯æé¢è§å¾ç') } }, // å é¤éä»¶ deleteAttachment(attachmentId, index) { const that = this this.$modal.confirm('ç¡®å®è¦å é¤è¯¥éä»¶åï¼').then(() => { deleteAttachment(attachmentId).then(response => { that.$modal.showToast('å 餿å') that.attachmentList.splice(index, 1) }).catch(error => { console.error('å é¤é件失败:', error) that.$modal.showToast('å é¤å¤±è´¥') }) }).catch(() => {}) }, // è·ååç±»åç§° getCategoryName(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' } } } @@ -647,6 +973,18 @@ 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; } } .info-item { @@ -694,6 +1032,84 @@ background-color: #f9f9f9; 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; } } } } } @@ -749,5 +1165,101 @@ } } } .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> bin/clean.bat
File was deleted bin/package.bat
File was deleted bin/run.bat
File was deleted doc/966120API½Ó¿Ú¹æ·¶.pdfBinary files differ
doc/966120Éú³É·þÎñµ¥½Ó¿Ú.pdfBinary files differ
doc/java8.rarBinary files differ
doc/jdk-8u291-windows-x64.exeBinary files differ
doc/sqlncli.msiBinary files differ
doc/¹ãÖݷǼ±¾ÈתÔ˶ԽӵÚÈý·½½Ó¿ÚÎĵµ(1).docxBinary files differ
doc/¹ãÖݷǼ±¾ÈתÔ˶ԽӵÚÈý·½½Ó¿ÚÎĵµ(1).pdfBinary files differ
doc/ÈôÒÀ»·¾³Ê¹ÓÃÊÖ²á.docxBinary files differ
doc/¶©µ¥×´Ì¬»Øµ÷½Ó¿ÚÎĵµ.docxBinary files differ
doc/¶©µ¥ÏêÇé.pngBinary files differ
doc/¶©µ¥ÏêÇé.rpBinary files differ
docs/ÈÎÎñ״̬±ä¸üGPS¶¨Î»¹¦ÄÜ˵Ã÷.md
File was deleted docs/µØÀí±àÂë·þÎñʹÓÃ˵Ã÷.md
File was deleted ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -16,7 +16,7 @@ { // System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(RuoYiApplication.class, args); System.out.println("(â¥â â¿â )ï¾ï¾ è¥ä¾å¯å¨æå á(´ڡ`á)ï¾ \n" + System.out.println("(â¥â â¿â )ï¾ï¾ æ°èªå¯å¨æå á(´ڡ`á)ï¾ \n" + " .-------. ____ __ \n" + " | _ _ \\ \\ \\ / / \n" + " | ( ' ) | \\ _. / ' \n" + ruoyi-admin/src/main/java/com/ruoyi/web/controller/evaluation/EvaluationController.java
@@ -8,13 +8,13 @@ import com.ruoyi.common.utils.WechatUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.config.WechatMpConfig; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.system.domain.EvaluationDetail; import com.ruoyi.system.service.IEvaluationDimensionService; import com.ruoyi.system.domain.EvaluationDimension; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -47,6 +47,9 @@ @Autowired private IEvaluationDimensionService evaluationDimensionService; @Autowired private WechatMpConfig wechatMpConfig; /** * æ¥è¯¢å®¢æ·è¯ä»·å表 @@ -150,12 +153,6 @@ } } @Value("${wechat.appId}") private String wechatAppId; @Value("${wechat.appSecret}") private String wechatAppSecret; /** * çæå¾®ä¿¡ææURL */ @@ -170,7 +167,12 @@ logger.info("çæå¾®ä¿¡ææURL - åå§redirectUri: {}", redirectUri); // çæå¾®ä¿¡ææURLï¼ä½¿ç¨snsapi_userinfoè·åç¨æ·ä¿¡æ¯ String authUrl = WechatUtils.generateAuthUrl(wechatAppId, redirectUri, "snsapi_userinfo", state); String authUrl = WechatUtils.generateAuthUrl( wechatMpConfig.getAppId(), redirectUri, "snsapi_userinfo", state ); if (authUrl == null) { return error("çæå¾®ä¿¡ææURL失败"); } @@ -180,7 +182,7 @@ Map<String, String> result = new HashMap<>(); result.put("authUrl", authUrl); result.put("originalRedirectUri", redirectUri); result.put("appId", wechatAppId); result.put("appId", wechatMpConfig.getAppId()); return success(result); } catch (Exception e) { logger.error("çæå¾®ä¿¡ææURL失败", e); @@ -201,7 +203,11 @@ } // è·åç½é¡µææAccess Token JSONObject tokenInfo = WechatUtils.getWebAccessToken(wechatAppId, wechatAppSecret, code); JSONObject tokenInfo = WechatUtils.getWebAccessToken( wechatMpConfig.getAppId(), wechatMpConfig.getAppSecret(), code ); if (tokenInfo == null) { return error("è·å微信ææä¿¡æ¯å¤±è´¥"); } ruoyi-admin/src/main/java/com/ruoyi/web/controller/imagedata/ImageDataController.java
New file @@ -0,0 +1,1074 @@ package com.ruoyi.web.controller.imagedata; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.config.LegacySystemConfig; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.InputStreamBase64Converter; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.file.FileUploadResponse; import com.ruoyi.system.file.IFileUploadService; import com.ruoyi.system.imagedata.IImageDataService; import com.ruoyi.system.domain.ImageData; import com.ruoyi.system.domain.enums.ImageTypeEnum; import com.ruoyi.system.imagedata.WxImageUploadRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.*; import java.util.List; /** * å¾çæ°æ®æ§å¶å¨ * * @author mhyl * @date 2024-01-01 */ @RestController @DataSource(DataSourceType.SQLSERVER) @RequestMapping("/hospital/imagedata") public class ImageDataController extends BaseController { private static final Logger log = LoggerFactory.getLogger(ImageDataController.class); @Autowired private IImageDataService imageDataService; @Autowired private IFileUploadService fileUploadService; @Autowired private LegacySystemConfig legacyConfig; /** * æ¥è¯¢å¾çæ°æ®å表 */ // @PreAuthorize("@ss.hasPermi('hospital:imagedata:list')") @GetMapping("/list") public TableDataInfo list(ImageData imageData) { // startPage(); List<ImageData> list = imageDataService.selectImageDataList(imageData); return getDataTable(list); } /** * 导åºå¾çæ°æ®å表 */ @Log(title = "å¾çæ°æ®", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ImageData imageData) { List<ImageData> list = imageDataService.selectImageDataList(imageData); ExcelUtil<ImageData> util = new ExcelUtil<ImageData>(ImageData.class); util.exportExcel(response, list, "å¾çæ°æ®æ°æ®"); } /** * è·åå¾çæ°æ®è¯¦ç»ä¿¡æ¯ */ @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return AjaxResult.success(imageDataService.selectImageDataById(id)); } /** * æ°å¢å¾çæ°æ® */ @Log(title = "å¾çæ°æ®", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ImageData imageData) { return toAjax(imageDataService.insertImageData(imageData)); } /** * ä¿®æ¹å¾çæ°æ® */ @Log(title = "å¾çæ°æ®", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody ImageData imageData) { return toAjax(imageDataService.updateImageData(imageData)); } /** * å é¤å¾çæ°æ® */ @Log(title = "å¾çæ°æ®", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(imageDataService.deleteImageDataByIds(ids)); } /** * æ ¹æ®è°åº¦åIDæ¥è¯¢å¾çæ°æ® */ @GetMapping("/byDispatchOrder/{dispatchOrdID}") public AjaxResult getByDispatchOrder(@PathVariable("dispatchOrdID") Long dispatchOrdID) { List<ImageData> list = imageDataService.selectImageDataByDOrdIDDt(dispatchOrdID); return AjaxResult.success(list); } /** * æ ¹æ®è°åº¦åIDåå¾çç±»åè·åææå¾çï¼å å«å®æ´é¾æ¥ï¼ * * @param dispatchOrdID è°åº¦åID * @param imageType å¾çç±»å * @return å¾çæ°æ®ï¼å å«å®æ´é¾æ¥ï¼ */ // @PreAuthorize("@ss.hasPermi('hospital:imagedata:query')") @Anonymous() @GetMapping("/byDispatchOrderAndType/{dispatchOrdID}/{imageType}") public AjaxResult getByDispatchOrderAndType(@PathVariable("dispatchOrdID") Long dispatchOrdID, @PathVariable("imageType") Integer imageType) { try { // æ¥è¯¢æå®è°åº¦ååç±»åçææå¾ç List<ImageData> imageDataList = imageDataService.selectImageDataByDOrdIDDtAndType(dispatchOrdID, imageType); // è¿æ»¤ææå¾çï¼æªå é¤çï¼ List<ImageData> validImages = imageDataList.stream() .filter(img -> img.getImageDel() == null || img.getImageDel() == 0) .collect(java.util.stream.Collectors.toList()); // 为æ¯ä¸ªå¾çæ·»å 宿´é¾æ¥ for (ImageData imageData : validImages) { // æ·»å åå§å¾ç宿´é¾æ¥ if (StringUtils.hasText(imageData.getImageUrl())) { String fullImageUrl = buildFullImageUrl(imageData.getImageUrl()); imageData.setImageUrl(fullImageUrl); } // æ·»å 缩ç¥å¾å®æ´é¾æ¥ if (StringUtils.hasText(imageData.getImageUrls())) { String fullThumbnailUrl = buildFullImageUrl(imageData.getImageUrls()); imageData.setImageUrls(fullThumbnailUrl); } } return AjaxResult.success("è·åå¾çæå", validImages); } catch (Exception e) { return AjaxResult.error("è·åå¾ç失败ï¼" + e.getMessage()); } } /** * æ ¹æ®è°åº¦åIDåå¾çç±»åè·åææå¾çï¼ç®åçï¼åªè¿åå¾ç龿¥ï¼ * * @param dispatchOrdID è°åº¦åID * @param imageType å¾çç±»å * @return å¾ç龿¥å表 */ // @PreAuthorize("@ss.hasPermi('hospital:imagedata:query')") @Anonymous() @GetMapping("/links/byDispatchOrderAndType/{dispatchOrdID}/{imageType}") public AjaxResult getImageLinksByDispatchOrderAndType(@PathVariable("dispatchOrdID") Long dispatchOrdID, @PathVariable("imageType") Integer imageType) { try { // æ¥è¯¢æå®è°åº¦ååç±»åçææå¾ç List<ImageData> imageDataList = imageDataService.selectImageDataByDOrdIDDtAndType(dispatchOrdID, imageType); // æå»ºå¾ç龿¥å表 List<java.util.Map<String, String>> imageLinks = new java.util.ArrayList<>(); for (ImageData imageData : imageDataList) { // åªå¤çæªå é¤çå¾ç if (imageData.getImageDel() == null || imageData.getImageDel() == 0) { java.util.Map<String, String> linkMap = new java.util.HashMap<>(); // åå§å¾ç龿¥ if (StringUtils.hasText(imageData.getImageUrl())) { linkMap.put("originalUrl", buildFullImageUrl(imageData.getImageUrl())); } // 缩ç¥å¾é¾æ¥ if (StringUtils.hasText(imageData.getImageUrls())) { linkMap.put("thumbnailUrl", buildFullImageUrl(imageData.getImageUrls())); } // å¾çID linkMap.put("imageId", String.valueOf(imageData.getId())); // å¾çç±»å linkMap.put("imageType", String.valueOf(imageData.getImageType())); // ä¸ä¼ æ¶é´ if (imageData.getUpImageTime() != null) { linkMap.put("uploadTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, imageData.getUpImageTime())); } imageLinks.add(linkMap); } } return AjaxResult.success("è·åå¾ç龿¥æå", imageLinks); } catch (Exception e) { return AjaxResult.error("è·åå¾ç龿¥å¤±è´¥ï¼" + e.getMessage()); } } /** * æå»ºå®æ´çå¾çURL * * @param imagePath å¾çè·¯å¾ * @return 宿´çå¾çURL */ private String buildFullImageUrl(String imagePath) { if (!StringUtils.hasText(imagePath)) { return ""; } // å¦æå·²ç»æ¯å®æ´URLï¼ç´æ¥è¿å if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) { return imagePath; } // ä»é ç½®ä¸è¯»åæä»¶æå¡å¨URL String fileServerUrl = legacyConfig.getFileServerUrl(); // 妿é ç½®ä¸æ²¡æè®¾ç½®ï¼ä½¿ç¨é»è®¤å¼ if (!StringUtils.hasText(fileServerUrl)) { // è®°å½è¦åæ¥å¿ System.err.println("è¦åï¼é ç½®æä»¶ä¸æªè®¾ç½® legacy.system.fileServerUrlï¼ä½¿ç¨é»è®¤å¼"); fileServerUrl = "https://sync.966120.com.cn"; } // ç¡®ä¿æä»¶æå¡å¨URLä¸ä»¥/ç»å°¾ if (fileServerUrl.endsWith("/")) { fileServerUrl = fileServerUrl.substring(0, fileServerUrl.length() - 1); } // å¤çå¾çè·¯å¾ï¼ç§»é¤å¼å¤´åç»å°¾ç空ç½å符 imagePath = imagePath.trim(); // ç§»é¤å¼å¤´åç»å°¾çææ while (imagePath.startsWith("/")) { imagePath = imagePath.substring(1); } while (imagePath.endsWith("/")) { imagePath = imagePath.substring(0, imagePath.length() - 1); } // å¤çåææ ï¼å°åææ æ¿æ¢ä¸ºæ£ææ imagePath = imagePath.replace("\\", "/"); // ç§»é¤è·¯å¾ä¸å¯è½çé夿æ imagePath = imagePath.replaceAll("/+", "/"); // ç¡®ä¿å¾çè·¯å¾ä»¥/å¼å¤´ if (!imagePath.startsWith("/")) { imagePath = "/" + imagePath; } // æå»ºå®æ´URL String fullUrl = fileServerUrl + imagePath; // è®°å½è°è¯ä¿¡æ¯ System.out.println("æå»ºå¾çURL - é ç½®URL: " + fileServerUrl + ", å¾çè·¯å¾: " + imagePath + ", 宿´URL: " + fullUrl); return fullUrl; } /** * æ ¹æ®æå¡åIDæ¥è¯¢å¾çæ°æ® */ @PreAuthorize("@ss.hasPermi('hospital:imagedata:query')") @GetMapping("/byServiceOrder/{serviceOrdID}") public AjaxResult getByServiceOrder(@PathVariable("serviceOrdID") Long serviceOrdID) { List<ImageData> list = imageDataService.selectImageDataBySOrdIDDt(serviceOrdID); return AjaxResult.success(list); } /** * æ ¹æ®å¾çç±»åæ¥è¯¢å¾çæ°æ® */ @PreAuthorize("@ss.hasPermi('hospital:imagedata:query')") @GetMapping("/byType/{imageType}") public AjaxResult getByType(@PathVariable("imageType") Integer imageType) { List<ImageData> list = imageDataService.selectImageDataByType(imageType); return AjaxResult.success(list); } /** * æ è®°å¾ç为å é¤ç¶æ */ @PreAuthorize("@ss.hasPermi('hospital:imagedata:remove')") @Log(title = "æ è®°å¾çå é¤", businessType = BusinessType.DELETE) @PutMapping("/markDelete/{id}") public AjaxResult markDelete(@PathVariable("id") Long id) { return toAjax(imageDataService.markImageDataAsDeleted(id)); } /** * 微信å¾çä¸ä¼ å¤çï¼åASP代ç 转æ¢ï¼ */ @Log(title = "微信å¾çä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadWxImage") public AjaxResult uploadWxImage(@RequestBody WxImageUploadRequest request) { // è·åå½åç»å½ç¨æ·ID Integer adminId = getUserId().intValue(); String result = imageDataService.uploadWxImage( request.getDispatchOrdID(), request.getServiceOrdID(), request.getOaid(), request.getMediaId(), request.getImageType(), adminId ); if (result.contains("æå")) { return success(result); } else { return error(result); } } /** * 微信å¾çä¸ä¼ å¤çï¼å ¼å®¹åæåæ°æ ¼å¼ï¼ */ @Log(title = "微信å¾çä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadWxImageForm") public AjaxResult uploadWxImageForm( @RequestParam(value = "DispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "ServiceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "OAID", required = false) Integer oaid, @RequestParam(value = "media_id", required = true) String mediaId, @RequestParam(value = "ImageType", required = false) Integer imageType) { // è·åå½åç»å½ç¨æ·ID Integer adminId = getUserId().intValue(); String result = imageDataService.uploadWxImage(dispatchOrdID, serviceOrdID, oaid, mediaId, imageType, adminId); if (result.contains("æå")) { return success(result); } else { return error(result); } } /** * 微信å¾çä¸ä¼ å¤çï¼å®æ´çæ¬ï¼å 嫿件ä¸è½½å缩ç¥å¾çæï¼ */ @Log(title = "微信å¾çä¸ä¼ 宿´ç", businessType = BusinessType.INSERT) @PostMapping("/uploadWxImageWithDownload") public AjaxResult uploadWxImageWithDownload(@RequestBody WxImageUploadRequest request) { // è·åå½åç»å½ç¨æ·ID Integer adminId = getUserId().intValue(); // è¿ééè¦ä»é ç½®æè¯·æ±ä¸è·åaccess_token // å®é ä½¿ç¨æ¶åºè¯¥ä»å¾®ä¿¡é ç½®æç¼åä¸è·å String accessToken = request.getAccessToken(); // éè¦å¨WxImageUploadRequest䏿·»å æ¤å段 if (accessToken == null || accessToken.isEmpty()) { return error("缺å°å¾®ä¿¡è®¿é®ä»¤ç"); } String result = imageDataService.uploadWxImageWithDownload( accessToken, request.getMediaId(), request.getDispatchOrdID(), request.getOaid(), request.getImageType(), adminId ); if (result.contains("æå")) { return success(result); } else { return error(result); } } /** * 微信å¾çä¸ä¼ å¤çï¼å®æ´çæ¬ï¼å ¼å®¹åæåæ°æ ¼å¼ï¼ */ @Log(title = "微信å¾çä¸ä¼ 宿´ç", businessType = BusinessType.INSERT) @PostMapping("/uploadWxImageWithDownloadForm") public AjaxResult uploadWxImageWithDownloadForm( @RequestParam(value = "access_token", required = true) String accessToken, @RequestParam(value = "media_id", required = true) String mediaId, @RequestParam(value = "DispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "ServiceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "OAID", required = false) Integer oaid, @RequestParam(value = "ImageType", required = false) Integer imageType) { // è·åå½åç»å½ç¨æ·ID Integer adminId = getUserId().intValue(); String result = imageDataService.uploadWxImageWithDownload( accessToken, mediaId, dispatchOrdID, oaid, imageType, adminId); if (result.contains("æå")) { return success(result); } else { return error(result); } } /** * çæç¼©ç¥å¾ */ @Log(title = "çæç¼©ç¥å¾", businessType = BusinessType.OTHER) @PostMapping("/createThumbnail") public AjaxResult createThumbnail( @RequestParam(value = "bigImgPath", required = true) String bigImgPath, @RequestParam(value = "width", required = true) int width, @RequestParam(value = "height", required = false, defaultValue = "0") int height, @RequestParam(value = "smallImgPath", required = true) String smallImgPath) { boolean result = imageDataService.createThumbnail(bigImgPath, width, height, smallImgPath); if (result) { return success("缩ç¥å¾çææå"); } else { return error("缩ç¥å¾çæå¤±è´¥"); } } /** * æ£æ¥æä»¶å ¼å®¹æ§ */ @GetMapping("/checkCompatibility") public AjaxResult checkFileCompatibility(@RequestParam("filePath") String filePath) { try { String result = imageDataService.checkFileCompatibility(filePath); return AjaxResult.success("å ¼å®¹æ§æ£æ¥å®æ", result); } catch (Exception e) { return AjaxResult.error("å ¼å®¹æ§æ£æ¥å¤±è´¥ï¼" + e.getMessage()); } } /** * éªè¯URLæ ¼å¼æ¯å¦ä¸æ§ç³»ç»å ¼å®¹ */ @GetMapping("/checkUrlCompatibility") public AjaxResult checkUrlCompatibility(@RequestParam("url") String url) { try { boolean isCompatible = imageDataService.isUrlCompatible(url); return AjaxResult.success("URLå ¼å®¹æ§æ£æ¥å®æ", isCompatible); } catch (Exception e) { return AjaxResult.error("URLå ¼å®¹æ§æ£æ¥å¤±è´¥ï¼" + e.getMessage()); } } /** * çæä¸æ§ç³»ç»å ¼å®¹çæä»¶è·¯å¾ */ @GetMapping("/generateCompatibleFilePath") public AjaxResult generateCompatibleFilePath(@RequestParam("dispatchOrdID") Long dispatchOrdID, @RequestParam("mediaId") String mediaId, @RequestParam(value = "isThumbnail", defaultValue = "false") boolean isThumbnail) { try { String filePath = imageDataService.generateCompatibleFilePath(dispatchOrdID, mediaId, isThumbnail); return AjaxResult.success("çæå ¼å®¹æä»¶è·¯å¾æå", filePath); } catch (Exception e) { return AjaxResult.error("çæå ¼å®¹æä»¶è·¯å¾å¤±è´¥ï¼" + e.getMessage()); } } /** * çæä¸æ§ç³»ç»å ¼å®¹ç访é®URL */ @GetMapping("/generateCompatibleUrl") public AjaxResult generateCompatibleUrl(@RequestParam("dispatchOrdID") Long dispatchOrdID, @RequestParam("mediaId") String mediaId, @RequestParam(value = "isThumbnail", defaultValue = "false") boolean isThumbnail) { try { String url = imageDataService.generateCompatibleUrl(dispatchOrdID, mediaId, isThumbnail); return AjaxResult.success("çæå ¼å®¹URLæå", url); } catch (Exception e) { return AjaxResult.error("çæå ¼å®¹URL失败ï¼" + e.getMessage()); } } /** * éè¿å¾çURLä¸ä¼ å¤çï¼å®æ´çæ¬ï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param thumbnailUrl 缩ç¥å¾URL * @param imageType å¾çç±»å * @return å¤çç»æ */ @PreAuthorize("@ss.hasPermi('hospital:imagedata:add')") @Log(title = "å¾çURLä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadByUrl") public AjaxResult uploadImageByUrl(@RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "oaid", required = false) Integer oaid, @RequestParam("imageUrl") String imageUrl, @RequestParam(value = "thumbnailUrl", required = false) String thumbnailUrl, @RequestParam(value = "imageType", defaultValue = "0") Integer imageType) { try { // è·åå½å管çåID Integer adminId = getUserId().intValue(); // è°ç¨å¾çæ°æ®æå¡å¤çä¸ä¼ String result = imageDataService.uploadImageByUrl(dispatchOrdID, serviceOrdID, oaid, imageUrl, thumbnailUrl, imageType, adminId); if (result.contains("æå")) { return AjaxResult.success("å¾çURLä¸ä¼ æå", result); } else { return AjaxResult.error(result); } } catch (Exception e) { return AjaxResult.error("å¾çURLä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * éè¿å¾çURLä¸ä¼ å¤çï¼ç®åçæ¬ï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param imageType å¾çç±»å * @return å¤çç»æ */ @Log(title = "å¾çURLä¸ä¼ ç®åç", businessType = BusinessType.INSERT) @PostMapping("/uploadByUrlSimple") public AjaxResult uploadImageByUrlSimple(@RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "oaid", required = false) Integer oaid, @RequestParam("imageUrl") String imageUrl, @RequestParam(value = "imageType", defaultValue = "0") Integer imageType) { try { // è·åå½å管çåID Integer adminId = getUserId().intValue(); // è°ç¨å¾çæ°æ®æå¡å¤çä¸ä¼ ï¼ç®åçï¼ String result = imageDataService.uploadImageByUrlSimple(dispatchOrdID, serviceOrdID, oaid, imageUrl, imageType, adminId); if (result.contains("æå")) { return AjaxResult.success("å¾çURLä¸ä¼ æå", result); } else { return AjaxResult.error(result); } } catch (Exception e) { return AjaxResult.error("å¾çURLä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * éè¿å¾çURLä¸ä¼ å¤çï¼JSONæ ¼å¼ï¼ * * @param requestBody 请æ±ä½ * @return å¤çç»æ */ @PreAuthorize("@ss.hasPermi('hospital:imagedata:add')") @Log(title = "å¾çURLä¸ä¼ JSON", businessType = BusinessType.INSERT) @PostMapping("/uploadByUrlJson") public AjaxResult uploadImageByUrlJson(@RequestBody ImageUrlUploadRequest requestBody) { try { // è·åå½å管çåID Integer adminId = getUserId().intValue(); // è°ç¨å¾çæ°æ®æå¡å¤çä¸ä¼ String result = imageDataService.uploadImageByUrl(requestBody.getDispatchOrdID(), requestBody.getServiceOrdID(), requestBody.getOaid(), requestBody.getImageUrl(), requestBody.getThumbnailUrl(), requestBody.getImageType(), adminId); if (result.contains("æå")) { return AjaxResult.success("å¾çURLä¸ä¼ æå", result); } else { return AjaxResult.error(result); } } catch (Exception e) { return AjaxResult.error("å¾çURLä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * å¾çURLä¸ä¼ 请æ±å¯¹è±¡ */ public static class ImageUrlUploadRequest { private Long dispatchOrdID; private Long serviceOrdID; private Integer oaid; private String imageUrl; private String thumbnailUrl; private Integer imageType; // getteråsetteræ¹æ³ public Long getDispatchOrdID() { return dispatchOrdID; } public void setDispatchOrdID(Long dispatchOrdID) { this.dispatchOrdID = dispatchOrdID; } public Long getServiceOrdID() { return serviceOrdID; } public void setServiceOrdID(Long serviceOrdID) { this.serviceOrdID = serviceOrdID; } public Integer getOaid() { return oaid; } public void setOaid(Integer oaid) { this.oaid = oaid; } public String getImageUrl() { return imageUrl; } public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; } public String getThumbnailUrl() { return thumbnailUrl; } public void setThumbnailUrl(String thumbnailUrl) { this.thumbnailUrl = thumbnailUrl; } public Integer getImageType() { return imageType; } public void setImageType(Integer imageType) { this.imageType = imageType; } } /** * å¾çæä»¶ä¸ä¼ æ¥å£ * * @param file ä¸ä¼ çå¾çæä»¶ * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param imageType å¾çç±»å * @return å¤çç»æ */ // @PreAuthorize("@ss.hasPermi('hospital:imagedata:add')") @Anonymous() @Log(title = "å¾çæä»¶ä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadFile") public AjaxResult uploadImageFile(@RequestParam("file") MultipartFile file, @RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "imageType", defaultValue = "0", required = true) Integer imageType, @RequestParam(value = "adminId", defaultValue = "0", required = false) Integer adminId) { try { adminId = getUserId().intValue(); // éªè¯æä»¶ if (file.isEmpty()) { return AjaxResult.error("è¯·éæ©è¦ä¸ä¼ çå¾çæä»¶"); } // éªè¯æä»¶ç±»å String originalFilename = file.getOriginalFilename(); if (originalFilename == null || !isValidImageFile(originalFilename)) { return AjaxResult.error("åªæ¯æä¸ä¼ å¾çæä»¶ï¼jpgãjpegãpngãgifãbmpï¼"); } // çæç®æ è·¯å¾ï¼ä½¿ç¨å¹´æç®å½ç»æï¼ String yearMonth = DateUtils.datePath(); String targetPath = dispatchOrdID.toString(); //å¨ç»æå¦è¿å fileUrl,thumbnailUrl,åmediaid // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä¿åå°æä»¶æå¡å¨ï¼å å«ç¼©ç¥å¾çæï¼ FileUploadResponse uploadResponse = fileUploadService.uploadMultipartFileWithThumbnail(file, targetPath); // æ·»å è°è¯ä¿¡æ¯ System.out.println("æä»¶ä¸ä¼ ååº - æå: " + uploadResponse.isSuccess()); System.out.println("æä»¶ä¸ä¼ ååº - æ¶æ¯: " + uploadResponse.getMessage()); System.out.println("æä»¶ä¸ä¼ ååº - æä»¶è·¯å¾: " + uploadResponse.getFilePath()); System.out.println("æä»¶ä¸ä¼ ååº - 缩ç¥å¾è·¯å¾: " + uploadResponse.getThumbnailPath()); if (!uploadResponse.isSuccess()) { return AjaxResult.error("æä»¶ä¸ä¼ 失败ï¼" + uploadResponse.getMessage()); } // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageType); imageData.setImageUrl(uploadResponse.getFilePath()); imageData.setImageUrls(uploadResponse.getThumbnailPath()); // 缩ç¥å¾è·¯å¾ imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // æå ¥æ°æ®åº int result = imageDataService.insertImageData(imageData); if (result > 0) { // æ ¹æ®å¾çç±»åè¿è¡ç¹æ®å¤ç ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); //è¿åå ¨è·¯å¾ //å¨ç»æå¦è¿å fileUrl,thumbnailUrl,åid HashMap<String, String> map = new HashMap<>(); //å ä¸fileServerUrl map.put("fileUrl", buildFullImageUrl(uploadResponse.getFilePath())); map.put("thumbnailUrl", buildFullImageUrl(uploadResponse.getThumbnailPath())); map.put("id", imageData.getId().toString()); return AjaxResult.success("å¾çä¸ä¼ æå", map); } else { return AjaxResult.error("å¾çæ°æ®ä¿å失败"); } } catch (Exception e) { return AjaxResult.error("å¾çä¸ä¼ 失败ï¼" + e.getMessage()); } } @Anonymous() @Log(title = "å¾çæä»¶ä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadFileBase64") public AjaxResult uploadFileBase64(@RequestParam("fileContent") String fileContent,@RequestParam("filename") String filename, @RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "imageType", defaultValue = "0", required = true) Integer imageType, @RequestParam(value = "adminId", defaultValue = "0", required = false) Integer adminId) { try { if( adminId == 0) adminId = getUserId().intValue(); InputStream stream= InputStreamBase64Converter.base64ToInputStream(fileContent); // çæç®æ è·¯å¾ï¼ä½¿ç¨å¹´æç®å½ç»æï¼ String yearMonth = DateUtils.datePath(); String targetPath = dispatchOrdID.toString(); //å¨ç»æå¦è¿å fileUrl,thumbnailUrl,åmediaid // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä¿åå°æä»¶æå¡å¨ï¼å å«ç¼©ç¥å¾çæï¼ FileUploadResponse uploadResponse = fileUploadService.uploadInputStream(stream,filename, targetPath); // æ·»å è°è¯ä¿¡æ¯ System.out.println("æä»¶ä¸ä¼ ååº - æå: " + uploadResponse.isSuccess()); System.out.println("æä»¶ä¸ä¼ ååº - æ¶æ¯: " + uploadResponse.getMessage()); System.out.println("æä»¶ä¸ä¼ ååº - æä»¶è·¯å¾: " + uploadResponse.getFilePath()); System.out.println("æä»¶ä¸ä¼ ååº - 缩ç¥å¾è·¯å¾: " + uploadResponse.getThumbnailPath()); if (!uploadResponse.isSuccess()) { return AjaxResult.error("æä»¶ä¸ä¼ 失败ï¼" + uploadResponse.getMessage()); } // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageType); imageData.setImageUrl(uploadResponse.getFilePath()); imageData.setImageUrls(uploadResponse.getThumbnailPath()); // 缩ç¥å¾è·¯å¾ imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // æå ¥æ°æ®åº int result = imageDataService.insertImageData(imageData); if (result > 0) { // æ ¹æ®å¾çç±»åè¿è¡ç¹æ®å¤ç ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); //è¿åå ¨è·¯å¾ //å¨ç»æå¦è¿å fileUrl,thumbnailUrl,åid HashMap<String, String> map = new HashMap<>(); //å ä¸fileServerUrl map.put("fileUrl", buildFullImageUrl(uploadResponse.getFilePath())); map.put("thumbnailUrl", buildFullImageUrl(uploadResponse.getThumbnailPath())); map.put("id", imageData.getId().toString()); return AjaxResult.success("å¾çä¸ä¼ æå", map); } else { return AjaxResult.error("å¾çæ°æ®ä¿å失败"); } } catch (Exception e) { return AjaxResult.error("å¾çä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * 微信å°ç¨åºä¸ç¨å¾çæä»¶ä¸ä¼ æ¥å£ * æ¯æå¾®ä¿¡å°ç¨åºç wx.uploadFile API * * @param request HttpServletRequest 请æ±å¯¹è±¡ * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param imageType å¾çç±»å * @param adminId 管çåID * @return å¤çç»æ */ @Anonymous() @Log(title = "微信å°ç¨åºå¾çä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadWxFile") public AjaxResult uploadWxFile(HttpServletRequest request, @RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "imageType", defaultValue = "0", required = true) Integer imageType, @RequestParam(value = "adminId", defaultValue = "0", required = false) Integer adminId) { try { adminId = getUserId().intValue(); // è·åæä»¶åæ° - 微信å°ç¨åºä¸ç¨ MultipartFile file = null; // æ£æ¥æ¯å¦ä¸º multipart è¯·æ± if (request instanceof MultipartHttpServletRequest) { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 微信å°ç¨åºéå¸¸ä½¿ç¨ "file" ä½ä¸ºæä»¶åæ°å file = multipartRequest.getFile("file"); // å¦ææ²¡æ¾å°ï¼å°è¯å ¶ä»å¯è½çåæ°å if (file == null || file.isEmpty()) { String[] possibleFileParams = {"image", "photo", "upload"}; for (String paramName : possibleFileParams) { file = multipartRequest.getFile(paramName); if (file != null && !file.isEmpty()) { break; } } } // å¦æè¿æ¯æ²¡æ¾å°æä»¶ï¼è·å第ä¸ä¸ªæä»¶ if (file == null || file.isEmpty()) { Iterator<String> fileNames = multipartRequest.getFileNames(); if (fileNames.hasNext()) { file = multipartRequest.getFile(fileNames.next()); } } } // éªè¯æä»¶ if (file == null || file.isEmpty()) { return AjaxResult.error("è¯·éæ©è¦ä¸ä¼ çå¾çæä»¶"); } // éªè¯æä»¶ç±»å String originalFilename = file.getOriginalFilename(); if (originalFilename == null || !isValidImageFile(originalFilename)) { return AjaxResult.error("åªæ¯æä¸ä¼ å¾çæä»¶ï¼jpgãjpegãpngãgifãbmpï¼"); } // çæç®æ è·¯å¾ String targetPath = dispatchOrdID != null ? dispatchOrdID.toString() : "default"; // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä¿åå°æä»¶æå¡å¨ï¼å å«ç¼©ç¥å¾çæï¼ FileUploadResponse uploadResponse = fileUploadService.uploadMultipartFileWithThumbnail(file, targetPath); // æ·»å è°è¯ä¿¡æ¯ System.out.println("微信å°ç¨åºæä»¶ä¸ä¼ ååº - æå: " + uploadResponse.isSuccess()); System.out.println("微信å°ç¨åºæä»¶ä¸ä¼ ååº - æ¶æ¯: " + uploadResponse.getMessage()); System.out.println("微信å°ç¨åºæä»¶ä¸ä¼ ååº - æä»¶è·¯å¾: " + uploadResponse.getFilePath()); System.out.println("微信å°ç¨åºæä»¶ä¸ä¼ ååº - 缩ç¥å¾è·¯å¾: " + uploadResponse.getThumbnailPath()); if (!uploadResponse.isSuccess()) { return AjaxResult.error("æä»¶ä¸ä¼ 失败ï¼" + uploadResponse.getMessage()); } // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageType); imageData.setImageUrl(uploadResponse.getFilePath()); imageData.setImageUrls(uploadResponse.getThumbnailPath()); // 缩ç¥å¾è·¯å¾ imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // æå ¥æ°æ®åº int result = imageDataService.insertImageData(imageData); if (result > 0) { // æ ¹æ®å¾çç±»åè¿è¡ç¹æ®å¤ç ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); // è¿å微信å°ç¨åºéè¦çæ ¼å¼ HashMap<String, Object> map = new HashMap<>(); map.put("fileUrl", buildFullImageUrl(uploadResponse.getFilePath())); map.put("thumbnailUrl", buildFullImageUrl(uploadResponse.getThumbnailPath())); map.put("id", imageData.getId()); map.put("success", true); map.put("message", "å¾çä¸ä¼ æå"); return AjaxResult.success("å¾çä¸ä¼ æå", map); } else { return AjaxResult.error("å¾çæ°æ®ä¿å失败"); } } catch (Exception e) { log.error("微信å°ç¨åºå¾çä¸ä¼ 失败", e); return AjaxResult.error("å¾çä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * 微信å°ç¨åºBase64å¾çä¸ä¼ æ¥å£ * æ¯æå¾®ä¿¡å°ç¨åºå°å¾ç转æ¢ä¸ºBase64åä¸ä¼ * * @param fileContent Base64ç¼ç çå¾çå 容 * @param filename æä»¶å * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param imageType å¾çç±»å * @param adminId 管çåID * @return å¤çç»æ */ @Anonymous() @Log(title = "微信å°ç¨åºBase64å¾çä¸ä¼ ", businessType = BusinessType.INSERT) @PostMapping("/uploadWxBase64") public AjaxResult uploadWxBase64(@RequestParam("fileContent") String fileContent, @RequestParam("filename") String filename, @RequestParam(value = "dispatchOrdID", required = false) Long dispatchOrdID, @RequestParam(value = "serviceOrdID", required = false) Long serviceOrdID, @RequestParam(value = "imageType", defaultValue = "0", required = true) Integer imageType, @RequestParam(value = "adminId", defaultValue = "0", required = false) Integer adminId) { try { if (adminId == 0) { adminId = getUserId().intValue(); } // éªè¯Base64å 容 if (fileContent == null || fileContent.trim().isEmpty()) { return AjaxResult.error("å¾çå 容ä¸è½ä¸ºç©º"); } // éªè¯æä»¶ç±»å if (filename == null || !isValidImageFile(filename)) { return AjaxResult.error("åªæ¯æä¸ä¼ å¾çæä»¶ï¼jpgãjpegãpngãgifãbmpï¼"); } // å°Base64转æ¢ä¸ºInputStream InputStream stream = InputStreamBase64Converter.base64ToInputStream(fileContent); // çæç®æ è·¯å¾ String targetPath = dispatchOrdID != null ? dispatchOrdID.toString() : "default"; // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä¿åå°æä»¶æå¡å¨ FileUploadResponse uploadResponse = fileUploadService.uploadInputStream(stream, filename, targetPath); // æ·»å è°è¯ä¿¡æ¯ System.out.println("微信å°ç¨åºBase64ä¸ä¼ ååº - æå: " + uploadResponse.isSuccess()); System.out.println("微信å°ç¨åºBase64ä¸ä¼ ååº - æ¶æ¯: " + uploadResponse.getMessage()); System.out.println("微信å°ç¨åºBase64ä¸ä¼ ååº - æä»¶è·¯å¾: " + uploadResponse.getFilePath()); System.out.println("微信å°ç¨åºBase64ä¸ä¼ ååº - 缩ç¥å¾è·¯å¾: " + uploadResponse.getThumbnailPath()); if (!uploadResponse.isSuccess()) { return AjaxResult.error("æä»¶ä¸ä¼ 失败ï¼" + uploadResponse.getMessage()); } // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageType); imageData.setImageUrl(uploadResponse.getFilePath()); imageData.setImageUrls(uploadResponse.getThumbnailPath()); // 缩ç¥å¾è·¯å¾ imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // æå ¥æ°æ®åº int result = imageDataService.insertImageData(imageData); if (result > 0) { // æ ¹æ®å¾çç±»åè¿è¡ç¹æ®å¤ç ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); // è¿å微信å°ç¨åºéè¦çæ ¼å¼ HashMap<String, Object> map = new HashMap<>(); map.put("fileUrl", buildFullImageUrl(uploadResponse.getFilePath())); map.put("thumbnailUrl", buildFullImageUrl(uploadResponse.getThumbnailPath())); map.put("id", imageData.getId()); map.put("success", true); map.put("message", "å¾çä¸ä¼ æå"); return AjaxResult.success("å¾çä¸ä¼ æå", map); } else { return AjaxResult.error("å¾çæ°æ®ä¿å失败"); } } catch (Exception e) { log.error("微信å°ç¨åºBase64å¾çä¸ä¼ 失败", e); return AjaxResult.error("å¾çä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * éªè¯æ¯å¦ä¸ºææçå¾çæä»¶ */ private boolean isValidImageFile(String filename) { String[] allowedExtensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp"}; String lowerFilename = filename.toLowerCase(); for (String ext : allowedExtensions) { if (lowerFilename.endsWith(ext)) { return true; } } return false; } /** * è·åæä»¶æ©å±å */ private String getFileExtension(String filename) { int lastDotIndex = filename.lastIndexOf('.'); if (lastDotIndex > 0) { return filename.substring(lastDotIndex + 1); } return "jpg"; // é»è®¤æ©å±å } /** * è·åä¸ä¼ è·¯å¾ */ private String getUploadPath() { // è¿éå¯ä»¥æ ¹æ®å®é é ç½®è¿åä¸ä¼ è·¯å¾ // å¯ä»¥ä»é ç½®æä»¶ä¸è¯»åæä½¿ç¨é»è®¤è·¯å¾ return System.getProperty("user.dir") + "/upload"; } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskAttachmentController.java
@@ -1,8 +1,13 @@ package com.ruoyi.web.controller.task; import java.util.List; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.utils.WechatUtils; import com.ruoyi.common.config.WechatConfig; import com.ruoyi.system.domain.SysTask; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +38,9 @@ @Autowired private ISysTaskService sysTaskService; @Autowired private WechatConfig wechatConfig; /** * æ¥è¯¢ä»»å¡éä»¶å表 @@ -50,9 +58,11 @@ @PreAuthorize("@ss.hasPermi('task:general:edit')") @Log(title = "ä»»å¡éä»¶", businessType = BusinessType.INSERT) @PostMapping("/upload/{taskId}") public AjaxResult upload(@PathVariable("taskId") Long taskId, @RequestParam("file") MultipartFile file) { public AjaxResult upload(@PathVariable("taskId") Long taskId, @RequestParam("file") MultipartFile file, @RequestParam(value = "category", required = false) String category) { try { int result = sysTaskService.uploadAttachment(taskId, file); int result = sysTaskService.uploadAttachment(taskId, file, category); if (result > 0) { return success("ä¸ä¼ æå"); } else { @@ -81,4 +91,74 @@ return error("å é¤å¤±è´¥ï¼" + e.getMessage()); } } /** * ä»å¾®ä¿¡mediaIdä¸ä¼ éä»¶ï¼å¾®ä¿¡å°ç¨åºä¸ç¨ï¼ */ @PreAuthorize("@ss.hasPermi('task:general:edit')") @Log(title = "ä»»å¡éä»¶", businessType = BusinessType.INSERT) @PostMapping("/uploadFromWechat/{taskId}") public AjaxResult uploadFromWechat(@PathVariable("taskId") Long taskId, @RequestParam("mediaId") String mediaId, @RequestParam(value = "category", required = false) String category) { try { // è·å微信AccessToken String accessToken = WechatUtils.getAccessToken( wechatConfig.getAppId(), wechatConfig.getAppSecret() ); if (accessToken == null || accessToken.isEmpty()) { return error("è·å微信AccessToken失败"); } // éè¿mediaIdä¸ä¼ éä»¶ int result = sysTaskService.uploadAttachmentFromWechat(taskId, accessToken, mediaId, category); if (result > 0) { return success("ä¸ä¼ æå"); } else { return error("ä¸ä¼ 失败"); } } catch (Exception e) { return error("ä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * ä¸è½½éä»¶ */ @GetMapping("/download/{attachmentId}") public void downloadAttachment(@PathVariable("attachmentId") Long attachmentId, HttpServletResponse response) { try { SysTaskAttachment attachment = sysTaskService.getAttachmentById(attachmentId); if (attachment == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } File file = new File(attachment.getFilePath()); if (!file.exists()) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } // 设置ååºå¤´ response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=" + attachment.getFileName()); response.setContentLengthLong(file.length()); // 读åæä»¶å¹¶è¾åº try (FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } os.flush(); } } catch (Exception e) { logger.error("ä¸è½½é件失败", e); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/wechat/WechatController.java
New file @@ -0,0 +1,42 @@ package com.ruoyi.web.controller.wechat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.config.WechatConfig; import com.ruoyi.common.utils.WechatUtils; /** * 微信æ¥å£Controller * * @author ruoyi */ @RestController @RequestMapping("/wechat") public class WechatController extends BaseController { @Autowired private WechatConfig wechatConfig; /** * è·å微信AccessToken */ @GetMapping("/accessToken") public AjaxResult getAccessToken() { try { String accessToken = WechatUtils.getAccessToken( wechatConfig.getAppId(), wechatConfig.getAppSecret() ); if (accessToken == null || accessToken.isEmpty()) { return error("è·å微信AccessToken失败"); } return success(accessToken); } catch (Exception e) { return error("è·å微信AccessTokenå¼å¸¸ï¼" + e.getMessage()); } } } ruoyi-admin/src/main/resources/application-dev.yml
@@ -97,6 +97,10 @@ # æ§ç³»ç»åºç¡URL (å¿ é¡»é ç½®) # 示ä¾: http://192.168.1.100:8080 æ http://legacy.yourdomain.com base-url: http://120.25.98.119:8083 # æä»¶ä¸ä¼ URL fileUploadUrl: http://120.25.98.119:8083/weixin/upload_file.php # æä»¶ä¸è½½URL fileServerUrl: http://120.25.98.119:8083 # æ¥æè½¬è¿å建æ¥å£è·¯å¾ (å¯éï¼é»è®¤å¼å¦ä¸) emergency-create-path: /admin_save_19.gds ruoyi-admin/src/main/resources/application.yml
@@ -56,7 +56,7 @@ basename: i18n/messages profiles: # ç¯å¢ dev|test|prod active: prod active: dev # æä»¶ä¸ä¼ servlet: multipart: @@ -146,11 +146,14 @@ apiUrl: http://120.25.98.119:8084/v1/ #æµè¯ç¯å¢ï¼localhost:8011 # 微信é ç½® wechat: evaluationWechat: appId: wx70f6a7346ee842c0 appSecret: 2d6c59de85e876b7eadebeba62e5417a redirectUri: http://yourdomain.com/evaluation # è°åº¦ç¨çweixiné ç½® transferConfigWeixin: appId: wx40692cc44953a8cb appSecret: 9638b7d8bb988e4daaac7ac35457f296 # è ¾è®¯å°å¾é ç½® tencent: map: ruoyi-common/src/main/java/com/ruoyi/common/config/LegacySystemConfig.java
@@ -24,6 +24,10 @@ /** ä»»å¡ç¶ææ¥è¯¢æ¥å£è·¯å¾ï¼å·²å¼ç¨ï¼ç´æ¥æ¥è¯¢SQL Serveræ°æ®åºï¼ */ @Deprecated private String statusQueryPath = "/task_status_query.asp"; private String fileUploadUrl; private String fileServerUrl; /** è¿æ¥è¶ æ¶æ¶é´(毫ç§) */ private int connectTimeout = 30000; @@ -41,6 +45,21 @@ return baseUrl; } public String getFileUploadUrl(){ return fileUploadUrl; } public void setFileUploadUrl(String fileUploadUrl){ this.fileUploadUrl = fileUploadUrl; } public String getFileServerUrl(){ return fileServerUrl; } public void setFileServerUrl(String fileServerUrl){ this.fileServerUrl = fileServerUrl; } public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } ruoyi-common/src/main/java/com/ruoyi/common/config/WechatConfig.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.common.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 微信å°ç¨åºé 置类ï¼ç¨äºéä»¶ä¸ä¼ çå°ç¨åºåè½ï¼ * é ç½®æ¥æºï¼transferConfig.weixin * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "transfer-config-weixin") public class WechatConfig { /** 微信å°ç¨åºAppID */ private String appId; /** 微信å°ç¨åºAppSecret */ private String appSecret; public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getAppSecret() { return appSecret; } public void setAppSecret(String appSecret) { this.appSecret = appSecret; } } ruoyi-common/src/main/java/com/ruoyi/common/config/WechatMpConfig.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.common.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * å¾®ä¿¡å ¬ä¼å·é 置类ï¼ç¨äºç½é¡µææãè¯ä»·çå ¬ä¼å·åè½ï¼ * * @author ruoyi */ @Component @ConfigurationProperties(prefix = "evaluation-wechat") public class WechatMpConfig { /** å¾®ä¿¡å ¬ä¼å·AppID */ private String appId; /** å¾®ä¿¡å ¬ä¼å·AppSecret */ private String appSecret; /** 微信ææåè°å°å */ private String redirectUri; public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getAppSecret() { return appSecret; } public void setAppSecret(String appSecret) { this.appSecret = appSecret; } public String getRedirectUri() { return redirectUri; } public void setRedirectUri(String redirectUri) { this.redirectUri = redirectUri; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/InputStreamBase64Converter.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.common.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.Base64; public class InputStreamBase64Converter { /** * å°InputStream转æ¢ä¸ºBase64å符串 */ public static String inputStreamToBase64(InputStream inputStream) throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } byte[] bytes = outputStream.toByteArray(); return Base64.getEncoder().encodeToString(bytes); } /** * å°Base64å符串转æ¢åInputStream */ public static InputStream base64ToInputStream(String base64String) { byte[] bytes = Base64.getDecoder().decode(base64String); return new ByteArrayInputStream(bytes); } } ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
@@ -1,16 +1,10 @@ package com.ruoyi.common.utils.http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.URL; import java.net.URLConnection; import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -33,6 +27,43 @@ private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); public static final int DEFAULT_READ_TIMEOUT = 60000; private static final String BOUNDARY_PREFIX = "----WebKitFormBoundary"; private static final String LINE_END = "\r\n"; private static final String TWO_HYPHENS = "--"; /** * çæå¯ä¸çboundary */ private static String generateBoundary() { return BOUNDARY_PREFIX + System.currentTimeMillis(); } /** * æ ¹æ®æä»¶åè·åContent-Type */ private static String getContentType(String fileName) { if (fileName == null) { return "application/octet-stream"; } String extension = fileName.toLowerCase(); if (extension.endsWith(".jpg") || extension.endsWith(".jpeg")) { return "image/jpeg"; } else if (extension.endsWith(".png")) { return "image/png"; } else if (extension.endsWith(".gif")) { return "image/gif"; } else if (extension.endsWith(".pdf")) { return "application/pdf"; } else if (extension.endsWith(".doc")) { return "application/msword"; } else if (extension.endsWith(".docx")) { return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; } else { return "application/octet-stream"; } } /** * åæå® URL åéGETæ¹æ³çè¯·æ± @@ -299,4 +330,138 @@ return true; } } /** * åéæä»¶ä¸ä¼ è¯·æ± * * @param url 请æ±URL * @param params 请æ±åæ°ï¼å 嫿件æµï¼ * @return ååºå 容 */ public static String postFile(String url, Map<String, Object> params) { return postFile(url, params, null); } /** * åéæä»¶ä¸ä¼ 请æ±ï¼æ¯æèªå®ä¹æä»¶åï¼ * * @param url 请æ±URL * @param params 请æ±åæ°ï¼å 嫿件æµï¼ * @param fileName æä»¶åï¼å¯éï¼å¦æä¸ºnullå使ç¨åæ°é®åï¼ * @return ååºå 容 */ public static String postFile(String url, Map<String, Object> params, String fileName) { HttpURLConnection connection = null; try { // çæå¯ä¸çboundary String boundary = generateBoundary(); log.info("å¼å§æä»¶ä¸ä¼ - URL: {}, fileName: {}, boundary: {}", url, fileName, boundary); log.info("åæ°æ°é: {}", params.size()); for (Map.Entry<String, Object> entry : params.entrySet()) { log.info("åæ°: {} = {}", entry.getKey(), entry.getValue() instanceof InputStream ? "InputStream" : entry.getValue()); } // åå»ºè¿æ¥ URL requestUrl = new URL(url); connection = (HttpURLConnection) requestUrl.openConnection(); // 设置请æ±å±æ§ connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Accept-Charset", "utf-8"); connection.setConnectTimeout(30000); connection.setReadTimeout(60000); // æå»ºè¯·æ±ä½ try (OutputStream outputStream = connection.getOutputStream(); PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8), true)) { // åå ¥æ®éåæ° for (Map.Entry<String, Object> entry : params.entrySet()) { Object value = entry.getValue(); if (!(value instanceof InputStream)) { writer.append(TWO_HYPHENS).append(boundary).append(LINE_END); writer.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"").append(LINE_END); writer.append("Content-Type: text/plain; charset=UTF-8").append(LINE_END); writer.append(LINE_END); writer.append(value.toString()).append(LINE_END); writer.flush(); } } // åå ¥æä»¶åæ° for (Map.Entry<String, Object> entry : params.entrySet()) { Object value = entry.getValue(); if (value instanceof InputStream) { // ç¡®å®æä»¶å String actualFileName = fileName != null ? fileName : entry.getKey(); writer.append(TWO_HYPHENS).append(boundary).append(LINE_END); writer.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"; filename=\"").append(actualFileName).append("\"").append(LINE_END); writer.append("Content-Type: ").append(getContentType(actualFileName)).append(LINE_END); writer.append(LINE_END); writer.flush(); // åå ¥æä»¶å 容 try (InputStream inputStream = (InputStream) value) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.flush(); } writer.append(LINE_END); writer.flush(); } } // åå ¥ç»ææ è®° writer.append(TWO_HYPHENS).append(boundary).append(TWO_HYPHENS).append(LINE_END); writer.flush(); } // è·åååº int responseCode = connection.getResponseCode(); log.info("æä»¶ä¸ä¼ ååºç ï¼{}", responseCode); // 读åååºå 容 StringBuilder response = new StringBuilder(); try (BufferedReader reader = new BufferedReader( new InputStreamReader( responseCode == HttpURLConnection.HTTP_OK ? connection.getInputStream() : connection.getErrorStream(), StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { response.append(line); } } if (responseCode != HttpURLConnection.HTTP_OK) { log.error("æä»¶ä¸ä¼ 失败ï¼ååºç ï¼{}ï¼ååºå 容ï¼{}", responseCode, response.toString()); throw new RuntimeException("æä»¶ä¸ä¼ 失败ï¼ååºç : " + responseCode + "ï¼ååºå 容: " + response.toString()); } log.info("æä»¶ä¸ä¼ æåï¼ååºï¼{}", response.toString()); return response.toString(); } catch (Exception e) { log.error("æä»¶ä¸ä¼ å¼å¸¸ï¼{}", e.getMessage(), e); throw new RuntimeException("æä»¶ä¸ä¼ 失败: " + e.getMessage(), e); } finally { if (connection != null) { connection.disconnect(); } } } } ruoyi-system/src/main/java/com/ruoyi/system/domain/ImageData.java
New file @@ -0,0 +1,92 @@ package com.ruoyi.system.domain; import com.ruoyi.common.core.domain.BaseEntity; import lombok.Data; import java.util.Date; import com.ruoyi.common.annotation.Excel; /** * å¾çæ°æ®å¯¹è±¡ ImageData */ @Data public class ImageData extends BaseEntity { private static final long serialVersionUID = 1L; /** * 主é®ID */ private Long id; /** * è°åº¦åID */ @Excel(name = "è°åº¦åID") private Long dOrdIDDt; /** * æå¡åID */ @Excel(name = "æå¡åID") private Long sOrdIDDt; /** * å¾çç±»å */ @Excel(name = "å¾çç±»å") private Integer imageType; /** * å¾çURL */ @Excel(name = "å¾çURL") private String imageUrl; /** * å¾çURLs */ @Excel(name = "å¾çURLs") private String imageUrls; /** * å¾çåº¦æ° */ @Excel(name = "å¾ç度æ°") private Integer imageDeg; /** * ä¸ä¼ å¾çæ¶é´ */ @Excel(name = "ä¸ä¼ å¾çæ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date upImageTime; /** * ä¸ä¼ å¾çOAç¨æ·ID */ @Excel(name = "ä¸ä¼ å¾çOAç¨æ·ID") private Integer upImageOAid; /** * å¾çå 餿 è®° */ @Excel(name = "å¾çå 餿 è®°") private Integer imageDel; /** * æ¯å¦AP */ @Excel(name = "æ¯å¦AP") private Integer isAP; /** * AP ID */ @Excel(name = "AP ID") private Integer isAP_ID; /** * APæ¶é´ */ @Excel(name = "APæ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date isAP_Time; } ruoyi-system/src/main/java/com/ruoyi/system/domain/SysTaskAttachment.java
@@ -37,6 +37,10 @@ @Excel(name = "æä»¶ç±»å") private String fileType; /** éä»¶åç±» */ @Excel(name = "éä»¶åç±»") private String attachmentCategory; /** ä¸ä¼ æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Excel(name = "ä¸ä¼ æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @@ -94,6 +98,14 @@ return fileType; } public void setAttachmentCategory(String attachmentCategory) { this.attachmentCategory = attachmentCategory; } public String getAttachmentCategory() { return attachmentCategory; } public void setUploadTime(Date uploadTime) { this.uploadTime = uploadTime; } @@ -119,6 +131,7 @@ ", filePath='" + filePath + '\'' + ", fileSize=" + fileSize + ", fileType='" + fileType + '\'' + ", attachmentCategory='" + attachmentCategory + '\'' + ", uploadTime=" + uploadTime + ", uploadBy='" + uploadBy + '\'' + '}'; ruoyi-system/src/main/java/com/ruoyi/system/domain/enums/ImageTypeEnum.java
New file @@ -0,0 +1,64 @@ package com.ruoyi.system.domain.enums; public enum ImageTypeEnum { DEFAULT(0, "é»è®¤"), INFORMED_CONSENT(1, "ç¥æ åæä¹¦"), BRZL(2, "ç äººèµæ"), CZJL(3, "æä½è®°å½"), CCQ(4, "åºè½¦å"), CCH(5, "åºè½¦å"), SEAT_BELT(6, "ç»å®å ¨å¸¦å¾ç"); // ç¥æ åæä¹¦ 1 // ç äººèµæ 2 // æä½è®°å½ 3 // åºè½¦å 4 // åºè½¦å 5 // ç³»å®å ¨å¸¦ 6 private final Integer code; private final String description; ImageTypeEnum(Integer code, String description) { this.code = code; this.description = description; } public Integer getCode() { return code; } public String getDescription() { return description; } /** * æ ¹æ®ä»£ç è·åæä¸¾ */ public static ImageTypeEnum getByCode(Integer code) { if (code == null) { return DEFAULT; } for (ImageTypeEnum type : values()) { if (type.getCode().equals(code)) { return type; } } return DEFAULT; } /** * 夿æ¯å¦ä¸ºç¥æ åæä¹¦ */ public boolean isInformedConsent() { return this == INFORMED_CONSENT; } /** * 夿æ¯å¦ä¸ºç»å®å ¨å¸¦å¾ç */ public boolean isSeatBelt() { return this == SEAT_BELT; } } ruoyi-system/src/main/java/com/ruoyi/system/file/FileUploadResponse.java
New file @@ -0,0 +1,41 @@ package com.ruoyi.system.file; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.io.Serializable; @Data public class FileUploadResponse implements Serializable { private static final long serialVersionUID = 1L; @JsonProperty("success") private boolean success; @JsonProperty("message") private String message; @JsonProperty("filePath") private String filePath; @JsonProperty("thumbnailPath") private String thumbnailPath; public static FileUploadResponse error(String error) { FileUploadResponse response = new FileUploadResponse(); response.setSuccess(false); response.setMessage(error); return response; } public static FileUploadResponse success(String file,String message) { FileUploadResponse response = new FileUploadResponse(); response.setSuccess(true); response.setFilePath(file); response.setMessage(message); return response; } } ruoyi-system/src/main/java/com/ruoyi/system/file/FileUploadServiceImpl.java
New file @@ -0,0 +1,549 @@ package com.ruoyi.system.file; import com.ruoyi.common.config.LegacySystemConfig; import com.ruoyi.common.utils.http.HttpUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.net.HttpURLConnection; import java.net.URL; import java.util.*; import java.io.*; @Service public class FileUploadServiceImpl implements IFileUploadService { private static final Logger log = LoggerFactory.getLogger(FileUploadServiceImpl.class); @Autowired private LegacySystemConfig legacyConfig; @Override public FileUploadResponse uploadLocalFile(File file, String targetPath) { if (file == null || !file.exists()) { return FileUploadResponse.error("æä»¶ä¸åå¨"); } try (FileInputStream fis = new FileInputStream(file)) { return uploadInputStream(fis, file.getName(), targetPath); } catch (IOException e) { log.error("è¯»åæ¬å°æä»¶å¤±è´¥: {}", file.getAbsolutePath(), e); return FileUploadResponse.error("读åæä»¶å¤±è´¥: " + e.getMessage()); } } @Override public FileUploadResponse uploadMultipartFile(MultipartFile multipartFile, String targetPath) { if (multipartFile == null || multipartFile.isEmpty()) { return FileUploadResponse.error("æä»¶ä¸ºç©º"); } try (InputStream inputStream = multipartFile.getInputStream()) { return uploadInputStream(inputStream, multipartFile.getOriginalFilename(), targetPath); } catch (IOException e) { log.error("读åMultipartFile失败", e); return FileUploadResponse.error("读åæä»¶å¤±è´¥: " + e.getMessage()); } } @Override public FileUploadResponse uploadBytes(byte[] fileBytes, String fileName, String targetPath) { if (fileBytes == null || fileBytes.length == 0) { return FileUploadResponse.error("æä»¶åèæ°ç»ä¸ºç©º"); } try (ByteArrayInputStream bis = new ByteArrayInputStream(fileBytes)) { return uploadInputStream(bis, fileName, targetPath); } catch (IOException e) { log.error("å¤çåèæ°ç»å¤±è´¥", e); return FileUploadResponse.error("å¤çæä»¶å¤±è´¥: " + e.getMessage()); } } @Override public FileUploadResponse uploadInputStream(InputStream inputStream, String fileName, String targetPath) { if (inputStream == null) { return FileUploadResponse.error("è¾å ¥æµä¸ºç©º"); } try { // æå»ºè¯·æ±åæ° Map<String, Object> params = new HashMap<>(); params.put("file", inputStream); params.put("uploadFileName", targetPath); log.info("å¼å§ä¸ä¼ æä»¶å°PHPæ¥å£: fileName={}, targetPath={}", fileName, targetPath); // è°ç¨PHPä¸ä¼ æ¥å£ String response = HttpUtils.postFile(legacyConfig.getFileServerUrl(), params, fileName); log.info("PHPæ¥å£ååº: {}", response); // è§£æååº return parseUploadResponse(response); } catch (Exception e) { log.error("ä¸ä¼ æä»¶å°PHPæ¥å£å¤±è´¥: fileName={}, targetPath={}", fileName, targetPath, e); return FileUploadResponse.error("ä¸ä¼ 失败: " + e.getMessage()); } } @Override public FileUploadResponse uploadFromUrl(String fileUrl, String targetPath) { if (fileUrl == null || fileUrl.trim().isEmpty()) { return FileUploadResponse.error("æä»¶URL为空"); } try { // ä»URLä¸è½½æä»¶ byte[] fileBytes = downloadFromUrl(fileUrl); if (fileBytes == null || fileBytes.length == 0) { return FileUploadResponse.error("ä»URLä¸è½½æä»¶å¤±è´¥"); } // ä»URL䏿åæä»¶å String fileName = extractFileNameFromUrl(fileUrl); // ä¸ä¼ æä»¶ return uploadBytes(fileBytes, fileName, targetPath); } catch (Exception e) { log.error("ä»URLä¸ä¼ æä»¶å¤±è´¥: fileUrl={}, targetPath={}", fileUrl, targetPath, e); return FileUploadResponse.error("ä»URLä¸ä¼ 失败: " + e.getMessage()); } } @Override public FileUploadResponse uploadFromWechat(String accessToken, String mediaId, String targetPath) { if (accessToken == null || mediaId == null) { return FileUploadResponse.error("å¾®ä¿¡åæ°ä¸ºç©º"); } try { // ä»å¾®ä¿¡APIä¸è½½æä»¶ byte[] fileBytes = downloadFromWechat(accessToken, mediaId); if (fileBytes == null || fileBytes.length == 0) { return FileUploadResponse.error("ä»å¾®ä¿¡ä¸è½½æä»¶å¤±è´¥"); } // çææä»¶å String fileName = "wechat_" + mediaId + ".jpg"; // ä¸ä¼ æä»¶ return uploadBytes(fileBytes, fileName, targetPath); } catch (Exception e) { log.error("ä»å¾®ä¿¡ä¸ä¼ æä»¶å¤±è´¥: mediaId={}, targetPath={}", mediaId, targetPath, e); return FileUploadResponse.error("ä»å¾®ä¿¡ä¸ä¼ 失败: " + e.getMessage()); } } @Override public boolean fileExists(String filePath) { if (filePath == null || filePath.trim().isEmpty()) { return false; } try { // æå»ºå®æ´çæä»¶è·¯å¾ String fullPath = legacyConfig.getFileServerUrl() + "/" + filePath; File file = new File(fullPath); return file.exists() && file.isFile(); } catch (Exception e) { log.error("æ£æ¥æä»¶æ¯å¦åå¨å¤±è´¥: {}", filePath, e); return false; } } @Override public boolean deleteFile(String filePath) { if (filePath == null || filePath.trim().isEmpty()) { return false; } try { // æå»ºå®æ´çæä»¶è·¯å¾ String fullPath = legacyConfig.getFileServerUrl() + "/" + filePath; File file = new File(fullPath); if (file.exists() && file.isFile()) { return file.delete(); } return false; } catch (Exception e) { log.error("å é¤æä»¶å¤±è´¥: {}", filePath, e); return false; } } @Override public String getFileUrl(String filePath) { if (filePath == null || filePath.trim().isEmpty()) { return null; } // æå»ºæä»¶è®¿é®URL return legacyConfig.getFileServerUrl() + "/" + filePath; } /** * ä»URLä¸è½½æä»¶ */ private byte[] downloadFromUrl(String fileUrl) throws IOException { URL url = new URL(fileUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(10000); connection.setReadTimeout(30000); try (InputStream inputStream = connection.getInputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } return outputStream.toByteArray(); } finally { connection.disconnect(); } } /** * ä»å¾®ä¿¡APIä¸è½½æä»¶ */ private byte[] downloadFromWechat(String accessToken, String mediaId) throws IOException { String wechatUrl = String.format( "https://api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s", accessToken, mediaId ); return downloadFromUrl(wechatUrl); } /** * ä»URL䏿åæä»¶å */ private String extractFileNameFromUrl(String fileUrl) { try { String fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1); // ç§»é¤æ¥è¯¢åæ° if (fileName.contains("?")) { fileName = fileName.substring(0, fileName.indexOf('?')); } return fileName.isEmpty() ? "downloaded_file" : fileName; } catch (Exception e) { return "downloaded_file"; } } /** * è§£æä¸ä¼ ååº */ private FileUploadResponse parseUploadResponse(String response) { if (response == null || response.trim().isEmpty()) { return FileUploadResponse.error("PHPæ¥å£è¿å空ååº"); } try { log.info("å¼å§è§£æPHPååº: {}", response); // æ ¹æ®PHPæ¥å£çå®é è¿åæ ¼å¼è¿è¡è§£æ // PHPè¿åæ ¼å¼: {"success": true, "message": "æä»¶ä¸ä¼ æå", "data": {...}} if (response.contains("\"success\":true") || response.contains("success")) { // æåæä»¶è·¯å¾å缩ç¥å¾è·¯å¾ String filePath = extractFilePathFromResponse(response); String thumbnailPath = extractThumbnailPathFromResponse(response); log.info("è§£æç»æ - filePath: {}, thumbnailPath: {}", filePath, thumbnailPath); // å建ååºå¯¹è±¡ FileUploadResponse uploadResponse = FileUploadResponse.success(filePath, "ä¸ä¼ æå"); if (thumbnailPath != null && !thumbnailPath.isEmpty()) { uploadResponse.setThumbnailPath(thumbnailPath); } return uploadResponse; } else { // æåéè¯¯ä¿¡æ¯ String errorMessage = extractErrorMessageFromResponse(response); log.error("ä¸ä¼ 失败ï¼é误信æ¯: {}", errorMessage); return FileUploadResponse.error(errorMessage != null ? errorMessage : "ä¸ä¼ 失败"); } } catch (Exception e) { log.error("è§£æä¸ä¼ ååºå¤±è´¥: {}", response, e); return FileUploadResponse.error("è§£æååºå¤±è´¥: " + e.getMessage()); } } /** * ä»ååºä¸æåæä»¶è·¯å¾ */ private String extractFilePathFromResponse(String response) { // è§£æPHPæ¥å£è¿åçJSONæ ¼å¼: {"success": true, "data": {"filePath": "..."}} try { if (response.contains("\"data\":")) { // æ¾å°data对象 int dataStart = response.indexOf("\"data\":{") + 7; if (dataStart > 6) { // å¨dataå¯¹è±¡ä¸æ¥æ¾filePath String dataSection = response.substring(dataStart); if (dataSection.contains("\"filePath\":")) { int start = dataSection.indexOf("\"filePath\":\"") + 12; int end = dataSection.indexOf("\"", start); if (start > 11 && end > start) { String filePath = dataSection.substring(start, end); log.info("æåå°æä»¶è·¯å¾: {}", filePath); return filePath; } } } } // å ¼å®¹æ§æ ¼å¼ï¼ç´æ¥æ¥æ¾filePath if (response.contains("\"filePath\":")) { int start = response.indexOf("\"filePath\":\"") + 12; int end = response.indexOf("\"", start); if (start > 11 && end > start) { String filePath = response.substring(start, end); log.info("æåå°æä»¶è·¯å¾(æ§æ ¼å¼): {}", filePath); return filePath; } } } catch (Exception e) { log.error("æåæä»¶è·¯å¾å¤±è´¥: {}", response, e); } return null; } /** * ä»ååºä¸æå缩ç¥å¾è·¯å¾ */ private String extractThumbnailPathFromResponse(String response) { // è§£æPHPæ¥å£è¿åçJSONæ ¼å¼: {"success": true, "data": {"thumbnailPath": "..."}} try { if (response.contains("\"data\":")) { // æ¾å°data对象 int dataStart = response.indexOf("\"data\":{") + 7; if (dataStart > 6) { // å¨dataå¯¹è±¡ä¸æ¥æ¾thumbnailPath String dataSection = response.substring(dataStart); if (dataSection.contains("\"thumbnailPath\":")) { int start = dataSection.indexOf("\"thumbnailPath\":\"") + 17; int end = dataSection.indexOf("\"", start); if (start > 16 && end > start) { String thumbnailPath = dataSection.substring(start, end); log.info("æåå°ç¼©ç¥å¾è·¯å¾: {}", thumbnailPath); return thumbnailPath; } } } } // å ¼å®¹æ§æ ¼å¼ï¼ç´æ¥æ¥æ¾thumbnailPath if (response.contains("\"thumbnailPath\":")) { int start = response.indexOf("\"thumbnailPath\":\"") + 17; int end = response.indexOf("\"", start); if (start > 16 && end > start) { String thumbnailPath = response.substring(start, end); log.info("æåå°ç¼©ç¥å¾è·¯å¾(æ§æ ¼å¼): {}", thumbnailPath); return thumbnailPath; } } } catch (Exception e) { log.error("æå缩ç¥å¾è·¯å¾å¤±è´¥: {}", response, e); } return null; } /** * ä»ååºä¸æåéè¯¯ä¿¡æ¯ */ private String extractErrorMessageFromResponse(String response) { // è§£æPHPæ¥å£è¿åçJSONæ ¼å¼: {"success": false, "message": "é误信æ¯"} try { if (response.contains("\"message\":")) { int start = response.indexOf("\"message\":\"") + 11; int end = response.indexOf("\"", start); if (start > 10 && end > start) { String errorMessage = response.substring(start, end); log.info("æåå°é误信æ¯: {}", errorMessage); return errorMessage; } } } catch (Exception e) { log.error("æåé误信æ¯å¤±è´¥: {}", response, e); } return null; } /** * çæç¼©ç¥å¾ * * @param sourcePath æºå¾çè·¯å¾ * @param targetPath ç®æ 缩ç¥å¾è·¯å¾ * @param width 宽度 * @param height é«åº¦ï¼0è¡¨ç¤ºææ¯ä¾ç¼©æ¾ï¼ * @return æ¯å¦çææå */ private boolean createThumbnail(String sourcePath, String targetPath, int width, int height) { try { // è¯»åæºå¾ç BufferedImage sourceImage = ImageIO.read(new File(sourcePath)); if (sourceImage == null) { log.error("æ æ³è¯»åæºå¾çï¼{}", sourcePath); return false; } // 计ç®ç¼©ç¥å¾å°ºå¯¸ int sourceWidth = sourceImage.getWidth(); int sourceHeight = sourceImage.getHeight(); if (height == 0) { height = (int) Math.floor((double) width / sourceWidth * sourceHeight); } else if (width == 0) { width = (int) Math.floor((double) height / sourceHeight * sourceWidth); } // å建缩ç¥å¾ BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = thumbnailImage.createGraphics(); // 设置渲æè´¨é g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // ç»å¶ç¼©ç¥å¾ g2d.drawImage(sourceImage, 0, 0, width, height, null); g2d.dispose(); // ä¿å缩ç¥å¾ String extension = getFileExtension(sourcePath); return ImageIO.write(thumbnailImage, extension, new File(targetPath)); } catch (Exception e) { log.error("çæç¼©ç¥å¾å¤±è´¥ï¼sourcePath={}, targetPath={}", sourcePath, targetPath, e); return false; } } /** * è·åæä»¶æ©å±å */ private String getFileExtension(String filePath) { int lastDotIndex = filePath.lastIndexOf('.'); if (lastDotIndex > 0) { return filePath.substring(lastDotIndex + 1).toLowerCase(); } return "jpg"; // é»è®¤æ©å±å } /** * æ¬å°æä»¶ä¸ä¼ ï¼å å«ç¼©ç¥å¾çæï¼ */ public FileUploadResponse uploadLocalFileWithThumbnail(File file, String targetPath) { if (file == null || !file.exists()) { return FileUploadResponse.error("æä»¶ä¸åå¨"); } try { // æ£æ¥æ¯å¦ä¸ºå¾çæä»¶ String fileName = file.getName().toLowerCase(); boolean isImage = fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".gif"); // ä¸ä¼ åæä»¶ FileUploadResponse uploadResponse = uploadLocalFile(file, targetPath); if (!uploadResponse.isSuccess()) { 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); } } return uploadResponse; } catch (Exception e) { log.error("ä¸ä¼ æä»¶å¹¶çæç¼©ç¥å¾å¤±è´¥ï¼{}", file.getAbsolutePath(), e); return FileUploadResponse.error("ä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * MultipartFileä¸ä¼ ï¼å å«ç¼©ç¥å¾çæï¼ */ public FileUploadResponse uploadMultipartFileWithThumbnail(MultipartFile multipartFile, String targetPath) { if (multipartFile == null || multipartFile.isEmpty()) { return FileUploadResponse.error("æä»¶ä¸ºç©º"); } try { // æ£æ¥æ¯å¦ä¸ºå¾çæä»¶ String originalFilename = multipartFile.getOriginalFilename(); if (originalFilename != null) { String fileName = originalFilename.toLowerCase(); boolean isImage = fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".gif"); // ä¸ä¼ åæä»¶ FileUploadResponse uploadResponse = uploadMultipartFile(multipartFile, targetPath); if (!uploadResponse.isSuccess()) { return uploadResponse; } return uploadResponse; } return uploadMultipartFile(multipartFile, targetPath); } catch (Exception e) { log.error("ä¸ä¼ MultipartFileå¹¶çæç¼©ç¥å¾å¤±è´¥", e); return FileUploadResponse.error("ä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * çæç¼©ç¥å¾è·¯å¾ */ private String generateThumbnailPath(String originalPath) { if (originalPath == null || originalPath.isEmpty()) { return null; } // 卿件ååæ·»å "s_" åç¼ int lastSlashIndex = originalPath.lastIndexOf('/'); if (lastSlashIndex >= 0) { String directory = originalPath.substring(0, lastSlashIndex + 1); String fileName = originalPath.substring(lastSlashIndex + 1); return directory + "s_" + fileName; } else { return "s_" + originalPath; } } } ruoyi-system/src/main/java/com/ruoyi/system/file/IFileUploadService.java
New file @@ -0,0 +1,108 @@ package com.ruoyi.system.file; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.InputStream; public interface IFileUploadService { /** * ä¸ä¼ æ¬å°æä»¶å°PHPæ¥å£ * * @param file è¦ä¸ä¼ çæä»¶ * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadLocalFile(File file, String targetPath); /** * ä¸ä¼ MultipartFileå°PHPæ¥å£ * * @param multipartFile è¦ä¸ä¼ çæä»¶ * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadMultipartFile(MultipartFile multipartFile, String targetPath); /** * ä¸ä¼ åèæ°ç»å°PHPæ¥å£ * * @param fileBytes æä»¶åèæ°ç» * @param fileName æä»¶å * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadBytes(byte[] fileBytes, String fileName, String targetPath); /** * ä¸ä¼ è¾å ¥æµå°PHPæ¥å£ * * @param inputStream æä»¶è¾å ¥æµ * @param fileName æä»¶å * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadInputStream(InputStream inputStream, String fileName, String targetPath); /** * ä»URLä¸è½½æä»¶å¹¶ä¸ä¼ å°PHPæ¥å£ * * @param fileUrl æä»¶URL * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadFromUrl(String fileUrl, String targetPath); /** * ä»å¾®ä¿¡APIä¸è½½æä»¶å¹¶ä¸ä¼ å°PHPæ¥å£ * * @param accessToken 微信访é®ä»¤ç * @param mediaId 微信åªä½ID * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadFromWechat(String accessToken, String mediaId, String targetPath); /** * æ£æ¥æä»¶æ¯å¦åå¨ * * @param filePath æä»¶è·¯å¾ * @return æ¯å¦åå¨ */ boolean fileExists(String filePath); /** * å 餿件 * * @param filePath æä»¶è·¯å¾ * @return æ¯å¦å 餿å */ boolean deleteFile(String filePath); /** * è·åæä»¶è®¿é®URL * * @param filePath æä»¶è·¯å¾ * @return 访é®URL */ String getFileUrl(String filePath); /** * ä¸ä¼ æ¬å°æä»¶å°PHPæ¥å£ï¼å å«ç¼©ç¥å¾çæï¼ * * @param file è¦ä¸ä¼ çæä»¶ * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadLocalFileWithThumbnail(File file, String targetPath); /** * ä¸ä¼ MultipartFileå°PHPæ¥å£ï¼å å«ç¼©ç¥å¾çæï¼ * * @param multipartFile è¦ä¸ä¼ çæä»¶ * @param targetPath ç®æ è·¯å¾ï¼ç¸å¯¹äºPHPä¸ä¼ ç®å½ï¼ * @return ä¸ä¼ ç»æ */ FileUploadResponse uploadMultipartFileWithThumbnail(MultipartFile multipartFile, String targetPath); } ruoyi-system/src/main/java/com/ruoyi/system/imagedata/IImageDataService.java
New file @@ -0,0 +1,200 @@ package com.ruoyi.system.imagedata; import com.ruoyi.system.domain.ImageData; import java.util.List; /** * å¾çæ°æ®Serviceæ¥å£ */ public interface IImageDataService { /** * æ¥è¯¢å¾çæ°æ® * * @param id å¾çæ°æ®ä¸»é® * @return å¾çæ°æ® */ public ImageData selectImageDataById(Long id); /** * æ¥è¯¢å¾çæ°æ®å表 * * @param imageData å¾çæ°æ® * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataList(ImageData imageData); /** * æ°å¢å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ public int insertImageData(ImageData imageData); /** * ä¿®æ¹å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ public int updateImageData(ImageData imageData); /** * æ¹éå é¤å¾çæ°æ® * * @param ids éè¦å é¤çå¾çæ°æ®ä¸»é®éå * @return ç»æ */ public int deleteImageDataByIds(Long[] ids); /** * å é¤å¾çæ°æ®ä¿¡æ¯ * * @param id å¾çæ°æ®ä¸»é® * @return ç»æ */ public int deleteImageDataById(Long id); /** * æ ¹æ®è°åº¦åIDæ¥è¯¢å¾çæ°æ® * * @param dOrdIDDt è°åº¦åID * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataByDOrdIDDt(Long dOrdIDDt); String generateCompatibleFilePath(Long dispatchOrdID, String mediaId, boolean isThumbnail); String generateCompatibleUrl(Long dispatchOrdID, String mediaId, boolean isThumbnail); /** * æ ¹æ®æå¡åIDæ¥è¯¢å¾çæ°æ® * * @param sOrdIDDt æå¡åID * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataBySOrdIDDt(Long sOrdIDDt); /** * æ ¹æ®å¾çç±»åæ¥è¯¢å¾çæ°æ® * * @param imageType å¾çç±»å * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataByType(Integer imageType); /** * æ è®°å¾ç为å é¤ç¶æ * * @param id å¾çæ°æ®ä¸»é® * @return ç»æ */ public int markImageDataAsDeleted(Long id); /** * 微信å¾çä¸ä¼ å¤çï¼åASP代ç 转æ¢ï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param mediaId 微信åªä½ID * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ public String uploadWxImage(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String mediaId, Integer imageType, Integer adminId); /** * ä¿å微信æä»¶å°æ¬å°ï¼åPHP代ç 转æ¢ï¼ * * @param filename æä»¶å * @param fileContent æä»¶å 容 * @return æ¯å¦ä¿åæå */ public boolean saveWeixinFile(String filename, byte[] fileContent); /** * çæç¼©ç¥å¾ï¼åPHP代ç 转æ¢ï¼ * * @param bigImgPath åå§å¤§å¾è·¯å¾ * @param width 缩ç¥å¾å®½åº¦ * @param height 缩ç¥å¾é«åº¦ï¼0è¡¨ç¤ºææ¯ä¾è®¡ç®ï¼ * @param smallImgPath 缩ç¥å¾ä¿åè·¯å¾ * @return æ¯å¦çææå */ public boolean createThumbnail(String bigImgPath, int width, int height, String smallImgPath); /** * æ£æ¥æä»¶å ¼å®¹æ§ï¼ç¡®ä¿ä¸æ§ç³»ç»å ¼å®¹ï¼ * * @param filePath æä»¶è·¯å¾ * @return å ¼å®¹æ§æ£æ¥ç»æ */ public String checkFileCompatibility(String filePath); /** * éªè¯URLæ ¼å¼æ¯å¦ä¸æ§ç³»ç»å ¼å®¹ * * @param url å¾çURL * @return æ¯å¦å ¼å®¹ */ public boolean isUrlCompatible(String url); /** * éè¿å¾çURLä¸ä¼ å¤çï¼å è®¸ç´æ¥ä¼ å ¥å¾çURLï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param thumbnailUrl 缩ç¥å¾URLï¼å¯éï¼ * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ public String uploadImageByUrl(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String imageUrl, String thumbnailUrl, Integer imageType, Integer adminId); /** * éè¿å¾çURLä¸ä¼ å¤çï¼ç®åçæ¬ï¼èªå¨çæç¼©ç¥å¾URLï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ public String uploadImageByUrlSimple(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String imageUrl, Integer imageType, Integer adminId); /** * 微信å¾çä¸ä¼ å¤çï¼å®æ´çæ¬ï¼å 嫿件ä¸è½½å缩ç¥å¾çæï¼ * * @param accessToken 微信访é®ä»¤ç * @param mediaId 微信åªä½ID * @param dispatchOrdID è°åº¦åID * @param oaid OAç¨æ·ID * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ public String uploadWxImageWithDownload(String accessToken, String mediaId, Long dispatchOrdID, Integer oaid, Integer imageType, Integer adminId); /** * æ ¹æ®è°åº¦åIDåå¾çç±»åæ¥è¯¢å¾çæ°æ® * * @param dispatchOrdID è°åº¦åID * @param imageType å¾çç±»å * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataByDOrdIDDtAndType(Long dispatchOrdID, Integer imageType); } ruoyi-system/src/main/java/com/ruoyi/system/imagedata/ImageDataServiceImpl.java
New file @@ -0,0 +1,644 @@ package com.ruoyi.system.imagedata; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.config.LegacySystemConfig; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.system.domain.ImageData; import com.ruoyi.system.domain.enums.ImageTypeEnum; import com.ruoyi.system.file.FileUploadResponse; import com.ruoyi.system.file.IFileUploadService; import com.ruoyi.system.mapper.ImageDataMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import java.util.List; @Service @DataSource(DataSourceType.SQLSERVER) public class ImageDataServiceImpl implements IImageDataService { private static final Logger log = LoggerFactory.getLogger(ImageDataServiceImpl.class); @Autowired private ImageDataMapper imageDataMapper; @Autowired private IFileUploadService fileUploadService; @Autowired private LegacySystemConfig legacyConfig; /** * æ¥è¯¢å¾çæ°æ® * * @param id å¾çæ°æ®ä¸»é® * @return å¾çæ°æ® */ @Override public ImageData selectImageDataById(Long id) { return imageDataMapper.selectImageDataById(id); } /** * æ¥è¯¢å¾çæ°æ®å表 * * @param imageData å¾çæ°æ® * @return å¾çæ°æ® */ @Override public List<ImageData> selectImageDataList(ImageData imageData) { return imageDataMapper.selectImageDataList(imageData); } /** * æ°å¢å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ @Override public int insertImageData(ImageData imageData) { return imageDataMapper.insertImageData(imageData); } /** * ä¿®æ¹å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ @Override public int updateImageData(ImageData imageData) { return imageDataMapper.updateImageData(imageData); } /** * æ¹éå é¤å¾çæ°æ® * * @param ids éè¦å é¤çå¾çæ°æ®ä¸»é® * @return ç»æ */ @Override public int deleteImageDataByIds(Long[] ids) { return imageDataMapper.deleteImageDataByIds(ids); } /** * å é¤å¾çæ°æ®ä¿¡æ¯ * * @param id å¾çæ°æ®ä¸»é® * @return ç»æ */ @Override public int deleteImageDataById(Long id) { return imageDataMapper.deleteImageDataById(id); } /** * æ ¹æ®è°åº¦åIDæ¥è¯¢å¾çæ°æ® * * @param dOrdIDDt è°åº¦åID * @return å¾çæ°æ®éå */ @Override public List<ImageData> selectImageDataByDOrdIDDt(Long dOrdIDDt) { return imageDataMapper.selectImageDataByDOrdIDDt(dOrdIDDt); } /** * çæä¸æ§ç³»ç»å ¼å®¹çæä»¶è·¯å¾ * * @param dispatchOrdID è°åº¦åID * @param mediaId åªä½ID * @param isThumbnail æ¯å¦ä¸ºç¼©ç¥å¾ * @return å ¼å®¹çæä»¶è·¯å¾ */ @Override public String generateCompatibleFilePath(Long dispatchOrdID, String mediaId, boolean isThumbnail) { try { String yearMonth = DateUtils.dateTimeNow("yyyyMM"); String fileName = dispatchOrdID + "_" + mediaId + ".jpg"; if (isThumbnail) { fileName = "s_" + fileName; } return legacyConfig.getFileServerUrl() + "/" + yearMonth + "/" + fileName; } catch (Exception e) { log.error("çæå ¼å®¹æä»¶è·¯å¾å¤±è´¥ï¼{}", e.getMessage()); return null; } } /** * çæä¸æ§ç³»ç»å ¼å®¹ç访é®URL * * @param dispatchOrdID è°åº¦åID * @param mediaId åªä½ID * @param isThumbnail æ¯å¦ä¸ºç¼©ç¥å¾ * @return å ¼å®¹ç访é®URL */ @Override public String generateCompatibleUrl(Long dispatchOrdID, String mediaId, boolean isThumbnail) { try { String yearMonth = DateUtils.dateTimeNow("yyyyMM"); String fileName = dispatchOrdID + "_" + mediaId + ".jpg"; if (isThumbnail) { fileName = "s_" + fileName; } return legacyConfig.getFileServerUrl() + "/" + yearMonth + "/" + fileName; } catch (Exception e) { log.error("çæå ¼å®¹URL失败ï¼{}", e.getMessage()); return null; } } /** * æ ¹æ®æå¡åIDæ¥è¯¢å¾çæ°æ® * * @param sOrdIDDt æå¡åID * @return å¾çæ°æ®éå */ @Override public List<ImageData> selectImageDataBySOrdIDDt(Long sOrdIDDt) { return imageDataMapper.selectImageDataBySOrdIDDt(sOrdIDDt); } /** * æ ¹æ®å¾çç±»åæ¥è¯¢å¾çæ°æ® * * @param imageType å¾çç±»å * @return å¾çæ°æ®éå */ @Override public List<ImageData> selectImageDataByType(Integer imageType) { ImageData imageData = new ImageData(); imageData.setImageType(imageType); return imageDataMapper.selectImageDataList(imageData); } /** * æ è®°å¾ç为å é¤ç¶æ * * @param id å¾çæ°æ®ä¸»é® * @return ç»æ */ @Override public int markImageDataAsDeleted(Long id) { ImageData imageData = new ImageData(); imageData.setId(id); imageData.setImageDel(1); // 1表示已å é¤ return imageDataMapper.updateImageData(imageData); } /** * 微信å¾çä¸ä¼ å¤çï¼åASP代ç 转æ¢ï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param mediaId 微信åªä½ID * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ public String uploadWxImage(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String mediaId, Integer imageType, Integer adminId) { try { // è·åå¾çç±»åæä¸¾ ImageTypeEnum imageTypeEnum = ImageTypeEnum.getByCode(imageType); // 妿æè°åº¦åIDï¼åå¤çè°åº¦åç¸å ³å¾ç 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 "åæ°é误ï¼ç¼ºå°å¿ è¦çåæ°"; } } catch (Exception e) { return "å¤ç失败ï¼" + e.getMessage(); } } /** * å¤çè°åº¦åç¸å ³å¾çä¸ä¼ */ private String processDispatchOrderImage(Long dispatchOrdID, Long serviceOrdID, String mediaId, ImageTypeEnum imageTypeEnum, Integer adminId) { try { // çæå¾çURLè·¯å¾ String imageUrl = generateImageUrl(dispatchOrdID, mediaId, false); String imageUrls = generateImageUrl(dispatchOrdID, mediaId, true); // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageTypeEnum.getCode()); imageData.setImageUrl(imageUrl); imageData.setImageUrls(imageUrls); imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // 0表示æªå é¤ // æå ¥å¾çæ°æ® int result = imageDataMapper.insertImageData(imageData); if (result <= 0) { return "å¾çæ°æ®ä¿å失败"; } return "å¾çä¸ä¼ æåï¼ID: " + imageData.getId() + "ï¼ç±»å: " + imageTypeEnum.getDescription(); } catch (Exception e) { return "å¤çè°åº¦åå¾ç失败ï¼" + e.getMessage(); } } /** * æ´æ°ç¨æ·å¤´å */ 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 */ private String generateImageUrl(Long dispatchOrdID, String mediaId, boolean isThumbnail) { Date now = new Date(); int year = now.getYear() + 1900; // Javaç年份éè¦å 1900 int month = now.getMonth() + 1; // Javaçæä»½ä»0å¼å§ String monthStr = String.format("%02d", month); String prefix = isThumbnail ? "/upload/" + year + monthStr + "/s_" : "/upload/" + year + monthStr + "/"; return prefix + dispatchOrdID + "_" + mediaId + ".jpg"; } /** * ä¿å微信æä»¶å°æ¬å°ï¼åPHP代ç 转æ¢ï¼ * * @param filename æä»¶å * @param fileContent æä»¶å 容 * @return æ¯å¦ä¿åæå */ public boolean saveWeixinFile(String filename, byte[] fileContent) { FileOutputStream localFile = null; try { // ç¡®ä¿ç®å½åå¨ File file = new File(filename); File parentDir = file.getParentFile(); if (!parentDir.exists()) { parentDir.mkdirs(); } localFile = new FileOutputStream(filename); localFile.write(fileContent); localFile.flush(); log.info("æåä¿å微信æä»¶ï¼{}", filename); return true; } catch (Exception e) { log.error("ä¿å微信æä»¶å¤±è´¥ï¼{}", e.getMessage(), e); return false; } finally { if (localFile != null) { try { localFile.close(); } catch (IOException e) { log.error("å ³éæä»¶æµå¤±è´¥ï¼{}", e.getMessage()); } } } } /** * çæç¼©ç¥å¾ï¼åPHP代ç 转æ¢ï¼ * * @param bigImgPath åå§å¤§å¾è·¯å¾ * @param width 缩ç¥å¾å®½åº¦ * @param height 缩ç¥å¾é«åº¦ï¼0è¡¨ç¤ºææ¯ä¾è®¡ç®ï¼ * @param smallImgPath 缩ç¥å¾ä¿åè·¯å¾ * @return æ¯å¦çææå */ public boolean createThumbnail(String bigImgPath, int width, int height, String smallImgPath) { try { // 读ååå§å¾ç BufferedImage originalImage = ImageIO.read(new File(bigImgPath)); if (originalImage == null) { log.error("æ æ³è¯»ååå§å¾çï¼{}", bigImgPath); return false; } int srcWidth = originalImage.getWidth(); int srcHeight = originalImage.getHeight(); // 计ç®ç¼©ç¥å¾å°ºå¯¸ if (height == 0) { height = (int) Math.floor((double) width / srcWidth * srcHeight); } else if (width == 0) { width = (int) Math.floor((double) height / srcHeight * srcWidth); } // å建缩ç¥å¾ BufferedImage thumbnail = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = thumbnail.createGraphics(); // 设置渲æè´¨é g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // ç»å¶ç¼©ç¥å¾ g.drawImage(originalImage, 0, 0, width, height, null); g.dispose(); // ç¡®ä¿ç®å½åå¨ File smallImgFile = new File(smallImgPath); File parentDir = smallImgFile.getParentFile(); if (!parentDir.exists()) { parentDir.mkdirs(); } // ä¿å缩ç¥å¾ ImageIO.write(thumbnail, "jpg", smallImgFile); log.info("æåçæç¼©ç¥å¾ï¼{} -> {} ({}x{})", bigImgPath, smallImgPath, width, height); return true; } catch (Exception e) { log.error("çæç¼©ç¥å¾å¤±è´¥ï¼{}", e.getMessage(), e); return false; } } /** * å¤çè°åº¦åç¸å ³å¾çä¸ä¼ ï¼å 嫿件URLï¼ */ private String processDispatchOrderImageWithFiles(Long dispatchOrdID, Long serviceOrdID, String mediaId, ImageTypeEnum imageTypeEnum, Integer adminId, String originalImageUrl, String thumbnailUrl) { try { // å建å¾çæ°æ®å¯¹è±¡ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setSOrdIDDt(serviceOrdID); imageData.setImageType(imageTypeEnum.getCode()); imageData.setImageUrl(originalImageUrl); imageData.setImageUrls(thumbnailUrl); imageData.setUpImageTime(new Date()); imageData.setUpImageOAid(adminId); imageData.setImageDel(0); // 0表示æªå é¤ // æå ¥å¾çæ°æ® int result = imageDataMapper.insertImageData(imageData); if (result <= 0) { return "å¾çæ°æ®ä¿å失败"; } return "å¾çä¸ä¼ æåï¼ID: " + imageData.getId() + "ï¼ç±»å: " + imageTypeEnum.getDescription() + "ï¼åå§å¾çURL: " + originalImageUrl + "ï¼ç¼©ç¥å¾URL: " + thumbnailUrl; } catch (Exception e) { return "å¤çè°åº¦åå¾ç失败ï¼" + e.getMessage(); } } /** * æ´æ°ç¨æ·å¤´åï¼å 嫿件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(); } } /** * æ£æ¥æä»¶å ¼å®¹æ§ï¼ç¡®ä¿ä¸æ§ç³»ç»å ¼å®¹ï¼ * * @param filePath æä»¶è·¯å¾ * @return å ¼å®¹æ§æ£æ¥ç»æ */ public String checkFileCompatibility(String filePath) { try { File file = new File(filePath); if (!file.exists()) { return "æä»¶ä¸åå¨ï¼" + filePath; } // æ£æ¥æä»¶å½åæ¯å¦ç¬¦åæ§ç³»ç»è§è String fileName = file.getName(); if (!fileName.matches("^(\\d+|[A-Z]+)_[A-Za-z0-9_]+\\.jpg$")) { return "æä»¶å½åä¸ç¬¦åæ§ç³»ç»è§èï¼" + fileName; } // æ£æ¥ç®å½ç»ææ¯å¦ç¬¦åæ§ç³»ç»è§è String parentDir = file.getParentFile().getName(); if (!parentDir.matches("^\\d{6}$")) { // å¹´ææ ¼å¼ï¼202412 return "ç®å½ç»æä¸ç¬¦åæ§ç³»ç»è§èï¼" + parentDir; } return "æä»¶å ¼å®¹æ§æ£æ¥éè¿ï¼" + filePath; } catch (Exception e) { return "å ¼å®¹æ§æ£æ¥å¤±è´¥ï¼" + e.getMessage(); } } /** * éªè¯URLæ ¼å¼æ¯å¦ä¸æ§ç³»ç»å ¼å®¹ * * @param url å¾çURL * @return æ¯å¦å ¼å®¹ */ public boolean isUrlCompatible(String url) { try { // æ£æ¥URLæ ¼å¼æ¯å¦ç¬¦åæ§ç³»ç»è§è // æ§ç³»ç»æ ¼å¼ï¼/upload/å¹´æ/æä»¶å.jpg return url.matches("^/upload/\\d{6}/[A-Za-z0-9_]+\\.jpg$"); } catch (Exception e) { log.error("URLå ¼å®¹æ§æ£æ¥å¤±è´¥ï¼{}", e.getMessage()); return false; } } /** * éè¿å¾çURLä¸ä¼ å¤çï¼å è®¸ç´æ¥ä¼ å ¥å¾çURLï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param thumbnailUrl 缩ç¥å¾URLï¼å¯éï¼ * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ @Override public String uploadImageByUrl(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String imageUrl, String thumbnailUrl, Integer imageType, Integer adminId) { try { // éªè¯åæ° if (imageUrl == null || imageUrl.trim().isEmpty()) { return "å¾çURLä¸è½ä¸ºç©º"; } // å¤çä¸å¡é»è¾ if (dispatchOrdID != null && dispatchOrdID > 0) { // è°åº¦åç¸å ³å¾ç 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ï¼"; } } catch (Exception e) { log.error("éè¿URLä¸ä¼ å¾ç失败ï¼{}", e.getMessage(), e); return "å¤ç失败ï¼" + e.getMessage(); } } /** * éè¿å¾çURLä¸ä¼ å¤çï¼ç®åçæ¬ï¼èªå¨çæç¼©ç¥å¾URLï¼ * * @param dispatchOrdID è°åº¦åID * @param serviceOrdID æå¡åID * @param oaid OAç¨æ·ID * @param imageUrl å¾çURL * @param imageType å¾çç±»å * @param adminId å½å管çåID * @return å¤çç»æ */ @Override public String uploadImageByUrlSimple(Long dispatchOrdID, Long serviceOrdID, Integer oaid, String imageUrl, Integer imageType, Integer adminId) { try { // éªè¯åæ° if (imageUrl == null || imageUrl.trim().isEmpty()) { return "å¾çURLä¸è½ä¸ºç©º"; } // èªå¨çæç¼©ç¥å¾URLï¼å¦æåå¾URLå 嫿件åï¼ String thumbnailUrl = null; if (imageUrl.contains("/")) { String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1); if (fileName.contains(".")) { String nameWithoutExt = fileName.substring(0, fileName.lastIndexOf(".")); String extension = fileName.substring(fileName.lastIndexOf(".")); String thumbnailFileName = "s_" + nameWithoutExt + extension; thumbnailUrl = imageUrl.substring(0, imageUrl.lastIndexOf("/") + 1) + thumbnailFileName; } } // è°ç¨å®æ´çæ¬çæ¹æ³ return uploadImageByUrl(dispatchOrdID, serviceOrdID, oaid, imageUrl, thumbnailUrl, imageType, adminId); } catch (Exception e) { log.error("éè¿URLä¸ä¼ å¾çï¼ç®åçï¼å¤±è´¥ï¼{}", e.getMessage(), e); return "å¤ç失败ï¼" + e.getMessage(); } } @Override public String uploadWxImageWithDownload(String accessToken, String mediaId, Long dispatchOrdID, Integer oaid, Integer imageType, Integer adminId) { try { // ç¡®å®ç®æ è·¯å¾ String targetPath; if (dispatchOrdID != null && dispatchOrdID > 0) { // è°åº¦åç¸å ³å¾çï¼æå¹´æç»ç»ç®å½ String yearMonth = DateUtils.dateTimeNow("yyyyMM"); targetPath = yearMonth + "/" + dispatchOrdID; } else if (oaid != null && oaid > 0) { // OAç¨æ·å¤´å targetPath = "avatar/" + oaid; } else { return "åæ°é误ï¼ç¼ºå°å¿ è¦çåæ°"; } // ä½¿ç¨æä»¶ä¸ä¼ æå¡ä»å¾®ä¿¡ä¸è½½å¹¶ä¸ä¼ æä»¶ FileUploadResponse uploadResponse = fileUploadService.uploadFromWechat(accessToken, mediaId, targetPath); if (!uploadResponse.isSuccess()) { return "æä»¶ä¸ä¼ 失败ï¼" + uploadResponse.getMessage(); } // è·åä¸ä¼ åçæä»¶è·¯å¾ String originalImageUrl = uploadResponse.getFilePath(); String thumbnailUrl = uploadResponse.getThumbnailPath(); // å¤çä¸å¡é»è¾ 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; } catch (Exception e) { log.error("微信å¾çä¸ä¼ å¤ç失败ï¼{}", e.getMessage(), e); return "å¤ç失败ï¼" + e.getMessage(); } } /** * æ ¹æ®è°åº¦åIDåå¾çç±»åæ¥è¯¢å¾çæ°æ® * * @param dispatchOrdID è°åº¦åID * @param imageType å¾çç±»å * @return å¾çæ°æ®éå */ @Override public List<ImageData> selectImageDataByDOrdIDDtAndType(Long dispatchOrdID, Integer imageType) { // å建æ¥è¯¢æ¡ä»¶ ImageData imageData = new ImageData(); imageData.setDOrdIDDt(dispatchOrdID); imageData.setImageType(imageType); // æ¥è¯¢å¾çæ°æ® return imageDataMapper.selectImageDataList(imageData); } } ruoyi-system/src/main/java/com/ruoyi/system/imagedata/WxImageUploadRequest.java
New file @@ -0,0 +1,30 @@ package com.ruoyi.system.imagedata; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** * 微信å¾çä¸ä¼ 请æ±DTO */ @Data public class WxImageUploadRequest { @JsonProperty("access_token") private String accessToken; @JsonProperty("DispatchOrdID") private Long dispatchOrdID; @JsonProperty("ServiceOrdID") private Long serviceOrdID; @JsonProperty("OAID") private Integer oaid; @JsonProperty("media_id") private String mediaId; @JsonProperty("ImageType") private Integer imageType; } ruoyi-system/src/main/java/com/ruoyi/system/mapper/ImageDataMapper.java
New file @@ -0,0 +1,78 @@ package com.ruoyi.system.mapper; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.system.domain.ImageData; import java.util.List; /** * å¾çæ°æ®Mapperæ¥å£ */ @DataSource(DataSourceType.SQLSERVER) public interface ImageDataMapper { /** * æ¥è¯¢å¾çæ°æ® * * @param id å¾çæ°æ®ä¸»é® * @return å¾çæ°æ® */ public ImageData selectImageDataById(Long id); /** * æ¥è¯¢å¾çæ°æ®å表 * * @param imageData å¾çæ°æ® * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataList(ImageData imageData); /** * æ°å¢å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ public int insertImageData(ImageData imageData); /** * ä¿®æ¹å¾çæ°æ® * * @param imageData å¾çæ°æ® * @return ç»æ */ public int updateImageData(ImageData imageData); /** * å é¤å¾çæ°æ® * * @param id å¾çæ°æ®ä¸»é® * @return ç»æ */ public int deleteImageDataById(Long id); /** * æ¹éå é¤å¾çæ°æ® * * @param ids éè¦å é¤çæ°æ®ä¸»é®éå * @return ç»æ */ public int deleteImageDataByIds(Long[] ids); /** * æ ¹æ®è°åº¦åIDæ¥è¯¢å¾çæ°æ® * * @param dOrdIDDt è°åº¦åID * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataByDOrdIDDt(Long dOrdIDDt); /** * æ ¹æ®æå¡åIDæ¥è¯¢å¾çæ°æ® * * @param sOrdIDDt æå¡åID * @return å¾çæ°æ®éå */ public List<ImageData> selectImageDataBySOrdIDDt(Long sOrdIDDt); } ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
@@ -96,9 +96,21 @@ * * @param taskId ä»»å¡ID * @param file æä»¶ * @param category éä»¶åç±» * @return ç»æ */ public int uploadAttachment(Long taskId, MultipartFile file); public int uploadAttachment(Long taskId, MultipartFile file, String category); /** * ä»å¾®ä¿¡mediaIdä¸ä¼ ä»»å¡éä»¶ * * @param taskId ä»»å¡ID * @param accessToken 微信AccessToken * @param mediaId 微信mediaId * @param category éä»¶åç±» * @return ç»æ */ public int uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category); /** * å é¤ä»»å¡éä»¶ @@ -107,6 +119,14 @@ * @return ç»æ */ public int deleteAttachment(Long attachmentId); /** * æ ¹æ®IDè·åé件详æ * * @param attachmentId éä»¶ID * @return é件详æ */ public SysTaskAttachment getAttachmentById(Long attachmentId); /** * åé 车è¾ç»ä»»å¡ ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -6,7 +6,11 @@ import java.util.ArrayList; import java.util.stream.Collectors; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.ruoyi.system.utils.TaskCodeGenerator; import org.springframework.beans.factory.annotation.Autowired; @@ -496,11 +500,12 @@ * * @param taskId ä»»å¡ID * @param file æä»¶ * @param category éä»¶åç±» * @return ç»æ */ @Override @Transactional public int uploadAttachment(Long taskId, MultipartFile file) { public int uploadAttachment(Long taskId, MultipartFile file, String category) { try { // ä¸ä¼ æä»¶ String fileName = FileUploadUtils.upload("/task", file); @@ -512,6 +517,7 @@ attachment.setFilePath(filePath); attachment.setFileSize(file.getSize()); attachment.setFileType(getFileType(file.getOriginalFilename())); attachment.setAttachmentCategory(category); attachment.setUploadTime(DateUtils.getNowDate()); attachment.setUploadBy(SecurityUtils.getUsername()); @@ -519,14 +525,112 @@ // è®°å½æä½æ¥å¿ if (result > 0) { String categoryDesc = getCategoryDesc(category); recordTaskLog(taskId, "UPDATE", "ä¸ä¼ éä»¶", null, "ä¸ä¼ æä»¶ï¼" + file.getOriginalFilename(), "ä¸ä¼ æä»¶ï¼" + file.getOriginalFilename() + "(åç±»ï¼" + categoryDesc + ")", SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } catch (IOException e) { throw new RuntimeException("æä»¶ä¸ä¼ 失败ï¼" + e.getMessage()); } } /** * ä»å¾®ä¿¡mediaIdä¸ä¼ ä»»å¡éä»¶ * * @param taskId ä»»å¡ID * @param accessToken 微信AccessToken * @param mediaId 微信mediaId * @param category éä»¶åç±» * @return ç»æ */ @Override @Transactional public int uploadAttachmentFromWechat(Long taskId, String accessToken, String mediaId, String category) { try { // ä»å¾®ä¿¡æå¡å¨ä¸è½½æä»¶ String wechatUrl = String.format( "https://api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s", accessToken, mediaId ); byte[] fileBytes = downloadFromUrl(wechatUrl); if (fileBytes == null || fileBytes.length == 0) { throw new RuntimeException("ä»å¾®ä¿¡ä¸è½½æä»¶å¤±è´¥"); } // çææä»¶åï¼ä½¿ç¨mediaIdä½ä¸ºæä»¶åçä¸é¨åï¼ String fileName = "wx_" + mediaId.substring(0, Math.min(20, mediaId.length())) + "_" + System.currentTimeMillis() + ".jpg"; // ä¿åå°æ¬å° String baseDir = FileUploadUtils.getDefaultBaseDir(); String datePath = DateUtils.datePath(); String uploadDir = baseDir + "/task/" + datePath; // å建ç®å½ File uploadPath = new File(uploadDir); if (!uploadPath.exists()) { uploadPath.mkdirs(); } // ä¿åæä»¶ String filePath = uploadDir + "/" + fileName; File file = new File(filePath); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(fileBytes); } // ä¿åéä»¶è®°å½ SysTaskAttachment attachment = new SysTaskAttachment(); attachment.setTaskId(taskId); attachment.setFileName(fileName); attachment.setFilePath(filePath); attachment.setFileSize((long) fileBytes.length); attachment.setFileType("jpg"); attachment.setAttachmentCategory(category); attachment.setUploadTime(DateUtils.getNowDate()); attachment.setUploadBy(SecurityUtils.getUsername()); int result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); // è®°å½æä½æ¥å¿ if (result > 0) { String categoryDesc = getCategoryDesc(category); recordTaskLog(taskId, "UPDATE", "ä¸ä¼ éä»¶", null, "éè¿å¾®ä¿¡ä¸ä¼ æä»¶ï¼" + fileName + "(åç±»ï¼" + categoryDesc + ")", SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } catch (Exception e) { throw new RuntimeException("ä»å¾®ä¿¡ä¸ä¼ æä»¶å¤±è´¥ï¼" + e.getMessage()); } } /** * ä» URL ä¸è½½æä»¶ */ private byte[] downloadFromUrl(String fileUrl) throws IOException { URL url = new URL(fileUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(10000); connection.setReadTimeout(30000); try (InputStream inputStream = connection.getInputStream()) { byte[] buffer = new byte[4096]; int bytesRead; java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream(); while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } return outputStream.toByteArray(); } finally { connection.disconnect(); } } @@ -561,6 +665,17 @@ } return result; } /** * æ ¹æ®IDè·åé件详æ * * @param attachmentId éä»¶ID * @return é件详æ */ @Override public SysTaskAttachment getAttachmentById(Long attachmentId) { return sysTaskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); } /** @@ -1055,4 +1170,25 @@ sysTaskWelfareMapper.insertSysTaskWelfare(welfareInfo); } /** * è·åéä»¶åç±»æè¿° * * @param category éä»¶å类代ç * @return åç±»æè¿° */ private String getCategoryDesc(String category) { if (category == null || category.isEmpty()) { return "æªåç±»"; } switch (category) { case "1": return "ç¥æ åæä¹¦"; case "2": return "ç äººèµæ"; case "3": return "æä½è®°å½"; case "4": return "åºè½¦å"; case "5": return "åºè½¦å"; case "6": return "ç³»å®å ¨å¸¦"; default: return "å ¶ä»"; } } } ruoyi-system/src/main/resources/mapper/system/ImageDataMapper.xml
New file @@ -0,0 +1,121 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.ImageDataMapper"> <resultMap type="ImageData" id="ImageDataResult"> <result property="id" column="id"/> <result property="dOrdIDDt" column="DOrdIDDt"/> <result property="sOrdIDDt" column="SOrdIDDt"/> <result property="imageType" column="ImageType"/> <result property="imageUrl" column="ImageUrl"/> <result property="imageUrls" column="ImageUrls"/> <result property="imageDeg" column="ImageDeg"/> <result property="upImageTime" column="UpImageTime"/> <result property="upImageOAid" column="UpImageOAid"/> <result property="imageDel" column="ImageDel"/> <result property="isAP" column="isAP"/> <result property="isAP_ID" column="isAP_ID"/> <result property="isAP_Time" column="isAP_Time"/> </resultMap> <sql id="selectImageDataVo"> select id, DOrdIDDt, SOrdIDDt, ImageType, ImageUrl, ImageUrls, ImageDeg, UpImageTime, UpImageOAid, ImageDel, isAP, isAP_ID, isAP_Time from ImageData </sql> <select id="selectImageDataList" parameterType="ImageData" resultMap="ImageDataResult"> <include refid="selectImageDataVo"/> <where> <if test="dOrdIDDt != null "> and DOrdIDDt = #{dOrdIDDt}</if> <if test="sOrdIDDt != null "> and SOrdIDDt = #{sOrdIDDt}</if> <if test="imageType != null "> and ImageType = #{imageType}</if> <if test="imageUrl != null and imageUrl != ''"> and ImageUrl like concat('%', #{imageUrl}, '%')</if> <if test="imageUrls != null and imageUrls != ''"> and ImageUrls like concat('%', #{imageUrls}, '%')</if> <if test="imageDeg != null "> and ImageDeg = #{imageDeg}</if> <if test="upImageTime != null "> and UpImageTime = #{upImageTime}</if> <if test="upImageOAid != null "> and UpImageOAid = #{upImageOAid}</if> <if test="imageDel != null "> and ImageDel = #{imageDel}</if> <if test="isAP != null "> and isAP = #{isAP}</if> <if test="isAP_ID != null "> and isAP_ID = #{isAP_ID}</if> <if test="isAP_Time != null "> and isAP_Time = #{isAP_Time}</if> </where> </select> <select id="selectImageDataById" parameterType="Long" resultMap="ImageDataResult"> <include refid="selectImageDataVo"/> where id = #{id} </select> <select id="selectImageDataByDOrdIDDt" parameterType="Long" resultMap="ImageDataResult"> <include refid="selectImageDataVo"/> where DOrdIDDt = #{dOrdIDDt} </select> <select id="selectImageDataBySOrdIDDt" parameterType="Long" resultMap="ImageDataResult"> <include refid="selectImageDataVo"/> where SOrdIDDt = #{sOrdIDDt} </select> <insert id="insertImageData" parameterType="ImageData" useGeneratedKeys="true" keyProperty="id"> insert into ImageData <trim prefix="(" suffix=")" suffixOverrides=","> <if test="dOrdIDDt != null">DOrdIDDt,</if> <if test="sOrdIDDt != null">SOrdIDDt,</if> <if test="imageType != null">ImageType,</if> <if test="imageUrl != null">ImageUrl,</if> <if test="imageUrls != null">ImageUrls,</if> <if test="imageDeg != null">ImageDeg,</if> <if test="upImageTime != null">UpImageTime,</if> <if test="upImageOAid != null">UpImageOAid,</if> <if test="imageDel != null">ImageDel,</if> <if test="isAP != null">isAP,</if> <if test="isAP_ID != null">isAP_ID,</if> <if test="isAP_Time != null">isAP_Time,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="dOrdIDDt != null">#{dOrdIDDt},</if> <if test="sOrdIDDt != null">#{sOrdIDDt},</if> <if test="imageType != null">#{imageType},</if> <if test="imageUrl != null">#{imageUrl},</if> <if test="imageUrls != null">#{imageUrls},</if> <if test="imageDeg != null">#{imageDeg},</if> <if test="upImageTime != null">#{upImageTime},</if> <if test="upImageOAid != null">#{upImageOAid},</if> <if test="imageDel != null">#{imageDel},</if> <if test="isAP != null">#{isAP},</if> <if test="isAP_ID != null">#{isAP_ID},</if> <if test="isAP_Time != null">#{isAP_Time},</if> </trim> </insert> <update id="updateImageData" parameterType="ImageData"> update ImageData <trim prefix="SET" suffixOverrides=","> <if test="dOrdIDDt != null">DOrdIDDt = #{dOrdIDDt},</if> <if test="sOrdIDDt != null">SOrdIDDt = #{sOrdIDDt},</if> <if test="imageType != null">ImageType = #{imageType},</if> <if test="imageUrl != null">ImageUrl = #{imageUrl},</if> <if test="imageUrls != null">ImageUrls = #{imageUrls},</if> <if test="imageDeg != null">ImageDeg = #{imageDeg},</if> <if test="upImageTime != null">UpImageTime = #{upImageTime},</if> <if test="upImageOAid != null">UpImageOAid = #{upImageOAid},</if> <if test="imageDel != null">ImageDel = #{imageDel},</if> <if test="isAP != null">isAP = #{isAP},</if> <if test="isAP_ID != null">isAP_ID = #{isAP_ID},</if> <if test="isAP_Time != null">isAP_Time = #{isAP_Time},</if> </trim> where id = #{id} </update> <delete id="deleteImageDataById" parameterType="Long"> delete from ImageData where id = #{id} </delete> <delete id="deleteImageDataByIds" parameterType="String"> delete from ImageData where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </delete> </mapper> ruoyi-system/src/main/resources/mapper/system/SysTaskAttachmentMapper.xml
@@ -11,12 +11,13 @@ <result property="filePath" column="file_path" /> <result property="fileSize" column="file_size" /> <result property="fileType" column="file_type" /> <result property="attachmentCategory" column="attachment_category" /> <result property="uploadTime" column="upload_time" /> <result property="uploadBy" column="upload_by" /> </resultMap> <sql id="selectSysTaskAttachmentVo"> select attachment_id, task_id, file_name, file_path, file_size, file_type, upload_time, upload_by select attachment_id, task_id, file_name, file_path, file_size, file_type, attachment_category, upload_time, upload_by from sys_task_attachment </sql> @@ -26,6 +27,7 @@ <if test="taskId != null "> and task_id = #{taskId}</if> <if test="fileName != null and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if> <if test="fileType != null and fileType != ''"> and file_type = #{fileType}</if> <if test="attachmentCategory != null and attachmentCategory != ''"> and attachment_category = #{attachmentCategory}</if> <if test="uploadBy != null and uploadBy != ''"> and upload_by like concat('%', #{uploadBy}, '%')</if> </where> order by upload_time desc @@ -50,6 +52,7 @@ <if test="filePath != null and filePath != ''">file_path,</if> <if test="fileSize != null">file_size,</if> <if test="fileType != null">file_type,</if> <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> </trim> @@ -59,6 +62,7 @@ <if test="filePath != null and filePath != ''">#{filePath},</if> <if test="fileSize != null">#{fileSize},</if> <if test="fileType != null">#{fileType},</if> <if test="attachmentCategory != null and attachmentCategory != ''">#{attachmentCategory},</if> <if test="uploadTime != null">#{uploadTime},</if> <if test="uploadBy != null and uploadBy != ''">#{uploadBy},</if> </trim> @@ -72,6 +76,7 @@ <if test="filePath != null and filePath != ''">file_path = #{filePath},</if> <if test="fileSize != null">file_size = #{fileSize},</if> <if test="fileType != null">file_type = #{fileType},</if> <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> </trim> sql/update_attachment_category.sql
New file @@ -0,0 +1,8 @@ -- 为é件表添å éä»¶åç±»åæ®µ -- ---------------------------- ALTER TABLE sys_task_attachment ADD COLUMN attachment_category VARCHAR(20) COMMENT 'éä»¶åç±»ï¼1-ç¥æ åæä¹¦ï¼2-ç äººèµæï¼3-æä½è®°å½ï¼4-åºè½¦åï¼5-åºè½¦åï¼6-ç³»å®å ¨å¸¦' AFTER file_type; -- æ·»å ç´¢å¼ ALTER TABLE sys_task_attachment ADD INDEX idx_attachment_category (attachment_category);