Merge branch 'dev_New_pro' of http://114.132.189.42:9002/r/product-inventory-management-after into dev_New_pro
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.basic.controller; |
| | | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.SupplierManageDto; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.service.StorageAttachmentService; |
| | | import com.ruoyi.common.constant.StorageAttachmentConstants; |
| | | import com.ruoyi.common.enums.StorageAttachmentRecordType; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.List; |
| | | |
| | | @RestController |
| | | @AllArgsConstructor |
| | | @RequestMapping("/basic/storage_attachment") |
| | | public class StorageAttachmentController { |
| | | private StorageAttachmentService storageAttachmentService; |
| | | |
| | | /** |
| | | * å页æ¥è¯¢éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param page å页忰 |
| | | * @param storageAttachmentDTO å
³èè®°å½ä¿¡æ¯ |
| | | * @return åé¡µç»æ |
| | | */ |
| | | @GetMapping("/listPage") |
| | | public R listPage(Page page, StorageAttachmentDTO storageAttachmentDTO) { |
| | | return R.ok(storageAttachmentService.listPage(page, storageAttachmentDTO)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param ids æä»¶idå表 |
| | | * @return å é¤ç»æ |
| | | */ |
| | | @DeleteMapping("/delete") |
| | | public R batchDelete(@RequestBody List<Long> ids) { |
| | | return R.ok(storageAttachmentService.batchDeleteStorageAttachment(ids)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿åéç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param storageBlobs æä»¶ä¿¡æ¯å表 |
| | | * @param recordId 管çè®°å½id |
| | | * @param recordType å
³èè®°å½ç±»å |
| | | * @param fileType æä»¶ç±»å |
| | | */ |
| | | @PostMapping("/add") |
| | | public R add(@RequestBody List<StorageBlobDTO> storageBlobs, Long recordId, String recordType, String fileType) { |
| | | storageAttachmentService.saveStorageAttachment(storageBlobs, recordId, recordType, fileType); |
| | | return R.ok(); |
| | | } |
| | | } |
| | |
| | | private final String type; |
| | | ApplicationTypeEnum(String type) { this.type = type; } |
| | | public String getType() { return type; } |
| | | |
| | | /** |
| | | * æ ¹æ® type å¼è·å对åºçæä¸¾å®ä¾ |
| | | * @param type åºç¨ç±»åå符串 |
| | | * @return 对åºç ApplicationTypeEnum æä¸¾å®ä¾ |
| | | * @throws RuntimeException 妿 type æ æ |
| | | */ |
| | | public static ApplicationTypeEnum getByType(String type) { |
| | | for (ApplicationTypeEnum enumValue : ApplicationTypeEnum.values()) { |
| | | if (enumValue.getType().equals(type)) { |
| | | return enumValue; |
| | | } |
| | | } |
| | | throw new RuntimeException("æ æçåºç¨ç±»å: " + type); |
| | | } |
| | | } |
| | |
| | | PDA_VERSION("pda_version"), |
| | | SALES_LEDGER("sales_ledger"), |
| | | SUPPLIER_MANAGE("supplier_manage"), |
| | | APPROVAL_PROCESS("approval_process"); |
| | | APPROVAL_PROCESS("approval_process"), |
| | | QR_CODE_SCAN_RECORDS("qr_code_scan_records"); |
| | | |
| | | private final String type; |
| | | RecordTypeEnum(String type) { this.type = type; } |
| | | public String getType() { return type; } |
| | | |
| | | /** |
| | | * æ ¹æ® type å¼è·å对åºçæä¸¾å®ä¾ |
| | | * @param type è®°å½ç±»åå符串 |
| | | * @return 对åºç RecordTypeEnum æä¸¾å®ä¾ |
| | | * @throws RuntimeException 妿 type æ æ |
| | | */ |
| | | public static RecordTypeEnum getByType(String type) { |
| | | for (RecordTypeEnum enumValue : RecordTypeEnum.values()) { |
| | | if (enumValue.getType().equals(type)) { |
| | | return enumValue; |
| | | } |
| | | } |
| | | throw new RuntimeException("æ æçè®°å½ç±»å: " + type); |
| | | } |
| | | } |
| | |
| | | package com.ruoyi.basic.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.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageAttachmentVO; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.common.constant.StorageAttachmentConstants; |
| | | import com.ruoyi.common.enums.StorageAttachmentRecordType; |
| | |
| | | |
| | | /** |
| | | * ä¿åéç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param attachments æä»¶ä¿¡æ¯å表 |
| | | * @param storageBlobDTOS æä»¶ä¿¡æ¯å表 |
| | | * @param recordId 管çè®°å½id |
| | | * @param recordType å
³èè®°å½ç±»å |
| | | * @param fileType æä»¶ç±»å |
| | | */ |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType); |
| | | public void saveStorageAttachment(List<StorageBlobDTO> storageBlobDTOS, Long recordId, String recordType, String fileType); |
| | | |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType); |
| | | |
| | | /** |
| | | * å页æ¥è¯¢éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param page å页忰 |
| | | * @param storageAttachmentDTO å
³èè®°å½ä¿¡æ¯ |
| | | * @return åé¡µç»æ |
| | | */ |
| | | public IPage<StorageAttachmentVO> listPage(Page page, StorageAttachmentDTO storageAttachmentDTO); |
| | | |
| | | /** |
| | | * å é¤éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | |
| | | * @return å é¤ç»æ |
| | | */ |
| | | public int deleteStorageAttachment(StorageAttachment storageAttachment); |
| | | |
| | | /** |
| | | * æ¹éå é¤éç¨æä»¶ä¸ä¼ çéä»¶ä¿¡æ¯ |
| | | * @param ids æä»¶idå表 |
| | | * @return å é¤ç»æ |
| | | */ |
| | | public int batchDeleteStorageAttachment(List<Long> ids); |
| | | } |
| | |
| | | package com.ruoyi.basic.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageAttachmentVO; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.StorageAttachmentMapper; |
| | | import com.ruoyi.basic.mapper.StorageBlobMapper; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.service.StorageAttachmentService; |
| | | import com.ruoyi.basic.service.StorageBlobService; |
| | | import com.ruoyi.common.constant.StorageAttachmentConstants; |
| | | import com.ruoyi.common.enums.StorageAttachmentRecordType; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | private final StorageAttachmentMapper storageAttachmentMapper; |
| | | |
| | | private final StorageBlobService storageBlobService; |
| | | |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType) { |
| | | // å 餿§å¾ |
| | | // todo fileChange |
| | | // deleteStorageAttachment(new StorageAttachment(fileType.toString(), (long) recordType.ordinal(), recordId)); |
| | | // for (StorageAttachment attachment : attachments) { |
| | | // // è·åå
³èè®°å½ |
| | | // StorageBlob storageBlob = attachment.getStorageBlobDTO(); |
| | | // attachment.setName(fileType.toString()); |
| | | // attachment.setRecordType((long) recordType.ordinal()); |
| | | // attachment.setRecordId(recordId); |
| | | // attachment.setStorageBlobId(storageBlob.getId()); |
| | | // storageAttachmentMapper.insert(attachment); |
| | | // } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void saveStorageAttachment(List<StorageBlobDTO> storageBlobDTOS, Long recordId, String recordType, String fileType) { |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.getByType(fileType), RecordTypeEnum.getByType(recordType), recordId, storageBlobDTOS); |
| | | } |
| | | |
| | | @Override |
| | | public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType) { |
| | | // å 餿§å¾ |
| | | // deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId)); |
| | | // todo fileChange |
| | | // for (StorageAttachment attachment : attachments) { |
| | | // // è·åå
³èè®°å½ |
| | | // StorageBlob storageBlob = attachment.getStorageBlobDTO(); |
| | | // attachment.setName(fileType); |
| | | // attachment.setRecordType((long) recordType.ordinal()); |
| | | // attachment.setRecordId(recordId); |
| | | // attachment.setStorageBlobId(storageBlob.getId()); |
| | | // storageAttachmentMapper.insert(attachment); |
| | | // } |
| | | |
| | | public IPage<StorageAttachmentVO> listPage(Page page, StorageAttachmentDTO storageAttachmentDTO) { |
| | | return fileUtil.getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(page, storageAttachmentDTO); |
| | | } |
| | | |
| | | @Override |
| | |
| | | // } |
| | | return 0; |
| | | } |
| | | |
| | | @Override |
| | | public int batchDeleteStorageAttachment(List<Long> ids) { |
| | | fileUtil.deleteStorageAttachmentsByStorageAttachmentIds(ids); |
| | | return 1; |
| | | } |
| | | } |
| | |
| | | package com.ruoyi.basic.utils; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageAttachmentVO; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | |
| | | } |
| | | |
| | | /** |
| | | * éè¿è®°å½ç±»åè·åæä»¶ä¿¡æ¯ attachmentï¼åé¡µï¼ |
| | | * |
| | | * @param page å页忰 |
| | | * @param storageAttachmentDTO å
³èè®°å½ä¿¡æ¯ |
| | | */ |
| | | public IPage<StorageAttachmentVO> getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(Page page, StorageAttachmentDTO storageAttachmentDTO) { |
| | | // å页æ¥è¯¢ç¬¦åæ¡ä»¶ç StorageAttachment è®°å½ |
| | | LambdaQueryWrapper<StorageAttachment> queryWrapper = new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, storageAttachmentDTO.getRecordType()) |
| | | .eq(StorageAttachment::getRecordId, storageAttachmentDTO.getRecordId()); |
| | | if (storageAttachmentDTO.getApplication() != null) { |
| | | queryWrapper.eq(StorageAttachment::getApplication, storageAttachmentDTO.getApplication()); |
| | | } |
| | | IPage<StorageAttachmentVO> storageAttachmentIPage = storageAttachmentMapper.selectPage(page, queryWrapper); |
| | | |
| | | // 转æ¢ä¸º StorageAttachmentVO å¹¶è·å对åºç StorageBlobVO |
| | | List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); |
| | | if (CollectionUtils.isNotEmpty(storageAttachmentIPage.getRecords())) { |
| | | for (StorageAttachment storageAttachment : storageAttachmentIPage.getRecords()) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | | storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); |
| | | } |
| | | storageAttachmentVOS.add(storageAttachmentVO); |
| | | } |
| | | } |
| | | |
| | | // æå»ºåé¡µç»æ |
| | | IPage<StorageAttachmentVO> resultPage = new Page<>(); |
| | | BeanUtils.copyProperties(storageAttachmentIPage, resultPage); |
| | | resultPage.setRecords(storageAttachmentVOS); |
| | | |
| | | return resultPage; |
| | | } |
| | | |
| | | /** |
| | | * éè¿æä»¶ç¨éãå
³èè®°å½ç±»åãå
³èè®°å½idè·åæä»¶å
³èä¿¡æ¯ attachment |
| | | * |
| | | * @param application æä»¶ç¨é |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.StorageAttachmentMapper; |
| | | import com.ruoyi.basic.mapper.StorageBlobMapper; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import com.ruoyi.basic.service.StorageAttachmentService; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto; |
| | | import com.ruoyi.inspectiontask.mapper.QrCodeMapper; |
| | |
| | | |
| | | |
| | | private final SysUserMapper sysUserMapper; |
| | | |
| | | private final FileUtil fileUtil; |
| | | |
| | | @Override |
| | | public IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) { |
| | |
| | | } |
| | | |
| | | if (qrCodeScanRecordDto.getStorageBlobVO() != null && !qrCodeScanRecordDto.getStorageBlobVO().isEmpty()) { |
| | | List<StorageAttachment> attachments = new ArrayList<>(); |
| | | // vo 转 dto |
| | | List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>(); |
| | | for (StorageBlobVO storageBlobVO : qrCodeScanRecordDto.getStorageBlobVO()) { |
| | | StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); |
| | | BeanUtils.copyProperties(storageBlobVO, storageBlobDTO); |
| | | storageBlobDTOs.add(storageBlobDTO); |
| | | } |
| | | |
| | | // todo fileChange |
| | | // for (StorageBlobDTO storageBlobDTO : qrCodeScanRecordDto.getStorageBlobDTO()) { |
| | | // StorageAttachment storageAttachment = new StorageAttachment( |
| | | // StorageAttachmentFile, |
| | | // (long) QrCodeScanRecords.ordinal(), |
| | | // qrCodeScanRecord.getId() |
| | | // ); |
| | | // storageAttachment.setStorageBlobDTO(storageBlobDTO); |
| | | // attachments.add(storageAttachment); |
| | | // } |
| | | storageAttachmentService.saveStorageAttachment(attachments, qrCodeScanRecord.getId(), QrCodeScanRecords, StorageAttachmentFile); |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.QR_CODE_SCAN_RECORDS, qrCodeScanRecord.getId(), storageBlobDTOs); |
| | | } |
| | | return i; |
| | | } |
| | |
| | | return AjaxResult.success(stockInRecordService.batchDelete(ids)); |
| | | } |
| | | |
| | | @DeleteMapping("/pending") |
| | | @Log(title = "å
¥åºç®¡ç-å é¤å¾
审æ¹å
¥åº", businessType = BusinessType.DELETE) |
| | | @Operation(summary = "å é¤å¾
审æ¹çå
¥åºè®°å½") |
| | | public AjaxResult deletePending(@RequestBody List<Long> ids) { |
| | | if(CollectionUtils.isEmpty(ids)){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | return AjaxResult.success(stockInRecordService.batchDeletePending(ids)); |
| | | } |
| | | |
| | | @PostMapping("/exportStockInRecord") |
| | | @Operation(summary = "导åºå
¥åºè®°å½") |
| | | public void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto) { |
| | | stockInRecordService.exportStockInRecord(response,stockInRecordDto); |
| | | } |
| | | |
| | | @PostMapping("/approve") |
| | | @Log(title = "å
¥åºç®¡ç-审æ¹å
¥åº", businessType = BusinessType.UPDATE) |
| | | @Operation(summary = "æ¹é审æ¹å
¥åºè®°å½") |
| | | public AjaxResult approve(@RequestBody StockInRecordDto approveDto) { |
| | | if(CollectionUtils.isEmpty(approveDto.getIds())){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | stockInRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus()); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | } |
| | |
| | | return R.ok(stockInventoryService.subtractStockInventory(stockInventoryDto)); |
| | | } |
| | | |
| | | @PostMapping("/addStockInRecordOnly") |
| | | @Operation(summary = "æ°å¢å
¥åºè®°å½ï¼ä»
å建记å½ï¼ä¸è°æ´åºåï¼") |
| | | public R addStockInRecordOnly(@RequestBody StockInventoryDto stockInventoryDto) { |
| | | stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode())); |
| | | stockInventoryDto.setRecordId(0L); |
| | | return R.ok(stockInventoryService.addStockInRecordOnly(stockInventoryDto)); |
| | | } |
| | | |
| | | @PostMapping("/addStockOutRecordOnly") |
| | | @Operation(summary = "æ°å¢åºåºè®°å½ï¼ä»
å建记å½ï¼ä¸è°æ´åºåï¼") |
| | | public R addStockOutRecordOnly(@RequestBody StockInventoryDto stockInventoryDto) { |
| | | stockInventoryDto.setRecordType(String.valueOf(StockOutQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_OUT.getCode())); |
| | | stockInventoryDto.setRecordId(0L); |
| | | return R.ok(stockInventoryService.addStockOutRecordOnly(stockInventoryDto)); |
| | | } |
| | | |
| | | |
| | | @PostMapping("importStockInventory") |
| | | @Operation(summary = "导å
¥åºå") |
| | |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | |
| | | return AjaxResult.success(stockOutRecordService.batchDelete(ids)); |
| | | } |
| | | |
| | | @DeleteMapping("/pending") |
| | | @Log(title = "åºåºç®¡ç-å é¤å¾
审æ¹åºåº", businessType = BusinessType.DELETE) |
| | | @Operation(summary = "å é¤å¾
审æ¹çåºåºè®°å½") |
| | | public AjaxResult deletePending(@RequestBody List<Long> ids) { |
| | | if(CollectionUtils.isEmpty(ids)){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | return AjaxResult.success(stockOutRecordService.batchDeletePending(ids)); |
| | | } |
| | | |
| | | @PostMapping("/exportStockOutRecord") |
| | | @Operation(summary = "导åºåºåºè®°å½") |
| | | public void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto) { |
| | | stockOutRecordService.exportStockOutRecord(response,stockOutRecordDto); |
| | | } |
| | | |
| | | @PostMapping("/approve") |
| | | @Log(title = "åºåºç®¡ç-审æ¹åºåº", businessType = BusinessType.UPDATE) |
| | | @Operation(summary = "æ¹é审æ¹åºåºè®°å½") |
| | | public AjaxResult approve(@RequestBody StockOutRecordDto approveDto) { |
| | | if(CollectionUtils.isEmpty(approveDto.getIds())){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | stockOutRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus()); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | | } |
| | |
| | | return R.ok(stockUninventoryService.subtractStockUninventory(stockUninventoryDto)); |
| | | } |
| | | |
| | | @PostMapping("/addStockInRecordOnly") |
| | | @Operation(summary = "æ°å¢å
¥åºè®°å½ï¼ä»
å建记å½ï¼ä¸è°æ´åºåï¼") |
| | | public R addStockInRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) { |
| | | stockUninventoryDto.setRecordType(String.valueOf(StockInUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode())); |
| | | stockUninventoryDto.setRecordId(0L); |
| | | return R.ok(stockUninventoryService.addStockInRecordOnly(stockUninventoryDto)); |
| | | } |
| | | |
| | | @PostMapping("/addStockOutRecordOnly") |
| | | @Operation(summary = "æ°å¢åºåºè®°å½ï¼ä»
å建记å½ï¼ä¸è°æ´åºåï¼") |
| | | public R addStockOutRecordOnly(@RequestBody StockUninventoryDto stockUninventoryDto) { |
| | | stockUninventoryDto.setRecordType(String.valueOf(StockOutUnQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_OUT.getCode())); |
| | | stockUninventoryDto.setRecordId(0L); |
| | | return R.ok(stockUninventoryService.addStockOutRecordOnly(stockUninventoryDto)); |
| | | } |
| | | |
| | | @PostMapping("/exportStockUninventory") |
| | | @Operation(summary = "导åºåºå") |
| | | public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) { |
| | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | |
| | | @Data |
| | | public class StockInRecordDto extends StockInRecord { |
| | |
| | | @Schema(description = "é¡¶é¨ç¶äº§åid") |
| | | private Long topParentProductId; |
| | | |
| | | @Schema(description = "è®°å½IDå表") |
| | | private List<Long> ids; |
| | | |
| | | } |
| | |
| | | @Schema(description = "ä¸åæ ¼åºåæªå»ç»æ°é") |
| | | private BigDecimal unQualifiedUnLockedQuantity; |
| | | |
| | | @Schema(description = "åæ ¼åºåå¾
å®¡æ ¸åºåºæ°éï¼ä¸å ç¨åºåä½å·²ç³è¯·åºåºï¼") |
| | | private BigDecimal qualifiedPendingOutQuantity; |
| | | |
| | | @Schema(description = "ä¸åæ ¼åºåå¾
å®¡æ ¸åºåºæ°é") |
| | | private BigDecimal unQualifiedPendingOutQuantity; |
| | | |
| | | @Schema(description = "åæ ¼åºåID") |
| | | private Long qualifiedId; |
| | | |
| | |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | |
| | | |
| | | @Schema(description = "é¡¶é¨ç¶äº§åid") |
| | | private Long topParentProductId; |
| | | |
| | | @Schema(description = "è®°å½IDå表") |
| | | private List<Long> ids; |
| | | } |
| | |
| | | List<Map<String, Object>> selectDailyStockOutCounts(@Param("rootCategoryId") Long rootCategoryId, @Param("startDate") String startDate, @Param("endDate") String endDate); |
| | | |
| | | BigDecimal selectTotalByDate(@Param("now") LocalDate now); |
| | | |
| | | BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("type") String type); |
| | | } |
| | |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | |
| | | int updateSubtractStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto); |
| | | |
| | | BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("type") String type); |
| | | |
| | | int updateAddStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto); |
| | | |
| | | List<StockUnInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto); |
| | |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Integer updateUser; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ 0-å¾
å®¡æ¹ 1-éè¿ 2-驳å", implementation = ReviewStatusEnum.class) |
| | | private Integer approvalStatus; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Getter; |
| | | import lombok.Setter; |
| | |
| | | @Schema(description = "ç±»å 0åæ ¼å
¥åº 1ä¸åæ ¼å
¥åº") |
| | | private String type; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ 0-å¾
å®¡æ¹ 1-éè¿ 2-驳å", implementation = ReviewStatusEnum.class) |
| | | private Integer approvalStatus; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | |
| | | int batchDelete(List<Long> ids); |
| | | |
| | | int batchDeletePending(List<Long> ids); |
| | | |
| | | void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto); |
| | | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | } |
| | |
| | | |
| | | Boolean subtractStockInventory(StockInventoryDto stockInventoryDto); |
| | | |
| | | Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto); |
| | | |
| | | Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto); |
| | | |
| | | R importStockInventory(MultipartFile file); |
| | | |
| | | void exportStockInventory(HttpServletResponse response, StockInventoryDto stockInventoryDto); |
| | |
| | | |
| | | int batchDelete(List<Long> ids); |
| | | |
| | | int batchDeletePending(List<Long> ids); |
| | | |
| | | void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto); |
| | | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | } |
| | |
| | | |
| | | Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto); |
| | | |
| | | Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto); |
| | | |
| | | Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto); |
| | | |
| | | void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto); |
| | | |
| | | Boolean frozenStock(StockInventoryDto stockInventoryDto); |
| | |
| | | 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.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import java.util.List; |
| | |
| | | ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class); |
| | | util.exportExcel(response,list, "å
¥åºè®°å½ä¿¡æ¯"); |
| | | } |
| | | |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return stockInventoryMapper.selectOne(eq); |
| | | } |
| | | |
| | | private StockUninventory getStockUninventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockUninventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockUninventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockUninventory::getBatchNo, batchNo); |
| | | } |
| | | return stockUninventoryMapper.selectOne(eq); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchDeletePending(List<Long> ids) { |
| | | for (Long id : ids) { |
| | | StockInRecord stockInRecord = stockInRecordMapper.selectById(id); |
| | | if (stockInRecord == null) { |
| | | throw new BaseException("å
¥åºè®°å½ä¸åå¨,æ æ³å é¤!!!"); |
| | | } |
| | | if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) { |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å é¤,å
¥åºæ¹æ¬¡:" + stockInRecord.getInboundBatches()); |
| | | } |
| | | } |
| | | return stockInRecordMapper.deleteBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new BaseException("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) { |
| | | throw new BaseException("审æ¹ç¶æå¼æ æ"); |
| | | } |
| | | for (Long id : ids) { |
| | | StockInRecord stockInRecord = stockInRecordMapper.selectById(id); |
| | | if (stockInRecord == null) { |
| | | throw new BaseException("å
¥åºè®°å½ä¸åå¨,æ æ³å®¡æ¹!!!"); |
| | | } |
| | | if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) { |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å®¡æ¹,å
¥åºæ¹æ¬¡:" + stockInRecord.getInboundBatches()); |
| | | } |
| | | stockInRecord.setApprovalStatus(approvalStatus); |
| | | stockInRecordMapper.updateById(stockInRecord); |
| | | // 审æ¹éè¿æ¶ï¼åºåå¢å |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) { |
| | | if ("0".equals(stockInRecord.getType())) { |
| | | // åæ ¼å
¥åº -> å
æ¥åºåï¼åå¨åæ´æ°ï¼ä¸åå¨åæ°å¢ |
| | | StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo()); |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockInRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockInRecord.getBatchNo()); |
| | | stockInventoryDto.setQualitity(stockInRecord.getStockInNum()); |
| | | stockInventoryDto.setRemark(stockInRecord.getRemark()); |
| | | if (stockInventory == null) { |
| | | stockInventoryMapper.insert(new StockInventory() {{ |
| | | setProductModelId(stockInRecord.getProductModelId()); |
| | | setQualitity(stockInRecord.getStockInNum()); |
| | | setBatchNo(stockInRecord.getBatchNo()); |
| | | setRemark(stockInRecord.getRemark()); |
| | | setVersion(1); |
| | | }}); |
| | | } else { |
| | | stockInventoryMapper.updateAddStockInventory(stockInventoryDto); |
| | | } |
| | | } else if ("1".equals(stockInRecord.getType())) { |
| | | // ä¸åæ ¼å
¥åº -> å
æ¥åºåï¼åå¨åæ´æ°ï¼ä¸åå¨åæ°å¢ |
| | | StockUninventory stockUninventory = getStockUninventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo()); |
| | | StockUninventoryDto stockUninventoryDto = new StockUninventoryDto(); |
| | | stockUninventoryDto.setProductModelId(stockInRecord.getProductModelId()); |
| | | stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo()); |
| | | stockUninventoryDto.setQualitity(stockInRecord.getStockInNum()); |
| | | stockUninventoryDto.setRemark(stockInRecord.getRemark()); |
| | | if (stockUninventory == null) { |
| | | stockUninventoryMapper.insert(new StockUninventory() {{ |
| | | setProductModelId(stockInRecord.getProductModelId()); |
| | | setQualitity(stockInRecord.getStockInNum()); |
| | | setBatchNo(stockInRecord.getBatchNo()); |
| | | setRemark(stockInRecord.getRemark()); |
| | | setVersion(1); |
| | | }}); |
| | | } else { |
| | | stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return ids.size(); |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.framework.web.domain.R; |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | StockInRecordDto stockInRecordDto = new StockInRecordDto(); |
| | | stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | | stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); |
| | | stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); |
| | | stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("0"); |
| | | stockInRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | stockInRecordService.add(stockInRecordDto); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | } |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(eq); |
| | | if (stockInventory == null) { |
| | | throw new ServiceException("åºåè®°å½ä¸åå¨"); |
| | | } |
| | | BigDecimal lockedQty = stockInventory.getLockedQuantity(); |
| | | if (lockedQty == null) { |
| | | lockedQty = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal pendingOut = stockInventoryMapper.selectPendingOutQuantity( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | "0" |
| | | ); |
| | | if (pendingOut == null) { |
| | | pendingOut = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal availableQty = stockInventory.getQualitity().subtract(lockedQty).subtract(pendingOut); |
| | | if (stockInventoryDto.getQualitity().compareTo(availableQty) > 0) { |
| | | throw new ServiceException("ç³è¯·æ°éè¶
è¿å¯ç¨åºåï¼å½åå¯ç¨åºå为ï¼" + availableQty); |
| | | } |
| | | StockOutRecordDto stockOutRecordDto = new StockOutRecordDto(); |
| | | stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | | stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType()); |
| | | stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity()); |
| | | stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("0"); |
| | | stockOutRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | stockOutRecordService.add(stockOutRecordDto); |
| | | return true; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R importStockInventory(MultipartFile file) { |
| | | try { |
| | | // æ¥è¯¢ææç产åå¹¶æå»ºæ å°ï¼æé«æ¥æ¾æç |
| | |
| | | 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.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | |
| | | import com.ruoyi.stock.service.StockOutRecordService; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import java.util.List; |
| | |
| | | ExcelUtil<StockOutRecordExportData> util = new ExcelUtil<>(StockOutRecordExportData.class); |
| | | util.exportExcel(response,list, "åºåºè®°å½ä¿¡æ¯"); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchDeletePending(List<Long> ids) { |
| | | for (Long id : ids) { |
| | | StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id); |
| | | if (stockOutRecord == null) { |
| | | throw new BaseException("åºåºè®°å½ä¸åå¨,æ æ³å é¤!!!"); |
| | | } |
| | | if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) { |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å é¤,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | } |
| | | return stockOutRecordMapper.deleteBatchIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new BaseException("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | if (approvalStatus == null || (!ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus) && !ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus))) { |
| | | throw new BaseException("审æ¹ç¶æå¼æ æ"); |
| | | } |
| | | for (Long id : ids) { |
| | | StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id); |
| | | if (stockOutRecord == null) { |
| | | throw new BaseException("åºåºè®°å½ä¸åå¨,æ æ³å®¡æ¹!!!"); |
| | | } |
| | | if (stockOutRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockOutRecord.getApprovalStatus())) { |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å®¡æ¹,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | stockOutRecord.setApprovalStatus(approvalStatus); |
| | | stockOutRecordMapper.updateById(stockOutRecord); |
| | | // 审æ¹éè¿æ¶ï¼æ£ååºå |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) { |
| | | if ("0".equals(stockOutRecord.getType())) { |
| | | // åæ ¼åºåº -> å
æ¥åºåæ¯å¦åå¨ï¼å卿æ£å |
| | | StockInventory stockInventory = getStockInventory(stockOutRecord.getProductModelId(), stockOutRecord.getBatchNo()); |
| | | if (stockInventory == null) { |
| | | throw new BaseException("åæ ¼åºåè®°å½ä¸åå¨,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockOutRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockInventoryDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto); |
| | | } else if ("1".equals(stockOutRecord.getType())) { |
| | | // ä¸åæ ¼åºåº -> å
æ¥åºåæ¯å¦åå¨ï¼å卿æ£å |
| | | StockUninventory stockUninventory = getStockUninventory(stockOutRecord.getProductModelId(), stockOutRecord.getBatchNo()); |
| | | if (stockUninventory == null) { |
| | | throw new BaseException("ä¸åæ ¼åºåè®°å½ä¸åå¨,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | StockUninventoryDto stockUninventoryDto = new StockUninventoryDto(); |
| | | stockUninventoryDto.setProductModelId(stockOutRecord.getProductModelId()); |
| | | stockUninventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockUninventoryDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockUninventoryMapper.updateSubtractStockUnInventory(stockUninventoryDto); |
| | | } |
| | | } |
| | | } |
| | | return ids.size(); |
| | | } |
| | | |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return stockInventoryMapper.selectOne(eq); |
| | | } |
| | | |
| | | private StockUninventory getStockUninventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockUninventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockUninventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockUninventory::getBatchNo, batchNo); |
| | | } |
| | | return stockUninventoryMapper.selectOne(eq); |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.exception.base.BaseException; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.stock.dto.StockInRecordDto; |
| | |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType()); |
| | | stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity()); |
| | | stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setType("1"); |
| | | stockOutRecordService.add(stockOutRecordDto); |
| | | StockUninventory oldStockInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId())); |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Integer addStockInRecordOnly(StockUninventoryDto stockUninventoryDto) { |
| | | StockInRecordDto stockInRecordDto = new StockInRecordDto(); |
| | | stockInRecordDto.setRecordId(stockUninventoryDto.getRecordId()); |
| | | stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType()); |
| | | stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity()); |
| | | stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo()); |
| | | stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("1"); |
| | | stockInRecordDto.setRemark(stockUninventoryDto.getRemark()); |
| | | stockInRecordService.add(stockInRecordDto); |
| | | return 1; |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Integer addStockOutRecordOnly(StockUninventoryDto stockUninventoryDto) { |
| | | LambdaQueryWrapper<StockUninventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockUninventoryDto.getBatchNo())) { |
| | | eq.isNull(StockUninventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockUninventory::getBatchNo, stockUninventoryDto.getBatchNo()); |
| | | } |
| | | StockUninventory stockUninventory = stockUninventoryMapper.selectOne(eq); |
| | | if (stockUninventory == null) { |
| | | throw new BaseException("åºåè®°å½ä¸åå¨"); |
| | | } |
| | | BigDecimal lockedQty = stockUninventory.getLockedQuantity(); |
| | | if (lockedQty == null) { |
| | | lockedQty = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal pendingOut = stockUninventoryMapper.selectPendingOutQuantity( |
| | | stockUninventoryDto.getProductModelId(), |
| | | stockUninventoryDto.getBatchNo(), |
| | | "1" |
| | | ); |
| | | if (pendingOut == null) { |
| | | pendingOut = BigDecimal.ZERO; |
| | | } |
| | | BigDecimal availableQty = stockUninventory.getQualitity().subtract(lockedQty).subtract(pendingOut); |
| | | if (stockUninventoryDto.getQualitity().compareTo(availableQty) > 0) { |
| | | throw new BaseException("ç³è¯·æ°éè¶
è¿å¯ç¨åºåï¼å½åå¯ç¨åºå为ï¼" + availableQty); |
| | | } |
| | | StockOutRecordDto stockOutRecordDto = new StockOutRecordDto(); |
| | | stockOutRecordDto.setRecordId(stockUninventoryDto.getRecordId()); |
| | | stockOutRecordDto.setRecordType(stockUninventoryDto.getRecordType()); |
| | | stockOutRecordDto.setStockOutNum(stockUninventoryDto.getQualitity()); |
| | | stockOutRecordDto.setBatchNo(stockUninventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setProductModelId(stockUninventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("1"); |
| | | stockOutRecordDto.setRemark(stockUninventoryDto.getRemark()); |
| | | stockOutRecordService.add(stockOutRecordDto); |
| | | return 1; |
| | | } |
| | | |
| | | @Override |
| | | public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) { |
| | | List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto); |
| | | ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class); |
| | |
| | | SUM(unQualifiedQuantity) as unQualifiedQuantity, |
| | | SUM(qualifiedLockedQuantity) as qualifiedLockedQuantity, |
| | | SUM(unQualifiedLockedQuantity) as unQualifiedLockedQuantity, |
| | | SUM(qualifiedQuantity - qualifiedLockedQuantity) as qualifiedUnLockedQuantity, |
| | | SUM(unQualifiedQuantity - unQualifiedLockedQuantity) as unQualifiedUnLockedQuantity, |
| | | SUM(qualifiedQuantity - qualifiedLockedQuantity - IFNULL(qualifiedPendingOut, 0)) as qualifiedUnLockedQuantity, |
| | | SUM(unQualifiedQuantity - unQualifiedLockedQuantity - IFNULL(unQualifiedPendingOut, 0)) as unQualifiedUnLockedQuantity, |
| | | SUM(IFNULL(qualifiedPendingOut, 0)) as qualifiedPendingOutQuantity, |
| | | SUM(IFNULL(unQualifiedPendingOut, 0)) as unQualifiedPendingOutQuantity, |
| | | product_model_id, |
| | | MAX(create_time) as create_time, |
| | | MAX(update_time) as update_time, |
| | |
| | | si.remark, |
| | | pm.unit, |
| | | p.product_name, |
| | | p.id as product_id |
| | | p.id as product_id, |
| | | ( |
| | | select IFNULL(SUM(sor.stock_out_num), 0) |
| | | from stock_out_record sor |
| | | where sor.product_model_id = si.product_model_id |
| | | and (si.batch_no is null and sor.batch_no is null or si.batch_no = sor.batch_no) |
| | | and sor.type = '0' |
| | | and sor.approval_status = 0 |
| | | ) as qualifiedPendingOut, |
| | | 0 as unqualifiedPendingOut |
| | | from stock_inventory si |
| | | left join product_model pm on si.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | |
| | | su.remark, |
| | | pm.unit, |
| | | p.product_name, |
| | | p.id as product_id |
| | | p.id as product_id, |
| | | 0 as qualifiedPendingOut, |
| | | ( |
| | | select IFNULL(SUM(sor.stock_out_num), 0) |
| | | from stock_out_record sor |
| | | where sor.product_model_id = su.product_model_id |
| | | and (su.batch_no is null and sor.batch_no is null or su.batch_no = sor.batch_no) |
| | | and sor.type = '1' |
| | | and sor.approval_status = 0 |
| | | ) as unqualifiedPendingOut |
| | | from stock_uninventory su |
| | | left join product_model pm on su.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | |
| | | ORDER BY DATE(sor.create_time) ASC |
| | | </select> |
| | | |
| | | <select id="selectPendingOutQuantity" resultType="java.math.BigDecimal"> |
| | | SELECT IFNULL(SUM(sor.stock_out_num), 0) |
| | | FROM stock_out_record sor |
| | | WHERE sor.product_model_id = #{productModelId} |
| | | AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL)) |
| | | AND sor.type = #{type} |
| | | AND sor.approval_status = 0 |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | </if> |
| | | </select> |
| | | |
| | | <select id="selectPendingOutQuantity" resultType="java.math.BigDecimal"> |
| | | SELECT IFNULL(SUM(sor.stock_out_num), 0) |
| | | FROM stock_out_record sor |
| | | WHERE sor.product_model_id = #{productModelId} |
| | | AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL)) |
| | | AND sor.type = #{type} |
| | | AND sor.approval_status = 0 |
| | | </select> |
| | | |
| | | </mapper> |