Jelajahi Sumber

改动过的

huanglizhi 1 tahun lalu
induk
melakukan
c890e43a74
100 mengubah file dengan 1532 tambahan dan 835 penghapusan
  1. 6 0
      module-erp/pom.xml
  2. 81 0
      module-erp/src/main/java/com/hys/app/controller/base/FileBaseController.java
  3. 0 88
      module-erp/src/main/java/com/hys/app/controller/erp/goods/GoodsSnController.java
  4. 0 43
      module-erp/src/main/java/com/hys/app/controller/erp/goods/ProductManagerController.java
  5. 6 4
      module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsManagerController.java
  6. 62 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsSnController.java
  7. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/KdnController.java
  8. 17 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/OrderController.java
  9. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/OrderItemController.java
  10. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/OrderReturnItemManagerController.java
  11. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/OrderReturnManagerController.java
  12. 80 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/ProductManagerController.java
  13. 15 4
      module-erp/src/main/java/com/hys/app/controller/erp/use/ScanCodeController.java
  14. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/StockDamageReportManagerController.java
  15. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/StockInventoryManagerController.java
  16. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/StockTransferManagerController.java
  17. 2 2
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseAreaController.java
  18. 2 13
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseEntryManagerController.java
  19. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseEntryProductManagerController.java
  20. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseManagerController.java
  21. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutItemController.java
  22. 1 1
      module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutManagerController.java
  23. 3 4
      module-erp/src/main/java/com/hys/app/converter/erp/GoodsSnConverter.java
  24. 4 0
      module-erp/src/main/java/com/hys/app/converter/erp/ProductConverter.java
  25. 1 0
      module-erp/src/main/java/com/hys/app/framework/security/AdminAccessDecisionManager.java
  26. 25 0
      module-erp/src/main/java/com/hys/app/mapper/erp/ItemSnCodeMapper.java
  27. 19 0
      module-erp/src/main/java/com/hys/app/mapper/erp/OrderSendItemMapper.java
  28. 1 1
      module-erp/src/main/java/com/hys/app/mapper/goods/GoodsSnMapper.java
  29. 16 0
      module-erp/src/main/java/com/hys/app/mapper/goods/ProductGroupItemMapper.java
  30. 15 0
      module-erp/src/main/java/com/hys/app/mapper/goods/ProductGroupMapper.java
  31. 3 35
      module-erp/src/main/java/com/hys/app/model/base/vo/FileVO.java
  32. 4 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/AreaStock.java
  33. 3 211
      module-erp/src/main/java/com/hys/app/model/erp/dos/ChangeFormProduct.java
  34. 0 9
      module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsDO.java
  35. 17 6
      module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsSnDO.java
  36. 45 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/ItemSnCodeDO.java
  37. 4 162
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderDO.java
  38. 8 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderItemDO.java
  39. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderReturnItemDO.java
  40. 2 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendDO.java
  41. 53 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendItemDO.java
  42. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductDO.java
  43. 35 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductGroupDO.java
  44. 41 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductGroupItemDO.java
  45. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductStockDO.java
  46. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/StockTransferDO.java
  47. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/StockTransferProductDO.java
  48. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/SupplierReturnItemDO.java
  49. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/SupplierSettlementItemDO.java
  50. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryBatchDO.java
  51. 12 2
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryDO.java
  52. 26 3
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryProductDO.java
  53. 4 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutDO.java
  54. 11 5
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutItemDO.java
  55. 5 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsDTO.java
  56. 8 13
      module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsSnDTO.java
  57. 9 5
      module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsSnQueryParams.java
  58. 5 3
      module-erp/src/main/java/com/hys/app/model/erp/dto/OrderDTO.java
  59. 8 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/OrderItemDTO.java
  60. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/ProductDTO.java
  61. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/StockDamageReportProductDTO.java
  62. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryProductDTO.java
  63. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/StockTransferProductDTO.java
  64. 1 1
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseAreaRequest.java
  65. 8 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryDTO.java
  66. 10 5
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryProductDTO.java
  67. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutDTO.java
  68. 23 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutProductDTO.java
  69. 2 2
      module-erp/src/main/java/com/hys/app/model/erp/enums/ScanFormCodeTypeEnum.java
  70. 25 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/SnCodeStatusEnum.java
  71. 1 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/TransferTypeEnum.java
  72. 1 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/WarehouseEntyrTypeEnum.java
  73. 4 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/WarehouseOutTypeEnum.java
  74. 7 7
      module-erp/src/main/java/com/hys/app/model/erp/vo/GoodsSnVO.java
  75. 4 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/GoodsVO.java
  76. 42 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/OrderSendItemVO.java
  77. 3 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/OrderVO.java
  78. 4 1
      module-erp/src/main/java/com/hys/app/model/erp/vo/ProductStockVO.java
  79. 22 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryBatchVO.java
  80. 2 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryProductVO.java
  81. 0 3
      module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryVO.java
  82. 3 1
      module-erp/src/main/java/com/hys/app/service/erp/GoodsManager.java
  83. 18 0
      module-erp/src/main/java/com/hys/app/service/erp/GoodsSnManager.java
  84. 14 0
      module-erp/src/main/java/com/hys/app/service/erp/ItemSnCodeManager.java
  85. 5 0
      module-erp/src/main/java/com/hys/app/service/erp/OrderManager.java
  86. 23 0
      module-erp/src/main/java/com/hys/app/service/erp/OrderSendItemManager.java
  87. 15 0
      module-erp/src/main/java/com/hys/app/service/erp/ProductGroupItemManager.java
  88. 22 0
      module-erp/src/main/java/com/hys/app/service/erp/ProductGroupManager.java
  89. 40 2
      module-erp/src/main/java/com/hys/app/service/erp/ProductManager.java
  90. 21 0
      module-erp/src/main/java/com/hys/app/service/erp/ScanCodeManager.java
  91. 1 1
      module-erp/src/main/java/com/hys/app/service/erp/WarehouseEntryProductManager.java
  92. 39 17
      module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsManagerImpl.java
  93. 80 46
      module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsSnManagerImpl.java
  94. 20 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/ItenSnCodeManagerImpl.java
  95. 135 46
      module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java
  96. 32 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/OrderSendItemManagerImpl.java
  97. 18 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/ProductGroupItemManagerImpl.java
  98. 18 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/ProductGroupManagerImpl.java
  99. 64 5
      module-erp/src/main/java/com/hys/app/service/erp/impl/ProductManagerImpl.java
  100. 111 64
      module-erp/src/main/java/com/hys/app/service/erp/impl/ScanCodeManagerImpl.java

+ 6 - 0
module-erp/pom.xml

