| src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/framework/config/ApplicationConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java
@@ -1,6 +1,7 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.basic.dto.StorageBlobDTO; import lombok.Data; import java.util.List; @@ -9,4 +10,6 @@ public class ApprovalTemplateDto extends ApprovalTemplate { private List<ApprovalTemplateNodeDto> nodes; private List<StorageBlobDTO> storageBlobDTOs; } src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java
@@ -24,5 +24,14 @@ @Schema(description = "业务名称") private String businessName; @Schema(description = "报价单号") private String quotationNo; @Schema(description = "采购单号") private String purchaseContractNumber; @Schema(description = "发货单号") private String shippingNo; private List<StorageBlobVO> storageBlobVOList; } src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java
@@ -1,6 +1,7 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.basic.dto.StorageBlobVO; import lombok.Data; import java.util.List; @@ -11,4 +12,6 @@ private List<ApprovalTemplateNodeVo> nodes; private String createdUserName; private List<StorageBlobVO> storageBlobDTOs; } src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -105,6 +105,30 @@ } records.forEach(vo -> { vo.setBusinessName(TypeEnums.getLabelByValue(vo.getBusinessType())); // 根据业务类型查询对应的单号 if (vo.getBusinessType() != null && vo.getBusinessId() != null) { if (TypeEnums.PURCHASE_APPROVAL.getCode().equals(vo.getBusinessType())) { // 采购审批 - 查询采购单号 PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(vo.getBusinessId()); System.out.println("业务类型:" + purchaseLedger.getPurchaseContractNumber()); if (purchaseLedger != null) { vo.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber()); } } else if (TypeEnums.QUOTATION_APPROVAL.getCode().equals(vo.getBusinessType())) { // 报价审批 - 查询报价单号 SalesQuotation salesQuotation = salesQuotationMapper.selectById(vo.getBusinessId()); if (salesQuotation != null) { vo.setQuotationNo(salesQuotation.getQuotationNo()); } } else if (TypeEnums.SHIPPING_APPROVAL.getCode().equals(vo.getBusinessType())) { // 发货审批 - 查询发货单号 ShippingInfo shippingInfo = shippingInfoMapper.selectById(vo.getBusinessId()); if (shippingInfo != null) { vo.setShippingNo(shippingInfo.getShippingNo()); } } } }); Long currentUserId = SecurityUtils.getUserId(); src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
@@ -18,10 +18,15 @@ import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.ruoyi.approve.service.ApprovalTemplateNodeService; import com.ruoyi.approve.service.ApprovalTemplateService; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.Comparator; @@ -43,6 +48,7 @@ private final ApprovalTemplateMapper approvalTemplateMapper; private final ApprovalTemplateNodeService approvalTemplateNodeService; private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper; private final FileUtil fileUtil; @Override public IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto) { @@ -63,6 +69,11 @@ new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId()) ); // 保存附件 List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs(); if (!CollectionUtils.isEmpty(storageBlobDTOs)) { fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs); } return approvalTemplateNodeService.saveApprovalTemplateNode( approvalTemplateDto.getId(), approvalTemplateDto.getNodes() @@ -80,6 +91,16 @@ new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId()) ); // 保存附件(会先删除旧附件) List<StorageBlobDTO> storageBlobDTOs = approvalTemplateDto.getStorageBlobDTOs(); if (!CollectionUtils.isEmpty(storageBlobDTOs)) { fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId(), storageBlobDTOs); } else { // 如果前端传空数组,删除旧附件 fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, approvalTemplateDto.getId() ); } return approvalTemplateNodeService.saveApprovalTemplateNode( approvalTemplateDto.getId(), approvalTemplateDto.getNodes() @@ -107,6 +128,7 @@ new LambdaQueryWrapper<ApprovalTemplate>() .eq(ApprovalTemplate::getDeleted, 0) .eq(ApprovalTemplate::getEnabled, 1) .notIn(ApprovalTemplate::getBusinessType, List.of(5L, 6L, 7L)) .orderByDesc(ApprovalTemplate::getTemplateType) .orderByDesc(ApprovalTemplate::getId) ); @@ -220,6 +242,12 @@ .collect(Collectors.toList()); templateVo.setNodes(nodeVos); // 查询附件 templateVo.setStorageBlobDTOs( fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.APPROVAL_TEMPLATE, template.getId() ) ); return templateVo; } src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -201,7 +201,8 @@ ENTERPRISE_NEWS("enterprise_news"), APPROVAL_INSTANCE("approval_instance"), ACCOUNT_INVOICE_APPLICATION("account_invoice_application"), ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice"); ACCOUNT_PURCHASE_INVOICE("account_purchase_invoice"), APPROVAL_TEMPLATE("approval_template"); private final String type; RecordTypeEnum(String type) { this.type = type; } src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
@@ -1,30 +1,64 @@ package com.ruoyi.framework.config; import java.util.TimeZone; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * 程序注解配置 * * @author ruoyi */ @Configuration // 表示通过aop框架暴露该代理对象,AopContext能够访问 @EnableAspectJAutoProxy(exposeProxy = true) // 指定要扫描的Mapper类的包的路径 @MapperScan("com.ruoyi.**.mapper") public class ApplicationConfig { /** * 时区配置 */ @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); } } package com.ruoyi.framework.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.TimeZone; /** * 程序注解配置 * * @author ruoyi */ @Configuration // 表示通过aop框架暴露该代理对象,AopContext能够访问 @EnableAspectJAutoProxy(exposeProxy = true) // 指定要扫描的Mapper类的包的路径 @MapperScan("com.ruoyi.**.mapper") public class ApplicationConfig { /** * 时区配置 */ @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); } @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 全局忽略未知字段 mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JavaTimeModule module = new JavaTimeModule(); // LocalDateTime:支持 yyyy-MM-dd HH:mm:ss DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); // LocalDate:支持 yyyy-MM-dd DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); module.addDeserializer(LocalDate.class, new LocalDateDeserializer(dateFormatter)); module.addSerializer(LocalDate.class, new LocalDateSerializer(dateFormatter)); mapper.registerModule(module); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } } src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -180,8 +180,8 @@ boolean save = this.add(req); // 发货审批 ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto(); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,6L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setTemplateId(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getId()); approvalInstance.setTemplateName(approvalTemplateMapper.selectOne(new LambdaQueryWrapper<ApprovalTemplate>().eq(ApprovalTemplate::getBusinessType,7L).orderByDesc(ApprovalTemplate::getId).last("LIMIT 1")).getTemplateName()); approvalInstance.setBusinessId(req.getId()); approvalInstance.setBusinessType(7L); approvalInstance.setCurrentLevel(1); src/main/resources/application.yml
@@ -1,5 +1,8 @@ # Spring配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 main: allow-circular-references: true profiles: