diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java index cf58dbf37..e878cdb3e 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/WarehouseLocationController.java @@ -15,6 +15,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; +import cn.iocoder.yudao.module.common.service.qrcordrecord.QrcodeRecordService; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; @@ -40,6 +42,9 @@ public class WarehouseLocationController { @Resource private WarehouseLocationService warehouseLocationService; + @Resource + private QrcodeRecordService qrcodeRecordService; + @PostMapping("/create") @Operation(summary = "创建ERP 库位信息") @PreAuthorize("@ss.hasPermission('erp:warehouse-location:create')") @@ -73,6 +78,19 @@ public class WarehouseLocationController { return success(BeanUtils.toBean(warehouseLocation, WarehouseLocationRespVO.class)); } + @GetMapping("/print-data") + @Operation(summary = "获得库位打印数据") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:bit-wms-location:print')") + public CommonResult getPrintData(@RequestParam("id") Long id) { + WarehouseLocationDO warehouseLocation = warehouseLocationService.getWarehouseLocation(id); + WarehouseLocationRespVO respVO = BeanUtils.toBean(warehouseLocation, WarehouseLocationRespVO.class); + String qrcodeUrl = qrcodeRecordService.selectQrcodeUrlByIdAndCode( + QrcodeBizTypeEnum.WAREHOUSE_LOCATION.getCode(), id, warehouseLocation.getCode()); + respVO.setQrcodeUrl(qrcodeUrl); + return success(respVO); + } + @GetMapping("/page") @Operation(summary = "获得ERP 库位信息分页") @PreAuthorize("@ss.hasPermission('erp:warehouse-location:query')") diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java index 546628e05..008a7634f 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehouselocation/vo/WarehouseLocationRespVO.java @@ -65,8 +65,11 @@ public class WarehouseLocationRespVO { @ExcelProperty("开启状态") private Integer status; + @Schema(description = "二维码地址") + private String qrcodeUrl; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; -} \ No newline at end of file +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/handler/WarehouseLocationQrcodeBizHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/handler/WarehouseLocationQrcodeBizHandler.java new file mode 100644 index 000000000..60197d815 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/handler/WarehouseLocationQrcodeBizHandler.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.erp.handler; + +import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; +import cn.iocoder.yudao.module.common.handler.QrcodeBizHandler; +import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class WarehouseLocationQrcodeBizHandler implements QrcodeBizHandler { + + @Resource + private WarehouseLocationMapper warehouseLocationMapper; + + @Override + public String getBizType() { + return QrcodeBizTypeEnum.WAREHOUSE_LOCATION.getCode(); + } + + @Override + public boolean exists(Long id) { + return warehouseLocationMapper.selectById(id) != null; + } + + @Override + public String buildDeepLink(Long id) { + return "besure://warehouse-location/detail?id=" + id; + } + + @Override + public String buildH5Path(Long id) { + return "/pages_function/pages/bitWms/stock?locationId=" + id; + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java index e4c106613..30ad50557 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImpl.java @@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.erp.service.warehouselocation; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.common.enums.CodeTypeEnum; +import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; +import cn.iocoder.yudao.module.common.service.qrcordrecord.QrcodeRecordService; import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationSaveReqVO; @@ -14,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.io.UnsupportedEncodingException; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -26,6 +30,8 @@ import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_LOC @Validated public class WarehouseLocationServiceImpl implements WarehouseLocationService { + private static final String BIT_WAREHOUSE_LOCATION_CODE_RULE = "BIT_WAREHOUSE_LOCATION_CODE"; + @Resource private WarehouseLocationMapper warehouseLocationMapper; @@ -35,6 +41,9 @@ public class WarehouseLocationServiceImpl implements WarehouseLocationService { @Resource private AutoCodeUtil autoCodeUtil; + @Resource + private QrcodeRecordService qrcodeRecordService; + @Override public Long createWarehouseLocation(WarehouseLocationSaveReqVO createReqVO) { validateWarehouseAreaMatch(createReqVO.getWarehouseId(), createReqVO.getAreaId()); @@ -45,6 +54,7 @@ public class WarehouseLocationServiceImpl implements WarehouseLocationService { throw exception(WAREHOUSE_LOCATION_CODE_EXISTS); } warehouseLocationMapper.insert(warehouseLocation); + generateWarehouseLocationQrcode(warehouseLocation.getId(), warehouseLocation.getCode()); return warehouseLocation.getId(); } @@ -52,7 +62,9 @@ public class WarehouseLocationServiceImpl implements WarehouseLocationService { public void updateWarehouseLocation(WarehouseLocationSaveReqVO updateReqVO) { validateWarehouseLocationExists(updateReqVO.getId()); validateWarehouseAreaMatch(updateReqVO.getWarehouseId(), updateReqVO.getAreaId()); - warehouseLocationMapper.updateById(BeanUtils.toBean(updateReqVO, WarehouseLocationDO.class)); + WarehouseLocationDO updateObj = BeanUtils.toBean(updateReqVO, WarehouseLocationDO.class); + warehouseLocationMapper.updateById(updateObj); + generateWarehouseLocationQrcode(updateObj.getId(), updateObj.getCode()); } @Override @@ -92,4 +104,24 @@ public class WarehouseLocationServiceImpl implements WarehouseLocationService { return warehouseLocationMapper.selectPage(pageReqVO); } + private void generateWarehouseLocationQrcode(Long id, String code) { + if (StringUtils.isBlank(code)) { + return; + } + CodeTypeEnum codeType = autoCodeUtil.queryCodeType(BIT_WAREHOUSE_LOCATION_CODE_RULE); + if (codeType == null) { + return; + } + try { + qrcodeRecordService.generateOrRefresh( + QrcodeBizTypeEnum.WAREHOUSE_LOCATION, + id, + code, + "DETAIL", + codeType); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImplTest.java b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImplTest.java new file mode 100644 index 000000000..112aff6ab --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/warehouselocation/WarehouseLocationServiceImplTest.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.erp.service.warehouselocation; + +import cn.iocoder.yudao.module.common.enums.CodeTypeEnum; +import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; +import cn.iocoder.yudao.module.common.service.qrcordrecord.QrcodeRecordService; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; +import cn.iocoder.yudao.module.erp.controller.admin.warehouselocation.vo.WarehouseLocationSaveReqVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.warehouselocation.WarehouseLocationDO; +import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * {@link WarehouseLocationServiceImpl} 的单元测试类 + */ +@ExtendWith(MockitoExtension.class) +class WarehouseLocationServiceImplTest { + + @InjectMocks + private WarehouseLocationServiceImpl warehouseLocationService; + + @Mock + private WarehouseLocationMapper warehouseLocationMapper; + @Mock + private WarehouseAreaMapper warehouseAreaMapper; + @Mock + private AutoCodeUtil autoCodeUtil; + @Mock + private QrcodeRecordService qrcodeRecordService; + + @Test + void createWarehouseLocation_generatesQrcodeRecord() throws Exception { + WarehouseLocationSaveReqVO reqVO = new WarehouseLocationSaveReqVO(); + reqVO.setCode("A1"); + reqVO.setName("A1"); + reqVO.setWarehouseId(1L); + reqVO.setAreaId(1L); + reqVO.setAllowProductMix(false); + reqVO.setAllowBatchMix(false); + reqVO.setStatus(0); + + WarehouseAreaDO area = new WarehouseAreaDO(); + area.setId(1L); + area.setWarehouseId(1L); + when(warehouseAreaMapper.selectById(1L)).thenReturn(area); + when(autoCodeUtil.queryCodeType("BIT_WAREHOUSE_LOCATION_CODE")).thenReturn(CodeTypeEnum.QR); + when(warehouseLocationMapper.insert(any(WarehouseLocationDO.class))).thenAnswer(invocation -> { + WarehouseLocationDO location = invocation.getArgument(0); + location.setId(100L); + return 1; + }); + + Long id = warehouseLocationService.createWarehouseLocation(reqVO); + + assertEquals(100L, id); + verify(qrcodeRecordService).generateOrRefresh( + eq(QrcodeBizTypeEnum.WAREHOUSE_LOCATION), + eq(100L), + eq("A1"), + eq("DETAIL"), + eq(CodeTypeEnum.QR)); + } +}