Merge branch 'master' into pim_meet
 
	
	
	
	
	
	
	
	
	
	
	
	
	
 |  |  | 
 |  |  | import com.ruoyi.account.dto.AccountDto2; | 
 |  |  | import com.ruoyi.account.dto.AccountDto3; | 
 |  |  | import com.ruoyi.account.pojo.AccountExpense; | 
 |  |  | import com.ruoyi.account.pojo.AccountIncome; | 
 |  |  | import com.ruoyi.dto.DateQueryDto; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | 
 |  |  |     List<AccountDto3> reportExpense(); | 
 |  |  |  | 
 |  |  |     Map<String,List<String>> analysis(); | 
 |  |  |  | 
 |  |  |     AccountExpense getByInvoiceNumber(String purchaseContractNumber); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome); | 
 |  |  |  | 
 |  |  |     List<AccountDto3> reportIncome(); | 
 |  |  |  | 
 |  |  |     AccountIncome getByInvoiceNumber(String purchaseContractNumber); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public AccountExpense getByInvoiceNumber(String purchaseContractNumber) { | 
 |  |  |         return accountExpenseMapper.selectOne(Wrappers.<AccountExpense>lambdaQuery() | 
 |  |  |                 .eq(AccountExpense::getInvoiceNumber, purchaseContractNumber)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | package com.ruoyi.account.service.impl; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | 
 |  |  |         } | 
 |  |  |         return accountDto3s; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public AccountIncome getByInvoiceNumber(String purchaseContractNumber) { | 
 |  |  |         AccountIncome accountIncome = accountIncomeMapper.selectOne(new LambdaQueryWrapper<AccountIncome>() | 
 |  |  |                 .eq(AccountIncome::getInvoiceNumber, purchaseContractNumber)); | 
 |  |  |         return accountIncome; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | @Data | 
 |  |  | public class StorageBlobDTO extends StorageBlob { | 
 |  |  |     private String url; | 
 |  |  |  | 
 |  |  |     private String downloadUrl; | 
 |  |  | } | 
 
 |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.basic.pojo.StorageAttachment; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * <p> | 
 |  |  | 
 |  |  |  * @author ruoyi | 
 |  |  |  * @since 2025-05-29 | 
 |  |  |  */ | 
 |  |  | @Mapper | 
 |  |  | public interface StorageAttachmentMapper extends BaseMapper<StorageAttachment> { | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Date updateTime; | 
 |  |  |  | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * é»è¾å é¤ | 
 |  |  |      */ | 
 |  |  | 
 |  |  |     @TableField(value = "storage_blob_id") | 
 |  |  |     private Long storageBlobId; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     private StorageBlobDTO storageBlobDTO; | 
 |  |  |  | 
 |  |  |     public StorageAttachment(String fileType, Long recordType, Long recordId) { | 
 
 |  |  | 
 |  |  | package com.ruoyi.basic.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.IdType; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableField; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableId; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     /** å建æ¶é´ */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  | //    @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Date createTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * èµæºid | 
 |  |  |      */ | 
 |  |  |     @TableField(value = "key") | 
 |  |  |     private String key; | 
 |  |  |     @TableField(value = "resource_key") | 
 |  |  |     private String resourceKey; | 
 |  |  |     /** | 
 |  |  |      * èµæºç±»åï¼ä¾å¦JPGå¾ççèµæºç±»å为image/jpg | 
 |  |  |      */ | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @TableField(value = "byte_size") | 
 |  |  |     private Long byteSize; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 0ç产å 1ç产å 2ç产é®é¢ | 
 |  |  |      */ | 
 |  |  |     @TableField(value = "type") | 
 |  |  |     private Long type; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建该记å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½å建æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  | } | 
 
 |  |  | 
 |  |  |      */ | 
 |  |  |     public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType); | 
 |  |  |  | 
 |  |  |     public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å é¤éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ | 
 |  |  |      * @param storageAttachment æä»¶ä¿¡æ¯ | 
 
 |  |  | 
 |  |  |      */ | 
 |  |  |     List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName); | 
 |  |  |  | 
 |  |  |     List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¹éå é¤æä»¶ | 
 |  |  |      * @param attachment | 
 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType) { | 
 |  |  |         // å é¤æ§å¾ | 
 |  |  |         deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId)); | 
 |  |  |         for (StorageAttachment attachment : attachments) { | 
 |  |  |             // è·åå
³èè®°å½ | 
 |  |  |             StorageBlob storageBlob = attachment.getStorageBlobDTO(); | 
 |  |  |             attachment.setName(fileType); | 
 |  |  |             attachment.setRecordType((long) recordType.ordinal()); | 
 |  |  |             attachment.setRecordId(recordId); | 
 |  |  |             attachment.setStorageBlobId(storageBlob.getId()); | 
 |  |  |             storageAttachmentMapper.insert(attachment); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int deleteStorageAttachment(StorageAttachment storageAttachment) { | 
 |  |  |         // å
å é¤æç»è¡¨ | 
 |  |  |         storageBlobService.deleteStorageBlobs(storageAttachment); | 
 
 |  |  | 
 |  |  | import com.ruoyi.basic.pojo.StorageAttachment; | 
 |  |  | import com.ruoyi.basic.pojo.StorageBlob; | 
 |  |  | import com.ruoyi.basic.service.StorageBlobService; | 
 |  |  | import com.ruoyi.common.exception.base.BaseException; | 
 |  |  | import com.ruoyi.common.exception.file.InvalidExtensionException; | 
 |  |  | import com.ruoyi.common.utils.DateUtils; | 
 |  |  | import com.ruoyi.common.utils.MinioUtils; | 
 |  |  | 
 |  |  | import com.ruoyi.common.utils.uuid.IdUtils; | 
 |  |  | import com.ruoyi.framework.web.domain.MinioResult; | 
 |  |  | import lombok.RequiredArgsConstructor; | 
 |  |  | import org.apache.commons.io.FilenameUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  | import org.springframework.web.multipart.MultipartFile; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | 
 |  |  |                 dto.setBucketFilename(res.getBucketFileName()); | 
 |  |  |                 dto.setOriginalFilename(res.getOriginalName()); | 
 |  |  |                 dto.setByteSize(file.getSize()); | 
 |  |  |                 dto.setKey(IdUtils.simpleUUID()); | 
 |  |  |                 dto.setResourceKey(IdUtils.simpleUUID()); | 
 |  |  |                 dto.setBucketName(bucketName); | 
 |  |  |                 dto.setCreateTime(DateUtils.getNowDate()); | 
 |  |  |                 dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); | 
 |  |  |                 // æå
¥æ°æ®åº | 
 |  |  |                 storageBlobMapper.insert(dto); | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName, Long type) { | 
 |  |  |  | 
 |  |  |         // è¥æ²¡ä¼ å
¥bucketNameï¼å使ç¨é»è®¤bucketName | 
 |  |  |         if (StringUtils.isEmpty(bucketName)) { | 
 |  |  |             bucketName = minioUtils.getDefaultBucket(); | 
 |  |  |         } | 
 |  |  |         List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>(); | 
 |  |  |         for (MultipartFile file : files) { | 
 |  |  |             try { | 
 |  |  |                 validateFileExtension(file); | 
 |  |  |  | 
 |  |  |                 MinioResult res = minioUtils.upload(bucketName, file, false); | 
 |  |  |  | 
 |  |  |                 StorageBlobDTO dto = buildStorageBlobDTO(file, res, bucketName, type); | 
 |  |  |  | 
 |  |  |                 storageBlobMapper.insert(dto); | 
 |  |  |                 storageBlobDTOs.add(dto); | 
 |  |  |  | 
 |  |  |             } catch (InvalidExtensionException e) { | 
 |  |  |                 throw new RuntimeException("䏿¯æçæä»¶ç±»åï¼" + file.getOriginalFilename(), e); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 throw new RuntimeException("ä¸ä¼ æä»¶å¤±è´¥ï¼" + file.getOriginalFilename(), e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return storageBlobDTOs; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private StorageBlobDTO buildStorageBlobDTO(MultipartFile file, MinioResult res, String bucketName, Long type) { | 
 |  |  |         StorageBlobDTO dto = new StorageBlobDTO(); | 
 |  |  |         dto.setContentType(file.getContentType()); | 
 |  |  |         dto.setBucketFilename(res.getBucketFileName()); | 
 |  |  |         dto.setOriginalFilename(res.getOriginalName()); | 
 |  |  |         dto.setByteSize(file.getSize()); | 
 |  |  |         dto.setResourceKey(IdUtils.simpleUUID()); | 
 |  |  |         dto.setBucketName(bucketName); | 
 |  |  |         dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); | 
 |  |  |         dto.setDownloadUrl(minioUtils.getDownloadUrl(res.getBucketFileName(), bucketName)); | 
 |  |  |  | 
 |  |  |         if (type != null) { | 
 |  |  |             dto.setType(type); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return dto; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void validateFileExtension(MultipartFile file) throws InvalidExtensionException { | 
 |  |  |         String filename = file.getOriginalFilename(); | 
 |  |  |         String extension = FilenameUtils.getExtension(filename).toLowerCase(); | 
 |  |  |         List<String> allowedExtensions = Arrays.asList( | 
 |  |  |                 // å¾ç | 
 |  |  |                 "jpg", "jpeg", "png", "gif", "bmp", "webp", "tiff", "ico", "svg", | 
 |  |  |  | 
 |  |  |                 // ææ¡£ | 
 |  |  |                 "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "rtf", "md", "csv", "odt", | 
 |  |  |  | 
 |  |  |                 // è§é¢ | 
 |  |  |                 "mp4", "mov", "avi", "wmv", "flv", "mkv", "webm", "mpeg", "3gp", "MOV", | 
 |  |  |  | 
 |  |  |                 // é³é¢ | 
 |  |  |                 "mp3", "wav", "ogg", "aac", "flac", "m4a", "wma", "amr", | 
 |  |  |  | 
 |  |  |                 // å缩å
 | 
 |  |  |                 "zip", "rar", "7z", "tar", "gz", "bz2", "xz", | 
 |  |  |  | 
 |  |  |                 // ç¼ç¨ä»£ç æä»¶ | 
 |  |  |                 "java", "py", "js", "ts", "html", "css", "cpp", "c", "cs", "json", "xml", "sql", "yaml", "yml", "sh", "bat", | 
 |  |  |  | 
 |  |  |                 // å®è£
ç¨åº & äºè¿å¶ | 
 |  |  |                 "exe", "apk", "dmg", "msi", "bin", "iso", | 
 |  |  |  | 
 |  |  |                 // è®¾è®¡ç±» | 
 |  |  |                 "psd", "ai", "xd", "sketch", "fig" | 
 |  |  |         ); | 
 |  |  |  | 
 |  |  |         if (!allowedExtensions.contains(extension)) { | 
 |  |  |             throw new BaseException("æä»¶ç±»åä¸è¢«å
许ï¼" + extension); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int deleteStorageBlobs(StorageAttachment attachment) { | 
 |  |  |         List<StorageAttachment> attachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() | 
 |  |  |                 .eq(StorageAttachment::getRecordId, attachment.getRecordId()) | 
 |  |  |                 .eq(StorageAttachment::getRecordType, attachment.getRecordType()) | 
 |  |  |                 .eq(StorageAttachment::getName, attachment.getName())); | 
 |  |  |         List<Long> ids = attachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); | 
 |  |  |         if(CollectionUtils.isEmpty(ids)){ | 
 |  |  |             return 0; | 
 |  |  |         } | 
 |  |  |         List<StorageBlob> storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>() | 
 |  |  |                 .in(StorageBlob::getId, ids)); | 
 |  |  |         if (!storageBlobs.isEmpty()) { | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO; | 
 |  |  | import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal; | 
 |  |  | import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.util.CollectionUtils; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/staffContactsPersonal") | 
 |  |  | @AllArgsConstructor | 
 |  |  | public class StaffContactsPersonalController { | 
 |  |  |     @Autowired | 
 |  |  |     private StaffContactsPersonalService staffContactsPersonalService; | 
 |  |  |     @GetMapping("/getList") | 
 |  |  |     @ApiOperation("å页æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO ){ | 
 |  |  |         return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("æ°å¢") | 
 |  |  |     public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal){ | 
 |  |  |         return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/delete/{id}") | 
 |  |  |     @ApiOperation("å é¤") | 
 |  |  |     public AjaxResult delete(@PathVariable("id") Long id){ | 
 |  |  | //        if (CollectionUtils.isEmpty(id)) { | 
 |  |  | //            throw new RuntimeException("请传å
¥è¦å é¤çID"); | 
 |  |  | //        } | 
 |  |  |         return AjaxResult.success(staffContactsPersonalService.removeById(id)); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class StaffContactsPersonalDTO extends StaffContactsPersonal { | 
 |  |  |     private String staffNo; | 
 |  |  |     private String staffName; | 
 |  |  |     private String sex; | 
 |  |  |     private String postJob; | 
 |  |  |     private String adress; | 
 |  |  |     private String profession; | 
 |  |  |     private String identityCard; | 
 |  |  |     private String phone; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO; | 
 |  |  | import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | public interface StaffContactsPersonalMapper extends BaseMapper<StaffContactsPersonal> { | 
 |  |  |     IPage listPage(Page page,@Param("staffContactsPersonalDTO") StaffContactsPersonalDTO staffContactsPersonalDTO); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     @TableField(value = "tags",typeHandler = ListToStringTypeHandler.class,jdbcType = JdbcType.VARCHAR) | 
 |  |  |     private List<String> tags; | 
 |  |  |     /** | 
 |  |  |      * å建è
 | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å建æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹äºº | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | @TableName("staff_contacts_personal") | 
 |  |  | @Data | 
 |  |  | public class StaffContactsPersonal { | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  | //    /** | 
 |  |  | //     * ç¨æ·IDï¼æå±è
ï¼ | 
 |  |  | //     */ | 
 |  |  | //    @ApiModelProperty("ç¨æ·IDï¼æå±è
ï¼") | 
 |  |  | //    private Integer userId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åå·¥ID | 
 |  |  |      */ | 
 |  |  |     @ApiModelProperty("åå·¥ID") | 
 |  |  |     private Integer contactId; | 
 |  |  |     /** | 
 |  |  |      * å建è
 | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å建æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO; | 
 |  |  | import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal; | 
 |  |  |  | 
 |  |  | public interface StaffContactsPersonalService extends IService<StaffContactsPersonal> { | 
 |  |  |     IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.collaborativeApproval.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO; | 
 |  |  | import com.ruoyi.collaborativeApproval.mapper.StaffContactsPersonalMapper; | 
 |  |  | import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal; | 
 |  |  | import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | public class StaffContactsPersonalServiceImpl extends ServiceImpl<StaffContactsPersonalMapper, StaffContactsPersonal> implements StaffContactsPersonalService { | 
 |  |  |     @Autowired | 
 |  |  |     private StaffContactsPersonalMapper staffContactsPersonalMapper; | 
 |  |  |     @Override | 
 |  |  |     public IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO) { | 
 |  |  |         return staffContactsPersonalMapper.listPage(page, staffContactsPersonalDTO); | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | @AllArgsConstructor | 
 |  |  | public enum StorageAttachmentRecordType { | 
 |  |  |     // ä¾å å®é
å¼å请å é¤ | 
 |  |  |     Template("Template","èä¾"); | 
 |  |  |     Template("Template","èä¾"), | 
 |  |  |     Archives("Archives","ææ¡£ç®¡ç"), | 
 |  |  |     InspectionTasks("InspectionTasks","ç产巡æ£"), | 
 |  |  |     QrCodeScanRecords("QrCodeScanRecords","äºç»´ç æ«ç è®°å½æä»¶"); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private final String code; | 
 
 |  |  | 
 |  |  | import javax.servlet.ServletOutputStream; | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.io.InputStream; | 
 |  |  | import java.net.URLEncoder; | 
 |  |  | import java.nio.charset.StandardCharsets; | 
 |  |  | import java.text.SimpleDateFormat; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Collections; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.concurrent.TimeUnit; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * çæé¢è§URL | 
 |  |  |      * @param bucketFilename æä»¶å¨MinIOä¸çå¯ä¸æ è¯ | 
 |  |  |      * @param bucketName å卿¡¶åç§° | 
 |  |  |      * @param useDefaultExpiry æ¯å¦ä½¿ç¨é»è®¤è¿ææ¶é´ï¼true=使ç¨é»è®¤è¿ææ¶é´ï¼false=æ°¸ä¹
ææï¼ | 
 |  |  |      * @return é¢è§URL | 
 |  |  |      */ | 
 |  |  |     public String getPreviewUrls(String bucketFilename, String bucketName, boolean useDefaultExpiry) { | 
 |  |  |         if (StringUtils.isBlank(bucketFilename)) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             // éªè¯æä»¶å卿§ | 
 |  |  |             minioClient.statObject(StatObjectArgs.builder() | 
 |  |  |                     .bucket(bucketName) | 
 |  |  |                     .object(bucketFilename) | 
 |  |  |                     .build()); | 
 |  |  |  | 
 |  |  |             GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder() | 
 |  |  |                     .method(Method.GET) | 
 |  |  |                     .bucket(bucketName) | 
 |  |  |                     .object(bucketFilename); | 
 |  |  |  | 
 |  |  |             // è®¾ç½®è¿ææ¶é´ï¼useDefaultExpiry=true ä½¿ç¨é
ç½®çè¿ææ¶é´ | 
 |  |  |             if (useDefaultExpiry) { | 
 |  |  |                 builder.expiry(previewExpiry, TimeUnit.HOURS); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return minioClient.getPresignedObjectUrl(builder.build()); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             throw new UtilException("çæé¢è§URL失败: " + e.getMessage(), e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * çæä¸è½½URLï¼å¼ºå¶æµè§å¨ä¸è½½ï¼ | 
 |  |  |      * @param bucketFilename æä»¶å¨MinIOä¸çå¯ä¸æ è¯ | 
 |  |  |      * @param bucketName å卿¡¶åç§° | 
 |  |  |      * @param originalFileName åå§æä»¶åï¼ç¨äºä¸è½½æ¶æ¾ç¤ºï¼ | 
 |  |  |      * @param useDefaultExpiry æ¯å¦ä½¿ç¨é»è®¤è¿ææ¶é´ï¼true=使ç¨é»è®¤ï¼false=æ è¿ææ¶é´ï¼ | 
 |  |  |      * @return ä¸è½½URL | 
 |  |  |      */ | 
 |  |  |     public String getDownloadUrls(String bucketFilename, String bucketName, String originalFileName, boolean useDefaultExpiry) { | 
 |  |  |         if (StringUtils.isBlank(bucketFilename)) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             // éªè¯æä»¶å卿§ | 
 |  |  |             minioClient.statObject(StatObjectArgs.builder() | 
 |  |  |                     .bucket(bucketName) | 
 |  |  |                     .object(bucketFilename) | 
 |  |  |                     .build()); | 
 |  |  |  | 
 |  |  |             // æ£ç¡®ç¼ç æä»¶åï¼æ¿æ¢ + ä¸º %20 | 
 |  |  |             String encodedFileName = URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8)) | 
 |  |  |                     .replace("+", "%20"); | 
 |  |  |  | 
 |  |  |             Map<String, String> reqParams = new HashMap<>(); | 
 |  |  |             reqParams.put("response-content-disposition", | 
 |  |  |                     "attachment; filename=\"" + encodedFileName + "\""); | 
 |  |  |  | 
 |  |  |             GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder() | 
 |  |  |                     .method(Method.GET) | 
 |  |  |                     .bucket(bucketName) | 
 |  |  |                     .object(bucketFilename) | 
 |  |  |                     .extraQueryParams(reqParams); | 
 |  |  |  | 
 |  |  |             // æ ¹æ®åæ°å³å®æ¯å¦è®¾ç½®è¿ææ¶é´ | 
 |  |  |             if (useDefaultExpiry) { | 
 |  |  |                 // ä½¿ç¨é»è®¤è¿ææ¶é´ï¼ä»é
置读åï¼ | 
 |  |  |                 builder.expiry(previewExpiry, TimeUnit.HOURS); | 
 |  |  |             } else { | 
 |  |  |                 // ä¸è®¾ç½®è¿ææ¶é´ï¼MinIO é»è®¤7å¤©ï¼ | 
 |  |  |             } | 
 |  |  |             return minioClient.getPresignedObjectUrl(builder.build()); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             throw new UtilException("çæä¸è½½URL失败: " + e.getMessage(), e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public String getDownloadUrl(String bucketFileName, String bucketName) { | 
 |  |  |         if (StringUtils.isNotBlank(bucketFileName)) { | 
 |  |  |             try { | 
 |  |  |                 // æ£æ¥æä»¶æ¯å¦åå¨ | 
 |  |  |                 minioClient.statObject(StatObjectArgs.builder() | 
 |  |  |                         .bucket(bucketName) | 
 |  |  |                         .object(bucketFileName) | 
 |  |  |                         .build()); | 
 |  |  |  | 
 |  |  |                 // è®¾ç½®ååºå¤´ | 
 |  |  |                 Map<String, String> reqParams = new HashMap<>(); | 
 |  |  |                 // æååå§æä»¶åï¼å¦æå卿¶ä¿çäºåå§åç§°ï¼ | 
 |  |  |                 String originalFileName = extractOriginalFileName(bucketFileName); | 
 |  |  |                 reqParams.put("response-content-disposition", | 
 |  |  |                         "attachment; filename=\"" + URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8)) + "\""); | 
 |  |  |  | 
 |  |  |                 // æå»ºé¢ç¾åURLåæ° | 
 |  |  |                 GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder() | 
 |  |  |                         .method(Method.GET) | 
 |  |  |                         .bucket(bucketName) | 
 |  |  |                         .object(bucketFileName) | 
 |  |  |                         .expiry(previewExpiry, TimeUnit.HOURS) | 
 |  |  |                         .extraQueryParams(reqParams) | 
 |  |  |                         .build(); | 
 |  |  |  | 
 |  |  |                 return minioClient.getPresignedObjectUrl(args); | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                 throw new UtilException("MinioUtilsï¼çæä¸è½½é¾æ¥å¼å¸¸", e); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private String extractOriginalFileName(String bucketFileName) { | 
 |  |  |         // ç¤ºä¾ï¼å¦æå卿 ¼å¼ä¸º "åå§æä»¶å_UUID" | 
 |  |  |         int underscoreIndex = bucketFileName.lastIndexOf("_"); | 
 |  |  |         if (underscoreIndex > 0) { | 
 |  |  |             return bucketFileName.substring(0, underscoreIndex); | 
 |  |  |         } | 
 |  |  |         // å¦ææ²¡æç¹æ®æ ¼å¼ï¼ç´æ¥è¿å宿´æä»¶å | 
 |  |  |         return bucketFileName; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.common.utils; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import org.apache.poi.ss.formula.functions.T; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  |  | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.time.LocalTime; | 
 |  |  | import java.time.ZoneId; | 
 |  |  | import java.time.format.DateTimeFormatter; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 15:31 | 
 |  |  |  */ | 
 |  |  | public class OrderUtils { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢å½å¤©ï¼åºäºcreateTimeåæ®µï¼çè®°å½æ°é | 
 |  |  |      * @param mapper å®ä½ç±»å¯¹åºçBaseMapper | 
 |  |  |      * @param <T> å®ä½ç±»æ³å | 
 |  |  |      * @return å½å¤©è®°å½æ°é | 
 |  |  |      */ | 
 |  |  |     public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix) { | 
 |  |  |         // è·åå½å¤©å¼å§æ¶é´ï¼00:00:00ï¼ | 
 |  |  |         LocalDateTime todayStart = LocalDateTime.of( | 
 |  |  |                 LocalDateTime.now().toLocalDate(), | 
 |  |  |                 LocalTime.MIN | 
 |  |  |         ); | 
 |  |  |         // è·åå½å¤©ç»ææ¶é´ï¼23:59:59.999ï¼ | 
 |  |  |         LocalDateTime todayEnd = LocalDateTime.of( | 
 |  |  |                 LocalDateTime.now().toLocalDate(), | 
 |  |  |                 LocalTime.MAX | 
 |  |  |         ); | 
 |  |  |  | 
 |  |  |         // è½¬æ¢ä¸ºDateç±»åï¼å¦æå®ä½ç±»ä¸createTimeæ¯LocalDateTimeå¯ç´æ¥ä½¿ç¨ï¼ | 
 |  |  |         Date startDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant()); | 
 |  |  |         Date endDate = Date.from(todayEnd.atZone(ZoneId.systemDefault()).toInstant()); | 
 |  |  |  | 
 |  |  |         // æå»ºæ¥è¯¢æ¡ä»¶ | 
 |  |  |         QueryWrapper<T> queryWrapper = new QueryWrapper<>(); | 
 |  |  |         queryWrapper.ge("create_time", startDate)  // å¤§äºçäºå½å¤©å¼å§ | 
 |  |  |                 .lt("create_time", endDate);   // å°äºå½å¤©ç»æï¼é¿å
毫ç§ç²¾åº¦é®é¢ï¼ | 
 |  |  |  | 
 |  |  |         // æ§è¡æ¥è¯¢ | 
 |  |  |         Long aLong = mapper.selectCount(queryWrapper); | 
 |  |  |         // æ¼æ¥è®¢åç¼å· preFix + æ¶é´ï¼yyyyMMddï¼ + è®¢åæ°é(001) | 
 |  |  |         return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));} | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.device.dto.DeviceDefectRecordDto; | 
 |  |  | import com.ruoyi.device.dto.DeviceRepairDto; | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  | import com.ruoyi.device.pojo.DeviceLedger; | 
 |  |  | import com.ruoyi.device.pojo.DeviceRepair; | 
 |  |  | import com.ruoyi.device.service.DeviceDefectRecordService; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | @Api(tags = "设å¤ç¼ºé·è®°å½ç®¡ç") | 
 |  |  | @RequestMapping("/defect") | 
 |  |  | @RestController | 
 |  |  | public class DeviceDefectRecordController { | 
 |  |  |     @Autowired | 
 |  |  |     private DeviceDefectRecordService deviceDefectRecordService; | 
 |  |  |     @ApiModelProperty("设å¤ç¼ºé·è®°å½å表") | 
 |  |  |     @GetMapping("/page") | 
 |  |  |     public AjaxResult page(Page page , DeviceDefectRecordDto deviceDefectRecordDto) { | 
 |  |  |         return AjaxResult.success(deviceDefectRecordService.listPage(page,deviceDefectRecordDto)); | 
 |  |  |     } | 
 |  |  |     @ApiModelProperty("设å¤idæ¥è¯¢è®¾å¤ç¼ºé·è®°å½å表") | 
 |  |  |     @GetMapping("/find/{deviceLedgerId}") | 
 |  |  |     public AjaxResult find(@PathVariable Long deviceLedgerId) { | 
 |  |  |         DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto(); | 
 |  |  |         deviceDefectRecordDto.setDeviceLedgerId(deviceLedgerId); | 
 |  |  |         return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiModelProperty("æ·»å è®¾å¤ç¼ºé·è®°å½") | 
 |  |  |     public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) { | 
 |  |  |         return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord)); | 
 |  |  |     } | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiModelProperty("ä¿®æ¹è®¾å¤ç¼ºé·è®°å½") | 
 |  |  |     public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) { | 
 |  |  |         return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord)); | 
 |  |  |     } | 
 |  |  |     @DeleteMapping("/delete") | 
 |  |  |     @ApiModelProperty("å é¤è®¾å¤ç¼ºé·è®°å½") | 
 |  |  |     public AjaxResult delete(@PathVariable Long id) { | 
 |  |  |         return AjaxResult.success(deviceDefectRecordService.removeById(id)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.apache.commons.lang3.ArrayUtils; | 
 |  |  | import org.ehcache.spi.service.MaintainableService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @GetMapping("scanDevice") | 
 |  |  |     @ApiModelProperty("è·å设å¤å°è´¦") | 
 |  |  |     @ApiOperation("è·å设å¤å°è´¦") | 
 |  |  |     @Anonymous | 
 |  |  |     public AjaxResult scanDevice(Long id) { | 
 |  |  |         List<DeviceMaintenance> list = deviceMaintenanceMapper.list1(id); | 
 
 |  |  | 
 |  |  |     @PostMapping() | 
 |  |  |     @ApiModelProperty("æ·»å è®¾å¤æ¥ä¿®") | 
 |  |  |     public AjaxResult add( @RequestBody DeviceRepair deviceRepair) { | 
 |  |  |         DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId()); | 
 |  |  |         deviceRepair.setDeviceName(byId.getDeviceName()); | 
 |  |  |         deviceRepair.setDeviceModel(byId.getDeviceModel()); | 
 |  |  |         return deviceRepairService.saveDeviceRepair(deviceRepair); | 
 |  |  |     } | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class DeviceDefectRecordDto extends DeviceDefectRecord { | 
 |  |  |     @ApiModelProperty("设å¤åç§°") | 
 |  |  |     private String deviceName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("设å¤åå·") | 
 |  |  |     private String deviceModel; | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.dto.DateQueryDto; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("计åè¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate planRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("å¼å§è¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime startRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç»æè¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime endRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("è¿è¡æ¶é¿") | 
 |  |  |     private String runtimeDuration; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.device.dto.DeviceDefectRecordDto; | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | public interface DeviceDefectRecordMapper extends BaseMapper<DeviceDefectRecord> { | 
 |  |  |     IPage<DeviceDefectRecordDto> listPage(Page page,@Param("deviceDefectRecordDto") DeviceDefectRecordDto deviceDefectRecordDto); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.FieldFill; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableField; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @TableName("device_defect_record") | 
 |  |  | public class DeviceDefectRecord { | 
 |  |  |     @ApiModelProperty("设å¤ç¼ºé·è®°å½id") | 
 |  |  |     private Long id; | 
 |  |  |     @ApiModelProperty("设å¤å°è´¦id") | 
 |  |  |     private Long deviceLedgerId; | 
 |  |  |     @ApiModelProperty("ç¼ºé·æè¿°") | 
 |  |  |     private String defectDescription; | 
 |  |  |     @ApiModelProperty("ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |     @ApiModelProperty("æ¶é¤æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime eliminateTime; | 
 |  |  |     @ApiModelProperty("å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("æ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("å建人") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("æ´æ°äºº") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç§æ·id") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  | } | 
 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     /* ***************************     è¿è¡ç®¡ç        ***************************   */ | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("计åè¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate planRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("å¼å§è¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime startRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç»æè¿è¡æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime endRuntimeTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("è¿è¡æ¶é¿") | 
 |  |  |     private String runtimeDuration; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.device.dto.DeviceDefectRecordDto; | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  |  | 
 |  |  | public interface DeviceDefectRecordService extends IService<DeviceDefectRecord> { | 
 |  |  |     IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto); | 
 |  |  |  | 
 |  |  |     boolean updateByDDR(DeviceDefectRecord deviceDefectRecord); | 
 |  |  |  | 
 |  |  |     boolean add(DeviceDefectRecord deviceDefectRecord); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.device.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.SecurityUtils; | 
 |  |  | import com.ruoyi.device.dto.DeviceDefectRecordDto; | 
 |  |  | import com.ruoyi.device.mapper.DeviceDefectRecordMapper; | 
 |  |  | import com.ruoyi.device.mapper.DeviceRepairMapper; | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  | import com.ruoyi.device.pojo.DeviceRepair; | 
 |  |  | import com.ruoyi.device.service.DeviceDefectRecordService; | 
 |  |  | import com.ruoyi.device.service.IDeviceRepairService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | @Transactional(rollbackFor = Exception.class) | 
 |  |  | public class DeviceDefectRecordServiceImpl extends ServiceImpl<DeviceDefectRecordMapper, DeviceDefectRecord> implements DeviceDefectRecordService { | 
 |  |  |     @Autowired | 
 |  |  |     private DeviceDefectRecordMapper deviceDefectRecordMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private DeviceRepairMapper deviceRepairMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto) { | 
 |  |  |         return deviceDefectRecordMapper.listPage(page, deviceDefectRecordDto); | 
 |  |  |     } | 
 |  |  |     @Override | 
 |  |  |     public boolean add(DeviceDefectRecord deviceDefectRecord) { | 
 |  |  |         String status = deviceDefectRecord.getStatus(); | 
 |  |  |         if (status.equals("严é缺é·")) { | 
 |  |  |             DeviceRepair deviceRepair = new DeviceRepair(); | 
 |  |  |             deviceRepair.setDeviceLedgerId(deviceDefectRecord.getDeviceLedgerId()); | 
 |  |  |             deviceRepair.setRemark(deviceDefectRecord.getDefectDescription()); | 
 |  |  |             //è·åå½åç»å½ç¨æ· | 
 |  |  |             deviceRepair.setRepairName(SecurityUtils.getUsername()); | 
 |  |  |             deviceRepair.setRepairTime(new Date()); | 
 |  |  |             deviceRepairMapper.insert(deviceRepair); | 
 |  |  |             return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0; | 
 |  |  |         } else if (status.equals("ä¸è¬ç¼ºé·")) { | 
 |  |  |             return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0; | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean updateByDDR(DeviceDefectRecord deviceDefectRecord) { | 
 |  |  |         String status = deviceDefectRecord.getStatus(); | 
 |  |  |         if (status.equals("严é缺é·")) { | 
 |  |  | //            deviceDefectRecord.setStatus("æ£å¸¸"); | 
 |  |  | //            deviceDefectRecord.setEliminateTime(LocalDateTime.now()); | 
 |  |  |             throw new RuntimeException("严é缺é·-设å¤ç»´ä¿®åæ´æ°ä¸ºæ£å¸¸ç¶æ"); | 
 |  |  |         } else if (status.equals("ä¸è¬ç¼ºé·")) { | 
 |  |  |             deviceDefectRecord.setStatus("æ£å¸¸"); | 
 |  |  |         } | 
 |  |  |         deviceDefectRecord.setEliminateTime(LocalDateTime.now()); | 
 |  |  |         return updateById(deviceDefectRecord); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.SecurityUtils; | 
 |  |  | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.time.ZoneOffset; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.List; | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.device.dto.DeviceDefectRecordDto; | 
 |  |  | import com.ruoyi.device.dto.DeviceRepairDto; | 
 |  |  | import com.ruoyi.device.execl.DeviceRepairExeclDto; | 
 |  |  | import com.ruoyi.device.mapper.DeviceDefectRecordMapper; | 
 |  |  | import com.ruoyi.device.mapper.DeviceRepairMapper; | 
 |  |  | import com.ruoyi.device.pojo.DeviceDefectRecord; | 
 |  |  | import com.ruoyi.device.pojo.DeviceLedger; | 
 |  |  | import com.ruoyi.device.pojo.DeviceRepair; | 
 |  |  | import com.ruoyi.device.service.DeviceDefectRecordService; | 
 |  |  | import com.ruoyi.device.service.IDeviceLedgerService; | 
 |  |  | import com.ruoyi.device.service.IDeviceRepairService; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | 
 |  |  | @Slf4j | 
 |  |  | public class DeviceRepairServiceImpl extends ServiceImpl<DeviceRepairMapper, DeviceRepair> implements IDeviceRepairService { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private DeviceDefectRecordService deviceDefectRecordService; | 
 |  |  |     @Autowired | 
 |  |  |     private DeviceRepairMapper deviceRepairMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private IDeviceLedgerService deviceLedgerService; | 
 |  |  |     @Override | 
 |  |  |     public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) { | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) { | 
 |  |  |         DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId()); | 
 |  |  |         deviceRepair.setDeviceName(byId.getDeviceName()); | 
 |  |  |         deviceRepair.setDeviceModel(byId.getDeviceModel()); | 
 |  |  |         boolean save = this.save(deviceRepair); | 
 |  |  |         if (save){ | 
 |  |  |             return AjaxResult.success(); | 
 |  |  | 
 |  |  |     @Override | 
 |  |  |     public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) { | 
 |  |  |         if (this.updateById(deviceRepair)) { | 
 |  |  |             Long id = deviceRepair.getId(); | 
 |  |  |             // | 
 |  |  |             DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto(); | 
 |  |  |             deviceDefectRecordDto.setDeviceLedgerId(id); | 
 |  |  |             deviceDefectRecordDto.setStatus("严é缺é·"); | 
 |  |  |             List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords(); | 
 |  |  |             if (!records.isEmpty()){ | 
 |  |  |                 records.forEach(deviceDefectRecord -> { | 
 |  |  |                     deviceDefectRecord.setStatus("æ£å¸¸"); | 
 |  |  |                     deviceDefectRecordService.updateByDDR(deviceDefectRecord); | 
 |  |  |                 }); | 
 |  |  |             } | 
 |  |  |             return AjaxResult.success(); | 
 |  |  |         } | 
 |  |  |         return AjaxResult.error(); | 
 
 |  |  | 
 |  |  |                 .build()
 | 
 |  |  |                 /* è®¾ç½®å®å
¨æ¨¡å¼ï¼swaggerå¯ä»¥è®¾ç½®è®¿é®token */
 | 
 |  |  |                 .securitySchemes(securitySchemes())
 | 
 |  |  |                 .securityContexts(securityContexts())
 | 
 |  |  |                 .pathMapping(pathMapping);
 | 
 |  |  |                 .securityContexts(securityContexts());
 | 
 |  |  | //                .pathMapping(pathMapping);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 
 |  |  | 
 |  |  |         } | 
 |  |  |         // åºæ¶ | 
 |  |  |         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>() | 
 |  |  |                 .ge(SalesLedger::getEntryDate, startDate) | 
 |  |  |                 .lt(SalesLedger::getEntryDate, endDate) | 
 |  |  | //                .ge(SalesLedger::getEntryDate, startDate) | 
 |  |  | //                .lt(SalesLedger::getEntryDate, endDate) | 
 |  |  |         ); | 
 |  |  |         BigDecimal receivableMoney = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |         // åºä» | 
 |  |  |         List<PurchaseLedger> procurementRecords = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>() | 
 |  |  |                 .ge(PurchaseLedger::getEntryDate, startDate) | 
 |  |  |                 .lt(PurchaseLedger::getEntryDate, endDate) | 
 |  |  | //                .ge(PurchaseLedger::getEntryDate, startDate) | 
 |  |  | //                .lt(PurchaseLedger::getEntryDate, endDate) | 
 |  |  |         ); | 
 |  |  |         BigDecimal payableMoney = procurementRecords.stream().map(PurchaseLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |         // é¢æ¶ | 
 |  |  |         List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>() | 
 |  |  |                 .ge(ReceiptPayment::getReceiptPaymentDate, startDate) | 
 |  |  |                 .lt(ReceiptPayment::getReceiptPaymentDate, endDate)); | 
 |  |  | //                .ge(ReceiptPayment::getReceiptPaymentDate, startDate) | 
 |  |  | //                .lt(ReceiptPayment::getReceiptPaymentDate, endDate) | 
 |  |  |         ); | 
 |  |  |         BigDecimal advanceMoney = receiptPayments.stream().map(ReceiptPayment::getReceiptPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |         // é¢ä» | 
 |  |  |         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new LambdaQueryWrapper<PaymentRegistration>() | 
 |  |  |                 .ge(PaymentRegistration::getPaymentDate, startDate) | 
 |  |  |                 .lt(PaymentRegistration::getPaymentDate, endDate)); | 
 |  |  | //                .ge(PaymentRegistration::getPaymentDate, startDate) | 
 |  |  | //                .lt(PaymentRegistration::getPaymentDate, endDate) | 
 |  |  |         ); | 
 |  |  |         BigDecimal prepayMoney = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |         StatisticsReceivablePayableDto statisticsReceivablePayableDto = new StatisticsReceivablePayableDto(); | 
 |  |  |         statisticsReceivablePayableDto.setPayableMoney(payableMoney); | 
 |  |  |         statisticsReceivablePayableDto.setReceivableMoney(receivableMoney); | 
 |  |  |         statisticsReceivablePayableDto.setPayableMoney(payableMoney.subtract(prepayMoney)); | 
 |  |  |         statisticsReceivablePayableDto.setReceivableMoney(receivableMoney.subtract(advanceMoney)); | 
 |  |  |         statisticsReceivablePayableDto.setAdvanceMoney(advanceMoney); | 
 |  |  |         statisticsReceivablePayableDto.setPrepayMoney(prepayMoney); | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask; | 
 |  |  |  | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import lombok.Getter; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * éä»¶è®°å½ç±»åæä¸¾ | 
 |  |  |  * | 
 |  |  |  */ | 
 |  |  | @Getter | 
 |  |  | @AllArgsConstructor | 
 |  |  | public enum StorageAttachmentRecordType { | 
 |  |  |     // ä¾å å®é
å¼å请å é¤ | 
 |  |  |     Template("Template","èä¾"), | 
 |  |  |     Archives("Archives","ææ¡£ç®¡ç"), | 
 |  |  |     InspectionTasks("InspectionTasks","ç产巡æ£"), | 
 |  |  |     QrCodeScanRecords("QrCodeScanRecords","äºç»´ç æ«ç è®°å½æä»¶"); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private final String code; | 
 |  |  |     private final String info; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.R; | 
 |  |  | import com.ruoyi.inspectiontask.dto.InspectionTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  | import com.ruoyi.inspectiontask.service.InspectionTaskService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:52 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "å·¡æ£ä»»å¡ç®¡ç") | 
 |  |  | @RequestMapping("/inspectionTask") | 
 |  |  | public class InspectionTaskController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InspectionTaskService inspectionTaskService; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å·¡æ£ä»»å¡è¡¨è¡¨æ¥è¯¢ | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/list") | 
 |  |  |     @ApiOperation("å·¡æ£ä»»å¡è¡¨è¡¨æ¥è¯¢") | 
 |  |  |     public R<IPage<InspectionTaskDto>> list(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) { | 
 |  |  |         IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,inspectionTaskDto); | 
 |  |  |         return R.ok(list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å·¡æ£ä»»å¡è¡¨æ°å¢ä¿®æ¹ | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/addOrEditInspectionTask") | 
 |  |  |     @ApiOperation("å·¡æ£ä»»å¡è¡¨æ°å¢ä¿®æ¹") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) { | 
 |  |  |         return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å·¡æ£ä»»å¡è¡¨å é¤ | 
 |  |  |      */ | 
 |  |  |     @DeleteMapping("/delInspectionTask") | 
 |  |  |     @ApiOperation("å·¡æ£ä»»å¡è¡¨å é¤") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public R remove(@RequestBody Long[] ids) { | 
 |  |  |         return R.ok(inspectionTaskService.delByIds(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.R; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  | import com.ruoyi.inspectiontask.service.QrCodeService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:52 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "äºç»´ç ç®¡ç") | 
 |  |  | @RequestMapping("/qrCode") | 
 |  |  | public class QrCodeController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private QrCodeService qrCodeService; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç ç®¡ç表æ¥è¯¢ | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/list") | 
 |  |  |     @ApiOperation("äºç»´ç ç®¡ç表æ¥è¯¢") | 
 |  |  |     public R<IPage<QrCode>> list(Page page, QrCodeDto qrCodeDto) { | 
 |  |  |         IPage<QrCode> list = qrCodeService.selectQrCodeList(page, qrCodeDto); | 
 |  |  |         return R.ok(list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç ç®¡ç表æ°å¢ä¿®æ¹ | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/addOrEditQrCode") | 
 |  |  |     @ApiOperation("äºç»´ç ç®¡ç表æ°å¢ä¿®æ¹") | 
 |  |  |     public R<Long> addOrEditQrCode(@RequestBody QrCodeDto qrCodeDto) { | 
 |  |  |         return R.ok(qrCodeService.addOrEditQrCode(qrCodeDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç ç®¡ç表å é¤ | 
 |  |  |      */ | 
 |  |  |     @DeleteMapping("/delQrCode") | 
 |  |  |     @ApiOperation("äºç»´ç ç®¡ç表å é¤") | 
 |  |  |     public R remove(@RequestBody Long[] ids) { | 
 |  |  |         return R.ok(qrCodeService.delByIds(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.R; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord; | 
 |  |  | import com.ruoyi.inspectiontask.service.QrCodeScanRecordService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:53 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "äºç»´ç æ«æè®°å½ç®¡ç") | 
 |  |  | @RequestMapping("/qrCodeScanRecord") | 
 |  |  | public class QrCodeScanRecordController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private QrCodeScanRecordService qrCodeScanRecordService; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç æ«ç è®°å½è¡¨æ¥è¯¢ | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/list") | 
 |  |  |     @ApiOperation("äºç»´ç æ«ç è®°å½è¡¨æ¥è¯¢") | 
 |  |  |     public R<IPage<QrCodeScanRecordDto>> list(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) { | 
 |  |  |         IPage<QrCodeScanRecordDto> list = qrCodeScanRecordService.selectQrCodeScanRecordList(page, qrCodeScanRecordDto); | 
 |  |  |         return R.ok(list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç æ«ç è®°å½è¡¨æ°å¢ä¿®æ¹ | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/addOrEditQrCodeRecord") | 
 |  |  |     @ApiOperation("äºç»´ç æ«ç è®°å½è¡¨æ°å¢ä¿®æ¹") | 
 |  |  |     public R addOrEditQrCodeRecord(@RequestBody QrCodeScanRecordDto qrCodeScanRecordDto) { | 
 |  |  |         return R.ok(qrCodeScanRecordService.addOrEditQrCodeRecord(qrCodeScanRecordDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç æ«ç è®°å½è¡¨å é¤ | 
 |  |  |      */ | 
 |  |  |     @DeleteMapping("/delSalesRecord") | 
 |  |  |     @ApiOperation("äºç»´ç æ«ç è®°å½è¡¨å é¤") | 
 |  |  |     public R remove(@RequestBody Long[] ids) { | 
 |  |  |         return R.ok(qrCodeScanRecordService.delByIds(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.R; | 
 |  |  | import com.ruoyi.inspectiontask.dto.TimingTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import com.ruoyi.inspectiontask.service.TimingTaskService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import org.quartz.SchedulerException; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:53 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "宿¶ä»»å¡ç®¡ç") | 
 |  |  | @RequestMapping("/timingTask") | 
 |  |  | public class TimingTaskController extends BaseController { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TimingTaskService timingTaskService; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å®æ¶å·¡æ£ä»»å¡è¡¨æ¥è¯¢ | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/list") | 
 |  |  |     @ApiOperation(value = "宿¶ä»»å¡å表") | 
 |  |  |     public R<IPage<TimingTaskDto>> list(Page<TimingTask> page, TimingTask timingTask) { | 
 |  |  |         IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page,timingTask); | 
 |  |  |         return R.ok(list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å®æ¶å·¡æ£ä»»å¡è¡¨æ°å¢ä¿®æ¹ | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/addOrEditTimingTask") | 
 |  |  |     @ApiOperation(value = "æ°å¢ä¿®æ¹å®æ¶ä»»å¡") | 
 |  |  |     public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException { | 
 |  |  |         return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å®æ¶å·¡æ£ä»»å¡è¡¨å é¤ | 
 |  |  |      */ | 
 |  |  |     @DeleteMapping("/delTimingTask") | 
 |  |  |     @ApiOperation(value = "å é¤å®æ¶ä»»å¡") | 
 |  |  |     public R remove(@RequestBody Long[] ids) { | 
 |  |  |         return R.ok(timingTaskService.delByIds(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.basic.dto.StorageBlobDTO; | 
 |  |  | import com.ruoyi.basic.pojo.StorageAttachment; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class InspectionTaskDto extends InspectionTask { | 
 |  |  |  | 
 |  |  |     private List<StorageBlobDTO> storageBlobDTO; | 
 |  |  |     private List<StorageBlobDTO> beforeProduction; | 
 |  |  |     private List<StorageBlobDTO> afterProduction; | 
 |  |  |     private List<StorageBlobDTO> productionIssues; | 
 |  |  |  | 
 |  |  |     private List<StorageAttachment> attachments; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class QrCodeDto extends QrCode { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.dto; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.ruoyi.basic.dto.StorageBlobDTO; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class QrCodeScanRecordDto extends QrCodeScanRecord { | 
 |  |  |  | 
 |  |  |     private QrCode qrCode; | 
 |  |  |  | 
 |  |  |     private String scanner; | 
 |  |  |  | 
 |  |  |     private List<StorageBlobDTO> storageBlobDTO; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class TimingTaskDto extends TimingTask { | 
 |  |  |  | 
 |  |  |     private List<String> inspector; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:46 | 
 |  |  |  */ | 
 |  |  | public interface InspectionTaskMapper extends BaseMapper<InspectionTask> { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:46 | 
 |  |  |  */ | 
 |  |  | public interface QrCodeMapper extends BaseMapper<QrCode> { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:46 | 
 |  |  |  */ | 
 |  |  | public interface QrCodeScanRecordMapper extends BaseMapper<QrCodeScanRecord> { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:47 | 
 |  |  |  */ | 
 |  |  | @Mapper | 
 |  |  | public interface TimingTaskMapper extends BaseMapper<TimingTask> { | 
 |  |  |  | 
 |  |  |     TimingTask getTaskById(@Param("id") Long id); | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:25 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @ApiModel | 
 |  |  | @TableName("inspection_task") | 
 |  |  | public class InspectionTask { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å·¡æ£ä»»å¡å¯ä¸æ è¯ | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤åç§°") | 
 |  |  |     private String taskName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤id") | 
 |  |  |     private Integer taskId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å·¡æ£äººID") | 
 |  |  |     private String inspectorId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ§è¡å·¡æ£ç人åå§å") | 
 |  |  |     private String inspector; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä»»å¡éå è¯´ææç¹æ®æ
åµè®°å½") | 
 |  |  |     private String remarks; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä»»å¡ç»è®°äººID") | 
 |  |  |     private Long registrantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä»»å¡ç»è®°äººå§å") | 
 |  |  |     private String registrant; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "颿¬¡") | 
 |  |  |     private String frequencyType; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ¶é´ç»è") | 
 |  |  |     private String frequencyDetail; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å·¡æ£å°ç¹è¯¦ç»æè¿°") | 
 |  |  |     private String inspectionLocation; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "软å é¤æ å¿ï¼0=æªå é¤ï¼1=å·²å é¤") | 
 |  |  |     private Integer deleted; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建该记å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½å建æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.IdType; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableField; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableId; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:29 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @ApiModel | 
 |  |  | @TableName("qr_code") | 
 |  |  | public class QrCode { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * äºç»´ç å¯ä¸æ è¯ | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤åç§°") | 
 |  |  |     private String deviceName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æå¨ä½ç½®æè¿°") | 
 |  |  |     private String location; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·IDï¼ç¨äºå¤ç§æ·é离") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "软å é¤æ å¿ï¼0=æªå é¤ï¼1=å·²å é¤") | 
 |  |  |     private Integer deleted; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建该记å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½å建æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:29 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("qr_code_scan_record") | 
 |  |  | @ApiModel | 
 |  |  | public class QrCodeScanRecord { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ«ç è®°å½å¯ä¸æ è¯ | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å
³èçäºç»´ç ID") | 
 |  |  |     private Long qrCodeId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ«ç äººç¨æ·ID") | 
 |  |  |     private Long scannerId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤åç§°") | 
 |  |  |     private String deviceName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤id") | 
 |  |  |     private Integer deviceId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å®é
æ«ç æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime scanTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "软å é¤æ å¿ï¼0=æªå é¤ï¼1=å·²å é¤") | 
 |  |  |     private Integer deleted; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建该记å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½å建æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.IdType; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableField; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableId; | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableName; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:27 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @ApiModel | 
 |  |  | @TableName("timing_task") | 
 |  |  | public class TimingTask { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¸»é®ID | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤åç§°") | 
 |  |  |     private String taskName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "设å¤id") | 
 |  |  |     private Integer taskId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å·¡æ£äºº") | 
 |  |  |     private String inspectorIds; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å·¡æ£å°ç¹") | 
 |  |  |     private String inspectionLocation; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "颿¬¡") | 
 |  |  |     private String frequencyType; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "颿¬¡è¯¦æ
") | 
 |  |  |     private String frequencyDetail; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "䏿¬¡æ§è¡æ¶é´") | 
 |  |  |     private LocalDateTime nextExecutionTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåæ§è¡æ¶é´") | 
 |  |  |     private LocalDateTime lastExecutionTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ¯å¦æ¿æ´»") | 
 |  |  |     private boolean isActive; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remarks; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç»è®°äººid") | 
 |  |  |     private Long registrantId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç»è®°äºº") | 
 |  |  |     private String registrant; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç»è®°æ¥æ") | 
 |  |  |     private LocalDate registrationDate; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "软å é¤æ å¿ï¼0=æªå é¤ï¼1=å·²å é¤") | 
 |  |  |     private Integer deleted; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建该记å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½å建æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æåä¿®æ¹è¯¥è®°å½çç¨æ·") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®°å½æåæ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.inspectiontask.dto.InspectionTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:49 | 
 |  |  |  */ | 
 |  |  | public interface InspectionTaskService extends IService<InspectionTask> { | 
 |  |  |  | 
 |  |  |     IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto); | 
 |  |  |  | 
 |  |  |     int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto); | 
 |  |  |  | 
 |  |  |     int delByIds(Long[] ids); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:50 | 
 |  |  |  */ | 
 |  |  | public interface QrCodeScanRecordService extends IService<QrCodeScanRecord> { | 
 |  |  |  | 
 |  |  |     IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto); | 
 |  |  |  | 
 |  |  |     int addOrEditQrCodeRecord(QrCodeScanRecordDto qrCodeScanRecordDto); | 
 |  |  |  | 
 |  |  |     int delByIds(Long[] ids); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:50 | 
 |  |  |  */ | 
 |  |  | public interface QrCodeService extends IService<QrCode>{ | 
 |  |  |     IPage<QrCode> selectQrCodeList(Page page, QrCodeDto qrCodeDto); | 
 |  |  |  | 
 |  |  |     Long addOrEditQrCode(QrCodeDto qrCodeDto); | 
 |  |  |  | 
 |  |  |     int delByIds(Long[] ids); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.inspectiontask.dto.TimingTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import org.quartz.SchedulerException; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:51 | 
 |  |  |  */ | 
 |  |  | public interface TimingTaskService extends IService<TimingTask> { | 
 |  |  |  | 
 |  |  |     IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask); | 
 |  |  |  | 
 |  |  |     int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException; | 
 |  |  |  | 
 |  |  |     int delByIds(Long[] ids); | 
 |  |  |  | 
 |  |  |     void updateTaskExecutionTime(Long taskId); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.basic.dto.StorageBlobDTO; | 
 |  |  | import com.ruoyi.basic.mapper.StorageAttachmentMapper; | 
 |  |  | import com.ruoyi.basic.mapper.StorageBlobMapper; | 
 |  |  | import com.ruoyi.basic.pojo.StorageAttachment; | 
 |  |  | import com.ruoyi.basic.pojo.StorageBlob; | 
 |  |  | import com.ruoyi.basic.service.StorageAttachmentService; | 
 |  |  | import com.ruoyi.common.utils.MinioUtils; | 
 |  |  | import com.ruoyi.common.utils.SecurityUtils; | 
 |  |  | import com.ruoyi.common.utils.StringUtils; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.inspectiontask.dto.InspectionTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  | import com.ruoyi.inspectiontask.service.InspectionTaskService; | 
 |  |  | import com.ruoyi.project.system.domain.SysUser; | 
 |  |  | import com.ruoyi.project.system.mapper.SysUserMapper; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.function.Function; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile; | 
 |  |  | import static com.ruoyi.common.enums.StorageAttachmentRecordType.InspectionTasks; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:54 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InspectionTaskMapper inspectionTaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageAttachmentService storageAttachmentService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageBlobMapper storageBlobMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageAttachmentMapper storageAttachmentMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private MinioUtils minioUtils; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SysUserMapper sysUserMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) { | 
 |  |  |         LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         queryWrapper.orderByDesc(InspectionTask::getCreateTime); | 
 |  |  |         IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper); | 
 |  |  |  | 
 |  |  |         //  æ æ°æ®æåè¿å | 
 |  |  |         if (CollectionUtils.isEmpty(entityPage.getRecords())) { | 
 |  |  |             return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); | 
 |  |  |         } | 
 |  |  |         // è·åidéå | 
 |  |  |         List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList()); | 
 |  |  |         //ç»è®°äººids | 
 |  |  |         List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList()); | 
 |  |  |         // æ¹éæ¥è¯¢ç»è®°äºº | 
 |  |  |         Map<Long, SysUser> sysUserMap; | 
 |  |  |         if (!registrantIds.isEmpty()) { | 
 |  |  |             List<SysUser> sysUsers = sysUserMapper.selectList(registrantIds); | 
 |  |  |             sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); | 
 |  |  |         } else { | 
 |  |  |             sysUserMap = new HashMap<>(); | 
 |  |  |         } | 
 |  |  |         //å·¡æ£äººids | 
 |  |  |         List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         //è·åææä¸éå¤çç¨æ·ID | 
 |  |  |         Set<Long> allUserIds = entityPage.getRecords().stream() | 
 |  |  |                 .map(InspectionTask::getInspectorId) // è·å"2,3"è¿æ ·çå符串 | 
 |  |  |                 .filter(StringUtils::isNotBlank) | 
 |  |  |                 .flatMap(idsStr -> Arrays.stream(idsStr.split(","))) | 
 |  |  |                 .map(idStr -> { | 
 |  |  |                     try { | 
 |  |  |                         return Long.parseLong(idStr.trim()); | 
 |  |  |                     } catch (NumberFormatException e) { | 
 |  |  |                         return null; | 
 |  |  |                     } | 
 |  |  |                 }) | 
 |  |  |                 .filter(Objects::nonNull) | 
 |  |  |                 .collect(Collectors.toSet()); | 
 |  |  |  | 
 |  |  |         // ä½¿ç¨SQLæ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ | 
 |  |  |         Map<Long, String> userIdToNameMap = allUserIds.isEmpty() | 
 |  |  |                 ? Collections.emptyMap() | 
 |  |  |                 : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)) | 
 |  |  |                 .stream() | 
 |  |  |                 .collect(Collectors.toMap( | 
 |  |  |                         SysUser::getUserId, | 
 |  |  |                         SysUser::getNickName, | 
 |  |  |                         (existing, replacement) -> existing)); | 
 |  |  |  | 
 |  |  |         //å¤çéä»¶ | 
 |  |  |         Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>().in(StorageAttachment::getRecordId, ids) | 
 |  |  |                         .eq(StorageAttachment::getRecordType, InspectionTasks.ordinal())) | 
 |  |  |                 .stream() | 
 |  |  |                 .collect(Collectors.groupingBy(StorageAttachment::getRecordId)); | 
 |  |  |         //  æ¹éæ¥è¯¢ææéè¦çæä»¶æ°æ® | 
 |  |  |         Set<Long> blobIds = attachmentsMap.values() | 
 |  |  |                 .stream() | 
 |  |  |                 .flatMap(List::stream) | 
 |  |  |                 .map(StorageAttachment::getStorageBlobId) | 
 |  |  |                 .collect(Collectors.toSet()); | 
 |  |  |         Map<Long, StorageBlob> blobMap = blobIds.isEmpty() | 
 |  |  |                 ? Collections.emptyMap() | 
 |  |  |                 : storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, blobIds)) | 
 |  |  |                 .stream() | 
 |  |  |                 .collect(Collectors.toMap(StorageBlob::getId, Function.identity())); | 
 |  |  |  | 
 |  |  |         List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> { | 
 |  |  |             InspectionTaskDto dto = new InspectionTaskDto(); | 
 |  |  |             BeanUtils.copyProperties(inspectionTask, dto);  // å¤å¶ä¸»å¯¹è±¡å±æ§ | 
 |  |  |  | 
 |  |  |             // è®¾ç½®ç»è®°äºº | 
 |  |  |             SysUser sysUser = sysUserMap.get(inspectionTask.getRegistrantId()); | 
 |  |  |             if (sysUser != null) { | 
 |  |  |                 dto.setRegistrant(sysUser.getNickName()); | 
 |  |  |             } | 
 |  |  |             // å¤çå·¡æ£äººåç§° | 
 |  |  |             if (StringUtils.isNotBlank(inspectionTask.getInspectorId())) { | 
 |  |  |                 String inspectorNames = Arrays.stream(inspectionTask.getInspectorId().split(",")) | 
 |  |  |                         .map(String::trim) | 
 |  |  |                         .map(idStr -> { | 
 |  |  |                             try { | 
 |  |  |                                 Long userId = Long.parseLong(idStr); | 
 |  |  |                                 return userIdToNameMap.getOrDefault(userId, "æªç¥ç¨æ·(" + idStr + ")"); | 
 |  |  |                             } catch (NumberFormatException e) { | 
 |  |  |                                 return "æ æID(" + idStr + ")"; | 
 |  |  |                             } | 
 |  |  |                         }) | 
 |  |  |                         .collect(Collectors.joining(",")); | 
 |  |  |                 dto.setInspector(inspectorNames); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // åå§åä¸ä¸ªéä»¶å表 | 
 |  |  |             dto.setBeforeProduction(new ArrayList<>()); | 
 |  |  |             dto.setAfterProduction(new ArrayList<>()); | 
 |  |  |             dto.setProductionIssues(new ArrayList<>()); | 
 |  |  |  | 
 |  |  |             // å¤çéä»¶åç±» | 
 |  |  |             Optional.ofNullable(attachmentsMap.get(inspectionTask.getId())) | 
 |  |  |                     .orElse(Collections.emptyList()) | 
 |  |  |                     .forEach(attachment -> { | 
 |  |  |                         StorageBlob blob = blobMap.get(attachment.getStorageBlobId()); | 
 |  |  |                         if (blob != null) { | 
 |  |  |                             // å建éä»¶DTO | 
 |  |  |                             StorageBlobDTO blobDto = createBlobDto(blob); | 
 |  |  |  | 
 |  |  |                             // æ ¹æ®typeåç±» | 
 |  |  |                             switch ((int) blob.getType().longValue()) { | 
 |  |  |                                 case 0: | 
 |  |  |                                     dto.getBeforeProduction().add(blobDto); | 
 |  |  |                                     break; | 
 |  |  |                                 case 1: | 
 |  |  |                                     dto.getAfterProduction().add(blobDto); | 
 |  |  |                                     break; | 
 |  |  |                                 case 2: | 
 |  |  |                                     dto.getProductionIssues().add(blobDto); | 
 |  |  |                                     break; | 
 |  |  |                                 default: | 
 |  |  |                                     // å¯éï¼è®°å½æªå类类å | 
 |  |  |                                     break; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |  | 
 |  |  |             return dto; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         // 7. æå»ºè¿åå页对象 | 
 |  |  |         IPage<InspectionTaskDto> resultPage = new Page<>(); | 
 |  |  |         BeanUtils.copyProperties(entityPage, resultPage); | 
 |  |  |         resultPage.setRecords(dtoList); | 
 |  |  |         return resultPage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æåå建BlobDTOçå
Œ
±æ¹æ³ | 
 |  |  |     private StorageBlobDTO createBlobDto(StorageBlob blob) { | 
 |  |  |         StorageBlobDTO dto = new StorageBlobDTO(); | 
 |  |  |         BeanUtils.copyProperties(blob, dto); | 
 |  |  |  | 
 |  |  |         // è®¾ç½®URL | 
 |  |  |         dto.setUrl(minioUtils.getPreviewUrls( | 
 |  |  |                 blob.getBucketFilename(), | 
 |  |  |                 blob.getBucketName(), | 
 |  |  |                 true | 
 |  |  |         )); | 
 |  |  |  | 
 |  |  |         // è®¾ç½®ä¸è½½URL | 
 |  |  |         dto.setDownloadUrl(minioUtils.getDownloadUrls( | 
 |  |  |                 blob.getBucketFilename(), | 
 |  |  |                 blob.getBucketName(), | 
 |  |  |                 blob.getOriginalFilename(), | 
 |  |  |                 true | 
 |  |  |         )); | 
 |  |  |         return dto; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) { | 
 |  |  |         InspectionTask inspectionTask = new InspectionTask(); | 
 |  |  |         BeanUtils.copyProperties(inspectionTaskDto, inspectionTask); | 
 |  |  |         inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId()); | 
 |  |  |         inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername()); | 
 |  |  |         int i; | 
 |  |  |         if (Objects.isNull(inspectionTaskDto.getId())) { | 
 |  |  |             i = inspectionTaskMapper.insert(inspectionTask); | 
 |  |  |         } else { | 
 |  |  |             i = inspectionTaskMapper.updateById(inspectionTask); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (inspectionTaskDto.getStorageBlobDTO() != null && !inspectionTaskDto.getStorageBlobDTO().isEmpty()) { | 
 |  |  |             List<StorageAttachment> attachments = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |             for (StorageBlobDTO storageBlobDTO : inspectionTaskDto.getStorageBlobDTO()) { | 
 |  |  |                 StorageAttachment storageAttachment = new StorageAttachment( | 
 |  |  |                         StorageAttachmentFile, | 
 |  |  |                         (long) InspectionTasks.ordinal(), | 
 |  |  |                         inspectionTask.getId() | 
 |  |  |                 ); | 
 |  |  |                 storageAttachment.setStorageBlobDTO(storageBlobDTO); | 
 |  |  |                 attachments.add(storageAttachment); | 
 |  |  |             } | 
 |  |  |             storageAttachmentService.saveStorageAttachment(attachments, inspectionTask.getId(), InspectionTasks, StorageAttachmentFile); | 
 |  |  |         } | 
 |  |  |         return i; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int delByIds(Long[] ids) { | 
 |  |  |         // æ£æ¥åæ° | 
 |  |  |         if (ids == null || ids.length == 0) { | 
 |  |  |             return 0; | 
 |  |  |         } | 
 |  |  |         return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.basic.dto.StorageBlobDTO; | 
 |  |  | import com.ruoyi.basic.mapper.StorageAttachmentMapper; | 
 |  |  | import com.ruoyi.basic.mapper.StorageBlobMapper; | 
 |  |  | import com.ruoyi.basic.pojo.StorageAttachment; | 
 |  |  | import com.ruoyi.basic.pojo.StorageBlob; | 
 |  |  | import com.ruoyi.basic.service.StorageAttachmentService; | 
 |  |  | import com.ruoyi.common.constant.StorageAttachmentConstants; | 
 |  |  | import com.ruoyi.common.utils.MinioUtils; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.QrCodeMapper; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.QrCodeScanRecordMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord; | 
 |  |  | import com.ruoyi.inspectiontask.service.QrCodeScanRecordService; | 
 |  |  | import com.ruoyi.project.system.domain.SysUser; | 
 |  |  | import com.ruoyi.project.system.mapper.SysUserMapper; | 
 |  |  | import lombok.AllArgsConstructor; | 
 |  |  | import lombok.Getter; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.function.Function; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile; | 
 |  |  | import static com.ruoyi.common.enums.StorageAttachmentRecordType.QrCodeScanRecords; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:54 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class QrCodeScanRecordServiceImpl extends ServiceImpl<QrCodeScanRecordMapper, QrCodeScanRecord> implements QrCodeScanRecordService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private QrCodeScanRecordMapper qrCodeScanRecordMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private QrCodeMapper qrCodeMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageAttachmentService storageAttachmentService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageBlobMapper storageBlobMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private StorageAttachmentMapper storageAttachmentMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private MinioUtils minioUtils; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SysUserMapper sysUserMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) { | 
 |  |  |         // 1. æå»ºåºç¡æ¥è¯¢æ¡ä»¶ | 
 |  |  |         LambdaQueryWrapper<QrCodeScanRecord> queryWrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         queryWrapper.orderByDesc(QrCodeScanRecord::getCreateTime); | 
 |  |  |  | 
 |  |  |         // 2. æ§è¡å页æ¥è¯¢ | 
 |  |  |         IPage<QrCodeScanRecord> scanRecordIPage = qrCodeScanRecordMapper.selectPage(page, queryWrapper); | 
 |  |  |  | 
 |  |  |         // 3. æ æ°æ®æåè¿å | 
 |  |  |         if (CollectionUtils.isEmpty(scanRecordIPage.getRecords())) { | 
 |  |  |             return new Page<>(scanRecordIPage.getCurrent(), scanRecordIPage.getSize(), scanRecordIPage.getTotal()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 4. æ¹éè·åææè®°å½IDåäºç»´ç ID | 
 |  |  |         List<Long> recordIds = scanRecordIPage.getRecords().stream() | 
 |  |  |                 .map(QrCodeScanRecord::getId) | 
 |  |  |                 .collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         Set<Long> qrCodeIds = scanRecordIPage.getRecords().stream() | 
 |  |  |                 .map(QrCodeScanRecord::getQrCodeId) | 
 |  |  |                 .filter(Objects::nonNull) | 
 |  |  |                 .collect(Collectors.toSet()); | 
 |  |  |  | 
 |  |  |         // 5. æ¹éæ¥è¯¢å
³èæ°æ®ï¼ä½¿ç¨ææ°APIï¼ | 
 |  |  |         // 5.1 æ¥è¯¢äºç»´ç ä¿¡æ¯ï¼æ¿æ¢selectBatchIds为selectByIdsï¼ | 
 |  |  |         Map<Long, QrCode> qrCodeMap = qrCodeIds.isEmpty() | 
 |  |  |                 ? Collections.emptyMap() | 
 |  |  |                 : qrCodeMapper.selectBatchIds(qrCodeIds).stream() | 
 |  |  |                 .collect(Collectors.toMap(QrCode::getId, Function.identity())); | 
 |  |  |  | 
 |  |  |         // 5.2 æ¥è¯¢éä»¶å
³èå
³ç³» | 
 |  |  |         Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper | 
 |  |  |                 .selectList(new LambdaQueryWrapper<StorageAttachment>() | 
 |  |  |                         .in(StorageAttachment::getRecordId, recordIds) | 
 |  |  |                         .eq(StorageAttachment::getRecordType, QrCodeScanRecords.ordinal())) | 
 |  |  |                 .stream() | 
 |  |  |                 .collect(Collectors.groupingBy(StorageAttachment::getRecordId)); | 
 |  |  |  | 
 |  |  |         // 5.3 æ¥è¯¢æä»¶æ°æ®ï¼ä½¿ç¨selectByIdsï¼ | 
 |  |  |         Set<Long> blobIds = attachmentsMap.values().stream() | 
 |  |  |                 .flatMap(List::stream) | 
 |  |  |                 .map(StorageAttachment::getStorageBlobId) | 
 |  |  |                 .collect(Collectors.toSet()); | 
 |  |  |  | 
 |  |  |         Map<Long, StorageBlob> blobMap = blobIds.isEmpty() | 
 |  |  |                 ? Collections.emptyMap() | 
 |  |  |                 : storageBlobMapper.selectBatchIds(blobIds).stream() | 
 |  |  |                 .collect(Collectors.toMap(StorageBlob::getId, Function.identity())); | 
 |  |  |  | 
 |  |  |         // 6. ç»è£
DTOæ°æ® | 
 |  |  |         List<QrCodeScanRecordDto> dtoList = scanRecordIPage.getRecords().stream().map(record -> { | 
 |  |  |             QrCodeScanRecordDto dto = new QrCodeScanRecordDto(); | 
 |  |  |             BeanUtils.copyProperties(record, dto); | 
 |  |  |  | 
 |  |  |             SysUser sysUser = sysUserMapper.selectUserById(record.getScannerId()); | 
 |  |  |             dto.setScanner(sysUser.getNickName()); | 
 |  |  |  | 
 |  |  |             // 6.1 è®¾ç½®äºç»´ç ä¿¡æ¯ | 
 |  |  |             Optional.ofNullable(qrCodeMap.get(record.getQrCodeId())) | 
 |  |  |                     .ifPresent(qrCode -> { | 
 |  |  |                         BeanUtils.copyProperties(qrCode, dto); // å¤å¶å°ç¶ç±» | 
 |  |  |                         dto.setQrCode(qrCode); // è®¾ç½®å®æ´å¯¹è±¡ | 
 |  |  |                     }); | 
 |  |  |  | 
 |  |  |             // 6.2 è®¾ç½®éä»¶ä¿¡æ¯ | 
 |  |  |             dto.setStorageBlobDTO( | 
 |  |  |                     Optional.ofNullable(attachmentsMap.get(record.getId())) | 
 |  |  |                             .orElse(Collections.emptyList()) | 
 |  |  |                             .stream() | 
 |  |  |                             .map(att -> { | 
 |  |  |                                 StorageBlobDTO blobDTO = new StorageBlobDTO(); | 
 |  |  |                                 Optional.ofNullable(blobMap.get(att.getStorageBlobId())) | 
 |  |  |                                         .ifPresent(blob -> { | 
 |  |  |                                             BeanUtils.copyProperties(blob, blobDTO); | 
 |  |  |                                             blobDTO.setUrl(minioUtils.getPreviewUrls(blob.getBucketFilename(), blob.getBucketName(), true)); | 
 |  |  |                                             blobDTO.setDownloadUrl(minioUtils.getDownloadUrls(blob.getBucketFilename(),blob.getBucketName(),blob.getOriginalFilename(),true)); | 
 |  |  |                                         }); | 
 |  |  |                                 return blobDTO; | 
 |  |  |                             }) | 
 |  |  |                             .filter(blobDTO -> blobDTO.getId() != null) // è¿æ»¤æ æéä»¶ | 
 |  |  |                             .collect(Collectors.toList()) | 
 |  |  |             ); | 
 |  |  |             return dto; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         // 7. æå»ºè¿åå页对象 | 
 |  |  |         IPage<QrCodeScanRecordDto> resultPage = new Page<>(); | 
 |  |  |         BeanUtils.copyProperties(scanRecordIPage, resultPage); | 
 |  |  |         resultPage.setRecords(dtoList); | 
 |  |  |  | 
 |  |  |         return resultPage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int addOrEditQrCodeRecord(QrCodeScanRecordDto qrCodeScanRecordDto) { | 
 |  |  |         QrCodeScanRecord qrCodeScanRecord = new QrCodeScanRecord(); | 
 |  |  |         BeanUtils.copyProperties(qrCodeScanRecordDto, qrCodeScanRecord); | 
 |  |  |         int i; | 
 |  |  |         if (Objects.isNull(qrCodeScanRecordDto.getId())) { | 
 |  |  |             i = qrCodeScanRecordMapper.insert(qrCodeScanRecord); | 
 |  |  |         } else { | 
 |  |  |             i = qrCodeScanRecordMapper.updateById(qrCodeScanRecord); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (qrCodeScanRecordDto.getStorageBlobDTO() != null && !qrCodeScanRecordDto.getStorageBlobDTO().isEmpty()) { | 
 |  |  |             List<StorageAttachment> attachments = new ArrayList<>(); | 
 |  |  |  | 
 |  |  |             for (StorageBlobDTO storageBlobDTO : qrCodeScanRecordDto.getStorageBlobDTO()) { | 
 |  |  |                 StorageAttachment storageAttachment = new StorageAttachment( | 
 |  |  |                         StorageAttachmentFile, | 
 |  |  |                         (long) QrCodeScanRecords.ordinal(), | 
 |  |  |                         qrCodeScanRecord.getId() | 
 |  |  |                 ); | 
 |  |  |                 storageAttachment.setStorageBlobDTO(storageBlobDTO); | 
 |  |  |                 attachments.add(storageAttachment); | 
 |  |  |             } | 
 |  |  |             storageAttachmentService.saveStorageAttachment(attachments, qrCodeScanRecord.getId(), QrCodeScanRecords, StorageAttachmentFile); | 
 |  |  |         } | 
 |  |  |         return i; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int delByIds(Long[] ids) { | 
 |  |  |         return qrCodeScanRecordMapper.deleteBatchIds(Arrays.asList(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.inspectiontask.dto.QrCodeDto; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.QrCodeMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.QrCode; | 
 |  |  | import com.ruoyi.inspectiontask.service.QrCodeService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.Objects; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:55 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class QrCodeServiceImpl extends ServiceImpl<QrCodeMapper, QrCode> implements QrCodeService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private QrCodeMapper qrCodeMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<QrCode> selectQrCodeList(Page page, QrCodeDto qrCodeDto) { | 
 |  |  |         LambdaQueryWrapper<QrCode> queryWrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         queryWrapper.orderByDesc(QrCode::getCreateTime); | 
 |  |  |         return qrCodeMapper.selectPage(page, queryWrapper); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Long addOrEditQrCode(QrCodeDto qrCodeDto) { | 
 |  |  |         QrCode qrCode = new QrCode(); | 
 |  |  |         BeanUtils.copyProperties(qrCodeDto, qrCode); | 
 |  |  |         if (Objects.isNull(qrCodeDto.getId())) { | 
 |  |  |             qrCodeMapper.insert(qrCode); | 
 |  |  |         } else { | 
 |  |  |             qrCodeMapper.updateById(qrCode); | 
 |  |  |         } | 
 |  |  |         return qrCode.getId(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int delByIds(Long[] ids) { | 
 |  |  |         return qrCodeMapper.deleteBatchIds(Arrays.asList(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import org.quartz.spi.TriggerFiredBundle; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.beans.factory.config.AutowireCapableBeanFactory; | 
 |  |  | import org.springframework.context.ApplicationContext; | 
 |  |  | import org.springframework.context.ApplicationContextAware; | 
 |  |  | import org.springframework.context.annotation.Bean; | 
 |  |  | import org.springframework.context.annotation.Configuration; | 
 |  |  | import org.springframework.scheduling.quartz.SchedulerFactoryBean; | 
 |  |  | import org.springframework.scheduling.quartz.SpringBeanJobFactory; | 
 |  |  |  | 
 |  |  | @Configuration | 
 |  |  | public class QuartzConfig { | 
 |  |  |     @Autowired | 
 |  |  |     private ApplicationContext applicationContext; | 
 |  |  |  | 
 |  |  |     @Bean | 
 |  |  |     public SchedulerFactoryBean schedulerFactoryBean() { | 
 |  |  |         SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); | 
 |  |  |  | 
 |  |  |         // é
ç½®SpringBeanJobFactoryï¼ç¨äºæ¯æJobä¸çä¾èµæ³¨å
¥ | 
 |  |  |         AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); | 
 |  |  |         jobFactory.setApplicationContext(applicationContext); | 
 |  |  |         schedulerFactory.setJobFactory(jobFactory); | 
 |  |  |  | 
 |  |  |         // å
¶ä»é
ç½®... | 
 |  |  |         return schedulerFactory; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // èªå®ä¹JobFactoryï¼æ¯æèªå¨æ³¨å
¥ | 
 |  |  |     public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory | 
 |  |  |             implements ApplicationContextAware { | 
 |  |  |  | 
 |  |  |         private transient AutowireCapableBeanFactory beanFactory; | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         public void setApplicationContext(ApplicationContext applicationContext) { | 
 |  |  |             this.beanFactory = applicationContext.getAutowireCapableBeanFactory(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         @Override | 
 |  |  |         protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { | 
 |  |  |             Object jobInstance = super.createJobInstance(bundle); | 
 |  |  |             // å°Jobå®ä¾äº¤ç»Spring容å¨ç®¡çï¼ä½¿å
¶è½å¤è¿è¡ä¾èµæ³¨å
¥ | 
 |  |  |             beanFactory.autowireBean(jobInstance); | 
 |  |  |             return jobInstance; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import org.quartz.JobExecutionContext; | 
 |  |  | import org.springframework.context.ApplicationContext; | 
 |  |  | import org.springframework.context.ApplicationContextAware; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  |  | 
 |  |  | @Component | 
 |  |  | public class SpringContextHolder implements ApplicationContextAware { | 
 |  |  |     private static ApplicationContext applicationContext; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void setApplicationContext(ApplicationContext context) { | 
 |  |  |         applicationContext = context; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static <T> T getBean(Class<T> clazz) { | 
 |  |  |         return applicationContext.getBean(clazz); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.TimingTaskMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.InspectionTask; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import com.ruoyi.inspectiontask.service.TimingTaskService; | 
 |  |  | import org.quartz.*; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.jdbc.core.BeanPropertyRowMapper; | 
 |  |  | import org.springframework.jdbc.core.JdbcTemplate; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  |  | 
 |  |  | import javax.annotation.Resource; | 
 |  |  | import javax.sql.DataSource; | 
 |  |  | import java.time.DayOfWeek; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.time.LocalTime; | 
 |  |  | import java.time.YearMonth; | 
 |  |  | import java.util.HashSet; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Set; | 
 |  |  |  | 
 |  |  | @Component | 
 |  |  | @DisallowConcurrentExecution // ç¦æ¢å¹¶åæ§è¡åä¸ä¸ªJob | 
 |  |  | public class TimingTaskJob implements Job { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TimingTaskMapper timingTaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TimingTaskService timingTaskService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InspectionTaskMapper inspectionTaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private JdbcTemplate jdbcTemplate; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void execute(JobExecutionContext context) throws JobExecutionException { | 
 |  |  |         JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); | 
 |  |  |         // ä¿®å¤ç±»å转æ¢éè¯¯ï¼æ£ç¡®è·åtaskId | 
 |  |  |         Long taskId = jobDataMap.getLong("taskId"); | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |             // 3. å°è¯æ¥è¯¢ä½ çä¸å¡æ°æ® | 
 |  |  |             // éè¿JDBCæ¨¡æ¿æ¥è¯¢å®æ¶ä»»å¡ä¿¡æ¯ï¼ä½¿ç¨åæ°åæ¥è¯¢é²æ¢SQL注å
¥ | 
 |  |  |             String yourSql = "SELECT * FROM timing_task where id = ?"; | 
 |  |  |             List<TimingTask> tasks = jdbcTemplate.query( | 
 |  |  |                     yourSql, | 
 |  |  |                     new BeanPropertyRowMapper<>(TimingTask.class), | 
 |  |  |                     taskId | 
 |  |  |             ); | 
 |  |  |             TimingTask timingTask = tasks.isEmpty() ? null : tasks.get(0); | 
 |  |  |             if (timingTask == null) { | 
 |  |  |                 throw new JobExecutionException("æ¾ä¸å°å®æ¶ä»»å¡: " + taskId); | 
 |  |  |             } | 
 |  |  |              | 
 |  |  | //            if (!timingTask.isActive()) { | 
 |  |  | //                throw new JobExecutionException("宿¶ä»»å¡å·²ç¦ç¨: " + taskId); | 
 |  |  | //            } | 
 |  |  |  | 
 |  |  |             // 2. å建并ä¿åå·¡æ£ä»»å¡è®°å½ - è¿å°±æ¯æ¨æä¾ç代ç åºè¯¥æ¾çä½ç½® | 
 |  |  |             InspectionTask inspectionTask = createInspectionTask(timingTask); | 
 |  |  |             inspectionTaskMapper.insert(inspectionTask); | 
 |  |  |  | 
 |  |  |             // 3. æ´æ°å®æ¶ä»»å¡çæ§è¡æ¶é´ | 
 |  |  |             if (!tasks.isEmpty()) { | 
 |  |  |                 TimingTask task = tasks.get(0); | 
 |  |  |  | 
 |  |  |                 // æ´æ°æåæ§è¡æ¶é´ä¸ºå½åæ¶é´ | 
 |  |  |                 LocalDateTime lastExecutionTime = LocalDateTime.now(); | 
 |  |  |  | 
 |  |  |                 // è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ | 
 |  |  |                 LocalDateTime nextExecutionTime = calculateNextExecutionTime( | 
 |  |  |                         task.getFrequencyType(), | 
 |  |  |                         task.getFrequencyDetail(), | 
 |  |  |                         lastExecutionTime | 
 |  |  |                 ); | 
 |  |  |  | 
 |  |  |                 // æ§è¡æ´æ°æä½ | 
 |  |  |                 String updateSql = "UPDATE timing_task " + | 
 |  |  |                         "SET last_execution_time = ?, next_execution_time = ? " + | 
 |  |  |                         "WHERE id = ?"; | 
 |  |  |  | 
 |  |  |                 jdbcTemplate.update( | 
 |  |  |                         updateSql, | 
 |  |  |                         lastExecutionTime, | 
 |  |  |                         nextExecutionTime, | 
 |  |  |                         taskId | 
 |  |  |                 ); | 
 |  |  |             } | 
 |  |  | //            timingTaskService.updateTaskExecutionTime(taskId); | 
 |  |  |  | 
 |  |  |             // 4. è®°å½æ§è¡æ¥å¿ | 
 |  |  | //            timingTaskService.recordExecutionLog(taskId, true, "任塿§è¡æåï¼çæå·¡æ£ä»»å¡ID: " + inspectionTask.getId()); | 
 |  |  |  | 
 |  |  |         } catch (Exception e) { | 
 |  |  | //            timingTaskService.recordExecutionLog(taskId, false, "任塿§è¡å¤±è´¥: " + e.getMessage()); | 
 |  |  |             throw new JobExecutionException(e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è¿å°±æ¯æ¨æä¾ç代ç å°è£
æçæ¹æ³ | 
 |  |  |     private InspectionTask createInspectionTask(TimingTask timingTask) { | 
 |  |  |         InspectionTask inspectionTask = new InspectionTask(); | 
 |  |  |  | 
 |  |  |         // å¤å¶åºæ¬å±æ§ | 
 |  |  |         inspectionTask.setTaskName(timingTask.getTaskName()); | 
 |  |  |         inspectionTask.setTaskId(timingTask.getTaskId()); | 
 |  |  |         inspectionTask.setInspectorId(timingTask.getInspectorIds()); | 
 |  |  |         inspectionTask.setInspectionLocation(timingTask.getInspectionLocation()); | 
 |  |  |         inspectionTask.setRemarks("èªå¨çæèªå®æ¶ä»»å¡ID: " + timingTask.getId()); | 
 |  |  |         inspectionTask.setRegistrantId(timingTask.getRegistrantId()); | 
 |  |  |         inspectionTask.setFrequencyType(timingTask.getFrequencyType()); | 
 |  |  |         inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail()); | 
 |  |  |         inspectionTask.setTenantId(timingTask.getTenantId()); | 
 |  |  |  | 
 |  |  |         return inspectionTask; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateNextExecutionTime(String frequencyType, | 
 |  |  |                                                      String frequencyDetail, | 
 |  |  |                                                      LocalDateTime currentTime) { | 
 |  |  |         try { | 
 |  |  |             switch (frequencyType) { | 
 |  |  |                 case "DAILY": | 
 |  |  |                     return calculateDailyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "WEEKLY": | 
 |  |  |                     return calculateWeeklyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "MONTHLY": | 
 |  |  |                     return calculateMonthlyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "QUARTERLY": | 
 |  |  |                     return calculateQuarterlyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 default: | 
 |  |  |                     throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + frequencyType); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             throw new RuntimeException("计ç®ä¸æ¬¡æ§è¡æ¶é´å¤±è´¥: " + e.getMessage(), e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯æ¥ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) { | 
 |  |  |         LocalTime executionTime = LocalTime.parse(timeStr); // è§£ææ ¼å¼ "HH:mm" | 
 |  |  |         LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime); | 
 |  |  |  | 
 |  |  |         // å¦æä»å¤©çæ¶é´å·²è¿ï¼å宿æå¤© | 
 |  |  |         return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯å¨ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         String dayOfWeekStr = parts[0];  // å¦ "MON" æ "MON|WED|FRI" | 
 |  |  |         LocalTime time = LocalTime.parse(parts[1]); // æ¶é´é¨å | 
 |  |  |  | 
 |  |  |         // è§£æææå (æ¯æå¤ä¸ªææ) | 
 |  |  |         Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr); | 
 |  |  |  | 
 |  |  |         // ä»å½åæ¶é´å¼å§æ¾ä¸ä¸ä¸ªç¬¦åæ¡ä»¶çææå  | 
 |  |  |         LocalDateTime nextTime = current; | 
 |  |  |         while (true) { | 
 |  |  |             nextTime = nextTime.plusDays(1); | 
 |  |  |             if (targetDays.contains(nextTime.getDayOfWeek())) { | 
 |  |  |                 return LocalDateTime.of(nextTime.toLocalDate(), time); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // é²æ¢æ é循ç¯(ç论ä¸ä¸ä¼åç) | 
 |  |  |             if (nextTime.isAfter(current.plusYears(1))) { | 
 |  |  |                 throw new RuntimeException("æ æ³æ¾å°ä¸æ¬¡æ§è¡æ¶é´"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯æä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         int dayOfMonth = Integer.parseInt(parts[0]); | 
 |  |  |         LocalTime time = LocalTime.parse(parts[1]); | 
 |  |  |  | 
 |  |  |         // ä»ä¸ä¸ªæå¼å§è®¡ç® | 
 |  |  |         LocalDateTime nextTime = current.plusMonths(1) | 
 |  |  |                 .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth())) | 
 |  |  |                 .with(time); | 
 |  |  |  | 
 |  |  |         return nextTime; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯å£åº¦ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         int quarterMonth = Integer.parseInt(parts[0]); // 1=第1个æï¼2=第2个æï¼3=第3个æ | 
 |  |  |         int dayOfMonth = Integer.parseInt(parts[1]); | 
 |  |  |         LocalTime time = LocalTime.parse(parts[2]); | 
 |  |  |  | 
 |  |  |         // è®¡ç®å½åå£åº¦ | 
 |  |  |         int currentQuarter = (current.getMonthValue() - 1) / 3 + 1; | 
 |  |  |         int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1; | 
 |  |  |  | 
 |  |  |         YearMonth targetYearMonth; | 
 |  |  |         if (currentMonthInQuarter < quarterMonth) { | 
 |  |  |             // æ¬å£åº¦å
è¿ææ§è¡æºä¼ | 
 |  |  |             targetYearMonth = YearMonth.from(current) | 
 |  |  |                     .plusMonths(quarterMonth - currentMonthInQuarter); | 
 |  |  |         } else { | 
 |  |  |             // éè¦å°ä¸ä¸ªå£åº¦ | 
 |  |  |             targetYearMonth = YearMonth.from(current) | 
 |  |  |                     .plusMonths(3 - currentMonthInQuarter + quarterMonth); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // å¤çææ«æ¥æ | 
 |  |  |         int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth()); | 
 |  |  |  | 
 |  |  |         return LocalDateTime.of( | 
 |  |  |                 targetYearMonth.getYear(), | 
 |  |  |                 targetYearMonth.getMonthValue(), | 
 |  |  |                 adjustedDay, | 
 |  |  |                 time.getHour(), | 
 |  |  |                 time.getMinute() | 
 |  |  |         ); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è§£æææå å符串 | 
 |  |  |      */ | 
 |  |  |     private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) { | 
 |  |  |         Set<DayOfWeek> days = new HashSet<>(); | 
 |  |  |         String[] dayStrs = dayOfWeekStr.split("\\|"); | 
 |  |  |  | 
 |  |  |         for (String dayStr : dayStrs) { | 
 |  |  |             switch (dayStr) { | 
 |  |  |                 case "MON": days.add(DayOfWeek.MONDAY); break; | 
 |  |  |                 case "TUE": days.add(DayOfWeek.TUESDAY); break; | 
 |  |  |                 case "WED": days.add(DayOfWeek.WEDNESDAY); break; | 
 |  |  |                 case "THU": days.add(DayOfWeek.THURSDAY); break; | 
 |  |  |                 case "FRI": days.add(DayOfWeek.FRIDAY); break; | 
 |  |  |                 case "SAT": days.add(DayOfWeek.SATURDAY); break; | 
 |  |  |                 case "SUN": days.add(DayOfWeek.SUNDAY); break; | 
 |  |  |                 default: throw new IllegalArgumentException("æ æçææå : " + dayStr); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return days; | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import org.quartz.*; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.time.LocalTime; | 
 |  |  | import java.time.ZoneId; | 
 |  |  | import java.time.format.DateTimeParseException; | 
 |  |  | import java.util.Arrays; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | public class TimingTaskScheduler { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private Scheduler scheduler; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ·»å æ°ä»»å¡å°è°åº¦å¨ | 
 |  |  |      */ | 
 |  |  |     public void scheduleTimingTask(TimingTask task) throws SchedulerException { | 
 |  |  |         JobDetail jobDetail = buildJobDetail(task); | 
 |  |  |         Trigger trigger = buildJobTrigger(task, jobDetail); | 
 |  |  |         scheduler.scheduleJob(jobDetail, trigger); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ´æ°å·²æä»»å¡ | 
 |  |  |      */ | 
 |  |  |     public void rescheduleTimingTask(TimingTask task) throws SchedulerException { | 
 |  |  |         TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId()); | 
 |  |  |  | 
 |  |  |         // è·åç°æè§¦åå¨å¹¶è½¬æ¢ä¸º CronTrigger | 
 |  |  |         Trigger oldTrigger = scheduler.getTrigger(triggerKey); | 
 |  |  |         if (!(oldTrigger instanceof CronTrigger)) { | 
 |  |  |             throw new SchedulerException("Existing trigger is not a CronTrigger"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // æå»ºæ°è§¦åå¨ | 
 |  |  |         Trigger newTrigger = TriggerBuilder.newTrigger() | 
 |  |  |                 .withIdentity(triggerKey) | 
 |  |  |                 .withDescription(task.getTaskName()) | 
 |  |  |                 .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task))) | 
 |  |  |                 .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())) | 
 |  |  |                 .forJob(oldTrigger.getJobKey()) | 
 |  |  |                 .build(); | 
 |  |  |  | 
 |  |  |         scheduler.rescheduleJob(triggerKey, newTrigger); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æåä»»å¡ | 
 |  |  |      */ | 
 |  |  |     public void pauseTimingTask(Long taskId) throws SchedulerException { | 
 |  |  |         JobKey jobKey = new JobKey("timingTask_" + taskId); | 
 |  |  |         scheduler.pauseJob(jobKey); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¢å¤ä»»å¡ | 
 |  |  |      */ | 
 |  |  |     public void resumeTimingTask(Long taskId) throws SchedulerException { | 
 |  |  |         JobKey jobKey = new JobKey("timingTask_" + taskId); | 
 |  |  |         scheduler.resumeJob(jobKey); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å é¤ä»»å¡ | 
 |  |  |      */ | 
 |  |  |     public void unscheduleTimingTask(Long taskId) throws SchedulerException { | 
 |  |  |         JobKey jobKey = new JobKey("timingTask_" + taskId); | 
 |  |  |         scheduler.deleteJob(jobKey); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private JobDetail buildJobDetail(TimingTask task) { | 
 |  |  |         JobDataMap jobDataMap = new JobDataMap(); | 
 |  |  |         jobDataMap.put("taskId", task.getId()); | 
 |  |  |  | 
 |  |  |         return JobBuilder.newJob(TimingTaskJob.class) | 
 |  |  |                 .withIdentity("timingTask_" + task.getId()) | 
 |  |  |                 .withDescription(task.getTaskName()) | 
 |  |  |                 .usingJobData(jobDataMap) | 
 |  |  |                 .storeDurably() | 
 |  |  |                 .build(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) { | 
 |  |  |         String cronExpression = convertToCronExpression(task); | 
 |  |  |  | 
 |  |  |             TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger() | 
 |  |  |                 .withIdentity("trigger_" + task.getId()) | 
 |  |  |                 .withDescription(task.getTaskName()) | 
 |  |  |                 .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)); | 
 |  |  |  | 
 |  |  |         if (jobDetail != null) { | 
 |  |  |             triggerBuilder.forJob(jobDetail); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (task.getNextExecutionTime() != null) { | 
 |  |  |             triggerBuilder.startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return triggerBuilder.build(); | 
 |  |  |     } | 
 |  |  |     private String convertToCronExpression(TimingTask task) { | 
 |  |  |         // åæ°æ ¡éª | 
 |  |  |         if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) { | 
 |  |  |             throw new IllegalArgumentException("ä»»å¡åæ°ä¸è½ä¸ºç©º"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // ä½¿ç¨switchç¡®ä¿æ¡ä»¶äºæ¥ | 
 |  |  |         String frequencyType = task.getFrequencyType().toUpperCase(); // ç»ä¸è½¬ä¸ºå¤§åæ¯è¾ | 
 |  |  |         switch (frequencyType) { | 
 |  |  |             case "DAILY": | 
 |  |  |                 return convertDailyToCron(task.getFrequencyDetail()); | 
 |  |  |             case "WEEKLY": | 
 |  |  |                 return convertWeeklyToCron(task.getFrequencyDetail()); | 
 |  |  |             case "MONTHLY": | 
 |  |  |                 return convertMonthlyToCron(task.getFrequencyDetail()); | 
 |  |  |             case "QUARTERLY": | 
 |  |  |                 return convertQuarterlyToCron(task.getFrequencyDetail()); | 
 |  |  |             default: | 
 |  |  |                 throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + task.getFrequencyType()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ¯æ¥ä»»å¡è½¬æ¢ | 
 |  |  |     private String convertDailyToCron(String frequencyDetail) { | 
 |  |  |         LocalTime time = parseTime(frequencyDetail); | 
 |  |  |         return String.format("0 %d %d * * ?", time.getMinute(), time.getHour()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ¯å¨ä»»å¡è½¬æ¢ | 
 |  |  |     private String convertWeeklyToCron(String frequencyDetail) { | 
 |  |  |         String[] parts = validateAndSplit(frequencyDetail, ",", 2); | 
 |  |  |         String daysOfWeek = convertDayNamesToCron(parts[0]); | 
 |  |  |         LocalTime time = parseTime(parts[1]); | 
 |  |  |         return String.format("0 %d %d ? * %s", time.getMinute(), time.getHour(), daysOfWeek); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ¯æä»»å¡è½¬æ¢ | 
 |  |  |     private String convertMonthlyToCron(String frequencyDetail) { | 
 |  |  |         String[] parts = validateAndSplit(frequencyDetail, ",", 2); | 
 |  |  |         int day = validateDayOfMonth(parts[0]); | 
 |  |  |         LocalTime time = parseTime(parts[1]); | 
 |  |  |         return String.format("0 %d %d %d * ?", time.getMinute(), time.getHour(), day); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ¯å£åº¦ä»»å¡è½¬æ¢ | 
 |  |  |     private String convertQuarterlyToCron(String frequencyDetail) { | 
 |  |  |         String[] parts = validateAndSplit(frequencyDetail, ",", 3); | 
 |  |  |         int month = validateMonth(parts[0]);  // éªè¯æä»½(1-12) | 
 |  |  |         int day = validateDayOfMonth(parts[1]);  // éªè¯æ¥æ | 
 |  |  |         LocalTime time = parseTime(parts[2]);  // è§£ææ¶é´ | 
 |  |  |  | 
 |  |  |         // è®¡ç®å£åº¦èµ·å§æä»½(1æ=1, 4æ=4, 7æ=7, 10æ=10) | 
 |  |  |         int quarterStartMonth = ((month - 1) / 3) * 3 + 1; | 
 |  |  |  | 
 |  |  |         return String.format("0 %d %d %d %d/3 ?", | 
 |  |  |                 time.getMinute(), | 
 |  |  |                 time.getHour(), | 
 |  |  |                 day, | 
 |  |  |                 quarterStartMonth); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ°å¢éªè¯æä»½çæ¹æ³(1-12) | 
 |  |  |     private int validateMonth(String monthStr) { | 
 |  |  |         try { | 
 |  |  |             int month = Integer.parseInt(monthStr); | 
 |  |  |             if (month < 1 || month > 12) { | 
 |  |  |                 throw new IllegalArgumentException("æä»½å¿
é¡»å¨1-12ä¹é´"); | 
 |  |  |             } | 
 |  |  |             return month; | 
 |  |  |         } catch (NumberFormatException e) { | 
 |  |  |             throw new IllegalArgumentException("æ æçæä»½æ ¼å¼"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è¾
婿¹æ³ï¼è§£ææ¶é´ | 
 |  |  |     private LocalTime parseTime(String timeStr) { | 
 |  |  |         try { | 
 |  |  |             return LocalTime.parse(timeStr); | 
 |  |  |         } catch (DateTimeParseException e) { | 
 |  |  |             throw new IllegalArgumentException("æ¶é´æ ¼å¼å¿
须为HH:mm", e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è¾
婿¹æ³ï¼éªè¯å¹¶åå²å符串 | 
 |  |  |     private String[] validateAndSplit(String input, String delimiter, int expectedParts) { | 
 |  |  |         String[] parts = input.split(delimiter); | 
 |  |  |         if (parts.length != expectedParts) { | 
 |  |  |             throw new IllegalArgumentException( | 
 |  |  |                     String.format("æ ¼å¼é误ï¼åºä¸º%dé¨åç¨'%s'åé", expectedParts, delimiter)); | 
 |  |  |         } | 
 |  |  |         return parts; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è¾
婿¹æ³ï¼éªè¯æä»½ä¸çæ¥ | 
 |  |  |     private int validateDayOfMonth(String dayStr) { | 
 |  |  |         int day = Integer.parseInt(dayStr); | 
 |  |  |         if (day < 1 || day > 31) { | 
 |  |  |             throw new IllegalArgumentException("æ¥æå¿
é¡»å¨1-31ä¹é´"); | 
 |  |  |         } | 
 |  |  |         return day; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è¾
婿¹æ³ï¼éªè¯å£åº¦ä¸çæ | 
 |  |  |     private int validateMonthInQuarter(String monthStr) { | 
 |  |  |         int month = Integer.parseInt(monthStr); | 
 |  |  |         if (month < 1 || month > 3) { | 
 |  |  |             throw new IllegalArgumentException("å£åº¦æä»½å¿
é¡»æ¯1ã2æ3"); | 
 |  |  |         } | 
 |  |  |         return month; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è½¬æ¢ææå åç§° | 
 |  |  |     private String convertDayNamesToCron(String dayNames) { | 
 |  |  |         return Arrays.stream(dayNames.split("\\|")) | 
 |  |  |                 .map(this::convertSingleDayName) | 
 |  |  |                 .collect(Collectors.joining(",")); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // è½¬æ¢å个ææå åç§° | 
 |  |  |     private String convertSingleDayName(String dayName) { | 
 |  |  |         switch (dayName.toUpperCase()) { | 
 |  |  |             case "MON": return "MON"; | 
 |  |  |             case "TUE": return "TUE"; | 
 |  |  |             case "WED": return "WED"; | 
 |  |  |             case "THU": return "THU"; | 
 |  |  |             case "FRI": return "FRI"; | 
 |  |  |             case "SAT": return "SAT"; | 
 |  |  |             case "SUN": return "SUN"; | 
 |  |  |             default: throw new IllegalArgumentException("æ æçææå : " + dayName); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.inspectiontask.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.StringUtils; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.inspectiontask.dto.TimingTaskDto; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; | 
 |  |  | import com.ruoyi.inspectiontask.mapper.TimingTaskMapper; | 
 |  |  | import com.ruoyi.inspectiontask.pojo.TimingTask; | 
 |  |  | import com.ruoyi.inspectiontask.service.TimingTaskService; | 
 |  |  | import com.ruoyi.project.system.domain.SysUser; | 
 |  |  | import com.ruoyi.project.system.mapper.SysUserMapper; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.quartz.SchedulerException; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.time.*; | 
 |  |  | import java.time.format.DateTimeFormatter; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/19 10:55 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class TimingTaskServiceImpl extends ServiceImpl<TimingTaskMapper, TimingTask> implements TimingTaskService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TimingTaskMapper timingTaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InspectionTaskMapper inspectionTaskMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private TimingTaskScheduler timingTaskScheduler; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SysUserMapper sysUserMapper; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) { | 
 |  |  |         // 1. å
å页æ¥è¯¢å®æ¶ä»»å¡æ°æ® | 
 |  |  |         IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, null); | 
 |  |  |  | 
 |  |  |         // 2. å¦ææ²¡ææ°æ®ï¼ç´æ¥è¿å空å页 | 
 |  |  |         if (taskPage.getRecords().isEmpty()) { | 
 |  |  |             return new Page<>(taskPage.getCurrent(), taskPage.getSize(), taskPage.getTotal()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 3. æ¶éææéè¦æ¥è¯¢çç¨æ·ID | 
 |  |  |         Set<Long> userIds = new HashSet<>(); | 
 |  |  |  | 
 |  |  |         // æ¶éç»è®°äººID | 
 |  |  |         taskPage.getRecords().forEach(task -> { | 
 |  |  |             if (task.getRegistrantId() != null) { | 
 |  |  |                 userIds.add(task.getRegistrantId()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |         // æ¶éå·¡æ£äººIDï¼å¤ä¸ªID以éå·åéï¼ | 
 |  |  |         taskPage.getRecords().forEach(task -> { | 
 |  |  |             if (StringUtils.isNotBlank(task.getInspectorIds())) { | 
 |  |  |                 Arrays.stream(task.getInspectorIds().split(",")) | 
 |  |  |                         .filter(StringUtils::isNotBlank) | 
 |  |  |                         .map(Long::valueOf) | 
 |  |  |                         .forEach(userIds::add); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |         // 4. æ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ | 
 |  |  |         Map<Long, String> userNickNameMap = new HashMap<>(); | 
 |  |  |         if (!userIds.isEmpty()) { | 
 |  |  |             List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds))); | 
 |  |  |             users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 5. è½¬æ¢ä¸ºDTO | 
 |  |  |         List<TimingTaskDto> dtoList = taskPage.getRecords().stream().map(task -> { | 
 |  |  |             TimingTaskDto dto = new TimingTaskDto(); | 
 |  |  |             // å¤å¶åºæ¬å±æ§ | 
 |  |  |             BeanUtils.copyProperties(task, dto); | 
 |  |  |  | 
 |  |  |             // è®¾ç½®ç»è®°äººæµç§° | 
 |  |  |             if (task.getRegistrantId() != null) { | 
 |  |  |                 dto.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "æªç¥ç¨æ·")); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // è®¾ç½®å·¡æ£äººæµç§°å表 | 
 |  |  |             if (StringUtils.isNotBlank(task.getInspectorIds())) { | 
 |  |  |                 List<String> inspectorNickNames = new ArrayList<>(); | 
 |  |  |                 for (String idStr : task.getInspectorIds().split(",")) { | 
 |  |  |                     if (StringUtils.isNotBlank(idStr)) { | 
 |  |  |                         Long id = Long.valueOf(idStr); | 
 |  |  |                         inspectorNickNames.add(userNickNameMap.getOrDefault(id, "æªç¥ç¨æ·")); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 dto.setInspector(inspectorNickNames); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return dto; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |         // 6. æå»ºè¿åçå页对象 | 
 |  |  |         Page<TimingTaskDto> resultPage = new Page<>(taskPage.getCurrent(), taskPage.getSize(), taskPage.getTotal()); | 
 |  |  |         resultPage.setRecords(dtoList); | 
 |  |  |         return resultPage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException { | 
 |  |  |         TimingTask timingTask = new TimingTask(); | 
 |  |  |         BeanUtils.copyProperties(timingTaskDto, timingTask); | 
 |  |  |  | 
 |  |  |         // è®¾ç½®å建人信æ¯åé»è®¤å¼ | 
 |  |  |         if (Objects.isNull(timingTaskDto.getId())) { | 
 |  |  |             timingTask.setRegistrationDate(LocalDate.now()); | 
 |  |  |             timingTask.setActive(true); | 
 |  |  |  | 
 |  |  |             // è®¡ç®é¦æ¬¡æ§è¡æ¶é´ | 
 |  |  |             LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask); | 
 |  |  |             timingTask.setNextExecutionTime(firstExecutionTime); | 
 |  |  |  | 
 |  |  |             int result = timingTaskMapper.insert(timingTask); | 
 |  |  |             if (result > 0) { | 
 |  |  |                 // æ°å¢æååæ·»å å°è°åº¦å¨ | 
 |  |  |                 timingTaskScheduler.scheduleTimingTask(timingTask); | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } else { | 
 |  |  |             int result = timingTaskMapper.updateById(timingTask); | 
 |  |  |             if (result > 0) { | 
 |  |  |                 // æ´æ°æååéæ°è°åº¦ä»»å¡ | 
 |  |  |                 timingTaskScheduler.rescheduleTimingTask(timingTask); | 
 |  |  |             } | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private LocalDateTime calculateFirstExecutionTime(TimingTask task) { | 
 |  |  |         // æ ¹æ®é¢çç±»åå详æ
计ç®é¦æ¬¡æ§è¡æ¶é´ | 
 |  |  |         String frequencyType = task.getFrequencyType(); | 
 |  |  |         if ("DAILY".equals(frequencyType)) { | 
 |  |  |             // å¦ææ¯æ¯å¤©æ§è¡ï¼è®¡ç®ä»å¤©ææå¤©çå
·ä½æ¶é´ | 
 |  |  |             return calculateDailyFirstExecution(task.getFrequencyDetail()); | 
 |  |  |         } else if ("WEEKLY".equals(frequencyType)) { | 
 |  |  |             // å¦ææ¯æ¯å¨æ§è¡ï¼è®¡ç®ä¸å¨çå
·ä½ææå  | 
 |  |  |             return calculateWeeklyFirstExecution(task.getFrequencyDetail()); | 
 |  |  |         } else if ("MONTHLY".equals(frequencyType)) { | 
 |  |  |             // å¦ææ¯æ¯ææ§è¡ï¼è®¡ç®ä¸ä¸ªæçå
·ä½æ¥æ | 
 |  |  |             return calculateMonthlyFirstExecution(task.getFrequencyDetail()); | 
 |  |  |         } else if ("QUARTERLY".equals(frequencyType)) { | 
 |  |  |             // èªå®ä¹é¢çï¼å¦æ¯å°æ¶ãæ¯30åéç | 
 |  |  |             return calculateCustomFirstExecution(task.getFrequencyDetail()); | 
 |  |  |         } else { | 
 |  |  |             throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + task.getFrequencyType()); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private LocalDateTime calculateDailyFirstExecution(String frequencyDetail) { | 
 |  |  |         // frequencyDetailå¯è½æ¯å
·ä½æ¶é´ï¼å¦ "14:30" | 
 |  |  |         LocalTime executionTime = LocalTime.parse(frequencyDetail); | 
 |  |  |         LocalDateTime now = LocalDateTime.now(); | 
 |  |  |         LocalDateTime todayExecution = LocalDateTime.of(now.toLocalDate(), executionTime); | 
 |  |  |  | 
 |  |  |         // å¦æä»å¤©çæ¶é´å·²è¿ï¼å宿æå¤©æ§è¡ | 
 |  |  |         return now.isBefore(todayExecution) ? todayExecution : todayExecution.plusDays(1); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // æ å°ææç®åä¸DayOfWeek | 
 |  |  |     private static final Map<String, DayOfWeek> WEEK_DAY_MAP = new HashMap<>(); | 
 |  |  |     static { | 
 |  |  |         WEEK_DAY_MAP.put("MON", DayOfWeek.MONDAY); | 
 |  |  |         WEEK_DAY_MAP.put("TUE", DayOfWeek.TUESDAY); | 
 |  |  |         WEEK_DAY_MAP.put("WED", DayOfWeek.WEDNESDAY); | 
 |  |  |         WEEK_DAY_MAP.put("THU", DayOfWeek.THURSDAY); | 
 |  |  |         WEEK_DAY_MAP.put("FRI", DayOfWeek.FRIDAY); | 
 |  |  |         WEEK_DAY_MAP.put("SAT", DayOfWeek.SATURDAY); | 
 |  |  |         WEEK_DAY_MAP.put("SUN", DayOfWeek.SUNDAY); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private LocalDateTime calculateWeeklyFirstExecution(String frequencyDetail) { | 
 |  |  |         // è§£æè¾å
¥åæ° | 
 |  |  |         String[] parts = frequencyDetail.split(","); | 
 |  |  |         if (parts.length != 2) { | 
 |  |  |             throw new IllegalArgumentException("åæ°æ ¼å¼é误ï¼åºä¸º'MON,13:43'æ ¼å¼"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String weekDayStr = parts[0].trim(); | 
 |  |  |         String timeStr = parts[1].trim(); | 
 |  |  |  | 
 |  |  |         // è·å对åºçææå  | 
 |  |  |         DayOfWeek targetDay = WEEK_DAY_MAP.get(weekDayStr); | 
 |  |  |         if (targetDay == null) { | 
 |  |  |             throw new IllegalArgumentException("æ æçææç®å: " + weekDayStr); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // è§£ææ¶é´ | 
 |  |  |         LocalTime targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm")); | 
 |  |  |  | 
 |  |  |         // è·åå½åæ¶é´ | 
 |  |  |         LocalDateTime now = LocalDateTime.now(); | 
 |  |  |         LocalDateTime targetDateTime = now.with(targetDay).with(targetTime); | 
 |  |  |  | 
 |  |  |         // å¦æè®¡ç®åºçæ¶é´å¨å½åæ¶é´ä¹åï¼åå ä¸å¨ | 
 |  |  |         if (targetDateTime.isBefore(now)) { | 
 |  |  |             targetDateTime = targetDateTime.plusWeeks(1); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return targetDateTime; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private LocalDateTime calculateMonthlyFirstExecution(String frequencyDetail) { | 
 |  |  |         // è§£æè¾å
¥åæ° | 
 |  |  |         String[] parts = frequencyDetail.split(","); | 
 |  |  |         if (parts.length != 2) { | 
 |  |  |             throw new IllegalArgumentException("åæ°æ ¼å¼é误ï¼åºä¸º'03,17:00'æ ¼å¼"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         String dayStr = parts[0].trim(); | 
 |  |  |         String timeStr = parts[1].trim(); | 
 |  |  |  | 
 |  |  |         // è§£ææ¥æ | 
 |  |  |         int dayOfMonth; | 
 |  |  |         try { | 
 |  |  |             dayOfMonth = Integer.parseInt(dayStr); | 
 |  |  |         } catch (NumberFormatException e) { | 
 |  |  |             throw new IllegalArgumentException("æ æçæ¥ææ ¼å¼: " + dayStr, e); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // éªè¯æ¥ææææ§ï¼1-31ä¹é´ï¼ | 
 |  |  |         if (dayOfMonth < 1 || dayOfMonth > 31) { | 
 |  |  |             throw new IllegalArgumentException("æ¥æå¿
é¡»å¨1-31ä¹é´: " + dayOfMonth); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // è§£ææ¶é´ | 
 |  |  |         LocalTime targetTime; | 
 |  |  |         try { | 
 |  |  |             targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm")); | 
 |  |  |         } catch (DateTimeException e) { | 
 |  |  |             throw new IllegalArgumentException("æ æçæ¶é´æ ¼å¼: " + timeStr, e); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // è·åå½åæ¶é´ | 
 |  |  |         LocalDateTime now = LocalDateTime.now(); | 
 |  |  |         LocalDateTime targetDateTime = now.withDayOfMonth(dayOfMonth).with(targetTime); | 
 |  |  |  | 
 |  |  |         // æ£æ¥æ¥ææ¯å¦è¢«èªå¨è°æ´ï¼å¦31æ¥å¨å°æä¼è¢«è°æ´ï¼ | 
 |  |  |         boolean isDateAdjusted = targetDateTime.getDayOfMonth() != dayOfMonth; | 
 |  |  |  | 
 |  |  |         // å¦æç®æ æ¶é´å¨å½åæ¶é´ä¹åï¼æè
æ¥æè¢«ç³»ç»èªå¨è°æ´äº | 
 |  |  |         if (targetDateTime.isBefore(now) || isDateAdjusted) { | 
 |  |  |             // è®¡ç®ä¸ä¸ªæçæ¥æ | 
 |  |  |             LocalDateTime nextMonth = now.plusMonths(1); | 
 |  |  |             // å°è¯è®¾ç½®ä¸ä¸ªæçç®æ æ¥æ | 
 |  |  |             LocalDateTime nextMonthTarget = nextMonth.withDayOfMonth(dayOfMonth).with(targetTime); | 
 |  |  |  | 
 |  |  |             // å¦æä¸ä¸ªæçæ¥æä¹è¢«è°æ´äºï¼å°±ç¨ä¸ä¸ªæçæåä¸å¤© | 
 |  |  |             if (nextMonthTarget.getDayOfMonth() != dayOfMonth) { | 
 |  |  |                 // æ£ç¡®è·åä¸ä¸ªæçæåä¸å¤©ï¼ä¿®å¤isLeapYearè°ç¨é®é¢ï¼ | 
 |  |  |                 int lastDayOfMonth = nextMonth.getMonth().length( | 
 |  |  |                         Year.of(nextMonth.getYear()).isLeap() | 
 |  |  |                 ); | 
 |  |  |                 nextMonthTarget = nextMonth.withDayOfMonth(lastDayOfMonth).with(targetTime); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             targetDateTime = nextMonthTarget; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return targetDateTime; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) { | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional | 
 |  |  |     public void updateTaskExecutionTime(Long taskId) { | 
 |  |  |         TimingTask task = timingTaskMapper.selectById(taskId); | 
 |  |  |         if (task == null) { | 
 |  |  |             throw new RuntimeException("宿¶ä»»å¡ä¸åå¨ï¼ID: " + taskId); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // æ´æ°æåæ§è¡æ¶é´ä¸ºå½åæ¶é´ | 
 |  |  |         task.setLastExecutionTime(LocalDateTime.now()); | 
 |  |  |  | 
 |  |  |         // è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ | 
 |  |  |         LocalDateTime nextExecutionTime = calculateNextExecutionTime( | 
 |  |  |                 task.getFrequencyType(), | 
 |  |  |                 task.getFrequencyDetail(), | 
 |  |  |                 LocalDateTime.now() | 
 |  |  |         ); | 
 |  |  |         task.setNextExecutionTime(nextExecutionTime); | 
 |  |  |  | 
 |  |  |         // æ´æ°æ°æ®åº | 
 |  |  |         timingTaskMapper.updateById(task); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®ä¸æ¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateNextExecutionTime(String frequencyType, | 
 |  |  |                                                      String frequencyDetail, | 
 |  |  |                                                      LocalDateTime currentTime) { | 
 |  |  |         try { | 
 |  |  |             switch (frequencyType) { | 
 |  |  |                 case "DAILY": | 
 |  |  |                     return calculateDailyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "WEEKLY": | 
 |  |  |                     return calculateWeeklyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "MONTHLY": | 
 |  |  |                     return calculateMonthlyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 case "QUARTERLY": | 
 |  |  |                     return calculateQuarterlyNextTime(frequencyDetail, currentTime); | 
 |  |  |                 default: | 
 |  |  |                     throw new IllegalArgumentException("䏿¯æçé¢çç±»å: " + frequencyType); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             throw new RuntimeException("计ç®ä¸æ¬¡æ§è¡æ¶é´å¤±è´¥: " + e.getMessage(), e); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯æ¥ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) { | 
 |  |  |         LocalTime executionTime = LocalTime.parse(timeStr); // è§£ææ ¼å¼ "HH:mm" | 
 |  |  |         LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime); | 
 |  |  |  | 
 |  |  |         // å¦æä»å¤©çæ¶é´å·²è¿ï¼å宿æå¤© | 
 |  |  |         return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯å¨ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         String dayOfWeekStr = parts[0];  // å¦ "MON" æ "MON|WED|FRI" | 
 |  |  |         LocalTime time = LocalTime.parse(parts[1]); // æ¶é´é¨å | 
 |  |  |  | 
 |  |  |         // è§£æææå (æ¯æå¤ä¸ªææ) | 
 |  |  |         Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr); | 
 |  |  |  | 
 |  |  |         // ä»å½åæ¶é´å¼å§æ¾ä¸ä¸ä¸ªç¬¦åæ¡ä»¶çææå  | 
 |  |  |         LocalDateTime nextTime = current; | 
 |  |  |         while (true) { | 
 |  |  |             nextTime = nextTime.plusDays(1); | 
 |  |  |             if (targetDays.contains(nextTime.getDayOfWeek())) { | 
 |  |  |                 return LocalDateTime.of(nextTime.toLocalDate(), time); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // é²æ¢æ é循ç¯(ç论ä¸ä¸ä¼åç) | 
 |  |  |             if (nextTime.isAfter(current.plusYears(1))) { | 
 |  |  |                 throw new RuntimeException("æ æ³æ¾å°ä¸æ¬¡æ§è¡æ¶é´"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯æä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         int dayOfMonth = Integer.parseInt(parts[0]); | 
 |  |  |         LocalTime time = LocalTime.parse(parts[1]); | 
 |  |  |  | 
 |  |  |         // ä»ä¸ä¸ªæå¼å§è®¡ç® | 
 |  |  |         LocalDateTime nextTime = current.plusMonths(1) | 
 |  |  |                 .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth())) | 
 |  |  |                 .with(time); | 
 |  |  |  | 
 |  |  |         return nextTime; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è®¡ç®æ¯å£åº¦ä»»å¡ç䏿¬¡æ§è¡æ¶é´ | 
 |  |  |      */ | 
 |  |  |     private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) { | 
 |  |  |         String[] parts = detail.split(","); | 
 |  |  |         int quarterMonth = Integer.parseInt(parts[0]); // 1=第1个æï¼2=第2个æï¼3=第3个æ | 
 |  |  |         int dayOfMonth = Integer.parseInt(parts[1]); | 
 |  |  |         LocalTime time = LocalTime.parse(parts[2]); | 
 |  |  |  | 
 |  |  |         // è®¡ç®å½åå£åº¦ | 
 |  |  |         int currentQuarter = (current.getMonthValue() - 1) / 3 + 1; | 
 |  |  |         int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1; | 
 |  |  |  | 
 |  |  |         YearMonth targetYearMonth; | 
 |  |  |         if (currentMonthInQuarter < quarterMonth) { | 
 |  |  |             // æ¬å£åº¦å
è¿ææ§è¡æºä¼ | 
 |  |  |             targetYearMonth = YearMonth.from(current) | 
 |  |  |                     .plusMonths(quarterMonth - currentMonthInQuarter); | 
 |  |  |         } else { | 
 |  |  |             // éè¦å°ä¸ä¸ªå£åº¦ | 
 |  |  |             targetYearMonth = YearMonth.from(current) | 
 |  |  |                     .plusMonths(3 - currentMonthInQuarter + quarterMonth); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // å¤çææ«æ¥æ | 
 |  |  |         int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth()); | 
 |  |  |  | 
 |  |  |         return LocalDateTime.of( | 
 |  |  |                 targetYearMonth.getYear(), | 
 |  |  |                 targetYearMonth.getMonthValue(), | 
 |  |  |                 adjustedDay, | 
 |  |  |                 time.getHour(), | 
 |  |  |                 time.getMinute() | 
 |  |  |         ); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è§£æææå å符串 | 
 |  |  |      */ | 
 |  |  |     private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) { | 
 |  |  |         Set<DayOfWeek> days = new HashSet<>(); | 
 |  |  |         String[] dayStrs = dayOfWeekStr.split("\\|"); | 
 |  |  |  | 
 |  |  |         for (String dayStr : dayStrs) { | 
 |  |  |             switch (dayStr) { | 
 |  |  |                 case "MON": days.add(DayOfWeek.MONDAY); break; | 
 |  |  |                 case "TUE": days.add(DayOfWeek.TUESDAY); break; | 
 |  |  |                 case "WED": days.add(DayOfWeek.WEDNESDAY); break; | 
 |  |  |                 case "THU": days.add(DayOfWeek.THURSDAY); break; | 
 |  |  |                 case "FRI": days.add(DayOfWeek.FRIDAY); break; | 
 |  |  |                 case "SAT": days.add(DayOfWeek.SATURDAY); break; | 
 |  |  |                 case "SUN": days.add(DayOfWeek.SUNDAY); break; | 
 |  |  |                 default: throw new IllegalArgumentException("æ æçææå : " + dayStr); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return days; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public int delByIds(Long[] ids) { | 
 |  |  |         return timingTaskMapper.deleteBatchIds(Arrays.asList(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.controller; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Log; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.service.SparePartsService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/spareParts") | 
 |  |  | @Api(tags = "å¤ä»¶åç±»æ¥å£") | 
 |  |  | public class SparePartsController { | 
 |  |  |     @Autowired | 
 |  |  |     private SparePartsService sparePartsService; | 
 |  |  |     @GetMapping("/getTree") | 
 |  |  |     @ApiOperation("å¤ä»¶åç±»-æ ç»æ") | 
 |  |  |     public AjaxResult getTree(){ | 
 |  |  |         List<SparePartsDto> tree = sparePartsService.getTree(); | 
 |  |  |         return AjaxResult.success(tree); | 
 |  |  |     } | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("å¤ä»¶åç±»-å页æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, SpareParts spareParts){ | 
 |  |  |         IPage<SparePartsDto> listPage = sparePartsService.listPage(page, spareParts); | 
 |  |  |         return AjaxResult.success(listPage); | 
 |  |  |     } | 
 |  |  | //    @GetMapping("/list") | 
 |  |  | //    @ApiOperation("å¤ä»¶åç±»-æ¥è¯¢ææ") | 
 |  |  | //    public AjaxResult list(){ | 
 |  |  | //        return AjaxResult.success(sparePartsService.list()); | 
 |  |  | //    } | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("å¤ä»¶åç±»-æ·»å ") | 
 |  |  |     @Log(title = "å¤ä»¶åç±»-æ·»å ", businessType = BusinessType.INSERT) | 
 |  |  |     public AjaxResult add(@RequestBody SpareParts spareParts){ | 
 |  |  |         return AjaxResult.success(sparePartsService.save(spareParts)); | 
 |  |  |     } | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("å¤ä»¶åç±»-æ´æ°") | 
 |  |  |     @Log(title = "å¤ä»¶åç±»-æ´æ°", businessType = BusinessType.UPDATE) | 
 |  |  |     public AjaxResult update(@RequestBody SpareParts spareParts){ | 
 |  |  |         return AjaxResult.success(sparePartsService.updateById(spareParts)); | 
 |  |  |     } | 
 |  |  |     @DeleteMapping("/delete/{id}") | 
 |  |  |     @ApiOperation("å¤ä»¶åç±»-å é¤") | 
 |  |  |     @Log(title = "å¤ä»¶åç±»-å é¤", businessType = BusinessType.DELETE) | 
 |  |  |     public AjaxResult delete(@PathVariable Long id){ | 
 |  |  |         return AjaxResult.success(sparePartsService.removeById(id)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class SparePartsDto extends SpareParts { | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶åç±»ç¶åç§° | 
 |  |  |      */ | 
 |  |  |     private String parentName; | 
 |  |  |     private List<SparePartsDto> children; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; | 
 |  |  | import io.lettuce.core.dynamic.annotation.Param; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | public interface SparePartsMapper extends BaseMapper<SpareParts> { | 
 |  |  |     IPage<SparePartsDto> listPage(Page page,@Param("spareParts") SpareParts spareParts); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @TableName("spare_parts") | 
 |  |  | public class SpareParts { | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶åç±»åç§° | 
 |  |  |      */ | 
 |  |  |     private String name; | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶åç±»ç¼å· | 
 |  |  |      */ | 
 |  |  |     private String sparePartsNo; | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶ç¶id | 
 |  |  |      */ | 
 |  |  |     private Long parentId; | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶ç¶æ | 
 |  |  |      */ | 
 |  |  |     private String status; | 
 |  |  |     /** | 
 |  |  |      * å¤ä»¶åç±»æè¿° | 
 |  |  |      */ | 
 |  |  |     private String description; | 
 |  |  |     @ApiModelProperty("å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("æ´æ°æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("å建人") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("æ´æ°äºº") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty("ç§æ·id") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.service; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | public interface SparePartsService extends IService<SpareParts> { | 
 |  |  |     IPage<SparePartsDto> listPage(Page page, SpareParts spareParts); | 
 |  |  |  | 
 |  |  |     List<SparePartsDto> getTree(); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.measuringinstrumentledger.service.impl; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.SpareParts; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.service.SparePartsService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | public class SparePartsServiceImpl extends ServiceImpl<SparePartsMapper, SpareParts> implements SparePartsService { | 
 |  |  |     @Autowired | 
 |  |  |     private SparePartsMapper sparePartsMapper; | 
 |  |  |     @Override | 
 |  |  |     public IPage<SparePartsDto> listPage(Page page, SpareParts spareParts) { | 
 |  |  |         return sparePartsMapper.listPage(page,spareParts); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<SparePartsDto> getTree() { | 
 |  |  |         SpareParts spareParts = new SpareParts(); | 
 |  |  |         IPage<SparePartsDto> sparePartsDtoIPage = sparePartsMapper.listPage(new Page<>(1, -1), spareParts); | 
 |  |  |         List<SparePartsDto> records = sparePartsDtoIPage.getRecords(); | 
 |  |  |         return buildTree(records); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å°æå¹³ç»ææ°æ®è½¬æ¢ä¸ºæ å½¢ç»æ | 
 |  |  |      * @param flatData æå¹³èç¹å表 | 
 |  |  |      * @return æ å½¢ç»ææ ¹èç¹å表 | 
 |  |  |      */ | 
 |  |  |     public static List<SparePartsDto> buildTree(List<SparePartsDto> flatData) { | 
 |  |  |         List<SparePartsDto> result = new ArrayList<>(); | 
 |  |  |         if (flatData == null || flatData.isEmpty()) { | 
 |  |  |             return result;  // ç©ºè¾å
¥ç´æ¥è¿å空å表 | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 1. å建èç¹æ å°è¡¨ï¼å卿æèç¹å¹¶åå§ååèç¹å表 | 
 |  |  |         Map<Long, SparePartsDto> nodeMap = new HashMap<>(); | 
 |  |  |         for (SparePartsDto node : flatData) { | 
 |  |  |             // ç¡®ä¿åèç¹å表åå§å(é¿å
空æéå¼å¸¸) | 
 |  |  |             if (node.getChildren() == null) { | 
 |  |  |                 node.setChildren(new ArrayList<>()); | 
 |  |  |             } | 
 |  |  |             nodeMap.put(node.getId(), node); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 2. æå»ºæ å½¢ç»æ | 
 |  |  |         for (SparePartsDto node : flatData) { | 
 |  |  |             Long parentId = node.getParentId(); | 
 |  |  |             if (parentId == null || !nodeMap.containsKey(parentId)) { | 
 |  |  |                 // æ ç¶èç¹æç¶èç¹ä¸åå¨ï¼ä½ä¸ºæ ¹èç¹ | 
 |  |  |                 result.add(node); | 
 |  |  |             } else { | 
 |  |  |                 // æç¶èç¹ï¼æ·»å å°ç¶èç¹çåèç¹å表 | 
 |  |  |                 SparePartsDto parentNode = nodeMap.get(parentId); | 
 |  |  |                 parentNode.getChildren().add(node); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedger; | 
 |  |  | import com.ruoyi.oA.dto.OaProjectDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProject; | 
 |  |  | import com.ruoyi.oA.service.OaProjectService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.apache.commons.collections4.CollectionUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.HashMap; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Api(tags = "oA项ç®ç®¡ç") | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/oA/project") | 
 |  |  | public class OaProjectController { | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectService oaProjectService; | 
 |  |  |  | 
 |  |  |     @ApiOperation("è·å项ç®å表") | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     public AjaxResult listPage(Page page, OaProjectDto oaProjectDto) { | 
 |  |  |         IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto); | 
 |  |  |         return AjaxResult.success(listPage); | 
 |  |  |     } | 
 |  |  |     @ApiOperation("è·å项ç®å表详æ
") | 
 |  |  |     @GetMapping("/getList") | 
 |  |  |     public AjaxResult getList(Page page, OaProjectDto oaProjectDto) { | 
 |  |  |         IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto); | 
 |  |  |         HashMap<Object, Object> Map = new HashMap<>(); | 
 |  |  |         listPage.getRecords().forEach(item -> { | 
 |  |  |             Map.put(item.getProjectId(), item); | 
 |  |  |         }); | 
 |  |  |         return AjaxResult.success(Map); | 
 |  |  |     } | 
 |  |  |     @ApiOperation("墿·»é¡¹ç®") | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     public AjaxResult add(@RequestBody OaProject oaProject) { | 
 |  |  |         boolean save = oaProjectService.save(oaProject); | 
 |  |  |         return AjaxResult.success(save); | 
 |  |  |     } | 
 |  |  |     @ApiOperation("å é¤é¡¹ç®") | 
 |  |  |     @DeleteMapping("/delete/{id}") | 
 |  |  |     public AjaxResult delete(@PathVariable Long id) { | 
 |  |  |         boolean remove = oaProjectService.deleteById(id); | 
 |  |  |         return AjaxResult.success(remove); | 
 |  |  |     } | 
 |  |  |     @ApiOperation("æ´æ°é¡¹ç®") | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     public AjaxResult update(@RequestBody OaProject oaProject) { | 
 |  |  |         boolean update = oaProjectService.updateById(oaProject); | 
 |  |  |         return AjaxResult.success(update); | 
 |  |  |     } | 
 |  |  | //    @ApiOperation("æ ¹æ®IDè·å项ç®è¯¦æ
") | 
 |  |  | //    @GetMapping("/getById") | 
 |  |  | //    public AjaxResult getById(Long id) { | 
 |  |  | //        OaProject oaProject = oaProjectService.getById(id); | 
 |  |  | //        return AjaxResult.success(oaProject); | 
 |  |  | //    } | 
 |  |  |     @ApiOperation("å¯¼åºæé项ç®") | 
 |  |  |     @PostMapping("/export/{ids}") | 
 |  |  |     public void export(HttpServletResponse response,@PathVariable("ids") List<Long> ids) { | 
 |  |  |         if (CollectionUtils.isEmpty(ids)) { | 
 |  |  |             throw new IllegalArgumentException("导åºé¡¹ç®å表ä¸è½ä¸ºç©º"); | 
 |  |  |         } | 
 |  |  |         oaProjectService.export(response, ids); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.controller; | 
 |  |  |  | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | @Api(tags = "oA项ç®é¶æ®µç®¡ç") | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/oA/projectPhase") | 
 |  |  | public class OaProjectPhaseController { | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectPhaseService oaProjectPhaseService; | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ°å¢é¡¹ç®é¶æ®µ") | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     public AjaxResult add(@RequestBody OaProjectPhase oaProjectPhase) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseService.save(oaProjectPhase)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("å é¤é¡¹ç®é¶æ®µ") | 
 |  |  |     @DeleteMapping("/delete/{phaseId}") | 
 |  |  |     public AjaxResult delete(@PathVariable Integer phaseId) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseService.deleteById(phaseId)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ´æ°é¡¹ç®é¶æ®µ") | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     public AjaxResult update(@RequestBody OaProjectPhase oaProjectPhase) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseService.updateById(oaProjectPhase)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ ¹æ®é¡¹ç®idæ¥è¯¢é¡¹ç®é¶æ®µå表") | 
 |  |  |     @GetMapping("/listByProjectId/{projectId}") | 
 |  |  |     public AjaxResult listByProjectId(@PathVariable Integer projectId) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseService.listByProjectId(projectId)); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.controller; | 
 |  |  |  | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseTaskService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | @Api(tags = "oA项ç®é¶æ®µä»»å¡ç®¡ç") | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/oA/projectPhaseTask") | 
 |  |  | public class OaProjectPhaseTaskController { | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectPhaseTaskService oaProjectPhaseTaskService; | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ°å¢é¡¹ç®é¶æ®µä»»å¡") | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     public AjaxResult add(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseTaskService.save(oaProjectPhaseTask)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ ¹æ®é¡¹ç®é¶æ®µidæ¥è¯¢é¡¹ç®é¶æ®µä»»å¡å表") | 
 |  |  |     @GetMapping("/listByPhaseId/{phaseId}") | 
 |  |  |     public AjaxResult listByPhaseId(@PathVariable Integer phaseId) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseTaskService.listByPhaseId(phaseId)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("å é¤é¡¹ç®é¶æ®µä»»å¡") | 
 |  |  |     @DeleteMapping("/delete/{taskId}") | 
 |  |  |     public AjaxResult delete(@PathVariable Integer taskId) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseTaskService.removeById(taskId)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("æ´æ°é¡¹ç®é¶æ®µä»»å¡") | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     public AjaxResult update(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) { | 
 |  |  |         return AjaxResult.success(oaProjectPhaseTaskService.updateById(oaProjectPhaseTask)); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import com.ruoyi.oA.pojo.OaProject; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class OaProjectDto extends OaProject { | 
 |  |  |     /** | 
 |  |  |      * è´è´£äººåç§° | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "è´è´£äººåç§°") | 
 |  |  |     private String managerName; | 
 |  |  |     /** | 
 |  |  |      * é¡¹ç®é¶æ®µå表 | 
 |  |  |      */ | 
 |  |  |     private List<OaProjectPhaseDto> oaProjectPhasesDto; | 
 |  |  | //    /** | 
 |  |  | //     * é¡¹ç®é¶æ®µä»»å¡å表 | 
 |  |  | //     */ | 
 |  |  | //    private List<OaProjectPhaseTask> oaProjectPhaseTasks; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class OaProjectPhaseDto extends OaProjectPhase { | 
 |  |  |     private List<OaProjectPhaseTask> oaProjectPhaseTasks; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.oA.dto.OaProjectDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProject; | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project(OAç³»ç»-项ç®ä»»å¡åå-项ç®è¡¨)ãçæ°æ®åºæä½Mapper | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | * @Entity com.ruoyi.oA.pojo.OaProject | 
 |  |  | */ | 
 |  |  | public interface OaProjectMapper extends BaseMapper<OaProject> { | 
 |  |  |  | 
 |  |  |     IPage<OaProjectDto> listPage(Page page,@Param("req") OaProjectDto oaProjectDto); | 
 |  |  |  | 
 |  |  |     List<OaProjectDto> selectByIds(List<Long> ids); | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.mapper; | 
 |  |  |  | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase(OAç³»ç»-项ç®é¶æ®µè¡¨)ãçæ°æ®åºæä½Mapper | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | * @Entity com.ruoyi.oA.pojo.OaProjectPhase | 
 |  |  | */ | 
 |  |  | public interface OaProjectPhaseMapper extends BaseMapper<OaProjectPhase> { | 
 |  |  |  | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.mapper; | 
 |  |  |  | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase_task(OAç³»ç»-项ç®é¶æ®µ-ä»»å¡è¡¨)ãçæ°æ®åºæä½Mapper | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | * @Entity com.ruoyi.oA.pojo.OaProjectPhaseTask | 
 |  |  | */ | 
 |  |  | public interface OaProjectPhaseTaskMapper extends BaseMapper<OaProjectPhaseTask> { | 
 |  |  |  | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * OAç³»ç»-项ç®ä»»å¡åå-项ç®è¡¨ | 
 |  |  |  * @TableName oa_project | 
 |  |  |  */ | 
 |  |  | @TableName(value ="oa_project") | 
 |  |  | @Data | 
 |  |  | public class OaProject implements Serializable { | 
 |  |  |     /** | 
 |  |  |      *  | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Integer projectId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * é¡¹ç®åç§° | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "项ç®åç§°") | 
 |  |  |     private String projectName; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * é¡¹ç®æè¿° | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "é¡¹ç®æè¿°") | 
 |  |  |     private String description; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¼å§æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "å¼å§æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate startDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç»ææ¶é´ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "ç»ææ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate endDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç¶æ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å®æåº¦ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "å®æåº¦") | 
 |  |  |     private Integer completionRate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è´è´£äººid | 
 |  |  |      */ | 
 |  |  |     private Long managerId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åå»ºç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å建æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹ç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.pojo; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * OAç³»ç»-项ç®é¶æ®µè¡¨ | 
 |  |  |  * @TableName oa_project_phase | 
 |  |  |  */ | 
 |  |  | @TableName(value ="oa_project_phase") | 
 |  |  | @Data | 
 |  |  | public class OaProjectPhase implements Serializable { | 
 |  |  |     /** | 
 |  |  |      *  | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Integer phaseId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * é¡¹ç®é¶æ®µåç§° | 
 |  |  |      */ | 
 |  |  |     private String phaseName; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * oa_project表id | 
 |  |  |      */ | 
 |  |  |     private Integer oaProjectId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¼å§æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate startDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç»ææ¶é´ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate endDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç¶æ | 
 |  |  |      */ | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åå»ºç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å建æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹ç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  |  | 
 |  |  | import java.io.Serializable; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * OAç³»ç»-项ç®é¶æ®µ-ä»»å¡è¡¨ | 
 |  |  |  * @TableName oa_project_phase_task | 
 |  |  |  */ | 
 |  |  | @TableName(value ="oa_project_phase_task") | 
 |  |  | @Data | 
 |  |  | public class OaProjectPhaseTask implements Serializable { | 
 |  |  |     /** | 
 |  |  |      *  | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Integer taskId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * é¡¹ç®é¶æ®µä»»å¡åç§° | 
 |  |  |      */ | 
 |  |  |     private String taskName; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * oa_project_phase表id | 
 |  |  |      */ | 
 |  |  |     private Integer phaseId; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¼å§æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate startDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç»ææ¶é´ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate endDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç®æ ä»»å¡å®ææ¥æ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate targetDate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç®æ å¼ | 
 |  |  |      */ | 
 |  |  |     private Integer targetValue; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å½åå¼ | 
 |  |  |      */ | 
 |  |  |     private Integer currentValue; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åä½ | 
 |  |  |      */ | 
 |  |  |     private String unit; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç¶æ | 
 |  |  |      */ | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å®æåº¦ | 
 |  |  |      */ | 
 |  |  |     private Integer completionRate; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åå»ºç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å建æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹ç¨æ· | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ä¿®æ¹æ¶é´ | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * ç§æ·ID | 
 |  |  |      */ | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service; | 
 |  |  |  | 
 |  |  | import com.ruoyi.oA.dto.OaProjectPhaseDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase(OAç³»ç»-项ç®é¶æ®µè¡¨)ãçæ°æ®åºæä½Service | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | */ | 
 |  |  | public interface OaProjectPhaseService extends IService<OaProjectPhase> { | 
 |  |  |  | 
 |  |  |     List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId); | 
 |  |  |  | 
 |  |  |     boolean deleteById(Integer phaseId); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase_task(OAç³»ç»-项ç®é¶æ®µ-ä»»å¡è¡¨)ãçæ°æ®åºæä½Service | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | */ | 
 |  |  | public interface OaProjectPhaseTaskService extends IService<OaProjectPhaseTask> { | 
 |  |  |  | 
 |  |  |     List<OaProjectPhaseTask> listByPhaseId(Integer phaseId); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.oA.dto.OaProjectDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProject; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project(OAç³»ç»-项ç®ä»»å¡åå-项ç®è¡¨)ãçæ°æ®åºæä½Service | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | */ | 
 |  |  | public interface OaProjectService extends IService<OaProject> { | 
 |  |  |  | 
 |  |  |     IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto); | 
 |  |  |  | 
 |  |  |     void export(HttpServletResponse response, List<Long> ids); | 
 |  |  |  | 
 |  |  |     boolean deleteById(Long id); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.oA.dto.OaProjectPhaseDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseService; | 
 |  |  | import com.ruoyi.oA.mapper.OaProjectPhaseMapper; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseTaskService; | 
 |  |  | import lombok.val; | 
 |  |  | import org.hibernate.validator.constraints.br.TituloEleitoral; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase(OAç³»ç»-项ç®é¶æ®µè¡¨)ãçæ°æ®åºæä½Serviceå®ç° | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | */ | 
 |  |  | @Service | 
 |  |  | @Transactional(rollbackFor = Exception.class) | 
 |  |  | public class OaProjectPhaseServiceImpl extends ServiceImpl<OaProjectPhaseMapper, OaProjectPhase> | 
 |  |  |     implements OaProjectPhaseService{ | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectPhaseMapper oaProjectPhaseMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectPhaseTaskService oaProjectPhaseTaskService; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId) { | 
 |  |  |         List<OaProjectPhase> oaProjectPhases = oaProjectPhaseMapper.selectList(new LambdaQueryWrapper<OaProjectPhase>() | 
 |  |  |                 .eq(OaProjectPhase::getOaProjectId, oaProjectId)); | 
 |  |  |         List<OaProjectPhaseDto> collect = oaProjectPhases.stream().map(oaProjectPhase -> { | 
 |  |  |             OaProjectPhaseDto oaProjectPhaseDto = new OaProjectPhaseDto(); | 
 |  |  |             BeanUtils.copyProperties(oaProjectPhase, oaProjectPhaseDto); | 
 |  |  | //            List<OaProjectPhaseTask> oaProjectPhaseTasks = oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId()); | 
 |  |  |             oaProjectPhaseDto.setOaProjectPhaseTasks(oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId())); | 
 |  |  |             return oaProjectPhaseDto; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |         return collect; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean deleteById(Integer phaseId) { | 
 |  |  |         // å
å é¤é¡¹ç®é¶æ®µä¸çä»»å¡ | 
 |  |  |         oaProjectPhaseTaskService.remove(new LambdaQueryWrapper<OaProjectPhaseTask>() | 
 |  |  |                 .eq(OaProjectPhaseTask::getPhaseId, phaseId)); | 
 |  |  |         return oaProjectPhaseMapper.deleteById(phaseId) > 0; | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhaseTask; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseTaskService; | 
 |  |  | import com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project_phase_task(OAç³»ç»-项ç®é¶æ®µ-ä»»å¡è¡¨)ãçæ°æ®åºæä½Serviceå®ç° | 
 |  |  | * @createDate 2025-09-24 09:18:46 | 
 |  |  | */ | 
 |  |  | @Service | 
 |  |  | public class OaProjectPhaseTaskServiceImpl extends ServiceImpl<OaProjectPhaseTaskMapper, OaProjectPhaseTask> | 
 |  |  |     implements OaProjectPhaseTaskService{ | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<OaProjectPhaseTask> listByPhaseId(Integer phaseId) { | 
 |  |  |         return baseMapper.selectList(new LambdaQueryWrapper<OaProjectPhaseTask>() | 
 |  |  |                 .eq(OaProjectPhaseTask::getPhaseId, phaseId)); | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.oA.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord; | 
 |  |  | import com.ruoyi.oA.dto.OaProjectDto; | 
 |  |  | import com.ruoyi.oA.pojo.OaProject; | 
 |  |  | import com.ruoyi.oA.pojo.OaProjectPhase; | 
 |  |  | import com.ruoyi.oA.service.OaProjectPhaseService; | 
 |  |  | import com.ruoyi.oA.service.OaProjectService; | 
 |  |  | import com.ruoyi.oA.mapper.OaProjectMapper; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | * @author ywx | 
 |  |  | * @description é对表ãoa_project(OAç³»ç»-项ç®ä»»å¡åå-项ç®è¡¨)ãçæ°æ®åºæä½Serviceå®ç° | 
 |  |  | * @createDate 2025-09-24 09:18:45 | 
 |  |  | */ | 
 |  |  | @Service | 
 |  |  | @Transactional(rollbackFor = Exception.class) | 
 |  |  | public class OaProjectServiceImpl extends ServiceImpl<OaProjectMapper, OaProject> | 
 |  |  |     implements OaProjectService{ | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectMapper oaProjectMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private OaProjectPhaseService oaProjectPhaseService; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto) { | 
 |  |  |         IPage<OaProjectDto> iPage = oaProjectMapper.listPage(page, oaProjectDto); | 
 |  |  |         // é¡¹ç®é¶æ®µå表 | 
 |  |  |         for (OaProjectDto projectDto : iPage.getRecords()) { | 
 |  |  |             projectDto.setOaProjectPhasesDto(oaProjectPhaseService.listByProjectId(projectDto.getProjectId())); | 
 |  |  |         } | 
 |  |  |         return iPage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void export(HttpServletResponse response, List<Long> ids) { | 
 |  |  |         List<OaProjectDto> list = oaProjectMapper.selectByIds(ids); | 
 |  |  |         ExcelUtil<OaProjectDto> util = new ExcelUtil<OaProjectDto>(OaProjectDto.class); | 
 |  |  |         util.exportExcel(response, list , "é¡¹ç®æ°æ®"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean deleteById(Long id) { | 
 |  |  |         // å
å é¤é¡¹ç®ä¸çé¶æ®µ | 
 |  |  |         List<OaProjectPhase> oaProjectPhases = oaProjectPhaseService.list(new LambdaQueryWrapper<OaProjectPhase>() | 
 |  |  |                 .eq(OaProjectPhase::getOaProjectId, id)); | 
 |  |  |         if (!oaProjectPhases.isEmpty()) { | 
 |  |  |             oaProjectPhases.forEach(oaProjectPhase -> { | 
 |  |  |                 oaProjectPhaseService.deleteById(oaProjectPhase.getPhaseId()); | 
 |  |  |             }); | 
 |  |  |         } | 
 |  |  |         return oaProjectMapper.deleteById(id) > 0; | 
 |  |  |     } | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.InboundManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.InboundManagementService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/16 16:38 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "å°è´§ç®¡ç") | 
 |  |  | @RequestMapping("/inboundManagement") | 
 |  |  | public class InboundManagementController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InboundManagementService inboundManagementService; | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, InboundManagement inboundManagement) { | 
 |  |  |         IPage<InboundManagement> result = inboundManagementService.listPage(page, inboundManagement); | 
 |  |  |         return AjaxResult.success(result); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-æ·»å ") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult add(@RequestBody InboundManagement inboundManagement) { | 
 |  |  |         inboundManagement.setArrivalTime(new Date()); | 
 |  |  |         boolean result = inboundManagementService.save(inboundManagement); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-ä¿®æ¹") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult update(@RequestBody InboundManagement inboundManagement) { | 
 |  |  |         boolean result = inboundManagementService.updateById(inboundManagement); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/del") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-å é¤") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult del(@RequestBody List<Long> ids) { | 
 |  |  |         if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); | 
 |  |  |         boolean result = inboundManagementService.removeByIds(ids); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPlan; | 
 |  |  | import com.ruoyi.procurementrecord.service.ProcurementPlanService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/18 16:13 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "éè´è®¡å") | 
 |  |  | @RequestMapping("/procurementPlan") | 
 |  |  | public class ProcurementPlanController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ProcurementPlanService procurementPlanService; | 
 |  |  |  | 
 |  |  |     @RequestMapping("/listPage") | 
 |  |  |     @ApiOperation("éè´è®¡å-æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, ProcurementPlan procurementPlan){ | 
 |  |  |         IPage<ProcurementPlan> result = procurementPlanService.listPage(page, procurementPlan); | 
 |  |  |         return AjaxResult.success(result); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("éè´è®¡å-æ·»å ") | 
 |  |  |     public AjaxResult add(@RequestBody ProcurementPlan procurementPlan){ | 
 |  |  |         boolean result = procurementPlanService.save(procurementPlan); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("éè´è®¡å-ä¿®æ¹") | 
 |  |  |     public AjaxResult update(@RequestBody ProcurementPlan procurementPlan){ | 
 |  |  |         boolean result = procurementPlanService.updateById(procurementPlan); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/del") | 
 |  |  |     @ApiOperation("éè´è®¡å-å é¤") | 
 |  |  |     public AjaxResult del(@RequestBody List<Long> ids){ | 
 |  |  |         boolean result = procurementPlanService.removeByIds(ids); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¯¼åº | 
 |  |  |      * @param response | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/export") | 
 |  |  |     public void export(HttpServletResponse response) { | 
 |  |  |         procurementPlanService.export(response); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 15:08 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "éè´ä»·æ ¼ç®¡ç") | 
 |  |  | @RequestMapping("/procurementPriceManagement") | 
 |  |  | public class ProcurementPriceManagementController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ProcurementPriceManagementService procurementPriceManagementService; | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("éè´ä»·æ ¼ç®¡ç-æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, ProcurementPriceManagement procurementPriceManagement){ | 
 |  |  |         IPage<ProcurementPriceManagement> result = procurementPriceManagementService.listPage(page, procurementPriceManagement); | 
 |  |  |         return AjaxResult.success(result); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("éè´ä»·æ ¼ç®¡ç-æ·»å ") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult add(@RequestBody ProcurementPriceManagement procurementPriceManagement){ | 
 |  |  |         boolean result = procurementPriceManagementService.save(procurementPriceManagement); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("éè´ä»·æ ¼ç®¡ç-ä¿®æ¹") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult update(@RequestBody ProcurementPriceManagement procurementPriceManagement){ | 
 |  |  |         boolean result = procurementPriceManagementService.updateById(procurementPriceManagement); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/del") | 
 |  |  |     @ApiOperation("éè´ä»·æ ¼ç®¡ç-å é¤") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult delete(@RequestBody List<Long> ids){ | 
 |  |  |         if (ids == null || ids.isEmpty()) { | 
 |  |  |             return AjaxResult.error("请传å
¥è¦å é¤çID"); | 
 |  |  |         } | 
 |  |  |         boolean result = procurementPriceManagementService.removeByIds(ids); | 
 |  |  |         return result ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¯¼åº | 
 |  |  |      * @param response | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/export") | 
 |  |  |     public void export(HttpServletResponse response) { | 
 |  |  |         procurementPriceManagementService.export(response); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |         IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto); | 
 |  |  |         return AjaxResult.success(result); | 
 |  |  |     } | 
 |  |  |     @GetMapping("/getReportList") | 
 |  |  |     @Log(title = "åºåæ¥è¡¨æ¥è¯¢", businessType = BusinessType.OTHER) | 
 |  |  |     public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) { | 
 |  |  |         return AjaxResult.success(procurementRecordService.getReportList(page, procurementDto)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¯¼åº | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.common.utils.OrderUtils; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ReturnManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.ReturnManagementService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 10:34 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "å°è´§ç®¡ç") | 
 |  |  | @RequestMapping("/returnManagement") | 
 |  |  | public class ReturnManagementController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ReturnManagementService returnManagementService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ReturnManagementMapper returnManagementMapper; | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-æ¥è¯¢") | 
 |  |  |     public AjaxResult listPage(Page page, ReturnManagement returnManagement) { | 
 |  |  |         IPage<ReturnManagement> result = returnManagementService.listPage(page, returnManagement); | 
 |  |  |         return AjaxResult.success(result); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-æ·»å ") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult add(@RequestBody ReturnManagement returnManagement) { | 
 |  |  |         String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT"); | 
 |  |  |         returnManagement.setReturnNo(rt); | 
 |  |  |         boolean result = returnManagementService.save(returnManagement); | 
 |  |  |         return result ? success() : error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-ä¿®æ¹") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult update(@RequestBody ReturnManagement returnManagement) { | 
 |  |  |         boolean result = returnManagementService.updateById(returnManagement); | 
 |  |  |         return result ? success() : error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/del") | 
 |  |  |     @ApiOperation("å°è´§ç®¡ç-å é¤") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult del(@RequestBody List<Long> ids) { | 
 |  |  |         if (CollectionUtils.isEmpty(ids)) return error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); | 
 |  |  |         boolean result = returnManagementService.removeByIds(ids); | 
 |  |  |         return result ? success() : error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private BigDecimal quantity; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æä½åºåæ°é | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æä½åºåæ°é") | 
 |  |  |     private BigDecimal minStock; | 
 |  |  |     /** | 
 |  |  |      * å¾
å
¥åºæ°é | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "å¾
å
¥åºæ°é") | 
 
 |  |  | 
 |  |  | public class ProcurementManagementUpdateDto { | 
 |  |  |  | 
 |  |  |     private String createBy; | 
 |  |  |     private BigDecimal minStock; | 
 |  |  |  | 
 |  |  |     private Long createUser; | 
 |  |  |  | 
 |  |  | 
 |  |  |     private String entryDate; | 
 |  |  |  | 
 |  |  |     private Integer id; | 
 |  |  |  | 
 |  |  |     private Integer salesLedgerProductId; | 
 |  |  | } | 
 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.dto; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "ä¸å«ç¨æ»ä»·") | 
 |  |  |     private BigDecimal taxExclusiveTotalPrice; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨æ¥æ¥ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate reportDate; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate startMonth; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate endMonth; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate startDate; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate endDate; | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "å¾
åºåºæ°é") | 
 |  |  |     private BigDecimal inboundNum0; | 
 |  |  |     /** | 
 |  |  |      * åºåºæ°é | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "åºåºæ°é") | 
 |  |  |     private BigDecimal totalInboundNum; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æä½åºåæ°é | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æä½åºåæ°é") | 
 |  |  |     private BigDecimal minStock; | 
 |  |  |     /** | 
 |  |  |      * åºå
¥åºæ¶é´ | 
 |  |  |      */ | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "ä¸å«ç¨æ»ä»·") | 
 |  |  |     private BigDecimal taxExclusiveTotalPrice; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨æ¥æ¥ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ¥è¡¨æ¥æ¥") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     private LocalDate reportDate; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ¥è¡¨ææ¥å¼å§æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     private LocalDate startMonth; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ¥è¡¨ææ¥ç»ææ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     private LocalDate endMonth; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ¥è¡¨ä½ä¸å¼å§æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     private LocalDate startDate; | 
 |  |  |     /** | 
 |  |  |      * æ¥è¡¨ææ¥ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ¥è¡¨ä½ä¸ç»ææ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") | 
 |  |  |     private LocalDate endDate; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.InboundManagement; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/16 16:33 | 
 |  |  |  */ | 
 |  |  | public interface InboundManagementMapper extends BaseMapper<InboundManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢éè´å
¥åº-å°è´§ç®¡çå表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param inboundManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<InboundManagement> listPage(Page page,@Param("req") InboundManagement inboundManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPlan; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/18 16:10 | 
 |  |  |  */ | 
 |  |  | public interface ProcurementPlanMapper extends BaseMapper<ProcurementPlan> { | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢éè´è®¡åå表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param procurementPlan | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ProcurementPlan> listPage(Page page,@Param("req") ProcurementPlan procurementPlan); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 15:05 | 
 |  |  |  */ | 
 |  |  | public interface ProcurementPriceManagementMapper extends BaseMapper<ProcurementPriceManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢éè´ä»·æ ¼ç®¡çå表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param procurementPriceManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ProcurementPriceManagement> listPage(Page page,@Param("req") ProcurementPriceManagement procurementPriceManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ReturnManagement; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 10:32 | 
 |  |  |  */ | 
 |  |  | public interface ReturnManagementMapper extends BaseMapper<ReturnManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢å表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ReturnManagement> listPage(Page page,@Param("req") ReturnManagement returnManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/16 16:29 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("inbound_management") | 
 |  |  | @ApiModel | 
 |  |  | public class InboundManagement { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "订åå·") | 
 |  |  |     private String orderNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å°è´§åå·") | 
 |  |  |     private String arrivalNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¾åºååç§°") | 
 |  |  |     private String supplierName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å°è´§ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å°è´§æ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private Date arrivalTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å°è´§æ°é") | 
 |  |  |     private String arrivalQuantity; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remark; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/18 16:00 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("procurement_plan") | 
 |  |  | @ApiModel | 
 |  |  | public class ProcurementPlan { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¼ç ") | 
 |  |  |     @Excel(name = "ç¼ç ") | 
 |  |  |     private String code; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åç§°") | 
 |  |  |     @Excel(name = "åç§°") | 
 |  |  |     private String planName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æè¿°") | 
 |  |  |     @Excel(name = "æè¿°") | 
 |  |  |     private String description; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¶æ") | 
 |  |  |     @Excel(name = "ç¶æ", readConverterExp = "disabled=ç¦ç¨,active=å¯ç¨") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ¯å¦ç³»ç»é¢ç½®") | 
 |  |  |     private Boolean isSystemPreset; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "èèç°æåºå") | 
 |  |  |     private Boolean considerExistingStock; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä»åºè¿è¡MRPçæ§å¶") | 
 |  |  |     private Boolean warehouseControl; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è®¡ç®æ»éæ±") | 
 |  |  |     private Boolean calculateTotalDemand; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "èèå®å
¨åºå") | 
 |  |  |     private Boolean considerSafetyStock; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "èèéåº") | 
 |  |  |     private Boolean considerLockedStock; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¸èèç©æè¾
å©å±æ§") | 
 |  |  |     private Boolean notConsiderMaterialAux; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è´åºåä½ä¸ºéæ±") | 
 |  |  |     private Boolean negativeStockAsDemand; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç©æ") | 
 |  |  |     private Boolean summaryMaterial; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è¾
å©å±æ§") | 
 |  |  |     private Boolean summaryAuxAttributes; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éæ±æ¥æ") | 
 |  |  |     private Boolean summaryDemandDate; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "计ç®å
¬å¼") | 
 |  |  |     @Excel(name = "计ç®å
¬å¼") | 
 |  |  |     private String formula; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @Excel(name = "æåè®¡ç®æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 14:58 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("procurement_price_management") | 
 |  |  | @ApiModel | 
 |  |  | public class ProcurementPriceManagement { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åååç§°") | 
 |  |  |     @Excel(name = "åååç§°") | 
 |  |  |     private String productName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ååç¼ç ") | 
 |  |  |     @Excel(name = "ååç¼ç ") | 
 |  |  |     private String productCode; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è§æ ¼åå·") | 
 |  |  |     @Excel(name = "è§æ ¼åå·") | 
 |  |  |     private String specification; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¾åºååç§°") | 
 |  |  |     @Excel(name = "ä¾åºååç§°") | 
 |  |  |     private String supplierName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åºç¡ä»·æ ¼") | 
 |  |  |     @Excel(name = "åºç¡ä»·æ ¼") | 
 |  |  |     private String basePrice; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¶æ") | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @Excel(name = "ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åä½") | 
 |  |  |     private String unit; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ææ£ç±»å") | 
 |  |  |     @Excel(name = "ææ£ç±»å", readConverterExp = "=æ ææ£,percentage=ç¾åæ¯ææ£,fixed=åºå®éé¢") | 
 |  |  |     private String discountType; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ææ£å¼") | 
 |  |  |     @Excel(name = "ææ£å¼") | 
 |  |  |     private String discountValue; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ææ£æææ") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private Date discountEndTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æä½ä»·æ ¼") | 
 |  |  |     @Excel(name = "æä½ä»·æ ¼") | 
 |  |  |     private String minPrice; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æé«ä»·æ ¼") | 
 |  |  |     @Excel(name = "æé«ä»·æ ¼") | 
 |  |  |     private String maxPrice; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "é¢è¦éå¼(%)") | 
 |  |  |     private String warningThreshold; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "çææ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @Excel(name = "çææ¶é´", width = 30, dateFormat = "yyyy-MM-dd") | 
 |  |  |     private Date effectiveTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å¤±ææ¶é´") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private Date expireTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "è°ä»·åå ") | 
 |  |  |     private String reason; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remark; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @Excel(name = "æ´æ°æ¶é´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |      * å
¥åºæ°é | 
 |  |  |      */ | 
 |  |  |     private BigDecimal inboundNum; | 
 |  |  | //    /** | 
 |  |  | //     * æä½åºåæ°é | 
 |  |  | //     */ | 
 |  |  | //    private BigDecimal minStock; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å
¥åºç¨æ· | 
 |  |  |      */ | 
 |  |  |     private String createBy; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å
¥åºç¨æ·id | 
 |  |  |      */ | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 10:28 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("return_management") | 
 |  |  | @ApiModel | 
 |  |  | public class ReturnManagement { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éè´§åå·") | 
 |  |  |     private String returnNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å
³èåå·") | 
 |  |  |     private String relatedNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éè´§ç±»å") | 
 |  |  |     private String returnType; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¾åºååç§°") | 
 |  |  |     private String supplierName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éè´§åå ") | 
 |  |  |     private String returnReason; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éè´§ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remark; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.InboundManagement; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/16 16:36 | 
 |  |  |  */ | 
 |  |  | public interface InboundManagementService extends IService<InboundManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è·åå表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param inboundManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<InboundManagement> listPage(Page page, InboundManagement inboundManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPlan; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/18 16:11 | 
 |  |  |  */ | 
 |  |  | public interface ProcurementPlanService extends IService<ProcurementPlan> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢ | 
 |  |  |      * @param page | 
 |  |  |      * @param procurementPlan | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ProcurementPlan> listPage(Page page, ProcurementPlan procurementPlan); | 
 |  |  |  | 
 |  |  |     void export(HttpServletResponse response); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 15:06 | 
 |  |  |  */ | 
 |  |  | public interface ProcurementPriceManagementService extends IService<ProcurementPriceManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * éè´ä»·æ ¼ç®¡ç-æ¥è¯¢ | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param procurementPriceManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement); | 
 |  |  |  | 
 |  |  |     void export(HttpServletResponse response); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Map; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  | 
 |  |  |     int updateManagement(ProcurementManagementUpdateDto procurementDto); | 
 |  |  |  | 
 |  |  |     void exportCopy(HttpServletResponse response); | 
 |  |  |  | 
 |  |  |     Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ReturnManagement; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 10:33 | 
 |  |  |  */ | 
 |  |  | public interface ReturnManagementService extends IService<ReturnManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢å表 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param returnManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.procurementrecord.mapper.InboundManagementMapper; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.InboundManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.InboundManagementService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/16 16:37 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class InboundManagementServiceImpl extends ServiceImpl<InboundManagementMapper, InboundManagement> implements InboundManagementService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InboundManagementMapper inboundManagementMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<InboundManagement> listPage(Page page, InboundManagement inboundManagement) { | 
 |  |  |         IPage<InboundManagement> result = inboundManagementMapper.listPage(page, inboundManagement); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.procurementrecord.mapper.ProcurementPlanMapper; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPlan; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.ProcurementPlanService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/18 16:12 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class ProcurementPlanServiceImpl extends ServiceImpl<ProcurementPlanMapper, ProcurementPlan> implements ProcurementPlanService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ProcurementPlanMapper procurementPlanMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<ProcurementPlan> listPage(Page page, ProcurementPlan procurementPlan) { | 
 |  |  |         IPage<ProcurementPlan> result = procurementPlanMapper.listPage(page, procurementPlan); | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void export(HttpServletResponse response) { | 
 |  |  |         List<ProcurementPlan> procurementPriceManagements = procurementPlanMapper.selectList(null); | 
 |  |  |         ExcelUtil<ProcurementPlan> util = new ExcelUtil<ProcurementPlan>(ProcurementPlan.class); | 
 |  |  |         util.exportExcel(response, procurementPriceManagements, "éè´è®¡å"); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.excel.ExcelUtils; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.procurementrecord.dto.ProcurementPageDto; | 
 |  |  | import com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 15:07 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class ProcurementPriceManagementServiceImpl extends ServiceImpl<ProcurementPriceManagementMapper, ProcurementPriceManagement> implements ProcurementPriceManagementService { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ProcurementPriceManagementMapper procurementPriceManagementMapper; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement) { | 
 |  |  |         IPage<ProcurementPriceManagement> result = procurementPriceManagementMapper.listPage(page, procurementPriceManagement); | 
 |  |  |         // æ ¹æ®çææ¶é´ï¼å¤±ææ¶é´å¤æç¶æ ææï¼å¾
çæï¼å·²è¿æ | 
 |  |  |         for (ProcurementPriceManagement record : result.getRecords()) { | 
 |  |  |             if (record.getEffectiveTime() != null) { | 
 |  |  |                 if (record.getEffectiveTime().getTime() <= System.currentTimeMillis()) { | 
 |  |  |                     record.setStatus("active"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (record.getEffectiveTime() != null) { | 
 |  |  |                 if (record.getEffectiveTime().getTime() > System.currentTimeMillis()) { | 
 |  |  |                     record.setStatus("pending"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (record.getExpireTime() != null) { | 
 |  |  |                 if (record.getExpireTime().getTime() <= System.currentTimeMillis()) { | 
 |  |  |                     record.setStatus("expired"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return result; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void export(HttpServletResponse response) { | 
 |  |  |         List<ProcurementPriceManagement> procurementPriceManagements = procurementPriceManagementMapper.selectList(null); | 
 |  |  |         for (ProcurementPriceManagement procurementPriceManagement : procurementPriceManagements) { | 
 |  |  |             if (procurementPriceManagement.getEffectiveTime() != null) { | 
 |  |  |                 if (procurementPriceManagement.getEffectiveTime().getTime() <= System.currentTimeMillis()) { | 
 |  |  |                     procurementPriceManagement.setStatus("ææ"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (procurementPriceManagement.getEffectiveTime() != null) { | 
 |  |  |                 if (procurementPriceManagement.getEffectiveTime().getTime() > System.currentTimeMillis()) { | 
 |  |  |                     procurementPriceManagement.setStatus("å¾
çæ"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             if (procurementPriceManagement.getExpireTime() != null) { | 
 |  |  |                 if (procurementPriceManagement.getExpireTime().getTime() <= System.currentTimeMillis()) { | 
 |  |  |                     procurementPriceManagement.setStatus("å·²è¿æ"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         ExcelUtil<ProcurementPriceManagement> util = new ExcelUtil<ProcurementPriceManagement>(ProcurementPriceManagement.class); | 
 |  |  |         util.exportExcel(response, procurementPriceManagements, "éè´ä»·æ ¼ç®¡ç");} | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.DateUtils; | 
 |  |  | import com.ruoyi.common.utils.SecurityUtils; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.framework.security.LoginUser; | 
 |  |  | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.time.format.DateTimeFormatter; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  | 
 |  |  |         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); | 
 |  |  |         String entryDateStr = procurementDto.getEntryDate() + " 00:00:00"; | 
 |  |  |         String createTimeStr = procurementDto.getCreateTime() + " 00:00:00"; | 
 |  |  |         SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(procurementDto.getSalesLedgerProductId()); | 
 |  |  |         if(salesLedgerProduct == null){ | 
 |  |  |             throw new RuntimeException("éå®å°è´¦äº§åä¸åå¨"); | 
 |  |  |         } | 
 |  |  |         salesLedgerProduct.setMinStock(procurementDto.getMinStock()); | 
 |  |  |         salesLedgerProductMapper.updateById(salesLedgerProduct); | 
 |  |  |         ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId()); | 
 |  |  |         procurementRecordStorageById.setCreateBy(sysUser.getNickName()); | 
 |  |  |         procurementRecordStorageById.setCreateUser(sysUser.getUserId()); | 
 |  |  | 
 |  |  |         } | 
 |  |  |         ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class); | 
 |  |  |         util.exportExcel(response, list, "åºå管ç"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto) { | 
 |  |  |         // æå»ºæ¥è¡¨æ°æ®ç»æ | 
 |  |  |         Map<String, Object> reportData = new HashMap<>(); | 
 |  |  |         // 2. æå»ºå¾è¡¨æ°æ® | 
 |  |  |         Map<String, Object> chartData = new HashMap<>(); | 
 |  |  |  | 
 |  |  |         IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto); | 
 |  |  |         List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords(); | 
 |  |  |         // è®¡ç®å¾
å
¥åºæ°é | 
 |  |  |         reportData.put("tableData", procurementPageDtoCopyList); | 
 |  |  |         // æ¥è¯¢éè´è®°å½å·²å
¥åºæ°é | 
 |  |  |         List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList()); | 
 |  |  |         if(CollectionUtils.isEmpty(collect)){ | 
 |  |  |              return reportData; | 
 |  |  |         } | 
 |  |  |         LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); | 
 |  |  |         List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); | 
 |  |  |         if(CollectionUtils.isEmpty( procurementRecords)){ | 
 |  |  |              return reportData; | 
 |  |  |         } | 
 |  |  |         int totalIn =0; | 
 |  |  |         int totalOut =0; | 
 |  |  |         int currentStock =0; | 
 |  |  |         int turnoverRate =0; | 
 |  |  |         List<String> dates = new ArrayList<>(); | 
 |  |  |         List<Integer> values = new ArrayList<>(); | 
 |  |  |         List<String> comparisonDates = new ArrayList<>(); | 
 |  |  |         List<Integer> inValues = new ArrayList<>(); | 
 |  |  |         List<Integer> outValues = new ArrayList<>(); | 
 |  |  |         // å®ä¹æ¥ææ ¼å¼åå¨ï¼æå®ä¸ºyyyy-MM-ddæ ¼å¼ | 
 |  |  |         DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE; | 
 |  |  |         for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) { | 
 |  |  |             dates.add(dto.getCreateTime().format(dateFormatter)); | 
 |  |  |             comparisonDates.add(dto.getCreateTime().format(dateFormatter)); | 
 |  |  |  | 
 |  |  |             // æ ¹æ®éè´å°è´¦IDçé对åºçåºåºè®°å½ | 
 |  |  |             List<ProcurementRecordOut> collect1 = procurementRecords.stream() | 
 |  |  |                     .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId())) | 
 |  |  |                     .collect(Collectors.toList()); | 
 |  |  |  | 
 |  |  |             // å¦ææ²¡æç¸å
³çåºåºè®°å½ï¼è·³è¿è¯¥æ¡æ°æ® | 
 |  |  |             if(CollectionUtils.isEmpty(collect1)){ | 
 |  |  |                 dto.setInboundNum0(dto.getInboundNum()); | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // è®¡ç®å·²åºåºæ°éæ»åï¼å¹¶è®¾ç½®å¾
åºåºæ°é | 
 |  |  |             BigDecimal totalInboundNum = collect1.stream() | 
 |  |  |                     .map(ProcurementRecordOut::getInboundNum) | 
 |  |  |                     .reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |  | 
 |  |  |             // å¾
åºåºæ°é = æ»æ°é - å·²åºåºæ°é | 
 |  |  |             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum)); | 
 |  |  |  | 
 |  |  |             // è®¡ç®æ»å
¥åºæ°é | 
 |  |  |             totalIn += dto.getInboundNum().intValue(); | 
 |  |  |             inValues.add(totalIn); | 
 |  |  |             // è®¡ç®æ»åºåºæ°é | 
 |  |  |             totalOut += totalInboundNum.intValue(); | 
 |  |  |             outValues.add(totalOut); | 
 |  |  |             // è®¡ç®å½ååºå | 
 |  |  |             currentStock += dto.getInboundNum().intValue() - totalInboundNum.intValue(); | 
 |  |  |             values.add(currentStock); | 
 |  |  |             // è®¡ç®å¨è½¬ç | 
 |  |  |             if(totalIn > 0){ | 
 |  |  |                 turnoverRate = totalOut * 100 / totalIn; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         // 1. æå»ºæ±æ»æ°æ® | 
 |  |  |         Map<String, Object> summary = new HashMap<>(); | 
 |  |  |         summary.put("totalIn", totalIn);          // æ»å
¥åºéï¼å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         summary.put("totalOut", totalOut);         // æ»åºåºéï¼å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         summary.put("currentStock", currentStock);     // å½ååºåéï¼å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         summary.put("turnoverRate", turnoverRate);      // å¨è½¬çï¼å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         reportData.put("summary", summary); | 
 |  |  |  | 
 |  |  |         // 2. æå»ºå¾è¡¨æ°æ® | 
 |  |  | //        Map<String, Object> chartData = new HashMap<>(); | 
 |  |  | //        List<String> dates = Arrays.asList("2025-09-15", "2025-09-16", "2025-09-17", "2025-09-18", "2025-09-19"); | 
 |  |  | //        List<Integer> values = Arrays.asList(300, 350, 400, 380, 420); | 
 |  |  |  | 
 |  |  |         chartData.put("dates", dates); | 
 |  |  |         chartData.put("values", values); | 
 |  |  |         chartData.put("comparisonDates", comparisonDates);  // å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         chartData.put("inValues", inValues);         // å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         chartData.put("outValues", outValues);        // å®é
åºä»æ°æ®è®¡ç® | 
 |  |  |         reportData.put("chartData", chartData); | 
 |  |  |  | 
 |  |  |         // 3. è®¾ç½®è¡¨æ ¼æ°æ® | 
 |  |  |         reportData.put("tableData", procurementPageDtoCopyList); | 
 |  |  |  | 
 |  |  |         return reportData; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |             BigDecimal totalInboundNum = collect1.stream() | 
 |  |  |                     .map(ProcurementRecordOut::getInboundNum) | 
 |  |  |                     .reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |  | 
 |  |  |             // åºåºæ°é = æ»æ°é - å¾
åºåºæ°é | 
 |  |  |             dto.setTotalInboundNum(totalInboundNum); | 
 |  |  |             // å¾
åºåºæ°é = æ»æ°é - å·²åºåºæ°é | 
 |  |  |             dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum)); | 
 |  |  |         } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.procurementrecord.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; | 
 |  |  | import com.ruoyi.procurementrecord.pojo.ReturnManagement; | 
 |  |  | import com.ruoyi.procurementrecord.service.ReturnManagementService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/17 10:34 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class ReturnManagementServiceImpl extends ServiceImpl<ReturnManagementMapper, ReturnManagement> implements ReturnManagementService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ReturnManagementMapper returnManagementMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement) { | 
 |  |  |         IPage<ReturnManagement> returnManagementIPage =  returnManagementMapper.listPage(page, returnManagement); | 
 |  |  |         return returnManagementIPage; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import java.util.List;
 | 
 |  |  | import javax.servlet.http.HttpServletRequest;
 | 
 |  |  | import javax.servlet.http.HttpServletResponse;
 | 
 |  |  | 
 | 
 |  |  | import com.ruoyi.basic.service.StorageBlobService;
 | 
 |  |  | import com.ruoyi.framework.web.domain.R;
 | 
 |  |  | import io.swagger.annotations.Api;
 | 
 |  |  | import io.swagger.annotations.ApiOperation;
 | 
 |  |  | import org.slf4j.Logger;
 | 
 |  |  | import org.slf4j.LoggerFactory;
 | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired;
 | 
 |  |  | 
 |  |  |  * 
 | 
 |  |  |  * @author ruoyi
 | 
 |  |  |  */
 | 
 |  |  | @Api(tags = "éç¨æ¥å£")
 | 
 |  |  | @RestController
 | 
 |  |  | @RequestMapping("/common")
 | 
 |  |  | public class CommonController
 | 
 |  |  | 
 |  |  |         }
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     @Autowired
 | 
 |  |  |     private StorageBlobService storageBlobService;
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * minioéç¨ä¸ä¼ è¯·æ±ï¼å¤ä¸ªï¼
 | 
 |  |  |      */
 | 
 |  |  |     @PostMapping("/minioUploads")
 | 
 |  |  |     @ApiOperation(value = "minioéç¨ä¸ä¼ è¯·æ±")
 | 
 |  |  |     public AjaxResult minioUploadFiles(List<MultipartFile> files, String bucketName, Long type) throws Exception
 | 
 |  |  |     {
 | 
 |  |  |         return AjaxResult.success(storageBlobService.updateStorageBlobs(files, bucketName,type));
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * éç¨ä¸ä¼ è¯·æ±ï¼å个ï¼
 | 
 |  |  |      */
 | 
 
 |  |  | 
 |  |  | package com.ruoyi.project.system.mapper;
 | 
 |  |  | 
 | 
 |  |  | import java.util.ArrayList;
 | 
 |  |  | import java.util.List;
 | 
 |  |  | 
 | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
 |  |  | import org.apache.ibatis.annotations.Param;
 | 
 |  |  | 
 | 
 |  |  | import com.ruoyi.project.system.domain.SysUser;
 | 
 |  |  | import org.springframework.beans.PropertyValues;
 | 
 |  |  | 
 | 
 |  |  | /**
 | 
 |  |  |  * ç¨æ·è¡¨ æ°æ®å±
 | 
 |  |  | 
 |  |  |      * @return ç»æ
 | 
 |  |  |      */
 | 
 |  |  |     public SysUser checkEmailUnique(String email);
 | 
 |  |  | 
 | 
 |  |  |     List<SysUser> selectList(List<Long> registrantIds);
 | 
 |  |  | 
 | 
 |  |  |     List<SysUser> selectUsersByIds(@Param("userIds") List<Long> userIds);
 | 
 |  |  | }
 | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.account.pojo.AccountExpense; | 
 |  |  | import com.ruoyi.account.pojo.AccountIncome; | 
 |  |  | import com.ruoyi.account.service.AccountExpenseService; | 
 |  |  | import com.ruoyi.account.service.AccountIncomeService; | 
 |  |  | import com.ruoyi.basic.mapper.ProductMapper; | 
 |  |  | import com.ruoyi.basic.mapper.ProductModelMapper; | 
 |  |  | import com.ruoyi.basic.mapper.SupplierManageMapper; | 
 |  |  | 
 |  |  | @RequiredArgsConstructor | 
 |  |  | @Slf4j | 
 |  |  | public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService { | 
 |  |  |  | 
 |  |  |     private final AccountExpenseService accountExpenseService; | 
 |  |  |     private final PurchaseLedgerMapper purchaseLedgerMapper; | 
 |  |  |  | 
 |  |  |     private final SalesLedgerMapper salesLedgerMapper; | 
 |  |  | 
 |  |  |         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); | 
 |  |  |         purchaseLedger.setRecorderName(sysUser.getNickName()); | 
 |  |  |         purchaseLedger.setPhoneNumber(sysUser.getPhonenumber()); | 
 |  |  |         // 2. å¤çè´¦æ·æ¶å
¥ | 
 |  |  |         AccountExpense accountExpense = new AccountExpense(); | 
 |  |  |         accountExpense.setExpenseDate(purchaseLedger.getEntryDate()); | 
 |  |  |         accountExpense.setExpenseType("0"); | 
 |  |  |         accountExpense.setSupplierName(purchaseLedger.getSupplierName()); | 
 |  |  |         accountExpense.setExpenseMoney(purchaseLedger.getContractAmount()); | 
 |  |  |         accountExpense.setExpenseDescribed("éè´ååï¼" + purchaseLedger.getPurchaseContractNumber()); | 
 |  |  |         accountExpense.setExpenseMethod("0"); | 
 |  |  |         accountExpense.setInvoiceNumber(purchaseLedger.getPurchaseContractNumber()); | 
 |  |  |         accountExpense.setInputTime(new Date()); | 
 |  |  |         accountExpense.setInputUser(loginUser.getNickName()); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         // 3. æ°å¢ææ´æ°ä¸»è¡¨ | 
 |  |  |         if (purchaseLedger.getId() == null) { | 
 |  |  |             purchaseLedgerMapper.insert(purchaseLedger); | 
 |  |  | //            accountIncomeService.save(accountIncome); | 
 |  |  |             accountExpenseService.save(accountExpense); | 
 |  |  |         } else { | 
 |  |  |             purchaseLedgerMapper.updateById(purchaseLedger); | 
 |  |  |             PurchaseLedger purchaseLedgerDB = purchaseLedgerMapper.selectById(purchaseLedger.getId()); | 
 |  |  |             AccountExpense accountExpenseDB = accountExpenseService.getByInvoiceNumber(purchaseLedger.getPurchaseContractNumber()); | 
 |  |  |             if (ObjectUtils.isEmpty(accountExpenseDB)) { | 
 |  |  |                 throw new BaseException("æ¯åºç®¡çæ è¯¥éè´ååçæ¯åºè®°å½"); | 
 |  |  |             } | 
 |  |  |             accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate()); | 
 |  |  |             accountExpenseDB.setExpenseType("0"); | 
 |  |  |             accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName()); | 
 |  |  |             accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount()); | 
 |  |  |             accountExpenseDB.setExpenseDescribed("éè´ååï¼" + purchaseLedgerDB.getPurchaseContractNumber()); | 
 |  |  |             accountExpenseDB.setExpenseMethod("0"); | 
 |  |  |             accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber()); | 
 |  |  |             accountExpenseService.updateById(accountExpenseDB); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 4. å¤çåè¡¨æ°æ® | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.common.utils.OrderUtils; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.sales.mapper.PaymentShippingMapper; | 
 |  |  | import com.ruoyi.sales.pojo.PaymentShipping; | 
 |  |  | import com.ruoyi.sales.service.PaymentShippingService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 14:02 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/paymentShipping") | 
 |  |  | @Api(tags = "æ¯ä»ä¸å货管ç") | 
 |  |  | public class PaymentShippingController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private PaymentShippingService paymentShippingService; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private PaymentShippingMapper paymentShippingMapper; | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("å页æ¥è¯¢æ¯ä»ä¸åè´§ä¿¡æ¯") | 
 |  |  |     public AjaxResult listPage(Page page, PaymentShipping paymentShipping) { | 
 |  |  |         IPage<PaymentShipping> listPage = paymentShippingService.listPage(page, paymentShipping); | 
 |  |  |         return AjaxResult.success(listPage); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("æ·»å æ¯ä»ä¸åè´§ä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult add(@RequestBody PaymentShipping paymentShipping) { | 
 |  |  |         String ord = OrderUtils.countTodayByCreateTime(paymentShippingMapper, "ORD"); | 
 |  |  |         paymentShipping.setOrderNo(ord); | 
 |  |  |         boolean save = paymentShippingService.save(paymentShipping); | 
 |  |  |         return save ? success() : error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("ä¿®æ¹æ¯ä»ä¸åè´§ä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult update(@RequestBody PaymentShipping paymentShipping) { | 
 |  |  |         boolean update = paymentShippingService.updateById(paymentShipping); | 
 |  |  |         return update ? success() : error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/delete") | 
 |  |  |     @ApiOperation("å é¤æ¯ä»ä¸åè´§ä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult delete(@RequestBody List<Long> ids){ | 
 |  |  |         if (CollectionUtils.isEmpty(ids)){ | 
 |  |  |             return AjaxResult.error("请传å
¥è¦å é¤çID"); | 
 |  |  |         } | 
 |  |  |         return AjaxResult.success(paymentShippingService.removeByIds(ids)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | package com.ruoyi.sales.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | 
 |  |  | import com.ruoyi.sales.dto.InvoiceLedgerDto; | 
 |  |  | import com.ruoyi.sales.dto.SalesLedgerDto; | 
 |  |  | import com.ruoyi.sales.mapper.InvoiceLedgerMapper; | 
 |  |  | import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; | 
 |  |  | import com.ruoyi.sales.mapper.ReceiptPaymentMapper; | 
 |  |  | import com.ruoyi.sales.pojo.InvoiceLedger; | 
 |  |  | import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; | 
 |  |  | import com.ruoyi.sales.pojo.ReceiptPayment; | 
 |  |  | import com.ruoyi.sales.pojo.SalesLedger; | 
 |  |  | import com.ruoyi.sales.service.ICommonFileService; | 
 |  |  | import com.ruoyi.sales.service.ISalesLedgerService; | 
 |  |  | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.Objects; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InvoiceLedgerMapper invoiceLedgerMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ReceiptPaymentMapper receiptPaymentMapper; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * æ¥è¯¢éå®å°è´¦å表 | 
 |  |  |      */ | 
 |  |  | 
 |  |  |                 if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) { | 
 |  |  |                     BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal()); | 
 |  |  |                     salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return getDataTable(list); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |             iPage.setTotal(iPage.getRecords().size()); | 
 |  |  |             return iPage; | 
 |  |  |         } | 
 |  |  |         // è®¡ç®å款éé¢ï¼å¾
忬¾éé¢ | 
 |  |  |         List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>() | 
 |  |  |                 .in(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerIds)); | 
 |  |  |  | 
 |  |  |         List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(new LambdaQueryWrapper<InvoiceLedger>() | 
 |  |  |                 .in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList()))); | 
 |  |  |         List<ReceiptPayment> receiptPayments = new ArrayList<>(); | 
 |  |  |         if(!CollectionUtils.isEmpty(invoiceLedgers)){ | 
 |  |  |             receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>() | 
 |  |  |                     .in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList()))); | 
 |  |  |         } | 
 |  |  |         for (SalesLedger salesLedger : iPage.getRecords()) { | 
 |  |  |             boolean existFlag = false; | 
 |  |  |             BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO; | 
 |  |  | 
 |  |  |                     noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal()); | 
 |  |  |                     invoiceTotal = invoiceLedgerDto.getInvoiceTotal(); | 
 |  |  |                     existFlag = true; | 
 |  |  |                     if(!CollectionUtils.isEmpty(receiptPayments)){ | 
 |  |  |                         List<InvoiceRegistrationProduct> collect = invoiceRegistrationProducts.stream() | 
 |  |  |                                 .filter(item -> salesLedger.getId().equals(Long.parseLong(item.getSalesLedgerId().toString()))) | 
 |  |  |                                 .collect(Collectors.toList()); | 
 |  |  |                         List<Integer> collect1 = collect.stream() | 
 |  |  |                                 .map(InvoiceRegistrationProduct::getId).collect(Collectors.toList()); | 
 |  |  |                         List<InvoiceLedger> collect2 = invoiceLedgers.stream() | 
 |  |  |                                 .filter(item -> collect1.contains(item.getInvoiceRegistrationProductId())) | 
 |  |  |                                 .collect(Collectors.toList()); | 
 |  |  |                         // è·å已忬¾éé¢ | 
 |  |  |                         List<ReceiptPayment> collect3 = receiptPayments.stream() | 
 |  |  |                                 .filter(item -> collect2.stream().anyMatch(item1 -> item1.getId().equals(item.getInvoiceLedgerId()))) | 
 |  |  |                                 .collect(Collectors.toList()); | 
 |  |  |                         BigDecimal receiptPaymentAmountTotal = collect3.stream().map(ReceiptPayment::getReceiptPaymentAmount) | 
 |  |  |                                 .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); | 
 |  |  |                         // è·åå¾
忬¾éé¢ | 
 |  |  |                         BigDecimal noReceiptPaymentAmountTotal = invoiceLedgerDto.getInvoiceTotal().subtract(receiptPaymentAmountTotal); | 
 |  |  |                         salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal); | 
 |  |  |                         salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal); | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.controller; | 
 |  |  |  | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.sales.dto.SalesQuotationDto; | 
 |  |  | import com.ruoyi.sales.service.SalesQuotationService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/sales/quotation") | 
 |  |  | public class SalesQuotationController { | 
 |  |  |     @Autowired | 
 |  |  |     private SalesQuotationService salesQuotationService; | 
 |  |  |     @GetMapping("/list") | 
 |  |  |     public AjaxResult getList(Page page, SalesQuotationDto salesQuotationDto) { | 
 |  |  |         return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto)); | 
 |  |  |     } | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) { | 
 |  |  |         return AjaxResult.success(salesQuotationService.add(salesQuotationDto)); | 
 |  |  |     } | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) { | 
 |  |  |         return AjaxResult.success(salesQuotationService.edit(salesQuotationDto)); | 
 |  |  |     } | 
 |  |  |     @DeleteMapping("/delete") | 
 |  |  |     public AjaxResult delete(@RequestBody Long id) { | 
 |  |  |         return AjaxResult.success(salesQuotationService.delete(id)); | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.sales.dto.InvoiceLedgerDto; | 
 |  |  | import com.ruoyi.sales.pojo.SalespersonManagement; | 
 |  |  | import com.ruoyi.sales.service.SalespersonManagementService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 10:04 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/salespersonManagement") | 
 |  |  | @Api(tags = "ä¸å¡å管ç") | 
 |  |  | public class SalespersonManagementController extends BaseController { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SalespersonManagementService salespersonManagementService; | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("å页æ¥è¯¢ä¸å¡åä¿¡æ¯") | 
 |  |  |     public AjaxResult listPage(Page page, SalespersonManagement salespersonManagement) { | 
 |  |  |         IPage<SalespersonManagement> listPage = salespersonManagementService.listPage(page, salespersonManagement); | 
 |  |  |         return AjaxResult.success(listPage); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("æ·»å ä¸å¡åä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult add(@RequestBody SalespersonManagement salespersonManagement) { | 
 |  |  |         boolean save = salespersonManagementService.save(salespersonManagement); | 
 |  |  |         return save ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("ä¿®æ¹ä¸å¡åä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult update(@RequestBody SalespersonManagement salespersonManagement) { | 
 |  |  |         boolean update = salespersonManagementService.updateById(salespersonManagement); | 
 |  |  |         return update ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/delete") | 
 |  |  |     @ApiOperation("å é¤ä¸å¡åä¿¡æ¯") | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  |     public AjaxResult delete(@RequestBody List<Long> ids) { | 
 |  |  |         if (ids == null || ids.isEmpty()) { | 
 |  |  |             return AjaxResult.error("请传å
¥è¦å é¤çID"); | 
 |  |  |         } | 
 |  |  |         boolean delete = salespersonManagementService.removeByIds(ids); | 
 |  |  |         return delete ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.controller; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.common.utils.poi.ExcelUtil; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Log; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; | 
 |  |  | import com.ruoyi.framework.web.controller.BaseController; | 
 |  |  | import com.ruoyi.framework.web.domain.AjaxResult; | 
 |  |  | import com.ruoyi.sales.mapper.ShippingInfoMapper; | 
 |  |  | import com.ruoyi.sales.pojo.SalesLedger; | 
 |  |  | import com.ruoyi.sales.pojo.ShippingInfo; | 
 |  |  | import com.ruoyi.sales.service.ShippingInfoService; | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/10/22 9:34 | 
 |  |  |  */ | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/shippingInfo") | 
 |  |  | @Api(tags = "åè´§ä¿¡æ¯ç®¡ç") | 
 |  |  | public class ShippingInfoController extends BaseController { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ShippingInfoService shippingInfoService; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @GetMapping("/listPage") | 
 |  |  |     @ApiOperation("åè´§ä¿¡æ¯å表") | 
 |  |  |     public AjaxResult listPage(Page page, ShippingInfo req) { | 
 |  |  |         IPage<ShippingInfo> listPage = shippingInfoService.listPage(page,req); | 
 |  |  |         return AjaxResult.success(listPage); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("æ·»å åè´§ä¿¡æ¯") | 
 |  |  |     public AjaxResult add(@RequestBody ShippingInfo req) { | 
 |  |  |         boolean save = shippingInfoService.save(req); | 
 |  |  |         return save ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/update") | 
 |  |  |     @ApiOperation("ä¿®æ¹åè´§ä¿¡æ¯") | 
 |  |  |     public AjaxResult update(@RequestBody ShippingInfo req) { | 
 |  |  |         ShippingInfo byId = shippingInfoService.getById(req.getId()); | 
 |  |  |         if (byId == null) { | 
 |  |  |             return AjaxResult.error("åè´§ä¿¡æ¯ä¸åå¨"); | 
 |  |  |         } | 
 |  |  |         Long userId = getLoginUser().getUserId(); | 
 |  |  |         if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){ | 
 |  |  |             return AjaxResult.error("æ¨æ²¡ææéä¿®æ¹æ¤åè´§ä¿¡æ¯"); | 
 |  |  |         } | 
 |  |  |         boolean update = shippingInfoService.updateById(req); | 
 |  |  |         return update ? AjaxResult.success() : AjaxResult.error(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @DeleteMapping("/delete") | 
 |  |  |     @ApiOperation("å é¤åè´§ä¿¡æ¯") | 
 |  |  |     public AjaxResult delete(@RequestBody List<Long> ids) { | 
 |  |  |         Long userId = getLoginUser().getUserId(); | 
 |  |  |         ids.forEach(id -> { | 
 |  |  |             ShippingInfo byId = shippingInfoService.getById(id); | 
 |  |  |             if (byId == null) { | 
 |  |  |                 throw new RuntimeException("åè´§ä¿¡æ¯ä¸åå¨"); | 
 |  |  |             } | 
 |  |  |             if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){ | 
 |  |  |                 throw new RuntimeException("æ¨æ²¡ææéå é¤æ¤åè´§ä¿¡æ¯"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         boolean delete = shippingInfoService.removeBatchByIds(ids); | 
 |  |  |         return delete ? AjaxResult.success("å é¤æå") : AjaxResult.error("å é¤å¤±è´¥"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ShippingInfoMapper shippingInfoMapper; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¯¼åºåè´§ä¿¡æ¯ç®¡ç | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/export") | 
 |  |  |     @ApiOperation("导åºåè´§ä¿¡æ¯") | 
 |  |  |     public void export(HttpServletResponse response) { | 
 |  |  |         List<ShippingInfo> list = shippingInfoMapper.listAll(); | 
 |  |  |         ExcelUtil<ShippingInfo> util = new ExcelUtil<ShippingInfo>(ShippingInfo.class); | 
 |  |  |         util.exportExcel(response, list, "åè´§ä¿¡æ¯"); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  | package com.ruoyi.sales.dto; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.TableField; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import com.ruoyi.sales.pojo.ReceiptPayment; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class ReceiptPaymentDto extends ReceiptPayment { | 
 |  |  | 
 |  |  |     @Excel(name = "客æ·åç§°") | 
 |  |  |     private String customerName; | 
 |  |  |  | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @Excel(name = "å¼ç¥¨æ¥æ",width = 30,dateFormat = "yyyy-MM-dd") | 
 |  |  |     @ApiModelProperty(value = "å¼ç¥¨æ¥æ") | 
 |  |  |     private Date invoiceDate; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     private String invoiceDateStart; | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     private String invoiceDateEnd; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æ¥è¯¢ææ¬") | 
 |  |  |     private String searchText; | 
 |  |  |  | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.dto; | 
 |  |  |  | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotation; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotationProduct; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | public class SalesQuotationDto extends SalesQuotation { | 
 |  |  |     @ApiModelProperty(value = "æ¥ä»·åå") | 
 |  |  |     private List<SalesQuotationProduct> products; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.sales.pojo.PaymentShipping; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 14:00 | 
 |  |  |  */ | 
 |  |  | public interface PaymentShippingMapper extends BaseMapper<PaymentShipping> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å页æ¥è¯¢ | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param paymentShipping | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<PaymentShipping> listPage(Page page,@Param("req") PaymentShipping paymentShipping); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |      * @param receiptPaymentDto | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<ReceiptPaymentDto> bindInvoiceNoRegPage(Page page, @Param("c") ReceiptPaymentDto receiptPaymentDto); | 
 |  |  |     IPage<ReceiptPaymentDto> bindInvoiceNoRegPage(Page page, @Param("req") ReceiptPaymentDto receiptPaymentDto); | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å¼ç¥¨å°è´¦è¯¦æ
 | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.ruoyi.sales.dto.SalesQuotationDto; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotation; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  | import org.springframework.data.repository.query.Param; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | public interface SalesQuotationMapper extends BaseMapper<SalesQuotation> { | 
 |  |  |     IPage<SalesQuotationDto> listPage(Page page,@Param("salesQuotationDto") SalesQuotationDto salesQuotationDto); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.mapper; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotationProduct; | 
 |  |  | import io.lettuce.core.dynamic.annotation.Param; | 
 |  |  | import org.apache.ibatis.annotations.Mapper; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | @Mapper | 
 |  |  | public interface SalesQuotationProductMapper extends BaseMapper<SalesQuotationProduct> { | 
 |  |  | //    List<SalesQuotationProduct> selectBySalesQuotationIds(List<Long> salesQuotationIds); | 
 |  |  |  | 
 |  |  |     List<SalesQuotationProduct> selectBySalesQuotationId(@Param("id") Long id); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.sales.pojo.SalespersonManagement; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 10:12 | 
 |  |  |  */ | 
 |  |  | public interface SalespersonManagementMapper extends BaseMapper<SalespersonManagement> { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     IPage<SalespersonManagement> listPage(Page page,@Param("req") SalespersonManagement salespersonManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.mapper; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.ruoyi.sales.pojo.ShippingInfo; | 
 |  |  | import org.apache.ibatis.annotations.Param; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/10/22 9:32 | 
 |  |  |  */ | 
 |  |  | public interface ShippingInfoMapper extends BaseMapper<ShippingInfo> { | 
 |  |  |     IPage<ShippingInfo> listPage(Page page,@Param("req") ShippingInfo req); | 
 |  |  |  | 
 |  |  |     List<ShippingInfo> listAll(); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 13:56 | 
 |  |  |  */ | 
 |  |  | @TableName(value = "payment_shipping") | 
 |  |  | @Data | 
 |  |  | @ApiModel | 
 |  |  | public class PaymentShipping { | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "订åå·") | 
 |  |  |     private String orderNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "客æ·åç§°") | 
 |  |  |     private String customer; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "订åéé¢") | 
 |  |  |     private String orderAmount; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "已仿¬¾éé¢") | 
 |  |  |     private String paidAmount; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "仿¬¾æ¹å¼") | 
 |  |  |     private String paymentMethod; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "仿¬¾ç¶æ") | 
 |  |  |     private String paymentStatus; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åè´§ç¶æ") | 
 |  |  |     private String shippingStatus; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åè´§æ¥æ") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private Date shippingDate; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç©æµåå·") | 
 |  |  |     private String trackingNo; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remark; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
 |  |  | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "æªå¼ç¥¨éé¢(å
)") | 
 |  |  |     private BigDecimal noInvoiceAmountTotal; | 
 |  |  |     private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¾è®¢æ¥æ") | 
 |  |  |     private LocalDate executionDate; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "å·²å¼ç¥¨éé¢(å
)") | 
 |  |  |     private BigDecimal invoiceTotal; | 
 |  |  |     private BigDecimal invoiceTotal = BigDecimal.ZERO; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "忬¾éé¢") | 
 |  |  |     private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "å¾
忬¾éé¢") | 
 |  |  |     private BigDecimal noReceiptAmount = BigDecimal.ZERO; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "仿¬¾æ¹å¼") | 
 |  |  |     private String paymentMethod; | 
 
 |  |  | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "æ°é") | 
 |  |  |     private BigDecimal quantity; | 
 |  |  |  | 
 |  |  |     @Excel(name = "æä½åºåæ°é") | 
 |  |  |     private BigDecimal minStock; | 
 |  |  |     /** | 
 |  |  |      * ç¨ç | 
 |  |  |      */ | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @TableName("sales_quotation") | 
 |  |  | public class SalesQuotation { | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |     @ApiModelProperty(value = "æ¥ä»·åç¼å·") | 
 |  |  |     private String quotationNo; | 
 |  |  |     @ApiModelProperty(value = "客æ·åç§°") | 
 |  |  |     private String customer; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¸å¡å") | 
 |  |  |     private String salesperson; | 
 |  |  |     @ApiModelProperty(value = "æ¥ä»·æ¥æ") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate quotationDate; | 
 |  |  |     @ApiModelProperty(value = "æææè³") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private LocalDate validDate; | 
 |  |  |     @ApiModelProperty(value = "仿¬¾æ¹å¼") | 
 |  |  |     private String paymentMethod; | 
 |  |  |     @ApiModelProperty(value = "äº¤è´§å¨æå¤©æ°") | 
 |  |  |     private String deliveryPeriod; | 
 |  |  |     @ApiModelProperty(value = "ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |     @ApiModelProperty(value = "æ¥ä»·æ»éé¢") | 
 |  |  |     private Double totalAmount; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "夿³¨") | 
 |  |  |     private String remark; | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  |  | 
 |  |  | @Data | 
 |  |  | @TableName("sales_quotation_product") | 
 |  |  | public class SalesQuotationProduct { | 
 |  |  |     @ApiModelProperty(value = "æ¥ä»·ååID") | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |     @ApiModelProperty(value = "é宿¥ä»·åid") | 
 |  |  |     private Long salesQuotationId; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åååç§°") | 
 |  |  |     private String product; | 
 |  |  |     @ApiModelProperty(value = "ååè§æ ¼") | 
 |  |  |     private String specification; | 
 |  |  |     @ApiModelProperty(value = "åä½") | 
 |  |  |     private String unit; | 
 |  |  |     @ApiModelProperty(value = "åä»·") | 
 |  |  |     private Double unitPrice; | 
 |  |  |     @ApiModelProperty(value = "æ°é") | 
 |  |  |     private Integer quantity; | 
 |  |  |     @ApiModelProperty(value = "éé¢") | 
 |  |  |     private Double amount; | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import io.swagger.annotations.ApiModel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.math.BigDecimal; | 
 |  |  | import java.time.LocalDate; | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 10:06 | 
 |  |  |  */ | 
 |  |  | @TableName(value = "salesperson_management") | 
 |  |  | @Data | 
 |  |  | @ApiModel | 
 |  |  | public class SalespersonManagement { | 
 |  |  |  | 
 |  |  |     private static final long serialVersionUID = 1L; | 
 |  |  |     /** | 
 |  |  |      * åºå· | 
 |  |  |      */ | 
 |  |  |     @TableId(type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å§å") | 
 |  |  |     private String name; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "èç³»çµè¯") | 
 |  |  |     private String phone; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "é®ç®±") | 
 |  |  |     private String email; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "é¨é¨") | 
 |  |  |     private String department; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "èä½") | 
 |  |  |     private String position; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å
¥èæ¥æ") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     private Date hireDate; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æé") | 
 |  |  |     private String permissions; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "æéList") | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     private List<String> permissionsList; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç¶æ") | 
 |  |  |     private String status; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.pojo; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.annotation.*; | 
 |  |  | import com.fasterxml.jackson.annotation.JsonFormat; | 
 |  |  | import com.ruoyi.framework.aspectj.lang.annotation.Excel; | 
 |  |  | import io.swagger.annotations.ApiModelProperty; | 
 |  |  | import lombok.Data; | 
 |  |  | import org.springframework.format.annotation.DateTimeFormat; | 
 |  |  |  | 
 |  |  | import java.time.LocalDateTime; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/10/22 9:29 | 
 |  |  |  */ | 
 |  |  | @Data | 
 |  |  | @TableName("shipping_info") | 
 |  |  | public class ShippingInfo { | 
 |  |  |  | 
 |  |  |     @TableId(value = "id", type = IdType.AUTO) | 
 |  |  |     private Long id; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "éå®å°è´¦id") | 
 |  |  |     private Long salesLedgerId; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "éå®ååå·") | 
 |  |  |     @Excel(name = "éå®ååå·") | 
 |  |  |     private String salesContractNo; | 
 |  |  |  | 
 |  |  |     @TableField(exist = false) | 
 |  |  |     @ApiModelProperty(value = "客æ·åç§°") | 
 |  |  |     @Excel(name = "客æ·åç§°") | 
 |  |  |     private String customerName; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åè´§æ¥æ") | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @DateTimeFormat(pattern = "yyyy-MM-dd") | 
 |  |  |     @Excel(name = "åè´§æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") | 
 |  |  |     private Date shippingDate; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å货车çå·") | 
 |  |  |     @Excel(name = "å货车çå·") | 
 |  |  |     private String shippingCarNumber; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "å建æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private LocalDateTime createTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹æ¶é´") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private LocalDateTime updateTime; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "åå»ºç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | 
 |  |  |     private Integer createUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") | 
 |  |  |     @TableField(fill = FieldFill.INSERT_UPDATE) | 
 |  |  |     private Integer updateUser; | 
 |  |  |  | 
 |  |  |     @ApiModelProperty(value = "ç§æ·ID") | 
 |  |  |     @TableField(fill = FieldFill.INSERT) | 
 |  |  |     private Long tenantId; | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.sales.pojo.PaymentShipping; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 14:01 | 
 |  |  |  */ | 
 |  |  | public interface PaymentShippingService extends IService<PaymentShipping> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å页æ¥è¯¢ | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param paymentShipping | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<PaymentShipping> listPage(Page page, PaymentShipping paymentShipping); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotationProduct; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | public interface SalesQuotationProductService extends IService<SalesQuotationProduct> { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.sales.dto.SalesQuotationDto; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotation; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  |  | 
 |  |  | public interface SalesQuotationService extends IService<SalesQuotation> { | 
 |  |  |     IPage listPage(Page page, SalesQuotationDto salesQuotationDto); | 
 |  |  |  | 
 |  |  |     boolean add(SalesQuotationDto salesQuotationDto); | 
 |  |  |  | 
 |  |  |     boolean delete(Long id); | 
 |  |  |  | 
 |  |  |     boolean edit(SalesQuotationDto salesQuotationDto); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.sales.pojo.SalespersonManagement; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 10:14 | 
 |  |  |  */ | 
 |  |  | public interface SalespersonManagementService extends IService<SalespersonManagement> { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * å表å页 | 
 |  |  |      * | 
 |  |  |      * @param page | 
 |  |  |      * @param salespersonManagement | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     IPage<SalespersonManagement> listPage(Page page, SalespersonManagement salespersonManagement); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.IService; | 
 |  |  | import com.ruoyi.sales.pojo.ShippingInfo; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/10/22 9:33 | 
 |  |  |  */ | 
 |  |  | public interface ShippingInfoService extends IService<ShippingInfo>{ | 
 |  |  |     IPage<ShippingInfo> listPage(Page page, ShippingInfo req); | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.sales.mapper.PaymentShippingMapper; | 
 |  |  | import com.ruoyi.sales.pojo.PaymentShipping; | 
 |  |  | import com.ruoyi.sales.service.PaymentShippingService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 14:01 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class PaymentShippingServiceImpl extends ServiceImpl<PaymentShippingMapper, PaymentShipping> implements PaymentShippingService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private PaymentShippingMapper paymentShippingMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<PaymentShipping> listPage(Page page, PaymentShipping paymentShipping) { | 
 |  |  |         IPage<PaymentShipping> listPage = paymentShippingMapper.listPage(page, paymentShipping); | 
 |  |  |         return listPage; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.account.pojo.AccountExpense; | 
 |  |  | import com.ruoyi.account.pojo.AccountIncome; | 
 |  |  | import com.ruoyi.account.service.AccountIncomeService; | 
 |  |  | import com.ruoyi.basic.mapper.CustomerMapper; | 
 |  |  | import com.ruoyi.basic.pojo.Customer; | 
 |  |  | import com.ruoyi.common.enums.FileNameType; | 
 |  |  | 
 |  |  | @RequiredArgsConstructor | 
 |  |  | @Slf4j | 
 |  |  | public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService { | 
 |  |  |     private final AccountIncomeService accountIncomeService; | 
 |  |  |  | 
 |  |  |     private final SalesLedgerMapper salesLedgerMapper; | 
 |  |  |  | 
 |  |  | 
 |  |  |             salesLedger.setCustomerName(customer.getCustomerName()); | 
 |  |  |             salesLedger.setTenantId(customer.getTenantId()); | 
 |  |  |  | 
 |  |  |             AccountIncome accountIncome = new AccountIncome(); | 
 |  |  |             accountIncome.setIncomeDate(salesLedger.getEntryDate()); | 
 |  |  |             accountIncome.setIncomeType("0"); | 
 |  |  |             accountIncome.setCustomerName(customer.getCustomerName()); | 
 |  |  |             accountIncome.setIncomeMoney(salesLedger.getContractAmount()); | 
 |  |  |             accountIncome.setIncomeMethod("0"); | 
 |  |  |             accountIncome.setInputTime(new Date()); | 
 |  |  |             accountIncome.setInputUser(salesLedger.getEntryPerson()); | 
 |  |  |             // 3. æ°å¢ææ´æ°ä¸»è¡¨ | 
 |  |  |             if (salesLedger.getId() == null) { | 
 |  |  |                 String contractNo = generateSalesContractNo(); | 
 |  |  |                 salesLedger.setSalesContractNo(contractNo); | 
 |  |  |                 salesLedgerMapper.insert(salesLedger); | 
 |  |  |                 accountIncome.setIncomeDescribed("éå®ååï¼" + salesLedger.getSalesContractNo()); | 
 |  |  |                 accountIncome.setInvoiceNumber(salesLedger.getSalesContractNo()); | 
 |  |  |                 accountIncomeService.save(accountIncome); | 
 |  |  |             } else { | 
 |  |  |                 salesLedgerMapper.updateById(salesLedger); | 
 |  |  |                 SalesLedger salesLedgerDB = salesLedgerMapper.selectById(salesLedger.getId()); | 
 |  |  |                 AccountIncome accountIncomeDB = accountIncomeService.getByInvoiceNumber(salesLedger.getSalesContractNo()); | 
 |  |  |                 if (ObjectUtils.isEmpty(accountIncomeDB)) { | 
 |  |  |                     throw new BaseException("æ¶å
¥ç®¡çæ è¯¥éå®ååçæ¶å
¥è®°å½"); | 
 |  |  |                 } | 
 |  |  |                 accountIncomeDB.setCustomerName(salesLedgerDB.getCustomerName()); | 
 |  |  |                 accountIncomeDB.setIncomeMoney(salesLedgerDB.getContractAmount()); | 
 |  |  |                 accountIncomeDB.setIncomeDescribed("éå®ååï¼" + salesLedgerDB.getSalesContractNo()); | 
 |  |  |                 accountIncomeDB.setInvoiceNumber(salesLedgerDB.getSalesContractNo()); | 
 |  |  |                 accountIncomeDB.setInputTime(new Date()); | 
 |  |  |                 accountIncomeDB.setInputUser(salesLedgerDB.getEntryPerson()); | 
 |  |  |                 accountIncomeService.updateById(accountIncomeDB); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // 4. å¤çåè¡¨æ°æ® | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.sales.mapper.SalesQuotationProductMapper; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotationProduct; | 
 |  |  | import com.ruoyi.sales.service.SalesQuotationProductService; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | public class SalesQuotationProductServiceImpl extends ServiceImpl<SalesQuotationProductMapper, SalesQuotationProduct> implements SalesQuotationProductService { | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service.impl; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  |  | 
 |  |  | import com.ruoyi.common.utils.bean.BeanUtils; | 
 |  |  | import com.ruoyi.sales.dto.SalesQuotationDto; | 
 |  |  | import com.ruoyi.sales.mapper.SalesQuotationMapper; | 
 |  |  | import com.ruoyi.sales.mapper.SalesQuotationProductMapper; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotation; | 
 |  |  | import com.ruoyi.sales.pojo.SalesQuotationProduct; | 
 |  |  | import com.ruoyi.sales.service.SalesQuotationProductService; | 
 |  |  | import com.ruoyi.sales.service.SalesQuotationService; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.util.List; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | @Service | 
 |  |  | @Transactional(rollbackFor = Exception.class) | 
 |  |  | public class SalesQuotationServiceImpl extends ServiceImpl<SalesQuotationMapper, SalesQuotation> implements SalesQuotationService { | 
 |  |  |     @Autowired | 
 |  |  |     private SalesQuotationMapper salesQuotationMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private SalesQuotationProductMapper salesQuotationProductMapper; | 
 |  |  |     @Autowired | 
 |  |  |     private SalesQuotationProductService salesQuotationProductService; | 
 |  |  |     @Override | 
 |  |  |     public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) { | 
 |  |  |         IPage<SalesQuotationDto> salesQuotationDtoIPage = salesQuotationMapper.listPage(page, salesQuotationDto); | 
 |  |  |         if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){ | 
 |  |  |             return salesQuotationDtoIPage; | 
 |  |  |         } | 
 |  |  |         salesQuotationDtoIPage.getRecords().forEach(record -> { | 
 |  |  |             List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId()); | 
 |  |  |             record.setProducts(products); | 
 |  |  |         }); | 
 |  |  |         return salesQuotationDtoIPage; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean add(SalesQuotationDto salesQuotationDto) { | 
 |  |  |         SalesQuotation salesQuotation = new SalesQuotation(); | 
 |  |  |         BeanUtils.copyProperties(salesQuotationDto, salesQuotation); | 
 |  |  |         String quotationNo = salesQuotation.getQuotationNo(); | 
 |  |  |         salesQuotationMapper.insert(salesQuotation); | 
 |  |  | //        if(salesQuotationMapper.insert(salesQuotation)!=1){ | 
 |  |  | //            return false; | 
 |  |  | //        } | 
 |  |  |         if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){ | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> { | 
 |  |  |             SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct(); | 
 |  |  |             BeanUtils.copyProperties(product, salesQuotationProduct); | 
 |  |  |             salesQuotationProduct.setSalesQuotationId(salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>().eq(SalesQuotation::getQuotationNo, quotationNo)).getId()); | 
 |  |  |             return salesQuotationProduct; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |         salesQuotationProductService.saveBatch(products); | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     @Override | 
 |  |  |     public boolean edit(SalesQuotationDto salesQuotationDto) { | 
 |  |  |         SalesQuotation salesQuotation = new SalesQuotation(); | 
 |  |  |         BeanUtils.copyProperties(salesQuotationDto, salesQuotation); | 
 |  |  |         if(salesQuotationMapper.updateById(salesQuotation)!=1){ | 
 |  |  |             return false; | 
 |  |  |         } | 
 |  |  |         salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, salesQuotationDto.getId())); | 
 |  |  |         if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){ | 
 |  |  |             return true; | 
 |  |  |         } | 
 |  |  |         List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> { | 
 |  |  |             SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct(); | 
 |  |  |             BeanUtils.copyProperties(product, salesQuotationProduct); | 
 |  |  |             salesQuotationProduct.setSalesQuotationId(salesQuotation.getId()); | 
 |  |  |             return salesQuotationProduct; | 
 |  |  |         }).collect(Collectors.toList()); | 
 |  |  |         salesQuotationProductService.saveBatch(products); | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |     @Override | 
 |  |  |     public boolean delete(Long id) { | 
 |  |  |         salesQuotationMapper.deleteById(id); | 
 |  |  |         salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, id)); | 
 |  |  |         return true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.common.utils.StringUtils; | 
 |  |  | import com.ruoyi.sales.mapper.SalespersonManagementMapper; | 
 |  |  | import com.ruoyi.sales.pojo.SalespersonManagement; | 
 |  |  | import com.ruoyi.sales.service.SalespersonManagementService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | import java.util.Arrays; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/9/15 10:15 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class SalespersonManagementServiceImpl extends ServiceImpl<SalespersonManagementMapper, SalespersonManagement> implements SalespersonManagementService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SalespersonManagementMapper salespersonManagementMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<SalespersonManagement> listPage(Page page, SalespersonManagement salespersonManagement) { | 
 |  |  |         IPage<SalespersonManagement> salespersonManagementIPage = salespersonManagementMapper.listPage(page, salespersonManagement); | 
 |  |  |         salespersonManagementIPage.getRecords().forEach(item -> { | 
 |  |  |             if(!StringUtils.isEmpty(item.getPermissions())){ | 
 |  |  |                 item.setPermissionsList(Arrays.asList(item.getPermissions().split(","))); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |         return salespersonManagementIPage; | 
 |  |  |     } | 
 |  |  | } | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | package com.ruoyi.sales.service.impl; | 
 |  |  |  | 
 |  |  | import com.baomidou.mybatisplus.core.metadata.IPage; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
 |  |  | import com.ruoyi.sales.mapper.ShippingInfoMapper; | 
 |  |  | import com.ruoyi.sales.pojo.ShippingInfo; | 
 |  |  | import com.ruoyi.sales.service.ShippingInfoService; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author :yys | 
 |  |  |  * @date : 2025/10/22 9:33 | 
 |  |  |  */ | 
 |  |  | @Service | 
 |  |  | @Slf4j | 
 |  |  | public class ShippingInfoServiceImpl extends ServiceImpl<ShippingInfoMapper, ShippingInfo> implements ShippingInfoService { | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ShippingInfoMapper shippingInfoMapper; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public IPage<ShippingInfo> listPage(Page page, ShippingInfo req) { | 
 |  |  |         IPage<ShippingInfo> listPage = shippingInfoMapper.listPage(page, req); | 
 |  |  |  | 
 |  |  |         return listPage; | 
 |  |  |     } | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     private Integer staffState; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * è¯ç¨æï¼æï¼ | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "è¯ç¨æï¼æï¼") | 
 |  |  |     private Integer probationPeriod; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * åå·¥ç¼å· | 
 |  |  |      */ | 
 |  |  |     @Excel(name = "åå·¥ç¼å·") | 
 
 |  |  | 
 |  |  |     public AjaxResult listPageReturn(Page page, DocumentationReturnManagement documentationReturnManagement) { | 
 |  |  |         return AjaxResult.success(documentationReturnManagementMapper.listPage(page, documentationReturnManagement)); | 
 |  |  |     } | 
 |  |  |     @GetMapping("/getByDocumentationId/{id}") | 
 |  |  |     @ApiOperation("æ ¹æ®ä¹¦ç±idæ¥è¯¢åé
è®°å½") | 
 |  |  |     @Log(title = "æ ¹æ®ä¹¦ç±idæ¥è¯¢åé
è®°å½", businessType = BusinessType.OTHER) | 
 |  |  |     public AjaxResult getByDocumentationId(@PathVariable Long id) { | 
 |  |  |         return AjaxResult.success(documentationBorrowManagementService.selectByDocumentationId(id)); | 
 |  |  |     } | 
 |  |  |     @PostMapping("/add") | 
 |  |  |     @ApiOperation("ææ¡£åé
管ç-åé
") | 
 |  |  |     @Log(title = "ææ¡£åé
管ç-åé
", businessType = BusinessType.INSERT) | 
 
 |  |  | 
 |  |  |     void exportrevent(HttpServletResponse response, DocumentationReturnManagement documentationReturnManagement); | 
 |  |  |  | 
 |  |  |     List<DocumentationBorrowManagementDto> listAll(); | 
 |  |  |  | 
 |  |  |     List<DocumentationBorrowManagementDto> selectByDocumentationId(Long id); | 
 |  |  | } | 
 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public List<DocumentationBorrowManagementDto> selectByDocumentationId(Long id) { | 
 |  |  |         List<DocumentationBorrowManagementDto> list = documentationBorrowManagementMapper.list(new LambdaQueryWrapper<DocumentationBorrowManagementDto>() | 
 |  |  |                 .eq(DocumentationBorrowManagementDto::getDocumentationId, id) | 
 |  |  |                 .eq(DocumentationBorrowManagementDto::getBorrowStatus, "åé
")); | 
 |  |  |         if (list.isEmpty()){ | 
 |  |  |             throw new RuntimeException("ææ¡£æªè¢«åé
"); | 
 |  |  |         } | 
 |  |  |         return list; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public boolean deleteByIds(List<Long> ids) { | 
 |  |  |         List<DocumentationBorrowManagement> list = documentationBorrowManagementMapper.selectList(new LambdaQueryWrapper<DocumentationBorrowManagement>().in(DocumentationBorrowManagement::getId, ids)); | 
 |  |  |         for (DocumentationBorrowManagement documentationBorrowManagement : list) { | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9096 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bdsm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 15 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9070 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-bhmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 11 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9088 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-cmny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 12 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
 |  |  | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  |   default-bucket: demo-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 
 |  |  | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.195:3306/product-inventory-management-dhdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         url: jdbc:mysql://192.168.1.8:3306/product-inventory-management-dhdc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: 123456 | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.195 | 
 |  |  |     host: 192.168.1.8 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9117 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbkj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 3 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9100 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hbxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 13 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9090 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 12 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9103 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hcmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 15 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9115 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsmy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 2 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9101 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hsxny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 12 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9098 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hxgy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 14 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 8088 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-hxsj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: hxsj@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 172.17.0.1 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 15 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
 |  |  | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.196:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-hysn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: 123456 | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.196 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9107 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jjxm?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 0 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9094 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jlsn?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 13 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9074 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: uploadPath | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-jsyny?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 12 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9111 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-mkzs?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 1 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9123 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-lqmsp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 6 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9104 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.0.182:3306/product-inventory-management-nydl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: HpencZdyK7WrtQvBUKnr | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.0.182 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 0 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9119 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-phmk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 4 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
 |  |  | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  |     host: 127.0.0.1 | 
 |  |  | #    host: localhost | 
 |  |  | #    host: 172.17.0.1 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 8090 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://172.17.0.1:3306/product-inventory-management-qlmc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: qlmc@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 172.17.0.1 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 15 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9121 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: bdsm-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.1.185:3306/product-inventory-management-tymk?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: xd@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.1.185 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6380 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 5 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | # é¡¹ç®ç¸å
³é
ç½® | 
 |  |  | ruoyi: | 
 |  |  |   # åç§° | 
 |  |  |   name: RuoYi | 
 |  |  |   # çæ¬ | 
 |  |  |   version: 3.8.9 | 
 |  |  |   # çæå¹´ä»½ | 
 |  |  |   copyrightYear: 2025 | 
 |  |  |   # æä»¶è·¯å¾ ç¤ºä¾ï¼ Windowsé
ç½®D:/ruoyi/uploadPathï¼Linuxé
ç½® /home/ruoyi/uploadPathï¼ | 
 |  |  |   profile: /javaWork/product-inventory-management/file | 
 |  |  |  | 
 |  |  |   # è·åipå°åå¼å
³ | 
 |  |  |   addressEnabled: false | 
 |  |  |   # éªè¯ç ç±»å math æ°å计箠char å符éªè¯ | 
 |  |  |   captchaType: math | 
 |  |  |  | 
 |  |  | # å¼åç¯å¢é
ç½® | 
 |  |  | server: | 
 |  |  |   # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 | 
 |  |  |   port: 9030 | 
 |  |  |   servlet: | 
 |  |  |     # åºç¨ç访é®è·¯å¾ | 
 |  |  |     context-path: / | 
 |  |  |   tomcat: | 
 |  |  |     # tomcatçURIç¼ç  | 
 |  |  |     uri-encoding: UTF-8 | 
 |  |  |     # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 | 
 |  |  |     accept-count: 1000 | 
 |  |  |     threads: | 
 |  |  |       # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 | 
 |  |  |       max: 800 | 
 |  |  |       # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 | 
 |  |  |       min-spare: 100 | 
 |  |  |  | 
 |  |  | # æ¥å¿é
ç½® | 
 |  |  | logging: | 
 |  |  |   level: | 
 |  |  |     com.ruoyi: warn | 
 |  |  |     org.springframework: warn | 
 |  |  |  | 
 |  |  | minio: | 
 |  |  |   endpoint: http://114.132.189.42/ | 
 |  |  |   port: 7019 | 
 |  |  |   secure: false | 
 |  |  |   accessKey: admin | 
 |  |  |   secretKey: 12345678 | 
 |  |  |   preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ | 
 |  |  |   default-bucket: demo-product | 
 |  |  | # ç¨æ·é
ç½® | 
 |  |  | user: | 
 |  |  |   password: | 
 |  |  |     # å¯ç æå¤§éè¯¯æ¬¡æ° | 
 |  |  |     maxRetryCount: 5 | 
 |  |  |     # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ | 
 |  |  |     lockTime: 10 | 
 |  |  |  | 
 |  |  | # Springé
ç½® | 
 |  |  | spring: | 
 |  |  |   datasource: | 
 |  |  |     type: com.alibaba.druid.pool.DruidDataSource | 
 |  |  |     driverClassName: com.mysql.cj.jdbc.Driver | 
 |  |  |     druid: | 
 |  |  |       # ä¸»åºæ°æ®æº | 
 |  |  |       master: | 
 |  |  |         url: jdbc:mysql://192.168.10.230:3306/product-inventory-management-zyrq?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 | 
 |  |  |         username: root | 
 |  |  |         password: zyrq@123456.. | 
 |  |  |       # ä»åºæ°æ®æº | 
 |  |  |       slave: | 
 |  |  |         # ä»æ°æ®æºå¼å
³/é»è®¤å
³é | 
 |  |  |         enabled: false | 
 |  |  |         url: | 
 |  |  |         username: | 
 |  |  |         password: | 
 |  |  |       # åå§è¿æ¥æ° | 
 |  |  |       initialSize: 5 | 
 |  |  |       # æå°è¿æ¥æ± æ°é | 
 |  |  |       minIdle: 10 | 
 |  |  |       # æå¤§è¿æ¥æ± æ°é | 
 |  |  |       maxActive: 20 | 
 |  |  |       # é
ç½®è·åè¿æ¥çå¾
è¶
æ¶çæ¶é´ | 
 |  |  |       maxWait: 60000 | 
 |  |  |       # é
ç½®è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |       connectTimeout: 30000 | 
 |  |  |       # é
ç½®ç½ç»è¶
æ¶æ¶é´ | 
 |  |  |       socketTimeout: 60000 | 
 |  |  |       # é
ç½®é´éå¤ä¹
æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å
³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ | 
 |  |  |       timeBetweenEvictionRunsMillis: 60000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå°çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       minEvictableIdleTimeMillis: 300000 | 
 |  |  |       # é
ç½®ä¸ä¸ªè¿æ¥å¨æ± ä¸æå¤§çåçæ¶é´ï¼å使¯æ¯«ç§ | 
 |  |  |       maxEvictableIdleTimeMillis: 900000 | 
 |  |  |       # é
ç½®æ£æµè¿æ¥æ¯å¦ææ | 
 |  |  |       validationQuery: SELECT 1 FROM DUAL | 
 |  |  |       testWhileIdle: true | 
 |  |  |       testOnBorrow: false | 
 |  |  |       testOnReturn: false | 
 |  |  |       webStatFilter: | 
 |  |  |         enabled: true | 
 |  |  |       statViewServlet: | 
 |  |  |         enabled: true | 
 |  |  |         # è®¾ç½®ç½ååï¼ä¸å¡«åå
许ææè®¿é® | 
 |  |  |         allow: | 
 |  |  |         url-pattern: /druid/* | 
 |  |  |         # æ§å¶å°ç®¡çç¨æ·ååå¯ç  | 
 |  |  |         login-username: ruoyi | 
 |  |  |         login-password: 123456 | 
 |  |  |       filter: | 
 |  |  |         stat: | 
 |  |  |           enabled: true | 
 |  |  |           # æ
¢SQLè®°å½ | 
 |  |  |           log-slow-sql: true | 
 |  |  |           slow-sql-millis: 1000 | 
 |  |  |           merge-sql: true | 
 |  |  |         wall: | 
 |  |  |           config: | 
 |  |  |             multi-statement-allow: true | 
 |  |  |   # èµæºä¿¡æ¯ | 
 |  |  |   messages: | 
 |  |  |     # å½é
åèµæºæä»¶è·¯å¾ | 
 |  |  |     basename: i18n/messages | 
 |  |  |   # æä»¶ä¸ä¼  | 
 |  |  |   servlet: | 
 |  |  |     multipart: | 
 |  |  |       # å个æä»¶å¤§å° | 
 |  |  |       max-file-size: 1GB | 
 |  |  |       # è®¾ç½®æ»ä¸ä¼ çæä»¶å¤§å° | 
 |  |  |       max-request-size: 2GB | 
 |  |  |   # æå¡æ¨¡å | 
 |  |  |   devtools: | 
 |  |  |     restart: | 
 |  |  |       # çé¨ç½²å¼å
³ | 
 |  |  |       enabled: false | 
 |  |  |   # redis é
ç½® | 
 |  |  |   redis: | 
 |  |  |     # å°å | 
 |  |  | #    host: 127.0.0.1 | 
 |  |  |     host: 192.168.10.230 | 
 |  |  |     # ç«¯å£ï¼é»è®¤ä¸º6379 | 
 |  |  |     port: 6379 | 
 |  |  |     # æ°æ®åºç´¢å¼ | 
 |  |  |     database: 0 | 
 |  |  |     # å¯ç  | 
 |  |  | #    password: root2022! | 
 |  |  |     password: | 
 |  |  |  | 
 |  |  |     # è¿æ¥è¶
æ¶æ¶é´ | 
 |  |  |     timeout: 10s | 
 |  |  |     lettuce: | 
 |  |  |       pool: | 
 |  |  |         # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ | 
 |  |  |         min-idle: 0 | 
 |  |  |         # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ | 
 |  |  |         max-idle: 8 | 
 |  |  |         # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° | 
 |  |  |         max-active: 8 | 
 |  |  |         # #è¿æ¥æ± æå¤§é»å¡çå¾
æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ | 
 |  |  |         max-wait: -1ms | 
 |  |  |  | 
 |  |  | # tokené
ç½® | 
 |  |  | token: | 
 |  |  |   # ä»¤çèªå®ä¹æ è¯ | 
 |  |  |   header: Authorization | 
 |  |  |   # ä»¤çå¯é¥ | 
 |  |  |   secret: abcdefghijklmnopqrstuvwxyz | 
 |  |  |   # ä»¤çæææï¼é»è®¤30åéï¼ | 
 |  |  |   expireTime: 450 | 
 |  |  |    | 
 |  |  | # MyBatis Plusé
ç½® | 
 |  |  | mybatis-plus: | 
 |  |  |   # æç´¢æå®å
å«å   æ ¹æ®èªå·±çé¡¹ç®æ¥ | 
 |  |  |   typeAliasesPackage: com.ruoyi.**.pojo | 
 |  |  |   # é
ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ | 
 |  |  |   mapperLocations: classpath*:mapper/**/*Mapper.xml | 
 |  |  |   # å è½½å
¨å±çé
ç½®æä»¶ | 
 |  |  |   configLocation: classpath:mybatis/mybatis-config.xml | 
 |  |  |   global-config: | 
 |  |  |     enable-sql-runner: true | 
 |  |  |     db-config: | 
 |  |  |       id-type: auto | 
 |  |  |    | 
 |  |  | # PageHelperå页æä»¶ | 
 |  |  | pagehelper: | 
 |  |  |   helperDialect: mysql | 
 |  |  |   supportMethodsArguments: true | 
 |  |  |   params: count=countSql | 
 |  |  |  | 
 |  |  | # Swaggeré
ç½® | 
 |  |  | swagger: | 
 |  |  |   # æ¯å¦å¼å¯swagger | 
 |  |  |   enabled: true | 
 |  |  |   # è¯·æ±åç¼ | 
 |  |  |   pathMapping: /dev-api | 
 |  |  |  | 
 |  |  | # é²æ¢XSSæ»å» | 
 |  |  | xss: | 
 |  |  |   # è¿æ»¤å¼å
³ | 
 |  |  |   enabled: true | 
 |  |  |   # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   excludes: /system/notice | 
 |  |  |   # å¹é
龿¥ | 
 |  |  |   urlPatterns: /system/*,/monitor/*,/tool/* | 
 |  |  |    | 
 |  |  | # ä»£ç çæ | 
 |  |  | gen: | 
 |  |  |   # ä½è
 | 
 |  |  |   author: ruoyi | 
 |  |  |   # é»è®¤çæå
路徠system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool | 
 |  |  |   packageName: com.ruoyi.project.system | 
 |  |  |   # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true | 
 |  |  |   autoRemovePre: false | 
 |  |  |   # è¡¨åç¼ï¼çæç±»åä¸ä¼å
å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ | 
 |  |  |   tablePrefix: sys_ | 
 |  |  |   # æ¯å¦å
è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å
许 | 
 |  |  |   allowOverwrite: false | 
 |  |  |  | 
 |  |  | file: | 
 |  |  |   temp-dir: /javaWork/product-inventory-management/file/temp/uploads | 
 |  |  |   upload-dir: /javaWork/product-inventory-management/file/prod/uploads | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.collaborativeApproval.mapper.StaffContactsPersonalMapper"> | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO"> | 
 |  |  |         SELECT | 
 |  |  |             scp.id, | 
 |  |  |             scp.contact_id, | 
 |  |  |             sjlr.staff_no, | 
 |  |  |             sjlr.staff_name, | 
 |  |  |             sjlr.sex, | 
 |  |  |             sjlr.post_job, | 
 |  |  |             sjlr.adress, | 
 |  |  |             sjlr.profession, | 
 |  |  |             sjlr.identity_card, | 
 |  |  |             sjlr.phone, | 
 |  |  |             scp.create_time | 
 |  |  |         FROM staff_contacts_personal scp | 
 |  |  |             LEFT JOIN (select * from staff_join_leave_record WHERE staff_state = 1) sjlr ON scp.contact_id=sjlr.id | 
 |  |  |         where 1=1 | 
 |  |  |         <if test="staffContactsPersonalDTO.staffName != null and staffContactsPersonalDTO.staffName != ''"> | 
 |  |  |             and sjlr.staff_name like concat('%',#{staffContactsPersonalDTO.staffName},'%') | 
 |  |  |         </if> | 
 |  |  |  | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.device.mapper.DeviceDefectRecordMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.device.dto.DeviceDefectRecordDto"> | 
 |  |  |         select ddr.*,dl.device_name,dl.device_model | 
 |  |  |         from device_defect_record ddr | 
 |  |  |         left join device_ledger dl on ddr.device_ledger_id = dl.id | 
 |  |  |         <where> | 
 |  |  |             1=1 | 
 |  |  |             <if test="deviceDefectRecordDto.deviceLedgerId != null"> | 
 |  |  |                 and ddr.device_ledger_id = #{deviceDefectRecordDto.deviceLedgerId} | 
 |  |  |             </if> | 
 |  |  |             <if test="deviceDefectRecordDto.deviceName != null and deviceDefectRecordDto.deviceName != ''"> | 
 |  |  |                 and dl.device_name like concat('%',#{deviceDefectRecordDto.deviceName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="deviceDefectRecordDto.status != null"> | 
 |  |  |                 and ddr.status = #{deviceDefectRecordDto.status} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |  | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |         dl.supplier_name, | 
 |  |  |         dl.unit, | 
 |  |  |         dl.number, | 
 |  |  |         dl.status, | 
 |  |  |         dl.plan_runtime_time, | 
 |  |  |         dl.start_runtime_time, | 
 |  |  |         dl.end_runtime_time, | 
 |  |  |         dl.runtime_duration, | 
 |  |  |         dl.tax_including_price_unit, | 
 |  |  |         dl.tax_including_price_total, | 
 |  |  |         dl.tax_rate, | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.inspectiontask.mapper.TimingTaskMapper"> | 
 |  |  |  | 
 |  |  |     <select id="getTaskById" resultType="com.ruoyi.inspectiontask.pojo.TimingTask" useCache="false"> | 
 |  |  |         SELECT * FROM timing_task WHERE id = #{id} | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.measuringinstrumentledger.mapper.SparePartsMapper"> | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto"> | 
 |  |  |         select sp.*,sp1.name as parentName from spare_parts sp | 
 |  |  |         left join spare_parts sp1 on sp1.id = sp.parent_id | 
 |  |  |         <where> | 
 |  |  |             <if test="spareParts.name != null"> | 
 |  |  |                 and name like concat('%',#{spareParts.name},'%') | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.oA.mapper.OaProjectMapper"> | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.oA.dto.OaProjectDto"> | 
 |  |  |         select op.*,su.nick_name as managerName from oa_project op | 
 |  |  |         LEFT JOIN sys_user su ON op.manager_id=su.user_id | 
 |  |  |         <where> | 
 |  |  |         1=1 | 
 |  |  |             <if test="req.projectName != null and req.projectName != ''"> | 
 |  |  |                 and op.project_name like concat('%',#{req.projectName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.managerName != null and req.managerName != ''"> | 
 |  |  |                 and su.nick_name like concat('%',#{req.managerName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.status != null and req.status != ''"> | 
 |  |  |                 and op.status = #{req.status} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  |     <select id="selectByIds" resultType="com.ruoyi.oA.dto.OaProjectDto"> | 
 |  |  |         select op.*,su.nick_name as managerName from oa_project op | 
 |  |  |         LEFT JOIN sys_user su ON op.manager_id=su.user_id | 
 |  |  |         where op.project_id in | 
 |  |  |         <foreach collection="ids" item="id" open="(" close=")" separator=","> | 
 |  |  |             #{id} | 
 |  |  |         </foreach> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.oA.mapper.OaProjectPhaseMapper"> | 
 |  |  |  | 
 |  |  |     <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhase"> | 
 |  |  |             <id property="phaseId" column="phase_id" jdbcType="INTEGER"/> | 
 |  |  |             <result property="phaseName" column="phase_name" jdbcType="VARCHAR"/> | 
 |  |  |             <result property="oaProjectId" column="oa_project_id" jdbcType="INTEGER"/> | 
 |  |  |             <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="status" column="status" jdbcType="VARCHAR"/> | 
 |  |  |             <result property="createUser" column="create_user" jdbcType="BIGINT"/> | 
 |  |  |             <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="updateUser" column="update_user" jdbcType="BIGINT"/> | 
 |  |  |             <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/> | 
 |  |  |     </resultMap> | 
 |  |  |  | 
 |  |  |     <sql id="Base_Column_List"> | 
 |  |  |         phase_id,phase_name,oa_project_id, | 
 |  |  |         start_date,end_date,status, | 
 |  |  |         create_user,create_time,update_user, | 
 |  |  |         update_time,tenant_id | 
 |  |  |     </sql> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.oA.mapper.OaProjectPhaseTaskMapper"> | 
 |  |  |  | 
 |  |  |     <resultMap id="BaseResultMap" type="com.ruoyi.oA.pojo.OaProjectPhaseTask"> | 
 |  |  |             <id property="taskId" column="task_id" jdbcType="INTEGER"/> | 
 |  |  |             <result property="taskName" column="task_name" jdbcType="VARCHAR"/> | 
 |  |  |             <result property="phaseId" column="phase_id" jdbcType="INTEGER"/> | 
 |  |  |             <result property="startDate" column="start_date" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="endDate" column="end_date" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="targetDate" column="target_date" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="targetValue" column="target_value" jdbcType="INTEGER"/> | 
 |  |  |             <result property="currentValue" column="current_value" jdbcType="INTEGER"/> | 
 |  |  |             <result property="unit" column="unit" jdbcType="VARCHAR"/> | 
 |  |  |             <result property="status" column="status" jdbcType="VARCHAR"/> | 
 |  |  |             <result property="completionRate" column="completion_rate" jdbcType="INTEGER"/> | 
 |  |  |             <result property="createUser" column="create_user" jdbcType="BIGINT"/> | 
 |  |  |             <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="updateUser" column="update_user" jdbcType="BIGINT"/> | 
 |  |  |             <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> | 
 |  |  |             <result property="tenantId" column="tenant_id" jdbcType="BIGINT"/> | 
 |  |  |     </resultMap> | 
 |  |  |  | 
 |  |  |     <sql id="Base_Column_List"> | 
 |  |  |         task_id,task_name,phase_id, | 
 |  |  |         start_date,end_date,target_date, | 
 |  |  |         target_value,current_value,unit, | 
 |  |  |         status,completion_rate,create_user, | 
 |  |  |         create_time,update_user,update_time, | 
 |  |  |         tenant_id | 
 |  |  |     </sql> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.procurementrecord.mapper.InboundManagementMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.InboundManagement"> | 
 |  |  |         select * from inbound_management | 
 |  |  |         <where> | 
 |  |  |             <if test="req.orderNo != null and req.orderNo != ''"> | 
 |  |  |                 and order_no like concat('%',#{req.orderNo},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.supplierName != null and req.supplierName != ''"> | 
 |  |  |                 and supplier_name like concat('%',#{req.supplierName},'%') | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.procurementrecord.mapper.ProcurementPlanMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ProcurementPlan"> | 
 |  |  |         SELECT * FROM procurement_plan | 
 |  |  |         <where> | 
 |  |  |             <if test="req.status != null and req.status != ''"> | 
 |  |  |                 AND status = #{req.status} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.planName != null and req.planName != ''"> | 
 |  |  |                 AND plan_name LIKE CONCAT('%',#{req.planName},'%') | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.procurementrecord.mapper.ProcurementPriceManagementMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement"> | 
 |  |  |         SELECT * FROM procurement_price_management | 
 |  |  |         <where> | 
 |  |  |             <if test="req.productName != null and req.productName != ''"> | 
 |  |  |                 AND product_name like concat('%',#{req.productName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.supplierName != null and req.supplierName != ''"> | 
 |  |  |                 AND supplier_name = #{req.supplierName} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |             t2.specification_model, | 
 |  |  |             t2.unit, | 
 |  |  |             t2.quantity, | 
 |  |  |             t2.min_stock, | 
 |  |  |             t2.quantity as quantity0, | 
 |  |  |             t2.tax_rate, | 
 |  |  |             t2.tax_inclusive_unit_price, | 
 |  |  | 
 |  |  |         t1.create_user, | 
 |  |  |         t2.specification_model, | 
 |  |  |         t2.unit, | 
 |  |  |         t2.min_stock, | 
 |  |  |         t2.tax_rate, | 
 |  |  |         t2.tax_inclusive_unit_price, | 
 |  |  |         t2.tax_inclusive_total_price, | 
 |  |  | 
 |  |  |         t1.inbound_batches, | 
 |  |  |         t1.inbound_num, | 
 |  |  |         t1.inbound_num as inboundNum0, | 
 |  |  |         t1.inbound_num as totalInboundNum, | 
 |  |  |         t1.create_time, | 
 |  |  |         t1.update_time, | 
 |  |  |         t1.create_by | 
 |  |  | 
 |  |  |             <if test="req.supplierName != null and req.supplierName != ''"> | 
 |  |  |                 and t3.supplier_name like  concat('%',#{req.supplierName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.reportDate != null"> | 
 |  |  |                 and t1.create_time >= #{req.reportDate} and t1.create_time < DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY) | 
 |  |  |             </if> | 
 |  |  |             <if test="req.startMonth != null"> | 
 |  |  |                 and t1.create_time >= #{req.startMonth} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.endMonth != null"> | 
 |  |  |                 and t1.create_time <= #{req.endMonth} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.startDate != null"> | 
 |  |  |                 and t1.create_time >= #{req.startDate} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.endDate != null"> | 
 |  |  |                 and t1.create_time <= #{req.endDate} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  |     <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy"> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.procurementrecord.mapper.ReturnManagementMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.procurementrecord.pojo.ReturnManagement"> | 
 |  |  |         select * from return_management | 
 |  |  |         <where> | 
 |  |  |             <if test="req.returnNo != null and req.returnNo != ''"> | 
 |  |  |                 and return_no like concat('%',#{req.returnNo},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.returnType != null and req.returnType != ''"> | 
 |  |  |                 and return_type = #{req.returnType} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |             T4.id,T4.customer_name , | 
 |  |  |             SUM(invoice_total) AS invoice_total, | 
 |  |  |             IFNULL( SUM(T5.receipt_payment_amount) , 0 ) AS receipt_payment_amount, | 
 |  |  |             IFNULL((SUM(invoice_total)  - SUM(T5.receipt_payment_amount)),0) AS unReceipt_payment_amount | 
 |  |  |             IFNULL((IFNULL(SUM(invoice_total),0)  - IFNULL(SUM(T5.receipt_payment_amount),0)),0) AS unReceipt_payment_amount | 
 |  |  |         FROM | 
 |  |  |             invoice_ledger T1 | 
 |  |  |                 LEFT JOIN invoice_registration_product T2 ON T1.invoice_registration_product_id = T2.id | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.sales.mapper.PaymentShippingMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.sales.pojo.PaymentShipping"> | 
 |  |  |         select * from payment_shipping | 
 |  |  |         <where> | 
 |  |  |             <if test="req.orderNo != null and req.orderNo != ''"> | 
 |  |  |                 and order_no like concat('%',#{req.orderNo},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.paymentStatus != null and req.paymentStatus != ''"> | 
 |  |  |                 and payment_status = #{req.paymentStatus} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.shippingStatus != null and req.shippingStatus != ''"> | 
 |  |  |                 and shipping_status = #{req.shippingStatus} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |         BY invoice_ledger_id | 
 |  |  |         ) T6 ON T1.id = T6.invoice_ledger_id | 
 |  |  |         <where> | 
 |  |  |             <if test="c.customerName != null and c.customerName !=''"> | 
 |  |  |                 AND T3.customer_name LIKE CONCAT('%',#{c.customerName},'%') | 
 |  |  |             <if test="req.customerName != null and req.customerName !=''"> | 
 |  |  |                 AND T3.customer_name LIKE CONCAT('%',#{req.customerName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="c.invoiceLedgerId != null"> | 
 |  |  |                 AND T1.id = #{c.invoiceLedgerId} | 
 |  |  |             <if test="req.invoiceLedgerId != null"> | 
 |  |  |                 AND T1.id = #{req.invoiceLedgerId} | 
 |  |  |             </if> | 
 |  |  |             <if test="c.customerContractNo != null and c.customerContractNo !=''"> | 
 |  |  |                 AND T3.customer_contract_no LIKE CONCAT('%',#{c.customerContractNo},'%') | 
 |  |  |             <if test="req.customerContractNo != null and req.customerContractNo !=''"> | 
 |  |  |                 AND T3.customer_contract_no LIKE CONCAT('%',#{req.customerContractNo},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="c.projectName != null and c.projectName !=''"> | 
 |  |  |                 AND T3.project_name LIKE CONCAT('%',#{c.projectName},'%') | 
 |  |  |             <if test="req.projectName != null and req.projectName !=''"> | 
 |  |  |                 AND T3.project_name LIKE CONCAT('%',#{req.projectName},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.invoiceDateStart != null and req.invoiceDateStart != '' "> | 
 |  |  |                 AND T1.invoice_date >= DATE_FORMAT(#{req.invoiceDateStart},'%Y-%m-%d') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.invoiceDateEnd != null and req.invoiceDateEnd != '' "> | 
 |  |  |                 AND  T1.invoice_date <= DATE_FORMAT(#{req.invoiceDateEnd},'%Y-%m-%d') | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |         ORDER BY T2.create_time DESC | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.sales.mapper.SalesQuotationMapper"> | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.sales.dto.SalesQuotationDto"> | 
 |  |  |         SELECT * FROM sales_quotation | 
 |  |  |         WHERE 1=1 | 
 |  |  |         <if test="salesQuotationDto.quotationNo != null and salesQuotationDto.quotationNo != '' "> | 
 |  |  |             AND quotation_no LIKE CONCAT('%',#{salesQuotationDto.quotationNo},'%') | 
 |  |  |         </if> | 
 |  |  |         <if test="salesQuotationDto.customer != null and salesQuotationDto.customer != '' "> | 
 |  |  |             AND customer = #{salesQuotationDto.customer} | 
 |  |  |         </if> | 
 |  |  |         <if test="salesQuotationDto.status != null and salesQuotationDto.status != '' "> | 
 |  |  |             AND status = #{salesQuotationDto.status} | 
 |  |  |         </if> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.sales.mapper.SalesQuotationProductMapper"> | 
 |  |  | <!--    <select id="selectBySalesQuotationIds" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct">--> | 
 |  |  | <!--        select * from sales_quotation_product where sales_quotation_id in--> | 
 |  |  | <!--        <foreach collection="salesQuotationIds" item="salesQuotationId" open="(" close=")" separator=",">--> | 
 |  |  | <!--            #{salesQuotationId}--> | 
 |  |  | <!--        </foreach>--> | 
 |  |  | <!--    </select>--> | 
 |  |  |     <select id="selectBySalesQuotationId" resultType="com.ruoyi.sales.pojo.SalesQuotationProduct"> | 
 |  |  |         select * from sales_quotation_product where sales_quotation_id = #{id} | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.sales.mapper.SalespersonManagementMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.sales.pojo.SalespersonManagement"> | 
 |  |  |         select * from salesperson_management | 
 |  |  |         <where> | 
 |  |  |             <if test="req.name != null and req.name != ''"> | 
 |  |  |                 and `name` like concat('%',#{req.name},'%') | 
 |  |  |             </if> | 
 |  |  |             <if test="req.department != null and req.department != ''"> | 
 |  |  |                 and department = #{req.department} | 
 |  |  |             </if> | 
 |  |  |             <if test="req.status != null and req.status != ''"> | 
 |  |  |                 and status = #{req.status} | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
| ¶Ô±ÈÐÂÎļþ | 
 |  |  | 
 |  |  | <?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.sales.mapper.ShippingInfoMapper"> | 
 |  |  |  | 
 |  |  |     <select id="listPage" resultType="com.ruoyi.sales.pojo.ShippingInfo"> | 
 |  |  |         SELECT | 
 |  |  |         s.id, | 
 |  |  |         s.sales_ledger_id, | 
 |  |  |         s.shipping_date, | 
 |  |  |         s.shipping_car_number, | 
 |  |  |         s.create_time, | 
 |  |  |         s.update_time, | 
 |  |  |         s.create_user, | 
 |  |  |         s.update_user, | 
 |  |  |         s.tenant_id, | 
 |  |  |         sl.sales_contract_no, | 
 |  |  |         sl.customer_name | 
 |  |  |         FROM shipping_info s | 
 |  |  |         LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id | 
 |  |  |         WHERE 1=1 | 
 |  |  |         <if test="req.salesContractNo != null and req.salesContractNo != ''"> | 
 |  |  |             AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%') | 
 |  |  |         </if> | 
 |  |  |         <if test="req.shippingCarNumber != null and req.shippingCarNumber != ''"> | 
 |  |  |             AND s.shipping_car_number LIKE CONCAT('%',#{req.shippingCarNumber},'%') | 
 |  |  |         </if> | 
 |  |  |     </select> | 
 |  |  |     <select id="listAll" resultType="com.ruoyi.sales.pojo.ShippingInfo"> | 
 |  |  |         SELECT | 
 |  |  |             s.id, | 
 |  |  |             s.sales_ledger_id, | 
 |  |  |             s.shipping_date, | 
 |  |  |             s.shipping_car_number, | 
 |  |  |             s.create_time, | 
 |  |  |             s.update_time, | 
 |  |  |             s.create_user, | 
 |  |  |             s.update_user, | 
 |  |  |             s.tenant_id, | 
 |  |  |             sl.sales_contract_no, | 
 |  |  |             sl.customer_name | 
 |  |  |         FROM shipping_info s | 
 |  |  |                  LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id | 
 |  |  |     </select> | 
 |  |  | </mapper> | 
 
 |  |  | 
 |  |  |              #{item} | 
 |  |  |         </foreach> | 
 |  |  |     </select> | 
 |  |  |     <select id="selectList" resultType="com.ruoyi.project.system.domain.SysUser"> | 
 |  |  |         SELECT user_id, nick_name FROM sys_user | 
 |  |  |         <where> | 
 |  |  |             <if test="list != null and list.size() > 0"> | 
 |  |  |                 user_id IN | 
 |  |  |                 <foreach item="id" collection="list" open="(" separator="," close=")"> | 
 |  |  |                     #{id} | 
 |  |  |                 </foreach> | 
 |  |  |             </if> | 
 |  |  |             <if test="list == null or list.size() == 0"> | 
 |  |  |                 1=0  <!-- ç©ºå表æ¶è¿åç©ºç»æ --> | 
 |  |  |             </if> | 
 |  |  |         </where> | 
 |  |  |     </select> | 
 |  |  |     <select id="selectUsersByIds" resultType="com.ruoyi.project.system.domain.SysUser"> | 
 |  |  |         SELECT user_id, nick_name | 
 |  |  |         FROM sys_user | 
 |  |  |         WHERE user_id IN | 
 |  |  |         <foreach collection="userIds" item="id" open="(" separator="," close=")"> | 
 |  |  |             #{id} | 
 |  |  |         </foreach> | 
 |  |  |     </select> | 
 |  |  |  | 
 |  |  |     <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId"> | 
 |  |  |          insert into sys_user( |