From 9833e8277140c9562eaa0f96e0dd03fcc963f420 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 26 Jun 2026 10:52:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E5=BA=93=E5=8C=BA?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/QrcodeBizTypeEnum.java | 3 +- .../WarehouseAreaController.java | 46 +++++++++++++++++-- .../warehousearea/vo/WarehouseAreaRespVO.java | 5 +- .../warehousearea/WarehouseAreaService.java | 5 +- .../WarehouseAreaServiceImpl.java | 45 +++++++++++++++++- 5 files changed, 95 insertions(+), 9 deletions(-) diff --git a/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/enums/QrcodeBizTypeEnum.java b/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/enums/QrcodeBizTypeEnum.java index 2a87cb0a0..b16f2c0f1 100644 --- a/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/enums/QrcodeBizTypeEnum.java +++ b/yudao-module-common/yudao-module-common-biz/src/main/java/cn/iocoder/yudao/module/common/enums/QrcodeBizTypeEnum.java @@ -13,7 +13,8 @@ public enum QrcodeBizTypeEnum { KEY_PART("KEY_PART", "关键件"), MOLD("MOLD", "模具"), PALLET("PALLET", "托盘"), - SPARE("SPARE", "备件"); + SPARE("SPARE", "备件"), + WAREHOUSE_AREA("WAREHOUSE_AREA", "库区"); private final String code; private final String name; diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java index a798cff36..aeb8e7838 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/WarehouseAreaController.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.erp.controller.admin.warehousearea; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +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.stock.vo.warehouse.ErpWarehouseRespVO; import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpWarehouseDO; import org.springframework.web.bind.annotation.*; @@ -13,6 +15,7 @@ import io.swagger.v3.oas.annotations.Operation; import java.util.*; import java.io.IOException; +import java.io.UnsupportedEncodingException; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -25,6 +28,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.*; import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; @@ -43,10 +47,13 @@ public class WarehouseAreaController { @Resource private WarehouseAreaService warehouseAreaService; + @Resource + private QrcodeRecordService qrcodeService; + @PostMapping("/create") @Operation(summary = "创建ERP 库区信息") @PreAuthorize("@ss.hasPermission('erp:warehouse-area:create')") - public CommonResult createWarehouseArea(@Valid @RequestBody WarehouseAreaSaveReqVO createReqVO) { + public CommonResult createWarehouseArea(@Valid @RequestBody WarehouseAreaSaveReqVO createReqVO) throws UnsupportedEncodingException { return success(warehouseAreaService.createWarehouseArea(createReqVO)); } @@ -73,7 +80,9 @@ public class WarehouseAreaController { @PreAuthorize("@ss.hasPermission('erp:warehouse-area:query')") public CommonResult getWarehouseArea(@RequestParam("id") Long id) { WarehouseAreaDO warehouseArea = warehouseAreaService.getWarehouseArea(id); - return success(BeanUtils.toBean(warehouseArea, WarehouseAreaRespVO.class)); + WarehouseAreaRespVO respVO = BeanUtils.toBean(warehouseArea, WarehouseAreaRespVO.class); + fillQrcodeUrl(respVO, warehouseArea); + return success(respVO); } @GetMapping("/page") @@ -81,7 +90,9 @@ public class WarehouseAreaController { @PreAuthorize("@ss.hasPermission('erp:warehouse-area:query')") public CommonResult> getWarehouseAreaPage(@Valid WarehouseAreaPageReqVO pageReqVO) { PageResult pageResult = warehouseAreaService.getWarehouseAreaPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, WarehouseAreaRespVO.class)); + PageResult result = BeanUtils.toBean(pageResult, WarehouseAreaRespVO.class); + fillQrcodeUrl(result.getList()); + return success(result); } @@ -89,12 +100,30 @@ public class WarehouseAreaController { @Operation(summary = "获得库区精简列表", description = "只包含被开启的仓库库区,主要用于前端的下拉选项") public CommonResult> getWarehouseSimpleList(@RequestParam(value = "warehouseId", required = false) Long warehouseId) { List list = warehouseAreaService.getWarehouseListByStatusAndWarehouseId(CommonStatusEnum.ENABLE.getStatus(), warehouseId); - return success(convertList(list, area -> new WarehouseAreaRespVO() + List result = convertList(list, area -> new WarehouseAreaRespVO() .setId(area.getId()) .setWarehouseId(area.getWarehouseId()) .setAreaCode(area.getAreaCode()) .setAreaName(area.getAreaName()) - .setStatus(area.getStatus()))); + .setStatus(area.getStatus())); + fillQrcodeUrl(result); + return success(result); + } + + private void fillQrcodeUrl(WarehouseAreaRespVO respVO, WarehouseAreaDO warehouseArea) { + if (respVO == null || warehouseArea == null) { + return; + } + respVO.setQrcodeUrl(qrcodeService.selectQrcodeUrlByIdAndCode( + QrcodeBizTypeEnum.WAREHOUSE_AREA.getCode(), warehouseArea.getId(), warehouseArea.getAreaCode())); + } + + private void fillQrcodeUrl(List list) { + Map qrcodeUrlMap = qrcodeService.selectQrcodeUrlMapByBizTypeAndIds( + QrcodeBizTypeEnum.WAREHOUSE_AREA.getCode(), convertSet(list, WarehouseAreaRespVO::getId)); + for (WarehouseAreaRespVO respVO : list) { + respVO.setQrcodeUrl(qrcodeUrlMap.get(respVO.getId())); + } } @@ -111,4 +140,11 @@ public class WarehouseAreaController { BeanUtils.toBean(list, WarehouseAreaRespVO.class)); } + @PostMapping("/regenerate-code") + public CommonResult regenerateCode(@RequestParam("id") Long id, + @RequestParam("code") String code) throws UnsupportedEncodingException { + warehouseAreaService.regenerateCode(id, code); + return success(true); + } + } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java index e0278110a..90dd3d320 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/warehousearea/vo/WarehouseAreaRespVO.java @@ -25,6 +25,9 @@ public class WarehouseAreaRespVO { @ExcelProperty("库区编码") private String areaCode; + @Schema(description = "二维码 URL") + private String qrcodeUrl; + @Schema(description = "库区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") @ExcelProperty("库区名称") private String areaName; @@ -45,4 +48,4 @@ public class WarehouseAreaRespVO { @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/service/warehousearea/WarehouseAreaService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java index 9a608cc62..11c56531b 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.erp.service.warehousearea; import java.util.*; +import java.io.UnsupportedEncodingException; import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.*; import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -21,7 +22,7 @@ public interface WarehouseAreaService { * @param createReqVO 创建信息 * @return 编号 */ - Long createWarehouseArea(@Valid WarehouseAreaSaveReqVO createReqVO); + Long createWarehouseArea(@Valid WarehouseAreaSaveReqVO createReqVO) throws UnsupportedEncodingException; /** * 更新ERP 库区信息 @@ -66,4 +67,6 @@ public interface WarehouseAreaService { List getWarehouseListByStatus(Integer status); List getWarehouseListByStatusAndWarehouseId(Integer status, Long warehouseId); + + void regenerateCode(Long id, String code) throws UnsupportedEncodingException; } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java index 85a319995..4afbffe5a 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java @@ -2,17 +2,23 @@ package cn.iocoder.yudao.module.erp.service.warehousearea; 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.warehousearea.vo.WarehouseAreaPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaSaveReqVO; import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.ArrayList; import java.util.List; @@ -24,6 +30,7 @@ import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_ARE @Service @Validated +@Slf4j public class WarehouseAreaServiceImpl implements WarehouseAreaService { @Resource @@ -35,8 +42,12 @@ public class WarehouseAreaServiceImpl implements WarehouseAreaService { @Resource private AutoCodeUtil autoCodeUtil; + @Resource + private QrcodeRecordService qrcodeService; + @Override - public Long createWarehouseArea(WarehouseAreaSaveReqVO createReqVO) { + @Transactional(rollbackFor = Exception.class) + public Long createWarehouseArea(WarehouseAreaSaveReqVO createReqVO) throws UnsupportedEncodingException { WarehouseAreaDO warehouseArea = BeanUtils.toBean(createReqVO, WarehouseAreaDO.class); if (StringUtils.isEmpty(warehouseArea.getAreaCode())) { warehouseArea.setAreaCode(autoCodeUtil.genSerialCode("RESERVOIR_AREA_GENERATE", null)); @@ -44,6 +55,17 @@ public class WarehouseAreaServiceImpl implements WarehouseAreaService { throw exception(WAREHOUSE_AREA_CODE_EXISTS); } warehouseAreaMapper.insert(warehouseArea); + CodeTypeEnum codeType = autoCodeUtil.queryCodeType("RESERVOIR_AREA_GENERATE"); + if (codeType == null) { + log.warn("[创建库区]未配置码类型,跳过生成,ruleCode={}", "RESERVOIR_AREA_GENERATE"); + return warehouseArea.getId(); + } + qrcodeService.generateOrRefresh( + QrcodeBizTypeEnum.WAREHOUSE_AREA, + warehouseArea.getId(), + warehouseArea.getAreaCode(), + "DETAIL", + codeType); return warehouseArea.getId(); } @@ -106,4 +128,25 @@ public class WarehouseAreaServiceImpl implements WarehouseAreaService { return result; } + @Override + public void regenerateCode(Long id, String code) throws UnsupportedEncodingException { + if (warehouseAreaMapper.selectById(id) == null) { + throw exception(WAREHOUSE_AREA_NOT_EXISTS); + } + if (StringUtils.isBlank(code)) { + throw exception(WAREHOUSE_AREA_CODE_EXISTS); + } + CodeTypeEnum codeType = autoCodeUtil.queryCodeType("RESERVOIR_AREA_GENERATE"); + if (codeType == null) { + log.warn("[重生成库区二维码]未配置码类型,跳过生成,ruleCode={}", "RESERVOIR_AREA_GENERATE"); + return; + } + qrcodeService.regenerateByCodeType( + QrcodeBizTypeEnum.WAREHOUSE_AREA, + id, + code, + "DETAIL", + codeType.getCode()); + } + }