yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseOrderController.java
@@ -26,6 +26,8 @@ import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO; import cn.iocoder.yudao.module.mdm.api.unit.MdmUnitMeasureApi; import cn.iocoder.yudao.module.mdm.api.unit.dto.MdmUnitMeasureRespDTO; import cn.iocoder.yudao.module.mes.api.arrivalnotice.MesArrivalNoticeApi; import cn.iocoder.yudao.module.mes.api.arrivalnotice.dto.MesArrivalNoticeRespDTO; import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -75,6 +77,8 @@ private AdminUserApi adminUserApi; @Resource private StorageAttachmentApi storageAttachmentApi; @Resource private MesArrivalNoticeApi arrivalNoticeApi; @PostMapping("/create") @Operation(summary = "å建éè´è®¢å") @@ -186,7 +190,7 @@ .no("CGDD20260101000001").supplierName("示ä¾ä¾åºå") .orderTime("2026-01-01 10:00:00").productCode("ITEM001").productName("示ä¾äº§åA") .count(new BigDecimal("100")).productPrice(new BigDecimal("10.00")) .taxPercent(new BigDecimal("13")).qcCheckFlag("å¦").remark("示ä¾").build()); .taxPercent(new BigDecimal("13")).remark("示ä¾").build()); ExcelUtils.write(response, "éè´è®¢åå¯¼å ¥æ¨¡æ¿.xls", "éè´è®¢å", ErpPurchaseOrderImportExcelVO.class, list); } @@ -261,6 +265,11 @@ // 1.6 å·²æ¥ç¥¨éé¢ï¼æéè´è®¢åç»è®¡ï¼ç¨äºè®¡ç®å©ä½å¯å¼ç¥¨éé¢ Map<Long, BigDecimal> invoicePriceSumMap = purchaseInvoiceService .getPurchaseInvoicePriceSumMapByOrderIds(convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId)); // 1.7 å°è´§éç¥åï¼ç¨äºå端åºåæ¯å¦å·²ç¡®è®¤æ¶è´§ãéèéå¤çã确认æ¶è´§ãæé® Map<Long, MesArrivalNoticeRespDTO> arrivalNoticeMap = arrivalNoticeApi .getArrivalNoticeListByPurchaseOrderIds(convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId)) .stream().collect(java.util.stream.Collectors.toMap( MesArrivalNoticeRespDTO::getPurchaseOrderId, notice -> notice, (a, b) -> a)); // 2. å¼å§æ¼æ¥ return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> { purchaseOrder.setItems(BeanUtils.toBean( @@ -279,6 +288,12 @@ purchaseOrder.setProductCodes(CollUtil.join(purchaseOrder.getItems(), "ï¼", ErpPurchaseOrderRespVO.Item::getProductCode)); MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName())); MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname())); MapUtils.findAndThen(arrivalNoticeMap, purchaseOrder.getId(), notice -> { purchaseOrder.setArrivalNoticeId(notice.getId()); purchaseOrder.setArrivalNoticeCode(notice.getCode()); purchaseOrder.setArrivalNoticeStatus(notice.getStatus()); purchaseOrder.setArrivalNoticeStatusName(notice.getStatusName()); }); purchaseOrder.setSourceTypeName(resolveSourceTypeName(purchaseOrder.getSourceType())); // å©ä½å¯å¼ç¥¨éé¢ = è®¢åæ»éé¢ - å·²æ¥ç¥¨éé¢ purchaseOrder.setRemainInvoicePrice(purchaseOrder.getTotalPrice().subtract( yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderImportExcelVO.java
@@ -76,10 +76,6 @@ @Schema(description = "ç¨çï¼ç¾åæ¯ï¼ä¾å¦ 13 表示 13%") private BigDecimal taxPercent; @ExcelProperty("æ¯å¦æ¥ææ£éª") @Schema(description = "æ¯å¦éè¦æ¥ææ£éªï¼å¡«âæ¯â为éè¦ï¼å ¶å®ä¸ºä¸éè¦") private String qcCheckFlag; @ExcelProperty("夿³¨") @Schema(description = "夿³¨") private String remark; yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/vo/order/ErpPurchaseOrderRespVO.java
@@ -147,6 +147,20 @@ @Schema(description = "å ¥åºç¶æï¼0:æªå ¥åº 1:é¨åå ¥åº 2:å ¨é¨å ¥åºï¼", example = "0") private Integer inStatus; // ========== 确认æ¶è´§ï¼å°è´§éç¥ï¼ ========== @Schema(description = "å°è´§éç¥åç¼å·ï¼å·²ç¡®è®¤æ¶è´§æ¶è¿å", example = "15") private Long arrivalNoticeId; @Schema(description = "å°è´§éç¥åå·", example = "AN1794282646472") private String arrivalNoticeCode; @Schema(description = "å°è´§éç¥åç¶æï¼0:è稿 2:å¾ è´¨æ£ 3:å¾ å ¥åº 4:已宿ï¼", example = "3") private Integer arrivalNoticeStatus; @Schema(description = "å°è´§éç¥åç¶æåç§°", example = "å¾ å ¥åº") private String arrivalNoticeStatusName; // ========== éè´éè´§ï¼åºåºï¼ï¼ ========== @Schema(description = "éè´éè´§æ°é", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -300,7 +300,8 @@ itemVO.setCount(row.getCount()); itemVO.setTaxPercent(row.getTaxPercent()); itemVO.setRemark(row.getRemark()); itemVO.setQcCheckFlag("æ¯".equals(StrUtil.trim(row.getQcCheckFlag()))); // éè´å°è´¦ä¸åæä¾ãæ¯å¦è´¨æ£ãéæ©ï¼å¯¼å ¥çæç»ä¸å¾éè¦æ¥ææ£éª itemVO.setQcCheckFlag(true); items.add(itemVO); } @@ -611,6 +612,8 @@ private List<ErpPurchaseOrderItemDO> validatePurchaseOrderItems(List<ErpPurchaseOrderSaveReqVO.Item> list) { // 转å为 ErpPurchaseOrderItemDO å表ï¼äº§åéªè¯å·²ç§»é¤ï¼ List<ErpPurchaseOrderItemDO> items = convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseOrderItemDO.class, item -> { // éè´å°è´¦ä¸åæä¾ãæ¯å¦è´¨æ£ãéæ©ï¼éè´æç»ä¸å¾éè¦æ¥ææ£éª item.setQcCheckFlag(true); item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); if (item.getTotalPrice() == null) { return; yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/arrivalnotice/MesArrivalNoticeApi.java
@@ -1,5 +1,10 @@ package cn.iocoder.yudao.module.mes.api.arrivalnotice; import cn.iocoder.yudao.module.mes.api.arrivalnotice.dto.MesArrivalNoticeRespDTO; import java.util.Collection; import java.util.List; /** * MES å°è´§éç¥å API æ¥å£ */ @@ -13,4 +18,12 @@ */ Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId); /** * æ ¹æ®éè´è®¢åç¼å·æ¹éæ¥è¯¢å°è´§éç¥å * * @param purchaseOrderIds éè´è®¢åç¼å·éå * @return å°è´§éç¥åå表 */ List<MesArrivalNoticeRespDTO> getArrivalNoticeListByPurchaseOrderIds(Collection<Long> purchaseOrderIds); } yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/arrivalnotice/dto/MesArrivalNoticeRespDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,50 @@ package cn.iocoder.yudao.module.mes.api.arrivalnotice.dto; import lombok.Data; import java.time.LocalDateTime; /** * MES å°è´§éç¥å Response DTO */ @Data public class MesArrivalNoticeRespDTO { private Long id; /** * å°è´§éç¥åå· */ private String code; /** * å°è´§éç¥ååç§° */ private String name; /** * éè´è®¢åç¼å· */ private Long purchaseOrderId; /** * éè´è®¢åå· */ private String purchaseOrderCode; /** * ç¶æï¼0-è稿 2-å¾ è´¨æ£ 3-å¾ å ¥åº 4-已宿 */ private Integer status; /** * ç¶æåç§° */ private String statusName; /** * å°è´§æ¥æ */ private LocalDateTime arrivalDate; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/api/arrivalnotice/MesArrivalNoticeApiImpl.java
@@ -1,8 +1,19 @@ package cn.iocoder.yudao.module.mes.api.arrivalnotice; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.api.arrivalnotice.dto.MesArrivalNoticeRespDTO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; /** * MES å°è´§éç¥å API å®ç°ç±» @@ -12,10 +23,32 @@ @Resource private MesWmArrivalNoticeService arrivalNoticeService; @Resource private MesWmArrivalNoticeMapper arrivalNoticeMapper; @Override public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) { return arrivalNoticeService.generateArrivalNoticeFromPurchaseOrder(purchaseOrderId); } } @Override public List<MesArrivalNoticeRespDTO> getArrivalNoticeListByPurchaseOrderIds(Collection<Long> purchaseOrderIds) { if (CollUtil.isEmpty(purchaseOrderIds)) { return List.of(); } List<MesWmArrivalNoticeDO> notices = arrivalNoticeMapper.selectListByPurchaseOrderIds(purchaseOrderIds); if (CollUtil.isEmpty(notices)) { return List.of(); } return notices.stream().map(notice -> BeanUtils.toBean(notice, MesArrivalNoticeRespDTO.class, resp -> resp.setStatusName(resolveStatusName(notice.getStatus())))).toList(); } private String resolveStatusName(Integer status) { return Arrays.stream(MesWmArrivalNoticeStatusEnum.values()) .filter(item -> Objects.equals(item.getStatus(), status)) .map(MesWmArrivalNoticeStatusEnum::getName) .findFirst().orElse(null); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeController.java
@@ -12,6 +12,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; @@ -45,6 +47,8 @@ @Resource private MesWmArrivalNoticeService arrivalNoticeService; @Resource private MesWmArrivalNoticeLineService arrivalNoticeLineService; @Resource private SrmSupplierApi srmSupplierApi; @Resource @@ -149,7 +153,11 @@ Map<Long, ErpPurchaseOrderRespDTO> purchaseOrderMap = purchaseOrderApi.getPurchaseOrderList(purchaseOrderIds) .getCheckedData().stream() .collect(java.util.stream.Collectors.toMap(ErpPurchaseOrderRespDTO::getId, v -> v, (a, b) -> a)); // 3. æå»ºç»æ // 3. è·å¾è´¨æ£è¿åº¦ï¼éæ£è¡ / å·²çææ£éªåè¡ / 已宿æ£éªè¡ Map<Long, List<MesWmArrivalNoticeLineDO>> lineMap = arrivalNoticeLineService .getArrivalNoticeLineListByNoticeIds(convertSet(list, MesWmArrivalNoticeDO::getId)) .stream().collect(java.util.stream.Collectors.groupingBy(MesWmArrivalNoticeLineDO::getNoticeId)); // 4. æå»ºç»æ return BeanUtils.toBean(list, MesWmArrivalNoticeRespVO.class, vo -> { MapUtils.findAndThen(supplierMap, vo.getVendorId(), supplier -> vo.setVendorName(supplier.getName())); @@ -160,6 +168,14 @@ vo.setContractNo(purchaseOrder.getContractNo()); } }); List<MesWmArrivalNoticeLineDO> lines = lineMap.getOrDefault(vo.getId(), Collections.emptyList()); List<MesWmArrivalNoticeLineDO> needCheckLines = lines.stream() .filter(line -> Boolean.TRUE.equals(line.getIqcCheckFlag())).toList(); vo.setIqcNeedCount(needCheckLines.size()); vo.setIqcCreatedCount((int) needCheckLines.stream() .filter(line -> line.getIqcId() != null).count()); vo.setIqcInspectedCount((int) needCheckLines.stream() .filter(line -> line.getIqcCheckResult() != null).count()); }); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/MesWmArrivalNoticeRespVO.java
@@ -70,4 +70,15 @@ @ExcelProperty("å建æ¶é´") private LocalDateTime createTime; // ========== è´¨æ£è¿åº¦ï¼å表页ç¨äºåºåæ¯å¦å·²çææ¥ææ£éªåï¼ ========== @Schema(description = "鿣éªè¡æ°ï¼iqcCheckFlag=true çæç»è¡æ°ï¼", example = "2") private Integer iqcNeedCount; @Schema(description = "å·²çææ¥ææ£éªåçè¡æ°", example = "2") private Integer iqcCreatedCount; @Schema(description = "已宿æ£éªï¼ææ£éªç»æï¼çè¡æ°", example = "0") private Integer iqcInspectedCount; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeLineMapper.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; /** @@ -25,6 +26,11 @@ return selectList(MesWmArrivalNoticeLineDO::getNoticeId, noticeId); } default List<MesWmArrivalNoticeLineDO> selectListByNoticeIds(Collection<Long> noticeIds) { return selectList(new LambdaQueryWrapperX<MesWmArrivalNoticeLineDO>() .inIfPresent(MesWmArrivalNoticeLineDO::getNoticeId, noticeIds)); } default void deleteByNoticeId(Long noticeId) { delete(MesWmArrivalNoticeLineDO::getNoticeId, noticeId); } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/arrivalnotice/MesWmArrivalNoticeMapper.java
@@ -7,6 +7,9 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import org.apache.ibatis.annotations.Mapper; import java.util.Collection; import java.util.List; /** * MES å°è´§éç¥å Mapper */ @@ -37,4 +40,9 @@ return selectOne(MesWmArrivalNoticeDO::getPurchaseOrderId, purchaseOrderId); } default List<MesWmArrivalNoticeDO> selectListByPurchaseOrderIds(Collection<Long> purchaseOrderIds) { return selectList(new LambdaQueryWrapperX<MesWmArrivalNoticeDO>() .inIfPresent(MesWmArrivalNoticeDO::getPurchaseOrderId, purchaseOrderIds)); } } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java
@@ -112,7 +112,7 @@ // 2. æå ¥ä¸»è¡¨ MesQcIqcDO iqc = BeanUtils.toBean(createReqVO, MesQcIqcDO.class) .setTemplateId(null) .setCheckQuantity(createReqVO.getQualifiedQuantity().add(createReqVO.getUnqualifiedQuantity())) .setCheckQuantity(resolveCheckQuantity(createReqVO.getQualifiedQuantity(), createReqVO.getUnqualifiedQuantity())) .setSourceDocCode(sourceDocCode) .setStatus(MesQcStatusEnum.DRAFT.getStatus()); iqcMapper.insert(iqc); @@ -131,8 +131,18 @@ updateObj.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null); // ä¸å è®¸ä¿®æ¹æ¥æºåæ® updateObj.setTemplateId(null); // ä¸å è®¸ä¿®æ¹æ¨¡æ¿ updateObj.setItemId(null); // ä¸å 许修æ¹ç©æ updateObj.setCheckQuantity(updateReqVO.getQualifiedQuantity().add(updateReqVO.getUnqualifiedQuantity())); updateObj.setCheckQuantity(resolveCheckQuantity(updateReqVO.getQualifiedQuantity(), updateReqVO.getUnqualifiedQuantity())); iqcMapper.updateById(updateObj); } /** * æ£éªæ°é = åæ ¼æ°é + ä¸åæ ¼æ°éï¼ä¸¤è æªå¡«å ¨æ¶ç空ï¼çæ£éªåå½å ¥ååè®¡ç® */ private BigDecimal resolveCheckQuantity(BigDecimal qualified, BigDecimal unqualified) { if (qualified == null || unqualified == null) { return null; } return qualified.add(unqualified); } private void validateIqcSaveData(MesQcIqcSaveReqVO reqVO) { @@ -393,9 +403,10 @@ } iqc.setItemId(line.getItemId()); iqc.setReceivedQuantity(line.getArrivalQuantity()); iqc.setCheckQuantity(BigDecimal.ZERO); // å¾ å¡«å iqc.setQualifiedQuantity(BigDecimal.ZERO); // å¾ å¡«å iqc.setUnqualifiedQuantity(BigDecimal.ZERO); // å¾ å¡«å // åæ ¼/ä¸åæ ¼æ°éç空ï¼ç±æ£éªåå¡«åæ¶å½å ¥ï¼ä¸åé»è®¤ 0ï¼é¿å 误å¤ä¸ºãå·²æ£éªåæ ¼ 0ãï¼ iqc.setCheckQuantity(null); iqc.setQualifiedQuantity(null); iqc.setUnqualifiedQuantity(null); iqc.setReceiveDate(java.time.LocalDateTime.now()); iqc.setStatus(MesQcStatusEnum.DRAFT.getStatus()); iqcMapper.insert(iqc); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcNcrPurchaseSourceValidator.java
@@ -43,7 +43,7 @@ .eq(MesWmArrivalNoticeLineDO::getId, iqc.getSourceLineId()).last("FOR UPDATE")); if (notice == null || line == null || !Objects.equals(line.getNoticeId(), notice.getId()) || !Objects.equals(line.getIqcId(), iqc.getId()) || !Objects.equals(notice.getStatus(), MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()) || !isDispositionAllowedNoticeStatus(notice.getStatus()) || !Objects.equals(line.getItemId(), iqc.getItemId()) || !Objects.equals(ncr.getItemId(), iqc.getItemId()) || !samePositive(ncr.getUnqualifiedQuantity(), iqc.getUnqualifiedQuantity()) @@ -52,6 +52,19 @@ return new Source(iqc, notice, line); } /** * ä¸åæ ¼å¤ç½®å 许çå°è´§éç¥ç¶æã * * æ¥ææ£éªå®ææ¶ï¼å°è´§éç¥ä¼å¨åä¸äºå¡éä»ãå¾ è´¨æ£ãæ¨è¿å°ãå¾ å ¥åºãå¹¶èªå¨çæéè´å ¥åºå * ï¼åªååæ ¼æ°éï¼ï¼éåç¡®è®¤å ¥åºåå为ã已宿ããä¸åæ ¼é¨åçéè´§/让æ¥ç±ä¸åæ ¼ååç¬å¤ç½®ï¼ * ä¸ååéç¥ç¶æéå¶ï¼å¦ååè¡éç¥ï¼ææåä¸è¡æ£éªå®ææ¶ï¼çä¸åæ ¼åå°æ°¸è¿æ æ³å¤ç½®ã */ private boolean isDispositionAllowedNoticeStatus(Integer status) { return Objects.equals(status, MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus()) || Objects.equals(status, MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()) || Objects.equals(status, MesWmArrivalNoticeStatusEnum.FINISHED.getStatus()); } private boolean samePositive(BigDecimal a, BigDecimal b) { return a != null && b != null && a.signum() > 0 && a.compareTo(b) == 0; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcNcrServiceImpl.java
@@ -287,7 +287,8 @@ respVO.setDocId(doc.getId()); respVO.setDocCode(doc.getCode()); respVO.setDocName("éè´éè´§å"); respVO.setMessage("éè´éè´§åå·²çæï¼è¯·ç±ä»åºç¡®è®¤éè´§"); respVO.setMessage("éè´éè´§å " + doc.getCode() + " å·²çæï¼ä¸åæ ¼åæªå ¥åºï¼æ éæ£è´§ï¼åæ®å·²ç´æ¥å®æï¼å¯å¨ãéè´ä»åº-éè´éè´§ãæ¥ç"); } else if (Objects.equals(disposeReqVO.getDisposition(), MesNcrDispositionEnum.REPRODUCTION.getType())) { respVO = processSource != null ? oqcReproductionService.reproduceIpqc(ncr, disposeReqVO.getDisposition(), processSource) yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ncr/MesQcPurchaseReturnService.java
@@ -5,8 +5,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcPurchaseReturnDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseReturnMapper; import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseConcessionMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,10 +23,16 @@ @Service public class MesQcPurchaseReturnService { /** éè´éè´§åç¼ç è§åï¼MesMdAutoCodeRule ä¸ç codeï¼ */ private static final String RETURN_VENDOR_CODE_RULE = "WM_RETURN_VENDOR_CODE"; @Resource private MesQcNcrPurchaseSourceValidator sourceValidator; @Resource private MesQcPurchaseReturnMapper mapper; @Resource private MesQcPurchaseConcessionMapper concessionMapper; @Resource private MesQcArrivalDispositionService arrivalDispositionService; @Resource private MesWmReturnVendorMapper returnVendorMapper; @Resource private MesWmReturnVendorLineMapper returnVendorLineMapper; @Resource private MesMdAutoCodeRecordService autoCodeRecordService; /** å¿ é¡»ç±å·²éå® NCR çå¤ç½®äºå¡è°ç¨ã */ @Transactional(rollbackFor = Exception.class) @@ -32,8 +45,35 @@ if (source.notice().getVendorId() == null || source.notice().getPurchaseOrderId() == null || source.line().getPurchaseOrderItemId() == null) throw new ServiceException(400, "å°è´§å缺å°ä¾åºåãéè´è®¢åæéè´æç»ï¼æ æ³çæå¯è¿½æº¯éè´§å"); // 1. çæãä¾åºåéè´§åãï¼ä¸åæ ¼å仿ªå ¥åºï¼ä¸äº§çåºååºåºï¼ä¹æ éæ£è´§ä¸å®¡æ¹ï¼ // ç´æ¥ä»¥å·²å®æç¶æè½å°éè´ä»åº-éè´éè´§å表ä¸ï¼ä¾ä»åº/éè´è¿½æº¯å¹¶æå®ç©éåä¾åºåã String code = autoCodeRecordService.generateAutoCode(RETURN_VENDOR_CODE_RULE, null); MesWmReturnVendorDO vendorReturn = new MesWmReturnVendorDO(); vendorReturn.setCode(code); vendorReturn.setName("æ¥æä¸åæ ¼éè´§-" + ncr.getCode()); vendorReturn.setPurchaseOrderId(source.notice().getPurchaseOrderId()); vendorReturn.setPurchaseOrderCode(source.notice().getPurchaseOrderCode()); vendorReturn.setContractNo(source.notice().getContractNo()); vendorReturn.setVendorId(source.notice().getVendorId()); vendorReturn.setReturnDate(LocalDateTime.now()); vendorReturn.setReturnReason("æ¥ææ£éªä¸åæ ¼"); vendorReturn.setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus()); vendorReturn.setRemark("ç±æ¥æä¸åæ ¼å " + ncr.getCode() + "ï¼æ¥ææ£éª " + source.iqc().getCode() + "ï¼éè´§å¤ç½®èªå¨çæï¼ä¸åæ ¼åæªå ¥åºï¼æ éæ£è´§ï¼åæ®ç´æ¥å®æã"); returnVendorMapper.insert(vendorReturn); MesWmReturnVendorLineDO vendorReturnLine = new MesWmReturnVendorLineDO(); vendorReturnLine.setReturnId(vendorReturn.getId()); vendorReturnLine.setItemId(ncr.getItemId()); vendorReturnLine.setQuantity(ncr.getUnqualifiedQuantity()); vendorReturnLine.setBatchCode(StrUtil.blankToDefault(source.iqc().getVendorBatch(), null)); vendorReturnLine.setRemark("æ¥ææ£éª " + source.iqc().getCode() + " ä¸åæ ¼æ°é"); returnVendorLineMapper.insert(vendorReturnLine); // 2. è®°å½è´¨éä¾§å¤ç½®å°è´¦ï¼ä¸éè´§ååå·ï¼ï¼å éè´§åå·²ç´æ¥å®æï¼è¿é忥æ è®°ä¸ºå·²ç¡®è®¤ï¼ // ä¸åæ ¼åå ³éæ¶æ ¡éªçæ£æ¯è¿æ¡è®°å½ã MesQcPurchaseReturnDO doc = new MesQcPurchaseReturnDO(); doc.setCode("NCR-RET-" + ncr.getId()); doc.setCode(code); doc.setNcrId(ncr.getId()); doc.setIqcId(ncr.getQcId()); doc.setNoticeId(source.notice().getId()); @@ -44,8 +84,12 @@ doc.setItemId(ncr.getItemId()); doc.setVendorBatch(source.iqc().getVendorBatch()); doc.setQuantity(ncr.getUnqualifiedQuantity()); doc.setStatus(0); doc.setStatus(1); doc.setConfirmedBy(getLoginUserId()); doc.setConfirmedAt(LocalDateTime.now()); doc.setConfirmationRemark("éä¸åæ ¼å¤ç½®èªå¨çæéè´éè´§å " + code + "ï¼æªåçåºååºåº"); mapper.insert(doc); arrivalDispositionService.refresh(source.notice().getId()); return doc; } yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java
@@ -368,9 +368,10 @@ oqc.setBatchCode(line.getBatchCode()); oqc.setReelNo(resolveSalesReelNo(line)); oqc.setOutQuantity(line.getQuantity()); oqc.setCheckQuantity(BigDecimal.ZERO); // å¾ å¡«å oqc.setQualifiedQuantity(BigDecimal.ZERO); // å¾ å¡«å oqc.setUnqualifiedQuantity(BigDecimal.ZERO); // å¾ å¡«å // æ£æµ/åæ ¼/ä¸åæ ¼æ°éç空ï¼ç±æ£éªåå¡«åæ¶å½å ¥ï¼ä¸åé»è®¤ 0ï¼ oqc.setCheckQuantity(null); oqc.setQualifiedQuantity(null); oqc.setUnqualifiedQuantity(null); MesWmProductSalesDO sales = productSalesService.getProductSales(salesId); java.time.LocalDateTime businessDate = sales != null && sales.getSalesDate() != null ? sales.getSalesDate() : java.time.LocalDateTime.now(); yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java
@@ -7,6 +7,7 @@ import jakarta.validation.Valid; import java.math.BigDecimal; import java.util.Collection; import java.util.List; /** @@ -61,6 +62,14 @@ List<MesWmArrivalNoticeLineDO> getArrivalNoticeLineListByNoticeId(Long noticeId); /** * æéç¥åç¼å·éåæ¹éè·å¾è¡å表ï¼åè¡¨é¡µä¸æ¬¡æ§æ¥è¯¢ï¼é¿å éåæ¥è¯¢ï¼ * * @param noticeIds éç¥åç¼å·éå * @return è¡å表 */ List<MesWmArrivalNoticeLineDO> getArrivalNoticeLineListByNoticeIds(Collection<Long> noticeIds); /** * æéç¥åç¼å·æ¹éå é¤è¡ * * @param noticeId éç¥åç¼å· yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java
@@ -15,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.Collection; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -107,6 +108,11 @@ } @Override public List<MesWmArrivalNoticeLineDO> getArrivalNoticeLineListByNoticeIds(Collection<Long> noticeIds) { return arrivalNoticeLineMapper.selectListByNoticeIds(noticeIds); } @Override public void deleteArrivalNoticeLineByNoticeId(Long noticeId) { arrivalNoticeLineMapper.deleteByNoticeId(noticeId); }