| | |
| | | |
| | | ALTER TABLE `product-inventory-management`.`device_maintenance` |
| | | ADD COLUMN `device_name` varchar(255) NULL AFTER `tenant_id`, |
| | | ADD COLUMN `device_model` varchar(255) NULL AFTER `device_name`; |
| | | ADD COLUMN `device_model` varchar(255) NULL AFTER `device_name`; |
| | | |
| | | |
| | | |
| | | DROP TABLE IF EXISTS storage_attachment; |
| | | CREATE TABLE storage_attachment ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY, |
| | | create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, |
| | | update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, |
| | | deleted BIGINT DEFAULT 0 NOT NULL, |
| | | record_type SMALLINT DEFAULT 0 NOT NULL, |
| | | record_id BIGINT DEFAULT 0 NOT NULL, |
| | | name VARCHAR(100) DEFAULT '' NOT NULL, |
| | | storage_blob_id BIGINT DEFAULT 0 NOT NULL |
| | | ) COMMENT='éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯'; |
| | | |
| | | ALTER TABLE storage_attachment |
| | | COMMENT 'éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯'; |
| | | |
| | | ALTER TABLE storage_attachment MODIFY record_type SMALLINT COMMENT 'å
³èçè®°å½ç±»å'; |
| | | ALTER TABLE storage_attachment MODIFY record_id BIGINT COMMENT 'å
³èçè®°å½id'; |
| | | ALTER TABLE storage_attachment MODIFY name VARCHAR(100) COMMENT 'åç§°, å¦: file, avatar (åºåå䏿¡è®°å½ä¸åç±»åçéä»¶)'; |
| | | ALTER TABLE storage_attachment MODIFY storage_blob_id BIGINT COMMENT 'å
³èstorage_blobè®°å½id'; |
| | | |
| | | CREATE INDEX idx_storage_attachment_on_record |
| | | ON storage_attachment (record_type, record_id); |
| | | |
| | | |
| | | CREATE TABLE storage_blob ( |
| | | id BIGINT AUTO_INCREMENT PRIMARY KEY, |
| | | create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, |
| | | key_name VARCHAR(150) DEFAULT '' NOT NULL, |
| | | content_type VARCHAR(100) DEFAULT '' NOT NULL, |
| | | original_filename VARCHAR(255) DEFAULT '' NOT NULL, |
| | | bucket_filename VARCHAR(255) DEFAULT '' NOT NULL, |
| | | bucket_name VARCHAR(255) DEFAULT '' NOT NULL, |
| | | byte_size BIGINT DEFAULT 0 NOT NULL, |
| | | UNIQUE (key_name) |
| | | ) COMMENT='éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯'; |
| | | |
| | | ALTER TABLE storage_blob |
| | | COMMENT 'éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯'; |
| | | |
| | | ALTER TABLE storage_blob MODIFY key_name VARCHAR(150) COMMENT 'èµæºid'; |
| | | ALTER TABLE storage_blob MODIFY content_type VARCHAR(100) COMMENT 'èµæºç±»åï¼ä¾å¦JPGå¾ççèµæºç±»å为image/jpg'; |
| | | ALTER TABLE storage_blob MODIFY original_filename VARCHAR(255) COMMENT 'åæä»¶åç§°'; |
| | | ALTER TABLE storage_blob MODIFY bucket_filename VARCHAR(255) COMMENT 'å卿¡¶ä¸æä»¶å'; |
| | | ALTER TABLE storage_blob MODIFY bucket_name VARCHAR(255) COMMENT 'å卿¡¶å'; |
| | | ALTER TABLE storage_blob MODIFY byte_size BIGINT COMMENT 'èµæºå°ºå¯¸(åè)'; |
| | |
| | | <velocity.version>2.3</velocity.version>
|
| | | <!-- override dependency version -->
|
| | | <tomcat.version>9.0.102</tomcat.version>
|
| | | <minio.version>8.4.3</minio.version>
|
| | | <okhttp.version>4.9.0</okhttp.version>
|
| | | <logback.version>1.2.13</logback.version>
|
| | | <spring-security.version>5.7.12</spring-security.version>
|
| | | <spring-framework.version>5.3.39</spring-framework.version>
|
| | |
| | | <artifactId>lombok</artifactId>
|
| | | </dependency>
|
| | |
|
| | |
|
| | |
|
| | | <!-- minio -->
|
| | | <dependency>
|
| | | <groupId>io.minio</groupId>
|
| | | <artifactId>minio</artifactId>
|
| | | <version>${minio.version}</version>
|
| | | <exclusions>
|
| | | <exclusion>
|
| | | <groupId>com.squareup.okhttp3</groupId>
|
| | | <artifactId>okhttp</artifactId>
|
| | | </exclusion>
|
| | | </exclusions>
|
| | | </dependency>
|
| | |
|
| | | <!-- minioä¾èµokhttp ä¸ç¶æ¥é -->
|
| | | <dependency>
|
| | | <groupId>com.squareup.okhttp3</groupId>
|
| | | <artifactId>okhttp</artifactId>
|
| | | <version>${okhttp.version}</version>
|
| | | </dependency>
|
| | |
|
| | | </dependencies>
|
| | |
|
| | | <build>
|
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.controller; |
| | | |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.service.IApproveNodeService; |
| | | import com.ruoyi.approve.vo.ApproveNodeVo; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | @RestController |
| | | @RequestMapping("/approveNode") |
| | | public class ApproveNodeController { |
| | | @Autowired |
| | | private IApproveNodeService approveNodeService; |
| | | |
| | | /** |
| | | * æµç¨ç¶æè¯¦æ
|
| | | * @param id æµç¨å®¡æ¹id approve_id |
| | | * @return |
| | | */ |
| | | @GetMapping("/details") |
| | | public AjaxResult details(@PathVariable String id) { |
| | | return AjaxResult.success(approveNodeService.details(id)); |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°å®¡æ¹èç¹ |
| | | * @param approveNode |
| | | * @return |
| | | */ |
| | | @PostMapping("/updateApproveNode") |
| | | public AjaxResult updateApproveNode(@RequestBody ApproveNodeVo approveNode) { |
| | | approveNodeService.updateApproveNode(approveNode); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | /** |
| | | * åå§å审æ¹èç¹ |
| | | * @param id |
| | | * @return |
| | | */ |
| | | @PostMapping("/init") |
| | | public AjaxResult init(String id) { |
| | | approveNodeService.initApproveNodes(id); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.controller; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.approve.service.IApproveProcessService; |
| | | import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; |
| | | import com.ruoyi.approve.vo.ApproveProcessVO; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.project.system.domain.SysDept; |
| | | import com.ruoyi.project.system.domain.SysUserDept; |
| | | import com.ruoyi.project.system.mapper.SysDeptMapper; |
| | | import com.ruoyi.project.system.mapper.SysUserDeptMapper; |
| | | import com.ruoyi.project.system.service.ISysUserDeptService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | @RestController |
| | | @RequestMapping("/approveProcess") |
| | | public class ApproveProcessController { |
| | | |
| | | @GetMapping("/test") |
| | | public AjaxResult test() { |
| | | System.out.println(1111); |
| | | return AjaxResult.success("æµè¯"); |
| | | } |
| | | |
| | | |
| | | @Autowired |
| | | private IApproveProcessService approveProcessService; |
| | | @Autowired |
| | | private ISysUserDeptService sysUserDeptService; |
| | | /**ã |
| | | * è·åé¨é¨å表 |
| | | * @return |
| | | */ |
| | | @GetMapping("/getDept") |
| | | public AjaxResult getDept() { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | List<SysUserDept> userDeptList = sysUserDeptService.getUserDeptList(userId); |
| | | Long[] deptIds = userDeptList.stream().map(SysUserDept::getDeptId).toArray(Long[]::new); |
| | | List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds); |
| | | return AjaxResult.success(sysDeptList); |
| | | } |
| | | |
| | | /** |
| | | * æ·»å å®¡æ¹ |
| | | * @param approveProcessVO |
| | | * @return |
| | | */ |
| | | @PostMapping("/add") |
| | | public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) { |
| | | if (approveProcessVO == null) { |
| | | return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | approveProcessService.addApprove(approveProcessVO); |
| | | return AjaxResult.success("æ·»å æå"); |
| | | } |
| | | |
| | | /** |
| | | * 审æ¹è¯¦æ
|
| | | * @param approveGetAndUpdateVo |
| | | * @return |
| | | */ |
| | | @GetMapping("/get") |
| | | public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){ |
| | | if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) { |
| | | return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); |
| | | } |
| | | return AjaxResult.success(approveProcessService.getApproveById(approveGetAndUpdateVo.getId())); |
| | | } |
| | | |
| | | /** |
| | | * æ´æ°å®¡æ¹ |
| | | * @param approveGetAndUpdateVo |
| | | * @return |
| | | */ |
| | | @PostMapping("/update") |
| | | public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) { |
| | | if (approveGetAndUpdateVo == null) { |
| | | return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); |
| | | } |
| | | approveProcessService.updateByApproveId(approveGetAndUpdateVo); |
| | | return AjaxResult.success("æä½æå"); |
| | | } |
| | | /** |
| | | * è·å审æ¹å表--å页æ¥è¯¢ |
| | | * @return |
| | | */ |
| | | @GetMapping("/list") |
| | | public AjaxResult list(Page page) { |
| | | return AjaxResult.success(approveProcessService.listAll(page)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤å®¡æ¹ |
| | | * @param ids |
| | | * @return |
| | | */ |
| | | @RequestMapping ("/deleteIds") |
| | | public AjaxResult deleteIds(@RequestBody Long[] ids) { |
| | | if (ids == null || ids.length == 0) { |
| | | return AjaxResult.warn("åæ°ä¸è½ä¸ºç©º"); |
| | | } |
| | | approveProcessService.delApprove(ids); |
| | | return AjaxResult.success("æä½æå"); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.approve.pojo.ApproveLog; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * @author Administrator |
| | | * @description é对表ãapprove_log(å®¡æ¹æ¥å¿è¡¨)ãçæ°æ®åºæä½Mapper |
| | | * @createDate 2025-07-07 14:47:01 |
| | | * @Entity com.ruoyi.approve.pojo.ApproveLog |
| | | */ |
| | | @Mapper |
| | | public interface ApproveLogMapper extends BaseMapper<ApproveLog> { |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * @author Administrator |
| | | * @description é对表ãapprove_node(审æ¹èç¹è¡¨)ãçæ°æ®åºæä½Mapper |
| | | * @createDate 2025-07-08 16:50:15 |
| | | * @Entity com.ruoyi.approve.pojo.ApproveNode |
| | | */ |
| | | @Mapper |
| | | public interface ApproveNodeMapper extends BaseMapper<ApproveNode> { |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * @author Administrator |
| | | * @description é对表ãapprove_process(å®¡æ¹æµç¨è¡¨)ãçæ°æ®åºæä½Mapper |
| | | * @createDate 2025-07-09 13:52:01 |
| | | * @Entity com.ruoyi.approve.pojo.ApproveProcess |
| | | */ |
| | | @Mapper |
| | | public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> { |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * å®¡æ¹æ¥å¿è¡¨ |
| | | * @TableName approve_log |
| | | */ |
| | | @Data |
| | | @TableName("approve_log") |
| | | public class ApproveLog implements Serializable { |
| | | private static final long serialVersionUID = 1L; |
| | | /** |
| | | * |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * 审æ¹id |
| | | */ |
| | | private Long approveId; |
| | | |
| | | /** |
| | | * 审æ¹èç¹é¡ºåº |
| | | */ |
| | | private Integer approveNodeOrder; |
| | | |
| | | /** |
| | | * 审æ¹äººid |
| | | */ |
| | | private Long approveUser; |
| | | |
| | | /** |
| | | * å®¡æ¹æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date approveTime; |
| | | |
| | | /** |
| | | * 审æ¹ç¶æ |
| | | */ |
| | | private Integer approveStatus; |
| | | |
| | | /** |
| | | * 审æ¹å¤æ³¨ |
| | | */ |
| | | private String approveRemark; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.pojo; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * 审æ¹èç¹è¡¨ |
| | | * @TableName approve_node |
| | | */ |
| | | @Data |
| | | @TableName(value ="approve_node") |
| | | public class ApproveNode implements Serializable { |
| | | /** |
| | | * |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * 审æ¹id |
| | | */ |
| | | private Long approveProcessId; |
| | | |
| | | /** |
| | | * 审æ¹èç¹é¡ºåº |
| | | */ |
| | | private Integer approveNodeOrder; |
| | | |
| | | /** |
| | | * 审æ¹èç¹ç¨æ·åå |
| | | */ |
| | | private String approveNodeUser; |
| | | |
| | | /** |
| | | * 审æ¹èç¹æ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date approveNodeTime; |
| | | |
| | | /** |
| | | * 审æ¹èç¹ç¶æ:1åæï¼2æç»ï¼0å°æªå®¡æ ¸ï¼é»è®¤ä¸º0ï¼ |
| | | */ |
| | | private Integer approveNodeStatus; |
| | | |
| | | @TableField(exist = false) |
| | | private Boolean isFirst; |
| | | |
| | | @TableField(exist = false) |
| | | private Boolean isLast; |
| | | |
| | | /** |
| | | * ç§æ·id |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | /** |
| | | * å 餿 è®°:0æ£å¸¸ï¼1å é¤ |
| | | */ |
| | | private Integer deleteFlag; |
| | | |
| | | /** |
| | | * 审æ¹èç¹æç»åå |
| | | */ |
| | | private String approveNodeReason; |
| | | |
| | | /** |
| | | * 审æ¹èç¹å¤æ³¨ |
| | | */ |
| | | private String approveNodeRemark; |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.pojo; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * å®¡æ¹æµç¨è¡¨ |
| | | * @TableName approve_process |
| | | */ |
| | | @TableName(value ="approve_process") |
| | | @Data |
| | | public class ApproveProcess implements Serializable { |
| | | /** |
| | | * |
| | | */ |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * 审æ¹id |
| | | */ |
| | | private String approveId; |
| | | |
| | | /** |
| | | * ç³è¯·äººid |
| | | */ |
| | | private Long approveUser; |
| | | |
| | | /** |
| | | * ç³è¯·é¨é¨id |
| | | */ |
| | | private Long approveDeptId; |
| | | |
| | | /** |
| | | * ç³è¯·é¨é¨åç§° |
| | | */ |
| | | private String approveDeptName; |
| | | |
| | | /** |
| | | * 审æ¹ç¨æ·ids |
| | | */ |
| | | private String approveUserIds; |
| | | |
| | | /** |
| | | * 审æ¹ç¨æ·åç§° |
| | | */ |
| | | private String approveUserNames; |
| | | |
| | | /** |
| | | * å½å审æ¹ç¨æ·id |
| | | */ |
| | | private Long approveUserCurrentId; |
| | | |
| | | /** |
| | | * å½å审æ¹ç¨æ·åç§° |
| | | */ |
| | | private String approveUserCurrentName; |
| | | |
| | | /** |
| | | * ç³è¯·åå |
| | | */ |
| | | private String approveReason; |
| | | |
| | | /** |
| | | * ç³è¯·æ¥æ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date approveTime; |
| | | |
| | | /** |
| | | * 审æ¹å®ææ¶é´ |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date approveOverTime; |
| | | |
| | | /** |
| | | * 审æ¹ç¶æï¼0å¾
å®¡æ ¸ï¼1å®¡æ ¸ä¸ï¼2å®¡æ ¸å®æ 3å®¡æ ¸ä¸éè¿ |
| | | */ |
| | | private Integer approveStatus; |
| | | |
| | | /** |
| | | * å®¡æ¹æ¯å¦å é¤ï¼0æ£å¸¸ï¼1å é¤ |
| | | */ |
| | | private Integer approveDelete; |
| | | |
| | | /** |
| | | * ç§æ·id |
| | | */ |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long tenantId; |
| | | |
| | | /** |
| | | * 审æ¹ç±»å |
| | | */ |
| | | private Integer approveType; |
| | | |
| | | /** |
| | | * 审æ¹å¤æ³¨ |
| | | */ |
| | | private String approveRemark; |
| | | |
| | | @TableField(exist = false) |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.vo.ApproveNodeVo; |
| | | |
| | | import java.util.List; |
| | | |
| | | public interface IApproveNodeService extends IService<ApproveNode> { |
| | | |
| | | void initApproveNodes(String id); |
| | | /** |
| | | * 详æ
|
| | | * @param id |
| | | */ |
| | | List<ApproveNode> details(String id); |
| | | |
| | | void updateApproveNode(ApproveNodeVo approveNode); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.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.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; |
| | | import com.ruoyi.approve.vo.ApproveNodeVo; |
| | | import com.ruoyi.approve.vo.ApproveProcessVO; |
| | | import com.ruoyi.project.system.domain.SysDept; |
| | | |
| | | import java.util.List; |
| | | |
| | | public interface IApproveProcessService extends IService<ApproveProcess> { |
| | | /** |
| | | * æ·»å å®¡æ¹æµç¨ |
| | | * @param approveProcessVO å®¡æ¹æµç¨VO对象 |
| | | */ |
| | | void addApprove(ApproveProcessVO approveProcessVO); |
| | | /** |
| | | * æ ¹æ®é¨é¨idæ¥è¯¢é¨é¨ä¿¡æ¯ |
| | | * @param deptIds é¨é¨IDæ°ç» |
| | | */ |
| | | List<SysDept> selectDeptListByDeptIds(Long[] deptIds); |
| | | |
| | | IPage<ApproveProcess> listAll(Page page); |
| | | |
| | | void delApprove(Long[] ids); |
| | | |
| | | void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo); |
| | | |
| | | ApproveProcess getApproveById(String id); |
| | | |
| | | /** |
| | | * 审æ¹ç¶ææ´æ° |
| | | * @param approveNode |
| | | */ |
| | | void updateApproveProcessStatus(ApproveNodeVo approveNode); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.approve.mapper.ApproveNodeMapper; |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.approve.service.IApproveNodeService; |
| | | import com.ruoyi.approve.service.IApproveProcessService; |
| | | import com.ruoyi.approve.vo.ApproveNodeVo; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.Comparator; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService { |
| | | |
| | | @Autowired |
| | | private ApproveNodeMapper approveNodeMapper; |
| | | @Autowired |
| | | private IApproveProcessService approveProcessService; |
| | | |
| | | |
| | | @Override |
| | | public void initApproveNodes(String id) { |
| | | //ç§æ·id |
| | | Long tenantId = SecurityUtils.getLoginUser().getTenantId(); |
| | | |
| | | ApproveProcess approve = approveProcessService.getApproveById(id); |
| | | String[] names = approve.getApproveUserNames().split(","); |
| | | Long approveId = approve.getId(); |
| | | for (int i = 0; i < names.length; i++) { |
| | | ApproveNode approveNode = new ApproveNode(); |
| | | approveNode.setApproveProcessId(approveId); |
| | | approveNode.setApproveNodeOrder(i +1); |
| | | approveNode.setApproveNodeUser(names[i]); |
| | | approveNode.setApproveNodeTime(new Date()); |
| | | approveNode.setApproveNodeStatus(0); |
| | | approveNode.setTenantId(tenantId); |
| | | approveNode.setDeleteFlag(0); |
| | | approveNodeMapper.insert(approveNode); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<ApproveNode> details(String id) { |
| | | ApproveProcess approve = approveProcessService.getApproveById(id); |
| | | Long approveId = approve.getId(); |
| | | |
| | | LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(ApproveNode::getApproveProcessId, approveId); |
| | | List<ApproveNode> list = list(queryWrapper); |
| | | // æç
§ approveNodeOrder åæ®µååºæåº |
| | | list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); |
| | | return list; |
| | | } |
| | | |
| | | @Override |
| | | public void updateApproveNode(ApproveNodeVo approveNode) { |
| | | //æä¸ªèç¹å®¡æ¹ä¸éè¿ |
| | | if(approveNode.getApproveNodeStatus().intValue()==2){ |
| | | //ä¿®æ¹å®¡æ¹æµç¨ |
| | | ApproveNode node = approveNodeMapper.selectById(approveNode.getId()); |
| | | Long approveProcessId = node.getApproveProcessId(); |
| | | ApproveProcess approveProcess = approveProcessService.getBaseMapper().selectById(approveProcessId); |
| | | approveProcess.setApproveOverTime(new Date()); |
| | | approveProcess.setApproveStatus(3); |
| | | approveProcessService.saveOrUpdate(approveProcess); |
| | | |
| | | //审æ¹èç¹ç¶ææ¹å |
| | | initApproveNodes(approveProcess.getApproveId()); |
| | | |
| | | return; |
| | | } |
| | | //æ´æ°å®¡æ¹æµç¨ |
| | | approveProcessService.updateApproveProcessStatus(approveNode); |
| | | |
| | | //å®¡æ¹æµç¨å½å审æ¹äººä¿®æ¹ |
| | | ApproveNode node = getById(approveNode.getId()); |
| | | node.setApproveNodeTime(new Date()); |
| | | node.setApproveNodeStatus(approveNode.getApproveNodeStatus()); |
| | | approveNodeMapper.updateById(node); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.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.approve.mapper.ApproveProcessMapper; |
| | | import com.ruoyi.approve.pojo.ApproveNode; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.approve.service.IApproveNodeService; |
| | | import com.ruoyi.approve.service.IApproveProcessService; |
| | | import com.ruoyi.approve.utils.DailyRedisCounter; |
| | | import com.ruoyi.approve.vo.ApproveGetAndUpdateVo; |
| | | import com.ruoyi.approve.vo.ApproveNodeVo; |
| | | import com.ruoyi.approve.vo.ApproveProcessVO; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.project.system.domain.SysDept; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.project.system.mapper.SysDeptMapper; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.data.redis.core.StringRedisTemplate; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class ApproveProcessServiceImpl extends ServiceImpl<ApproveProcessMapper, ApproveProcess> implements IApproveProcessService { |
| | | private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); |
| | | |
| | | private final StringRedisTemplate redisTemplate; |
| | | |
| | | private final DailyRedisCounter dailyRedisCounter; |
| | | |
| | | private final SysDeptMapper sysDeptMapper; |
| | | private final IApproveNodeService approveNodeService; |
| | | private final SysUserMapper sysUserMapper; |
| | | private final ApproveProcessMapper approveProcessMapper; |
| | | |
| | | @Override |
| | | public void addApprove(ApproveProcessVO approveProcessVO) { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | //ç§æ·id |
| | | Long tenantId = SecurityUtils.getLoginUser().getTenantId(); |
| | | |
| | | String today = LocalDate.now().format(DATE_FORMAT); |
| | | Long approveId = dailyRedisCounter.incrementAndGet("approveId"); |
| | | String formattedCount = String.format("%03d", approveId); |
| | | //æµç¨ ID |
| | | String approveID = today + formattedCount; |
| | | |
| | | //审æ¹äººå§åå¤ç |
| | | String approverIds = approveProcessVO.getApproverIds(); |
| | | String[] idArray = approverIds.split(","); |
| | | String approverNames = getApproverNames(approveProcessVO.getApproverIds()); |
| | | String[] namdArray = approverIds.split(","); |
| | | |
| | | ApproveProcess approveProcess = new ApproveProcess(); |
| | | approveProcess.setApproveId(approveID); |
| | | approveProcess.setApproveUser(userId); |
| | | approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); |
| | | // approveProcess.setApproveDeptName(approveProcessVO.getDeptName()); |
| | | approveProcess.setApproveUserIds(approveProcessVO.getApproverIds()); |
| | | approveProcess.setApproveUserNames(approverNames); |
| | | approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[0])); |
| | | approveProcess.setApproveUserCurrentName(namdArray[0]); |
| | | approveProcess.setApproveTime(new Date()); |
| | | approveProcess.setApproveReason(approveProcessVO.getApproveReason()); |
| | | approveProcess.setApproveOverTime(null); |
| | | approveProcess.setApproveStatus(0); |
| | | approveProcess.setApproveDelete(0); |
| | | approveProcess.setTenantId(tenantId); |
| | | |
| | | save(approveProcess); |
| | | //åå§å审æ¹èç¹ |
| | | approveNodeService.initApproveNodes(approveID); |
| | | } |
| | | |
| | | private String getApproverNames(String approverIds) { |
| | | String[] idArray = approverIds.split(","); |
| | | |
| | | Integer[] ids = Arrays.stream(idArray) |
| | | .map(Integer::parseInt) |
| | | .toArray(Integer[]::new); |
| | | String names = ""; |
| | | StringBuilder stringBuilder = new StringBuilder(); |
| | | for (Integer id : ids) { |
| | | SysUser sysUser = sysUserMapper.selectUserById(id.longValue()); |
| | | names = stringBuilder + "," + sysUser.getUserName(); |
| | | } |
| | | return names; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public List<SysDept> selectDeptListByDeptIds(Long[] deptIds) { |
| | | List<SysDept> sysDeptList =new ArrayList<SysDept>(); |
| | | for (Long deptId : deptIds) { |
| | | SysDept sysDept = sysDeptMapper.selectDeptById(deptId); |
| | | sysDeptList.add(sysDept); |
| | | } |
| | | return sysDeptList; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ApproveProcess> listAll(Page page) { |
| | | LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(ApproveProcess::getApproveDelete, 0); |
| | | return approveProcessMapper.selectPage(page, queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public void delApprove(Long[] ids) { |
| | | for (Long id : ids) { |
| | | LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(ApproveProcess::getApproveDelete, 1); |
| | | update(queryWrapper); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public ApproveProcess getApproveById(String id) { |
| | | LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(ApproveProcess::getApproveId, id); |
| | | queryWrapper.eq(ApproveProcess::getApproveDelete, 0); |
| | | return getOne(queryWrapper); |
| | | } |
| | | |
| | | @Override |
| | | public void updateApproveProcessStatus(ApproveNodeVo approveNodeVo) { |
| | | ApproveNode node = approveNodeService.getById(approveNodeVo.getId()); |
| | | ApproveProcess approveProcess = getById(node.getApproveProcessId()); |
| | | |
| | | String[] idArray = approveProcess.getApproveUserIds().split(","); |
| | | String[] nameArray = approveProcess.getApproveUserNames().split(","); |
| | | |
| | | Integer noderOrder = approveNodeVo.getApproveNodeOrder(); |
| | | approveProcess.setApproveUserCurrentId(Long.parseLong(idArray[noderOrder])); |
| | | approveProcess.setApproveUserCurrentName(nameArray[noderOrder]); |
| | | |
| | | if(noderOrder.equals(1)){ |
| | | if(approveNodeVo.getApproveNodeStatus() == 1){ |
| | | approveProcess.setApproveStatus(1); |
| | | } |
| | | } |
| | | if(noderOrder.equals(idArray.length)){ |
| | | if(approveNodeVo.getApproveNodeStatus() == 1){ |
| | | approveProcess.setApproveStatus(2); |
| | | } |
| | | } |
| | | updateById(approveProcess); |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) { |
| | | ApproveProcess approve = getApproveById(approveGetAndUpdateVo.getId()); |
| | | approve.setApproveReason(approveGetAndUpdateVo.getApproveReason()); |
| | | updateById(approve); |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.utils; |
| | | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.StringRedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | |
| | | //åºäºredisçä¸ä¸ªæ¯æ¥è®¡æ°å¨ |
| | | @Component |
| | | public class DailyRedisCounter { |
| | | private static final String KEY_PREFIX = "daily_counter:"; |
| | | private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); |
| | | private final StringRedisTemplate redisTemplate; |
| | | |
| | | public DailyRedisCounter(StringRedisTemplate redisTemplate) { |
| | | this.redisTemplate = redisTemplate; |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®è®¡æ°å¨å¨ä»æ¥çæ°å¼ï¼å¹¶èªå¢1 |
| | | * @param counterName 计æ°å¨åç§°ï¼ä¾å¦ï¼login_countãorder_countï¼ |
| | | * @return 仿¥èªå¢åç计æ°å¼ |
| | | */ |
| | | public long incrementAndGet(String counterName) { |
| | | String key = getKey(counterName); |
| | | long count = redisTemplate.opsForValue().increment(key, 1); |
| | | |
| | | // ä»
å¨ç¬¬ä¸æ¬¡è®¾ç½®æ¶è®¾ç½®è¿ææ¶é´ï¼é¿å
éå¤è®¾ç½®ï¼ |
| | | // if (count == 0) { |
| | | // long secondsUntilMidnight = calculateSecondsUntilMidnight(); |
| | | // redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS); |
| | | // } |
| | | |
| | | return count; |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®è®¡æ°å¨å¨ä»æ¥çå½åæ°å¼ |
| | | * @param counterName 计æ°å¨åç§° |
| | | * @return 仿¥å½å计æ°å¼ï¼è¥ä¸åå¨åè¿å0 |
| | | */ |
| | | public long getCurrentCount(String counterName) { |
| | | String key = getKey(counterName); |
| | | String value = redisTemplate.opsForValue().get(key); |
| | | return value != null ? Long.parseLong(value) : 0; |
| | | } |
| | | |
| | | /** |
| | | * 计ç®è·ç¦»æ¬¡æ¥åæ¨çç§æ° |
| | | */ |
| | | private long calculateSecondsUntilMidnight() { |
| | | LocalDate tomorrow = LocalDate.now().plusDays(1); |
| | | LocalDate midnight = tomorrow.atStartOfDay().toLocalDate(); |
| | | return java.time.Duration.between( |
| | | LocalDate.now().atTime(23, 59, 59), |
| | | midnight.atTime(0, 0, 0) |
| | | ).getSeconds() + 1; |
| | | } |
| | | |
| | | /** |
| | | * çæRedisé® |
| | | */ |
| | | private String getKey(String counterName) { |
| | | String today = LocalDate.now().format(DATE_FORMAT); |
| | | return KEY_PREFIX + counterName + ":" + today; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | |
| | | @Data |
| | | public class ApproveGetAndUpdateVo { |
| | | //审æ¹id |
| | | // @NotBlank(message = "æµç¨ç¼å·ä¸è½ä¸ºç©º") |
| | | private String id; |
| | | //ç³è¯·äºç± |
| | | private String approveReason; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | @Data |
| | | public class ApproveNodeVo { |
| | | @NotNull |
| | | //æµç¨èç¹id |
| | | private Long id; |
| | | //æµç¨èç¹é¡ºåº |
| | | private Integer approveNodeOrder; |
| | | /** |
| | | * 审æ¹èç¹ç¶æ:1åæï¼2æç»ï¼0å°æªå®¡æ ¸ï¼é»è®¤ä¸º0ï¼ |
| | | */ |
| | | private Integer approveNodeStatus; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.vo; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | |
| | | @Data |
| | | public class ApproveProcessVO { |
| | | |
| | | //é¨é¨id |
| | | private Long approveDeptId; |
| | | //é¨é¨åç§° |
| | | //private String deptName; |
| | | //审æ¹äºº ids |
| | | private String approverIds; |
| | | //审æ¹äººåç§° |
| | | //private String approverNames; |
| | | //审æ¹äºç± |
| | | private String approveReason; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.dto; |
| | | |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class StorageBlobDTO extends StorageBlob { |
| | | private String url; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ Mapper æ¥å£ |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | @Mapper |
| | | public interface StorageAttachmentMapper extends BaseMapper<StorageAttachment> { |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ Mapper æ¥å£ |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | @Mapper |
| | | public interface StorageBlobMapper extends BaseMapper<StorageBlob> { |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ å®ä½ç±» |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-05-29 |
| | | */ |
| | | @Data |
| | | @TableName("storage_attachment") |
| | | public class StorageAttachment implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** å建æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Date createTime; |
| | | |
| | | /** æ´æ°æ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Date updateTime; |
| | | |
| | | /** |
| | | * é»è¾å é¤ |
| | | */ |
| | | @TableField(value = "deleted") |
| | | private Long deleted; |
| | | /** |
| | | * å
³èçè®°å½ç±»å |
| | | */ |
| | | @TableField(value = "record_type") |
| | | private Long recordType; |
| | | /** |
| | | * å
³èçè®°å½id |
| | | */ |
| | | @TableField(value = "record_id") |
| | | private Long recordId; |
| | | /** |
| | | * ç±»ååç§°, å¦: file, avatar (åºåå䏿¡è®°å½ä¸åç±»åçéä»¶) |
| | | */ |
| | | @TableField(value = "name") |
| | | private String name; |
| | | /** |
| | | * å
³èstorage_blobè®°å½id |
| | | */ |
| | | @TableField(value = "storage_blob_id") |
| | | private Long storageBlobId; |
| | | |
| | | private StorageBlobDTO storageBlobDTO; |
| | | |
| | | public StorageAttachment(String fileType, Long recordType, Long recordId) { |
| | | this.name = fileType; |
| | | this.recordType = recordType; |
| | | this.recordId = 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.fasterxml.jackson.annotation.JsonFormat; |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ å®ä½ç±» |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-05-29 |
| | | */ |
| | | @Data |
| | | @TableName("storage_blob") |
| | | public class StorageBlob implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | @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; |
| | | /** |
| | | * èµæºç±»åï¼ä¾å¦JPGå¾ççèµæºç±»å为image/jpg |
| | | */ |
| | | @TableField(value = "content_type") |
| | | private String contentType; |
| | | /** |
| | | * åæä»¶å |
| | | */ |
| | | @TableField(value = "original_filename") |
| | | private String originalFilename; |
| | | |
| | | /** |
| | | * å卿¡¶ä¸ |
| | | */ |
| | | @TableField(value = "bucket_filename") |
| | | private String bucketFilename; |
| | | /** |
| | | * å卿¡¶å |
| | | */ |
| | | @TableField(value = "bucket_name") |
| | | private String bucketName; |
| | | /** |
| | | * èµæºå°ºå¯¸(åè) |
| | | */ |
| | | @TableField(value = "byte_size") |
| | | private Long byteSize; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.common.constant.StorageAttachmentConstants; |
| | | import com.ruoyi.common.enums.StorageAttachmentRecordType; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ æå¡ç±» |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | public interface StorageAttachmentService extends IService<StorageAttachment> { |
| | | /** |
| | | * æ¥è¯¢éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param recordId å
³èè®°å½id |
| | | * @param recordType å
³èè®°å½ç±»å |
| | | * @param fileType æä»¶ç±»å |
| | | * @return æä»¶ä¿¡æ¯å表 |
| | | */ |
| | | List<StorageAttachment> selectStorageAttachments(Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType); |
| | | |
| | | /** |
| | | * ä¿åéç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param attachments æä»¶ä¿¡æ¯å表 |
| | | * @param recordId 管çè®°å½id |
| | | * @param recordType å
³èè®°å½ç±»å |
| | | * @param fileType æä»¶ç±»å |
| | | */ |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType); |
| | | |
| | | /** |
| | | * å é¤éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param storageAttachment æä»¶ä¿¡æ¯ |
| | | * @return å é¤ç»æ |
| | | */ |
| | | public int deleteStorageAttachment(StorageAttachment storageAttachment); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service; |
| | | |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ æå¡ç±» |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | public interface StorageBlobService extends IService<StorageBlob> { |
| | | |
| | | /** |
| | | * æä»¶ä¸ä¼ æ¥å£ |
| | | * @param files æä»¶ä¿¡æ¯ |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @return ä¸ä¼ ç»æ |
| | | */ |
| | | List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName); |
| | | |
| | | /** |
| | | * æ¹éå 餿件 |
| | | * @param attachment |
| | | * @return |
| | | */ |
| | | public int deleteStorageBlobs(StorageAttachment attachment); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.mapper.StorageAttachmentMapper; |
| | | import com.ruoyi.basic.mapper.StorageBlobMapper; |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import com.ruoyi.basic.service.StorageAttachmentService; |
| | | import com.ruoyi.basic.service.StorageBlobService; |
| | | import com.ruoyi.common.constant.StorageAttachmentConstants; |
| | | import com.ruoyi.common.enums.StorageAttachmentRecordType; |
| | | import com.ruoyi.common.utils.MinioUtils; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ æå¡å®ç°ç±» |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class StorageAttachmentServiceImpl extends ServiceImpl<StorageAttachmentMapper, StorageAttachment> implements StorageAttachmentService { |
| | | @Autowired |
| | | private StorageBlobMapper storageBlobMapper; |
| | | |
| | | @Autowired |
| | | private StorageAttachmentMapper storageAttachmentMapper; |
| | | |
| | | @Autowired |
| | | private StorageBlobService storageBlobService; |
| | | |
| | | @Autowired |
| | | private MinioUtils minioUtils; |
| | | |
| | | @Override |
| | | public List<StorageAttachment> selectStorageAttachments(Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType) { |
| | | List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordId, recordId) |
| | | .eq(StorageAttachment::getRecordType, recordType.ordinal()) |
| | | .eq(StorageAttachment::getName, fileType.toString())); |
| | | if (storageAttachments != null) { |
| | | for (StorageAttachment storageAttachment : storageAttachments) { |
| | | StorageBlob storageBlob = storageBlobMapper.selectById(storageAttachment.getStorageBlobId()); |
| | | StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); |
| | | BeanUtils.copyProperties(storageBlob, storageBlobDTO); |
| | | storageBlobDTO.setUrl(minioUtils.getPreviewUrl(storageBlob.getBucketName(), storageBlob.getBucketName(), true)); |
| | | storageAttachment.setStorageBlobDTO(storageBlobDTO); |
| | | } |
| | | } |
| | | |
| | | return storageAttachments; |
| | | } |
| | | |
| | | @Override |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType) { |
| | | // å 餿§å¾ |
| | | deleteStorageAttachment(new StorageAttachment(fileType.toString(), (long) recordType.ordinal(), recordId)); |
| | | for (StorageAttachment attachment : attachments) { |
| | | // è·åå
³èè®°å½ |
| | | StorageBlob storageBlob = attachment.getStorageBlobDTO(); |
| | | attachment.setName(fileType.toString()); |
| | | attachment.setRecordType((long) recordType.ordinal()); |
| | | attachment.setRecordId(recordId); |
| | | attachment.setStorageBlobId(storageBlob.getId()); |
| | | storageAttachmentMapper.insert(attachment); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public int deleteStorageAttachment(StorageAttachment storageAttachment) { |
| | | // å
å 餿ç»è¡¨ |
| | | storageBlobService.deleteStorageBlobs(storageAttachment); |
| | | |
| | | |
| | | return storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordId, storageAttachment.getRecordId()) |
| | | .eq(StorageAttachment::getRecordType, storageAttachment.getRecordType()) |
| | | .eq(StorageAttachment::getName, storageAttachment.getName())); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | 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.StorageBlobService; |
| | | import com.ruoyi.common.exception.file.InvalidExtensionException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.MinioUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.uuid.IdUtils; |
| | | import com.ruoyi.framework.web.domain.MinioResult; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | | * éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ æå¡å®ç°ç±» |
| | | * </p> |
| | | * |
| | | * @author ruoyi |
| | | * @since 2025-05-29 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class StorageBlobServiceImpl extends ServiceImpl<StorageBlobMapper, StorageBlob> implements StorageBlobService { |
| | | @Autowired |
| | | private StorageAttachmentMapper storageAttachmentMapper; |
| | | |
| | | @Autowired |
| | | private StorageBlobMapper storageBlobMapper; |
| | | |
| | | @Autowired |
| | | private MinioUtils minioUtils; |
| | | |
| | | @Override |
| | | public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName) { |
| | | |
| | | // è¥æ²¡ä¼ å
¥bucketNameï¼å使ç¨é»è®¤bucketName |
| | | if (StringUtils.isEmpty(bucketName)) { |
| | | bucketName = minioUtils.getDefaultBucket(); |
| | | } |
| | | |
| | | List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>(); |
| | | for (MultipartFile file : files) { |
| | | try { |
| | | MinioResult res = minioUtils.upload(bucketName, file, false); |
| | | StorageBlobDTO dto = new StorageBlobDTO(); |
| | | dto.setContentType(file.getContentType()); |
| | | dto.setBucketFilename(res.getBucketFileName()); |
| | | dto.setOriginalFilename(res.getOriginalName()); |
| | | dto.setByteSize(file.getSize()); |
| | | dto.setKey(IdUtils.simpleUUID()); |
| | | dto.setBucketName(bucketName); |
| | | dto.setCreateTime(DateUtils.getNowDate()); |
| | | dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false)); |
| | | // æå
¥æ°æ®åº |
| | | storageBlobMapper.insert(dto); |
| | | |
| | | storageBlobDTOs.add(dto); |
| | | } catch (InvalidExtensionException e) { |
| | | throw new RuntimeException("minioæä»¶ä¸ä¼ å¼å¸¸ï¼" + e); |
| | | } |
| | | } |
| | | |
| | | |
| | | return storageBlobDTOs; |
| | | } |
| | | |
| | | @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()); |
| | | List<StorageBlob> storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>() |
| | | .in(StorageBlob::getId, ids)); |
| | | if (!storageBlobs.isEmpty()) { |
| | | for (StorageBlob storageBlob : storageBlobs) { |
| | | // ç§»é¤æ¡¶å
æä»¶ |
| | | minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketName()); |
| | | } |
| | | } |
| | | |
| | | if (!ids.isEmpty()) { |
| | | return storageBlobMapper.delete(new QueryWrapper<StorageBlob>().lambda().in(StorageBlob::getId, ids)); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.common.config; |
| | | |
| | | import io.minio.MinioClient; |
| | | import lombok.Data; |
| | | import org.springframework.boot.context.properties.ConfigurationProperties; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | @Configuration |
| | | @Component |
| | | @ConfigurationProperties(prefix = "minio") |
| | | @Data |
| | | public class MinioConfig { |
| | | private String endpoint; |
| | | private int port; |
| | | private String accessKey; |
| | | private String secretKey; |
| | | private Boolean secure; |
| | | |
| | | @Bean |
| | | public MinioClient getMinioClient() { |
| | | return MinioClient.builder().endpoint(endpoint, port, secure) |
| | | .credentials(accessKey, secretKey) |
| | | .build(); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.common.constant; |
| | | |
| | | /** |
| | | * é件常é |
| | | */ |
| | | public class StorageAttachmentConstants { |
| | | |
| | | /** |
| | | * æä»¶ |
| | | */ |
| | | public static final String StorageAttachmentFile = "file"; |
| | | |
| | | /** |
| | | * å¾ç |
| | | */ |
| | | public static final String StorageAttachmentImage = "image"; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.common.enums; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | |
| | | /** |
| | | * éä»¶è®°å½ç±»åæä¸¾ |
| | | * |
| | | */ |
| | | @AllArgsConstructor |
| | | public enum StorageAttachmentRecordType { |
| | | // ä¾å å®é
å¼å请å é¤ |
| | | Template("Template","èä¾"); |
| | | |
| | | |
| | | private final String code; |
| | | private final String info; |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getInfo() { |
| | | return info; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.common.utils; |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
| | | import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
| | | import com.ruoyi.common.exception.UtilException; |
| | | import com.ruoyi.common.exception.file.InvalidExtensionException; |
| | | import com.ruoyi.common.utils.file.FileUploadUtils; |
| | | import com.ruoyi.common.utils.file.MimeTypeUtils; |
| | | import com.ruoyi.framework.web.domain.MinioResult; |
| | | import io.minio.*; |
| | | import io.minio.http.Method; |
| | | import io.minio.messages.DeleteError; |
| | | import io.minio.messages.DeleteObject; |
| | | import lombok.Getter; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.FastByteArrayOutputStream; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.servlet.ServletOutputStream; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.InputStream; |
| | | 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.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Component |
| | | public class MinioUtils { |
| | | |
| | | @Autowired |
| | | private MinioClient minioClient; |
| | | |
| | | @Value("${minio.preview-expiry}") |
| | | private Integer previewExpiry; |
| | | |
| | | /** |
| | | * -- GETTER -- |
| | | * è·åé»è®¤å卿¡¶åç§° |
| | | * |
| | | * @return |
| | | */ |
| | | @Getter |
| | | @Value("${minio.default-bucket}") |
| | | private String defaultBucket; |
| | | |
| | | /** |
| | | * 夿å卿¡¶æ¯å¦åå¨ï¼ä¸åå¨åå建 |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | */ |
| | | public void existBucket(String bucketName) { |
| | | try { |
| | | boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); |
| | | if (!exists) { |
| | | minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å建å卿¡¶ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @return æ¯å¦å建æå |
| | | */ |
| | | public Boolean makeBucket(String bucketName) { |
| | | try { |
| | | minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * å é¤å卿¡¶ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @return æ¯å¦å 餿å |
| | | */ |
| | | public Boolean removeBucket(String bucketName) { |
| | | try { |
| | | minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * å¤æå¯¹è±¡æ¯å¦åå¨ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param originalFileName MinIOä¸åå¨å¯¹è±¡å
¨è·¯å¾ |
| | | * @return 对象æ¯å¦åå¨ |
| | | */ |
| | | public boolean existObject(String bucketName, String originalFileName) { |
| | | try { |
| | | minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(originalFileName).build()); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * æä»¶ä¸ä¼ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param file æä»¶ |
| | | * @return æ¡¶ä¸ä½ç½® |
| | | */ |
| | | public MinioResult upload(String bucketName, MultipartFile file, Boolean isPreviewExpiry) throws InvalidExtensionException { |
| | | MultipartFile[] fileArr = {file}; |
| | | List<MinioResult> fileNames = upload(bucketName, fileArr, isPreviewExpiry); |
| | | return fileNames.isEmpty() ? null : fileNames.get(0); |
| | | } |
| | | |
| | | /** |
| | | * ä¸ä¼ æä»¶ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param fileList æä»¶å表 |
| | | * @return æ¡¶ä¸ä½ç½®å表 |
| | | */ |
| | | public List<MinioResult> upload(String bucketName, List<MultipartFile> fileList, Boolean isPreviewExpiry) throws InvalidExtensionException { |
| | | MultipartFile[] fileArr = fileList.toArray(new MultipartFile[0]); |
| | | return upload(bucketName, fileArr, isPreviewExpiry); |
| | | } |
| | | |
| | | /** |
| | | * description: ä¸ä¼ æä»¶ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param fileArr æä»¶å表 |
| | | * @return æ¡¶ä¸ä½ç½®å表 |
| | | */ |
| | | public List<MinioResult> upload(String bucketName, MultipartFile[] fileArr, Boolean isPreviewExpiry) throws InvalidExtensionException { |
| | | for (MultipartFile file : fileArr) { |
| | | FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); |
| | | } |
| | | // ä¿è¯æ¡¶ä¸å®åå¨ |
| | | existBucket(bucketName); |
| | | // æ§è¡æ£å¸¸æä½ |
| | | List<MinioResult> bucketFileNames = new ArrayList<>(fileArr.length); |
| | | for (MultipartFile file : fileArr) { |
| | | // è·ååå§æä»¶åç§° |
| | | String originalFileName = file.getOriginalFilename(); |
| | | // è·åå½åæ¥æï¼æ ¼å¼ä¾å¦ï¼2020-11 |
| | | String datePath = new SimpleDateFormat("yyyy-MM").format(new Date()); |
| | | // æä»¶åç§° |
| | | String uuid = IdWorker.get32UUID(); |
| | | // è·åæä»¶åç¼ |
| | | String suffix = originalFileName.substring(originalFileName.lastIndexOf(".")); |
| | | String bucketFilePath = datePath + "/" + uuid + suffix; |
| | | |
| | | // æ¨éæä»¶å°MinIO |
| | | try (InputStream in = file.getInputStream()) { |
| | | minioClient.putObject(PutObjectArgs.builder() |
| | | .bucket(bucketName) |
| | | .object(bucketFilePath) |
| | | .stream(in, in.available(), -1) |
| | | .contentType(file.getContentType()) |
| | | .build() |
| | | ); |
| | | } catch (Exception e) { |
| | | throw new UtilException("MinioUtilsï¼ä¸ä¼ æä»¶å·¥å
·ç±»å¼å¸¸:" + e); |
| | | } |
| | | MinioResult minioResult = new MinioResult(); |
| | | minioResult.setBucketFileName(bucketFilePath); |
| | | // è¿åæ°¸ä¹
é¢è§å°å |
| | | if (isPreviewExpiry) { |
| | | String previewUrl = getPreviewUrl(bucketFilePath, bucketName, isPreviewExpiry); |
| | | minioResult.setPreviewExpiry(previewUrl); |
| | | } |
| | | minioResult.setOriginalName(originalFileName); |
| | | bucketFileNames.add(minioResult); |
| | | } |
| | | return bucketFileNames; |
| | | } |
| | | |
| | | /** |
| | | * æä»¶ä¸è½½ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param bucketFileName æ¡¶ä¸æä»¶åç§° |
| | | * @param originalFileName åå§æä»¶åç§° |
| | | * @param response response对象 |
| | | */ |
| | | public void download(String bucketName, String bucketFileName, String originalFileName, HttpServletResponse response) { |
| | | GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName).object(bucketFileName).build(); |
| | | try (GetObjectResponse objResponse = minioClient.getObject(objectArgs)) { |
| | | byte[] buf = new byte[1024]; |
| | | int len; |
| | | try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) { |
| | | while ((len = objResponse.read(buf)) != -1) { |
| | | os.write(buf, 0, len); |
| | | } |
| | | os.flush(); |
| | | byte[] bytes = os.toByteArray(); |
| | | response.setCharacterEncoding("utf-8"); |
| | | //设置强å¶ä¸è½½ä¸æå¼ |
| | | response.setContentType("application/force-download"); |
| | | // 设置éä»¶åç§°ç¼ç |
| | | originalFileName = new String(originalFileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); |
| | | // 设置éä»¶åç§° |
| | | response.addHeader("Content-Disposition", "attachment;fileName=" + originalFileName); |
| | | // åå
¥æä»¶ |
| | | try (ServletOutputStream stream = response.getOutputStream()) { |
| | | stream.write(bytes); |
| | | stream.flush(); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | throw new UtilException("MinioUtilsï¼ä¸ä¼ æä»¶å·¥å
·ç±»å¼å¸¸"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åå·²ä¸ä¼ 对象çæä»¶æµï¼å端å 为ä¸å¡éè¦è·åæä»¶æµå¯ä»¥è°ç¨è¯¥æ¹æ³ï¼ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param bucketFileName æ¡¶ä¸æä»¶åç§° |
| | | * @return æä»¶æµ |
| | | */ |
| | | public InputStream getFileStream(String bucketName, String bucketFileName) throws Exception { |
| | | GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName).object(bucketFileName).build(); |
| | | return minioClient.getObject(objectArgs); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå é¤æä»¶å¯¹è±¡ç»æ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param bucketFileName æ¡¶ä¸æä»¶åç§° |
| | | * @return å é¤ç»æ |
| | | */ |
| | | public DeleteError removeObjectsResult(String bucketName, String bucketFileName) { |
| | | List<DeleteError> results = removeObjectsResult(bucketName, Collections.singletonList(bucketFileName)); |
| | | return !results.isEmpty() ? results.get(0) : null; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå é¤æä»¶å¯¹è±¡ç»æ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param bucketFileNames æ¡¶ä¸æä»¶åç§°éå |
| | | * @return å é¤ç»æ |
| | | */ |
| | | public List<DeleteError> removeObjectsResult(String bucketName, List<String> bucketFileNames) { |
| | | Iterable<Result<DeleteError>> results = removeObjects(bucketName, bucketFileNames); |
| | | List<DeleteError> res = new ArrayList<>(); |
| | | for (Result<DeleteError> result : results) { |
| | | try { |
| | | res.add(result.get()); |
| | | } catch (Exception e) { |
| | | throw new UtilException("MinioUtilsï¼ä¸ä¼ æä»¶å·¥å
·ç±»å¼å¸¸"); |
| | | } |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå é¤æä»¶å¯¹è±¡ |
| | | * |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param bucketFileNames æ¡¶ä¸æä»¶åç§°éå |
| | | */ |
| | | private Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> bucketFileNames) { |
| | | List<DeleteObject> dos = bucketFileNames.stream().map(DeleteObject::new).collect(Collectors.toList()); |
| | | return minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build()); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢é¢è§url |
| | | * @param bucketFileName minioæä»¶åç§° |
| | | * @param bucketName å卿¡¶åç§° |
| | | * @param isPreviewExpiry æ¯å¦éè¦è¿ææ¶é´ é»è®¤24å°æ¶ |
| | | * @return |
| | | */ |
| | | public String getPreviewUrl(String bucketFileName, String bucketName, Boolean isPreviewExpiry) { |
| | | if (StringUtils.isNotBlank(bucketFileName)) { |
| | | try { |
| | | minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(bucketFileName).build()); |
| | | // 为falseåªçæ24å°æ¶æææ¶é¿çurl龿¥ï¼å¯ä»¥è®¿é®è¯¥æä»¶ |
| | | if (isPreviewExpiry){ |
| | | return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(bucketFileName).build()); |
| | | }else { |
| | | return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(bucketFileName).expiry(previewExpiry, TimeUnit.HOURS).build()); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new UtilException("MinioUtilsï¼ä¸ä¼ æä»¶å·¥å
·ç±»å¼å¸¸"); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | } |
| | |
| | | return user.getUserName();
|
| | | }
|
| | |
|
| | | public String getNickName()
|
| | | {
|
| | | return user.getNickName();
|
| | | }
|
| | |
|
| | | /**
|
| | | * è´¦æ·æ¯å¦æªè¿æ,è¿ææ æ³éªè¯
|
| | | */
|
| | |
| | | public void refreshToken(LoginUser loginUser)
|
| | | {
|
| | | loginUser.setLoginTime(System.currentTimeMillis());
|
| | |
|
| | | loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
|
| | | // æ ¹æ®uuidå°loginUserç¼å
|
| | | String userKey = getTokenKey(loginUser.getToken());
|
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.framework.web.domain; |
| | | |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class MinioResult { |
| | | // minioä¸çæä»¶åç§° |
| | | private String bucketFileName; |
| | | |
| | | // æºæä»¶åç§° |
| | | private String originalName; |
| | | |
| | | // é¢è§è·¯å¾ |
| | | private String previewExpiry; |
| | | } |
| | |
| | | |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.other.service.TempFileService; |
| | | import com.ruoyi.purchase.dto.ProductRecordDto; |
| | | import com.ruoyi.purchase.dto.TicketRegistrationDto; |
| | | import com.ruoyi.purchase.service.ITicketRegistrationService; |
| | | import com.ruoyi.purchase.service.impl.TicketRegistrationServiceImpl; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | |
| | | |
| | | private TempFileService tempFileService; |
| | | |
| | | private TicketRegistrationServiceImpl ticketRegistrationServiceImpl; |
| | | |
| | | @PostMapping("/upload") |
| | | public AjaxResult uploadFile(MultipartFile file, Integer type) { |
| | | try { |
| | |
| | | } |
| | | } |
| | | |
| | | @PostMapping("uploadFile") |
| | | public AjaxResult uploadFile(@RequestBody ProductRecordDto productRecordDto) { |
| | | try { |
| | | if (!productRecordDto.getTempFileIds().isEmpty()&&productRecordDto.getTicketRegistrationId() != null) { |
| | | ticketRegistrationServiceImpl.migrateTempFilesToFormal(productRecordDto.getTicketRegistrationId(), productRecordDto.getTempFileIds()); |
| | | } |
| | | } catch (Exception e) { |
| | | return AjaxResult.error(e.getMessage()); |
| | | } |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.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.controller.BaseController; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.framework.web.page.TableDataInfo; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementAddDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; |
| | | import com.ruoyi.procurementrecord.service.ProcurementRecordService; |
| | | import com.ruoyi.purchase.dto.InvoicePurchaseReportDto; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import io.swagger.annotations.Api; |
| | | 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/7/7 14:32 |
| | | */ |
| | | @RestController |
| | | @Api(tags = "éè´å
¥åº") |
| | | @RequestMapping("/stockin") |
| | | public class ProcurementRecordController extends BaseController { |
| | | |
| | | |
| | | @Autowired |
| | | private ProcurementRecordService procurementRecordService; |
| | | |
| | | @GetMapping("/productlist") |
| | | @Log(title = "éè´å
¥åº-å
¥åºç®¡ç-æ°å¢å
¥åºæ¥è¯¢", businessType = BusinessType.OTHER) |
| | | public AjaxResult list(ProcurementDto procurementDto) { |
| | | List<ProcurementDto> result =procurementRecordService.listProcurementBySalesLedgerId(procurementDto); |
| | | return AjaxResult.success(result); |
| | | } |
| | | |
| | | @PostMapping("/add") |
| | | @Log(title = "éè´å
¥åº-å
¥åºç®¡ç-æ°å¢å
¥åº", businessType = BusinessType.INSERT) |
| | | @Transactional |
| | | public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) { |
| | | return AjaxResult.success(procurementRecordService.add(procurementDto)); |
| | | } |
| | | |
| | | @PostMapping("/update") |
| | | @Log(title = "éè´å
¥åº-å
¥åºç®¡ç-ä¿®æ¹å
¥åº", businessType = BusinessType.UPDATE) |
| | | @Transactional |
| | | public AjaxResult updatePro(@RequestBody ProcurementUpdateDto procurementDto) { |
| | | return AjaxResult.success(procurementRecordService.updatePro(procurementDto)); |
| | | } |
| | | |
| | | @PostMapping("/del") |
| | | @Log(title = "éè´å
¥åº-å
¥åºç®¡ç-å é¤å
¥åº", businessType = BusinessType.DELETE) |
| | | @Transactional |
| | | public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) { |
| | | return AjaxResult.success(procurementRecordService.deletePro(procurementDto)); |
| | | } |
| | | |
| | | @GetMapping("/listPage") |
| | | @Log(title = "éè´å
¥åº-å
¥åºç®¡ç-å
¥åºæ¥è¯¢", businessType = BusinessType.OTHER) |
| | | public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) { |
| | | IPage<ProcurementPageDto> result =procurementRecordService.listPage(page, procurementDto); |
| | | return AjaxResult.success(result); |
| | | } |
| | | |
| | | /** |
| | | * å¯¼åº |
| | | * @param response |
| | | */ |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response) { |
| | | procurementRecordService.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.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.procurementrecord.dto.ProcurementPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; |
| | | import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; |
| | | import io.swagger.annotations.Api; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:30 |
| | | */ |
| | | @RestController |
| | | @Api(tags = "éè´åºåº") |
| | | @RequestMapping("/stockmanagement") |
| | | public class ProcurementRecordOutController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ProcurementRecordOutService procurementRecordOutService; |
| | | |
| | | @PostMapping("/stockout") |
| | | @Log(title = "éè´å
¥åº-åºåºç®¡ç-åºåº", businessType = BusinessType.INSERT) |
| | | public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) { |
| | | return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd)); |
| | | } |
| | | |
| | | @GetMapping("/listPage") |
| | | @Log(title = "éè´å
¥åº-åºåºç®¡ç-åºåºæ¥è¯¢", businessType = BusinessType.OTHER) |
| | | public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) { |
| | | IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto); |
| | | return AjaxResult.success(result); |
| | | } |
| | | |
| | | @PostMapping("/del") |
| | | @Log(title = "éè´å
¥åº-åºåºç®¡ç-å é¤åºåº", businessType = BusinessType.DELETE) |
| | | public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) { |
| | | return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto)); |
| | | } |
| | | |
| | | /** |
| | | * å¯¼åº |
| | | * @param response |
| | | */ |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response) { |
| | | procurementRecordOutService.export(response); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 16:17 |
| | | */ |
| | | public class Details { |
| | | private Integer id; |
| | | private BigDecimal inboundQuantity; |
| | | public Integer getId() { |
| | | return id; |
| | | } |
| | | public void setId(Integer id) { |
| | | this.id = id; |
| | | } |
| | | public BigDecimal getInboundQuantity() { |
| | | return inboundQuantity; |
| | | } |
| | | public void setInboundQuantity(BigDecimal inboundQuantity) { |
| | | this.inboundQuantity = inboundQuantity; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 16:07 |
| | | */ |
| | | @Data |
| | | public class ProcurementAddDto { |
| | | |
| | | private List<Details> details; |
| | | |
| | | private String nickName; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 14:46 |
| | | */ |
| | | @Data |
| | | public class ProcurementDto { |
| | | |
| | | private String purchaseContractNumber; |
| | | |
| | | private Integer id; |
| | | |
| | | private Integer recordId; |
| | | |
| | | /** |
| | | * å
¥åºæ°é |
| | | */ |
| | | private Integer quantityStock; |
| | | |
| | | /** |
| | | * ä¾åºååç§° |
| | | */ |
| | | @Excel(name = "ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | |
| | | /** |
| | | * 产å大类 |
| | | */ |
| | | @Excel(name = "产å大类") |
| | | private String productCategory; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | @Excel(name = "è§æ ¼åå·") |
| | | private String specificationModel; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | @Excel(name = "åä½") |
| | | private String unit; |
| | | |
| | | /** |
| | | * æ°é |
| | | */ |
| | | @Excel(name = "æ°é") |
| | | private BigDecimal quantity; |
| | | |
| | | /** |
| | | * å¾
å
¥åºæ°é |
| | | */ |
| | | @Excel(name = "å¾
å
¥åºæ°é") |
| | | private BigDecimal quantity0; |
| | | |
| | | /** |
| | | * ç¨ç |
| | | */ |
| | | @Excel(name = "ç¨ç") |
| | | private BigDecimal taxRate; |
| | | |
| | | /** |
| | | * å«ç¨åä»· |
| | | */ |
| | | @Excel(name = "å«ç¨åä»·") |
| | | private BigDecimal taxInclusiveUnitPrice; |
| | | |
| | | /** |
| | | * å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "å«ç¨æ»ä»·") |
| | | private BigDecimal taxInclusiveTotalPrice; |
| | | |
| | | /** |
| | | * ä¸å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "ä¸å«ç¨æ»ä»·") |
| | | private BigDecimal taxExclusiveTotalPrice; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Excel; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 17:00 |
| | | */ |
| | | @Data |
| | | public class ProcurementPageDto { |
| | | |
| | | private Integer id; |
| | | |
| | | /** |
| | | * å
¥åºæ¹æ¬¡ |
| | | */ |
| | | @Excel(name = "å
¥åºæ¹æ¬¡") |
| | | private String inboundBatches; |
| | | |
| | | /** |
| | | * ååå· |
| | | */ |
| | | private String purchaseContractNumber; |
| | | |
| | | private String salesLedgerProductId; |
| | | |
| | | /** |
| | | * åºå
¥åºæ°é |
| | | */ |
| | | @Excel(name = "å
¥åºæ°é") |
| | | private BigDecimal inboundNum; |
| | | |
| | | /** |
| | | * å¾
åºåºæ°é |
| | | */ |
| | | @Excel(name = "å¾
åºåºæ°é") |
| | | private BigDecimal inboundNum0; |
| | | |
| | | |
| | | /** |
| | | * åºå
¥åºæ¶é´ |
| | | */ |
| | | @Excel(name = "å
¥åºæ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime createDate; |
| | | |
| | | /** |
| | | * åºå
¥åºç¨æ· |
| | | */ |
| | | @Excel(name = "å
¥åºäºº") |
| | | private String createBy; |
| | | |
| | | /** |
| | | * ä¾åºååç§° |
| | | */ |
| | | @Excel(name = "ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | |
| | | /** |
| | | * 产å大类 |
| | | */ |
| | | @Excel(name = "产å大类") |
| | | private String productCategory; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | @Excel(name = "è§æ ¼åå·") |
| | | private String specificationModel; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | @Excel(name = "åä½") |
| | | private String unit; |
| | | |
| | | /** |
| | | * ç¨ç |
| | | */ |
| | | @Excel(name = "ç¨ç(%)") |
| | | private BigDecimal taxRate; |
| | | |
| | | /** |
| | | * å«ç¨åä»· |
| | | */ |
| | | @Excel(name = "å«ç¨åä»·") |
| | | private BigDecimal taxInclusiveUnitPrice; |
| | | |
| | | /** |
| | | * å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "å«ç¨æ»ä»·") |
| | | private BigDecimal taxInclusiveTotalPrice; |
| | | |
| | | /** |
| | | * ä¸å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "ä¸å«ç¨æ»ä»·") |
| | | private BigDecimal taxExclusiveTotalPrice; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:34 |
| | | */ |
| | | @Data |
| | | public class ProcurementRecordOutAdd { |
| | | |
| | | private String quantity; |
| | | |
| | | private String time; |
| | | |
| | | private Integer id; |
| | | |
| | | private Integer userId; |
| | | |
| | | 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 java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 14:13 |
| | | */ |
| | | @Data |
| | | public class ProcurementRecordOutPageDto { |
| | | |
| | | private Integer id; |
| | | |
| | | /** |
| | | * åºå
¥åºæ°é |
| | | */ |
| | | @Excel(name = "åºåºæ°é") |
| | | private BigDecimal inboundNum; |
| | | |
| | | /** |
| | | * åºå
¥åºæ¶é´ |
| | | */ |
| | | @Excel(name = "åºåºæ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private LocalDateTime createDate; |
| | | |
| | | /** |
| | | * åºå
¥åºç¨æ· |
| | | */ |
| | | @Excel(name = "åºåºäºº") |
| | | private String createBy; |
| | | |
| | | /** |
| | | * ä¾åºååç§° |
| | | */ |
| | | @Excel(name = "ä¾åºååç§°") |
| | | private String supplierName; |
| | | |
| | | |
| | | /** |
| | | * 产å大类 |
| | | */ |
| | | @Excel(name = "产å大类") |
| | | private String productCategory; |
| | | |
| | | /** |
| | | * è§æ ¼åå· |
| | | */ |
| | | @Excel(name = "è§æ ¼åå·") |
| | | private String specificationModel; |
| | | |
| | | /** |
| | | * åä½ |
| | | */ |
| | | @Excel(name = "åä½") |
| | | private String unit; |
| | | |
| | | /** |
| | | * ç¨ç |
| | | */ |
| | | @Excel(name = "ç¨ç(%)") |
| | | private BigDecimal taxRate; |
| | | |
| | | /** |
| | | * å«ç¨åä»· |
| | | */ |
| | | @Excel(name = "å«ç¨åä»·") |
| | | private BigDecimal taxInclusiveUnitPrice; |
| | | |
| | | /** |
| | | * å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "å«ç¨æ»ä»·") |
| | | private BigDecimal taxInclusiveTotalPrice; |
| | | |
| | | /** |
| | | * ä¸å«ç¨æ»ä»· |
| | | */ |
| | | @Excel(name = "ä¸å«ç¨æ»ä»·") |
| | | private BigDecimal taxExclusiveTotalPrice; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 10:40 |
| | | */ |
| | | @Data |
| | | public class ProcurementUpdateDto { |
| | | |
| | | private Integer id; |
| | | |
| | | private BigDecimal quantityStock; |
| | | |
| | | private List<Integer> ids; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.InterceptorIgnore; |
| | | 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.dto.ProcurementDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementPageDto; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecord; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 14:30 |
| | | */ |
| | | public interface ProcurementRecordMapper extends BaseMapper<ProcurementRecord> { |
| | | /** |
| | | * æ ¹æ®éè´å°è´¦idæ¥è¯¢éè´å
¥åºä¿¡æ¯ |
| | | * |
| | | * @param procurementDto |
| | | * @return |
| | | */ |
| | | List<ProcurementDto> listProcurementBySalesLedgerId(@Param("req") ProcurementDto procurementDto); |
| | | |
| | | IPage<ProcurementPageDto> listPage(Page page,@Param("req") ProcurementPageDto procurementDto); |
| | | |
| | | List<ProcurementPageDto> list(); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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.dto.ProcurementRecordOutPageDto; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:26 |
| | | */ |
| | | public interface ProcurementRecordOutMapper extends BaseMapper<ProcurementRecordOut> { |
| | | |
| | | IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto); |
| | | |
| | | List<ProcurementRecordOutPageDto> list(); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 14:25 |
| | | */ |
| | | @TableName("procurement_record_storage") |
| | | @Data |
| | | @Builder |
| | | public class ProcurementRecord { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | /** |
| | | * 产åä¿¡æ¯è¡¨id |
| | | */ |
| | | private Integer salesLedgerProductId; |
| | | |
| | | /** |
| | | * å
¥åºæ¹æ¬¡ |
| | | */ |
| | | private String inboundBatches; |
| | | |
| | | /** |
| | | * å
¥åºæ°é |
| | | */ |
| | | private BigDecimal inboundNum; |
| | | |
| | | /** |
| | | * å
¥åºæ¶é´ |
| | | */ |
| | | private LocalDateTime createDate; |
| | | |
| | | /** |
| | | * å
¥åºç¨æ· |
| | | */ |
| | | private String createBy; |
| | | |
| | | /** |
| | | * å
¥åºç¨æ·id |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | private Long tenantId; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:24 |
| | | */ |
| | | @TableName("procurement_record_out") |
| | | @Data |
| | | @Builder |
| | | public class ProcurementRecordOut { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Integer id; |
| | | |
| | | /** |
| | | * 产åä¿¡æ¯è¡¨id |
| | | */ |
| | | private Integer salesLedgerProductId; |
| | | |
| | | /** |
| | | * å
¥åºid |
| | | */ |
| | | private Integer procurementRecordStorageId; |
| | | |
| | | /** |
| | | * åºåºæ¹æ¬¡ |
| | | */ |
| | | private String inboundBatches; |
| | | |
| | | /** |
| | | * åºåºåºæ°é |
| | | */ |
| | | private BigDecimal inboundNum; |
| | | |
| | | /** |
| | | * åºåºåºæ¶é´ |
| | | */ |
| | | private LocalDateTime createDate; |
| | | |
| | | /** |
| | | * åºåºåºç¨æ· |
| | | */ |
| | | private String createBy; |
| | | |
| | | /** |
| | | * åºåºåºç¨æ·id |
| | | */ |
| | | private Integer userId; |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | 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.dto.ProcurementRecordOutAdd; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:28 |
| | | */ |
| | | public interface ProcurementRecordOutService extends IService<ProcurementRecordOut> { |
| | | |
| | | int stockout(ProcurementRecordOutAdd procurementRecordOutAdd); |
| | | |
| | | IPage<ProcurementRecordOutPageDto> listPage(Page page, ProcurementRecordOutPageDto procurementDto); |
| | | |
| | | int deletePro(ProcurementUpdateDto procurementDto); |
| | | |
| | | 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.dto.ProcurementAddDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecord; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 14:36 |
| | | */ |
| | | public interface ProcurementRecordService extends IService<ProcurementRecord> { |
| | | List<ProcurementDto> listProcurementBySalesLedgerId(ProcurementDto procurementDto); |
| | | |
| | | int add(ProcurementAddDto procurementDto); |
| | | |
| | | IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto); |
| | | |
| | | int updatePro(ProcurementUpdateDto procurementDto); |
| | | |
| | | int deletePro(ProcurementUpdateDto procurementDto); |
| | | |
| | | void export(HttpServletResponse response); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.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.SecurityUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto; |
| | | import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto; |
| | | import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecord; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; |
| | | import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/8 13:29 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class ProcurementRecordOutServiceImpl extends ServiceImpl<ProcurementRecordOutMapper, ProcurementRecordOut> implements ProcurementRecordOutService { |
| | | |
| | | public final ProcurementRecordOutMapper procurementRecordOutMapper; |
| | | |
| | | public final SysUserMapper sysUserMapper; |
| | | |
| | | @Override |
| | | public int stockout(ProcurementRecordOutAdd procurementRecordOutAdd) { |
| | | SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(procurementRecordOutAdd.getUserId().toString())); |
| | | if(sysUser == null){ |
| | | throw new RuntimeException("åºåºäººä¸åå¨"); |
| | | } |
| | | // æ¥è¯¢éè´åºåºæ°é |
| | | LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId()); |
| | | Long aLong = procurementRecordOutMapper.selectCount(procurementRecordLambdaQueryWrapper); |
| | | ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder() |
| | | .procurementRecordStorageId(procurementRecordOutAdd.getId()) |
| | | .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId()) |
| | | .inboundBatches(aLong.equals(0L) ? "第1æ¹æ¬¡" : "第"+ (aLong + 1) + "æ¹æ¬¡") |
| | | .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity())) |
| | | .createDate(LocalDateTime.now()) |
| | | .userId(procurementRecordOutAdd.getUserId()) |
| | | .createBy(sysUser.getNickName()) |
| | | .tenantId(sysUser.getTenantId()); |
| | | this.save(procurementRecordOut.build()); |
| | | return 0; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ProcurementRecordOutPageDto> listPage(Page page, ProcurementRecordOutPageDto procurementDto) { |
| | | return procurementRecordOutMapper.listPage(page, procurementDto); |
| | | } |
| | | |
| | | public List<ProcurementRecordOut> getProcurementRecordOutByIds(List<Integer> id) { |
| | | return procurementRecordOutMapper.selectBatchIds(id); |
| | | } |
| | | |
| | | @Override |
| | | public int deletePro(ProcurementUpdateDto procurementDto) { |
| | | List<ProcurementRecordOut> procurementRecordOutByIds = getProcurementRecordOutByIds(procurementDto.getIds()); |
| | | if(CollectionUtils.isEmpty(procurementRecordOutByIds)){ |
| | | throw new RuntimeException("æªæ¥è¯¢å°éä¸ç人"); |
| | | } |
| | | procurementRecordOutMapper.deleteBatchIds(procurementRecordOutByIds.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList())); |
| | | return 0; |
| | | } |
| | | |
| | | @Override |
| | | public void export(HttpServletResponse response) { |
| | | List<ProcurementRecordOutPageDto> list =procurementRecordOutMapper.list(); |
| | | ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class); |
| | | util.exportExcel(response, list, "åºåºå°è´¦"); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.procurementrecord.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.SecurityUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.procurementrecord.dto.*; |
| | | import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; |
| | | import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecord; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; |
| | | import com.ruoyi.procurementrecord.service.ProcurementRecordService; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * @author :yys |
| | | * @date : 2025/7/7 14:38 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | @Slf4j |
| | | public class ProcurementRecordServiceImpl extends ServiceImpl<ProcurementRecordMapper, ProcurementRecord> implements ProcurementRecordService { |
| | | |
| | | private final ProcurementRecordMapper procurementRecordMapper; |
| | | |
| | | private final ProcurementRecordOutMapper procurementRecordOutMapper; |
| | | |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | |
| | | @Override |
| | | public List<ProcurementDto> listProcurementBySalesLedgerId(ProcurementDto procurementDto) { |
| | | List<ProcurementDto> procurementDtos = procurementRecordMapper.listProcurementBySalesLedgerId(procurementDto); |
| | | // 计ç®å¾
å
¥åºæ°é |
| | | // æ¥è¯¢éè´è®°å½å·²å
¥åºæ°é |
| | | List<Integer> collect = procurementDtos.stream().map(ProcurementDto::getId).collect(Collectors.toList()); |
| | | if(CollectionUtils.isEmpty( collect)){ |
| | | return procurementDtos; |
| | | } |
| | | LambdaQueryWrapper<ProcurementRecord> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | procurementRecordLambdaQueryWrapper.in(ProcurementRecord::getSalesLedgerProductId, collect); |
| | | List<ProcurementRecord> procurementRecords = procurementRecordMapper.selectList(procurementRecordLambdaQueryWrapper); |
| | | if(CollectionUtils.isEmpty( procurementRecords)){ |
| | | return procurementDtos; |
| | | } |
| | | for (ProcurementDto dto : procurementDtos) { |
| | | // æ ¹æ®éè´å°è´¦IDçé对åºçå
¥åºè®°å½ |
| | | List<ProcurementRecord> collect1 = procurementRecords.stream() |
| | | .filter(procurementRecord -> procurementRecord.getSalesLedgerProductId().equals(dto.getId())) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // å¦ææ²¡æç¸å
³çå
¥åºè®°å½ï¼è·³è¿è¯¥æ¡æ°æ® |
| | | if(CollectionUtils.isEmpty(collect1)){ |
| | | dto.setQuantity0(dto.getQuantity()); |
| | | continue; |
| | | } |
| | | |
| | | // 计ç®å·²å
¥åºæ°éæ»åï¼å¹¶è®¾ç½®å¾
å
¥åºæ°é |
| | | BigDecimal totalInboundNum = collect1.stream() |
| | | .map(ProcurementRecord::getInboundNum) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | // å¾
å
¥åºæ°é = æ»æ°é - å·²å
¥åºæ°é |
| | | dto.setQuantity0(dto.getQuantity().subtract(totalInboundNum)); |
| | | } |
| | | return procurementDtos; |
| | | } |
| | | |
| | | public ProcurementRecord getProcurementRecordById(Integer id){ |
| | | ProcurementRecord procurementRecord = procurementRecordMapper.selectById(id); |
| | | if(procurementRecord == null) { |
| | | throw new RuntimeException("æªæ¾å°è¯¥éè´å
¥åºè®°å½"); |
| | | } |
| | | return procurementRecord; |
| | | } |
| | | |
| | | public List<ProcurementRecord> getProcurementRecordByIds(List<Integer> id){ |
| | | List<ProcurementRecord> procurementRecord = procurementRecordMapper.selectBatchIds(id); |
| | | if(procurementRecord == null) { |
| | | throw new RuntimeException("æªæ¾å°è¯¥éè´å
¥åºè®°å½"); |
| | | } |
| | | return procurementRecord; |
| | | } |
| | | |
| | | @Override |
| | | public int updatePro(ProcurementUpdateDto procurementDto) { |
| | | ProcurementRecord procurementRecordById = getProcurementRecordById(procurementDto.getId()); |
| | | procurementRecordById.setInboundNum(procurementDto.getQuantityStock()); |
| | | return procurementRecordMapper.updateById(procurementRecordById); |
| | | } |
| | | |
| | | @Override |
| | | public int deletePro(ProcurementUpdateDto procurementDto) { |
| | | List<ProcurementRecord> procurementRecordById = getProcurementRecordByIds(procurementDto.getIds()); |
| | | procurementRecordMapper.deleteBatchIds(procurementRecordById.stream().map(ProcurementRecord::getId).collect(Collectors.toList())); |
| | | // å 餿æå¯¹åºçåºåºè®°å½ |
| | | LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds()); |
| | | List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper); |
| | | if(!CollectionUtils.isEmpty(procurementRecordOuts)){ |
| | | procurementRecordOutMapper.deleteBatchIds(procurementRecordOuts.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList())); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | @Override |
| | | public void export(HttpServletResponse response) { |
| | | List<ProcurementPageDto> list =procurementRecordMapper.list(); |
| | | ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class); |
| | | util.exportExcel(response, list, "å
¥åºå°è´¦"); |
| | | } |
| | | |
| | | @Override |
| | | public int add(ProcurementAddDto procurementDto) { |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | // æ¹éæ°å¢ |
| | | for (Details detail : procurementDto.getDetails()) { |
| | | // æ¥è¯¢éè´å
¥åºæ°é |
| | | LambdaQueryWrapper<ProcurementRecord> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | procurementRecordLambdaQueryWrapper.eq(ProcurementRecord::getSalesLedgerProductId, detail.getId()); |
| | | Long aLong = procurementRecordMapper.selectCount(procurementRecordLambdaQueryWrapper); |
| | | |
| | | ProcurementRecord.ProcurementRecordBuilder procurementRecordBuilder = ProcurementRecord.builder() |
| | | .salesLedgerProductId(detail.getId()) |
| | | .inboundBatches(aLong.equals(0L) ? "第1æ¹æ¬¡" : "第"+ (aLong + 1) + "æ¹æ¬¡") |
| | | .inboundNum(detail.getInboundQuantity()) |
| | | .createDate(LocalDateTime.now()) |
| | | .userId(loginUser.getUserId()) |
| | | .tenantId(loginUser.getTenantId()) |
| | | .createBy(procurementDto.getNickName()); |
| | | this.save(procurementRecordBuilder.build()); |
| | | // å
¥åºæååæéè´æ°é |
| | | // LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | // salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, detail.getId()); |
| | | // SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper); |
| | | // if(salesLedgerProduct == null){ |
| | | // throw new RuntimeException("æªæ¾å°è¯¥åå"); |
| | | // } |
| | | // salesLedgerProduct.setQuantity(salesLedgerProduct.getQuantity().subtract(detail.getInboundQuantity())); |
| | | // salesLedgerProductMapper.updateById(salesLedgerProduct); |
| | | } |
| | | return 1; |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto) { |
| | | IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPage(page, procurementDto); |
| | | List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords(); |
| | | // 计ç®å¾
å
¥åºæ°é |
| | | // æ¥è¯¢éè´è®°å½å·²å
¥åºæ°é |
| | | List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList()); |
| | | if(CollectionUtils.isEmpty( collect)){ |
| | | return procurementPageDtoIPage; |
| | | } |
| | | LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); |
| | | List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); |
| | | if(CollectionUtils.isEmpty( procurementRecords)){ |
| | | return procurementPageDtoIPage; |
| | | } |
| | | for (ProcurementPageDto dto : procurementPageDtos) { |
| | | // æ ¹æ®éè´å°è´¦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)); |
| | | } |
| | | return procurementPageDtoIPage; |
| | | } |
| | | |
| | | } |
| | |
| | | package com.ruoyi.project.system.service; |
| | | |
| | | import com.ruoyi.project.system.domain.SysUserDept; |
| | | import com.ruoyi.project.system.domain.vo.SysUserDeptVo; |
| | | |
| | | import java.util.List; |
| | |
| | | public interface ISysUserDeptService { |
| | | |
| | | List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo); |
| | | |
| | | List<SysUserDept> getUserDeptList(Long userId); |
| | | } |
| | |
| | | package com.ruoyi.project.system.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.ruoyi.project.system.domain.SysUserDept; |
| | | import com.ruoyi.project.system.domain.vo.SysUserDeptVo; |
| | | import com.ruoyi.project.system.mapper.SysUserDeptMapper; |
| | | import com.ruoyi.project.system.service.ISysUserDeptService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | | @Service |
| | |
| | | public List<SysUserDeptVo> userLoginFacotryList(SysUserDeptVo userDeptVo) { |
| | | return sysUserDeptMapper.userLoginFacotryList(userDeptVo); |
| | | } |
| | | |
| | | @Override |
| | | public List<SysUserDept> getUserDeptList(Long userId) { |
| | | LambdaQueryWrapper<SysUserDept> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(SysUserDept::getUserId, userId); |
| | | return sysUserDeptMapper.selectList(queryWrapper); |
| | | } |
| | | } |
| | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.security.core.parameters.P; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | |
| | | return toAjax(ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto)); |
| | | } |
| | | |
| | | |
| | | @GetMapping("/getProductRecordById") |
| | | public AjaxResult getProductRecordById(Long id) { |
| | | if (id == null) { |
| | | return AjaxResult.error("åæ°é误"); |
| | | } |
| | | return AjaxResult.success(productRecordService.getProductRecordById(id)); |
| | | } |
| | | |
| | | @ApiModelProperty("ä¿®æ¹æ¥ç¥¨ç»è®°") |
| | | @PostMapping("/updateRegistration") |
| | | public AjaxResult updateRegistration(@RequestBody ProductRecordDto productRecordDto) { |
| | | |
| | | return productRecordService.updateRecord(productRecordDto); |
| | | } |
| | | |
| | | /** |
| | | * å 餿¥ç¥¨ç»è®° |
| | | */ |
| | |
| | | package com.ruoyi.purchase.dto; |
| | | |
| | | import com.ruoyi.other.pojo.TempFile; |
| | | import com.ruoyi.purchase.pojo.ProductRecord; |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import lombok.Data; |
| | |
| | | private String unTicketsPrice = "0"; |
| | | |
| | | private List<CommonFile> commonFiles; |
| | | |
| | | private List<String> tempFileIds; |
| | | } |
| | |
| | | public interface ProductRecordMapper extends BaseMapper<ProductRecord> { |
| | | |
| | | IPage<ProductRecordDto> productRecordPage(Page page, @Param("c") TicketRegistrationDto ticketRegistrationDto); |
| | | |
| | | ProductRecordDto getProductRecordById(Long id); |
| | | } |
| | |
| | | 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.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.purchase.dto.ProductRecordDto; |
| | | import com.ruoyi.purchase.dto.TicketRegistrationDto; |
| | | import com.ruoyi.purchase.pojo.ProductRecord; |
| | |
| | | List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto); |
| | | |
| | | IPage<ProductRecordDto> productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto); |
| | | |
| | | AjaxResult updateRecord(ProductRecordDto productRecordDto); |
| | | |
| | | ProductRecordDto getProductRecordById(Long id); |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.FileNameType; |
| | | import com.ruoyi.framework.web.domain.AjaxResult; |
| | | import com.ruoyi.purchase.dto.ProductRecordDto; |
| | | import com.ruoyi.purchase.dto.TicketRegistrationDto; |
| | | import com.ruoyi.purchase.mapper.ProductRecordMapper; |
| | | import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; |
| | | import com.ruoyi.purchase.pojo.ProductRecord; |
| | | import com.ruoyi.purchase.pojo.PurchaseLedger; |
| | | import com.ruoyi.purchase.service.IProductRecordService; |
| | | import com.ruoyi.sales.mapper.CommonFileMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private CommonFileMapper commonFileMapper; |
| | | |
| | | |
| | | @Autowired |
| | | private SalesLedgerProductMapper salesLedgerProductMapper; |
| | | @Autowired |
| | | private PurchaseLedgerMapper purchaseLedgerMapper; |
| | | |
| | | |
| | | /** |
| | |
| | | }); |
| | | return productRecordDtoIPage; |
| | | } |
| | | |
| | | @Override |
| | | public AjaxResult updateRecord(ProductRecordDto productRecordDto) { |
| | | SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(productRecordDto.getSaleLedgerProjectId()); |
| | | ProductRecord productRecord = productRecordMapper.selectById(productRecordDto.getId()); |
| | | if (salesLedgerProduct != null) { |
| | | salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getFutureTicketsAmount().add(productRecord.getTicketsAmount()).subtract(productRecordDto.getTicketsAmount())); |
| | | salesLedgerProduct.setFutureTickets(salesLedgerProduct.getFutureTickets().add(productRecord.getTicketsNum().subtract(productRecordDto.getTicketsNum()))); |
| | | salesLedgerProductMapper.updateById(salesLedgerProduct); |
| | | |
| | | } |
| | | PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(productRecord.getPurchaseLedgerId()); |
| | | if (purchaseLedger != null) { |
| | | purchaseLedger.setReceiptPaymentAmount(purchaseLedger.getReceiptPaymentAmount()); |
| | | } |
| | | BeanUtils.copyProperties(productRecordDto,productRecord); |
| | | productRecordMapper.updateById(productRecord); |
| | | |
| | | return AjaxResult.success("ä¿®æ¹æå"); |
| | | } |
| | | |
| | | @Override |
| | | public ProductRecordDto getProductRecordById(Long id) { |
| | | ProductRecordDto productRecordDto = productRecordMapper.getProductRecordById(id); |
| | | return productRecordDto; |
| | | } |
| | | } |
| | |
| | | throw new IllegalArgumentException("éè´å°è´¦è®°å½ä¸åå¨ï¼ID: " + ticketRegistrationDto.getPurchaseLedgerId()); |
| | | } |
| | | |
| | | |
| | | |
| | | // 3. åå»ºææ´æ°ç¥¨æ®ç»è®°å®ä½ |
| | | TicketRegistration ticketRegistration = new TicketRegistration(); |
| | | BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration); |
| | |
| | | // 6. å¢å éè´å°è´¦äº§åå¼ç¥¨è®°å½ |
| | | List<SalesLedgerProduct> salesLedgerProducts = ticketRegistrationDto.getProductData(); |
| | | if (CollectionUtils.isNotEmpty(salesLedgerProducts)) { |
| | | int insert = 0 ; |
| | | for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { |
| | | ProductRecord productRecord = new ProductRecord(); |
| | | //æé¤æå¼ç¥¨ä¸º0çæ°æ® |
| | | if (salesLedgerProduct.getTicketsNum() != null && salesLedgerProduct.getTicketsNum().compareTo(BigDecimal.ZERO) > 0) { |
| | | ProductRecord productRecord = new ProductRecord(); |
| | | |
| | | productRecord.setTicketRegistrationId(ticketRegistration.getId()); |
| | | productRecord.setPurchaseLedgerId(ticketRegistrationDto.getPurchaseLedgerId()); |
| | | productRecord.setCreatedAt(DateUtils.getNowDate()); |
| | | BeanUtils.copyProperties(salesLedgerProduct, productRecord); |
| | | productRecord.setSaleLedgerProjectId(salesLedgerProduct.getId()); |
| | | productRecord.setId(null); |
| | | productRecord.setType("2"); |
| | | productRecordMapper.insert(productRecord); |
| | | productRecord.setTicketRegistrationId(ticketRegistration.getId()); |
| | | productRecord.setPurchaseLedgerId(ticketRegistrationDto.getPurchaseLedgerId()); |
| | | productRecord.setCreatedAt(DateUtils.getNowDate()); |
| | | BeanUtils.copyProperties(salesLedgerProduct, productRecord); |
| | | productRecord.setSaleLedgerProjectId(salesLedgerProduct.getId()); |
| | | productRecord.setId(null); |
| | | productRecord.setType("2"); |
| | | insert = productRecordMapper.insert(productRecord); |
| | | } |
| | | if (insert <= 0) { |
| | | throw new RuntimeException("产åå¼ç¥¨æ°é½ä¸º0ï¼è¯·æ£æ¥"); |
| | | } |
| | | } |
| | | } |
| | | // è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ |
| | |
| | | * @param tempFileIds ä¸´æ¶æä»¶IDå表 |
| | | * @throws IOException æä»¶æä½å¼å¸¸ |
| | | */ |
| | | private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException { |
| | | public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException { |
| | | if (CollectionUtils.isEmpty(tempFileIds)) { |
| | | return; |
| | | } |
| | |
| | | # ä¸»åºæ°æ®æº
|
| | | master:
|
| | | # url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
| | | url: jdbc:mysql://114.132.189.42:9004/product-inventory-management-copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
| | | url: jdbc:mysql://114.132.189.42:9004/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
| | | username: root
|
| | | password: 123456
|
| | | # ä»åºæ°æ®æº
|
| | |
| | | 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: |
| | |
| | | # 端å£ï¼é»è®¤ä¸º6379 |
| | | port: 6379 |
| | | # æ°æ®åºç´¢å¼ |
| | | database: 0 |
| | | database: 1 |
| | | # å¯ç |
| | | password: root2022! |
| | | # password: |
| | | # password: 123456 |
| | | |
| | | # è¿æ¥è¶
æ¶æ¶é´ |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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.approve.mapper.ApproveLogMapper"> |
| | | |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveLog"> |
| | | <id property="id" column="id" /> |
| | | <result property="approveId" column="approve_id" /> |
| | | <result property="approveNodeOrder" column="approve_node_order" /> |
| | | <result property="approveUser" column="approve_user" /> |
| | | <result property="approveTime" column="approve_time" /> |
| | | <result property="approveStatus" column="approve_status" /> |
| | | <result property="approveRemark" column="approve_remark" /> |
| | | </resultMap> |
| | | |
| | | <sql id="Base_Column_List"> |
| | | id,approve_id,approve_node_order,approve_user,approve_time,approve_status, |
| | | approve_remark |
| | | </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.approve.mapper.ApproveNodeMapper"> |
| | | |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveNode"> |
| | | <id property="id" column="id" /> |
| | | <result property="approveProcessId" column="approve_process_id" /> |
| | | <result property="approveNodeOrder" column="approve_node_order" /> |
| | | <result property="approveNodeUser" column="approve_node_user" /> |
| | | <result property="approveNodeTime" column="approve_node_time" /> |
| | | <result property="approveNodeStatus" column="approve_node_status" /> |
| | | <result property="tenantId" column="tenant_id" /> |
| | | <result property="deleteFlag" column="delete_flag" /> |
| | | <result property="approveNodeReason" column="approve_node_reason" /> |
| | | <result property="approveNodeRemark" column="approve_node_remark" /> |
| | | </resultMap> |
| | | |
| | | <sql id="Base_Column_List"> |
| | | id,approve_process_id,approve_node_order,approve_node_user,approve_node_time,approve_node_status, |
| | | tenant_id,delete_flag,approve_node_reason,approve_node_remark |
| | | </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.approve.mapper.ApproveProcessMapper"> |
| | | |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApproveProcess"> |
| | | <id property="id" column="id" /> |
| | | <result property="approveId" column="approve_id" /> |
| | | <result property="approveUser" column="approve_user" /> |
| | | <result property="approveDeptId" column="approve_dept_id" /> |
| | | <result property="approveDeptName" column="approve_dept_name" /> |
| | | <result property="approveUserIds" column="approve_user_ids" /> |
| | | <result property="approveUserNames" column="approve_user_names" /> |
| | | <result property="approveReason" column="approve_reason" /> |
| | | <result property="approveTime" column="approve_time" /> |
| | | <result property="approveOverTime" column="approve_over_time" /> |
| | | <result property="approveStatus" column="approve_status" /> |
| | | <result property="approveDelete" column="approve_delete" /> |
| | | <result property="tenantId" column="tenant_id" /> |
| | | <result property="approveType" column="approve_type" /> |
| | | <result property="approveRemark" column="approve_remark" /> |
| | | </resultMap> |
| | | |
| | | <sql id="Base_Column_List"> |
| | | id,approve_id,approve_user,approve_dept_id,approve_dept_name,approve_user_ids, |
| | | approve_user_names,approve_reason,approve_time,approve_over_time,approve_status, |
| | | approve_delete,tenant_id,approve_type,approve_remark |
| | | </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.basic.mapper.StorageAttachmentMapper"> |
| | | |
| | | <!-- éç¨æ¥è¯¢æ å°ç»æ --> |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StorageAttachment"> |
| | | <id column="id" property="id" /> |
| | | <result column="create_time" property="createTime" /> |
| | | <result column="update_time" property="updateTime" /> |
| | | <result column="deleted" property="deleted" /> |
| | | <result column="record_type" property="recordType" /> |
| | | <result column="record_id" property="recordId" /> |
| | | <result column="name" property="name" /> |
| | | <result column="storage_blob_id" property="storageBlobId" /> |
| | | </resultMap> |
| | | |
| | | <!-- éç¨æ¥è¯¢ç»æå --> |
| | | <sql id="Base_Column_List"> |
| | | id, create_time, update_time, deleted, record_type, record_id, name, storage_blob_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.basic.mapper.StorageBlobMapper"> |
| | | |
| | | <!-- éç¨æ¥è¯¢æ å°ç»æ --> |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.StorageBlob"> |
| | | <id column="id" property="id" /> |
| | | <result column="create_time" property="createTime" /> |
| | | <result column="key" property="key" /> |
| | | <result column="content_type" property="contentType" /> |
| | | <result column="original_filename" property="originalFilename" /> |
| | | <result column="bucket_filename" property="bucketFilename" /> |
| | | <result column="bucket_name" property="bucketName" /> |
| | | <result column="byte_size" property="byteSize" /> |
| | | </resultMap> |
| | | |
| | | <!-- éç¨æ¥è¯¢ç»æå --> |
| | | <sql id="Base_Column_List"> |
| | | id, create_time, key, content_type, original_filename,bucket_filename,bucket_name, byte_size |
| | | </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.ProcurementRecordMapper"> |
| | | |
| | | <select id="listProcurementBySalesLedgerId" resultType="com.ruoyi.procurementrecord.dto.ProcurementDto"> |
| | | select |
| | | t1.supplier_name, |
| | | t2.product_category, |
| | | t2.id, |
| | | t3.id as recordId, |
| | | t2.specification_model, |
| | | t2.unit, |
| | | t2.quantity, |
| | | t2.quantity as quantity0, |
| | | t2.tax_rate, |
| | | t2.tax_inclusive_unit_price, |
| | | t2.tax_inclusive_total_price, |
| | | t2.tax_exclusive_total_price, |
| | | t3.inbound_num as quantityStock |
| | | from purchase_ledger t1 |
| | | left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id |
| | | left join procurement_record_storage t3 on t2.id = t3.sales_ledger_product_id |
| | | where t1.purchase_contract_number = #{req.purchaseContractNumber} |
| | | <if test="req.id != null and req.id != ''"> |
| | | and t3.id = #{req.id} |
| | | </if> |
| | | group by t2.id |
| | | </select> |
| | | <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto"> |
| | | select |
| | | t3.supplier_name, |
| | | t3.purchase_contract_number, |
| | | t2.product_category, |
| | | t1.id, |
| | | t1.sales_ledger_product_id, |
| | | t2.specification_model, |
| | | t2.unit, |
| | | t2.tax_rate, |
| | | t2.tax_inclusive_unit_price, |
| | | t2.tax_inclusive_total_price, |
| | | t2.tax_exclusive_total_price, |
| | | t1.inbound_batches, |
| | | t1.inbound_num, |
| | | t1.inbound_num as inboundNum0, |
| | | t1.create_date, |
| | | t1.create_by |
| | | from procurement_record_storage t1 |
| | | left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id |
| | | left join purchase_ledger t3 on t3.id = t2.sales_ledger_id |
| | | <where> |
| | | 1 = 1 |
| | | <if test="req.supplierName != null and req.supplierName != ''"> |
| | | and t3.supplier_name like concat('%',#{req.supplierName},'%') |
| | | </if> |
| | | </where> |
| | | </select> |
| | | <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto"> |
| | | select |
| | | t3.supplier_name, |
| | | t3.purchase_contract_number, |
| | | t2.product_category, |
| | | t1.id, |
| | | t2.specification_model, |
| | | t2.unit, |
| | | t2.quantity, |
| | | t2.quantity as quantity0, |
| | | t2.tax_rate, |
| | | t2.tax_inclusive_unit_price, |
| | | t2.tax_inclusive_total_price, |
| | | t2.tax_exclusive_total_price, |
| | | t1.inbound_batches, |
| | | t1.inbound_num, |
| | | t1.create_date, |
| | | t1.create_by |
| | | from procurement_record_storage t1 |
| | | left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id |
| | | left join purchase_ledger t3 on t3.id = t2.sales_ledger_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.procurementrecord.mapper.ProcurementRecordOutMapper"> |
| | | |
| | | <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto"> |
| | | select |
| | | t3.supplier_name, |
| | | t2.product_category, |
| | | t1.id, |
| | | t2.specification_model, |
| | | t2.unit, |
| | | t2.tax_rate, |
| | | t2.tax_inclusive_unit_price, |
| | | t2.tax_inclusive_total_price, |
| | | t2.tax_exclusive_total_price, |
| | | t1.inbound_num, |
| | | t1.create_date, |
| | | t1.create_by |
| | | from procurement_record_out t1 |
| | | left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id |
| | | left join purchase_ledger t3 on t3.id = t2.sales_ledger_id |
| | | <where> |
| | | 1 = 1 |
| | | <if test="req.supplierName != null and req.supplierName != ''"> |
| | | and t3.supplier_name like concat('%',#{req.supplierName},'%') |
| | | </if> |
| | | </where> |
| | | </select> |
| | | <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto"> |
| | | select |
| | | t3.supplier_name, |
| | | t2.product_category, |
| | | t1.id, |
| | | t2.specification_model, |
| | | t2.unit, |
| | | t2.tax_rate, |
| | | t2.tax_inclusive_unit_price, |
| | | t2.tax_inclusive_total_price, |
| | | t2.tax_exclusive_total_price, |
| | | t1.inbound_num, |
| | | t1.create_date, |
| | | t1.create_by |
| | | from procurement_record_out t1 |
| | | left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id |
| | | left join purchase_ledger t3 on t3.id = t2.sales_ledger_id |
| | | </select> |
| | | </mapper> |
| | |
| | | <if test="c.createdAtEnd != null and c.createdAtEnd != ''"> |
| | | and pr.created_at <= date_format(#{c.createdAtEnd},'%Y-%m-%d hh:mm:ss') |
| | | </if> |
| | | <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''"> |
| | | and tr.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%') |
| | | </if> |
| | | </select> |
| | | <select id="getProductRecordById" resultType="com.ruoyi.purchase.dto.ProductRecordDto"> |
| | | SELECT |
| | | sl.sales_contract_no, |
| | | sl.customer_contract_no, |
| | | sl.customer_name, |
| | | pm.model AS product_model, |
| | | pl.purchase_contract_number, |
| | | pl.supplier_name, |
| | | pr.*, |
| | | tr.invoice_number, |
| | | ROUND(pr.tickets_amount/(1+pr.tax_rate/100),2 ) as un_tickets_price, |
| | | ROUND(pr.tickets_amount-pr.tickets_amount/(1+pr.tax_rate/100),2 )as invoice_amount |
| | | FROM product_record pr |
| | | left join purchase_ledger pl on pl.id = pr.purchase_ledger_id |
| | | left join sales_ledger sl on sl.id = pl.sales_ledger_id |
| | | left join ticket_registration tr on tr.id = pr.ticket_registration_id |
| | | left join product_model pm on pm.id = pr.product_model_id |
| | | |
| | | WHERE type = 2 and pr.id = #{id} |
| | | </select> |
| | | </mapper> |