doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -159,5 +159,12 @@ ALTER TABLE `product-inventory-management-hbtmblc`.`device_ledger` ADD COLUMN `product_process_id` bigint NULL COMMENT 'å·¥åºID' AFTER `type`; ALTER TABLE `maintenance_task` ADD COLUMN `maintenance_location` VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设å¤ä¿å »ä½ç½®'; ALTER TABLE `device_maintenance` ADD COLUMN `maintenance_location` VARCHAR ( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '设å¤ä¿å »ä½ç½®'; ALTER TABLE `quality_inspect` ADD COLUMN `approval_status` bigint DEFAULT '1' COMMENT 'å ¥åºå®¡æ¹ç¶æï¼1-å¾ å®¡æ ¸ï¼2-审æ¹ä¸ï¼3-审æ¹éè¿ï¼4-审æ¹å¤±è´¥' AFTER `inspect_state`, ADD COLUMN `approve_user_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'å ¥åºå®¡æ¹äººidï¼éå·åé' AFTER `approval_status`; src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -31,6 +31,8 @@ import com.ruoyi.sales.pojo.SalesQuotation; import com.ruoyi.sales.pojo.ShippingInfo; import com.ruoyi.sales.service.ShippingInfoService; import com.ruoyi.sales.service.ISalesLedgerService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.sales.service.impl.CommonFileServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -91,6 +93,12 @@ @Autowired @Lazy private ShippingInfoService shippingInfoService; @Autowired @Lazy private ISalesLedgerService salesLedgerService; @Autowired @Lazy private IQualityInspectService qualityInspectService; public ApproveProcess getApproveById(String id) { @@ -280,6 +288,104 @@ } } // éå®è®¢åæåå ¥åºå®¡æ¹ if (approveProcess.getApproveType().equals(9)) { String reason = approveProcess.getApproveReason(); // é宿 ¼å¼ï¼å ¥åºå®¡æ¹:ååå·:salesLedgerId:productId1,productId2 // è´¨æ£æ ¼å¼ï¼åææè´¨æ£å ¥åºå®¡æ¹:inspectId:purchaseLedgerId if (org.springframework.util.StringUtils.hasText(reason)) { if (reason.startsWith("åææè´¨æ£å ¥åºå®¡æ¹:")) { Integer inspectId = null; String remark = approveProcess.getApproveRemark(); // æ°é»è¾ï¼ä¸å¡åæ°æ¾å¨ approveRemark if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith("qualityQualifiedInbound:")) { String[] split = remark.split(":"); if (split.length >= 2) { inspectId = Integer.valueOf(split[1]); } } if (inspectId == null) { String[] split = reason.split(":"); if (split.length >= 2) { inspectId = Integer.valueOf(split[1]); } } if (inspectId != null) { if (status.equals(2)) { qualityInspectService.executeQualifiedInboundApproval(inspectId); } else if (status.equals(3)) { qualityInspectService.markQualifiedInboundApprovalStatus(inspectId, 4); } else if (status.equals(1)) { qualityInspectService.markQualifiedInboundApprovalStatus(inspectId, 2); } } // è´¨æ£å®¡æ¹ä¸éè¦ç»§ç»èµ°éå®è®¢åå ¥åº return; } if (reason.startsWith("é宿«ç ä¸åæ ¼å ¥åºå®¡æ¹:") || reason.startsWith("é宿«ç åæ ¼å ¥åºå®¡æ¹:")) { String remark = approveProcess.getApproveRemark(); boolean qualified = reason.startsWith("é宿«ç åæ ¼å ¥åºå®¡æ¹:"); String prefix = qualified ? "scanQualified:" : "scanUnqualified:"; if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith(prefix)) { String[] split = remark.split(":"); if (split.length >= 3) { Long salesLedgerId = Long.valueOf(split[1]); java.util.Map<Long, BigDecimal> inboundQtyByLineId = Arrays.stream(split[2].split(",")) .filter(org.springframework.util.StringUtils::hasText) .map(s -> s.split("@")) .filter(arr -> arr.length == 2) .collect(java.util.stream.Collectors.toMap( arr -> Long.valueOf(arr[0]), arr -> new BigDecimal(arr[1]), BigDecimal::add, java.util.LinkedHashMap::new)); if (status.equals(2)) { if (qualified) { salesLedgerService.executeSalesScanInboundApproved(salesLedgerId, inboundQtyByLineId); } else { salesLedgerService.executeSalesScanInboundUnqualifiedApproved(salesLedgerId, inboundQtyByLineId); } } } } return; } String[] split = reason.split(":"); Long salesLedgerId = null; List<Long> productIds = null; // å ¥åºå®¡æ¹çç±åªå±ç¤ºååå· åæ°æ¾å¨ approveRemark if (reason.startsWith("å ¥åºå®¡æ¹:")) { String remark = approveProcess.getApproveRemark(); if (org.springframework.util.StringUtils.hasText(remark) && remark.startsWith("salesStock:")) { String[] r = remark.split(":"); if (r.length >= 3) { salesLedgerId = Long.valueOf(r[1]); productIds = Arrays.stream(r[2].split(",")) .filter(org.springframework.util.StringUtils::hasText) .map(Long::valueOf) .collect(java.util.stream.Collectors.toList()); } } } // å ¥åºå®¡æ¹:ååå·:salesLedgerId:productId1,productId2 if (salesLedgerId == null && split.length >= 4) { salesLedgerId = Long.valueOf(split[2]); productIds = Arrays.stream(split[3].split(",")) .filter(org.springframework.util.StringUtils::hasText) .map(Long::valueOf) .collect(java.util.stream.Collectors.toList()); } if (salesLedgerId != null && productIds != null) { if (status.equals(2)) { // 审æ¹éè¿æ§è¡å ¥åº salesLedgerService.executeSalesStockApproved(salesLedgerId, productIds); } } } } // ç»å®éä»¶ if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){ tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue()); @@ -371,6 +477,8 @@ return "å货审æ¹"; case 8: return "å±é©ä½ä¸å®¡æ¹"; case 9: return "å ¥åºå®¡æ¹"; } return null; } src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -112,6 +112,7 @@ approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(","))); approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime())); approveProcess.setApproveReason(approveProcessVO.getApproveReason()); approveProcess.setApproveRemark(approveProcessVO.getApproveRemark()); approveProcess.setDeviceRepairId(approveProcessVO.getDeviceRepairId()); approveProcess.setMaintenancePrice(approveProcessVO.getMaintenancePrice()); approveProcess.setPrice(approveProcessVO.getPrice()); @@ -455,6 +456,8 @@ return "å货审æ¹"; case 8: return "å±é©ä½ä¸å®¡æ¹"; case 9: return "å ¥åºå®¡æ¹"; } return null; } src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -47,6 +47,11 @@ */ private String approveReason; /** * 审æ¹å¤æ³¨ */ private String approveRemark; @Excel(name = "å¼å§æ¶é´", dateFormat = "yyyy-MM-dd",width = 30) @JsonFormat(pattern = "yyyy-MM-dd") @ApiModelProperty(value = "å¼å§æ¶é´") src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java
@@ -22,7 +22,8 @@ REIMBURSEMENT(4, "æ¥é管ç"), PURCHASE(5, "éè´å®¡æ¹"), QUOTATION(6, "æ¥ä»·å®¡æ¹"), DELIVERY(7, "å货审æ¹"); DELIVERY(7, "å货审æ¹"), STOCK_IN(9, "å ¥åºå®¡æ¹"); private final Integer code; private final String name; src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -23,6 +23,9 @@ @ApiModelProperty("è§æ ¼åå·") private String deviceModel; @ApiModelProperty("设å¤ä¿å »ä½ç½®") private String maintenanceLocation; @ApiModelProperty("计åä¿å »æ¥æ") private String maintenancePlanTimeReq; src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -84,4 +84,7 @@ @ApiModelProperty("ç§æ·id") @TableField(fill = FieldFill.INSERT) private Long tenantId; @ApiModelProperty("设å¤ä¿å »ä½ç½®") private String maintenanceLocation; } src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -106,7 +106,4 @@ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT) private Long tenantId; @ApiModelProperty("设å¤ä¿å »ä½ç½®") private String maintenanceLocation; } src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -47,9 +47,6 @@ if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) { queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName()); } if (StringUtils.isNotEmpty(maintenanceTask.getMaintenanceLocation())) { queryWrapper.like(MaintenanceTask::getMaintenanceLocation, maintenanceTask.getMaintenanceLocation()); } if (StringUtils.isNotEmpty(maintenanceTask.getStatus())) { queryWrapper.eq(MaintenanceTask::getStatus, maintenanceTask.getStatus()); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -219,6 +219,12 @@ if (purchaseLedger.getId() == null) { purchaseLedgerMapper.insert(purchaseLedger); } else { PurchaseLedger dbLedger = purchaseLedgerMapper.selectById(purchaseLedger.getId()); if (dbLedger != null && Objects.equals(dbLedger.getApprovalStatus(), 3) && Objects.equals(dbLedger.getStockStatus(), 2)) { throw new ServiceException("该éè´è®¢å已审æ¹éè¿ä¸å·²å ¨é¨å ¥åºï¼ä¸è½å次åèµ·å ¥åºå®¡æ¹ï¼å¦ééæè¯·å 走审æ¹ä¸éè¿æµç¨"); } // å é¤éè´å®¡æ ¸ï¼éæ°æäº¤ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, 5) @@ -856,6 +862,11 @@ } public void addApproveByPurchase(LoginUser loginUser, PurchaseLedger purchaseLedger) throws Exception { if (purchaseLedger != null && Objects.equals(purchaseLedger.getApprovalStatus(), 3) && Objects.equals(purchaseLedger.getStockStatus(), 2)) { throw new ServiceException("该éè´è®¢åå ¥åºæ°é已满足ï¼ä¸è½éå¤å起审æ¹"); } ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(5); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -151,6 +151,12 @@ @ApiModelProperty("å ³èæ£æµæ å主表id") private Long testStandardId; @ApiModelProperty("å ¥åºå®¡æ¹ç¶æï¼1-å¾ å®¡æ ¸ï¼2-审æ¹ä¸ï¼3-审æ¹éè¿ï¼4-审æ¹å¤±è´¥") private Integer approvalStatus; @ApiModelProperty("å ¥åºå®¡æ¹äººid") private String approveUserIds; @TableField(exist = false) private String workOrderNo; src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -15,7 +15,7 @@ int updateQualityInspect(QualityInspectDto qualityInspectDto); IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect); IPage<QualityInspect> qualityInspectListPage(Page<?> page, QualityInspect qualityInspect); void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect); @@ -24,4 +24,8 @@ int submit(QualityInspect qualityInspect); void down(HttpServletResponse response, QualityInspect qualityInspect); void executeQualifiedInboundApproval(Integer inspectId); void markQualifiedInboundApprovalStatus(Integer inspectId, Integer approvalStatus); } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -11,7 +11,12 @@ import com.deepoove.poi.config.Configure; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.common.enums.ApproveTypeEnum; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.quality.dto.QualityInspectDto; @@ -27,6 +32,7 @@ import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.framework.security.LoginUser; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -61,6 +67,7 @@ private PurchaseLedgerMapper purchaseLedgerMapper; private ProcurementRecordService procurementRecordService; private IApproveProcessService approveProcessService; @Override public int add(QualityInspectDto qualityInspectDto) { @@ -104,15 +111,111 @@ qualityUnqualified.setInspectId(qualityInspect.getId()); qualityUnqualifiedMapper.insert(qualityUnqualified); } else { //åæ ¼ç´æ¥å ¥åº stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); // éè´åæææ£éªï¼åæ ¼å ¥åºå忥å°éè´äº§åâå·²å ¥åºæ°éâï¼ä¸æ«ç å ¥åºå ±ç¨ä¸ä»½æ°æ®å£å¾ syncQualifiedInboundToPurchaseProducts(qualityInspect); // åæææ£éªåæ ¼åï¼å åèµ·âå ¥åºå®¡æ¹âï¼å®¡æ¹éè¿ååå ¥åº if (Objects.equals(qualityInspect.getInspectType(), 0)) { submitQualifiedInboundApprove(qualityInspect); } else { // ç´æ¥å ¥åº stockUtils.addStock( qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(), null, qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId() ); syncQualifiedInboundToPurchaseProducts(qualityInspect); } } qualityInspect.setInspectState(1);//å·²æäº¤ int updated = qualityInspectMapper.updateById(qualityInspect); refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId()); return updated; } private void submitQualifiedInboundApprove(QualityInspect qualityInspect) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(qualityInspect.getPurchaseLedgerId()); if (purchaseLedger == null) { throw new RuntimeException("æäº¤å¤±è´¥ï¼éè´å°è´¦ä¸åå¨"); } String approveUserIds = ObjectUtils.isNotEmpty(qualityInspect.getApproveUserIds()) ? qualityInspect.getApproveUserIds() : purchaseLedger.getApproveUserIds(); if (ObjectUtils.isEmpty(approveUserIds)) { throw new RuntimeException("æäº¤å¤±è´¥ï¼è¯·å ç»´æ¤è´¨æ£å审æ¹äººï¼æéè´å°è´¦å®¡æ¹äººï¼"); } String approveReason = "åææè´¨æ£å ¥åºå®¡æ¹:" + purchaseLedger.getPurchaseContractNumber(); String approveRemark = "qualityQualifiedInbound:" + qualityInspect.getId() + ":" + purchaseLedger.getId(); ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode()) .eq(ApproveProcess::getApproveRemark, approveRemark) .eq(ApproveProcess::getApproveDelete, 0) .orderByDesc(ApproveProcess::getCreateTime) .last("limit 1")); if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) { throw new RuntimeException("æäº¤å¤±è´¥ï¼è¯¥è´¨æ£åå·²åèµ·å ¥åºå®¡æ¹ï¼å®¡æ¹å®æåä¸è½éå¤æäº¤"); } LoginUser loginUser = SecurityUtils.getLoginUser(); ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(approveReason); approveProcessVO.setApproveRemark(approveRemark); approveProcessVO.setApproveUserIds(approveUserIds); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(java.time.LocalDate.now().toString()); try { approveProcessService.addApprove(approveProcessVO); } catch (Exception e) { throw new RuntimeException("æäº¤å¤±è´¥ï¼å ¥åºå®¡æ¹åèµ·å¼å¸¸:" + e.getMessage()); } qualityInspect.setApprovalStatus(2); qualityInspect.setApproveUserIds(approveUserIds); qualityInspectMapper.updateById(qualityInspect); } @Override public void executeQualifiedInboundApproval(Integer inspectId) { if (inspectId == null) { throw new RuntimeException("审æ¹å¤±è´¥ï¼è´¨æ£åIDä¸è½ä¸ºç©º"); } QualityInspect qualityInspect = qualityInspectMapper.selectById(inspectId); if (qualityInspect == null) { throw new RuntimeException("审æ¹å¤±è´¥ï¼è´¨æ£åä¸åå¨"); } if (!Objects.equals(qualityInspect.getInspectType(), 0)) { throw new RuntimeException("审æ¹å¤±è´¥ï¼ä» åæææ£éªæ¯æå ¥åºå®¡æ¹"); } if (!Objects.equals(qualityInspect.getInspectState(), 1) || !"åæ ¼".equals(qualityInspect.getCheckResult())) { throw new RuntimeException("审æ¹å¤±è´¥ï¼å½åè´¨æ£åç¶æä¸å è®¸å ¥åº"); } stockUtils.addStock( qualityInspect.getPurchaseLedgerId() == null ? null : qualityInspect.getPurchaseLedgerId().longValue(), null, qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId() ); syncQualifiedInboundToPurchaseProducts(qualityInspect); refreshPurchaseLedgerStockStatusByInspect(qualityInspect.getPurchaseLedgerId()); qualityInspect.setApprovalStatus(3); qualityInspectMapper.updateById(qualityInspect); } @Override public void markQualifiedInboundApprovalStatus(Integer inspectId, Integer approvalStatus) { if (inspectId == null || approvalStatus == null) { return; } QualityInspect qualityInspect = qualityInspectMapper.selectById(inspectId); if (qualityInspect == null) { return; } qualityInspect.setApprovalStatus(approvalStatus); qualityInspectMapper.updateById(qualityInspect); } /*çææ£éªæ¥å*/ @@ -182,7 +285,7 @@ } @Override public IPage<QualityInspect> qualityInspectListPage(Page page, QualityInspect qualityInspect) { public IPage<QualityInspect> qualityInspectListPage(Page<?> page, QualityInspect qualityInspect) { return qualityInspectMapper.qualityInspectListPage(page, qualityInspect); } src/main/java/com/ruoyi/sales/dto/SalesProductStockDto.java
@@ -25,4 +25,7 @@ @ApiModelProperty("éå®è®¢å产åId") private List<Long> salesLedgerProducts; @ApiModelProperty("审æ¹äººIDï¼éå·åé") private String approveUserIds; } src/main/java/com/ruoyi/sales/dto/SalesScanInboundDto.java
@@ -20,4 +20,7 @@ @ApiModelProperty("éå®äº§åè¡æ°æ®") private List<SalesLedgerProduct> salesLedgerProductList; @ApiModelProperty("审æ¹äººIDï¼éå·åé") private String approveUserIds; } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -15,6 +15,7 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.List; import java.util.Map; /** * éå®å°è´¦Serviceæ¥å£ @@ -68,6 +69,12 @@ void salesStock(SalesProductStockDto dto); void executeSalesStockApproved(Long salesLedgerId, List<Long> salesLedgerProductIds); void executeSalesScanInboundApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId); void executeSalesScanInboundUnqualifiedApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId); List<Customer> shippedCustomers(); void scanInbound(SalesScanInboundDto dto); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,6 +9,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.service.AccountIncomeService; import com.ruoyi.approve.service.IApproveProcessService; import com.ruoyi.approve.vo.ApproveProcessVO; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.common.enums.ApproveTypeEnum; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.mapper.ProductMapper; import com.ruoyi.basic.mapper.ProductModelMapper; @@ -103,6 +107,9 @@ private static final String LOCK_PREFIX = "contract_no_lock:"; private static final long LOCK_WAIT_TIMEOUT = 10; // éçå¾ è¶ æ¶æ¶é´ï¼ç§ï¼ private static final long LOCK_EXPIRE_TIME = 30; // éèªå¨è¿ææ¶é´ï¼ç§ï¼ private static final int INBOUND_BIZ_TYPE_WEB = 1; private static final int INBOUND_BIZ_TYPE_SCAN_QUALIFIED = 2; private static final int INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED = 3; private final AccountIncomeService accountIncomeService; private final SalesLedgerMapper salesLedgerMapper; private final CustomerMapper customerMapper; @@ -144,6 +151,8 @@ private final StockInRecordService stockInRecordService; private final StockOutRecordService stockOutRecordService; private final StockUtils stockUtils; @Autowired private IApproveProcessService approveProcessService; @Autowired private SysDeptMapper sysDeptMapper; @@ -1857,6 +1866,9 @@ if (ledger.getStockStatus() == null) { throw new ServiceException("å ¥åºå¤±è´¥,éå®è®¢åå ¥åºç¶æå¼å¸¸"); } if (ledger.getStockStatus() == 3) { throw new ServiceException("å ¥åºå¤±è´¥,该éå®è®¢åæ£å¨å ¥åºå®¡æ¹ä¸,请å¿éå¤æäº¤"); } if (ledger.getStockStatus() == 2) { throw new ServiceException("å ¥åºå¤±è´¥,该éå®è®¢åå·²å ¥åº,请å¿éå¤å ¥åº"); } @@ -1869,6 +1881,42 @@ if (salesLedgerProducts == null || salesLedgerProducts.isEmpty()) { throw new ServiceException("å ¥åºå¤±è´¥,æªæ¥è¯¢å°è¯¥éå®è®¢åçéå®äº§å"); } String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), ledger.getId(), INBOUND_BIZ_TYPE_WEB); if (StringUtils.isEmpty(approveUserIds)) { throw new ServiceException("å ¥åºå¤±è´¥,è¯·éæ©å®¡æ¹äºº"); } String productIds = products.stream().map(String::valueOf).collect(Collectors.joining(",")); LoginUser loginUser = SecurityUtils.getLoginUser(); ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason("å ¥åºå®¡æ¹:" + ledger.getSalesContractNo()); approveProcessVO.setApproveRemark("salesStock:" + ledger.getId() + ":" + productIds); approveProcessVO.setApproveUserIds(approveUserIds); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); try { approveProcessService.addApprove(approveProcessVO); } catch (Exception e) { throw new ServiceException("å ¥åºå®¡æ¹å起失败:" + e.getMessage()); } // 审æ¹ä¸ ledger.setStockStatus(3); baseMapper.updateById(ledger); } @Override public void executeSalesStockApproved(Long salesLedgerId, List<Long> products) { SalesProductStockDto dto = new SalesProductStockDto(); dto.setSalesLedgerId(salesLedgerId); dto.setSalesLedgerProducts(products); SalesLedger ledger = baseMapper.selectById(dto.getSalesLedgerId()); if (ledger == null) { throw new ServiceException("å ¥åºå¤±è´¥,éå®è®¢åä¸åå¨"); } List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery().in(SalesLedgerProduct::getId, products)); for (SalesLedgerProduct product : salesLedgerProducts) { if (!Objects.equals(product.getSalesLedgerId(), ledger.getId())) { throw new ServiceException("å ¥åºå¤±è´¥,åå¨ä¸å±äºå½åéå®è®¢åç产å"); @@ -1978,11 +2026,71 @@ } inboundQtyByLineId.merge(inbound.getId(), inboundQty, BigDecimal::add); } List<SalesLedgerProduct> selectedProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery() .in(SalesLedgerProduct::getId, inboundQtyByLineId.keySet())); if (CollectionUtils.isEmpty(selectedProducts)) { throw new ServiceException("å ¥åºå¤±è´¥,æªæ¥è¯¢å°å ¥åºäº§å"); } if (selectedProducts.size() != inboundQtyByLineId.size()) { throw new ServiceException("å ¥åºå¤±è´¥,é¨å产åä¸åå¨"); } for (SalesLedgerProduct selectedProduct : selectedProducts) { if (!Objects.equals(selectedProduct.getSalesLedgerId(), salesLedger.getId())) { throw new ServiceException("å ¥åºå¤±è´¥,éå®äº§åä¸è®¢åä¸å¹é "); } if (!Objects.equals(selectedProduct.getType(), SaleEnum.SALE.getCode())) { throw new ServiceException("å ¥åºå¤±è´¥,ä» æ¯æéå®è®¢å产åè¡"); } if (selectedProduct.getProductModelId() == null) { throw new ServiceException("å ¥åºå¤±è´¥,产åè§æ ¼æªç»´æ¤,æ æ³å ¥åº"); } } String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), salesLedger.getId(), INBOUND_BIZ_TYPE_SCAN_QUALIFIED); if (StringUtils.isEmpty(approveUserIds)) { throw new ServiceException("å ¥åºå¤±è´¥,è¯·éæ©å®¡æ¹äºº"); } String lines = inboundQtyByLineId.entrySet().stream() .map(e -> e.getKey() + "@" + e.getValue().stripTrailingZeros().toPlainString()) .collect(Collectors.joining(",")); String reason = "é宿«ç åæ ¼å ¥åºå®¡æ¹:" + salesLedger.getSalesContractNo(); String remark = "scanQualified:" + salesLedger.getId() + ":" + lines; ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode()) .eq(ApproveProcess::getApproveRemark, remark) .eq(ApproveProcess::getApproveDelete, 0) .orderByDesc(ApproveProcess::getCreateTime) .last("limit 1")); if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) { throw new ServiceException("å ¥åºå¤±è´¥,该ç³è¯·å·²æäº¤å®¡æ¹"); } LoginUser loginUser = SecurityUtils.getLoginUser(); ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(reason); approveProcessVO.setApproveRemark(remark); approveProcessVO.setApproveUserIds(approveUserIds); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); try { approveProcessService.addApprove(approveProcessVO); } catch (Exception e) { throw new ServiceException("å ¥åºå®¡æ¹å起失败:" + e.getMessage()); } } @Override @Transactional(rollbackFor = Exception.class) public void executeSalesScanInboundApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId) { SalesLedger salesLedger = baseMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new ServiceException("å ¥åºå¤±è´¥,éå®è®¢åä¸åå¨"); } Long ledgerId = salesLedger.getId(); for (Map.Entry<Long, BigDecimal> entry : inboundQtyByLineId.entrySet()) { Long salesLedgerProductId = entry.getKey(); BigDecimal inboundThisLine = entry.getValue(); if (inboundThisLine.compareTo(BigDecimal.ZERO) == 0) { if (inboundThisLine == null || inboundThisLine.compareTo(BigDecimal.ZERO) <= 0) { continue; } SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectById(salesLedgerProductId); @@ -2065,11 +2173,71 @@ } inboundQtyByLineId.merge(inbound.getId(), inboundQty, BigDecimal::add); } List<SalesLedgerProduct> selectedProducts = salesLedgerProductMapper.selectList(Wrappers.<SalesLedgerProduct>lambdaQuery() .in(SalesLedgerProduct::getId, inboundQtyByLineId.keySet())); if (CollectionUtils.isEmpty(selectedProducts)) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,æªæ¥è¯¢å°å ¥åºäº§å"); } if (selectedProducts.size() != inboundQtyByLineId.size()) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,é¨å产åä¸åå¨"); } for (SalesLedgerProduct selectedProduct : selectedProducts) { if (!Objects.equals(selectedProduct.getSalesLedgerId(), salesLedger.getId())) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,éå®äº§åä¸è®¢åä¸å¹é "); } if (!Objects.equals(selectedProduct.getType(), SaleEnum.SALE.getCode())) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,ä» æ¯æéå®è®¢å产åè¡"); } if (selectedProduct.getProductModelId() == null) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,产åè§æ ¼æªç»´æ¤,æ æ³å ¥åº"); } } String approveUserIds = resolveApproveUserIds(dto.getApproveUserIds(), salesLedger.getId(), INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED); if (StringUtils.isEmpty(approveUserIds)) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,è¯·éæ©å®¡æ¹äºº"); } String lines = inboundQtyByLineId.entrySet().stream() .map(e -> e.getKey() + "@" + e.getValue().stripTrailingZeros().toPlainString()) .collect(Collectors.joining(",")); String reason = "é宿«ç ä¸åæ ¼å ¥åºå®¡æ¹:" + salesLedger.getSalesContractNo(); String remark = "scanUnqualified:" + salesLedger.getId() + ":" + lines; ApproveProcess exist = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode()) .eq(ApproveProcess::getApproveRemark, remark) .eq(ApproveProcess::getApproveDelete, 0) .orderByDesc(ApproveProcess::getCreateTime) .last("limit 1")); if (exist != null && !Objects.equals(exist.getApproveStatus(), 3)) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,该ç³è¯·å·²æäº¤å®¡æ¹"); } LoginUser loginUser = SecurityUtils.getLoginUser(); ApproveProcessVO approveProcessVO = new ApproveProcessVO(); approveProcessVO.setApproveType(ApproveTypeEnum.STOCK_IN.getCode()); approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId()); approveProcessVO.setApproveReason(reason); approveProcessVO.setApproveRemark(remark); approveProcessVO.setApproveUserIds(approveUserIds); approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); try { approveProcessService.addApprove(approveProcessVO); } catch (Exception e) { throw new ServiceException("ä¸åæ ¼å ¥åºå®¡æ¹å起失败:" + e.getMessage()); } } @Override @Transactional(rollbackFor = Exception.class) public void executeSalesScanInboundUnqualifiedApproved(Long salesLedgerId, Map<Long, BigDecimal> inboundQtyByLineId) { SalesLedger salesLedger = baseMapper.selectById(salesLedgerId); if (salesLedger == null) { throw new ServiceException("ä¸åæ ¼å ¥åºå¤±è´¥,éå®è®¢åä¸åå¨"); } Long ledgerId = salesLedger.getId(); for (Map.Entry<Long, BigDecimal> entry : inboundQtyByLineId.entrySet()) { Long salesLedgerProductId = entry.getKey(); BigDecimal inboundThisLine = entry.getValue(); if (inboundThisLine.compareTo(BigDecimal.ZERO) == 0) { if (inboundThisLine == null || inboundThisLine.compareTo(BigDecimal.ZERO) <= 0) { continue; } SalesLedgerProduct dbProduct = salesLedgerProductMapper.selectById(salesLedgerProductId); @@ -2087,7 +2255,6 @@ } stockUtils.addUnStock(ledgerId, dbProduct.getId(), dbProduct.getProductModelId(), inboundThisLine, StockInUnQualifiedRecordTypeEnum.SALES_SCAN_UNSTOCK_IN.getCode(), dbProduct.getId()); BigDecimal oldUnStocked = dbProduct.getUnqualifiedStockedQuantity() == null ? BigDecimal.ZERO : dbProduct.getUnqualifiedStockedQuantity(); dbProduct.setUnqualifiedStockedQuantity(oldUnStocked.add(inboundThisLine)); dbProduct.fillRemainingQuantity(); @@ -2095,6 +2262,31 @@ } } private String resolveApproveUserIds(String approveUserIds, Long salesLedgerId, Integer bizType) { if (StringUtils.isNotEmpty(approveUserIds)) { return approveUserIds; } LambdaQueryWrapper<ApproveProcess> wrapper = new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, ApproveTypeEnum.STOCK_IN.getCode()) .eq(ApproveProcess::getApproveDelete, 0) .orderByDesc(ApproveProcess::getCreateTime) .last("limit 1"); if (Objects.equals(bizType, INBOUND_BIZ_TYPE_WEB)) { wrapper.likeRight(ApproveProcess::getApproveReason, "å ¥åºå®¡æ¹:") .likeRight(ApproveProcess::getApproveRemark, "salesStock:" + salesLedgerId + ":"); } else if (Objects.equals(bizType, INBOUND_BIZ_TYPE_SCAN_QUALIFIED)) { wrapper.likeRight(ApproveProcess::getApproveReason, "é宿«ç åæ ¼å ¥åºå®¡æ¹:") .likeRight(ApproveProcess::getApproveRemark, "scanQualified:" + salesLedgerId + ":"); } else if (Objects.equals(bizType, INBOUND_BIZ_TYPE_SCAN_UNQUALIFIED)) { wrapper.likeRight(ApproveProcess::getApproveReason, "é宿«ç ä¸åæ ¼å ¥åºå®¡æ¹:") .likeRight(ApproveProcess::getApproveRemark, "scanUnqualified:" + salesLedgerId + ":"); } else { return null; } ApproveProcess latest = approveProcessService.getOne(wrapper); return latest == null ? null : latest.getApproveUserIds(); } @Override @Transactional(rollbackFor = Exception.class) public void scanOutbound(SalesScanInboundDto dto) { src/main/resources/mapper/device/DeviceMaintenanceMapper.xml
@@ -18,6 +18,7 @@ dm.update_user, dm.tenant_id, dm.maintenance_actually_name, dm.maintenance_location, dl.device_name, dl.device_model, su.nick_name as create_user_name @@ -37,6 +38,9 @@ </if> <if test="deviceMaintenanceDto.maintenanceActuallyName != null"> and dm.maintenance_actually_name like concat('%',#{deviceMaintenanceDto.maintenanceActuallyName},'%') </if> <if test="deviceMaintenanceDto.maintenanceLocation != null and deviceMaintenanceDto.maintenanceLocation != ''"> and dm.maintenance_location like concat('%',#{deviceMaintenanceDto.maintenanceLocation},'%') </if> <if test="deviceMaintenanceDto.maintenancePlanTime != null"> and dm.maintenance_plan_time like concat('%',#{deviceMaintenanceDto.maintenancePlanTime},'%') @@ -63,6 +67,7 @@ dm.update_user, dm.tenant_id, dm.maintenance_actually_name, dm.maintenance_location, dl.device_name, dl.device_model, su.user_name as create_user_name src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -47,6 +47,12 @@ <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' "> AND qi.check_time <= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d') </if> <if test="qualityInspect.approvalStatus != null"> AND qi.approval_status = #{qualityInspect.approvalStatus} </if> <if test="qualityInspect.approveUserIds != null and qualityInspect.approveUserIds != '' "> AND qi.approve_user_ids like concat('%',#{qualityInspect.approveUserIds},'%') </if> ORDER BY qi.id DESC </select> @@ -68,6 +74,12 @@ <if test="qualityInspect.productName != null and qualityInspect.productName != '' "> AND product_name = #{qualityInspect.productName} </if> <if test="qualityInspect.approvalStatus != null"> AND approval_status = #{qualityInspect.approvalStatus} </if> <if test="qualityInspect.approveUserIds != null and qualityInspect.approveUserIds != '' "> AND approve_user_ids like concat('%',#{qualityInspect.approveUserIds},'%') </if> </select> <delete id="deleteByProductMainIds"> src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -11,18 +11,22 @@ pm.thickness, u.nick_name as createBy, CASE WHEN sir.record_type IN ('7', '18', '19', '20') THEN pl.purchase_contract_number WHEN sir.record_type IN ('6', '7', '18', '19', '20') THEN pl.purchase_contract_number ELSE sl.sales_contract_no END as salesContractNo FROM stock_in_record as sir LEFT JOIN product_model as pm on sir.product_model_id = pm.id LEFT JOIN product as p on pm.product_id = p.id LEFT JOIN sys_user as u on sir.create_user = u.user_id LEFT JOIN quality_inspect as qi on qi.id = sir.record_id and sir.record_type = '6' LEFT JOIN sales_ledger_product as slp_link on slp_link.id = COALESCE(sir.sales_ledger_product_id, sir.record_id) LEFT JOIN sales_ledger as sl on sl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) and sir.record_type NOT IN ('7', '18', '19', '20') LEFT JOIN purchase_ledger as pl on pl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) and sir.record_type IN ('7', '18', '19', '20') and sir.record_type NOT IN ('6', '7', '18', '19', '20') LEFT JOIN purchase_ledger as pl on pl.id = CASE WHEN sir.record_type = '6' THEN qi.purchase_ledger_id ELSE COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) END and sir.record_type IN ('6', '7', '18', '19', '20') <where> <if test="params.timeStr != null and params.timeStr != ''"> and sir.create_time like concat('%',#{params.timeStr},'%') @@ -32,9 +36,9 @@ </if> <if test="params.salesContractNo != null and params.salesContractNo != ''"> and ( (sir.record_type IN ('7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%')) (sir.record_type IN ('6', '7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%')) or (sir.record_type NOT IN ('7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%')) (sir.record_type NOT IN ('6', '7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%')) ) </if> <if test="params.type != null and params.type != ''"> @@ -54,18 +58,22 @@ pm.unit, u.nick_name as createBy, CASE WHEN sir.record_type IN ('7', '18', '19', '20') THEN pl.purchase_contract_number WHEN sir.record_type IN ('6', '7', '18', '19', '20') THEN pl.purchase_contract_number ELSE sl.sales_contract_no END as salesContractNo FROM stock_in_record as sir LEFT JOIN product_model as pm on sir.product_model_id = pm.id LEFT JOIN product as p on pm.product_id = p.id LEFT JOIN sys_user as u on sir.create_user = u.user_id LEFT JOIN quality_inspect as qi on qi.id = sir.record_id and sir.record_type = '6' LEFT JOIN sales_ledger_product as slp_link on slp_link.id = COALESCE(sir.sales_ledger_product_id, sir.record_id) LEFT JOIN sales_ledger as sl on sl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) and sir.record_type NOT IN ('7', '18', '19', '20') LEFT JOIN purchase_ledger as pl on pl.id = COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) and sir.record_type IN ('7', '18', '19', '20') and sir.record_type NOT IN ('6', '7', '18', '19', '20') LEFT JOIN purchase_ledger as pl on pl.id = CASE WHEN sir.record_type = '6' THEN qi.purchase_ledger_id ELSE COALESCE(sir.sales_ledger_id, slp_link.sales_ledger_id, sir.record_id) END and sir.record_type IN ('6', '7', '18', '19', '20') <where> <if test="params.timeStr != null and params.timeStr != ''"> and sir.create_time like concat('%',#{params.timeStr},'%') @@ -75,9 +83,9 @@ </if> <if test="params.salesContractNo != null and params.salesContractNo != ''"> and ( (sir.record_type IN ('7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%')) (sir.record_type IN ('6', '7', '18', '19', '20') and pl.purchase_contract_number like concat('%',#{params.salesContractNo},'%')) or (sir.record_type NOT IN ('7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%')) (sir.record_type NOT IN ('6', '7', '18', '19', '20') and sl.sales_contract_no like concat('%',#{params.salesContractNo},'%')) ) </if> <if test="params.type != null and params.type != ''">