@@ -17,6 +17,12 @@
             <artifactId>framework</artifactId>
             <version>${erp-version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains</groupId>
+            <artifactId>annotations</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 81 - 0
module-erp/src/main/java/com/hys/app/controller/base/FileBaseController.java

@@ -1,7 +1,9 @@
 package com.hys.app.controller.base;
 
+import cn.hutool.core.collection.ListUtil;
 import com.hys.app.framework.exception.ResourceNotFoundException;
 import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.framework.util.ArrayUtils;
 import com.hys.app.framework.util.FileUtil;
 import com.hys.app.model.base.dto.FileDTO;
 import com.hys.app.model.base.vo.FileVO;
@@ -11,6 +13,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -18,7 +21,14 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+import java.util.UUID;
 
 
 /**
@@ -75,4 +85,75 @@ public class FileBaseController {
     }
 
 
+    @ApiOperation(value = "文件上传", response = FileVO.class)
+    @ApiImplicitParam(name = "scene", value = "业务场景", allowableValues = "goods,shop,member,other", required = true, dataType = "String", paramType = "query")
+    @PostMapping("uploadSmall")
+    public FileVO uploadSmall(MultipartFile file, String scene) throws IOException {
+        if (file != null && file.getOriginalFilename() != null) {
+            //文件类型
+            String contentType = file.getContentType();
+            //获取文件名称
+            String ext = contentType.substring(contentType.lastIndexOf("/") + 1, contentType.length());
+            String jpg = ext.substring(contentType.lastIndexOf(".") + 1, ext.length());
+
+            //如果是图片类型 则验证不允许上传超过2M
+            if (FileUtil.isAllowUpImg(ext)) {
+                if (!FileUtil.checkFileSize(file.getSize(), 2, "M")) {
+                    throw new ServiceException(SystemErrorCode.E901.code(), "图片超过上传限制大小,请上传2M以内图片");
+                }
+            }
+            if (!FileUtil.isAllowUpFile(ext)) {
+                throw new ServiceException(SystemErrorCode.E901.code(), "不允许上传的文件格式,请上传gif,jpg,png,jpeg,mp4,pdf,mov格式文件。");
+            }
+
+            String fileName = file.getOriginalFilename();
+            String newName = UUID.randomUUID().toString() + fileName.substring(fileName.indexOf("."));
+            // 获取当前操作系统
+            String osName = System.getProperties().get("os.name").toString().toLowerCase(Locale.ROOT);
+            String path = "";
+
+            if (osName.startsWith("win")) {
+                path = "D:\\Test\\";
+            } else {
+                path = "/mnt/test";
+            }
+            File saveFile = new File(path + newName);
+            if (!saveFile.getParentFile().exists()) {
+                saveFile.getParentFile().mkdirs();
+            }
+            file.transferTo(saveFile);
+            String path1 = saveFile.getPath();
+
+
+            File inputFile = new File(path1);
+            BufferedImage inputImage = ImageIO.read(inputFile);
+
+            // 创建一个新的缓冲图片
+            BufferedImage outputImage = new BufferedImage(80, 80, inputImage.getType());
+
+            // 绘制并缩放原图片到新图片中
+            outputImage.getGraphics().drawImage(inputImage.getScaledInstance(80, 80, BufferedImage.SCALE_SMOOTH), 0, 0, null);
+
+            // 写入到输出文件
+            String newNameSmall ="small"+ newName ;
+
+            File outputFile = new File(path + newNameSmall);
+            ImageIO.write(outputImage, jpg, outputFile); // 根据原图片格式选择"jpg", "png"等
+
+            File inputFile2 = new File(path + newNameSmall);
+            FileInputStream input2 = new FileInputStream(inputFile2);
+            MultipartFile multipartFile2 = new MockMultipartFile("file", newName, "text/plain", input2);
+            FileDTO fileDTO2 = new FileDTO();
+            fileDTO2.setName(multipartFile2.getOriginalFilename());
+            fileDTO2.setStream(multipartFile2.getInputStream());
+            fileDTO2.setExt(ext);
+            FileVO upload2 = this.fileManager.upload(fileDTO2, scene);
+            upload2.setType("small");
+            inputFile2.delete();
+            inputFile.delete();
+            return  upload2;
+        } else {
+            throw new ResourceNotFoundException("没有文件");
+        }
+    }
 }

+ 0 - 88
module-erp/src/main/java/com/hys/app/controller/erp/goods/GoodsSnController.java

@@ -1,88 +0,0 @@
-package com.hys.app.controller.erp.goods;
-
-import com.hys.app.framework.database.WebPage;
-import com.hys.app.model.erp.dto.*;
-import com.hys.app.model.erp.vo.GoodsSnVO;
-import com.hys.app.model.erp.vo.GoodsVO;
-import com.hys.app.model.support.LogClient;
-import com.hys.app.model.support.validator.annotation.Log;
-import com.hys.app.service.erp.GoodsManager;
-import com.hys.app.service.erp.GoodsSnManager;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import java.util.List;
-
-/**
- * 商品序列号相关api
- *
- * @author 张崧
- * 2023-12-26 15:56:58
- */
-@RestController
-@RequestMapping("/admin/erp/goods/sn")
-@Api(tags = "商品序列号相关api")
-@Validated
-public class GoodsSnController {
-
-    @Autowired
-    private GoodsSnManager goodsSnManager;
-
-    @ApiOperation(value = "分页列表")
-    @GetMapping
-    public WebPage<GoodsSnVO> list(GoodsSnQueryParams queryParams) {
-        return goodsSnManager.list(queryParams);
-    }
-
-
-    @ApiOperation(value = "获取统计数据")
-    @GetMapping("/count")
-    public WebPage<GoodsSnVO> searchCount(GoodsSnQueryParams queryParams) {
-        return goodsSnManager.searchCount(queryParams);
-    }
-
-
-
-
-    @ApiOperation(value = "添加")
-    @PostMapping("/create")
-    @Log(client = LogClient.admin, detail = "新增序列号")
-    public void add(@RequestBody @Valid GoodsSnDTO goodsDTO) {
-        goodsSnManager.add(goodsDTO);
-    }
-
-    @ApiOperation(value = "修改")
-    @PostMapping("/update/{id}")
-    @Log(client = LogClient.admin, detail = "修改id为[${id}]的商品")
-    public void edit(@PathVariable Long id, @RequestBody @Valid GoodsSnDTO goodsDTO) {
-        goodsDTO.setId(id);
-        goodsSnManager.edit(goodsDTO);
-    }
-
-
-    @ApiOperation(value = "批量生成")
-    @PostMapping("/save")
-    @Log(client = LogClient.admin, detail = "批量生成")
-    public void save( @RequestBody @Valid GoodsSnCreateDTO createReq) {
-        goodsSnManager.createMore(createReq);
-    }
-
-
-    @ApiOperation(value = "获取详情")
-    @GetMapping("/info/{id}")
-    public GoodsSnVO getDetail(@PathVariable Long id) {
-        return goodsSnManager.getDetail(id);
-    }
-
-    @ApiOperation(value = "删除")
-    @DeleteMapping("/delete/{id}")
-    @Log(client = LogClient.admin, detail = "删除id为${id}的商品")
-    public void delete(@PathVariable Long id) {
-        goodsSnManager.delete(id);
-    }
-}
-

+ 0 - 43
module-erp/src/main/java/com/hys/app/controller/erp/goods/ProductManagerController.java

@@ -1,43 +0,0 @@
-package com.hys.app.controller.erp.goods;
-
-import com.hys.app.framework.database.WebPage;
-import com.hys.app.model.erp.dto.ProductQueryParams;
-import com.hys.app.model.erp.vo.ProductVO;
-import com.hys.app.service.erp.ProductManager;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * 产品相关API
- *
- * @author 张崧
- * 2023-11-30 16:06:44
- */
-@RestController
-@RequestMapping("/admin/erp/product")
-@Api(tags = "产品相关API")
-@Validated
-public class ProductManagerController {
-
-    @Autowired
-    private ProductManager productManager;
-
-    @ApiOperation(value = "分页列表")
-    @GetMapping
-    public WebPage<ProductVO> list(ProductQueryParams queryParams) {
-        return productManager.list(queryParams);
-    }
-
-    @ApiOperation(value = "查询")
-    @GetMapping("/{id}")
-    public ProductVO getDetail(@PathVariable String id) {
-        return productManager.getDetail(id);
-    }
-}
-

+ 6 - 4
module-erp/src/main/java/com/hys/app/controller/erp/goods/GoodsManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsManagerController.java

@@ -1,5 +1,7 @@
-package com.hys.app.controller.erp.goods;
+package com.hys.app.controller.erp.use;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dto.GoodsDTO;
@@ -87,10 +89,10 @@ public class GoodsManagerController {
 
 
     @ApiOperation(value = "新增入库获取所有的sku信息")
-    @GetMapping("/getSkuByWarehouse")
+    @GetMapping("/getSkuByWarehouse/{wareHouseId}")
     @Log(client = LogClient.admin, detail = "新增入库获取所有的sku信息")
-    public List<ProductVO> getSkuByWarehouse() {
-        return goodsManager.getSkuByWarehouse();
+    public Page<ProductStockVO> getSkuByWarehouse(@PathVariable Long wareHouseId, BaseQueryParam queryParam) {
+        return goodsManager.getSkuByWarehouse( wareHouseId, queryParam);
     }
 
 

+ 62 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsSnController.java

@@ -0,0 +1,62 @@
+package com.hys.app.controller.erp.use;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.model.erp.dos.ProductDO;
+import com.hys.app.model.erp.dto.GoodsSnDTO;
+import com.hys.app.model.erp.dto.GoodsSnQueryParams;
+import com.hys.app.model.erp.vo.GoodsSnVO;
+import com.hys.app.model.erp.vo.ProductVO;
+import com.hys.app.model.support.LogClient;
+import com.hys.app.model.support.validator.annotation.Log;
+import com.hys.app.service.erp.GoodsSnManager;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 商品序列号相关api
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+@RestController
+@RequestMapping("/admin/erp/goods/sn")
+@Api(tags = "商品序列号相关api")
+@Validated
+public class GoodsSnController {
+
+    @Autowired
+    private GoodsSnManager goodsSnManager;
+
+    @ApiOperation(value = "获取所有有sn的sku")
+    @GetMapping("/getSnProduct")
+    public Page<ProductVO> getSnProduct(GoodsSnQueryParams queryParams) {
+        return goodsSnManager.getSnProduct(queryParams);
+    }
+
+    @ApiOperation(value = "添加")
+    @PostMapping("/createSnCode")
+    @Log(client = LogClient.admin, detail = "新增序列号")
+    public void createSnCode(@RequestBody @Valid GoodsSnDTO goodsDTO) {
+        goodsSnManager.createSnCode(goodsDTO);
+    }
+
+
+    @ApiOperation(value = "获取详情")
+    @GetMapping("/getDetail/{id}")
+    public GoodsSnVO getDetail(@PathVariable Long id) {
+        return goodsSnManager.getDetail(id);
+    }
+    @ApiOperation(value = "分页列表")
+    @GetMapping
+    public WebPage<GoodsSnVO> list(GoodsSnQueryParams queryParams) {
+        return goodsSnManager.list(queryParams);
+    }
+}
+

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/returnBack/KdnController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/KdnController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.returnBack;
+package com.hys.app.controller.erp.use;
 
 import com.alibaba.fastjson.JSON;
 import com.hys.app.model.support.LogClient;

+ 17 - 1
module-erp/src/main/java/com/hys/app/controller/erp/sale/OrderController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/OrderController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.sale;
+package com.hys.app.controller.erp.use;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -93,6 +93,7 @@ public class OrderController {
          orderManager.orderSend(orderId);
     }
 
+
     @ApiOperation(value = "已发货分页列表")
     @GetMapping("saleOrder/list")
     public IPage<OrderSendDO> saleOrder(OrderQueryParams queryParams) {
@@ -105,5 +106,20 @@ public class OrderController {
         return orderManager.getSendOrderDetail(id);
     }
 
+
+    @ApiOperation(value = "getOneBySn")
+    @GetMapping("getOneBySn/{sn}")
+    public OrderVO getOneBySn(@PathVariable String sn) {
+        return orderManager.getOneBySn(sn);
+    }
+
+
+    @ApiOperation(value = "延期")
+    @PostMapping("/extension/{orderId}")
+    @Log(client = LogClient.admin, detail = "延期")
+    public void extension(@PathVariable(value = "orderId") Long orderId ,@RequestBody @Valid OrderDTO orderDTO) {
+        orderManager.extension(orderId,orderDTO);
+    }
+
 }
 

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/sale/OrderItemController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/OrderItemController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.sale;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.OrderItemQueryParams;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/sale/OrderReturnItemManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/OrderReturnItemManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.sale;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.OrderReturnItemQueryParams;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/sale/OrderReturnManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/OrderReturnManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.sale;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.OrderReturnQueryParams;

+ 80 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/ProductManagerController.java

@@ -0,0 +1,80 @@
+package com.hys.app.controller.erp.use;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dto.OrderDTO;
+import com.hys.app.model.erp.dto.ProductQueryParams;
+import com.hys.app.model.erp.vo.ProductVO;
+import com.hys.app.service.erp.ProductManager;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 产品相关API
+ *
+ * @author 张崧
+ * 2023-11-30 16:06:44
+ */
+@RestController
+@RequestMapping("/admin/erp/product")
+@Api(tags = "产品相关API")
+@Validated
+public class ProductManagerController {
+
+    @Autowired
+    private ProductManager productManager;
+
+    @ApiOperation(value = "分页列表")
+    @GetMapping
+    public WebPage<ProductVO> list(ProductQueryParams queryParams) {
+        return productManager.list(queryParams);
+    }
+
+    @ApiOperation(value = "查询")
+    @GetMapping("/{id}")
+    public ProductVO getDetail(@PathVariable String id) {
+        return productManager.getDetail(id);
+    }
+
+
+    @ApiOperation(value = "产品分组")
+    @PostMapping("/productGroup")
+    public void productGroup(@RequestBody @Valid ProductGroupDO productGroupDO) {
+         productManager.productGroup(productGroupDO);
+    }
+
+    @ApiOperation(value = "删除产品分组")
+    @PostMapping("/remove/{id}")
+    public void removeProductGroup(@PathVariable(value = "id") Long id) {
+        productManager.removeProductGroup(id);
+    }
+
+
+
+    @PostMapping("/update/{id}")
+    @ApiOperation(value = "修改产品分组")
+    public void updateProductGroup(@PathVariable(value = "id") Long id,@RequestBody @Valid ProductGroupDO productGroupDO) {
+        productManager.updateProductGroup(id,productGroupDO);
+    }
+
+    @ApiOperation(value = "获取产品分组")
+    @GetMapping("/list")
+    public Page<ProductGroupDO> page(ProductQueryParams queryParams) {
+        return productManager.getGroupPage(queryParams);
+    }
+
+
+    @ApiOperation(value = "获取产品分组详情")
+    @GetMapping("/getById/{id}")
+    public ProductGroupDO getById(@PathVariable(value = "id") Long id) {
+        return productManager.getGroupById(id);
+    }
+
+}
+

+ 15 - 4
module-erp/src/main/java/com/hys/app/controller/erp/ScanCodeController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/ScanCodeController.java

@@ -1,10 +1,12 @@
-package com.hys.app.controller.erp;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.EnterpriseDTO;
 import com.hys.app.model.erp.dto.EnterpriseQueryParams;
 import com.hys.app.model.erp.vo.EnterpriseVO;
+import com.hys.app.model.erp.vo.GoodsSnVO;
 import com.hys.app.model.erp.vo.ProductStockVO;
+import com.hys.app.model.erp.vo.ProductVO;
 import com.hys.app.service.erp.EnterpriseManager;
 import com.hys.app.service.erp.ScanCodeManager;
 import io.swagger.annotations.Api;
@@ -25,20 +27,29 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/admin/erp/scancode")
-@Api(tags = "企业API")
+@Api(tags = "扫条形码")
 @Validated
 public class ScanCodeController {
 
     @Autowired
     private ScanCodeManager scanCodeManager;
 
-    @ApiOperation(value = "分页列表")
+    @ApiOperation(value = "扫描订单")
     @GetMapping("/{orderCode}")
     public Map<String, Object> getListByScan(@PathVariable(value = "orderCode") String orderCode) {
         return scanCodeManager.getListByScan(orderCode);
     }
 
+    @ApiOperation(value = "扫描sku")
+    @GetMapping("getProduct/{warehouseId}/{productCode}")
+    public ProductStockVO getProduct(@PathVariable(value = "productCode") String productCode, @PathVariable(value = "warehouseId") Long warehouseId) {
+        return scanCodeManager.getProduct( productCode, warehouseId);
+    }
 
-
+    @ApiOperation(value = "扫描序列号")
+    @GetMapping("getsnCode/{type}/{sku}/{snCode}")
+    public GoodsSnVO getSnCode(@PathVariable(value = "sku") String sku, @PathVariable(value = "snCode") String snCode, @PathVariable(value = "type") String type) {
+        return scanCodeManager.getSnCode( sku, snCode, type);
+    }
 }
 

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/StockDamageReportManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/StockDamageReportManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.StockDamageReportDTO;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/StockInventoryManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/StockInventoryManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.StockInventoryDTO;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/StockTransferManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/StockTransferManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.StockTransferDTO;

+ 2 - 2
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/WarehouseAreaController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseAreaController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.BaseQueryParam;
@@ -65,7 +65,7 @@ public class WarehouseAreaController {
 
     @ApiOperation(value = "库位详情")
     @PostMapping("/info")
-    @Log(client = LogClient.admin, detail = "创建库位信息")
+    @Log(client = LogClient.admin, detail = "查看库位信息")
     public WarehouseAreaVO info(@RequestBody @Valid WarehouseAreaRequest request) {
         return warehouseAreaManager.getDetail(request.getId());
     }

+ 2 - 13
module-erp/src/main/java/com/hys/app/controller/erp/purchase/WarehouseEntryManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseEntryManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.purchase;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dos.WarehouseEntryDO;
@@ -40,29 +40,18 @@ public class WarehouseEntryManagerController {
     private WarehouseEntryManager warehouseEntryManager;
 
 
-    @Autowired
-    private WarehouseAreaManager warehouseAreaManager;
 
     @ApiOperation(value = "分页列表")
     @GetMapping
     public WebPage<WarehouseEntryDO> list(WarehouseEntryQueryParams queryParams) {
         return warehouseEntryManager.list(queryParams);
-
-//        for(WarehouseEntryVO vo:datalist.getData()){
-//            if(!Objects.isNull(vo.getAreaId()) && vo.getAreaId()>0){
-//                WarehouseAreaVO areaVO=warehouseAreaManager.getDetail(vo.getAreaId());
-//                vo.setWarehouseArea(areaVO);
-//            }
-//        }
-//
-//        return datalist;
     }
 
     @ApiOperation(value = "添加")
     @PostMapping
     @Log(client = LogClient.admin, detail = "创建入库单")
     public Long add(@RequestBody @Valid WarehouseEntryDTO warehouseEntryDTO) {
-      return   warehouseEntryManager.add(warehouseEntryDTO);
+        return warehouseEntryManager.add(warehouseEntryDTO);
     }
 
     @ApiOperation(value = "修改")

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/purchase/WarehouseEntryProductManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseEntryProductManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.purchase;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.WareQueryGoodParams;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/basic/WarehouseManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.basic;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.WarehouseQueryParams;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/WarehouseOutItemController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutItemController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dto.WarehouseOutItemQueryParams;

+ 1 - 1
module-erp/src/main/java/com/hys/app/controller/erp/warehouse/WarehouseOutManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/WarehouseOutManagerController.java

@@ -1,4 +1,4 @@
-package com.hys.app.controller.erp.warehouse;
+package com.hys.app.controller.erp.use;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

+ 3 - 4
module-erp/src/main/java/com/hys/app/converter/erp/GoodsSnConverter.java

@@ -1,11 +1,10 @@
 package com.hys.app.converter.erp;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.base.CharacterConstant;
-import com.hys.app.model.erp.dos.GoodsDO;
-import com.hys.app.model.erp.dos.GoodsLabelDO;
-import com.hys.app.model.erp.dos.GoodsLabelRelationDO;
-import com.hys.app.model.erp.dos.GoodsSnDO;
+import com.hys.app.model.erp.dos.*;
 import com.hys.app.model.erp.dto.GoodsDTO;
 import com.hys.app.model.erp.dto.GoodsSnDTO;
 import com.hys.app.model.erp.dto.ProductDTO;

+ 4 - 0
module-erp/src/main/java/com/hys/app/converter/erp/ProductConverter.java

@@ -1,6 +1,8 @@
 package com.hys.app.converter.erp;
 
 import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.ProductDO;
@@ -34,6 +36,8 @@ public interface ProductConverter {
 
     WebPage<ProductVO> convert(WebPage<ProductDO> webPage);
 
+    Page<ProductVO> convert(Page<ProductDO> webPage);
+
     default WebPage<ProductVO> combination(WebPage<ProductDO> webPage, Map<Long, String> categoryNameMap, Map<Long, Integer> stockNumMap) {
         WebPage<ProductVO> page = convert(webPage);
 

+ 1 - 0
module-erp/src/main/java/com/hys/app/framework/security/AdminAccessDecisionManager.java

@@ -44,6 +44,7 @@ public class AdminAccessDecisionManager implements org.springframework.security.
         result = result || matcher.match("/actuator/**", url);
         result = result || matcher.match("/import-tpl/**", url);
         result = result || matcher.match("/admin/erp/kdn/returnBack", url);
+        result = result || matcher.match("/admin/erp/scancode/**", url);
         if (result) {
             return;
         }

+ 25 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/ItemSnCodeMapper.java

@@ -0,0 +1,25 @@
+package com.hys.app.mapper.erp;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.ItemSnCodeDO;
+import com.hys.app.model.erp.dos.WarehouseEntryDO;
+import com.hys.app.model.erp.dto.WarehouseEntryQueryParams;
+import com.hys.app.model.erp.dto.WarehouseEntryStatisticsParam;
+import com.hys.app.model.erp.vo.WarehouseEntryStatistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 入库单的Mapper
+ *
+ * @author 张崧
+ * @since 2023-12-05 11:25:07
+ */
+public interface ItemSnCodeMapper extends BaseMapperX<ItemSnCodeDO> {
+
+}
+

+ 19 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/OrderSendItemMapper.java

@@ -0,0 +1,19 @@
+package com.hys.app.mapper.erp;
+
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.OrderItemDO;
+import com.hys.app.model.erp.dos.OrderSendItemDO;
+import com.hys.app.model.erp.dto.OrderItemQueryParams;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 订单明细 Mapper
+ *
+ * @author 张崧
+ * 2024-01-24 16:39:38
+ */
+@Mapper
+public interface OrderSendItemMapper extends BaseMapperX<OrderSendItemDO> {
+}
+

+ 1 - 1
module-erp/src/main/java/com/hys/app/mapper/goods/GoodsSnMapper.java

@@ -23,7 +23,7 @@ public interface GoodsSnMapper extends BaseMapperX<GoodsSnDO> {
     default WebPage<GoodsSnDO> selectPage(GoodsSnQueryParams params) {
         return lambdaQuery()
                 .likeIfPresent(GoodsSnDO::getSnCode, params.getSnCode())
-                .eqIfPresent(GoodsSnDO::getGoodsId, params.getGoodsId())
+                .eqIfPresent(GoodsSnDO::getStatus, params.getStatus())
                 .orderByDesc(GoodsSnDO::getId)
                 .page(params);
     }

+ 16 - 0
module-erp/src/main/java/com/hys/app/mapper/goods/ProductGroupItemMapper.java

@@ -0,0 +1,16 @@
+package com.hys.app.mapper.goods;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dos.ProductGroupItemDO;
+
+/**
+ * 商品的Mapper
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+public interface ProductGroupItemMapper extends BaseMapperX<ProductGroupItemDO> {
+
+}
+

+ 15 - 0
module-erp/src/main/java/com/hys/app/mapper/goods/ProductGroupMapper.java

@@ -0,0 +1,15 @@
+package com.hys.app.mapper.goods;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+
+/**
+ * 商品的Mapper
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+public interface ProductGroupMapper extends BaseMapperX<ProductGroupDO> {
+
+}
+

+ 3 - 35
module-erp/src/main/java/com/hys/app/model/base/vo/FileVO.java

@@ -2,6 +2,7 @@ package com.hys.app.model.base.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 /**
  * 文件上传返回值封装
@@ -12,6 +13,7 @@ import io.swagger.annotations.ApiModelProperty;
  * 2018年3月19日 下午4:42:51
  */
 @ApiModel
+@Data
 public class FileVO {
     /**
      * 文件名称
@@ -29,39 +31,5 @@ public class FileVO {
     @ApiModelProperty(name = "url", value = "图片地址", required = true)
     private String url;
 
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public String toString() {
-        return "FileVO{" +
-                "name='" + name + '\'' +
-                ", ext='" + ext + '\'' +
-                ", url='" + url + '\'' +
-                '}';
-    }
-
-    public String getExt() {
-        return ext;
-    }
-
-    public void setExt(String ext) {
-        this.ext = ext;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-
+    private String type = "normal";
 }

+ 4 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/AreaStock.java

@@ -1,6 +1,7 @@
 package com.hys.app.model.erp.dos;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
@@ -35,10 +36,13 @@ public class AreaStock implements Serializable {
     @ApiModelProperty(name = "warehouse_id", value = "仓库id")
     private Long productStockId;
 
+    @TableField(exist = false)
     private GoodsDO goodsVO;
 
+    @TableField(exist = false)
     private ProductDO productVO;
 
+    @TableField(exist = false)
     private ProductStockDO productStockVO;
 
 }

+ 3 - 211
module-erp/src/main/java/com/hys/app/model/erp/dos/ChangeFormProduct.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Objects;
@@ -16,6 +17,7 @@ import java.util.Objects;
  */
 @TableName("es_change_form_product")
 @ApiModel
+@Data
 public class ChangeFormProduct implements Serializable {
 
     private static final long serialVersionUID = -4237870341806191017L;
@@ -45,7 +47,7 @@ public class ChangeFormProduct implements Serializable {
      * 入库单明细id
      */
     @ApiModelProperty(name = "stock_item_id", value = "入库单明细id")
-    private String stockItemId;
+    private Long stockItemId;
     /**
      * 入库批次ID
      */
@@ -116,214 +118,4 @@ public class ChangeFormProduct implements Serializable {
      */
     @ApiModelProperty(name = "type", value = "产品类型 0:退货,1:换货")
     private Integer type;
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public Long getChangeId() {
-        return changeId;
-    }
-
-    public void setChangeId(Long changeId) {
-        this.changeId = changeId;
-    }
-
-    public Long getStockId() {
-        return stockId;
-    }
-
-    public void setStockId(Long stockId) {
-        this.stockId = stockId;
-    }
-
-    public String getStockSn() {
-        return stockSn;
-    }
-
-    public void setStockSn(String stockSn) {
-        this.stockSn = stockSn;
-    }
-
-    public String getStockItemId() {
-        return stockItemId;
-    }
-
-    public void setStockItemId(String stockItemId) {
-        this.stockItemId = stockItemId;
-    }
-
-    public Long getStockBatchId() {
-        return stockBatchId;
-    }
-
-    public void setStockBatchId(Long stockBatchId) {
-        this.stockBatchId = stockBatchId;
-    }
-
-    public String getStockBatchSn() {
-        return stockBatchSn;
-    }
-
-    public void setStockBatchSn(String stockBatchSn) {
-        this.stockBatchSn = stockBatchSn;
-    }
-
-    public Long getGoodsId() {
-        return goodsId;
-    }
-
-    public void setGoodsId(Long goodsId) {
-        this.goodsId = goodsId;
-    }
-
-    public Long getProductId() {
-        return productId;
-    }
-
-    public void setProductId(Long productId) {
-        this.productId = productId;
-    }
-
-    public String getProductName() {
-        return productName;
-    }
-
-    public void setProductName(String productName) {
-        this.productName = productName;
-    }
-
-    public String getProductSn() {
-        return productSn;
-    }
-
-    public void setProductSn(String productSn) {
-        this.productSn = productSn;
-    }
-
-    public String getSpecification() {
-        return specification;
-    }
-
-    public void setSpecification(String specification) {
-        this.specification = specification;
-    }
-
-    public Long getCategoryId() {
-        return categoryId;
-    }
-
-    public void setCategoryId(Long categoryId) {
-        this.categoryId = categoryId;
-    }
-
-    public String getCategoryName() {
-        return categoryName;
-    }
-
-    public void setCategoryName(String categoryName) {
-        this.categoryName = categoryName;
-    }
-
-    public String getUnit() {
-        return unit;
-    }
-
-    public void setUnit(String unit) {
-        this.unit = unit;
-    }
-
-    public Integer getNum() {
-        return num;
-    }
-
-    public void setNum(Integer num) {
-        this.num = num;
-    }
-
-    public Double getAmount() {
-        return amount;
-    }
-
-    public void setAmount(Double amount) {
-        this.amount = amount;
-    }
-
-    public Double getCostPrice() {
-        return costPrice;
-    }
-
-    public void setCostPrice(Double costPrice) {
-        this.costPrice = costPrice;
-    }
-
-    public Integer getType() {
-        return type;
-    }
-
-    public void setType(Integer type) {
-        this.type = type;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ChangeFormProduct that = (ChangeFormProduct) o;
-        return Objects.equals(id, that.id) &&
-                Objects.equals(changeId, that.changeId) &&
-                Objects.equals(stockId, that.stockId) &&
-                Objects.equals(stockSn, that.stockSn) &&
-                Objects.equals(stockBatchId, that.stockBatchId) &&
-                Objects.equals(stockBatchSn, that.stockBatchSn) &&
-                Objects.equals(goodsId, that.goodsId) &&
-                Objects.equals(productId, that.productId) &&
-                Objects.equals(productName, that.productName) &&
-                Objects.equals(productSn, that.productSn) &&
-                Objects.equals(specification, that.specification) &&
-                Objects.equals(categoryId, that.categoryId) &&
-                Objects.equals(categoryName, that.categoryName) &&
-                Objects.equals(unit, that.unit) &&
-                Objects.equals(num, that.num) &&
-                Objects.equals(amount, that.amount) &&
-                Objects.equals(costPrice, that.costPrice) &&
-                Objects.equals(type, that.type);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, changeId, stockId, stockSn, stockBatchId, stockBatchSn, goodsId, productId, productName, productSn, specification, categoryId, categoryName, unit, num, amount, costPrice, type);
-    }
-
-    @Override
-    public String toString() {
-        return "ChangeFormProduct{" +
-                "id=" + id +
-                ", changeId=" + changeId +
-                ", stockId='" + stockId + '\'' +
-                ", stockSn='" + stockSn + '\'' +
-                ", stockBatchId=" + stockBatchId +
-                ", stockBatchSn='" + stockBatchSn + '\'' +
-                ", goodsId=" + goodsId +
-                ", productId=" + productId +
-                ", productName='" + productName + '\'' +
-                ", productSn='" + productSn + '\'' +
-                ", specification='" + specification + '\'' +
-                ", categoryId=" + categoryId +
-                ", categoryName='" + categoryName + '\'' +
-                ", unit='" + unit + '\'' +
-                ", num=" + num +
-                ", amount=" + amount +
-                ", costPrice=" + costPrice +
-                ", type=" + type +
-                '}';
-    }
 }

+ 0 - 9
module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsDO.java

@@ -36,49 +36,40 @@ public class GoodsDO extends BaseDO {
     private Long id;
 
     @ApiModelProperty(name = "imageList", value = "商品相册")
-    @NotEmpty(message = "出租商品  售卖商品")
     private String hireOrSail;
 
     @ApiModelProperty(name = "name", value = "商品名称")
-    @NotBlank(message = "商品名称不能为空")
     private String name;
 
     @ApiModelProperty(name = "enName", value = "商品英文名称")
     private String en_name;
 
     @ApiModelProperty(name = "sn", value = "商品编号")
-    @NotBlank(message = "商品编号不能为空")
     private String sn;
 
     @ApiModelProperty(name = "categoryId", value = "商品分类id")
-    @NotNull(message = "商品分类id不能为空")
     private Long categoryId;
 
     @ApiModelProperty(name = "brandId", value = "品牌id")
     private Long brandId;
 
     @ApiModelProperty(name = "marketEnable", value = "是否上架 true上架")
-    @NotNull(message = "状态不能为空")
     private Boolean marketEnable;
 
 
     @ApiModelProperty(name = "goodsUnit", value = "商品单位")
-    @NotBlank(message = "商品单位不能为空")
     private String goodsUnit;
 
     @ApiModelProperty(name = "allowSn", value = "是否启用序列号1是2否")
-    @NotNull(message = "是否启用序列号1是2否")
     private Integer allowSn;
 
     @ApiModelProperty(name = "imageList", value = "商品相册")
-    @NotEmpty(message = "商品图片不能为空")
     private String images;
 
     @ApiModelProperty(name = "video", value = "商品视频")
     private String video;
 
     @ApiModelProperty(name = "haveSpec", value = "是否有规格")
-    @NotNull(message = "是否有规格不能为空 1有规格  0无规格")
     private Boolean spec;
 
     @ApiModelProperty(name = "description", value = "商品详情")

+ 17 - 6
module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsSnDO.java

@@ -1,10 +1,12 @@
 package com.hys.app.model.erp.dos;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import com.hys.app.model.erp.dto.ProductDTO;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -29,19 +31,28 @@ public class GoodsSnDO extends BaseDO {
     @ApiModelProperty(name = "id", value = "序列号id")
     private Long id;
 
-
     @ApiModelProperty(name = "goods_id", value = "商品id")
     private Long goodsId;
 
-    @ApiModelProperty(name = "sn_code", value = "序列号")
-    private String snCode;
+    @ApiModelProperty(name = "product_id", value = "商品id")
+    private Long productId;
 
+    @ApiModelProperty(name = "sku", value = "sku")
+    private String sku;
 
-    @ApiModelProperty(name = "create_time", value = "创建时间")
-    private Long createTime;
+    @ApiModelProperty(name = "sn_code", value = "序列号")
+    private String snCode;
 
     @ApiModelProperty(name = "status", value = "状态")
-    private String status;
+    private SnCodeStatusEnum status = SnCodeStatusEnum.NOT_USED;
+
+    @ApiModelProperty(name = "entry_house_id", value = "入库单id")
+    private Long entryHouseId;
 
+    @ApiModelProperty(name = "out_house_id", value = "出库单id")
+    private Long outHouseId;
 
+    @ApiModelProperty(name = "item_id", value = "子项ID")
+    @TableField(exist = false)
+    private Long itemId;
 }

+ 45 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/ItemSnCodeDO.java

@@ -0,0 +1,45 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import com.hys.app.model.erp.enums.WarehouseEntryStatusEnum;
+import com.hys.app.model.erp.enums.WarehouseEntyrTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+
+/**
+ * 入库单实体类
+ *
+ * @author 张崧
+ * @since 2023-12-05 11:25:07
+ */
+@TableName("erp_item_sn_code")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ItemSnCodeDO extends BaseDO {
+
+    private static final long serialVersionUID = 1L;
+    
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(hidden = true)
+    private Long id;
+
+    @ApiModelProperty(name = "entryOutHouseId", value = "主表id")
+    private Long entryOutHouseId;
+
+    @ApiModelProperty(name = "itemId", value = "子表id")
+    private Long itemId;
+
+    @ApiModelProperty(name = "snCodeId", value = "sncode")
+    private Long snCodeId;
+
+    @ApiModelProperty(name = "supplier_id", value = "入库出库类型  入库In出库out")
+    private String type;
+
+}

+ 4 - 162
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderDO.java

@@ -173,174 +173,16 @@ public class OrderDO extends BaseDO {
     @ApiModelProperty(name = "start_time", value = "结束时间")
     private String hasSubmit;
 
-
-    @ApiModelProperty(value = "门店业务类型 1:商家门店  2:个人即时配")
-    private Integer storeBusinessType = 2;
-
-    @ApiModelProperty(value = "1、storeCode平台门店编码(商家自定义门店编码,唯一),个人即时配编码固定传storeCode;2、merchantCode快递鸟门店编码(商家门店编码映射KDN门店编码)个人即时配编码固传merchantCode”;3、平台门店编码和快递鸟门店编码必填一项,且两者只能同时填一项。")
-    private String storeCode;
-
-    @ApiModelProperty(value = "(商家门店编码映射KDN门店编码)个人即时配编码固传merchantCode”;3、平台门店编码和快递鸟门店编码必填一项,且两者只能同时填一项。")
-    private String merchantCode = "merchantCode";
-
-    @ApiModelProperty(value = "商户名称")
-    private String merchantName = "上海瑞赢旷视科技";
-
-    @ApiModelProperty(value = "产品类型编码,默认:B")
-    private String productTypeCode = "B";
-
-    @ApiModelProperty(value = "即时配编码,多个即时配编码用逗号分隔。")
-    private String intraCode = "SFTC,";
-
-    @ApiModelProperty(value = "预约类型0:立即单、1:预约上门单")
-    private Integer appointmentType;
-
-    @ApiModelProperty(value = "预约上门单必填预约上门时间格式:YYYY-MM-DD  hh:mm:ss说明:当前时间+2小时,10分钟间隔向上取整。")
-//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private String appointmentTime;
-
-    @ApiModelProperty(value = "交通方式,默认0:未指定。指定交通方式会产生额外的费用。暂不支持")
-    private Integer travelWay = 0;
-
-    @ApiModelProperty(value = "下单类型1:帮我送 、2:帮我取;默认1")
-    private Integer deliveryType;
-
-    @ApiModelProperty(value = "坐标类型1:百度地图、 2:高德地图 、3:腾讯地图")
-    private Integer lbsType = 2;
-
-    @ApiModelProperty(value = "物品类型")
-    private String goodsType;
-
-    @ApiModelProperty(value = "物品数量1-99的整数")
-    private Integer goodsNum;
-
-    @ApiModelProperty(value = "物品总重量单位kg")
-    private Double totalWeight;
-
-    @ApiModelProperty(value = "物品总体积,单位立方厘米")
-    private Double totalVolume;
-
-    @ApiModelProperty(value = "物品声明价值,单位:元。去尾法,保留两位小数。所有物品总计声明价值。")
-    private Double declaredValue;
-
-    @ApiModelProperty(value = "是否保价  1:是 0:否 暂不支持保价,默认传0")
-    private Integer insured = 0;
-
-    @ApiModelProperty(value = "丢破损保障费用,单位:元。去尾法,保留两位小数。根据声明价值计算需要支付的保障用。暂不支持,默认传0")
-    private Double insuranceFee = 0.0;
-
-    @ApiModelProperty(value = "下单人姓名")
-    private String orderName;
-
-    @ApiModelProperty(value = "下单人手机号(下单人手机号和下单人座机二选一必填)")
-    private String orderMobile;
-
-    @ApiModelProperty(value = "下单人座机号(下单人手机号和下单人座机二选一必填)")
-    private String orderPhone;
-
-
-    @ApiModelProperty(value = "商家订单号 全局唯一")
-    private String orderCode;
-
-
-    @ApiModelProperty(name = "receiver_province_name", value = "收货人省")
-    private String receiverProvinceName;
-
-    @ApiModelProperty(name = "receiver_city_name", value = "收货人市")
-    private String receiverCityName;
-
-    @ApiModelProperty(name = "receiver_area_name", value = "收货人县")
-    private String receiverAreaName;
-
-    @ApiModelProperty(name = "receiver_address", value = "收货人地址")
-    private String receiverAddress;
-
-    @ApiModelProperty(name = "receiver_name", value = "收货人姓名")
-    private String receiverName;
-
-    @ApiModelProperty(name = "receiver_phone", value = "收货人电话")
-    private String receiverPhone;
-
-    @ApiModelProperty(name = "receiver_mobile", value = "收货人座机")
-    private String receiverMobile;
-
-    @ApiModelProperty(name = "receiver_latitude", value = "收货人纬度")
-    private String receiverLatitude;
-
-    @ApiModelProperty(name = "receiver_longitude", value = "收货人经度")
-    private String receiverLongitude;
-
-    @ApiModelProperty(name = "sender_province_name", value = "发货人省")
-    private String senderProvinceName;
-
-    @ApiModelProperty(name = "sender_city_name", value = "发货人市")
-    private String senderCityName;
-
-    @ApiModelProperty(name = "sender_area_name", value = "发货人县")
-    private String senderAreaName;
-
-    @ApiModelProperty(name = "sender_address", value = "发货人地址")
-    private String senderAddress;
-
-    @ApiModelProperty(name = "sender_name", value = "发货人姓名")
-    private String senderName;
-
-    @ApiModelProperty(name = "goods_list", value = "货物信息,最大数量50")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private List<KdGood> goodsList;
-
-    @ApiModelProperty(name = "sender_mobile", value = "发货人座机")
-    private String senderMobile;
-
-    @ApiModelProperty(name = "sender_phone", value = "发货人电话")
-    private String senderPhone;
-
-    @ApiModelProperty(name = "sender_latitude", value = "发货人纬度")
-    private String senderLatitude;
-
-    @ApiModelProperty(name = "sender_longitude", value = "发货人经度")
-    private String senderLongitude;
-
-    @ApiModelProperty(name = "kdn_order_code", value = "快递鸟单号")
-    private String kdnOrderCode;
-
     private String sendAddress;
 
     private String receiveAddress;
 
-    @ApiModelProperty(name = "kdn_order_code", value = "快递鸟下单失败 0")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map createOrderFail;
-
-
-    @ApiModelProperty(name = "kdn_order_code", value = "待接单状态 1")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map createOrderSuccess;
-
-    @ApiModelProperty(name = "kdn_order_code", value = "业务员接单状态 2")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map userTakeOrder;
+    @ApiModelProperty(name = "subtract_stock", value = "是否允许负库存")
+    private Boolean subtractStock;
 
-    @ApiModelProperty(name = "kdn_order_code", value = "业务员到达状态 3")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map userArrives;
 
-    @ApiModelProperty(name = "kdn_order_code", value = "业务员配送中 4")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map userSending;
-
-    @ApiModelProperty(name = "kdn_order_code", value = "订单费用 5")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map orderFee;
-
-    @ApiModelProperty(name = "kdn_order_code", value = "签收 6")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map signIn;
-
-    @ApiModelProperty(name = "kdn_order_code", value = "取消状态  0")
-    @TableField(typeHandler = FastjsonTypeHandler.class)
-    private Map cancelOrderKdn;
+    @ApiModelProperty(name = "extension", value = "延期次数")
+    private Integer  extension;
 
 
 }

+ 8 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderItemDO.java

@@ -3,10 +3,13 @@ package com.hys.app.model.erp.dos;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 订单明细 DO
@@ -108,4 +111,9 @@ public class OrderItemDO implements Serializable {
     @ApiModelProperty(name = "product_stock_id", value = "商品库存id")
     private Long productStockId;
 
+    @ApiModelProperty(name = "end_time", value = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
 }

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderReturnItemDO.java

@@ -35,7 +35,7 @@ public class OrderReturnItemDO implements Serializable {
     private String warehouseEntrySn;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "warehouse_entry_batch_id", value = "入库批次id")
     private Long warehouseEntryBatchId;

+ 2 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendDO.java

@@ -8,6 +8,7 @@ import com.hys.app.model.erp.enums.OrderTypeEnum;
 import com.hys.app.model.erp.enums.SaleOrderSendStatusEnum;
 import com.hys.app.model.erp.enums.SaleOrderStatusEnum;
 import com.hys.app.model.erp.vo.OrderItemVO;
+import com.hys.app.model.erp.vo.OrderSendItemVO;
 import com.hys.app.service.kuaidiniao.entity.KdGood;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -241,6 +242,6 @@ public class OrderSendDO extends BaseDO {
     private OrderDO orderVo;
 
     @TableField(exist = false)
-    private List<OrderItemVO> orderItemVOS;
+    private List<OrderSendItemVO> orderItemVOS;
 
 }

+ 53 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/OrderSendItemDO.java

@@ -0,0 +1,53 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 订单明细 DO
+ *
+ * @author 张崧
+ * 2024-01-24 16:39:38
+ */
+@TableName("erp_order_send_item")
+@Data
+public class OrderSendItemDO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(name = "send_order_id", value = "订单id")
+    private Long sendOrderId;
+
+    @ApiModelProperty(name = "order_id", value = "订单id")
+    private Long orderId;
+
+    @ApiModelProperty(name = "goods_id", value = "商品id")
+    private Long goodsId;
+
+    @ApiModelProperty(name = "product_id", value = "产品id")
+    private Long productId;
+
+    @ApiModelProperty(name = "num", value = "销售数量")
+    private Integer num;
+
+    @ApiModelProperty(name = "pay_price", value = "应付金额(总)")
+    private Double payPrice;
+
+    @ApiModelProperty(name = "pay_price", value = "应付金额(总)")
+    private Long productStockId;
+
+    @ApiModelProperty(name = "remark", value = "备注")
+    private String remark;
+
+}

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/ProductDO.java

@@ -116,6 +116,9 @@ public class ProductDO extends BaseDO {
     @ApiModelProperty(name = "spec_value", value = "规格值")
     private String specValue;
 
+    @ApiModelProperty(name = "是否有序列号", value = "商品视频")
+    private Boolean haveSn;
+
     /**
      * 解决JacksonTypeHandler反序列化问题
      */

+ 35 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/ProductGroupDO.java

@@ -0,0 +1,35 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+/**
+ * 订单 DO
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:30
+ */
+@TableName(value = "erp_product_group", autoResultMap = true)
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ProductGroupDO extends BaseDO {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    private String name;
+
+    private String remark;
+
+    @TableField(exist = false)
+    List<ProductGroupItemDO> itemDOList;
+
+}

+ 41 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/ProductGroupItemDO.java

@@ -0,0 +1,41 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 订单 DO
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:30
+ */
+@TableName(value = "erp_product_group_item", autoResultMap = true)
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ProductGroupItemDO extends BaseDO {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    private Long groupId;
+
+    private Long productId;
+
+    private Long goodsId;
+
+    @TableField(exist = false)
+    private ProductDO productVO;
+
+    @TableField(exist = false)
+    private GoodsDO goodsVO;
+
+}

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/ProductStockDO.java

@@ -27,7 +27,7 @@ public class ProductStockDO implements Serializable  {
 
     @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(name = "id",value = "id")
-    private String id;
+    private Long id;
 
     @ApiModelProperty(name = "warehouse_id", value = "仓库id")
     private Long warehouseId;

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/StockTransferDO.java

@@ -37,7 +37,7 @@ public class StockTransferDO extends BaseDO {
     private String sn;
 
     @ApiModelProperty(name = "status", value = "状态")
-    private TransferTypeEnum status = TransferTypeEnum.HAS_TRANSFER;
+    private TransferTypeEnum status = TransferTypeEnum.NOT_TRANSFER;
 
     @ApiModelProperty(name = "out_dept_id", value = "调出方部门id")
     private Long outDeptId;

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/StockTransferProductDO.java

@@ -37,7 +37,7 @@ public class StockTransferProductDO implements Serializable {
     private String warehouseEntrySn;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "warehouse_entry_batch_id", value = "入库批次id")
     private Long warehouseEntryBatchId;

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/SupplierReturnItemDO.java

@@ -29,7 +29,7 @@ public class SupplierReturnItemDO implements Serializable {
     private Long supplierReturnId;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "warehouse_entry_batch_id", value = "批次id")
     private Long warehouseEntryBatchId;

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/SupplierSettlementItemDO.java

@@ -35,7 +35,7 @@ public class SupplierSettlementItemDO implements Serializable {
     private String warehouseEntrySn;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "goods_id", value = "商品id")
     private Long goodsId;

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryBatchDO.java

@@ -36,7 +36,7 @@ public class WarehouseEntryBatchDO extends BaseDO {
     private String warehouseEntrySn;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "sn", value = "批次编号")
     private String sn;

+ 12 - 2
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryDO.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import com.hys.app.model.erp.enums.OrderTypeEnum;
+import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
 import com.hys.app.model.erp.enums.WarehouseEntryStatusEnum;
 import com.hys.app.model.erp.enums.WarehouseEntyrTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
@@ -42,7 +44,13 @@ public class WarehouseEntryDO extends BaseDO {
 
 
     @ApiModelProperty(name = "order_id", value = "入库订单id")
-    private String orderId;
+    private Long orderId;
+
+    @ApiModelProperty(name = "scan_order_type", value = "单子的类型,扫码订单打出来的数据必传")
+    private OrderTypeEnum scanOrderType;
+
+    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
+    private String scanOrderSn;
 
 
     @ApiModelProperty(name = "type", value = "入库类型")
@@ -118,6 +126,8 @@ public class WarehouseEntryDO extends BaseDO {
     private Long supplierSettlementId;
 
     @ApiModelProperty(name = "has_submit", value = "是否已经入库")
-    private String hasSubmit;
+    private String hasSubmit = "N";
+
+
 
 }

+ 26 - 3
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryProductDO.java

@@ -4,10 +4,17 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.hys.app.model.erp.dto.ProductSpec;
+import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
+import com.hys.app.service.kuaidiniao.entity.KdGood;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 
 /**
@@ -24,7 +31,7 @@ public class WarehouseEntryProductDO implements Serializable {
 
     @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(hidden = true)
-    private String id;
+    private Long id;
 
     @ApiModelProperty(name = "warehouse_entry_id", value = "入库单id")
     @TableField("warehouse_entry_id")
@@ -69,6 +76,10 @@ public class WarehouseEntryProductDO implements Serializable {
     @ApiModelProperty(name = "contract_price", value = "合同单价")
     private Double contractPrice;
 
+    @ApiModelProperty(name = "sn_code_list", value = "货物信息,最大数量50")
+    @TableField(exist = false)
+    private List<GoodsSnDO> snCodeList;
+
     @ApiModelProperty(name = "total_price", value = "入库总价")
     private Double totalPrice;
 
@@ -83,11 +94,11 @@ public class WarehouseEntryProductDO implements Serializable {
 
     @ApiModelProperty(name = "商品")
     @TableField(exist = false)
-    private GoodsDO goodsVO ;
+    private GoodsDO goodsVO;
 
     @ApiModelProperty(name = "sku信息")
     @TableField(exist = false)
-    private ProductDO productVO ;
+    private ProductDO productVO;
 
     @ApiModelProperty(name = "usable_stock", value = "可用库存")
     @TableField(exist = false)
@@ -95,4 +106,16 @@ public class WarehouseEntryProductDO implements Serializable {
 
     @ApiModelProperty(name = "product_stock_id", value = "商品库存id")
     private Long productStockId;
+
+    @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
+    private Long scanOrderId;
+
+    @ApiModelProperty(name = "scan_order_item_id", value = "订单项id,扫码订单打出来的数据必传")
+    private Long scanOrderItemId;
+
+    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
+    private String scanOrderSn;
+
+    @ApiModelProperty(name = "scan_order_type", value = "扫码的单号,扫码订单打出来的数据必传")
+    private ScanFormCodeTypeEnum scanOrderType;
 }

+ 4 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutDO.java

@@ -77,6 +77,9 @@ public class WarehouseOutDO extends BaseDO {
     @ApiModelProperty(name = "order_id_list", value = "发货单id")
     private Long orderIdList;
 
+    @ApiModelProperty(name = "order_id", value = "订单id")
+    private Long orderId;
+
     @ApiModelProperty(name = "order_sn_list", value = "订单编号集合")
     @TableField(typeHandler = StringListTypeHandler.class)
     private List<String> orderSnList;
@@ -127,7 +130,7 @@ public class WarehouseOutDO extends BaseDO {
     private String notes;
 
     @ApiModelProperty(name = "has_submit", value = "是否已经入库")
-    private String hasSubmit;
+    private String hasSubmit = "N";
 
     @ApiModelProperty(name = "type", value = "出库类型")
     private WarehouseOutTypeEnum type;

+ 11 - 5
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutItemDO.java

@@ -1,6 +1,7 @@
 package com.hys.app.model.erp.dos;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
@@ -8,6 +9,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 
 /**
@@ -36,7 +38,7 @@ public class WarehouseOutItemDO implements Serializable {
     private String warehouseEntrySn;
 
     @ApiModelProperty(name = "warehouse_entry_item_id", value = "入库单明细id")
-    private String warehouseEntryItemId;
+    private Long warehouseEntryItemId;
 
     @ApiModelProperty(name = "warehouse_entry_batch_id", value = "入库批次id")
     private Long warehouseEntryBatchId;
@@ -100,16 +102,20 @@ public class WarehouseOutItemDO implements Serializable {
     @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
     private Long scanOrderId;
 
-    @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
-    private Long orderItemId;
+    @ApiModelProperty(name = "scan_order_item_id", value = "订单项id,扫码订单打出来的数据必传")
+    private Long scanOrderItemId;
 
     @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
     private String scanOrderSn;
 
     @ApiModelProperty(name = "scan_order_type", value = "扫码的单号,扫码订单打出来的数据必传")
     private ScanFormCodeTypeEnum scanOrderType;
+//
+//    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
+//    private Integer scanDiffNum;
 
-    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
-    private Integer scanDiffNum;
+    @ApiModelProperty(name = "sn_code_list", value = "货物信息,最大数量50")
+    @TableField(exist = false)
+    private List<GoodsSnDO> snCodeList;
 
 }

+ 5 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsDTO.java

@@ -83,6 +83,11 @@ public class GoodsDTO {
     @NotEmpty(message = "商品相册不能为空")
     private List<GoodsGalleryDO> imageList;
 
+
+    @ApiModelProperty(name = "imageList", value = "商品相册")
+    @NotEmpty(message = "商品相册不能为空")
+    private List<GoodsGalleryDO> imageSmall;
+
     @ApiModelProperty(name = "是否有序列号", value = "商品视频")
     private Boolean haveSn;
 }

+ 8 - 13
module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsSnDTO.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.Valid;
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
@@ -21,19 +22,13 @@ import java.util.List;
 @Data
 public class GoodsSnDTO {
 
-    @JsonIgnore
-    @ApiModelProperty(hidden = true)
-    private Long id;
+    @ApiModelProperty(name = "sku_id", value = "skuId")
+    @NotNull(message = "skuId不能为空")
+    private Long productId;
 
-    @ApiModelProperty(name = "sn_code", value = "序列号")
-
-    private String snCode;
-
-    @ApiModelProperty(name = "goods_id", value = "商品id")
-    private Long goodsId;
-
-    @ApiModelProperty(name = "status", value = "状态")
-
-    private String status;
+    @ApiModelProperty(name = "sku_id", value = "skuId")
+    @NotNull(message = "生成数量不能为空")
+    @Min(1)
+    private Integer num;
 }
 

+ 9 - 5
module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsSnQueryParams.java

@@ -1,6 +1,7 @@
 package com.hys.app.model.erp.dto;
 
 import com.hys.app.framework.database.BaseQueryParam;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -18,12 +19,15 @@ import lombok.ToString;
 public class GoodsSnQueryParams extends BaseQueryParam {
 
 
-    @ApiModelProperty(name = "sn_code", value = "序列号")
+    @ApiModelProperty(name = "sn_code", value = "序列号模糊查询")
     private String snCode;
 
-    
-    @ApiModelProperty(name = "goods_id", value = "商品id")
-    private Long goodsId;
-    
+
+    @ApiModelProperty(name = "sku", value = "sku模糊查询")
+    private String sku;
+
+
+    private SnCodeStatusEnum status;
+
 }
 

+ 5 - 3
module-erp/src/main/java/com/hys/app/model/erp/dto/OrderDTO.java

@@ -89,15 +89,15 @@ public class OrderDTO {
 
     @ApiModelProperty(name = "province_city_area_address", value = "支付方式")
     @NotBlank(message = "地址不能为空")
-    private String  provinceCityAreaAddress;
+    private String provinceCityAreaAddress;
 
     @ApiModelProperty(name = "address", value = "支付方式")
     @NotBlank(message = "地址不能为空")
-    private String  address;
+    private String address;
 
     @ApiModelProperty(name = "province_city_area", value = "支付方式")
     @NotBlank(message = "地址不能为空")
-    private String  provinceCityArea;
+    private String provinceCityArea;
 
     @ApiModelProperty(name = "end_time", value = "开始时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -109,6 +109,8 @@ public class OrderDTO {
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date startTime;
 
+    @ApiModelProperty(name = "subtract_stock", value = "是否允许负库存")
+    private Boolean subtractStock;
 
 
 }

+ 8 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/OrderItemDTO.java

@@ -1,14 +1,17 @@
 package com.hys.app.model.erp.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.vo.GoodsVO;
 import com.hys.app.model.erp.vo.ProductVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import java.util.Date;
 
 /**
  * 订单明细 新增|编辑 请求参数
@@ -48,5 +51,10 @@ public class OrderItemDTO {
     @ApiModelProperty(name = "product_stock_id", value = "商品库存id")
     private Long productStockId;
 
+    @ApiModelProperty(name = "end_time", value = "结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
 }
 

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/ProductDTO.java

@@ -63,5 +63,8 @@ public class ProductDTO {
     @ApiModelProperty(name = "weight", value = "规格集合")
     private ProductDO.SpecList specList;
 
+    @ApiModelProperty(name = "是否有序列号", value = "商品视频")
+    private Boolean haveSn;
+
 }
 

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/StockDamageReportProductDTO.java

@@ -34,6 +34,9 @@ public class StockDamageReportProductDTO implements Serializable {
     @ApiModelProperty(name = "usable_stock", value = "可用库存")
     private Integer usableStock;
 
+    @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
+    private Long productStockId;
+
 
 
 }

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/StockInventoryProductDTO.java

@@ -46,4 +46,7 @@ public class StockInventoryProductDTO implements Serializable {
 
     @ApiModelProperty(name = "usable_stock", value = "可用库存")
     private Integer usableStock;
+
+    @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
+    private Long productStockId;
 }

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/StockTransferProductDTO.java

@@ -29,6 +29,9 @@ public class StockTransferProductDTO {
     @Min(value = 1, message = "调拨数量最小为1")
     private Integer useAbleNum;
 
+    @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
+    private Long productStockId;
+
     
 }
 

+ 1 - 1
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseAreaRequest.java

@@ -14,7 +14,7 @@ import lombok.ToString;
 @ToString(callSuper = true)
 public class WarehouseAreaRequest {
 
-    @ApiModelProperty(name = "id", value = "库id")
+    @ApiModelProperty(name = "id", value = "库id")
     private Long id;
 
     

+ 8 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryDTO.java

@@ -5,6 +5,8 @@ import com.hys.app.model.erp.dos.ProcurementContractProduct;
 import com.hys.app.model.erp.dos.ProcurementPlan;
 import com.hys.app.model.erp.dos.SupplierDO;
 import com.hys.app.model.erp.dos.WarehouseDO;
+import com.hys.app.model.erp.enums.OrderTypeEnum;
+import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
 import com.hys.app.model.erp.enums.WarehouseEntyrTypeEnum;
 import com.hys.app.model.erp.vo.AdminUserVO1;
 import com.hys.app.model.system.dos.AdminUser;
@@ -42,6 +44,12 @@ public class WarehouseEntryDTO {
     @ApiModelProperty(name = "order_id", value = "扫码或者选择的单子ID")
     private Long orderId;
 
+    @ApiModelProperty(name = "scan_order_type", value = "单子的类型,扫码订单打出来的数据必传")
+    private OrderTypeEnum scanOrderType;
+
+    @ApiModelProperty(value = "扫描订单的sn")
+    private String scanOrderSn;
+
     @ApiModelProperty(name = "warehouse_id", value = "仓库id")
     @NotNull(message = "仓库不能为空")
     private Long warehouseId;

+ 10 - 5
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryProductDTO.java

@@ -1,11 +1,13 @@
 package com.hys.app.model.erp.dto;
 
+import com.hys.app.model.erp.dos.GoodsSnDO;
 import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * 入库单商品明细新增/编辑DTO
@@ -16,8 +18,8 @@ import javax.validation.constraints.NotNull;
 @Data
 public class WarehouseEntryProductDTO {
 
-    @ApiModelProperty(name = "product_id", value = "商品id")
-    @NotNull(message = "库存id不能为空")
+    @ApiModelProperty(name = "product_id", value = "productId不能为空")
+    @NotNull(message = "productId不能为空")
     private Long productId;
 
     @ApiModelProperty(name = "num", value = "本次入库数量")
@@ -30,17 +32,20 @@ public class WarehouseEntryProductDTO {
     private Long scanOrderId;
 
     @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
-    private Long orderItemId;
+    private Long scanOrderItemId;
 
     @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
     private String scanOrderSn;
 
-    @ApiModelProperty(name = "scan_order_type", value = "扫码的单号,扫码订单打出来的数据必传")
-    private ScanFormCodeTypeEnum scanOrderType;
 
     @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
     private Integer scanDiffNum;
 
+    @ApiModelProperty(name = "scan_iff_num", value = "序列号")
+    List<GoodsSnDO>  snCodeList;
+
+    @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
+    private Long productStockId;
 
 }
 

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutDTO.java

@@ -60,6 +60,9 @@ public class WarehouseOutDTO {
 //    @NotBlank(message = "配送地址")
     private String address;
 
+    @ApiModelProperty(name = "order_id_list", value = "发货单id")
+    private Long orderIdList;
+
 
 }
 

+ 23 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutProductDTO.java

@@ -1,6 +1,8 @@
 package com.hys.app.model.erp.dto;
 
 import com.hys.app.model.erp.dos.GoodsDO;
+import com.hys.app.model.erp.dos.GoodsSnDO;
+import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
 import com.hys.app.model.erp.vo.GoodsVO;
 import com.hys.app.model.erp.vo.ProductVO;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +10,7 @@ import lombok.Data;
 
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * 入库单商品明细新增/编辑DTO
@@ -18,6 +21,8 @@ import javax.validation.constraints.NotNull;
 @Data
 public class WarehouseOutProductDTO {
 
+    private Long id;
+
     @ApiModelProperty(name = "good_id", value = "skuId")
     @NotNull(message = "skuId不能为空")
     private Long productId;
@@ -41,5 +46,23 @@ public class WarehouseOutProductDTO {
     @ApiModelProperty(name = "good_id", value = "商品id")
     private Long goodsId;
 
+    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
+    List<GoodsSnDO> snCodeList;
+
+    @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
+    private Long scanOrderId;
+
+    @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
+    private Long scanOrderItemId;
+
+    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
+    private String scanOrderSn;
+
+    @ApiModelProperty(name = "scan_order_type", value = "扫码的单号,扫码订单打出来的数据必传")
+    private ScanFormCodeTypeEnum scanOrderType;
+
+    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
+    private Integer scanDiffNum;
+
 }
 

+ 2 - 2
module-erp/src/main/java/com/hys/app/model/erp/enums/ScanFormCodeTypeEnum.java

@@ -11,11 +11,11 @@ import lombok.Getter;
 @Getter
 public enum ScanFormCodeTypeEnum {
 
-    RYKS_FHD("RYKS_FHD", "发货单"),
+//    RYKS_FHD("RYKS_FHD", "发货单"),
     RYKS_DDD("RYKS_DDD", "订单"),
     RYKS_BSD("RYKS_BSD", "报损单"),
     RYKS_PDD("RYKS_PDD", "盘点"),
-    RYKS_THD("RYKS_THD", "退货单"),
+//    RYKS_THD("RYKS_THD", "退货单"),
     RYKS_DBD("RYKS_DBD", "调拨"),
     RYKS_CKD("RYKS_CKD", "出库"),
     RYKS_RKD("RYKS_RKD", "入库");

+ 25 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/SnCodeStatusEnum.java

@@ -0,0 +1,25 @@
+package com.hys.app.model.erp.enums;
+
+import lombok.Getter;
+
+/**
+ * 入库单状态枚举
+ *
+ * @author 张崧
+ * @since 2023-12-05
+ */
+@Getter
+public enum SnCodeStatusEnum {
+
+    NOT_USED("HAS_TRANSFER", "未使用"),
+    IN_WAREHOUSE("HAS_TRANSFER", "已入库"),
+    OUT_WAREHOUSE("ROLLBACK_HANDLE", "已出库");
+
+    private final String value;
+    private final String label;
+
+    SnCodeStatusEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+}

+ 1 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/TransferTypeEnum.java

@@ -11,6 +11,7 @@ import lombok.Getter;
 @Getter
 public enum TransferTypeEnum {
 
+    NOT_TRANSFER("NOT_TRANSFER", "调拨中"),
     HAS_TRANSFER("HAS_TRANSFER", "已调拨"),
     ROLLBACK_HANDLE("ROLLBACK_HANDLE", "已回滚");
 

+ 1 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/WarehouseEntyrTypeEnum.java

@@ -12,6 +12,7 @@ import lombok.Getter;
 public enum WarehouseEntyrTypeEnum {
 
     SALE_ENTRY("SALE_ENTRY", "采购入库"),
+    TRANSFER_ENTRY("TRANSFER_ENTRY", "调拨入库"),
     HAIL_ENTRY("HAIL_ENTRY", "租赁返回"),
     OTHER_ENTRY("OTHER_ENTRY", "其它入库");
 

+ 4 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/WarehouseOutTypeEnum.java

@@ -12,6 +12,8 @@ import lombok.Getter;
 public enum WarehouseOutTypeEnum {
 
     SALE_OUT("SALE_OUT", "销售出库"),
+    TRANSFER_OUT("TRANSFER_OUT", "调拨出库"),
+    DAMAGE_OUT("DAMAGE_OUT", "报损出库"),
     HAIL_OUT("HAIL_OUT", "租赁出库"),
     BORROW_OUT("BORROW_OUT", "借用出库"),
     OTHER_OUT("OTHER_OUT", "其他出库");
@@ -34,4 +36,6 @@ public enum WarehouseOutTypeEnum {
     private final String label;
 
 
+
+
 }

+ 7 - 7
module-erp/src/main/java/com/hys/app/model/erp/vo/GoodsSnVO.java

@@ -1,9 +1,13 @@
 package com.hys.app.model.erp.vo;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.GoodsSnDO;
+import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dto.GoodsDTO;
 import com.hys.app.model.erp.dto.GoodsSnDTO;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
 import com.hys.app.model.goods.dos.GoodsGalleryDO;
 import com.hys.app.model.goods.vo.GoodsParamsGroupVO;
 import io.swagger.annotations.ApiModelProperty;
@@ -25,14 +29,10 @@ import java.util.List;
 public class GoodsSnVO extends GoodsSnDO {
 
     @ApiModelProperty(name = "goodsVO", value = "商品信息")
-    private GoodsVO goodsVO;
-
-
-
-    @ApiModelProperty(name = "qty", value = "商品信息")
-    private Long qty;
-
+    private GoodsDO goodsVO;
 
+    @ApiModelProperty(name = "goodsVO", value = "商品信息")
+    private ProductDO productVO;
 
 }
 

+ 4 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/GoodsVO.java

@@ -31,5 +31,9 @@ public class GoodsVO extends GoodsDO {
     private List<GoodsGalleryDO> imageList;
 
 
+    @ApiModelProperty(name = "imageList", value = "商品图标")
+    private List<GoodsGalleryDO> imageSmallList;
+
+
 }
 

+ 42 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/OrderSendItemVO.java

@@ -0,0 +1,42 @@
+package com.hys.app.model.erp.vo;
+
+import com.hys.app.model.erp.dos.OrderItemDO;
+import com.hys.app.model.erp.dos.OrderSendItemDO;
+import com.hys.app.model.erp.dos.ProductDO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 订单明细详情
+ *
+ * @author 张崧
+ * 2024-01-24 16:39:38
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@ApiModel(value = "发货单明细详情")
+public class OrderSendItemVO extends OrderSendItemDO {
+
+    @ApiModelProperty(name = "goods_id", value = "商品id")
+    @NotNull(message = "商品id不能为空")
+    private Long goodsId;
+
+    @ApiModelProperty(name = "out_num", value = "出库数量")
+    @NotNull(message = "出库数量不能为空")
+    @Min(value = 1, message = "出库数量最小为1")
+    private Integer outNum;
+
+    private GoodsVO goodsVO;
+
+    private ProductDO productVO;
+
+    private Integer useAbleStock;
+}
+

+ 3 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/OrderVO.java

@@ -107,6 +107,9 @@ public class OrderVO extends OrderDO {
     @ApiModelProperty(name = "kdn_order_code", value = "快递鸟单号")
     private String kdnOrderCode;
 
+    @ApiModelProperty(name = "subtract_stock", value = "是否允许负库存")
+    private Boolean subtractStock;
+
 
 }
 

+ 4 - 1
module-erp/src/main/java/com/hys/app/model/erp/vo/ProductStockVO.java

@@ -33,8 +33,11 @@ public class ProductStockVO extends ProductStockDO {
     private ProductVO productVO;
 
     @ApiModelProperty(name = "goods", value = "商品信息")
-    private GoodsVO goodVO;
+    private GoodsVO goodsVO;
 
     private  List<AreaStock> areaStockList;
+
+    @ApiModelProperty(name = "scan_order_item_id", value = "商品信息")
+    private Long scanOrderItemId;
 }
 

+ 22 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryBatchVO.java

@@ -1,5 +1,6 @@
 package com.hys.app.model.erp.vo;
 
+import com.hys.app.model.erp.dos.GoodsSnDO;
 import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dos.WarehouseEntryBatchDO;
 import io.swagger.annotations.ApiModelProperty;
@@ -7,6 +8,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+import java.util.List;
+
 /**
  * 入库批次详情
  *
@@ -20,5 +23,24 @@ public class WarehouseEntryBatchVO extends WarehouseEntryBatchDO {
 
     @ApiModelProperty(name = "product", value = "产品")
     private ProductDO product;
+
+    @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
+    private Long scanOrderId;
+
+    @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
+    private Long scanOrderItemId;
+
+    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
+    private String scanOrderSn;
+
+
+    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
+    private Integer scanDiffNum;
+
+    @ApiModelProperty(name = "scan_iff_num", value = "序列号")
+    List<GoodsSnDO> snCodeList;
+
+    @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
+    private Long productStockId;
 }
 

+ 2 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryProductVO.java

@@ -1,5 +1,6 @@
 package com.hys.app.model.erp.vo;
 
+import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dos.WarehouseEntryProductDO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -22,5 +23,6 @@ public class WarehouseEntryProductVO extends WarehouseEntryProductDO {
 
     @ApiModelProperty(name = "contract_price", value = "合同单价")
     private Double contractPrice;
+
 }
 

+ 0 - 3
module-erp/src/main/java/com/hys/app/model/erp/vo/WarehouseEntryVO.java

@@ -32,8 +32,5 @@ public class WarehouseEntryVO extends WarehouseEntryDO {
     @ApiModelProperty(name = "warehouseArea", value = "批次列表")
     private WarehouseAreaVO warehouseArea;
 
-
-
-
 }
 

+ 3 - 1
module-erp/src/main/java/com/hys/app/service/erp/GoodsManager.java

@@ -1,5 +1,7 @@
 package com.hys.app.service.erp;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseService;
 import com.hys.app.model.erp.dos.GoodsDO;
@@ -82,6 +84,6 @@ public interface GoodsManager extends BaseService<GoodsDO> {
      * @param warehouseId
      * @return
      */
-    List<ProductVO> getSkuByWarehouse();
+    Page<ProductStockVO> getSkuByWarehouse(Long wareHouseId, BaseQueryParam queryParam);
 }
 

+ 18 - 0
module-erp/src/main/java/com/hys/app/service/erp/GoodsSnManager.java

@@ -1,12 +1,16 @@
 package com.hys.app.service.erp;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseService;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.GoodsSnDO;
+import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.vo.GoodsSnVO;
 import com.hys.app.model.erp.vo.GoodsVO;
+import com.hys.app.model.erp.vo.ProductVO;
 
 import java.util.List;
 
@@ -33,5 +37,19 @@ public interface GoodsSnManager extends BaseService<GoodsSnDO> {
     void delete(Long id);
 
 
+    /**
+     * 获取所有有序列号的sku
+     *
+     * @param queryParams
+     * @return
+     */
+    Page<ProductVO> getSnProduct(GoodsSnQueryParams queryParams);
+
+    /**
+     * 根据商品生成序列号
+     *
+     * @param goodsDTO
+     */
+    void createSnCode(GoodsSnDTO goodsDTO);
 }
 

+ 14 - 0
module-erp/src/main/java/com/hys/app/service/erp/ItemSnCodeManager.java

@@ -0,0 +1,14 @@
+package com.hys.app.service.erp;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.ItemSnCodeDO;
+
+/**
+ * 商品业务层接口
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+public interface ItemSnCodeManager extends BaseService<ItemSnCodeDO> {
+}
+

+ 5 - 0
module-erp/src/main/java/com/hys/app/service/erp/OrderManager.java

@@ -100,5 +100,10 @@ public interface OrderManager extends BaseService<OrderDO> {
      * @return
      */
     OrderSendDO getSendOrderDetail(String id);
+
+    OrderVO getOneBySn(String sn);
+
+    void extension(Long orderId, OrderDTO orderDTO);
+
 }
 

+ 23 - 0
module-erp/src/main/java/com/hys/app/service/erp/OrderSendItemManager.java

@@ -0,0 +1,23 @@
+package com.hys.app.service.erp;
+
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.OrderItemDO;
+import com.hys.app.model.erp.dos.OrderSendItemDO;
+import com.hys.app.model.erp.dto.OrderItemQueryParams;
+import com.hys.app.model.erp.vo.OrderItemVO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单明细业务层接口
+ *
+ * @author 张崧
+ * 2024-01-24 16:39:39
+ */
+public interface OrderSendItemManager extends BaseService<OrderSendItemDO> {
+}
+

+ 15 - 0
module-erp/src/main/java/com/hys/app/service/erp/ProductGroupItemManager.java

@@ -0,0 +1,15 @@
+package com.hys.app.service.erp;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dos.ProductGroupItemDO;
+
+/**
+ * 商品业务层接口
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+public interface ProductGroupItemManager extends BaseService<ProductGroupItemDO> {
+}
+

+ 22 - 0
module-erp/src/main/java/com/hys/app/service/erp/ProductGroupManager.java

@@ -0,0 +1,22 @@
+package com.hys.app.service.erp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.database.BaseQueryParam;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.GoodsDO;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dto.GoodsDTO;
+import com.hys.app.model.erp.dto.GoodsQueryParams;
+import com.hys.app.model.erp.vo.GoodsVO;
+import com.hys.app.model.erp.vo.ProductStockVO;
+
+/**
+ * 商品业务层接口
+ *
+ * @author 张崧
+ * 2023-12-26 15:56:58
+ */
+public interface ProductGroupManager extends BaseService<ProductGroupDO> {
+}
+

+ 40 - 2
module-erp/src/main/java/com/hys/app/service/erp/ProductManager.java

@@ -1,9 +1,12 @@
 package com.hys.app.service.erp;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseService;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.ProductDO;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dto.GoodsQueryParams;
 import com.hys.app.model.erp.dto.ProductDTO;
 import com.hys.app.model.erp.dto.ProductQueryParams;
 import com.hys.app.model.erp.vo.ProductVO;
@@ -35,9 +38,8 @@ public interface ProductManager extends BaseService<ProductDO> {
 
     /**
      * 添加
-     *
      */
-    void add(Long id );
+    void add(Long id);
 
     /**
      * 编辑
@@ -61,5 +63,41 @@ public interface ProductManager extends BaseService<ProductDO> {
      * @param goodsIds
      */
     void deleteByGoodsId(List<Long> goodsIds);
+
+    /**
+     * 产品分组
+     *
+     * @param productGroupDO
+     */
+    void productGroup(ProductGroupDO productGroupDO);
+
+    /**
+     * 删除产品分组
+     *
+     * @param id
+     */
+    void removeProductGroup(Long id);
+
+    /**
+     * 修改产品分组
+     *
+     * @param id
+     * @param productGroupDO
+     */
+    void updateProductGroup(Long id, ProductGroupDO productGroupDO);
+
+    /**
+     * 获取产品分组列表
+     * @param queryParams
+     * @return
+     */
+    Page<ProductGroupDO> getGroupPage(ProductQueryParams queryParams);
+
+    /**
+     * 获取产品分组详情
+     * @param id
+     * @return
+     */
+    ProductGroupDO getGroupById(Long id);
 }
 

+ 21 - 0
module-erp/src/main/java/com/hys/app/service/erp/ScanCodeManager.java

@@ -7,7 +7,9 @@ import com.hys.app.model.erp.dos.ProductStockDO;
 import com.hys.app.model.erp.dto.EnterpriseDTO;
 import com.hys.app.model.erp.dto.EnterpriseQueryParams;
 import com.hys.app.model.erp.vo.EnterpriseVO;
+import com.hys.app.model.erp.vo.GoodsSnVO;
 import com.hys.app.model.erp.vo.ProductStockVO;
+import com.hys.app.model.erp.vo.ProductVO;
 
 import java.util.List;
 import java.util.Map;
@@ -28,5 +30,24 @@ public interface ScanCodeManager extends BaseService<ProductStockDO> {
      * @return
      */
     Map<String, Object> getListByScan(String orderCode);
+
+
+    /**
+     * 扫描sku
+     *
+     * @param productCode
+     * @param warehouseId
+     * @return
+     */
+    ProductStockVO getProduct(String productCode, Long warehouseId);
+
+    /**
+     * 扫描序列号
+     *
+     * @param sku
+     * @param snCode
+     * @return
+     */
+    GoodsSnVO getSnCode(String sku, String snCode,String type);
 }
 

+ 1 - 1
module-erp/src/main/java/com/hys/app/service/erp/WarehouseEntryProductManager.java

@@ -96,7 +96,7 @@ public interface WarehouseEntryProductManager extends BaseService<WarehouseEntry
      * @param id
      * @param returnNum
      */
-    void updateReturnNum(String id, Integer returnNum);
+    void updateReturnNum(Long id, Integer returnNum);
 
 }
 

+ 39 - 17
module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsManagerImpl.java

@@ -1,14 +1,19 @@
 package com.hys.app.service.erp.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.converter.erp.GoodsConverter;
+import com.hys.app.converter.erp.ProductStockConverter;
+import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.BeanUtils;
 import com.hys.app.mapper.goods.GoodsMapper;
+import com.hys.app.model.erp.dos.AreaStock;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dos.ProductStockDO;
@@ -29,6 +34,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +52,7 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
     private ProductStockManager productStockManager;
     private ProductManager productManager;
     private GoodsGalleryManager goodsGalleryManager;
+    private ProductStockConverter productStockConverter;
 
     @Override
     public WebPage<GoodsVO> list(GoodsQueryParams queryParams) {
@@ -64,6 +72,9 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         productManager.saveBatch(bean);
         // 保存相册
         this.goodsGalleryManager.add(goodsDTO.getImageList(), goodsDO.getId());
+        //保存图标
+        this.goodsGalleryManager.add(goodsDTO.getImageSmall(), goodsDO.getId()+99);
+
         //初始化库存
         productStockManager.intStock(bean);
         ;
@@ -89,6 +100,8 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         bean.forEach(item -> item.setGoodsId(goodsDTO.getId()));
         productManager.saveBatch(bean);
         goodsGalleryManager.edit(goodsDTO.getImageList(), goodsDTO.getId());
+        //保存图标
+        this.goodsGalleryManager.edit(goodsDTO.getImageSmall(), goodsDTO.getId()+99);
 
         // 发送商品消息
 //        GoodsChangeMessage message = new GoodsChangeMessage(GoodsChangeMessage.GoodsChangeType.Edit, goodsDTO.getId());
@@ -109,6 +122,12 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         if (ObjectUtil.isNotNull(aDo)) {
             throw new ServiceException("商品名称已存在");
         }
+
+        Set<String> collect = goodsDTO.getProductList().stream().map(ProductDTO::getSku).collect(Collectors.toSet());
+        if (collect.size() != goodsDTO.getProductList().size()){
+            throw new ServiceException("sku不能重复");
+        }
+
         for (ProductDTO productDTO : goodsDTO.getProductList()) {
             ProductDO productDO = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
                     .eq(ProductDO::getSku, productDTO.getSku())
@@ -117,12 +136,12 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
             if (ObjectUtil.isNotNull(productDO)) {
                 throw new ServiceException("sku已存在");
             }
-
-            long count = goodsDTO.getProductList().stream().map(ProductDTO::getSku).count();
-            if (count != goodsDTO.getProductList().size()){
-                throw new ServiceException("sku不能重复");
+            //校验sku是否包含中文
+            Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]");
+            Matcher matcher = pattern.matcher(productDTO.getSku());
+            if (matcher.find()){
+                throw new ServiceException("sku不能包含中文");
             }
-
             ProductDO codeOne = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
                     .eq(ProductDO::getBarCode, productDTO.getBarCode())
                     .ne(ObjectUtil.isNotNull(productDTO.getId()), ProductDO::getId, productDTO.getId())
@@ -133,8 +152,6 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         }
     }
 
-
-
     @Override
     public GoodsVO getInfo(Long id) {
         GoodsDO goodsDO = getById(id);
@@ -156,6 +173,9 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         // 商品相册
         List<GoodsGalleryDO> galleryList = goodsGalleryManager.list(goodsDO.getId());
         goodsVO.setImageList(galleryList);
+        // 商品图标
+        List<GoodsGalleryDO> gallerySmallList = goodsGalleryManager.list(goodsDO.getId()+99);
+        goodsVO.setImageSmallList(gallerySmallList);
         return goodsVO;
     }
 
@@ -185,17 +205,19 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
     }
 
     @Override
-    public List<ProductVO> getSkuByWarehouse() {
-        List<ProductDO> productDOS = productManager.list();
-        List<ProductVO> voList = BeanUtils.toBean(productDOS, ProductVO.class);
-        Set<Long> set = productDOS.stream().map(ProductDO::getGoodsId).collect(Collectors.toSet());
-        List<GoodsDO> goodsDOS = this.baseMapper.selectList(new LambdaQueryWrapper<GoodsDO>().in(GoodsDO::getId, set));
-        for (ProductVO vo : voList) {
-            GoodsDO goodsDO = goodsDOS.stream().filter(item -> item.getId().equals(vo.getGoodsId())).findFirst().get();
-            GoodsVO goodsVO = BeanUtil.copyProperties(goodsDO, GoodsVO.class);
-            vo.setGoodsVo(goodsVO);
+    public Page<ProductStockVO> getSkuByWarehouse(Long wareHouseId, BaseQueryParam queryParam) {
+        List<GoodsDO> list = list(new LambdaQueryWrapper<GoodsDO>().eq(GoodsDO::getMarketEnable, true));
+        List<Long> collect = list.stream().map(GoodsDO::getId).collect(Collectors.toList());
+        Page<ProductStockDO> page = new Page<>(queryParam.getPageNo(), queryParam.getPageSize());
+        Page<ProductStockDO> page1 = productStockManager.page(page, new LambdaQueryWrapper<ProductStockDO>()
+                .eq(ObjectUtil.isNotNull(wareHouseId), ProductStockDO::getWarehouseId, wareHouseId)
+                .in(CollUtil.isNotEmpty(collect),ProductStockDO::getGoodsId, collect));
+        Page<ProductStockVO> convert = productStockConverter.convert(page1);
+        for (ProductStockVO record : convert.getRecords()) {
+            record.setGoodsVO(BeanUtil.copyProperties(getById(record.getGoodsId()),GoodsVO.class));
+            record.setProductVO(BeanUtil.copyProperties(productManager.getById(record.getProductId()),ProductVO.class));
         }
-        return voList;
+        return convert;
     }
 }
 

+ 80 - 46
module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsSnManagerImpl.java

@@ -1,25 +1,37 @@
 package com.hys.app.service.erp.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.converter.erp.GoodsConverter;
 import com.hys.app.converter.erp.GoodsSnConverter;
+import com.hys.app.converter.erp.ProductConverter;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.mapper.goods.GoodsSnMapper;
 import com.hys.app.model.erp.dos.GoodsSnDO;
+import com.hys.app.model.erp.dos.ProductDO;
 import com.hys.app.model.erp.dto.GoodsSnCreateDTO;
 import com.hys.app.model.erp.dto.GoodsSnDTO;
 import com.hys.app.model.erp.dto.GoodsSnQueryParams;
 import com.hys.app.model.erp.vo.GoodsSnVO;
 import com.hys.app.model.erp.vo.GoodsVO;
+import com.hys.app.model.erp.vo.ProductVO;
 import com.hys.app.model.goods.enums.GoodsSnStatusEnums;
 import com.hys.app.service.erp.GoodsManager;
 import com.hys.app.service.erp.GoodsSnManager;
+import com.hys.app.service.erp.ProductManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.*;
 
 /**
@@ -36,36 +48,26 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
     @Autowired
     private GoodsManager goodsManager;
+    @Autowired
+    private ProductManager productManager;
 
-
-    @Override
-    public WebPage<GoodsSnVO> list(GoodsSnQueryParams queryParams){
-        WebPage<GoodsSnDO> webPage = baseMapper.selectPage(queryParams);
-        WebPage<GoodsSnVO> webPage1=converter.convert(webPage);
-        for(GoodsSnVO goodsSnVO:webPage1.getData()){
-            GoodsVO goodsVO=goodsManager.getInfo(goodsSnVO.getGoodsId());
-            goodsSnVO.setGoodsVO(goodsVO);
-        }
-
-        return webPage1;
-    }
+    @Autowired
+    private ProductConverter productConverter;
 
     @Override
     public WebPage<GoodsSnVO> searchCount(GoodsSnQueryParams queryParams) {
         List<GoodsSnDO> goodsSnDOS = baseMapper.getGoodsSnCount(queryParams);
 
-        Long totalQty= baseMapper.getGoodsSnCountQty(queryParams);
-        List<GoodsSnVO> goodsSnVOS=converter.convert(goodsSnDOS);
+        Long totalQty = baseMapper.getGoodsSnCountQty(queryParams);
+        List<GoodsSnVO> goodsSnVOS = converter.convert(goodsSnDOS);
 
-        for(GoodsSnVO item:goodsSnVOS){
-            GoodsVO goodsVO=goodsManager.getInfo(item.getGoodsId());
+        for (GoodsSnVO item : goodsSnVOS) {
+            GoodsVO goodsVO = goodsManager.getInfo(item.getGoodsId());
             item.setGoodsVO(goodsVO);
-            GoodsSnQueryParams temp=new GoodsSnQueryParams();
-            temp.setGoodsId(item.getGoodsId());
-            item.setQty(baseMapper.getGoodsSnCountQty(temp));
+            GoodsSnQueryParams temp = new GoodsSnQueryParams();
         }
 
-        WebPage<GoodsSnVO> webPage1=new WebPage<>();
+        WebPage<GoodsSnVO> webPage1 = new WebPage<>();
         webPage1.setData(goodsSnVOS);
         webPage1.setPageNo(queryParams.getPageNo());
         webPage1.setDataTotal(totalQty);
@@ -73,7 +75,6 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
         return webPage1;
     }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void add(GoodsSnDTO goodsSnDTO) {
@@ -83,41 +84,37 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
     }
 
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void createMore(GoodsSnCreateDTO request) {
         // 保存GoodsDO
-        GoodsVO goodsVO=goodsManager.getDetail(request.getGoodsId());
-        if(Objects.isNull(goodsVO)){
+        GoodsVO goodsVO = goodsManager.getDetail(request.getGoodsId());
+        if (Objects.isNull(goodsVO)) {
             throw new ServiceException("商品信息不存在");
         }
-        List<GoodsSnDO> list=new ArrayList<>();
-        for(int i=0;i<request.getQty();i++){
-            GoodsSnDO goodsSnDO=new GoodsSnDO();
+        List<GoodsSnDO> list = new ArrayList<>();
+        for (int i = 0; i < request.getQty(); i++) {
+            GoodsSnDO goodsSnDO = new GoodsSnDO();
             goodsSnDO.setGoodsId(goodsVO.getId());
             goodsSnDO.setSnCode(createGoodsSnCode(goodsVO));
-            goodsSnDO.setStatus(GoodsSnStatusEnums.WAIT.name());
             list.add(goodsSnDO);
         }
         super.saveBatch(list);
     }
-
-
     /**
      * 生成规则:序号号=商品编号+当前生成时间+4位自然序号
      * 注意:单次生成数量不得超过9999
      * 这个规则要改成:序号号=商品编号+规格编码(4位)+当前生成时间+4位自然序号
+     *
      * @param goodsVO
      * @return
      */
-    private static String createGoodsSnCode(GoodsVO goodsVO){
-        SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddHHmmss");
-        Date date =new Date();
+    private static String createGoodsSnCode(GoodsVO goodsVO) {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
+        Date date = new Date();
         Random random = new Random();
-        return goodsVO.getSn()+sf.format(date)+(random.nextInt(9000) + 1000);
+        return goodsVO.getSn() + sf.format(date) + (random.nextInt(9000) + 1000);
     }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void edit(GoodsSnDTO goodsSnDTO) {
@@ -126,24 +123,61 @@ public class GoodsSnManagerImpl extends BaseServiceImpl<GoodsSnMapper, GoodsSnDO
 
         // 更新商品
         GoodsSnDO goodsSnDO = converter.convert(goodsSnDTO);
-        super.updateById(goodsSnDO);  }
-
-    @Override
-    public GoodsSnVO getDetail(Long id) {
-        // 商品
-        GoodsSnDO goodsSnDO = getById(id);
-        GoodsSnVO goodsSnVO= converter.convert(goodsSnDO);
-        GoodsVO goodsVO=goodsManager.getDetail(goodsSnDO.getGoodsId());
-        goodsSnVO.setGoodsVO(goodsVO);
-        return goodsSnVO;
+        super.updateById(goodsSnDO);
     }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void delete(Long id) {
         // 删除商品
         removeById(id);
     }
+    @Override
+    public Page<ProductVO> getSnProduct(GoodsSnQueryParams queryParams) {
+        Page<ProductDO> page = productManager.page(new Page<>(queryParams.getPageNo(), queryParams.getPageSize()), new LambdaQueryWrapper<ProductDO>()
+                .eq(ProductDO::getHaveSn, true)
+                .like(StrUtil.isNotBlank(queryParams.getSku()), ProductDO::getSku, queryParams.getSku()));
+
+        Page<ProductVO> convert = productConverter.convert(page);
+        for (ProductVO record : convert.getRecords()) {
+            record.setGoodsVo(BeanUtil.copyProperties(goodsManager.getById(record.getGoodsId()),GoodsVO.class));
+        }
+        return convert;
+    }
+    @Override
+    public void createSnCode(GoodsSnDTO goodsDTO) {
+        ProductDO byId = productManager.getById(goodsDTO.getProductId());
+        if (ObjectUtil.isNull(byId)) {
+            throw new ServiceException("sku不存在");
+        }
+        List<GoodsSnDO> list = new ArrayList<>();
+        for (Integer num = goodsDTO.getNum(); num > 0; num--) {
+            GoodsSnDO aDo = new GoodsSnDO();
+            aDo.setGoodsId(byId.getGoodsId());
+            aDo.setSku(byId.getSku());
+            aDo.setProductId(goodsDTO.getProductId());
+            aDo.setSnCode(byId.getSku() + DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss") + String.format("%04d", num));
+            list.add(aDo);
+        }
+        saveBatch(list);
+    }
+    @Override
+    public GoodsSnVO getDetail(Long id) {
+        GoodsSnDO goodsSnDO = getById(id);
+        GoodsSnVO goodsSnVO = converter.convert(goodsSnDO);
+        goodsSnVO.setGoodsVO(goodsManager.getById(goodsSnDO.getGoodsId()));
+        goodsSnVO.setProductVO(productManager.getById(goodsSnDO.getProductId()));
+        return goodsSnVO;
+    }
+    @Override
+    public WebPage<GoodsSnVO> list(GoodsSnQueryParams queryParams) {
+        WebPage<GoodsSnDO> webPage = baseMapper.selectPage(queryParams);
+        WebPage<GoodsSnVO> webPage1 = converter.convert(webPage);
+        for (GoodsSnVO goodsSnVO : webPage1.getData()) {
+            goodsSnVO.setGoodsVO(goodsManager.getById(goodsSnVO.getGoodsId()));
+            goodsSnVO.setProductVO(productManager.getById(goodsSnVO.getProductId()));
+        }
 
+        return webPage1;
+    }
 }
 

+ 20 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/ItenSnCodeManagerImpl.java

@@ -0,0 +1,20 @@
+package com.hys.app.service.erp.impl;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.mapper.erp.ItemSnCodeMapper;
+import com.hys.app.model.erp.dos.ItemSnCodeDO;
+import com.hys.app.service.erp.ItemSnCodeManager;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 入库单业务层实现
+ *
+ * @author 张崧
+ * @since 2023-12-05 11:25:07
+ */
+@Service
+@AllArgsConstructor
+public class ItenSnCodeManagerImpl extends BaseServiceImpl<ItemSnCodeMapper, ItemSnCodeDO> implements ItemSnCodeManager {
+}
+

+ 135 - 46
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderManagerImpl.java

@@ -21,10 +21,7 @@ import com.hys.app.model.erp.dto.OrderItemDTO;
 import com.hys.app.model.erp.dto.OrderQueryParams;
 import com.hys.app.model.erp.dto.WarehouseOutShipDTO;
 import com.hys.app.model.erp.enums.*;
-import com.hys.app.model.erp.vo.GoodsVO;
-import com.hys.app.model.erp.vo.OrderItemVO;
-import com.hys.app.model.erp.vo.OrderVO;
-import com.hys.app.model.erp.vo.ProductVO;
+import com.hys.app.model.erp.vo.*;
 import com.hys.app.service.erp.*;
 import com.hys.app.service.kuaidiniao.KuaiDiNiaoService;
 import com.hys.app.service.kuaidiniao.entity.AddressDTO;
@@ -34,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -57,6 +55,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     private WarehouseOutItemManager warehouseOutItemManager;
     private ProductManager productManager;
     private OrderSendManager orderSendManager;
+    private OrderSendItemManager orderSendItemManager;
 
     @Override
     public WebPage<OrderVO> list(OrderQueryParams queryParams) {
@@ -68,7 +67,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     @Transactional(rollbackFor = Exception.class)
     public Long add(OrderDTO orderDTO) {
         if (OrderTypeEnum.TO_C.equals(orderDTO.getType())) {
-            if (ObjectUtil.isNull(orderDTO.getStartTime()) || ObjectUtil.isNull(orderDTO.getEndTime())) {
+            if (ObjectUtil.isNull(orderDTO.getStartTime())) {
                 throw new ServiceException("租用时间不能为空");
             }
         }
@@ -79,18 +78,20 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         // 保存订单项
         List<OrderItemDO> itemList = BeanUtils.toBean(orderDTO.getItemList(), OrderItemDO.class);
         //校验库存
-        checkStock(orderDTO.getWarehouseId(), itemList);
+//        checkStock(orderDO,itemList);
         itemList.forEach(item -> item.setOrderId(orderDO.getId()));
         orderItemManager.saveBatch(itemList);
         return orderDO.getId();
     }
 
-    private void checkStock(List<Long> warehouseId, List<OrderItemDO> itemList) {
+    private void checkStock(OrderDO orderDO, List<OrderItemDO> itemList) {
 
         for (OrderItemDO aDo : itemList) {
             ProductStockDO byId = productStockManager.getById(aDo.getProductStockId());
-            if (aDo.getNum() > byId.getUsableStock()) {
-                throw new ServiceException(aDo.getProductId() + "的可用库存数量不足");
+            if (!orderDO.getSubtractStock()) {
+                if (aDo.getNum() > byId.getUsableStock()) {
+                    throw new ServiceException(aDo.getProductId() + "的可用库存数量不足");
+                }
             }
             byId.setUsableStock(byId.getUsableStock() - aDo.getNum());
             productStockManager.updateById(byId);
@@ -98,7 +99,6 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     }
 
 
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void edit(OrderDTO orderDTO) {
@@ -112,8 +112,7 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         updateById(orderDO);
         // 更新订单项
         List<OrderItemDO> itemList = BeanUtils.toBean(orderDTO.getItemList(), OrderItemDO.class);
-        //校验库存
-        checkStock(orderDTO.getWarehouseId(), itemList);
+
         itemList.forEach(item -> item.setOrderId(orderDO.getId()));
         orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDTO.getId()));
         orderItemManager.saveBatch(itemList);
@@ -165,7 +164,12 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     @Transactional(rollbackFor = Exception.class)
     public void submit(Long id) {
         OrderDO aDo = getById(id);
+        if (!SaleOrderStatusEnum.TO_BE_COMMIT.equals(aDo.getStatus())) {
+            throw new ServiceException("该订单已确认");
+        }
         List<OrderItemDO> dos = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, id));
+        //校验库存
+        checkStock(aDo, dos);
         Set<Long> set = dos.stream().map(OrderItemDO::getWarehouseId).collect(Collectors.toSet());
         for (Long warehouseId : set) {
             OrderSendDO orderSendDO = new OrderSendDO();
@@ -175,12 +179,14 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
             orderSendDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.OrderSend, 86L));
             orderSendManager.save(orderSendDO);
             List<OrderItemDO> collect = dos.stream().filter(item -> item.getWarehouseId().equals(warehouseId)).collect(Collectors.toList());
-            collect.forEach(item -> item.setOrderSendId(orderSendDO.getId()));
-        }
-        orderItemManager.updateBatchById(dos);
-        if (!SaleOrderStatusEnum.TO_BE_COMMIT.equals(aDo.getStatus())) {
-            throw new ServiceException("该订单已确认");
+            List<OrderSendItemDO> itemList = BeanUtils.toBean(collect, OrderSendItemDO.class);
+            itemList.forEach(item ->{
+                item.setOrderId(id);
+                item.setSendOrderId(orderSendDO.getId());
+            } );
+            orderSendItemManager.saveBatch(itemList);
         }
+
         aDo.setStatus(SaleOrderStatusEnum.TO_BE_SEND);
         updateById(aDo);
     }
@@ -211,41 +217,46 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         OrderSendDO aDo = orderSendManager.getById(sendOrderId);
         //根据订单查找到这个订单的所有货物扣减库存
         List<OrderItemDO> orderItemDOS = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, sendOrderId));
-        List<Long> productId = orderItemDOS.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
-        //查找这些商品在指定仓库的库存,减去对应数量
-        List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
-                .eq(ProductStockDO::getWarehouseId, aDo.getWarehouseId()).in(ProductStockDO::getProductId, productId));
-        for (ProductStockDO stockDO : stockDOList) {
-            Integer num = orderItemDOS.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
-
-            if (num < stockDO.getUsableStock()) {
-                if (OrderTypeEnum.TO_B.equals(aDo.getOrderType())) {
-                    //扣减可用库存
-//                    stockDO.setUsableStock(stockDO.getUsableStock() - num);
-                    //扣减实际库存
-                    stockDO.setActualStock(stockDO.getActualStock() - num);
-                } else if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
-                    //扣减可用库存
-                    stockDO.setActualStock(stockDO.getUsableStock() - num);
-                    //增加在途库存
-                    stockDO.setTransitStock(stockDO.getTransitStock() + num);
-                }
-            } else {
-                throw new ServiceException(stockDO.getProductId() + "的库存不够");
-            }
-        }
-        productStockManager.updateBatchById(stockDOList);
+//        List<Long> productId = orderItemDOS.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
+//        //查找这些商品在指定仓库的库存,减去对应数量
+//        List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
+//                .eq(ProductStockDO::getWarehouseId, aDo.getWarehouseId()).in(ProductStockDO::getProductId, productId));
+//        for (ProductStockDO stockDO : stockDOList) {
+//            Integer num = orderItemDOS.stream().filter(item -> item.getProductId().equals(stockDO.getProductId())).findFirst().get().getNum();
+//
+//            if (num < stockDO.getUsableStock()) {
+//                if (OrderTypeEnum.TO_B.equals(aDo.getOrderType())) {
+//                    //扣减可用库存
+////                    stockDO.setUsableStock(stockDO.getUsableStock() - num);
+//                    //扣减实际库存
+//                    stockDO.setActualStock(stockDO.getActualStock() - num);
+//                } else if (OrderTypeEnum.TO_C.equals(aDo.getOrderType())) {
+//                    //扣减可用库存
+//                    stockDO.setActualStock(stockDO.getUsableStock() - num);
+//                    //增加在途库存
+//                    stockDO.setTransitStock(stockDO.getTransitStock() + num);
+//                }
+//            } else {
+//                throw new ServiceException(stockDO.getProductId() + "的库存不够");
+//            }
+//        }
+//        productStockManager.updateBatchById(stockDOList);
         //生成出库单
         WarehouseOutDO outDO = new WarehouseOutDO();
-        outDO.setType(WarehouseOutTypeEnum.BORROW_OUT);
+        outDO.setType(WarehouseOutTypeEnum.SALE_OUT);
         outDO.setOrderIdList(sendOrderId);
+        outDO.setOrderId(aDo.getOrderId());
         outDO.setWarehouseId(aDo.getWarehouseId());
         outDO.setNotes("发货单生成的出货单");
         outDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseOut, 66L));
         warehouseOutMapper.insert(outDO);
         //保存出库单明细
         List<WarehouseOutItemDO> beanList = BeanUtils.toBean(orderItemDOS, WarehouseOutItemDO.class);
-        beanList.forEach(item -> item.setWarehouseOutId(outDO.getId()));
+        beanList.forEach(item -> {
+            item.setWarehouseOutId(outDO.getId());
+            Integer num = orderItemDOS.stream().filter(it -> it.getProductId().equals(item.getProductId())).findFirst().get().getNum();
+            item.setOutNum(num);
+        });
         warehouseOutItemManager.saveBatch(beanList);
         //更改订单状态56789=m+
 
@@ -258,9 +269,9 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
     public OrderSendDO getSendOrderDetail(String id) {
         OrderSendDO byId = orderSendManager.getById(id);
         OrderDO aDo = getById(byId.getOrderId());
-        List<OrderItemDO> dos = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, id));
-        List<OrderItemVO> bean = BeanUtils.toBean(dos, OrderItemVO.class);
-        for (OrderItemVO itemDO : bean) {
+        List<OrderSendItemDO> list = orderSendItemManager.list(new LambdaQueryWrapper<OrderSendItemDO>().eq(OrderSendItemDO::getSendOrderId, id));
+        List<OrderSendItemVO> bean = BeanUtils.toBean(list, OrderSendItemVO.class);
+        for (OrderSendItemVO itemDO : bean) {
             itemDO.setProductVO(productManager.getById(itemDO.getProductId()));
             itemDO.setGoodsVO(BeanUtil.copyProperties(goodsMapper.selectById(itemDO.getGoodsId()), GoodsVO.class));
             itemDO.setUseAbleStock(productStockManager.getById(itemDO.getProductStockId()).getUsableStock());
@@ -269,5 +280,83 @@ public class OrderManagerImpl extends BaseServiceImpl<OrderMapper, OrderDO> impl
         byId.setOrderItemVOS(bean);
         return byId;
     }
+
+    @Override
+    public OrderVO getOneBySn(String sn) {
+        OrderDO orderDO = getOne(new LambdaQueryWrapper<OrderDO>().eq(OrderDO::getSn, sn));
+        if (ObjectUtil.isNull(orderDO)) {
+            throw new ServiceException("请录入正确的订单号");
+        }
+        OrderVO orderVO = BeanUtil.copyProperties(orderDO, OrderVO.class);
+        List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDO.getId()));
+        List<Long> goodIdlist = list.stream().map(OrderItemDO::getProductId).collect(Collectors.toList());
+        // 查询订单项
+        List<OrderItemDTO> itemList = BeanUtils.toBean(list, OrderItemDTO.class);
+        //所有的商品信息
+        List<ProductDO> productDOList = productManager.list(new LambdaQueryWrapper<ProductDO>().in(ProductDO::getId, goodIdlist));
+        for (OrderItemDTO dto : itemList) {
+            ProductVO productVO = BeanUtil.copyProperties(productDOList.stream().filter(item -> item.getId().equals(dto.getProductId())).findFirst().get(), ProductVO.class);
+            dto.setProductVO(productVO);
+            GoodsVO goodsVO = BeanUtil.copyProperties(goodsMapper.selectById(productVO.getGoodsId()), GoodsVO.class);
+            dto.setGoodsVO(goodsVO);
+            dto.setUsableStock(productStockManager.getById(dto.getProductStockId()).getUsableStock());
+        }
+        orderVO.setItemList(itemList);
+        return orderVO;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void extension(Long orderId, OrderDTO orderDTO) {
+        OrderDO aDo = getById(orderId);
+        if (ObjectUtil.isNull(aDo)) {
+            throw new ServiceException("未找到订单");
+        }
+        //订单延期次数+1
+        aDo.setExtension(aDo.getExtension() + 1);
+        aDo.setRealPrice(orderDTO.getRealPrice());
+        aDo.setPayPrice(orderDTO.getPayPrice());
+        updateById(aDo);
+        //现在的商品减去原先的商品,额外的商品需要增加额外的发货单,
+        List<OrderItemDO> list = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderId));
+        List<OrderItemDTO> sendList = new ArrayList<>();
+        for (OrderItemDTO dto : orderDTO.getItemList()) {
+            if (ObjectUtil.isNull(dto.getId())) {
+                sendList.add(dto);
+            } else {
+                Integer num = list.stream().filter(item -> item.getId().equals(dto.getId())).findFirst().get().getNum();
+                if (dto.getNum() < num) {
+                    throw new ServiceException("延期商品的数量需大于或等于原订单的数量");
+                }
+                if (dto.getNum() - num > 0) {
+                    dto.setNum(dto.getNum() - num);
+                    sendList.add(dto);
+                }
+            }
+        }
+
+        List<OrderItemDO> sendNewList = BeanUtils.toBean(sendList, OrderItemDO.class);
+        Set<Long> set = sendNewList.stream().map(OrderItemDO::getWarehouseId).collect(Collectors.toSet());
+        for (Long warehouseId : set) {
+            OrderSendDO orderSendDO = new OrderSendDO();
+            orderSendDO.setOrderId(orderId);
+            orderSendDO.setWarehouseId(warehouseId);
+            orderSendDO.setOrderType(aDo.getType());
+            orderSendDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.OrderSend, 86L));
+            orderSendManager.save(orderSendDO);
+            List<OrderItemDO> collect = sendNewList.stream().filter(item -> item.getWarehouseId().equals(warehouseId)).collect(Collectors.toList());
+            List<OrderSendItemDO> itemList = BeanUtils.toBean(collect, OrderSendItemDO.class);
+            itemList.forEach(item ->{
+                item.setId(null);
+                item.setOrderId(orderId);
+                item.setSendOrderId(orderSendDO.getId());
+            } );
+            orderSendItemManager.saveBatch(itemList);
+        }
+        List<OrderItemDO> itemList = BeanUtils.toBean(orderDTO.getItemList(), OrderItemDO.class);
+        itemList.forEach(item -> item.setOrderId(orderId));
+        orderItemManager.remove(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderId));
+        orderItemManager.saveBatch(itemList);
+    }
 }
 

+ 32 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/OrderSendItemManagerImpl.java

@@ -0,0 +1,32 @@
+package com.hys.app.service.erp.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.hys.app.converter.erp.OrderItemConverter;
+import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.mapper.erp.OrderItemMapper;
+import com.hys.app.mapper.erp.OrderSendItemMapper;
+import com.hys.app.model.erp.dos.OrderItemDO;
+import com.hys.app.model.erp.dos.OrderSendItemDO;
+import com.hys.app.model.erp.dto.OrderItemQueryParams;
+import com.hys.app.model.erp.vo.OrderItemVO;
+import com.hys.app.service.erp.OrderItemManager;
+import com.hys.app.service.erp.OrderSendItemManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 订单明细业务层实现
+ *
+ * @author 张崧
+ * 2024-01-24 16:39:39
+ */
+@Service
+public class OrderSendItemManagerImpl extends BaseServiceImpl<OrderSendItemMapper, OrderSendItemDO> implements OrderSendItemManager {
+
+}
+

+ 18 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/ProductGroupItemManagerImpl.java

@@ -0,0 +1,18 @@
+package com.hys.app.service.erp.impl;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.mapper.goods.ProductGroupItemMapper;
+import com.hys.app.model.erp.dos.ProductGroupItemDO;
+import com.hys.app.service.erp.ProductGroupItemManager;
+import org.springframework.stereotype.Service;
+
+/**
+ * 产品业务层实现
+ *
+ * @author 张崧
+ * 2023-11-30 16:06:44
+ */
+@Service
+public class ProductGroupItemManagerImpl extends BaseServiceImpl<ProductGroupItemMapper, ProductGroupItemDO> implements ProductGroupItemManager {
+}
+

+ 18 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/ProductGroupManagerImpl.java

@@ -0,0 +1,18 @@
+package com.hys.app.service.erp.impl;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.mapper.goods.ProductGroupMapper;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.service.erp.ProductGroupManager;
+import org.springframework.stereotype.Service;
+
+/**
+ * 产品业务层实现
+ *
+ * @author 张崧
+ * 2023-11-30 16:06:44
+ */
+@Service
+public class ProductGroupManagerImpl extends BaseServiceImpl<ProductGroupMapper, ProductGroupDO> implements ProductGroupManager {
+}
+

+ 64 - 5
module-erp/src/main/java/com/hys/app/service/erp/impl/ProductManagerImpl.java

@@ -1,22 +1,35 @@
 package com.hys.app.service.erp.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.converter.erp.ProductConverter;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.mapper.goods.GoodsMapper;
 import com.hys.app.mapper.goods.ProductMapper;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.ProductDO;
+import com.hys.app.model.erp.dos.ProductGroupDO;
+import com.hys.app.model.erp.dos.ProductGroupItemDO;
+import com.hys.app.model.erp.dto.GoodsQueryParams;
 import com.hys.app.model.erp.dto.ProductDTO;
 import com.hys.app.model.erp.dto.ProductQueryParams;
 import com.hys.app.model.erp.dto.ProductSpec;
 import com.hys.app.model.erp.vo.ProductVO;
+import com.hys.app.service.erp.ProductGroupItemManager;
+import com.hys.app.service.erp.ProductGroupManager;
 import com.hys.app.service.erp.ProductManager;
 import com.hys.app.service.erp.ProductStockManager;
 import com.hys.app.service.goods.CategoryManager;
+import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -31,16 +44,15 @@ import static com.hys.app.framework.util.CollectionUtils.convertMap;
  * 2023-11-30 16:06:44
  */
 @Service
+@AllArgsConstructor
 public class ProductManagerImpl extends BaseServiceImpl<ProductMapper, ProductDO> implements ProductManager {
 
-    @Autowired
     private ProductConverter converter;
-
-    @Autowired
     private CategoryManager categoryManager;
-
-    @Autowired
     private ProductStockManager productStockManager;
+    private ProductGroupManager productGroupManager;
+    private ProductGroupItemManager productGroupItemManager;
+    private GoodsMapper goodsMapper;
 
     @Override
     public WebPage<ProductVO> list(ProductQueryParams queryParams) {
@@ -111,5 +123,52 @@ public class ProductManagerImpl extends BaseServiceImpl<ProductMapper, ProductDO
         return specValueList.stream().map(specValueVO -> String.valueOf(specValueVO.getSpecValueId())).collect(Collectors.joining());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void productGroup(ProductGroupDO productGroupDO) {
+        ProductGroupDO one = productGroupManager.getOne(new LambdaQueryWrapper<ProductGroupDO>().eq(ProductGroupDO::getName, productGroupDO.getName()));
+        if (ObjectUtil.isNotNull(one)) {
+            throw new ServiceException("分组名称不等你重复");
+        }
+        productGroupManager.save(productGroupDO);
+        productGroupItemManager.saveBatch(productGroupDO.getItemDOList());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void removeProductGroup(Long id) {
+        productGroupManager.removeById(id);
+        productGroupItemManager.remove(new LambdaQueryWrapper<ProductGroupItemDO>().eq(ProductGroupItemDO::getGroupId, id));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateProductGroup(Long id, ProductGroupDO productGroupDO) {
+        ProductGroupDO byId = productGroupManager.getById(id);
+        if (ObjectUtil.isNull(byId)) {
+            throw new ServiceException("修改失败,未查询到数据");
+        }
+        BeanUtil.copyProperties(productGroupDO, byId);
+        productGroupManager.updateById(byId);
+        productGroupItemManager.remove(new LambdaQueryWrapper<ProductGroupItemDO>().eq(ProductGroupItemDO::getGroupId, id));
+        productGroupItemManager.saveBatch(productGroupDO.getItemDOList());
+    }
+
+    @Override
+    public Page<ProductGroupDO> getGroupPage(ProductQueryParams queryParams) {
+        return productGroupManager.page(new Page<>(queryParams.getPageSize(), queryParams.getPageNo()));
+    }
+
+    @Override
+    public ProductGroupDO getGroupById(Long id) {
+        ProductGroupDO byId = productGroupManager.getById(id);
+        List<ProductGroupItemDO> list = productGroupItemManager.list(new LambdaQueryWrapper<ProductGroupItemDO>().eq(ProductGroupItemDO::getGroupId, id));
+        for (ProductGroupItemDO aDo : list) {
+            aDo.setProductVO(getById(aDo.getProductId()));
+            aDo.setGoodsVO((goodsMapper.selectById(aDo.getGoodsId())));
+        }
+        byId.setItemDOList(list);
+        return byId;
+    }
 }
 

+ 111 - 64
module-erp/src/main/java/com/hys/app/service/erp/impl/ScanCodeManagerImpl.java

@@ -3,31 +3,27 @@ package com.hys.app.service.erp.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.EnumUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.google.common.collect.Lists;
-import com.hys.app.converter.erp.EnterpriseConverter;
-import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.BeanUtils;
-import com.hys.app.mapper.erp.EnterpriseMapper;
 import com.hys.app.mapper.erp.ProductStockMapper;
 import com.hys.app.model.erp.dos.*;
-import com.hys.app.model.erp.dto.EnterpriseDTO;
-import com.hys.app.model.erp.dto.EnterpriseQueryParams;
 import com.hys.app.model.erp.enums.ScanFormCodeTypeEnum;
-import com.hys.app.model.erp.vo.EnterpriseVO;
+import com.hys.app.model.erp.enums.SnCodeStatusEnum;
+import com.hys.app.model.erp.vo.GoodsSnVO;
 import com.hys.app.model.erp.vo.GoodsVO;
 import com.hys.app.model.erp.vo.ProductStockVO;
 import com.hys.app.model.erp.vo.ProductVO;
 import com.hys.app.service.erp.*;
-import com.hys.app.util.ValidateUtil;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -58,127 +54,178 @@ public class ScanCodeManagerImpl extends BaseServiceImpl<ProductStockMapper, Pro
     private ProductStockManager productStockManager;
     private GoodsManager goodsManager;
     private ProductManager productManager;
+    private GoodsSnManager goodsSnManager;
 
 
     @Override
-    public Map<String, Object> getListByScan( String orderCode) {
+    public Map<String, Object> getListByScan(String orderCode) {
         Map<String, Object> resMap = new HashMap<>();
         List<ProductStockVO> list = new ArrayList<>();
 
         //自定义的订单号长度都是8为以上,前面8为使我们自定义的用来匹配
         if (orderCode.length() < 8) {
-            return list;
+           throw new ServiceException("该单号未匹配到商品");
         }
         String substring = orderCode.substring(0, 8);
         if (!EnumUtil.contains(ScanFormCodeTypeEnum.class, substring)) {
-            return list;
-        }
-        //发货单
-        if (ScanFormCodeTypeEnum.RYKS_FHD.getValue().equals(substring)) {
-            OrderSendDO sendDO = orderSendManager.getOne(new LambdaQueryWrapper<OrderSendDO>().eq(OrderSendDO::getSn, orderCode));
-            if (ObjectUtil.isNull(sendDO)) {
-                return list;
-            }
-            List<OrderItemDO> orderItemList = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, sendDO.getId()));
-            List<Long> collect = orderItemList.stream().map(OrderItemDO::getProductStockId).collect(Collectors.toList());
-            list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",sendDO);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_FHD.getValue());
+            throw new ServiceException("该单号未匹配到商品");
         }
+//        //发货单
+//        if (ScanFormCodeTypeEnum.RYKS_FHD.getValue().equals(substring)) {
+//            OrderSendDO sendDO = orderSendManager.getOne(new LambdaQueryWrapper<OrderSendDO>().eq(OrderSendDO::getSn, orderCode).last("limit 1"));
+//            if (ObjectUtil.isNull(sendDO)) {
+//                return resMap;
+//            }
+//            List<OrderItemDO> orderItemList = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderSendId, sendDO.getId()));
+//            List<Long> collect = orderItemList.stream().map(OrderItemDO::getProductStockId).collect(Collectors.toList());
+//            list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
+//            resMap.put("order", sendDO);
+//            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_FHD.getValue());
+//        }
         //订单
         if (ScanFormCodeTypeEnum.RYKS_DDD.getValue().equals(substring)) {
-            OrderDO orderDo = orderManager.getOne(new LambdaQueryWrapper<OrderDO>().eq(OrderDO::getSn, orderCode));
+            OrderDO orderDo = orderManager.getOne(new LambdaQueryWrapper<OrderDO>().eq(OrderDO::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(orderDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<OrderItemDO> orderItemList = orderItemManager.list(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDo.getId()));
             List<Long> collect = orderItemList.stream().map(OrderItemDO::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",orderDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_DDD.getValue());
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductStockId().equals(vo.getId())).findFirst().get().getId());
+            }
+            resMap.put("order", orderDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_DDD.getValue());
         }
         //入库单
         if (ScanFormCodeTypeEnum.RYKS_RKD.getValue().equals(substring)) {
-            WarehouseOutDO outDo = warehouseOutManager.getOne(new LambdaQueryWrapper<WarehouseOutDO>().eq(WarehouseOutDO::getSn, orderCode));
+            WarehouseOutDO outDo = warehouseOutManager.getOne(new LambdaQueryWrapper<WarehouseOutDO>().eq(WarehouseOutDO::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(outDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<WarehouseOutItemDO> orderItemList = warehouseOutItemManager.list(new LambdaQueryWrapper<WarehouseOutItemDO>().eq(WarehouseOutItemDO::getWarehouseOutId, outDo.getId()));
             List<Long> collect = orderItemList.stream().map(WarehouseOutItemDO::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",outDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_RKD.getValue());
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductId().equals(vo.getId())).findFirst().get().getId());
+            }
+            resMap.put("order", outDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_RKD.getValue());
         }
         //盘点
         if (ScanFormCodeTypeEnum.RYKS_PDD.getValue().equals(substring)) {
-            StockInventory stockDo = stockInventoryManager.getOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getSn, orderCode));
+            StockInventory stockDo = stockInventoryManager.getOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(stockDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<StockInventoryProduct> orderItemList = stockInventoryProductManager.list(new LambdaQueryWrapper<StockInventoryProduct>().eq(StockInventoryProduct::getInventoryId, stockDo.getId()));
             List<Long> collect = orderItemList.stream().map(StockInventoryProduct::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",stockDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_PDD.getValue());
-        }
-        //退货单
-        if (ScanFormCodeTypeEnum.RYKS_THD.getValue().equals(substring)) {
-            OrderReturnDO returnDo = orderReturnManager.getOne(new LambdaQueryWrapper<OrderReturnDO>().eq(OrderReturnDO::getSn, orderCode));
-            if (ObjectUtil.isNull(returnDo)) {
-                return list;
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductId().equals(vo.getId())).findFirst().get().getId());
             }
-            List<OrderReturnItemDO> orderItemList = orderReturnItemManager.list(new LambdaQueryWrapper<OrderReturnItemDO>().eq(OrderReturnItemDO::getOrderReturnId, returnDo.getId()));
-            List<Long> collect = orderItemList.stream().map(OrderReturnItemDO::getProductStockId).collect(Collectors.toList());
-            list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",returnDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_THD.getValue());
+            resMap.put("order", stockDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_PDD.getValue());
         }
+//        //退货单
+//        if (ScanFormCodeTypeEnum.RYKS_THD.getValue().equals(substring)) {
+//            OrderReturnDO returnDo = orderReturnManager.getOne(new LambdaQueryWrapper<OrderReturnDO>().eq(OrderReturnDO::getSn, orderCode).last("limit 1"));
+//            if (ObjectUtil.isNull(returnDo)) {
+//                return resMap;
+//            }
+//            List<OrderReturnItemDO> orderItemList = orderReturnItemManager.list(new LambdaQueryWrapper<OrderReturnItemDO>().eq(OrderReturnItemDO::getOrderReturnId, returnDo.getId()));
+//            List<Long> collect = orderItemList.stream().map(OrderReturnItemDO::getProductStockId).collect(Collectors.toList());
+//            list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
+//            resMap.put("order", returnDo);
+//            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_THD.getValue());
+//        }
 
         if (ScanFormCodeTypeEnum.RYKS_DBD.getValue().equals(substring)) {
-            StockTransferDO transDo = stockTransferManager.getOne(new LambdaQueryWrapper<StockTransferDO>().eq(StockTransferDO::getSn, orderCode));
+            StockTransferDO transDo = stockTransferManager.getOne(new LambdaQueryWrapper<StockTransferDO>().eq(StockTransferDO::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(transDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<StockTransferProductDO> orderItemList = stockTransferProductManager.list(new LambdaQueryWrapper<StockTransferProductDO>().eq(StockTransferProductDO::getStockTransferId, transDo.getId()));
             List<Long> collect = orderItemList.stream().map(StockTransferProductDO::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",transDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_DBD.getValue());
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductId().equals(vo.getId())).findFirst().get().getId());
+            }
+            resMap.put("order", transDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_DBD.getValue());
         }
 
-        List<WarehouseEntryDO> list1 = warehouseEntryManager.list();
 
         //入库单
         if (ScanFormCodeTypeEnum.RYKS_CKD.getValue().equals(substring)) {
-            WarehouseEntryDO entryDo = warehouseEntryManager.getOne(new LambdaQueryWrapper<WarehouseEntryDO>().eq(WarehouseEntryDO::getSn, orderCode));
+            WarehouseEntryDO entryDo = warehouseEntryManager.getOne(new LambdaQueryWrapper<WarehouseEntryDO>().eq(WarehouseEntryDO::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(entryDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<WarehouseEntryProductDO> orderItemList = warehouseEntryProductManager.list(new LambdaQueryWrapper<WarehouseEntryProductDO>().eq(WarehouseEntryProductDO::getWarehouseEntryId, entryDo.getId()));
             List<Long> collect = orderItemList.stream().map(WarehouseEntryProductDO::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",entryDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_CKD.getValue());
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductId().equals(vo.getId())).findFirst().get().getId());
+            }
+            resMap.put("order", entryDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_CKD.getValue());
         }
 
 
         if (ScanFormCodeTypeEnum.RYKS_BSD.getValue().equals(substring)) {
-            StockDamageReport damageDo = stockDamageReportManager.getOne(new LambdaQueryWrapper<StockDamageReport>().eq(StockDamageReport::getSn, orderCode));
+            StockDamageReport damageDo = stockDamageReportManager.getOne(new LambdaQueryWrapper<StockDamageReport>().eq(StockDamageReport::getSn, orderCode).last("limit 1"));
             if (ObjectUtil.isNull(damageDo)) {
-                return list;
+                throw new ServiceException("该单号未匹配到商品");
             }
             List<StockDamageReportProduct> orderItemList = stockDamageReportProductManager.list(new LambdaQueryWrapper<StockDamageReportProduct>().eq(StockDamageReportProduct::getReportId, damageDo.getId()));
             List<Long> collect = orderItemList.stream().map(StockDamageReportProduct::getProductStockId).collect(Collectors.toList());
             list = BeanUtils.toBean(productStockManager.list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect)), ProductStockVO.class);
-            resMap.put("order",damageDo);
-            resMap.put("orderType",ScanFormCodeTypeEnum.RYKS_BSD.getValue());
+            for (ProductStockVO vo : list) {
+                vo.setScanOrderItemId(orderItemList.stream().filter(item ->item.getProductId().equals(vo.getId())).findFirst().get().getId());
+            }
+            resMap.put("order", damageDo);
+            resMap.put("orderType", ScanFormCodeTypeEnum.RYKS_BSD.getValue());
         }
         for (ProductStockVO vo : list) {
-            vo.setGoodVO(BeanUtil.copyProperties(goodsManager.getById(vo.getGoodsId()), GoodsVO.class));
+            vo.setGoodsVO(BeanUtil.copyProperties(goodsManager.getById(vo.getGoodsId()), GoodsVO.class));
             vo.setProductVO(BeanUtil.copyProperties(productManager.getById(vo.getProductId()), ProductVO.class));
         }
-        resMap.put("list",list);
+        resMap.put("list", list);
         return resMap;
     }
+
+    @Override
+    public ProductStockVO getProduct(String productCode, Long warehouseId) {
+        ProductDO productDO = productManager.getOne(new LambdaQueryWrapper<ProductDO>().eq(ProductDO::getSku, productCode).last("limit 1"));
+        if (ObjectUtil.isNull(productDO)) {
+            throw new ServiceException("请录入正确的sku");
+        }
+        ProductStockDO stockDO = productStockManager.getOne(new LambdaQueryWrapper<ProductStockDO>()
+                .eq(ProductStockDO::getWarehouseId, warehouseId).eq(ProductStockDO::getProductId, productDO.getId()));
+        ProductStockVO productStockVO = BeanUtil.copyProperties(stockDO, ProductStockVO.class);
+        productStockVO.setProductVO(BeanUtil.copyProperties(productDO, ProductVO.class));
+        productStockVO.setGoodsVO(BeanUtil.copyProperties(goodsManager.getById(stockDO.getGoodsId()), GoodsVO.class));
+        return productStockVO;
+    }
+
+    @Override
+    public GoodsSnVO getSnCode(String sku, String snCode, String type) {
+        GoodsSnDO one = goodsSnManager.getOne(new LambdaQueryWrapper<GoodsSnDO>().eq(GoodsSnDO::getSku, sku).eq(GoodsSnDO::getSnCode, snCode).last("limit 1"));
+        if (ObjectUtil.isNull(one)) {
+            throw new ServiceException("请录入正确的序列号");
+        }
+        if (StrUtil.isNotBlank(type) && "in".equals(type)) {
+            if (one.getStatus().equals(SnCodeStatusEnum.IN_WAREHOUSE)) {
+                throw new ServiceException("该序列号已入库");
+            }
+        }
+        if (StrUtil.isNotBlank(type) && "out".equals(type)) {
+            if (!one.getStatus().equals(SnCodeStatusEnum.IN_WAREHOUSE)) {
+                throw new ServiceException("已入库的序列号才能出库");
+            }
+        }
+        return BeanUtil.copyProperties(one, GoodsSnVO.class);
+    }
 }
 

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini