doc/20260119-procurement_record_storage.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,2 @@ alter table procurement_record_storage add quality_inspect_id bigint null comment 'è´¨æ£id'; src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import org.apache.ibatis.annotations.Param; @@ -17,6 +18,8 @@ IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel); IPage<ProductModel> listPageProductionStock(Page<ProductModel> page, @Param("req") ProcurementPageDto req); ProductModel selectLatestRecord(); } src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -6,6 +6,7 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("product_model") @@ -59,4 +60,7 @@ @TableField(exist = false) @Excel(name = "å©ä½åºå") private BigDecimal stockQuantity; @TableField(exist = false) private LocalDateTime createTime; } src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -30,8 +30,8 @@ import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffOnJob; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -48,11 +48,12 @@ private final MeetDraftMapper meetDraftMapper; private final MeetApplicationMapper meetApplicationMapper; private final StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper; private final StaffOnJobMapper staffOnJobMapper; private final MeetingMinutesMapper meetingMinutesMapper; private final SysUserMapper userMapper; private final ISysNoticeService sysNoticeService; @Override public IPage<MeetingRoom> getMeetingRoomList(SearchMeetingRoomVo vo) { @@ -165,7 +166,7 @@ .filter(s -> !s.isEmpty()) .map(Long::valueOf) .map(staffId -> { StaffJoinLeaveRecord record = staffJoinLeaveRecordMapper.selectById(staffId); StaffOnJob record = staffOnJobMapper.selectById(staffId); if (record == null) { return null; } src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -99,8 +99,8 @@ @GetMapping("/workInProcessTurnover") @ApiOperation("å¨å¶åå¨è½¬æ åµ") public AjaxResult workInProcessTurnover(){ Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = homeService.workInProcessTurnover(); return AjaxResult.success(productWorkOrderDtoMap); ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover(); return AjaxResult.success(productionTurnoverDto); } @ApiOperation("è¶ è¿15å¤©å¾ åæ¬¾æç¤º") src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
@@ -12,14 +12,14 @@ @ApiModel public class ProductionProgressDto { @ApiModelProperty("æ»è®¢åæ°") private Integer totalOrderCount; private Long totalOrderCount; @ApiModelProperty("å·²å®æè®¢åæ°") private Integer completedOrderCount; private Long completedOrderCount; @ApiModelProperty("æªå®æè®¢åæ°") private Integer uncompletedOrderCount; @ApiModelProperty("æ»ä½å®æè¿åº¦") private BigDecimal completedProgressCount; private Long uncompletedOrderCount; @ApiModelProperty("é¨åå®æè®¢åæ°") private Long partialCompletedOrderCount; @ApiModelProperty("订å详æ ") private List<ProductOrderDto> completedOrderDetails; } src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.home.dto; import com.ruoyi.production.dto.ProductOrderDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data @ApiModel public class ProductionTurnoverDto { @ApiModelProperty("æ»å¨å¶æ°é") private Long totalOrderCount; @ApiModelProperty("å¹³åå¨è½¬å¤©æ°") private BigDecimal averageTurnoverDays; @ApiModelProperty("å¨è½¬æç") private BigDecimal turnoverEfficiency; @ApiModelProperty("å·¥åºè¯¦æ ") private List<String> processDetails; @ApiModelProperty("å·¥åºå¯¹åºçæ°é详æ ") private List<Long> processQuantityDetails; } src/main/java/com/ruoyi/home/service/HomeService.java
@@ -31,9 +31,8 @@ Long noticesCount(); ProductionProgressDto productionProgress(); Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover(); ProductionProgressDto productionProgress(); ProductionTurnoverDto workInProcessTurnover(); Long overdueReceivable(); } src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,9 +2,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.mapper.ApproveProcessMapper; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.collaborativeApproval.mapper.NoticeMapper; import com.ruoyi.collaborativeApproval.pojo.Notice; import com.ruoyi.common.utils.SecurityUtils; @@ -24,13 +27,16 @@ import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductProcessMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.mapper.SysDeptMapper; @@ -59,6 +65,7 @@ import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -113,10 +120,13 @@ @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; private ProductProcessMapper productProcessMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductModelMapper productModelMapper; @Autowired private StockUtils stockUtils; @Override public HomeBusinessDto business() { // æå»ºç»æ @@ -169,23 +179,35 @@ homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString()); } // ç»è®¡åºå List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null); BigDecimal stockAmount = procurementRecordStorages.stream() .map(ProcurementRecordStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); // èªå®ä¹åºå List<CustomStorage> customStorages = customStorageMapper.selectList(null); BigDecimal customStockAmount = customStorages.stream() .map(CustomStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null); BigDecimal outboundAmount = procurementRecordOuts.stream() .map(ProcurementRecordOut::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount); // List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null); // BigDecimal stockAmount = procurementRecordStorages.stream() // .map(ProcurementRecordStorage::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // // èªå®ä¹åºå // List<CustomStorage> customStorages = customStorageMapper.selectList(null); // BigDecimal customStockAmount = customStorages.stream() // .map(CustomStorage::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null); // BigDecimal outboundAmount = procurementRecordOuts.stream() // .map(ProcurementRecordOut::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount); IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel()); if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){ //è·åè§æ ¼id List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList()); BigDecimal stockQuantityTotal = modelIds.stream() .map(stockUtils::getStockQuantity) .map(map -> map.get("stockQuantity")) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); } // è·åå½å¤©å ¥åºæ°é LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now) // 大äºçäºå½å¤© @@ -195,7 +217,7 @@ .map(ProcurementRecordStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString()); // homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString()); homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString()); return homeBusinessDto; } @@ -512,37 +534,55 @@ @Override public ProductionProgressDto productionProgress() { ProductionProgressDto productionProgressDto = new ProductionProgressDto(); List<ProductOrder> productOrderList = productOrderMapper.selectList(new LambdaQueryWrapper<ProductOrder>()); List<ProductOrderDto> productOrderDtoList = new ArrayList<>(); productOrderList.forEach(productOrder -> { ProductOrderDto productOrderDto = productOrderMapper.productMainByOrderId(productOrder); // if (productOrderDto != null && productOrderDto.getPlanQuantity() != null && productOrderDto.getQuantity() != null) { // productOrderDto.setCompletionStatus((productOrderDto.getPlanQuantity().subtract(productOrderDto.getQuantity())).divide(productOrderDto.getPlanQuantity(), 2, RoundingMode.HALF_UP)); // } productOrderDtoList.add(productOrderDto); }); productionProgressDto.setCompletedOrderDetails(productOrderDtoList); // 1. æ¥è¯¢ææç产订åï¼å¯æ ¹æ®éæ±æ·»å è¿æ»¤æ¡ä»¶ï¼å¦æé¤å·²å é¤ã已忶ç订åï¼ IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(new Page<>(1, -1), new ProductOrderDto()); // 2. åå§åæ±æ»æ°æ® int totalCount = productOrderDtoIPage.getRecords().size(); int completedCount = (int) productOrderDtoIPage.getRecords().stream().map(productOrderDto -> productOrderMapper.productMainByOrderId(productOrderDto)).filter(productOrderDto1 -> productOrderDto1.getQuantity() != null && productOrderDto1.getQuantity().compareTo(BigDecimal.ZERO) == 0).count(); // 6. èµå¼æ±æ»æ°æ® ProductOrderDto orderDto = new ProductOrderDto(); orderDto.setStartTime(LocalDateTime.now().minusMonths(1)); orderDto.setEndTime(LocalDateTime.now()); List<ProductOrderDto> productOrderDtos = productOrderMapper.pageProductOrder(new Page<>(1, -1), orderDto).getRecords(); productionProgressDto.setCompletedOrderDetails(productOrderDtos); long totalCount = productOrderDtos.size(); long count = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0).count(); long count2 = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0).count(); productionProgressDto.setTotalOrderCount(totalCount); productionProgressDto.setCompletedOrderCount(completedCount); productionProgressDto.setUncompletedOrderCount(totalCount - completedCount); productionProgressDto.setCompletedProgressCount(BigDecimal.valueOf(completedCount).divide(BigDecimal.valueOf(totalCount), 2, RoundingMode.HALF_UP)); productionProgressDto.setCompletedOrderCount(count); productionProgressDto.setUncompletedOrderCount(count2); productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2); return productionProgressDto; } @Override public Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover() { List<ProductWorkOrderDto> productWorkOrderDtoList = productWorkOrderMapper.selectProductWorkOrderDtoList(); //æ ¹æ®ç¶æåºåå·¥åçåä¸ªç¶æ Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = productWorkOrderDtoList.stream().collect(Collectors.groupingBy(ProductWorkOrderDto::getStatus)); return productWorkOrderDtoMap; public ProductionTurnoverDto workInProcessTurnover() { ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto(); ProductWorkOrderDto workOrder = new ProductWorkOrderDto(); workOrder.setPlanStartTime(LocalDate.now().minusMonths(1)); workOrder.setPlanEndTime(LocalDate.now()); List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords(); long sum = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0) .map(ProductWorkOrder::getPlanQuantity) .mapToLong(BigDecimal::longValue) .sum(); if (sum == 0)return null; productionTurnoverDto.setTotalOrderCount(sum);//æ»å¨å¶åæ°é productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP)); long completeQuantity = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0) .map(ProductWorkOrder::getCompleteQuantity) .mapToLong(BigDecimal::longValue) .sum(); productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP)); Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0) .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName)); List<String> strings = new ArrayList<>(); List<Long> processQuantityDetails = new ArrayList<>(); map.entrySet().stream().forEach(entry -> { String key = entry.getKey(); long completeSum = entry.getValue().stream().map(ProductWorkOrderDto::getCompleteQuantity).mapToLong(BigDecimal::longValue).sum(); strings.add(key); processQuantityDetails.add(completeSum); }); productionTurnoverDto.setProcessDetails(strings); productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails); return productionTurnoverDto; } src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -237,8 +237,8 @@ @GetMapping("/listPageProductionStock") @Log(title = "åºå管ç-æååºå", businessType = BusinessType.OTHER) public AjaxResult listPageProductionStock(Page page) { IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page); public AjaxResult listPageProductionStock(Page page, ProcurementPageDto procurementDto) { IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page,procurementDto); return AjaxResult.success(result); } } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -22,5 +22,6 @@ private String typeName; private Integer purchaseLedgerId; private Long qualityInspectId; } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -192,4 +192,6 @@ @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate endDate; private Long productModelId; } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -100,4 +100,6 @@ * 产åID */ private Long productModelId; private Long qualityInspectId; } src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -60,7 +60,7 @@ BigDecimal getProcurementAmount(Long salesProductId); InventoryInformationDto getReportList(); IPage<ProductModel> listPageProductionStock(Page page); IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto procurementDto); IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto); } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -781,7 +781,8 @@ .updateTime(LocalDateTime.now()) .updateUser(loginUser.getUserId()) .createBy(procurementDto.getNickName()) .productModelId(detail.getProductModelId()); .productModelId(detail.getProductModelId()) .qualityInspectId(ObjectUtils.isNotNull(procurementDto.getQualityInspectId())?procurementDto.getQualityInspectId():0L); this.save(procurementRecordBuilder.build()); // å ¥åºæååæéè´æ°é // LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>(); @@ -881,21 +882,51 @@ } return procurementPageDtoCopyIPage; } @Override public IPage<ProductModel> listPageProductionStock(Page page) { ProductModel productModel = new ProductModel(); IPage<ProductModel> iPage = productModelMapper.listPageProductModel(page, productModel); iPage.getRecords().forEach(item -> { item.setInboundNum(stockUtils.getStockQuantity(item.getId()).get("inboundNum")); item.setOutboundNum(stockUtils.getStockQuantity(item.getId()).get("outboundNum")); item.setStockQuantity(stockUtils.getStockQuantity(item.getId()).get("stockQuantity")); }); return iPage; public IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto dto) { return productModelMapper.listPageProductionStock(page, dto); } @Override public IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto) { IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProductProduction(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) .eq(ProcurementRecordOut::getType, 4); 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; } src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -17,5 +17,4 @@ IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder); List<ProductWorkOrderDto> selectProductWorkOrderDtoList(); } src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
@@ -14,7 +14,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.xiaoymin.knife4j.core.util.StrUtil; 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.domain.SysUserDept; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.mapper.SysUserDeptMapper; import com.ruoyi.project.system.mapper.SysUserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -36,6 +40,12 @@ @Autowired private SysUserMapper userMapper; @Autowired private SysDeptMapper deptMapper; @Autowired private SysUserDeptMapper userDeptMapper; @Autowired @Lazy @@ -137,12 +147,53 @@ } @Override public void simpleNoticeAll(String title, String message, Long tenantId,String jumpPath) { public void simpleNoticeAll(String title, String message, Long rootDeptId, String jumpPath) { Long userId = SecurityUtils.getLoginUser().getUserId(); List<SysUser> sysUsers = userMapper.selectList(Wrappers.<SysUser>lambdaQuery() .eq(SysUser::getStatus, "0") .eq(SysUser::getTenantId, tenantId)); List<SysNotice> collect = sysUsers.stream().map(it -> convertSysNotice(title, message, it.getUserId(),tenantId, jumpPath, userId)).collect(Collectors.toList()); if (userId == null) { return; } // æ¥ææåé¨é¨ List<SysDept> childrenDepts = deptMapper.selectChildrenDeptById(rootDeptId); // ç»è£ deptIds List<Long> deptIds = childrenDepts.stream() .map(SysDept::getDeptId) .collect(Collectors.toList()); deptIds.add(rootDeptId); // æ¥ç¨æ·ID List<Long> userIds = userDeptMapper.selectList( Wrappers.<SysUserDept>lambdaQuery() .in(SysUserDept::getDeptId, deptIds) ).stream() .map(SysUserDept::getUserId) .distinct() .collect(Collectors.toList()); if (userIds.isEmpty()) { return; } // æ¥ç¨æ· List<SysUser> sysUsers = userMapper.selectList( Wrappers.<SysUser>lambdaQuery() .eq(SysUser::getStatus, "0") .in(SysUser::getUserId, userIds) ); // åéç¥ List<SysNotice> collect = sysUsers.stream() .map(it -> convertSysNotice( title, message, it.getUserId(), it.getTenantId(), jumpPath, userId )) .collect(Collectors.toList()); sysNoticeService.saveBatch(collect); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -24,6 +24,8 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; @@ -108,6 +110,7 @@ private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final ProcurementRecordMapper procurementRecordStorageMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -409,6 +412,19 @@ if (ids == null || ids.length == 0) { throw new BaseException("请éä¸è³å°ä¸æ¡æ°æ®"); } // æ¹éå é¤å ³èçéè´å ¥åºè®°å½ LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductQueryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids) .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductQueryWrapper); if (CollectionUtils.isNotEmpty(salesLedgerProducts)) { salesLedgerProducts.stream().forEach(salesLedgerProduct -> { // æ¹éå é¤å ³èçéè´å°è´¦äº§å LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProduct.getId()); procurementRecordStorageMapper.delete(queryWrapper); }); } // æ¹éå é¤å ³èçéè´å°è´¦äº§å LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids) src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -50,10 +50,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.*; import java.util.stream.Collectors; /** @@ -258,48 +255,119 @@ @Override @Transactional(rollbackFor = Exception.class) public int delRegistration(Long[] ids) { // å é¤éè´å°è´¦äº§åå¼ç¥¨è®°å½å¯¹è±¡ LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); productRecordLambdaQueryWrapper.in(ProductRecord::getId, Arrays.asList(ids)); List<ProductRecord> productRecords = productRecordMapper.selectList(productRecordLambdaQueryWrapper); if(CollectionUtils.isEmpty(productRecords)){ // æ¥è¯¢è¦å é¤çäº§åæ¥ç¥¨è®°å½ LambdaQueryWrapper<ProductRecord> productWrapper = new LambdaQueryWrapper<>(); productWrapper.in(ProductRecord::getId, Arrays.asList(ids)); List<ProductRecord> productRecords = productRecordMapper.selectList(productWrapper); if (CollectionUtils.isEmpty(productRecords)) { return 0; } LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>(); ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getId, productRecords.stream().map(ProductRecord::getTicketRegistrationId).collect(Collectors.toList())); List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(ticketRegistrationLambdaQueryWrapper); // ä¿®æ¹äº§åä¿¡æ¯ for (ProductRecord productRecord : productRecords) { BigDecimal subtract = ticketRegistrations.get(0).getInvoiceAmount().subtract(productRecords.get(0).getTicketsAmount()); // å°äºçäº0å é¤ ï¼å¤§äº0ä¿®æ¹ if(subtract.compareTo(BigDecimal.ZERO) <= 0){ ticketRegistrationMapper.deleteById(ticketRegistrations.get(0)); // å é¤ä»æ¬¾æµæ°´è®°å½ paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().eq(PaymentRegistration::getTicketRegistrationId, ticketRegistrations.get(0).getId())); }else if(subtract.compareTo(BigDecimal.ZERO) > 0){ ticketRegistrations.get(0).setInvoiceAmount(subtract); ticketRegistrationMapper.updateById(ticketRegistrations.get(0)); } LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, productRecord.getSaleLedgerProjectId()) .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper); if(!CollectionUtils.isEmpty(salesLedgerProducts)){ for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { salesLedgerProduct.setFutureTickets(salesLedgerProduct.getFutureTickets().add(productRecord.getTicketsNum())); salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getFutureTicketsAmount().add(productRecord.getTicketsAmount())); salesLedgerProductMapper.updateById(salesLedgerProduct); // æ¶éå ³èID Set<Long> ticketRegistrationIds = productRecords.stream() .map(ProductRecord::getTicketRegistrationId) .collect(Collectors.toSet()); } Set<Long> salesLedgerProductIds = productRecords.stream() .map(ProductRecord::getSaleLedgerProjectId) .collect(Collectors.toSet()); // æ¥è¯¢æ¥ç¥¨ç»è®° List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectBatchIds(ticketRegistrationIds); // å¤çæ¥ç¥¨ç»è®°éé¢ã仿¬¾æµæ°´ for (TicketRegistration ticket : ticketRegistrations) { // 该æ¥ç¥¨ç»è®°ä¸ææäº§åè®°å½ List<ProductRecord> recordsOfTicket = productRecords.stream() .filter(r -> r.getTicketRegistrationId().equals(ticket.getId())) .collect(Collectors.toList()); // 计ç®è¦åéçéé¢ BigDecimal rollbackAmount = recordsOfTicket.stream() .map(ProductRecord::getTicketsAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal remain = ticket.getInvoiceAmount().subtract(rollbackAmount); if (remain.compareTo(BigDecimal.ZERO) <= 0) { // å 餿¥ç¥¨ç»è®° ticketRegistrationMapper.deleteById(ticket.getId()); // å é¤ä»æ¬¾æµæ°´ paymentRegistrationMapper.delete( new LambdaQueryWrapper<PaymentRegistration>() .eq(PaymentRegistration::getTicketRegistrationId, ticket.getId()) ); } else { ticket.setInvoiceAmount(remain); ticketRegistrationMapper.updateById(ticket); } } // å é¤éè´å°è´¦äº§åå¼ç¥¨è®°å½ productRecordMapper.delete(productRecordLambdaQueryWrapper); // åééå®å°è´¦äº§åçæªæ¥ç¥¨ for (ProductRecord record : productRecords) { LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getId, record.getSaleLedgerProjectId()) .eq(SalesLedgerProduct::getType, 2); SalesLedgerProduct product = salesLedgerProductMapper.selectOne(wrapper); if (product != null) { product.setFutureTickets( product.getFutureTickets().add(record.getTicketsNum()) ); product.setFutureTicketsAmount( product.getFutureTicketsAmount().add(record.getTicketsAmount()) ); salesLedgerProductMapper.updateById(product); } } // å é¤äº§åæ¥ç¥¨è®°å½ productRecordMapper.delete(productWrapper); // éæ°è®¡ç® currentInvoiceAmount for (Long productId : salesLedgerProductIds) { refreshCurrentInvoiceAmount(productId); } return 1; } private void refreshCurrentInvoiceAmount(Long salesLedgerProductId) { // æ¥è¯¢è¯¥äº§åææ°ä¸æ¡æ¥ç¥¨è®°å½ LambdaQueryWrapper<ProductRecord> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ProductRecord::getSaleLedgerProjectId, salesLedgerProductId) .orderByDesc(ProductRecord::getCreatedAt) .last("limit 1"); ProductRecord latestRecord = productRecordMapper.selectOne(wrapper); SalesLedgerProduct product = salesLedgerProductMapper.selectById(salesLedgerProductId); if (product == null) { return; } if (latestRecord == null) { // 没æä»»ä½æ¥ç¥¨è®°å½ product.setTicketsAmount(BigDecimal.ZERO); } else { // æ°¸è¿åææ°ä¸æ¡ product.setTicketsAmount(latestRecord.getTicketsAmount()); } salesLedgerProductMapper.updateById(product); } @Override public TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto) { TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(ticketRegistrationDto.getId()); src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -3,6 +3,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; @@ -12,6 +15,7 @@ import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.service.IQualityUnqualifiedService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -34,6 +38,8 @@ @Resource private IQualityInspectFileService qualityInspectFileService; @Autowired private ProcurementRecordService procurementRecordService; /** @@ -62,6 +68,8 @@ //å 餿£éªéä»¶ qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery() .in(QualityInspectFile::getInspectId,ids)); //å é¤å ¥åºè®°å½ procurementRecordService.remove(Wrappers.<ProcurementRecordStorage>lambdaQuery().in(ProcurementRecordStorage::getQualityInspectId,ids)); //å 餿£éªå return AjaxResult.success(qualityInspectService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -5,11 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface IQualityInspectService extends IService<QualityInspect> { src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,10 +1,8 @@ package com.ruoyi.quality.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -21,22 +19,15 @@ import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.service.IStaffOnJobService; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -113,7 +104,7 @@ if ("åæ ¼".equals(qualityInspect.getCheckResult())) { ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(1); procurementRecordOutAdd.setTypeName("éè´å ¥åº"); procurementRecordOutAdd.setTypeName("éè´åæææ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId())); if (qualityInspect.getPurchaseLedgerId() == null) { @@ -131,13 +122,14 @@ details.setProductModelId(qualityInspect.getProductModelId()); detailss.add( details); procurementRecordOutAdd.setDetails(detailss); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } }else if (qualityInspect.getInspectType() == 1) { //æ¥è¯¢UnitPrice/TotalPrice ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); procurementRecordOutAdd.setTypeName("ç产è¿ç¨æ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); @@ -158,7 +150,8 @@ .updateTime(LocalDateTime.now()) .updateUser(loginUser.getUserId()) .createBy(procurementRecordOutAdd.getNickName()) .productModelId(details1.getProductModelId()); .productModelId(details1.getProductModelId()) .qualityInspectId(qualityInspect.getId()); procurementRecordService.save(procurementRecordBuilder.build()); @@ -168,7 +161,7 @@ SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId()); ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); procurementRecordOutAdd.setTypeName("ç产åºåæ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); @@ -179,6 +172,7 @@ details1.setProductModelId(salesLedgerProduct.getProductModelId()); details.add(details1); procurementRecordOutAdd.setDetails(details); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } qualityInspect.setInspectState(1);//å·²æäº¤ src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -89,19 +89,21 @@ // 审æ¹éè¿ if (req.getApproveStatus() == 3) { // æ¥è¯¢éè´å ¥åºè®°å½ LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>() .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId()); ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper); if (procurementRecordStorage == null) { // ä¿è¯åé¢çä¿®æ¹å ¨é¨åæ» throw new ServiceException("éè´è®°å½ä¸åå¨ï¼å®¡æ¹åæ»"); } // // æ¥è¯¢éè´å ¥åºè®°å½ // LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>() // .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId()); // ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper); // // if (procurementRecordStorage == null) { // // ä¿è¯åé¢çä¿®æ¹å ¨é¨åæ» // throw new ServiceException("éè´è®°å½ä¸åå¨ï¼å®¡æ¹åæ»"); // } // çæåºåºè®°å½ ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); procurementRecordOutAdd.setId(procurementRecordStorage.getId()); // procurementRecordOutAdd.setId(procurementRecordStorage.getId()); procurementRecordOutAdd.setId(0); procurementRecordOutAdd.setProductModelId(salesLedgerProduct.getProductModelId()); procurementRecordOutAdd.setSalesLedgerProductId((long) Math.toIntExact(salesLedgerProduct.getId())); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId())); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -98,10 +98,10 @@ if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){ invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount()); noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum); noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount); } } noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum); noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount); ledgerProduct.setInvoiceNum(invoiceNum); ledgerProduct.setInvoiceAmount(invoiceAmount); ledgerProduct.setNoInvoiceNum(noInvoiceNum); src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -3,8 +3,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.staff.pojo.PersonalAttendanceRecords; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.service.PersonalAttendanceRecordsService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
@@ -3,7 +3,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.staff.dto.StaffLeaveDto; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.service.StaffLeaveService; import io.swagger.annotations.Api; import org.springframework.util.CollectionUtils; src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -5,9 +5,8 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffContract; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.service.IStaffJoinLeaveRecordService; import com.ruoyi.staff.service.IStaffOnJobService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -48,8 +47,8 @@ * @return */ @GetMapping("/list") public AjaxResult staffOnJobList() { return AjaxResult.success(staffOnJobService.staffOnJobList()); public AjaxResult staffOnJobList(StaffOnJob staffOnJob) { return AjaxResult.success(staffOnJobService.staffOnJobList(staffOnJob)); } /** @@ -96,6 +95,17 @@ } /** * ç»ç¾åå * @param id * @param staffContract * @return */ @PostMapping("/renewContract/{id}") public AjaxResult renewContract(@PathVariable("id") Long id, @RequestBody StaffContract staffContract) { return AjaxResult.success(staffOnJobService.renewContract(id, staffContract)); } /** * å¨èåå·¥å¯¼å ¥ */ @PostMapping("/import") src/main/java/com/ruoyi/staff/dto/StaffJoinLeaveRecordDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
@@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import lombok.Data; @@ -16,14 +15,11 @@ @Excel(name = "å²ä½",sort = 8) private String postName; @Excel(name = "ååå¹´é") private String contractTerm; @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "ååå¼å§æ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private Date contractStartTime; @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "ååç»ææ¥æ", width = 30, dateFormat = "yyyy-MM-dd") private Date contractEndTime; } src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -4,9 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffContract; import com.ruoyi.staff.pojo.StaffOnJob; import org.bouncycastle.crypto.digests.LongDigest; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -25,9 +24,11 @@ int delStaffOnJobs(List<Integer> ids); int renewContract(Long id, StaffContract staffContract); void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob); List<StaffJoinLeaveRecord> staffOnJobList(); List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob); Boolean importData(MultipartFile file); src/main/java/com/ruoyi/staff/service/StaffContractService.java
@@ -4,14 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.staff.dto.StaffContractDto; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.pojo.StaffContract; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; public interface StaffContractService extends IService<StaffContract> { src/main/java/com/ruoyi/staff/service/StaffLeaveService.java
@@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.staff.dto.StaffLeaveDto; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffLeave; import javax.servlet.http.HttpServletResponse; src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
@@ -1,17 +1,13 @@ package com.ruoyi.staff.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.staff.dto.StaffLeaveDto; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.mapper.StaffLeaveMapper; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffContract; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.service.StaffLeaveService; import lombok.AllArgsConstructor; src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -1,7 +1,6 @@ package com.ruoyi.staff.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -13,11 +12,9 @@ import com.ruoyi.project.system.mapper.SysPostMapper; import com.ruoyi.staff.dto.StaffOnJobDto; import com.ruoyi.staff.mapper.StaffContractMapper; import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper; import com.ruoyi.staff.mapper.StaffLeaveMapper; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffContract; import com.ruoyi.staff.pojo.StaffJoinLeaveRecord; import com.ruoyi.staff.pojo.StaffLeave; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.staff.service.IStaffOnJobService; @@ -47,7 +44,6 @@ private SysPostMapper sysPostMapper; private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper; private StaffContractMapper staffContractMapper; private StaffLeaveMapper staffLeaveMapper; @@ -69,6 +65,7 @@ throw new BaseException("ç¼å·ä¸º"+staffOnJobPrams.getStaffNo()+"çå工已ç»åå¨,æ æ³æ°å¢!!!"); } // åå»ºå ¥èæ°æ® staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime()); staffOnJobMapper.insert(staffOnJobPrams); // å建ååè®°å½ @@ -90,20 +87,22 @@ throw new BaseException("ç¼å·ä¸º"+staffOnJobParams.getStaffNo()+"çåå·¥ä¸åå¨,æ æ³æ´æ°!!!"); } // æ´æ°åå·¥æ°æ® String[] ignoreProperties = {"id"};//æé¤id屿§ BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties); staffOnJobMapper.updateById(job); // è·åææ°ååæ°æ®ï¼å¹¶ä¸æ´æ° StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery() .eq(StaffContract::getStaffOnJobId, id) .last("limit 1") .orderByDesc(StaffContract::getId)); if (contract != null){ BeanUtils.copyProperties(staffOnJobParams,contract,ignoreProperties); return staffContractMapper.updateById(contract); staffContractMapper.updateById(contract); } return 0; // æ´æ°åå·¥æ°æ® BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties); job.setContractExpireTime(staffOnJobParams.getContractEndTime()); return staffOnJobMapper.updateById(job); } //å é¤å ¥è @@ -118,10 +117,38 @@ return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids)); } // ç»ç¾åå @Override @Transactional(rollbackFor = Exception.class) public int renewContract(Long id, StaffContract staffContract) { // å¤æå¯¹è±¡æ¯å¦åå¨ StaffOnJob job = staffOnJobMapper.selectById(id); if (job == null){ throw new BaseException("该åå·¥ä¸åå¨,æ æ³æ´æ°!!!"); } // å¢å åå StaffContract newStaffContract = new StaffContract(); newStaffContract.setStaffOnJobId(id); newStaffContract.setContractTerm(staffContract.getContractTerm()); newStaffContract.setContractStartTime(staffContract.getContractStartTime()); newStaffContract.setContractEndTime(staffContract.getContractEndTime()); staffContractMapper.insert(newStaffContract); // æ´æ°åå·¥ååè¿ææ¶é´ job.setContractExpireTime(staffContract.getContractEndTime()); staffOnJobMapper.updateById(job); return 0; } //å¨èå工详æ @Override public StaffOnJobDto staffOnJobDetail(Long id) { StaffOnJob staffOnJob = staffOnJobMapper.selectById(id); if (staffOnJob == null) { throw new IllegalArgumentException("该åå·¥ä¸åå¨"); } StaffOnJobDto staffOnJobDto = new StaffOnJobDto(); BeanUtils.copyProperties(staffOnJob, staffOnJobDto); // æ¥è¯¢å²ä½åç§° @@ -131,6 +158,7 @@ // æ¥è¯¢ååä¿¡æ¯ StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery() .eq(StaffContract::getStaffOnJobId, staffOnJob.getId()) .last("limit 1") .orderByDesc(StaffContract::getId)); if (contract != null){ staffOnJobDto.setContractTerm(contract.getContractTerm()); @@ -149,8 +177,8 @@ } @Override public List<StaffJoinLeaveRecord> staffOnJobList() { return staffJoinLeaveRecordMapper.staffOnJobList(); public List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob) { return staffOnJobMapper.staffOnJobList(staffOnJob); } @Override src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -13,7 +13,6 @@ <result column="tenant_id" property="tenantId" /> <result column="product_name" property="productName" /> <result column="product_id" property="productId" /> <result column="product_code" property="productCode" /> </resultMap> <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel"> select pm.*,p.product_name @@ -35,5 +34,68 @@ LIMIT 1 </select> <select id="listPageProductionStock" resultType="com.ruoyi.basic.pojo.ProductModel"> SELECT pm.id, pm.product_id, pm.model, pm.unit, p.product_name, GREATEST(s.last_in_time, o.last_out_time) AS create_time, COALESCE(s.inboundNum, 0) AS inboundNum, COALESCE(o.outboundNum, 0) AS outboundNum, COALESCE(s.inboundNum, 0) - COALESCE(o.outboundNum, 0) AS stockQuantity FROM product_model pm LEFT JOIN product p ON pm.product_id = p.id -- å ¥åºæ±æ» LEFT JOIN ( SELECT product_model_id, SUM(inbound_num) AS inboundNum, MAX(create_time) AS last_in_time FROM procurement_record_storage <where> <if test="req.timeStr != null and req.timeStr != ''"> AND create_time >= #{req.timeStr} AND create_time < DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY) </if> </where> GROUP BY product_model_id ) s ON s.product_model_id = pm.id -- åºåºæ±æ» LEFT JOIN ( SELECT product_model_id, SUM(inbound_num) AS outboundNum, MAX(create_time) AS last_out_time FROM procurement_record_out <where> <if test="req.timeStr != null and req.timeStr != ''"> AND create_time >= #{req.timeStr} AND create_time < DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY) </if> </where> GROUP BY product_model_id ) o ON o.product_model_id = pm.id <where> <if test="req.timeStr != null and req.timeStr != ''"> AND (s.product_model_id IS NOT NULL OR o.product_model_id IS NOT NULL) </if> <if test="req.productCategory != null and req.productCategory != ''"> AND EXISTS ( SELECT 1 FROM sales_ledger_product slp WHERE slp.product_id = p.id AND slp.product_category LIKE CONCAT('%', #{req.productCategory}, '%') ) </if> </where> ORDER BY pm.id DESC </select> </mapper> src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -361,6 +361,7 @@ <select id="listPageByProductProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto"> select t1.*, t1.inbound_num as inboundNum0, t2.model as specification_model , t2.unit, t3.product_name as product_category src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -43,6 +43,9 @@ <if test="c.specificationModel != null and c.specificationModel != ''"> and slp.specification_model like concat('%',#{c.specificationModel},'%') </if> <if test="c.startTime != null and c.endTime != null"> and po.create_time between #{c.startTime} and #{c.endTime} </if> </where> </select> <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto"> src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -38,11 +38,9 @@ <if test="c.workOrderNo != null and c.workOrderNo != ''"> pwo.work_order_no like concat('%',#{c.workOrderNo},'%') </if> <if test="c.planStartTime != null and c.planEndTime != null"> and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime} </if> </where> </select> <select id="selectProductWorkOrderDtoList" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> select * from product_work_order pwo left join product_order po on po.id = pwo.product_order_id </select> </mapper> src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
ÎļþÒÑɾ³ý src/main/resources/mapper/system/SysUserMapper.xml
@@ -88,7 +88,7 @@ <if test="params.endTime != null and params.endTime != ''"><!-- ç»ææ¶é´æ£ç´¢ --> AND date_format(u.create_time,'%Y%m%d') <= date_format(#{params.endTime},'%Y%m%d') </if> <if test="params.deptId != null"> <if test="deptId != null"> AND u.user_id IN ( SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}