From ba4af275c3b8d073f863be7b12e43974b3ef14a2 Mon Sep 17 00:00:00 2001 From: liyong <18434998025@163.com> Date: 星期六, 12 七月 2025 10:27:06 +0800 Subject: [PATCH] Merge branch 'master' of http://114.132.189.42:9002/r/product-inventory-management-after into pim_ly --- src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java | 22 src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java | 1 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java | 4 src/main/java/com/ruoyi/approve/service/IApproveProcessService.java | 40 + src/main/resources/mapper/purchase/ProductRecordMapper.xml | 2 src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml | 8 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java | 5 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java | 5 pom.xml | 2 src/main/java/com/ruoyi/framework/security/service/TokenService.java | 17 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml | 1 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java | 28 src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java | 20 src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java | 8 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | 2 src/main/resources/mapper/approve/ApproveNodeMapper.xml | 24 src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java | 129 ++++ src/main/java/com/ruoyi/project/system/controller/SysUserController.java | 14 src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java | 112 ++++ src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java | 15 src/main/java/com/ruoyi/approve/pojo/ApproveNode.java | 116 ++++ src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java | 5 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java | 162 +++++ src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java | 120 ++++ src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java | 5 src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java | 15 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java | 22 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java | 27 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java | 128 ++++ src/main/resources/mapper/approve/ApproveLogMapper.xml | 21 src/main/java/com/ruoyi/approve/pojo/ApproveLog.java | 57 ++ src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java | 2 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java | 146 +++++ src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java | 11 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java | 9 src/main/resources/mapper/approve/ApproveProcessMapper.xml | 36 + src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java | 116 ++++ src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java | 18 src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java | 21 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java | 11 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java | 3 src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java | 5 src/main/resources/mapper/system/SysUserMapper.xml | 13 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml | 59 ++ src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java | 47 + src/main/resources/mapper/system/SysDeptMapper.xml | 2 src/main/resources/application.yml | 2 src/main/java/com/ruoyi/approve/service/IApproveNodeService.java | 20 48 files changed, 1,627 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 14851a3..51d1a67 100644 --- a/pom.xml +++ b/pom.xml @@ -288,7 +288,7 @@ <fork>true</fork> <!-- 濡傛灉娌℃湁璇ラ厤缃紝devtools涓嶄細鐢熸晥 --> </configuration> </plugin> - </plugins> + </plugins> </build> <repositories> diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java new file mode 100644 index 0000000..369a65e --- /dev/null +++ b/src/main/java/com/ruoyi/approve/controller/ApproveNodeController.java @@ -0,0 +1,47 @@ +package com.ruoyi.approve.controller; + +import com.ruoyi.approve.pojo.ApproveNode; +import com.ruoyi.approve.service.IApproveNodeService; +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/{id}") + public AjaxResult details(@PathVariable String id) { + return AjaxResult.success(approveNodeService.details(id)); + } + + /** + * 瀹℃壒鑺傜偣 + * @param approveNode + * @return + */ + @PostMapping("/updateApproveNode") + public AjaxResult updateApproveNode(@RequestBody ApproveNode approveNode) { + approveNodeService.updateApproveNode(approveNode); + return AjaxResult.success(); + } + + /** + * 鍒濆鍖栧鎵硅妭鐐� + * @param id + * @return + */ + @PostMapping("/init") + public AjaxResult init(String id) { + approveNodeService.initApproveNodes("",id,1L); + return AjaxResult.success(); + } + +} diff --git a/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java new file mode 100644 index 0000000..9dcda81 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java @@ -0,0 +1,112 @@ +package com.ruoyi.approve.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.approve.pojo.ApproveProcess; +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 org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.text.ParseException; +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; + /**銆� + * 鑾峰彇閮ㄩ棬鍒楄〃 + * @return + */ + @GetMapping("/getDept") + public AjaxResult getDept() { + Long userId = SecurityUtils.getUserId(); + LoginUser user = SecurityUtils.getLoginUser(); + Long[] deptIds = SecurityUtils.getDeptId(); + + List<SysDept> sysDeptList = approveProcessService.selectDeptListByDeptIds(deptIds); + return AjaxResult.success(sysDeptList); + } + + /** + * 娣诲姞瀹℃壒 + * @param approveProcessVO + * @return + */ + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) throws ParseException { + 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") + @Transactional(rollbackFor = Exception.class) + 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, ApproveProcess approveProcess) { + return AjaxResult.success(approveProcessService.listAll(page, approveProcess)); + } + + /** + * 鍒犻櫎瀹℃壒 + * @param ids + * @return + */ + @DeleteMapping("/deleteIds") + @Transactional(rollbackFor = Exception.class) + public AjaxResult deleteIds(@RequestBody Long[] ids) { + if (ids == null || ids.length == 0) { + return AjaxResult.warn("鍙傛暟涓嶈兘涓虹┖"); + } + approveProcessService.delApprove(ids); + return AjaxResult.success("鎿嶄綔鎴愬姛"); + } +} diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java new file mode 100644 index 0000000..3218ed6 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/mapper/ApproveLogMapper.java @@ -0,0 +1,20 @@ +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 閽堝琛ㄣ�恆pprove_log(瀹℃壒鏃ュ織琛�)銆戠殑鏁版嵁搴撴搷浣淢apper +* @createDate 2025-07-07 14:47:01 +* @Entity com.ruoyi.approve.pojo.ApproveLog +*/ +@Mapper +public interface ApproveLogMapper extends BaseMapper<ApproveLog> { + +} + + + + diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java new file mode 100644 index 0000000..648d04a --- /dev/null +++ b/src/main/java/com/ruoyi/approve/mapper/ApproveNodeMapper.java @@ -0,0 +1,18 @@ +package com.ruoyi.approve.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.approve.pojo.ApproveNode; + +/** +* @author Administrator +* @description 閽堝琛ㄣ�恆pprove_node(瀹℃壒鑺傜偣琛�)銆戠殑鏁版嵁搴撴搷浣淢apper +* @createDate 2025-07-08 16:50:15 +* @Entity com.ruoyi.approve.pojo.ApproveNode +*/ +public interface ApproveNodeMapper extends BaseMapper<ApproveNode> { + +} + + + + diff --git a/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java b/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java new file mode 100644 index 0000000..32c6be0 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/mapper/ApproveProcessMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.approve.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.approve.pojo.ApproveProcess; +import org.apache.ibatis.annotations.Param; + +/** +* @author Administrator +* @description 閽堝琛ㄣ�恆pprove_process(瀹℃壒娴佺▼琛�)銆戠殑鏁版嵁搴撴搷浣淢apper +* @createDate 2025-07-08 16:44:05 +* @Entity com.ruoyi.approve.pojo.ApproveProcess +*/ +public interface ApproveProcessMapper extends BaseMapper<ApproveProcess> { + + IPage<ApproveProcess> listPage(Page page,@Param("req") ApproveProcess approveProcess); +} + + + + diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveLog.java b/src/main/java/com/ruoyi/approve/pojo/ApproveLog.java new file mode 100644 index 0000000..8952e0d --- /dev/null +++ b/src/main/java/com/ruoyi/approve/pojo/ApproveLog.java @@ -0,0 +1,57 @@ +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; + + /** + * 瀹℃壒浜篿d + */ + private Long approveUser; + + /** + * 瀹℃壒鏃堕棿 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date approveTime; + + /** + * 瀹℃壒鐘舵�� + */ + private Integer approveStatus; + + /** + * 瀹℃壒澶囨敞 + */ + private String approveRemark; + +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java new file mode 100644 index 0000000..300cc32 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java @@ -0,0 +1,116 @@ +package com.ruoyi.approve.pojo; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 瀹℃壒鑺傜偣琛� + * @TableName approve_node + */ +@Data +@TableName("approve_node") +public class ApproveNode{ + /** + * + */ + private Long id; + + /** + * 瀹℃壒缂栧彿 + */ + private String approveProcessId; + + /** + * 瀹℃壒鑺傜偣椤哄簭 + */ + private Integer approveNodeOrder; + + /** + * 瀹℃壒鑺傜偣鐢ㄦ埛鍚嶅瓧 + */ + private String approveNodeUser; + + /** + * 瀹℃壒鑺傜偣鐢ㄦ埛id + */ + private Long approveNodeUserId; + + /** + * 瀹℃壒鑺傜偣鏃堕棿 + */ + @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; + + /** + * 鏄惁涓哄綋鍓嶅鏍歌妭鐐� + */ + @TableField(exist = false) + private Boolean isShen = false; + + /** + * 绉熸埛id + */ +// @TableField(fill = FieldFill.INSERT) + private Long tenantId; + + /** + * 鍒犻櫎鏍囪:0姝e父锛�1鍒犻櫎 + */ + private Integer deleteFlag; + + /** + * 鍏ュ簱鐢ㄦ埛id + */ + private Long createUser; + + /** + * 鍏ュ簱鏃堕棿 + */ + private LocalDateTime createTime; + + /** + * 淇敼鑰� + */ + private Long updateUser; + + /** + * 淇敼鏃堕棿 + */ + private LocalDateTime updateTime; + + /** + * 瀹℃壒鑺傜偣鎷掔粷鍘熷洜 + */ + private String approveNodeReason; + + /** + * 瀹℃壒鑺傜偣澶囨敞 + */ + private String approveNodeRemark; + + private static final long serialVersionUID = 1L; + + +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java new file mode 100644 index 0000000..57bfdb1 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java @@ -0,0 +1,120 @@ +package com.ruoyi.approve.pojo; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 瀹℃壒娴佺▼琛� + * @TableName approve_process + */ +@Data +@TableName("approve_process") +public class ApproveProcess{ + /** + * + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 娴佺▼缂栧彿 + */ + private String approveId; + + /** + * 鐢宠浜篿d + */ + private Long approveUser; + + /** + * 鐢宠浜哄悕绉� + */ + private String approveUserName; + + /** + * 鐢宠閮ㄩ棬id + */ + private Long approveDeptId; + + /** + * 鐢宠閮ㄩ棬鍚嶇О + */ + private String approveDeptName; + + /** + * 瀹℃壒鐢ㄦ埛ids + */ + private String approveUserIds; + + /** + * 瀹℃壒鐢ㄦ埛鍚嶇О + */ + private String approveUserNames; + + /** + * 鐢宠鍘熷洜 + */ + private String approveReason; + + /** + * 褰撳墠瀹℃壒鐢ㄦ埛ID + */ + private Long approveUserCurrentId; + + /** + * 褰撳墠瀹℃壒鐢ㄦ埛鍚嶇О + */ + private String approveUserCurrentName; + + /** + * 鐢宠鏃ユ湡 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date approveTime; + + /** + * 瀹℃壒瀹屾垚鏃堕棿 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date approveOverTime; + + /** + * 瀹℃壒鐘舵�侊細0寰呭鏍革紝1瀹℃牳涓紝2瀹℃牳瀹屾垚 3瀹℃牳鏈�氳繃 + */ + private Integer approveStatus; + + /** + * 瀹℃壒鏄惁鍒犻櫎锛�0姝e父锛�1鍒犻櫎 + */ + private Integer approveDelete; + + /** + * 绉熸埛id + */ +// @TableField(fill = FieldFill.INSERT) + private Long tenantId; + + /** + * 瀹℃壒绫诲瀷 + */ + private Integer approveType; + + /** + * 瀹℃壒澶囨敞 + */ + private String approveRemark; + + /** + * 鍒涘缓鏃堕棿 + */ + private LocalDateTime createTime; + + private static final long serialVersionUID = 1L; + + +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java new file mode 100644 index 0000000..71813da --- /dev/null +++ b/src/main/java/com/ruoyi/approve/service/IApproveNodeService.java @@ -0,0 +1,20 @@ +package com.ruoyi.approve.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.approve.pojo.ApproveNode; + +import java.util.List; + +public interface IApproveNodeService extends IService<ApproveNode> { + + void initApproveNodes(String approveUserIds,String approveID,Long tenantId); + /** + * 璇︽儏 + * @param id + */ + List<ApproveNode> details(String id); + + void updateApproveNode(ApproveNode approveNode); + + void delApproveNodeByApproveId(Long id); +} diff --git a/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java b/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java new file mode 100644 index 0000000..2606599 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/service/IApproveProcessService.java @@ -0,0 +1,40 @@ +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.ApproveProcessVO; +import com.ruoyi.project.system.domain.SysDept; + +import java.text.ParseException; +import java.util.List; + +public interface IApproveProcessService extends IService<ApproveProcess> { + /** + * 娣诲姞瀹℃壒娴佺▼ + * @param approveProcessVO 瀹℃壒娴佺▼VO瀵硅薄 + */ + void addApprove(ApproveProcessVO approveProcessVO) throws ParseException; + /** + * 鏍规嵁閮ㄩ棬id鏌ヨ閮ㄩ棬淇℃伅 + * @param deptIds 閮ㄩ棬ID鏁扮粍 + */ + List<SysDept> selectDeptListByDeptIds(Long[] deptIds); + + IPage<ApproveProcess> listAll(Page page, ApproveProcess approveProcess); + + void delApprove(Long[] ids); + + void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo); + + ApproveProcess getApproveById(String id); + + /** + * 瀹℃壒鐘舵�佹洿鏂� + * @param approveNode + */ + void updateApproveProcessStatus(ApproveNode approveNode,Integer status); +} diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java new file mode 100644 index 0000000..04adc4b --- /dev/null +++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java @@ -0,0 +1,116 @@ +package com.ruoyi.approve.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +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.common.utils.SecurityUtils; +import com.ruoyi.project.system.domain.SysUser; +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.stereotype.Service; + +import java.time.LocalDateTime; +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; + @Autowired + private SysUserMapper sysUserMapper; + + + @Override + public void initApproveNodes(String approveUserIds,String approveID,Long tenantId) { + Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); + ApproveProcess approve = approveProcessService.getApproveById(approveID); + String[] names = approveUserIds.split(","); + String approveId = approve.getApproveId(); + for (int i = 0; i < names.length; i++) { + SysUser sysUser = sysUserMapper.selectUserById(Long.parseLong(names[i])); + if (sysUser == null) continue; + ApproveNode approveNode = new ApproveNode(); + approveNode.setApproveProcessId(approveId); + approveNode.setApproveNodeOrder(i +1); + approveNode.setApproveNodeUser(sysUser.getNickName()); + approveNode.setApproveNodeUserId(sysUser.getUserId()); + approveNode.setApproveNodeTime(new Date()); + approveNode.setApproveNodeStatus(0); + approveNode.setTenantId(tenantId); + approveNode.setDeleteFlag(0); + approveNode.setCreateUser(userId); + approveNode.setUpdateUser(userId); + approveNode.setCreateTime(LocalDateTime.now()); + approveNode.setUpdateTime(LocalDateTime.now()); + approveNodeMapper.insert(approveNode); + } + } + + @Override + public List<ApproveNode> details(String id) { + LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ApproveNode::getApproveProcessId, id); + queryWrapper.eq(ApproveNode::getDeleteFlag, 0); + queryWrapper.eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId()); + List<ApproveNode> list = list(queryWrapper); + // 鎸夌収 approveNodeOrder 瀛楁鍗囧簭鎺掑簭 + list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder)); + LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); + approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, id) + .eq(ApproveProcess::getApproveDelete, 0) + .eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId()) + .last("limit 1"); + ApproveProcess approveProcess = approveProcessService.getOne(approveProcessLambdaQueryWrapper); + if(approveProcess != null && approveProcess.getApproveStatus() == 3){ + return list; + } + for (ApproveNode approveNode : list) { + if(approveNode.getApproveNodeStatus() == 1){ + continue; + } + approveNode.setIsShen(true); + break; + } + return list; + } + + @Override + public void updateApproveNode(ApproveNode approveNode) { + // 瀹℃壒鑺傜偣鐘舵��:1鍚屾剰锛�2鎷掔粷锛�0灏氭湭瀹℃牳 + switch (approveNode.getApproveNodeStatus()){ + case 1: + approveProcessService.updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1); + break; + case 2: + approveProcessService.updateApproveProcessStatus(approveNode, 3); + break; + default: + break; + } + approveNode.setApproveNodeTime(new Date()); + approveNodeMapper.updateById(approveNode); + } + + @Override + public void delApproveNodeByApproveId(Long id) { + UpdateWrapper<ApproveNode> queryWrapper = new UpdateWrapper<>(); + queryWrapper.lambda().set(ApproveNode::getDeleteFlag, 1) + .eq(ApproveNode::getApproveProcessId, id); + update(queryWrapper); + } + +} diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java new file mode 100644 index 0000000..b081070 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java @@ -0,0 +1,162 @@ +package com.ruoyi.approve.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +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.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 org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@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) throws ParseException { + SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser()); + SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId()); + String[] split = approveProcessVO.getApproveUserIds().split(","); + List<Long> longList = Arrays.stream(split) + .map(Long::valueOf) // 灏嗘瘡涓� String 杞崲涓� Long + .collect(Collectors.toList()); + List<SysUser> sysUsers = sysUserMapper.selectUserByIds(longList); + if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�"); + if(sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�"); + if(sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪"); + String today = LocalDate.now().format(DATE_FORMAT); + Long approveId = dailyRedisCounter.incrementAndGetByDb(); + String formattedCount = String.format("%03d", approveId); + //娴佺▼ ID + String approveID = today + formattedCount; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + ApproveProcess approveProcess = new ApproveProcess(); + approveProcess.setApproveId(approveID); + approveProcess.setApproveUser(approveProcessVO.getApproveUser()); + approveProcess.setApproveUserName(sysUser.getNickName()); + approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId()); + approveProcess.setApproveDeptName(sysDept.getDeptName()); + approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(","))); + approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime())); + approveProcess.setApproveReason(approveProcessVO.getApproveReason()); + approveProcess.setApproveOverTime(null); + approveProcess.setApproveStatus(0); + approveProcess.setApproveDelete(0); + approveProcess.setCreateTime(LocalDateTime.now()); + approveProcess.setTenantId(approveProcessVO.getApproveDeptId()); + approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds()); + approveProcess.setApproveUserCurrentId(longList.get(0)); + approveProcess.setApproveUserCurrentName(sysUsers + .stream() + .filter(SysUser -> SysUser.getUserId().equals(longList.get(0))) + .collect(Collectors.toList()) + .get(0) + .getNickName()); + save(approveProcess); + //鍒濆鍖栧鎵硅妭鐐� + approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approveID,approveProcessVO.getApproveDeptId()); + } + + @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,ApproveProcess approveProcess) { + IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page,approveProcess); + return approveProcessIPage; + } + + @Override + public void delApprove(Long[] ids) { + for (Long id : ids) { + UpdateWrapper<ApproveProcess> queryWrapper = new UpdateWrapper<>(); + queryWrapper.lambda().set(ApproveProcess::getApproveDelete, 1) + .eq(ApproveProcess::getApproveId, id); + update(queryWrapper); + // 鍒犻櫎鍏宠仈鐨勫鎵硅妭鐐� + approveNodeService.delApproveNodeByApproveId(id); + } + + + } + + @Override + public ApproveProcess getApproveById(String id) { + LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ApproveProcess::getApproveId, id); + queryWrapper.eq(ApproveProcess::getApproveDelete, 0); + queryWrapper.eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId()); + queryWrapper.last("limit 1"); + ApproveProcess one = getOne(queryWrapper); + return one; + } + + @Override + public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) { + LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); + approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId()) + .eq(ApproveProcess::getApproveDelete, 0) + .eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId()) + .last("limit 1"); + ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper); + if(approveProcess == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�"); + approveProcess.setApproveStatus(status); + updateById(approveProcess); + } + + @Override + public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) { + ApproveProcess approve = getApproveById(approveGetAndUpdateVo.getId()); + approve.setApproveReason(approveGetAndUpdateVo.getApproveReason()); + updateById(approve); + } + + +} diff --git a/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java b/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java new file mode 100644 index 0000000..d98a005 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java @@ -0,0 +1,129 @@ +package com.ruoyi.approve.utils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.approve.mapper.ApproveProcessMapper; +import com.ruoyi.approve.pojo.ApproveProcess; +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.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; +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 璁℃暟鍣ㄥ悕绉帮紙渚嬪锛歭ogin_count銆乷rder_count锛� + * @return 浠婃棩鑷鍚庣殑璁℃暟鍊� + */ + public long incrementAndGet(String counterName) { + String key = getKey(counterName); + long count = redisTemplate.opsForValue().increment(key, 1); + + // 浠呭湪绗竴娆¤缃椂璁剧疆杩囨湡鏃堕棿锛堥伩鍏嶉噸澶嶈缃級 + if (count == 1) { + long secondsUntilMidnight = calculateSecondsUntilMidnight(); + redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS); + } + + return count; + } + + @Autowired + private ApproveProcessMapper approveProcessMapper; + + /** + * 鑾峰彇褰撳墠鏃堕棿鐨� 寮�濮嬫棩鏈� 锛岀粨鏉熸棩鏈� + * @return + */ + public static StartAndEndDateDto getDateTime(){ + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(Calendar.DATE,1); + String startDateTime = simpleDateFormat.format(date); + String endDateTime = simpleDateFormat.format(cal.getTime()); + StartAndEndDateDto startAndEndDateDto = new StartAndEndDateDto(); + startAndEndDateDto.setStartDate(startDateTime); + startAndEndDateDto.setEndDate(endDateTime); + return startAndEndDateDto; + } + + /**鏌ユ暟鎹簱 + * 鑾峰彇鎸囧畾璁℃暟鍣ㄥ湪浠婃棩鐨勬暟鍊硷紝骞惰嚜澧�1 + * @return 浠婃棩鑷鍚庣殑璁℃暟鍊� + */ + public long incrementAndGetByDb() { + String approveId = redisTemplate.opsForValue().get("approveNum"); + if(approveId == null){ + StartAndEndDateDto dateTime = getDateTime(); + LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); + approveProcessLambdaQueryWrapper + .eq(ApproveProcess::getApproveDelete,0) + .gt(ApproveProcess::getCreateTime,dateTime.getStartDate()) + .lt(ApproveProcess::getCreateTime,dateTime.getEndDate()); + Long aLong = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); + if(aLong == null){ + redisTemplate.opsForValue().set("approveNum","1",1L, TimeUnit.HOURS); + return 1; + }else{ + aLong += 1; + redisTemplate.opsForValue().set("approveNum",aLong.toString(),1L, TimeUnit.HOURS); + return aLong; + } + }else{ + Long num = Long.parseLong(approveId) + 1; + redisTemplate.opsForValue().set("approveNum",num.toString(),1L, TimeUnit.HOURS); + return Long.parseLong(approveId); + } + + } + + /** + * 鑾峰彇鎸囧畾璁℃暟鍣ㄥ湪浠婃棩鐨勫綋鍓嶆暟鍊� + * @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; + } +} diff --git a/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java b/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java new file mode 100644 index 0000000..0c9eb11 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java @@ -0,0 +1,21 @@ +package com.ruoyi.approve.utils; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author :yys + * @date : 2023/9/19 10:58 + */ +@Data +@ApiModel +public class StartAndEndDateDto { + + @ApiModelProperty("寮�濮嬫椂闂�") + private String startDate; + + @ApiModelProperty("缁撴潫鏃堕棿") + private String endDate; + +} diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java b/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java new file mode 100644 index 0000000..bd9ebd9 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java @@ -0,0 +1,15 @@ +package com.ruoyi.approve.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ApproveGetAndUpdateVo { + //瀹℃壒id + @NotBlank(message = "娴佺▼缂栧彿涓嶈兘涓虹┖") + private String id; + //鐢宠浜嬬敱 + @NotBlank(message = "鐢宠浜嬬敱涓嶈兘涓虹┖") + private String approveReason; +} diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java new file mode 100644 index 0000000..7885247 --- /dev/null +++ b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java @@ -0,0 +1,22 @@ +package com.ruoyi.approve.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ApproveProcessVO { + + + private Long approveDeptId; + + private String approveTime; + + // 鐢宠浜� + private Long approveUser; + + // 瀹℃壒浜� + private String approveUserIds; + + private String approveReason; +} diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java index 816fe04..e23355d 100644 --- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java +++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java @@ -36,6 +36,11 @@ */ @Override public void saveSupplier(SupplierManage supplierManage) { + LambdaQueryWrapper<SupplierManage> supplierManageLambdaQueryWrapper = new LambdaQueryWrapper<>(); + supplierManageLambdaQueryWrapper.eq(SupplierManage::getSupplierName,supplierManage.getSupplierName()); + if (supplierMapper.selectCount(supplierManageLambdaQueryWrapper) > 0) { + throw new RuntimeException("渚涘簲鍟嗗凡瀛樺湪"); + } supplierMapper.insert(supplierManage); } diff --git a/src/main/java/com/ruoyi/framework/security/service/TokenService.java b/src/main/java/com/ruoyi/framework/security/service/TokenService.java index bb7e5ca..5b7cf11 100644 --- a/src/main/java/com/ruoyi/framework/security/service/TokenService.java +++ b/src/main/java/com/ruoyi/framework/security/service/TokenService.java @@ -1,9 +1,15 @@ package com.ruoyi.framework.security.service; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.project.system.domain.SysUserDept; +import com.ruoyi.project.system.mapper.SysUserDeptMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +28,7 @@ import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.util.CollectionUtils; /** * token楠岃瘉澶勭悊 @@ -140,6 +147,9 @@ } } + @Autowired + private SysUserDeptMapper sysUserDeptMapper; + /** * 鍒锋柊浠ょ墝鏈夋晥鏈� * @@ -149,6 +159,13 @@ { loginUser.setLoginTime(System.currentTimeMillis()); loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + LambdaQueryWrapper<SysUserDept> sysUserDeptLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysUserDeptLambdaQueryWrapper.eq(SysUserDept::getUserId, loginUser.getUserId()); + List<SysUserDept> sysUserDept = sysUserDeptMapper.selectList(sysUserDeptLambdaQueryWrapper); + if(!CollectionUtils.isEmpty(sysUserDept)){ + List<Long> collect = sysUserDept.stream().map(SysUserDept::getDeptId).collect(Collectors.toList()); + loginUser.setDeptId(collect.toArray(new Long[0])); + } // 鏍规嵁uuid灏唋oginUser缂撳瓨 String userKey = getTokenKey(loginUser.getToken()); redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); diff --git a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java index eb801bc..61de057 100644 --- a/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java +++ b/src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java @@ -6,6 +6,7 @@ import com.ruoyi.other.pojo.TempFile; import com.ruoyi.other.service.TempFileService; import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.util.URLEncoder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; @@ -13,6 +14,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -35,7 +37,14 @@ public TempFile uploadFile(MultipartFile file,Integer type) throws IOException { // 1. 鐢熸垚涓存椂鏂囦欢ID鍜岃矾寰� String tempId = UUID.randomUUID().toString(); - Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename()); + String originalFilename = file.getOriginalFilename(); + if(originalFilename == null) throw new IOException("鏂囦欢鍚嶄笉鑳戒负绌�"); + URLEncoder urlEncoder = new URLEncoder(); + String encodedFilename = urlEncoder.encode(originalFilename, StandardCharsets.UTF_8); + encodedFilename = encodedFilename.replaceAll("%2E","."); + Path tempFilePath = Paths.get(tempDir, tempId + "_" + encodedFilename); + +// Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename()); // 2. 纭繚鐩綍瀛樺湪 Path parentDir = tempFilePath.getParent(); diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java index 6778afc..a106fb2 100644 --- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java +++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java @@ -7,10 +7,7 @@ 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.dto.*; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.purchase.dto.InvoicePurchaseReportDto; import com.ruoyi.quality.pojo.QualityInspect; @@ -56,6 +53,13 @@ return AjaxResult.success(procurementRecordService.updatePro(procurementDto)); } + @PostMapping("/updateManagement") + @Log(title = "閲囪喘鍏ュ簱-搴撳瓨鍙拌处-淇敼", businessType = BusinessType.UPDATE) + @Transactional + public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) { + return AjaxResult.success(procurementRecordService.updateManagement(procurementDto)); + } + @PostMapping("/del") @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE) @Transactional @@ -70,6 +74,22 @@ return AjaxResult.success(result); } + @GetMapping("/listPageCopy") + @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-鍏ュ簱鏌ヨ", businessType = BusinessType.OTHER) + public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) { + IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto); + return AjaxResult.success(result); + } + + /** + * 瀵煎嚭 + * @param response + */ + @PostMapping("/exportCopy") + public void exportCopy(HttpServletResponse response) { + procurementRecordService.exportCopy(response); + } + /** * 瀵煎嚭 * @param response diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java new file mode 100644 index 0000000..ae93d84 --- /dev/null +++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java @@ -0,0 +1,27 @@ +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/9 9:41 + */ +@Data +public class ProcurementManagementUpdateDto { + + private String createBy; + + private Long createUser; + + private String createTime; + + private String entryDate; + + private Integer id; + +} diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java index 122d4b8..51ad7bd 100644 --- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java +++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java @@ -16,6 +16,8 @@ private Integer id; + private Long createUser; + /** * 鍏ュ簱鎵规 */ @@ -38,18 +40,25 @@ /** * 寰呭嚭搴撴暟閲� */ - @Excel(name = "寰呭嚭搴撴暟閲�") +// @Excel(name = "寰呭嚭搴撴暟閲�") private BigDecimal inboundNum0; /** * 鍑哄叆搴撴椂闂� */ - @Excel(name = "鍏ュ簱鏃堕棿") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") +// @Excel(name = "鍏ュ簱鏃堕棿") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDateTime createTime; /** + * 鍑哄叆搴撴椂闂� + */ + @Excel(name = "鍏ュ簱鏃堕棿") + private String time; + + + /** * 鍑哄叆搴撶敤鎴� */ @Excel(name = "鍏ュ簱浜�") diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java new file mode 100644 index 0000000..9ef5677 --- /dev/null +++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java @@ -0,0 +1,128 @@ +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/9 10:34 + */ +@Data +public class ProcurementPageDtoCopy { + + private Integer id; + + private Long createUser; + + /** + * 鍏ュ簱鎵规 + */ + @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", timezone = "GMT+8") + private LocalDateTime createTime; + + /** + * 鍑哄叆搴撴椂闂� + */ + @Excel(name = "鍏ュ簱鏃堕棿") + private String cTime; + + /** + * 鍑哄叆搴撴椂闂� + */ +// @Excel(name = "搴撳瓨鏃堕棿") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private LocalDateTime updateTime; + + /** + * 鍑哄叆搴撴椂闂� + */ + @Excel(name = "搴撳瓨鏃堕棿") + private String uTime; + + /** + * 鍑哄叆搴撶敤鎴� + */ + @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; + +} diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java index 62fd6f7..3dd180e 100644 --- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java +++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java @@ -25,10 +25,13 @@ /** * 鍑哄叆搴撴椂闂� */ - @Excel(name = "鍑哄簱鏃堕棿") +// @Excel(name = "鍑哄簱鏃堕棿") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; + @Excel(name = "鍑哄簱鏃堕棿") + private String time; + /** * 鍑哄叆搴撶敤鎴� */ diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java index 4121aa8..1336f39 100644 --- a/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java +++ b/src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; +import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import org.apache.ibatis.annotations.Param; @@ -25,5 +26,9 @@ IPage<ProcurementPageDto> listPage(Page page,@Param("req") ProcurementPageDto procurementDto); + IPage<ProcurementPageDtoCopy> listPageCopy(Page page, @Param("req") ProcurementPageDto procurementDto); + + List<ProcurementPageDtoCopy> listCopy(); + List<ProcurementPageDto> list(); } diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java index 07db479..d169692 100644 --- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java +++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java @@ -1,8 +1,6 @@ package com.ruoyi.procurementrecord.pojo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.Builder; import lombok.Data; @@ -70,6 +68,7 @@ /** * 绉熸埛ID */ + @TableField(fill = FieldFill.INSERT) private Long tenantId; } diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java index 890dde6..495a8a6 100644 --- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java +++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java @@ -1,8 +1,6 @@ package com.ruoyi.procurementrecord.pojo; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.*; import lombok.Builder; import lombok.Data; @@ -66,5 +64,6 @@ /** * 绉熸埛ID */ + @TableField(fill = FieldFill.INSERT) private Long tenantId; } diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java index 41a2f44..c7e1699 100644 --- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java +++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java @@ -3,10 +3,7 @@ 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.dto.*; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import javax.servlet.http.HttpServletResponse; @@ -23,9 +20,15 @@ IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto); + IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto); + int updatePro(ProcurementUpdateDto procurementDto); int deletePro(ProcurementUpdateDto procurementDto); void export(HttpServletResponse response); + + int updateManagement(ProcurementManagementUpdateDto procurementDto); + + void exportCopy(HttpServletResponse response); } diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java index a561187..31605d7 100644 --- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java +++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java @@ -56,8 +56,7 @@ .createUser(Long.valueOf(procurementRecordOutAdd.getUserId())) .createBy(sysUser.getNickName()) .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId())) - .updateTime(LocalDateTime.now()) - .tenantId(sysUser.getTenantId()); + .updateTime(LocalDateTime.now()); this.save(procurementRecordOut.build()); return 0; } diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java index 92ef336..06612f6 100644 --- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java +++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.security.LoginUser; @@ -13,7 +14,10 @@ import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.service.ProcurementRecordService; +import com.ruoyi.project.system.domain.SysUser; +import com.ruoyi.project.system.mapper.SysUserMapper; 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; @@ -22,6 +26,7 @@ import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.stream.Collectors; @@ -120,8 +125,109 @@ @Override public void export(HttpServletResponse response) { List<ProcurementPageDto> list =procurementRecordMapper.list(); + // 璁$畻寰呭叆搴撴暟閲� + // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲� + List<Integer> collect = list.stream().map(ProcurementPageDto::getId).collect(Collectors.toList()); + if(CollectionUtils.isEmpty( collect)){ + ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class); + util.exportExcel(response, list, "鍏ュ簱鍙拌处"); + return; + } + LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); + procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); + List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); + if(CollectionUtils.isEmpty( procurementRecords)){ + ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class); + util.exportExcel(response, list, "鍏ュ簱鍙拌处"); + return; + } + for (ProcurementPageDto dto : list) { + // 鏍规嵁閲囪喘鍙拌处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)); + } ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class); util.exportExcel(response, list, "鍏ュ簱鍙拌处"); + } + + private final SysUserMapper sysUserMapper; + + @Override + public int updateManagement(ProcurementManagementUpdateDto procurementDto) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + SysUser sysUser = sysUserMapper.selectUserById(procurementDto.getCreateUser()); + if(sysUser == null){ + throw new RuntimeException("鍏ュ簱浜轰笉瀛樺湪"); + } + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String entryDateStr = procurementDto.getEntryDate() + " 00:00:00"; + String createTimeStr = procurementDto.getCreateTime() + " 00:00:00"; + ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId()); + procurementRecordStorageById.setCreateBy(sysUser.getNickName()); + procurementRecordStorageById.setCreateUser(sysUser.getUserId()); + procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df)); + procurementRecordStorageById.setUpdateUser(loginUser.getUserId()); + procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df)); + procurementRecordMapper.updateById(procurementRecordStorageById); + return 0; + } + + @Override + public void exportCopy(HttpServletResponse response) { + List<ProcurementPageDtoCopy> list =procurementRecordMapper.listCopy(); + // 璁$畻寰呭叆搴撴暟閲� + // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲� + List<Integer> collect = list.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList()); + if(CollectionUtils.isEmpty( collect)){ + ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class); + util.exportExcel(response, list, "搴撳瓨绠$悊"); + return; + } + LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); + procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); + List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); + if(CollectionUtils.isEmpty( procurementRecords)){ + ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class); + util.exportExcel(response, list, "搴撳瓨绠$悊"); + return; + } + for (ProcurementPageDtoCopy dto : list) { + // 鏍规嵁閲囪喘鍙拌处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)); + } + ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class); + util.exportExcel(response, list, "搴撳瓨绠$悊"); } @Override @@ -142,7 +248,6 @@ .createUser(loginUser.getUserId()) .updateTime(LocalDateTime.now()) .updateUser(loginUser.getUserId()) - .tenantId(loginUser.getTenantId()) .createBy(procurementDto.getNickName()); this.save(procurementRecordBuilder.build()); // 鍏ュ簱鎴愬姛鍑忔帀閲囪喘鏁伴噺 @@ -197,4 +302,43 @@ return procurementPageDtoIPage; } + @Override + public IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto) { + IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto); + List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords(); + // 璁$畻寰呭叆搴撴暟閲� + // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲� + List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList()); + if(CollectionUtils.isEmpty( collect)){ + return procurementPageDtoCopyIPage; + } + LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); + procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); + List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); + if(CollectionUtils.isEmpty( procurementRecords)){ + return procurementPageDtoCopyIPage; + } + for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) { + // 鏍规嵁閲囪喘鍙拌处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 procurementPageDtoCopyIPage; + } + } diff --git a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java index aa787ed..14618a9 100644 --- a/src/main/java/com/ruoyi/project/system/controller/SysUserController.java +++ b/src/main/java/com/ruoyi/project/system/controller/SysUserController.java @@ -269,4 +269,18 @@ List<SysUser> sysUserList = userService.userListNoPage(user); return AjaxResult.success(sysUserList); } + + /** + * 鏌ヨ褰撳墠鐢ㄦ埛鍏徃涓嬫墍鏈夌敤鎴� + * @param user + * @return + */ + @GetMapping("/userListNoPageByTenantId") + public AjaxResult userListNoPageByTenantId(SysUser user){ + //鑾峰彇鐧诲綍鐢ㄦ埛淇℃伅 + SysUser loginUser = SecurityUtils.getLoginUser().getUser(); + user.setTenantId(loginUser.getTenantId()); + List<SysUser> sysUserList = userService.userListNoPage(user); + return AjaxResult.success(sysUserList); + } } diff --git a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java index f08882a..9f7003a 100644 --- a/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java +++ b/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java @@ -54,6 +54,14 @@ public SysUser selectUserById(Long userId); /** + * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛 + * + * @param userId 鐢ㄦ埛ID + * @return 鐢ㄦ埛瀵硅薄淇℃伅 + */ + public List<SysUser> selectUserByIds(@Param("userIds") List<Long> userId); + + /** * 鏂板鐢ㄦ埛淇℃伅 * * @param user 鐢ㄦ埛淇℃伅 diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java index 903f7ae..6bb8927 100644 --- a/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java @@ -12,6 +12,7 @@ import com.ruoyi.project.system.mapper.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java index f4ce895..8853bb0 100644 --- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java +++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java @@ -178,6 +178,7 @@ List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList()); List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){ + iPage.setTotal(iPage.getRecords().size()); return iPage; } for (SalesLedger salesLedger : iPage.getRecords()) { @@ -204,6 +205,7 @@ iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00"))); } } + iPage.setTotal(iPage.getRecords().size()); return iPage; } } diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java index 9ecf442..4230695 100644 --- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java +++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java @@ -36,6 +36,15 @@ } /** + * 鍦ㄨ亴鍛樺伐涓嬫媺(鏂板绂昏亴鐢�) + * @return + */ + @GetMapping("/list") + public AjaxResult staffOnJobList() { + return AjaxResult.success(staffOnJobService.staffOnJobList()); + } + + /** * 鍦ㄨ亴鍛樺伐璇︽儏 * @param staffNo * @return diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java index f83ddc6..8893835 100644 --- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java +++ b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java @@ -17,4 +17,6 @@ List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo); void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob); + + List<StaffOnJob> staffOnJobList(); } diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java index 90f884e..3a07854 100644 --- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java +++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java @@ -50,6 +50,10 @@ util.exportExcel(response, staffOnJobs, "鍦ㄨ亴鍛樺伐鍙拌处瀵煎嚭"); } + @Override + public List<StaffOnJob> staffOnJobList() { + return staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffState,1)); + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a987879..f4a6083 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -83,7 +83,7 @@ # 鏁版嵁搴撶储寮� database: 0 # 瀵嗙爜 - password: + password: root2022! # password: 123456 # 杩炴帴瓒呮椂鏃堕棿 diff --git a/src/main/resources/mapper/approve/ApproveLogMapper.xml b/src/main/resources/mapper/approve/ApproveLogMapper.xml new file mode 100644 index 0000000..e47dbbc --- /dev/null +++ b/src/main/resources/mapper/approve/ApproveLogMapper.xml @@ -0,0 +1,21 @@ +<?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> diff --git a/src/main/resources/mapper/approve/ApproveNodeMapper.xml b/src/main/resources/mapper/approve/ApproveNodeMapper.xml new file mode 100644 index 0000000..d5863ed --- /dev/null +++ b/src/main/resources/mapper/approve/ApproveNodeMapper.xml @@ -0,0 +1,24 @@ +<?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> diff --git a/src/main/resources/mapper/approve/ApproveProcessMapper.xml b/src/main/resources/mapper/approve/ApproveProcessMapper.xml new file mode 100644 index 0000000..3104940 --- /dev/null +++ b/src/main/resources/mapper/approve/ApproveProcessMapper.xml @@ -0,0 +1,36 @@ +<?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> + <select id="listPage" resultType="com.ruoyi.approve.pojo.ApproveProcess"> + select * from approve_process where approve_delete = 0 + <if test="req.approveId != null and req.approveId != ''"> + and approve_id like concat('%',#{req.approveId},'%') + </if> + </select> +</mapper> diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml index 3548891..7d0f59b 100644 --- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml +++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml @@ -33,6 +33,7 @@ t2.product_category, t1.id, t1.sales_ledger_product_id, + t1.create_user, t2.specification_model, t2.unit, t2.tax_rate, @@ -43,6 +44,7 @@ t1.inbound_num, t1.inbound_num as inboundNum0, t1.create_time, + t1.update_time, t1.create_by from procurement_record_storage t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id @@ -71,6 +73,63 @@ t1.inbound_batches, t1.inbound_num, t1.create_time, + t1.create_time as time, + 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> + <select id="listPageCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy"> + select + t3.supplier_name, + t3.purchase_contract_number, + t2.product_category, + t1.id, + t1.sales_ledger_product_id, + t1.create_user, + 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_time, + t1.update_time, + 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="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy"> + select + t3.supplier_name, + t3.purchase_contract_number, + t2.product_category, + t1.id, + t1.sales_ledger_product_id, + t1.create_user, + 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_time, + t1.update_time, + t1.create_time as cTime, + t1.update_time as uTime, t1.create_by from procurement_record_storage t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml index 4b8416e..a127b10 100644 --- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml +++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml @@ -39,6 +39,7 @@ t2.tax_exclusive_total_price, t1.inbound_num, t1.create_time, + t1.create_time as time, t1.create_by from procurement_record_out t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id diff --git a/src/main/resources/mapper/purchase/ProductRecordMapper.xml b/src/main/resources/mapper/purchase/ProductRecordMapper.xml index dd5aac6..e1646b8 100644 --- a/src/main/resources/mapper/purchase/ProductRecordMapper.xml +++ b/src/main/resources/mapper/purchase/ProductRecordMapper.xml @@ -27,7 +27,7 @@ and sl.sales_contract_no = #{c.salesContractNo} </if> <if test="c.supplierName != null and c.supplierName != ''"> - and sl.supplier_name = #{c.supplierName} + and pl.supplier_name = #{c.supplierName} </if> <if test="c.createdAtStart != null and c.createdAtStart != ''"> and pr.created_at >= date_format(#{c.createdAtStart},'%Y-%m-%d hh:mm:ss') diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml index 61957ac..f28dbd1 100644 --- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml +++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml @@ -7,10 +7,10 @@ FROM quality_unqualified where 1=1 - <if test="qualityUnqualified.inspectType != null and qualityUnqualified.inspectType != '' "> + <if test="qualityUnqualified.inspectType != null "> AND inspect_type = #{qualityUnqualified.inspectType} </if> - <if test="qualityUnqualified.inspectState != null and qualityUnqualified.inspectState != '' "> + <if test="qualityUnqualified.inspectState != null "> AND inspect_state = #{qualityUnqualified.inspectState} </if> <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' "> @@ -23,10 +23,10 @@ FROM quality_unqualified where 1=1 - <if test="qualityUnqualified.inspectType != null and qualityUnqualified.inspectType != '' "> + <if test="qualityUnqualified.inspectType != null"> AND inspect_type = #{qualityUnqualified.inspectType} </if> - <if test="qualityUnqualified.inspectState != null and qualityUnqualified.inspectState != '' "> + <if test="qualityUnqualified.inspectState != null"> AND inspect_state = #{qualityUnqualified.inspectState} </if> <if test="qualityUnqualified.productName != null and qualityUnqualified.productName != '' "> diff --git a/src/main/resources/mapper/system/SysDeptMapper.xml b/src/main/resources/mapper/system/SysDeptMapper.xml index efebac7..5c6310a 100644 --- a/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/src/main/resources/mapper/system/SysDeptMapper.xml @@ -67,7 +67,7 @@ </select> <select id="checkDeptExistUser" parameterType="Long" resultType="int"> - select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0' + select count(1) from sys_user_dept where dept_id = #{deptId} </select> <select id="hasChildByDeptId" parameterType="Long" resultType="int"> diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml index 3afcaf0..52ec0a3 100644 --- a/src/main/resources/mapper/system/SysUserMapper.xml +++ b/src/main/resources/mapper/system/SysUserMapper.xml @@ -62,6 +62,11 @@ FROM sys_user_dept T1 LEFT JOIN sys_dept T2 ON T1.dept_id = T2.dept_id + <where> + <if test="tenantId != null and tenantId != 0"> + T1.dept_id = #{tenantId} + </if> + </where> GROUP BY T1.user_id ) T2 on T2.user_id = u.user_id where u.del_flag = '0' @@ -147,7 +152,13 @@ <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1 </select> - + <select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser"> + <include refid="selectUserVo"/> + where u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </select> + <insert id="insertUser" parameterType="com.ruoyi.project.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId"> insert into sys_user( <if test="userId != null and userId != 0">user_id,</if> -- Gitblit v1.9.3