From 7c04e1319840c64503be02fad8ffcfd79cb6cd71 Mon Sep 17 00:00:00 2001 From: 86156 <823267011@qq.com> Date: Tue, 18 Nov 2025 16:45:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=9F=BA=E7=A1=80=E9=87=87?= =?UTF-8?q?=E8=B4=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpPurchaseOrderItemController.java | 73 ++ .../ErpPurchaseReceiptController.java | 74 ++ .../ErpPurchaseReportController.java | 53 ++ .../ErpPurchaseRequirementController.java | 33 + .../ErpPurchaseReturnController.java | 74 ++ .../ErpPurchaseReturnItemController.java | 74 ++ .../erp/controller/ErpSupplierController.java | 73 ++ .../ErpSupplierPriceController.java | 83 ++ .../klp/erp/domain/ErpPurchaseOrderItem.java | 50 ++ .../klp/erp/domain/ErpPurchaseReceipt.java | 44 ++ .../erp/domain/ErpPurchaseRequirement.java | 45 ++ .../com/klp/erp/domain/ErpPurchaseReturn.java | 37 + .../klp/erp/domain/ErpPurchaseReturnItem.java | 39 + .../java/com/klp/erp/domain/ErpSupplier.java | 44 ++ .../com/klp/erp/domain/ErpSupplierPrice.java | 43 + .../erp/domain/bo/ErpPurchaseOrderItemBo.java | 48 ++ .../erp/domain/bo/ErpPurchaseReceiptBo.java | 38 + .../erp/domain/bo/ErpPurchaseReturnBo.java | 30 + .../domain/bo/ErpPurchaseReturnItemBo.java | 33 + .../com/klp/erp/domain/bo/ErpSupplierBo.java | 40 + .../klp/erp/domain/bo/ErpSupplierPriceBo.java | 44 ++ .../erp/domain/bo/MaterialTypeQueryBo.java | 20 + .../bo/PurchaseRequirementAnalyzeBo.java | 24 + .../bo/PurchaseRequirementMappingBo.java | 27 + .../klp/erp/domain/dto/ProductDemandDTO.java | 12 + .../klp/erp/domain/dto/ProductStockDTO.java | 13 + .../com/klp/erp/domain/dto/RawStockDTO.java | 13 + .../com/klp/erp/domain/dto/RawTransitDTO.java | 12 + .../erp/domain/vo/ErpPurchaseOrderItemVo.java | 55 ++ .../erp/domain/vo/ErpPurchaseReceiptVo.java | 41 + .../domain/vo/ErpPurchaseReturnItemVo.java | 35 + .../erp/domain/vo/ErpPurchaseReturnVo.java | 34 + .../klp/erp/domain/vo/ErpSupplierPriceVo.java | 47 ++ .../com/klp/erp/domain/vo/ErpSupplierVo.java | 45 ++ .../erp/domain/vo/MaterialTypeOptionVo.java | 21 + .../vo/PurchaseRequirementRawDetailVo.java | 21 + .../erp/domain/vo/PurchaseRequirementVo.java | 35 + .../klp/erp/enums/PurchaseOrderStatus.java | 21 + .../mapper/ErpPurchaseOrderItemMapper.java | 12 + .../erp/mapper/ErpPurchaseReceiptMapper.java | 12 + .../erp/mapper/ErpPurchaseReportMapper.java | 24 + .../mapper/ErpPurchaseRequirementMapper.java | 12 + .../mapper/ErpPurchaseReturnItemMapper.java | 14 + .../erp/mapper/ErpPurchaseReturnMapper.java | 10 + .../com/klp/erp/mapper/ErpSupplierMapper.java | 12 + .../erp/mapper/ErpSupplierPriceMapper.java | 18 + .../mapper/PurchaseRequirementCalcMapper.java | 22 + .../service/IErpPurchaseOrderItemService.java | 28 + .../service/IErpPurchaseReceiptService.java | 25 + .../IErpPurchaseRequirementService.java | 12 + .../IErpPurchaseReturnItemService.java | 25 + .../service/IErpPurchaseReturnService.java | 25 + .../erp/service/IErpSupplierPriceService.java | 32 + .../klp/erp/service/IErpSupplierService.java | 28 + .../impl/ErpPurchaseOrderItemServiceImpl.java | 83 ++ .../impl/ErpPurchaseReceiptServiceImpl.java | 135 ++++ .../ErpPurchaseRequirementServiceImpl.java | 235 ++++++ .../ErpPurchaseReturnItemServiceImpl.java | 134 ++++ .../impl/ErpPurchaseReturnServiceImpl.java | 92 +++ .../impl/ErpSupplierPriceServiceImpl.java | 90 +++ .../service/impl/ErpSupplierServiceImpl.java | 84 ++ .../mapper/erp/ErpPurchaseOrderItemMapper.xml | 28 + .../mapper/erp/ErpPurchaseReceiptMapper.xml | 34 + .../mapper/erp/ErpPurchaseReportMapper.xml | 76 ++ .../erp/ErpPurchaseReturnItemMapper.xml | 39 + .../mapper/erp/ErpPurchaseReturnMapper.xml | 22 + .../mapper/erp/ErpSupplierMapper.xml | 25 + .../mapper/erp/ErpSupplierPriceMapper.xml | 48 ++ .../erp/PurchaseRequirementCalcMapper.xml | 96 +++ klp-ui/src/api/erp/purchase.js | 289 +++++++ klp-ui/src/views/erp/order/index.vue | 394 ++++++++++ klp-ui/src/views/erp/purchase/index.vue | 734 ++++++++++++++++++ klp-ui/src/views/erp/receipt/index.vue | 214 +++++ klp-ui/src/views/erp/report/index.vue | 186 +++++ klp-ui/src/views/erp/requirement/index.vue | 201 +++++ klp-ui/src/views/erp/return/index.vue | 295 +++++++ klp-ui/src/views/erp/supplier/index.vue | 340 ++++++++ 77 files changed, 5733 insertions(+) create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderItemController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReceiptController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReportController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseRequirementController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnItemController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierPriceController.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrderItem.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReceipt.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseRequirement.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturn.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturnItem.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpSupplier.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/ErpSupplierPrice.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderItemBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReceiptBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnItemBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierPriceBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/MaterialTypeQueryBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementAnalyzeBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementMappingBo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/dto/ProductDemandDTO.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/dto/ProductStockDTO.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/dto/RawStockDTO.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/dto/RawTransitDTO.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderItemVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReceiptVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnItemVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierPriceVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/MaterialTypeOptionVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementRawDetailVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementVo.java create mode 100644 klp-erp/src/main/java/com/klp/erp/enums/PurchaseOrderStatus.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderItemMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReceiptMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReportMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseRequirementMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnItemMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierPriceMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/mapper/PurchaseRequirementCalcMapper.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderItemService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReceiptService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseRequirementService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnItemService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpSupplierPriceService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/IErpSupplierService.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReceiptServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseRequirementServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnItemServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierPriceServiceImpl.java create mode 100644 klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierServiceImpl.java create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderItemMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpPurchaseReceiptMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpPurchaseReportMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnItemMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpSupplierMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/ErpSupplierPriceMapper.xml create mode 100644 klp-erp/src/main/resources/mapper/erp/PurchaseRequirementCalcMapper.xml create mode 100644 klp-ui/src/api/erp/purchase.js create mode 100644 klp-ui/src/views/erp/order/index.vue create mode 100644 klp-ui/src/views/erp/purchase/index.vue create mode 100644 klp-ui/src/views/erp/receipt/index.vue create mode 100644 klp-ui/src/views/erp/report/index.vue create mode 100644 klp-ui/src/views/erp/requirement/index.vue create mode 100644 klp-ui/src/views/erp/return/index.vue create mode 100644 klp-ui/src/views/erp/supplier/index.vue diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderItemController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderItemController.java new file mode 100644 index 00000000..ea45ecd2 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderItemController.java @@ -0,0 +1,73 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpPurchaseOrderItemBo; +import com.klp.erp.domain.vo.ErpPurchaseOrderItemVo; +import com.klp.erp.service.IErpPurchaseOrderItemService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/purchaseOrderItem") +public class ErpPurchaseOrderItemController extends BaseController { + + private final IErpPurchaseOrderItemService orderItemService; + + @GetMapping("/list") + public TableDataInfo list(ErpPurchaseOrderItemBo bo, PageQuery pageQuery) { + return orderItemService.queryPageList(bo, pageQuery); + } + + @Log(title = "采购订单明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpPurchaseOrderItemBo bo, HttpServletResponse response) { + List list = orderItemService.queryList(bo); + ExcelUtil.exportExcel(list, "采购订单明细", ErpPurchaseOrderItemVo.class, response); + } + + @GetMapping("/{itemId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long itemId) { + return R.ok(orderItemService.queryById(itemId)); + } + + @Log(title = "采购订单明细", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpPurchaseOrderItemBo bo) { + return toAjax(orderItemService.insertByBo(bo)); + } + + @Log(title = "采购订单明细", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseOrderItemBo bo) { + return toAjax(orderItemService.updateByBo(bo)); + } + + @Log(title = "采购订单明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{itemIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] itemIds) { + return toAjax(orderItemService.deleteWithValidByIds(Arrays.asList(itemIds), true)); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReceiptController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReceiptController.java new file mode 100644 index 00000000..af1c3831 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReceiptController.java @@ -0,0 +1,74 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpPurchaseReceiptBo; +import com.klp.erp.domain.vo.ErpPurchaseReceiptVo; +import com.klp.erp.service.IErpPurchaseReceiptService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/purchaseReceipt") +public class ErpPurchaseReceiptController extends BaseController { + + private final IErpPurchaseReceiptService receiptService; + + @GetMapping("/list") + public TableDataInfo list(ErpPurchaseReceiptBo bo, PageQuery pageQuery) { + return receiptService.queryPageList(bo, pageQuery); + } + + @Log(title = "采购收货记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpPurchaseReceiptBo bo, HttpServletResponse response) { + List list = receiptService.queryList(bo); + ExcelUtil.exportExcel(list, "采购收货记录", ErpPurchaseReceiptVo.class, response); + } + + @GetMapping("/{receiptId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long receiptId) { + return R.ok(receiptService.queryById(receiptId)); + } + + @Log(title = "采购收货记录", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpPurchaseReceiptBo bo) { + return toAjax(receiptService.insertByBo(bo)); + } + + @Log(title = "采购收货记录", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseReceiptBo bo) { + return toAjax(receiptService.updateByBo(bo)); + } + + @Log(title = "采购收货记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{receiptIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] receiptIds) { + return toAjax(receiptService.deleteWithValidByIds(Arrays.asList(receiptIds), true)); + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReportController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReportController.java new file mode 100644 index 00000000..fa5fb3b7 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReportController.java @@ -0,0 +1,53 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.R; +import com.klp.common.enums.BusinessType; +import com.klp.erp.mapper.ErpPurchaseReportMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/erp/purchaseReport") +public class ErpPurchaseReportController extends BaseController { + + private final ErpPurchaseReportMapper reportMapper; + + @Log(title = "采购汇总报表", businessType = BusinessType.OTHER) + @GetMapping("/summary") + public R> summary(@RequestParam(required = false) String beginTime, + @RequestParam(required = false) String endTime) { + BigDecimal totalAmount = reportMapper.sumTotalAmount(beginTime, endTime); + List> bySupplier = reportMapper.sumAmountBySupplier(beginTime, endTime); + Map result = new HashMap<>(); + result.put("totalAmount", totalAmount); + result.put("bySupplier", bySupplier); + return R.ok(result); + } + + @Log(title = "采购价格趋势", businessType = BusinessType.OTHER) + @GetMapping("/trend") + public R>> priceTrend(@RequestParam(required = false) String beginTime, + @RequestParam(required = false) String endTime) { + return R.ok(reportMapper.selectPriceTrend(beginTime, endTime)); + } + + @Log(title = "供应商绩效", businessType = BusinessType.OTHER) + @GetMapping("/supplierQuality") + public R>> supplierQuality(@RequestParam(required = false) String beginTime, + @RequestParam(required = false) String endTime) { + return R.ok(reportMapper.selectSupplierQuality(beginTime, endTime)); + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseRequirementController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseRequirementController.java new file mode 100644 index 00000000..88330a48 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseRequirementController.java @@ -0,0 +1,33 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.R; +import com.klp.common.enums.BusinessType; +import com.klp.erp.domain.bo.PurchaseRequirementAnalyzeBo; +import com.klp.erp.domain.vo.PurchaseRequirementVo; +import com.klp.erp.service.IErpPurchaseRequirementService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/purchaseRequirement") +public class ErpPurchaseRequirementController extends BaseController { + + private final IErpPurchaseRequirementService purchaseRequirementService; + + @Log(title = "采购需求分析", businessType = BusinessType.OTHER) + @PostMapping("/analyze") + public R> analyze(@Validated @RequestBody PurchaseRequirementAnalyzeBo bo) { + return R.ok(purchaseRequirementService.analyze(bo)); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnController.java new file mode 100644 index 00000000..d9473186 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnController.java @@ -0,0 +1,74 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpPurchaseReturnBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnVo; +import com.klp.erp.service.IErpPurchaseReturnService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/purchaseReturn") +public class ErpPurchaseReturnController extends BaseController { + + private final IErpPurchaseReturnService returnService; + + @GetMapping("/list") + public TableDataInfo list(ErpPurchaseReturnBo bo, PageQuery pageQuery) { + return returnService.queryPageList(bo, pageQuery); + } + + @Log(title = "采购退货", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpPurchaseReturnBo bo, HttpServletResponse response) { + List list = returnService.queryList(bo); + ExcelUtil.exportExcel(list, "采购退货", ErpPurchaseReturnVo.class, response); + } + + @GetMapping("/{returnId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long returnId) { + return R.ok(returnService.queryById(returnId)); + } + + @Log(title = "采购退货", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpPurchaseReturnBo bo) { + return toAjax(returnService.insertByBo(bo)); + } + + @Log(title = "采购退货", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseReturnBo bo) { + return toAjax(returnService.updateByBo(bo)); + } + + @Log(title = "采购退货", businessType = BusinessType.DELETE) + @DeleteMapping("/{returnIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] returnIds) { + return toAjax(returnService.deleteWithValidByIds(Arrays.asList(returnIds), true)); + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnItemController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnItemController.java new file mode 100644 index 00000000..505cca67 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseReturnItemController.java @@ -0,0 +1,74 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpPurchaseReturnItemBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnItemVo; +import com.klp.erp.service.IErpPurchaseReturnItemService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/purchaseReturnItem") +public class ErpPurchaseReturnItemController extends BaseController { + + private final IErpPurchaseReturnItemService returnItemService; + + @GetMapping("/list") + public TableDataInfo list(ErpPurchaseReturnItemBo bo, PageQuery pageQuery) { + return returnItemService.queryPageList(bo, pageQuery); + } + + @Log(title = "采购退货明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpPurchaseReturnItemBo bo, HttpServletResponse response) { + List list = returnItemService.queryList(bo); + ExcelUtil.exportExcel(list, "采购退货明细", ErpPurchaseReturnItemVo.class, response); + } + + @GetMapping("/{returnItemId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long returnItemId) { + return R.ok(returnItemService.queryById(returnItemId)); + } + + @Log(title = "采购退货明细", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpPurchaseReturnItemBo bo) { + return toAjax(returnItemService.insertByBo(bo)); + } + + @Log(title = "采购退货明细", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseReturnItemBo bo) { + return toAjax(returnItemService.updateByBo(bo)); + } + + @Log(title = "采购退货明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{returnItemIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] returnItemIds) { + return toAjax(returnItemService.deleteWithValidByIds(Arrays.asList(returnItemIds), true)); + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierController.java new file mode 100644 index 00000000..58de7d09 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierController.java @@ -0,0 +1,73 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpSupplierBo; +import com.klp.erp.domain.vo.ErpSupplierVo; +import com.klp.erp.service.IErpSupplierService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/supplier") +public class ErpSupplierController extends BaseController { + + private final IErpSupplierService supplierService; + + @GetMapping("/list") + public TableDataInfo list(ErpSupplierBo bo, PageQuery pageQuery) { + return supplierService.queryPageList(bo, pageQuery); + } + + @Log(title = "供应商档案", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpSupplierBo bo, HttpServletResponse response) { + List list = supplierService.queryList(bo); + ExcelUtil.exportExcel(list, "供应商档案", ErpSupplierVo.class, response); + } + + @GetMapping("/{supplierId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long supplierId) { + return R.ok(supplierService.queryById(supplierId)); + } + + @Log(title = "供应商档案", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpSupplierBo bo) { + return toAjax(supplierService.insertByBo(bo)); + } + + @Log(title = "供应商档案", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpSupplierBo bo) { + return toAjax(supplierService.updateByBo(bo)); + } + + @Log(title = "供应商档案", businessType = BusinessType.DELETE) + @DeleteMapping("/{supplierIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] supplierIds) { + return toAjax(supplierService.deleteWithValidByIds(Arrays.asList(supplierIds), true)); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierPriceController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierPriceController.java new file mode 100644 index 00000000..874514e7 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpSupplierPriceController.java @@ -0,0 +1,83 @@ +package com.klp.erp.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.erp.domain.bo.ErpSupplierPriceBo; +import com.klp.erp.domain.bo.MaterialTypeQueryBo; +import com.klp.erp.domain.vo.ErpSupplierPriceVo; +import com.klp.erp.domain.vo.MaterialTypeOptionVo; +import com.klp.erp.service.IErpSupplierPriceService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/supplierPrice") +public class ErpSupplierPriceController extends BaseController { + + private final IErpSupplierPriceService supplierPriceService; + + @GetMapping("/list") + public TableDataInfo list(ErpSupplierPriceBo bo, PageQuery pageQuery) { + return supplierPriceService.queryPageList(bo, pageQuery); + } + + @Log(title = "供应商价格", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(ErpSupplierPriceBo bo, HttpServletResponse response) { + List list = supplierPriceService.queryList(bo); + ExcelUtil.exportExcel(list, "供应商价格", ErpSupplierPriceVo.class, response); + } + + @GetMapping("/{priceId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long priceId) { + return R.ok(supplierPriceService.queryById(priceId)); + } + + @Log(title = "供应商价格", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody ErpSupplierPriceBo bo) { + return toAjax(supplierPriceService.insertByBo(bo)); + } + + @Log(title = "供应商价格", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody ErpSupplierPriceBo bo) { + return toAjax(supplierPriceService.updateByBo(bo)); + } + + @Log(title = "供应商价格", businessType = BusinessType.DELETE) + @DeleteMapping("/{priceIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] priceIds) { + return toAjax(supplierPriceService.deleteWithValidByIds(Arrays.asList(priceIds), true)); + } + + /** + * 物料类型下拉 + */ + @GetMapping("/material-types") + public R> materialTypes(MaterialTypeQueryBo bo) { + return R.ok(supplierPriceService.queryMaterialTypeOptions(bo)); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrderItem.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrderItem.java new file mode 100644 index 00000000..c8f9565c --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrderItem.java @@ -0,0 +1,50 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 采购订单明细对象 erp_purchase_order_item + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_purchase_order_item") +public class ErpPurchaseOrderItem extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "item_id") + private Long itemId; + + private Long orderId; + + private String materialTypeCode; + + private String specification; + + private BigDecimal quantity; + + private BigDecimal unitPrice; + + private BigDecimal amount; + + private BigDecimal currentStock; + + private BigDecimal onTheWay; + + private BigDecimal salesDemand; + + private BigDecimal suggestPurchase; + + @TableLogic + private Long delFlag; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReceipt.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReceipt.java new file mode 100644 index 00000000..e102b917 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReceipt.java @@ -0,0 +1,44 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 采购收货记录表 erp_purchase_receipt + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_purchase_receipt") +public class ErpPurchaseReceipt extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "receipt_id") + private Long receiptId; + + private Long orderId; + + private Long itemId; + + private BigDecimal receivedQty; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date receiptTime; + + private String qualityResult; + + @TableLogic + private Integer delFlag; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseRequirement.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseRequirement.java new file mode 100644 index 00000000..c4caf345 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseRequirement.java @@ -0,0 +1,45 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_purchase_requirement") +public class ErpPurchaseRequirement extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "req_id") + private Long reqId; + + private String materialTypeCode; + + private String specification; + + private BigDecimal salesDemand; + + private BigDecimal productStock; + + private BigDecimal rawStock; + + private BigDecimal rawStockConv; + + private BigDecimal onTheWay; + + private BigDecimal onTheWayConv; + + private BigDecimal suggestPurchaseQty; + + @TableLogic + private Integer delFlag; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturn.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturn.java new file mode 100644 index 00000000..c22cddb1 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturn.java @@ -0,0 +1,37 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 采购退货主表 erp_purchase_return + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_purchase_return") +public class ErpPurchaseReturn extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "return_id") + private Long returnId; + + private Long orderId; + + private String returnType; + + private String reason; + + private Integer status; + + @TableLogic + private Integer delFlag; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturnItem.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturnItem.java new file mode 100644 index 00000000..b1315090 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseReturnItem.java @@ -0,0 +1,39 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 采购退货明细表 erp_purchase_return_item + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_purchase_return_item") +public class ErpPurchaseReturnItem extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "return_item_id") + private Long returnItemId; + + private Long returnId; + + private Long itemId; + + private BigDecimal returnQty; + + private String photos; + + @TableLogic + private Integer delFlag; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplier.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplier.java new file mode 100644 index 00000000..44c91cc8 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplier.java @@ -0,0 +1,44 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 供应商档案对象 erp_supplier + * + * @author klp + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_supplier") +public class ErpSupplier extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "supplier_id") + private Long supplierId; + + private String supplierCode; + + private String name; + + private String type; + + private String creditRating; + + private String contactPerson; + + private String contactPhone; + + private String address; + + @TableLogic + private Long delFlag; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplierPrice.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplierPrice.java new file mode 100644 index 00000000..5412de22 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpSupplierPrice.java @@ -0,0 +1,43 @@ +package com.klp.erp.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 供应商价格对象 erp_supplier_price + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("erp_supplier_price") +public class ErpSupplierPrice extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "price_id") + private Long priceId; + + private Long supplierId; + + private String materialTypeCode; + + private String specification; + + private BigDecimal price; + + private Date validFrom; + + private Date validTo; + + @TableLogic + private Long delFlag; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderItemBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderItemBo.java new file mode 100644 index 00000000..3299037c --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderItemBo.java @@ -0,0 +1,48 @@ +package com.klp.erp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 采购订单明细业务对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpPurchaseOrderItemBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long itemId; + + @NotNull(message = "订单ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long orderId; + + @NotBlank(message = "物料类型编码不能为空", groups = {AddGroup.class, EditGroup.class}) + private String materialTypeCode; + + private String specification; + + @NotNull(message = "采购数量不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal quantity; + + private BigDecimal unitPrice; + + private BigDecimal amount; + + private BigDecimal currentStock; + + private BigDecimal onTheWay; + + private BigDecimal salesDemand; + + private BigDecimal suggestPurchase; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReceiptBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReceiptBo.java new file mode 100644 index 00000000..b47e86aa --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReceiptBo.java @@ -0,0 +1,38 @@ +package com.klp.erp.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpPurchaseReceiptBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long receiptId; + + @NotNull(message = "订单ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long orderId; + + @NotNull(message = "订单明细ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long itemId; + + @NotNull(message = "收货数量不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal receivedQty; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date receiptTime; + + private String qualityResult; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnBo.java new file mode 100644 index 00000000..61975ef2 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnBo.java @@ -0,0 +1,30 @@ +package com.klp.erp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpPurchaseReturnBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long returnId; + + @NotNull(message = "订单ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long orderId; + + private String returnType; + + private String reason; + + private Integer status; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnItemBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnItemBo.java new file mode 100644 index 00000000..5656b547 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseReturnItemBo.java @@ -0,0 +1,33 @@ +package com.klp.erp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpPurchaseReturnItemBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long returnItemId; + + @NotNull(message = "退货单ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long returnId; + + @NotNull(message = "订单明细ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long itemId; + + @NotNull(message = "退货数量不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal returnQty; + + private String photos; + + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierBo.java new file mode 100644 index 00000000..680a444f --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierBo.java @@ -0,0 +1,40 @@ +package com.klp.erp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 供应商档案业务对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpSupplierBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long supplierId; + + @NotBlank(message = "供应商编码不能为空", groups = {AddGroup.class, EditGroup.class}) + private String supplierCode; + + @NotBlank(message = "供应商名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String name; + + private String type; + + private String creditRating; + + private String contactPerson; + + private String contactPhone; + + private String address; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierPriceBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierPriceBo.java new file mode 100644 index 00000000..3d629ff9 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpSupplierPriceBo.java @@ -0,0 +1,44 @@ +package com.klp.erp.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 供应商价格业务对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ErpSupplierPriceBo extends BaseEntity { + + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long priceId; + + @NotNull(message = "供应商不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long supplierId; + + @NotBlank(message = "物料类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String materialTypeCode; + + private String specification; + + @NotNull(message = "价格不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal price; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date validFrom; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date validTo; + + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/MaterialTypeQueryBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/MaterialTypeQueryBo.java new file mode 100644 index 00000000..8873e02b --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/MaterialTypeQueryBo.java @@ -0,0 +1,20 @@ +package com.klp.erp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 物料类型查询条件 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MaterialTypeQueryBo extends BaseEntity { + + private String materialTypeCode; + + private String specification; + + private Long supplierId; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementAnalyzeBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementAnalyzeBo.java new file mode 100644 index 00000000..a42e53e2 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementAnalyzeBo.java @@ -0,0 +1,24 @@ +package com.klp.erp.domain.bo; + +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +@Data +public class PurchaseRequirementAnalyzeBo { + + /** + * 产品与原料转换关系 + */ + @NotEmpty(message = "转换映射关系不能为空") + @Valid + private List mappings; + + /** + * 是否持久化分析结果 + */ + private Boolean persistResult = Boolean.FALSE; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementMappingBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementMappingBo.java new file mode 100644 index 00000000..c158b5fc --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/PurchaseRequirementMappingBo.java @@ -0,0 +1,27 @@ +package com.klp.erp.domain.bo; + +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Data +public class PurchaseRequirementMappingBo { + + @NotNull(message = "产品ID不能为空") + private Long productId; + + private String productCode; + + @NotNull(message = "原料ID不能为空") + private Long rawMaterialId; + + private String rawMaterialCode; + + /** + * 原料转成品的转换率(0.95 表示 1 吨原料 ≈ 0.95 吨成品) + */ + @NotNull(message = "转换率不能为空") + private BigDecimal conversionRate; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductDemandDTO.java b/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductDemandDTO.java new file mode 100644 index 00000000..f5a43eb0 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductDemandDTO.java @@ -0,0 +1,12 @@ +package com.klp.erp.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ProductDemandDTO { + private Long productId; + private BigDecimal demandQuantity; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductStockDTO.java b/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductStockDTO.java new file mode 100644 index 00000000..416abee6 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/dto/ProductStockDTO.java @@ -0,0 +1,13 @@ +package com.klp.erp.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class ProductStockDTO { + private Long productId; + private Long coilCount; + private BigDecimal totalWeight; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/dto/RawStockDTO.java b/klp-erp/src/main/java/com/klp/erp/domain/dto/RawStockDTO.java new file mode 100644 index 00000000..c2ca07f3 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/dto/RawStockDTO.java @@ -0,0 +1,13 @@ +package com.klp.erp.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RawStockDTO { + private Long rawMaterialId; + private Long coilCount; + private BigDecimal totalWeight; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/dto/RawTransitDTO.java b/klp-erp/src/main/java/com/klp/erp/domain/dto/RawTransitDTO.java new file mode 100644 index 00000000..0dbeb1a2 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/dto/RawTransitDTO.java @@ -0,0 +1,12 @@ +package com.klp.erp.domain.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RawTransitDTO { + private Long rawMaterialId; + private BigDecimal quantity; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderItemVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderItemVo.java new file mode 100644 index 00000000..15c568cc --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderItemVo.java @@ -0,0 +1,55 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 采购订单明细视图对象 + */ +@Data +@ExcelIgnoreUnannotated +public class ErpPurchaseOrderItemVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("明细ID") + private Long itemId; + + @ExcelProperty("订单ID") + private Long orderId; + + @ExcelProperty("物料类型编码") + private String materialTypeCode; + + @ExcelProperty("规格") + private String specification; + + @ExcelProperty("采购数量") + private BigDecimal quantity; + + @ExcelProperty("单价") + private BigDecimal unitPrice; + + @ExcelProperty("金额") + private BigDecimal amount; + + @ExcelProperty("当前库存") + private BigDecimal currentStock; + + @ExcelProperty("在途数量") + private BigDecimal onTheWay; + + @ExcelProperty("销售需求") + private BigDecimal salesDemand; + + @ExcelProperty("建议采购数量") + private BigDecimal suggestPurchase; + + @ExcelProperty("备注") + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReceiptVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReceiptVo.java new file mode 100644 index 00000000..3beb4cfa --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReceiptVo.java @@ -0,0 +1,41 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +@Data +@ExcelIgnoreUnannotated +public class ErpPurchaseReceiptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("收货记录ID") + private Long receiptId; + + @ExcelProperty("订单ID") + private Long orderId; + + @ExcelProperty("订单明细ID") + private Long itemId; + + @ExcelProperty("收货数量") + private BigDecimal receivedQty; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty("收货时间") + private Date receiptTime; + + @ExcelProperty("质检结果") + private String qualityResult; + + @ExcelProperty("备注") + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnItemVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnItemVo.java new file mode 100644 index 00000000..6811af8d --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnItemVo.java @@ -0,0 +1,35 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ExcelIgnoreUnannotated +public class ErpPurchaseReturnItemVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("退货明细ID") + private Long returnItemId; + + @ExcelProperty("退货单ID") + private Long returnId; + + @ExcelProperty("订单明细ID") + private Long itemId; + + @ExcelProperty("退货数量") + private BigDecimal returnQty; + + @ExcelProperty("问题照片") + private String photos; + + @ExcelProperty("备注") + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnVo.java new file mode 100644 index 00000000..ca6e855d --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseReturnVo.java @@ -0,0 +1,34 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ExcelIgnoreUnannotated +public class ErpPurchaseReturnVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("退货单ID") + private Long returnId; + + @ExcelProperty("订单ID") + private Long orderId; + + @ExcelProperty("退货类型") + private String returnType; + + @ExcelProperty("退货原因") + private String reason; + + @ExcelProperty("退货状态") + private Integer status; + + @ExcelProperty("备注") + private String remark; +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierPriceVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierPriceVo.java new file mode 100644 index 00000000..d6f824a0 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierPriceVo.java @@ -0,0 +1,47 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 供应商价格视图对象 + */ +@Data +@ExcelIgnoreUnannotated +public class ErpSupplierPriceVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("价格ID") + private Long priceId; + + @ExcelProperty("供应商ID") + private Long supplierId; + + @ExcelProperty("物料类型编码") + private String materialTypeCode; + + @ExcelProperty("规格") + private String specification; + + @ExcelProperty("价格") + private BigDecimal price; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ExcelProperty("生效日期") + private Date validFrom; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ExcelProperty("失效日期") + private Date validTo; + + @ExcelProperty("备注") + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierVo.java new file mode 100644 index 00000000..77c41c3e --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpSupplierVo.java @@ -0,0 +1,45 @@ +package com.klp.erp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 供应商档案视图对象 + */ +@Data +@ExcelIgnoreUnannotated +public class ErpSupplierVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("供应商ID") + private Long supplierId; + + @ExcelProperty("供应商编码") + private String supplierCode; + + @ExcelProperty("供应商名称") + private String name; + + @ExcelProperty("供应商类型") + private String type; + + @ExcelProperty("信用等级") + private String creditRating; + + @ExcelProperty("联系人") + private String contactPerson; + + @ExcelProperty("联系电话") + private String contactPhone; + + @ExcelProperty("地址") + private String address; + + @ExcelProperty("备注") + private String remark; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/MaterialTypeOptionVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/MaterialTypeOptionVo.java new file mode 100644 index 00000000..b7293e02 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/MaterialTypeOptionVo.java @@ -0,0 +1,21 @@ +package com.klp.erp.domain.vo; + +import lombok.Data; + +/** + * 物料类型下拉视图 + */ +@Data +public class MaterialTypeOptionVo { + + private String materialTypeCode; + + private String specification; + + private Long supplierId; + + private String supplierName; + + private java.math.BigDecimal latestPrice; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementRawDetailVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementRawDetailVo.java new file mode 100644 index 00000000..7058909b --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementRawDetailVo.java @@ -0,0 +1,21 @@ +package com.klp.erp.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class PurchaseRequirementRawDetailVo { + private Long rawMaterialId; + private String rawMaterialCode; + private String rawMaterialName; + private BigDecimal conversionRate; + private BigDecimal stockWeight; + private Long stockCoilCount; + private BigDecimal inTransitWeight; + private BigDecimal pendingWeight; + private BigDecimal convertedStock; + private BigDecimal convertedInTransit; + private BigDecimal convertedPending; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementVo.java new file mode 100644 index 00000000..7ac6ba6d --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/PurchaseRequirementVo.java @@ -0,0 +1,35 @@ +package com.klp.erp.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +public class PurchaseRequirementVo { + private Long productId; + private String productCode; + private String productName; + private String specification; + + private BigDecimal salesDemand = BigDecimal.ZERO; + + private BigDecimal productStockWeight = BigDecimal.ZERO; + private Long productStockCoilCount = 0L; + + private BigDecimal rawStockWeight = BigDecimal.ZERO; + private Long rawStockCoilCount = 0L; + private BigDecimal rawStockConverted = BigDecimal.ZERO; + + private BigDecimal inTransitWeight = BigDecimal.ZERO; + private BigDecimal inTransitConverted = BigDecimal.ZERO; + + private BigDecimal pendingWeight = BigDecimal.ZERO; + private BigDecimal pendingConverted = BigDecimal.ZERO; + + private BigDecimal suggestedPurchase = BigDecimal.ZERO; + + private List rawDetails = new ArrayList<>(); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/enums/PurchaseOrderStatus.java b/klp-erp/src/main/java/com/klp/erp/enums/PurchaseOrderStatus.java new file mode 100644 index 00000000..196ee8ea --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/enums/PurchaseOrderStatus.java @@ -0,0 +1,21 @@ +package com.klp.erp.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 采购订单状态枚举 + */ +@Getter +@AllArgsConstructor +public enum PurchaseOrderStatus { + + DRAFT(0), + EXECUTING(1), + PARTIAL_ARRIVAL(2), + COMPLETED(3), + CANCELLED(4); + + private final int code; +} + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderItemMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderItemMapper.java new file mode 100644 index 00000000..39e8b2c5 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderItemMapper.java @@ -0,0 +1,12 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpPurchaseOrderItem; +import com.klp.erp.domain.vo.ErpPurchaseOrderItemVo; + +/** + * 采购订单明细Mapper接口 + */ +public interface ErpPurchaseOrderItemMapper extends BaseMapperPlus { +} + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReceiptMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReceiptMapper.java new file mode 100644 index 00000000..5106bfae --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReceiptMapper.java @@ -0,0 +1,12 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpPurchaseReceipt; +import com.klp.erp.domain.vo.ErpPurchaseReceiptVo; + +public interface ErpPurchaseReceiptMapper extends BaseMapperPlus { + + java.math.BigDecimal sumQualifiedQtyByItem(Long itemId); +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReportMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReportMapper.java new file mode 100644 index 00000000..846b9432 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReportMapper.java @@ -0,0 +1,24 @@ +package com.klp.erp.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +public interface ErpPurchaseReportMapper { + + BigDecimal sumTotalAmount(@Param("beginTime") String beginTime, + @Param("endTime") String endTime); + + List> sumAmountBySupplier(@Param("beginTime") String beginTime, + @Param("endTime") String endTime); + + List> selectPriceTrend(@Param("beginTime") String beginTime, + @Param("endTime") String endTime); + + List> selectSupplierQuality(@Param("beginTime") String beginTime, + @Param("endTime") String endTime); +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseRequirementMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseRequirementMapper.java new file mode 100644 index 00000000..0f00cf86 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseRequirementMapper.java @@ -0,0 +1,12 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpPurchaseRequirement; +import org.apache.ibatis.annotations.Delete; + +public interface ErpPurchaseRequirementMapper extends BaseMapperPlus { + + @Delete("DELETE FROM erp_purchase_requirement") + void deleteAll(); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnItemMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnItemMapper.java new file mode 100644 index 00000000..dcec51d2 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnItemMapper.java @@ -0,0 +1,14 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpPurchaseReturnItem; +import com.klp.erp.domain.vo.ErpPurchaseReturnItemVo; + +public interface ErpPurchaseReturnItemMapper extends BaseMapperPlus { + + java.math.BigDecimal sumAllReturnQtyByItem(Long itemId); + + java.math.BigDecimal sumCompletedReturnQtyByItem(Long itemId); +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnMapper.java new file mode 100644 index 00000000..69ff75ae --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseReturnMapper.java @@ -0,0 +1,10 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpPurchaseReturn; +import com.klp.erp.domain.vo.ErpPurchaseReturnVo; + +public interface ErpPurchaseReturnMapper extends BaseMapperPlus { +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierMapper.java new file mode 100644 index 00000000..9fa9856b --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierMapper.java @@ -0,0 +1,12 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpSupplier; +import com.klp.erp.domain.vo.ErpSupplierVo; + +/** + * 供应商档案Mapper接口 + */ +public interface ErpSupplierMapper extends BaseMapperPlus { +} + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierPriceMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierPriceMapper.java new file mode 100644 index 00000000..793df480 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpSupplierPriceMapper.java @@ -0,0 +1,18 @@ +package com.klp.erp.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.erp.domain.ErpSupplierPrice; +import com.klp.erp.domain.bo.MaterialTypeQueryBo; +import com.klp.erp.domain.vo.ErpSupplierPriceVo; +import com.klp.erp.domain.vo.MaterialTypeOptionVo; + +import java.util.List; + +/** + * 供应商价格Mapper接口 + */ +public interface ErpSupplierPriceMapper extends BaseMapperPlus { + + List selectMaterialTypeOptions(MaterialTypeQueryBo bo); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/PurchaseRequirementCalcMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/PurchaseRequirementCalcMapper.java new file mode 100644 index 00000000..e2e882ab --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/mapper/PurchaseRequirementCalcMapper.java @@ -0,0 +1,22 @@ +package com.klp.erp.mapper; + +import com.klp.erp.domain.dto.ProductDemandDTO; +import com.klp.erp.domain.dto.ProductStockDTO; +import com.klp.erp.domain.dto.RawStockDTO; +import com.klp.erp.domain.dto.RawTransitDTO; + +import java.util.List; + +public interface PurchaseRequirementCalcMapper { + + List selectProductDemand(); + + List selectProductStock(); + + List selectRawStock(); + + List selectRawInTransit(); + + List selectRawPending(); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderItemService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderItemService.java new file mode 100644 index 00000000..3169d6d3 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderItemService.java @@ -0,0 +1,28 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpPurchaseOrderItemBo; +import com.klp.erp.domain.vo.ErpPurchaseOrderItemVo; + +import java.util.Collection; +import java.util.List; + +/** + * 采购订单明细Service接口 + */ +public interface IErpPurchaseOrderItemService { + + ErpPurchaseOrderItemVo queryById(Long itemId); + + TableDataInfo queryPageList(ErpPurchaseOrderItemBo bo, PageQuery pageQuery); + + List queryList(ErpPurchaseOrderItemBo bo); + + Boolean insertByBo(ErpPurchaseOrderItemBo bo); + + Boolean updateByBo(ErpPurchaseOrderItemBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReceiptService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReceiptService.java new file mode 100644 index 00000000..3d1b0133 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReceiptService.java @@ -0,0 +1,25 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpPurchaseReceiptBo; +import com.klp.erp.domain.vo.ErpPurchaseReceiptVo; + +import java.util.Collection; +import java.util.List; + +public interface IErpPurchaseReceiptService { + + ErpPurchaseReceiptVo queryById(Long receiptId); + + TableDataInfo queryPageList(ErpPurchaseReceiptBo bo, PageQuery pageQuery); + + List queryList(ErpPurchaseReceiptBo bo); + + Boolean insertByBo(ErpPurchaseReceiptBo bo); + + Boolean updateByBo(ErpPurchaseReceiptBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseRequirementService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseRequirementService.java new file mode 100644 index 00000000..5a6a945f --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseRequirementService.java @@ -0,0 +1,12 @@ +package com.klp.erp.service; + +import com.klp.erp.domain.bo.PurchaseRequirementAnalyzeBo; +import com.klp.erp.domain.vo.PurchaseRequirementVo; + +import java.util.List; + +public interface IErpPurchaseRequirementService { + + List analyze(PurchaseRequirementAnalyzeBo bo); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnItemService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnItemService.java new file mode 100644 index 00000000..08b2dc09 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnItemService.java @@ -0,0 +1,25 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpPurchaseReturnItemBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnItemVo; + +import java.util.Collection; +import java.util.List; + +public interface IErpPurchaseReturnItemService { + + ErpPurchaseReturnItemVo queryById(Long returnItemId); + + TableDataInfo queryPageList(ErpPurchaseReturnItemBo bo, PageQuery pageQuery); + + List queryList(ErpPurchaseReturnItemBo bo); + + Boolean insertByBo(ErpPurchaseReturnItemBo bo); + + Boolean updateByBo(ErpPurchaseReturnItemBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnService.java new file mode 100644 index 00000000..2953d960 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseReturnService.java @@ -0,0 +1,25 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpPurchaseReturnBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnVo; + +import java.util.Collection; +import java.util.List; + +public interface IErpPurchaseReturnService { + + ErpPurchaseReturnVo queryById(Long returnId); + + TableDataInfo queryPageList(ErpPurchaseReturnBo bo, PageQuery pageQuery); + + List queryList(ErpPurchaseReturnBo bo); + + Boolean insertByBo(ErpPurchaseReturnBo bo); + + Boolean updateByBo(ErpPurchaseReturnBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierPriceService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierPriceService.java new file mode 100644 index 00000000..c7820172 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierPriceService.java @@ -0,0 +1,32 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpSupplierPriceBo; +import com.klp.erp.domain.bo.MaterialTypeQueryBo; +import com.klp.erp.domain.vo.ErpSupplierPriceVo; +import com.klp.erp.domain.vo.MaterialTypeOptionVo; + +import java.util.Collection; +import java.util.List; + +/** + * 供应商价格Service接口 + */ +public interface IErpSupplierPriceService { + + ErpSupplierPriceVo queryById(Long priceId); + + TableDataInfo queryPageList(ErpSupplierPriceBo bo, PageQuery pageQuery); + + List queryList(ErpSupplierPriceBo bo); + + Boolean insertByBo(ErpSupplierPriceBo bo); + + Boolean updateByBo(ErpSupplierPriceBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + List queryMaterialTypeOptions(MaterialTypeQueryBo bo); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierService.java new file mode 100644 index 00000000..129c7861 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/IErpSupplierService.java @@ -0,0 +1,28 @@ +package com.klp.erp.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.bo.ErpSupplierBo; +import com.klp.erp.domain.vo.ErpSupplierVo; + +import java.util.Collection; +import java.util.List; + +/** + * 供应商档案Service接口 + */ +public interface IErpSupplierService { + + ErpSupplierVo queryById(Long supplierId); + + TableDataInfo queryPageList(ErpSupplierBo bo, PageQuery pageQuery); + + List queryList(ErpSupplierBo bo); + + Boolean insertByBo(ErpSupplierBo bo); + + Boolean updateByBo(ErpSupplierBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java new file mode 100644 index 00000000..481db30b --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java @@ -0,0 +1,83 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.erp.domain.ErpPurchaseOrderItem; +import com.klp.erp.domain.bo.ErpPurchaseOrderItemBo; +import com.klp.erp.domain.vo.ErpPurchaseOrderItemVo; +import com.klp.erp.mapper.ErpPurchaseOrderItemMapper; +import com.klp.erp.service.IErpPurchaseOrderItemService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +@RequiredArgsConstructor +@Service +public class ErpPurchaseOrderItemServiceImpl implements IErpPurchaseOrderItemService { + + private final ErpPurchaseOrderItemMapper baseMapper; + + @Override + public ErpPurchaseOrderItemVo queryById(Long itemId) { + return baseMapper.selectVoById(itemId); + } + + @Override + public TableDataInfo queryPageList(ErpPurchaseOrderItemBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpPurchaseOrderItemBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpPurchaseOrderItemBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOrderId() != null, ErpPurchaseOrderItem::getOrderId, bo.getOrderId()); + lqw.like(StringUtils.isNotBlank(bo.getMaterialTypeCode()), ErpPurchaseOrderItem::getMaterialTypeCode, bo.getMaterialTypeCode()); + lqw.like(StringUtils.isNotBlank(bo.getSpecification()), ErpPurchaseOrderItem::getSpecification, bo.getSpecification()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpPurchaseOrderItemBo bo) { + ErpPurchaseOrderItem add = BeanUtil.toBean(bo, ErpPurchaseOrderItem.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setItemId(add.getItemId()); + } + return flag; + } + + @Override + public Boolean updateByBo(ErpPurchaseOrderItemBo bo) { + ErpPurchaseOrderItem update = BeanUtil.toBean(bo, ErpPurchaseOrderItem.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(ErpPurchaseOrderItem entity) { + // TODO: 数量/金额校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO: 删除校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReceiptServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReceiptServiceImpl.java new file mode 100644 index 00000000..07049454 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReceiptServiceImpl.java @@ -0,0 +1,135 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.exception.ServiceException; +import com.klp.erp.domain.ErpPurchaseOrderItem; +import com.klp.erp.domain.ErpPurchaseReceipt; +import com.klp.erp.domain.bo.ErpPurchaseReceiptBo; +import com.klp.erp.domain.vo.ErpPurchaseReceiptVo; +import com.klp.erp.mapper.ErpPurchaseOrderItemMapper; +import com.klp.erp.mapper.ErpPurchaseReceiptMapper; +import com.klp.erp.service.IErpPurchaseOrderService; +import com.klp.erp.service.IErpPurchaseReceiptService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +@RequiredArgsConstructor +public class ErpPurchaseReceiptServiceImpl implements IErpPurchaseReceiptService { + + private final ErpPurchaseReceiptMapper baseMapper; + private final ErpPurchaseOrderItemMapper orderItemMapper; + private final IErpPurchaseOrderService orderService; + + @Override + public ErpPurchaseReceiptVo queryById(Long receiptId) { + return baseMapper.selectVoById(receiptId); + } + + @Override + public TableDataInfo queryPageList(ErpPurchaseReceiptBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpPurchaseReceiptBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpPurchaseReceiptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOrderId() != null, ErpPurchaseReceipt::getOrderId, bo.getOrderId()); + lqw.eq(bo.getItemId() != null, ErpPurchaseReceipt::getItemId, bo.getItemId()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpPurchaseReceiptBo bo) { + ErpPurchaseReceipt add = BeanUtil.toBean(bo, ErpPurchaseReceipt.class); + validateReceiptQuantity(null, bo); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReceiptId(add.getReceiptId()); + if (isQualified(bo.getQualityResult())) { + orderService.refreshOrderStatus(bo.getOrderId()); + } + } + return flag; + } + + @Override + public Boolean updateByBo(ErpPurchaseReceiptBo bo) { + ErpPurchaseReceipt origin = baseMapper.selectById(bo.getReceiptId()); + if (origin == null) { + throw new ServiceException("收货记录不存在"); + } + ErpPurchaseReceipt update = BeanUtil.toBean(bo, ErpPurchaseReceipt.class); + validateReceiptQuantity(origin, bo); + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + orderService.refreshOrderStatus(origin.getOrderId()); + } + return flag; + } + + private void validateReceiptQuantity(ErpPurchaseReceipt origin, ErpPurchaseReceiptBo bo) { + ErpPurchaseOrderItem item = orderItemMapper.selectById(bo.getItemId()); + if (item == null) { + throw new ServiceException("订单明细不存在"); + } + if (!item.getOrderId().equals(bo.getOrderId())) { + throw new ServiceException("订单与明细不匹配"); + } + BigDecimal ordered = safe(item.getQuantity()); + BigDecimal existingQualified = safe(baseMapper.sumQualifiedQtyByItem(bo.getItemId())); + BigDecimal originQualified = origin != null && isQualified(origin.getQualityResult()) + ? safe(origin.getReceivedQty()) : BigDecimal.ZERO; + BigDecimal newQualified = isQualified(bo.getQualityResult()) ? safe(bo.getReceivedQty()) : BigDecimal.ZERO; + BigDecimal effective = existingQualified.subtract(originQualified).add(newQualified); + if (effective.compareTo(ordered) > 0) { + throw new ServiceException("收货数量不能超过订单明细数量"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + List receipts = baseMapper.selectBatchIds(ids); + boolean flag = baseMapper.deleteBatchIds(ids) > 0; + if (flag && receipts != null && !receipts.isEmpty()) { + Set orderIds = new HashSet<>(); + for (ErpPurchaseReceipt receipt : receipts) { + orderIds.add(receipt.getOrderId()); + } + orderIds.forEach(orderService::refreshOrderStatus); + } + return flag; + } + + private boolean isQualified(String qualityResult) { + if (qualityResult == null) { + return true; + } + String upper = qualityResult.trim().toUpperCase(); + return !"NG".equals(upper) && !"不合格".equals(qualityResult.trim()); + } + + private BigDecimal safe(BigDecimal value) { + return value == null ? BigDecimal.ZERO : value; + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseRequirementServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseRequirementServiceImpl.java new file mode 100644 index 00000000..bf458a5d --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseRequirementServiceImpl.java @@ -0,0 +1,235 @@ +package com.klp.erp.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.klp.domain.WmsProduct; +import com.klp.domain.WmsRawMaterial; +import com.klp.erp.domain.ErpPurchaseRequirement; +import com.klp.erp.domain.bo.PurchaseRequirementAnalyzeBo; +import com.klp.erp.domain.bo.PurchaseRequirementMappingBo; +import com.klp.erp.domain.dto.ProductDemandDTO; +import com.klp.erp.domain.dto.ProductStockDTO; +import com.klp.erp.domain.dto.RawStockDTO; +import com.klp.erp.domain.dto.RawTransitDTO; +import com.klp.erp.domain.vo.PurchaseRequirementRawDetailVo; +import com.klp.erp.domain.vo.PurchaseRequirementVo; +import com.klp.erp.mapper.ErpPurchaseRequirementMapper; +import com.klp.erp.mapper.PurchaseRequirementCalcMapper; +import com.klp.erp.service.IErpPurchaseRequirementService; +import com.klp.mapper.WmsProductMapper; +import com.klp.mapper.WmsRawMaterialMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Service +@RequiredArgsConstructor +public class ErpPurchaseRequirementServiceImpl implements IErpPurchaseRequirementService { + + private static final BigDecimal ZERO = BigDecimal.ZERO; + + private final PurchaseRequirementCalcMapper calcMapper; + private final ErpPurchaseRequirementMapper requirementMapper; + private final WmsProductMapper productMapper; + private final WmsRawMaterialMapper rawMaterialMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public List analyze(PurchaseRequirementAnalyzeBo bo) { + Map> mappingByProduct = bo.getMappings() + .stream() + .collect(Collectors.groupingBy(PurchaseRequirementMappingBo::getProductId)); + + Set productIds = new HashSet<>(mappingByProduct.keySet()); + Set rawIds = bo.getMappings().stream().map(PurchaseRequirementMappingBo::getRawMaterialId).collect(Collectors.toSet()); + + Map demandMap = toBigDecimalMap(streamOf(calcMapper.selectProductDemand()), + ProductDemandDTO::getProductId, ProductDemandDTO::getDemandQuantity); + + productIds.addAll(demandMap.keySet()); + + Map productStockMap = streamOf(calcMapper.selectProductStock()) + .collect(Collectors.toMap(ProductStockDTO::getProductId, Function.identity(), (a, b) -> a)); + + Map rawStockMap = streamOf(calcMapper.selectRawStock()) + .collect(Collectors.toMap(RawStockDTO::getRawMaterialId, Function.identity(), (a, b) -> a)); + + Map rawInTransitMap = toBigDecimalMap(streamOf(calcMapper.selectRawInTransit()), + RawTransitDTO::getRawMaterialId, RawTransitDTO::getQuantity); + Map rawPendingMap = toBigDecimalMap(streamOf(calcMapper.selectRawPending()), + RawTransitDTO::getRawMaterialId, RawTransitDTO::getQuantity); + + Map productInfoMap = loadProducts(productIds); + Map rawInfoMap = loadRawMaterials(rawIds); + + List result = productIds.stream() + .sorted() + .map(productId -> buildRequirement(productId, + mappingByProduct.getOrDefault(productId, Collections.emptyList()), + demandMap, + productStockMap, + rawStockMap, + rawInTransitMap, + rawPendingMap, + productInfoMap, + rawInfoMap)) + .collect(Collectors.toList()); + + if (Boolean.TRUE.equals(bo.getPersistResult())) { + persistRequirements(result); + } + return result; + } + + private PurchaseRequirementVo buildRequirement(Long productId, + List mappings, + Map demandMap, + Map productStockMap, + Map rawStockMap, + Map rawInTransitMap, + Map rawPendingMap, + Map productInfoMap, + Map rawInfoMap) { + PurchaseRequirementVo vo = new PurchaseRequirementVo(); + vo.setProductId(productId); + WmsProduct product = productInfoMap.get(productId); + if (product != null) { + vo.setProductCode(product.getProductCode()); + vo.setProductName(product.getProductName()); + vo.setSpecification(product.getSpecification()); + } + vo.setSalesDemand(safeNumber(demandMap.get(productId))); + + ProductStockDTO stockDTO = productStockMap.get(productId); + if (stockDTO != null) { + vo.setProductStockWeight(safeNumber(stockDTO.getTotalWeight())); + vo.setProductStockCoilCount(Optional.ofNullable(stockDTO.getCoilCount()).orElse(0L)); + } + + BigDecimal rawStockWeightSum = ZERO; + long rawCoilCountSum = 0L; + BigDecimal rawStockConvertedSum = ZERO; + BigDecimal inTransitWeightSum = ZERO; + BigDecimal inTransitConvertedSum = ZERO; + BigDecimal pendingWeightSum = ZERO; + BigDecimal pendingConvertedSum = ZERO; + + for (PurchaseRequirementMappingBo mapping : mappings) { + WmsRawMaterial rawMaterial = rawInfoMap.get(mapping.getRawMaterialId()); + if (rawMaterial == null) { + continue; + } + PurchaseRequirementRawDetailVo detail = new PurchaseRequirementRawDetailVo(); + detail.setRawMaterialId(rawMaterial.getRawMaterialId()); + detail.setRawMaterialCode(rawMaterial.getRawMaterialCode()); + detail.setRawMaterialName(rawMaterial.getRawMaterialName()); + detail.setConversionRate(mapping.getConversionRate()); + + RawStockDTO rawStock = rawStockMap.get(rawMaterial.getRawMaterialId()); + BigDecimal stockWeight = rawStock == null ? ZERO : safeNumber(rawStock.getTotalWeight()); + long stockCoilCount = rawStock == null ? 0L : Optional.ofNullable(rawStock.getCoilCount()).orElse(0L); + BigDecimal convertedStock = stockWeight.multiply(mapping.getConversionRate()).setScale(4, RoundingMode.HALF_UP); + + BigDecimal inTransitWeight = safeNumber(rawInTransitMap.get(rawMaterial.getRawMaterialId())); + BigDecimal convertedTransit = inTransitWeight.multiply(mapping.getConversionRate()).setScale(4, RoundingMode.HALF_UP); + + BigDecimal pendingWeight = safeNumber(rawPendingMap.get(rawMaterial.getRawMaterialId())); + BigDecimal convertedPending = pendingWeight.multiply(mapping.getConversionRate()).setScale(4, RoundingMode.HALF_UP); + + detail.setStockWeight(stockWeight); + detail.setStockCoilCount(stockCoilCount); + detail.setConvertedStock(convertedStock); + detail.setInTransitWeight(inTransitWeight); + detail.setConvertedInTransit(convertedTransit); + detail.setPendingWeight(pendingWeight); + detail.setConvertedPending(convertedPending); + vo.getRawDetails().add(detail); + + rawStockWeightSum = rawStockWeightSum.add(stockWeight); + rawCoilCountSum += stockCoilCount; + rawStockConvertedSum = rawStockConvertedSum.add(convertedStock); + inTransitWeightSum = inTransitWeightSum.add(inTransitWeight); + inTransitConvertedSum = inTransitConvertedSum.add(convertedTransit); + pendingWeightSum = pendingWeightSum.add(pendingWeight); + pendingConvertedSum = pendingConvertedSum.add(convertedPending); + } + + vo.setRawStockWeight(rawStockWeightSum); + vo.setRawStockCoilCount(rawCoilCountSum); + vo.setRawStockConverted(rawStockConvertedSum); + vo.setInTransitWeight(inTransitWeightSum); + vo.setInTransitConverted(inTransitConvertedSum); + vo.setPendingWeight(pendingWeightSum); + vo.setPendingConverted(pendingConvertedSum); + + BigDecimal suggestion = vo.getSalesDemand() + .subtract(vo.getProductStockWeight()) + .subtract(vo.getRawStockConverted()) + .subtract(vo.getInTransitConverted()) + .subtract(vo.getPendingConverted()); + if (suggestion.signum() < 0) { + suggestion = ZERO; + } + vo.setSuggestedPurchase(suggestion.setScale(4, RoundingMode.HALF_UP)); + return vo; + } + + private Stream streamOf(List list) { + return list == null ? Stream.empty() : list.stream(); + } + + private BigDecimal safeNumber(BigDecimal value) { + return value == null ? ZERO : value; + } + + private Map loadProducts(Set ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = productMapper.selectBatchIds(new ArrayList<>(ids)); + return list == null ? Collections.emptyMap() : list.stream() + .collect(Collectors.toMap(WmsProduct::getProductId, Function.identity(), (a, b) -> a)); + } + + private Map loadRawMaterials(Set ids) { + if (CollectionUtils.isEmpty(ids)) { + return Collections.emptyMap(); + } + List list = rawMaterialMapper.selectBatchIds(new ArrayList<>(ids)); + return list == null ? Collections.emptyMap() : list.stream() + .collect(Collectors.toMap(WmsRawMaterial::getRawMaterialId, Function.identity(), (a, b) -> a)); + } + + private void persistRequirements(List vos) { + requirementMapper.deleteAll(); + for (PurchaseRequirementVo vo : vos) { + ErpPurchaseRequirement entity = new ErpPurchaseRequirement(); + entity.setMaterialTypeCode(vo.getProductCode()); + entity.setSpecification(vo.getSpecification()); + entity.setSalesDemand(vo.getSalesDemand()); + entity.setProductStock(vo.getProductStockWeight()); + entity.setRawStock(vo.getRawStockWeight()); + entity.setRawStockConv(vo.getRawStockConverted()); + entity.setOnTheWay(vo.getInTransitWeight()); + entity.setOnTheWayConv(vo.getInTransitConverted()); + entity.setSuggestPurchaseQty(vo.getSuggestedPurchase()); + entity.setRemark("自动分析"); + requirementMapper.insert(entity); + } + } + + private Map toBigDecimalMap(Stream stream, + Function keyExtractor, + Function valueExtractor) { + return stream == null ? Collections.emptyMap() + : stream.filter(Objects::nonNull) + .collect(Collectors.toMap(keyExtractor, valueExtractor, BigDecimal::add)); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnItemServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnItemServiceImpl.java new file mode 100644 index 00000000..8ccd7882 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnItemServiceImpl.java @@ -0,0 +1,134 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.exception.ServiceException; +import com.klp.erp.domain.ErpPurchaseReturn; +import com.klp.erp.domain.ErpPurchaseReturnItem; +import com.klp.erp.domain.bo.ErpPurchaseReturnItemBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnItemVo; +import com.klp.erp.mapper.ErpPurchaseReceiptMapper; +import com.klp.erp.mapper.ErpPurchaseReturnItemMapper; +import com.klp.erp.mapper.ErpPurchaseReturnMapper; +import com.klp.erp.service.IErpPurchaseOrderService; +import com.klp.erp.service.IErpPurchaseReturnItemService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Service +@RequiredArgsConstructor +public class ErpPurchaseReturnItemServiceImpl implements IErpPurchaseReturnItemService { + + private final ErpPurchaseReturnItemMapper baseMapper; + private final ErpPurchaseReceiptMapper receiptMapper; + private final ErpPurchaseReturnMapper returnMapper; + private final IErpPurchaseOrderService orderService; + + @Override + public ErpPurchaseReturnItemVo queryById(Long returnItemId) { + return baseMapper.selectVoById(returnItemId); + } + + @Override + public TableDataInfo queryPageList(ErpPurchaseReturnItemBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpPurchaseReturnItemBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpPurchaseReturnItemBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getReturnId() != null, ErpPurchaseReturnItem::getReturnId, bo.getReturnId()); + lqw.eq(bo.getItemId() != null, ErpPurchaseReturnItem::getItemId, bo.getItemId()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpPurchaseReturnItemBo bo) { + ErpPurchaseReturnItem add = BeanUtil.toBean(bo, ErpPurchaseReturnItem.class); + validateReturnQuantity(null, bo); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReturnItemId(add.getReturnItemId()); + Long orderId = resolveOrderId(add.getReturnId()); + if (orderId != null) { + orderService.refreshOrderStatus(orderId); + } + } + return flag; + } + + @Override + public Boolean updateByBo(ErpPurchaseReturnItemBo bo) { + ErpPurchaseReturnItem origin = baseMapper.selectById(bo.getReturnItemId()); + if (origin == null) { + return false; + } + ErpPurchaseReturnItem update = BeanUtil.toBean(bo, ErpPurchaseReturnItem.class); + validateReturnQuantity(origin, bo); + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + Long orderId = resolveOrderId(update.getReturnId()); + if (orderId != null) { + orderService.refreshOrderStatus(orderId); + } + } + return flag; + } + + private void validateReturnQuantity(ErpPurchaseReturnItem origin, ErpPurchaseReturnItemBo bo) { + BigDecimal received = safe(receiptMapper.sumQualifiedQtyByItem(bo.getItemId())); + BigDecimal existing = safe(baseMapper.sumAllReturnQtyByItem(bo.getItemId())); + BigDecimal originQty = origin == null ? BigDecimal.ZERO : safe(origin.getReturnQty()); + BigDecimal effective = existing.subtract(originQty).add(safe(bo.getReturnQty())); + if (effective.compareTo(received) > 0) { + throw new ServiceException("退货数量不能超过已收货数量"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + List items = baseMapper.selectBatchIds(ids); + boolean flag = baseMapper.deleteBatchIds(ids) > 0; + if (flag && items != null && !items.isEmpty()) { + Set orderIds = new HashSet<>(); + for (ErpPurchaseReturnItem item : items) { + Long orderId = resolveOrderId(item.getReturnId()); + if (orderId != null) { + orderIds.add(orderId); + } + } + orderIds.forEach(orderService::refreshOrderStatus); + } + return flag; + } + + private Long resolveOrderId(Long returnId) { + if (returnId == null) { + return null; + } + ErpPurchaseReturn purchaseReturn = returnMapper.selectById(returnId); + return purchaseReturn == null ? null : purchaseReturn.getOrderId(); + } + + private BigDecimal safe(BigDecimal value) { + return value == null ? BigDecimal.ZERO : value; + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnServiceImpl.java new file mode 100644 index 00000000..ce674a9f --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseReturnServiceImpl.java @@ -0,0 +1,92 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.erp.domain.ErpPurchaseReturn; +import com.klp.erp.domain.bo.ErpPurchaseReturnBo; +import com.klp.erp.domain.vo.ErpPurchaseReturnVo; +import com.klp.erp.mapper.ErpPurchaseReturnMapper; +import com.klp.erp.service.IErpPurchaseOrderService; +import com.klp.erp.service.IErpPurchaseReturnService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +public class ErpPurchaseReturnServiceImpl implements IErpPurchaseReturnService { + + private final ErpPurchaseReturnMapper baseMapper; + private final IErpPurchaseOrderService orderService; + + @Override + public ErpPurchaseReturnVo queryById(Long returnId) { + return baseMapper.selectVoById(returnId); + } + + @Override + public TableDataInfo queryPageList(ErpPurchaseReturnBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpPurchaseReturnBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpPurchaseReturnBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getOrderId() != null, ErpPurchaseReturn::getOrderId, bo.getOrderId()); + lqw.eq(bo.getStatus() != null, ErpPurchaseReturn::getStatus, bo.getStatus()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpPurchaseReturnBo bo) { + ErpPurchaseReturn add = BeanUtil.toBean(bo, ErpPurchaseReturn.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReturnId(add.getReturnId()); + if (Objects.equals(add.getStatus(), 1)) { + orderService.refreshOrderStatus(add.getOrderId()); + } + } + return flag; + } + + @Override + public Boolean updateByBo(ErpPurchaseReturnBo bo) { + ErpPurchaseReturn update = BeanUtil.toBean(bo, ErpPurchaseReturn.class); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + if (flag && Objects.equals(update.getStatus(), 1)) { + orderService.refreshOrderStatus(update.getOrderId()); + } + return flag; + } + + private void validEntityBeforeSave(ErpPurchaseReturn entity) { + // TODO: 校验退货状态流转 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO: 校验是否允许删除 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} + + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierPriceServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierPriceServiceImpl.java new file mode 100644 index 00000000..7714b00c --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierPriceServiceImpl.java @@ -0,0 +1,90 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.erp.domain.ErpSupplierPrice; +import com.klp.erp.domain.bo.ErpSupplierPriceBo; +import com.klp.erp.domain.bo.MaterialTypeQueryBo; +import com.klp.erp.domain.vo.ErpSupplierPriceVo; +import com.klp.erp.domain.vo.MaterialTypeOptionVo; +import com.klp.erp.mapper.ErpSupplierPriceMapper; +import com.klp.erp.service.IErpSupplierPriceService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +@RequiredArgsConstructor +@Service +public class ErpSupplierPriceServiceImpl implements IErpSupplierPriceService { + + private final ErpSupplierPriceMapper baseMapper; + + @Override + public ErpSupplierPriceVo queryById(Long priceId) { + return baseMapper.selectVoById(priceId); + } + + @Override + public TableDataInfo queryPageList(ErpSupplierPriceBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpSupplierPriceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpSupplierPriceBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getSupplierId() != null, ErpSupplierPrice::getSupplierId, bo.getSupplierId()); + lqw.like(StringUtils.isNotBlank(bo.getMaterialTypeCode()), ErpSupplierPrice::getMaterialTypeCode, bo.getMaterialTypeCode()); + lqw.like(StringUtils.isNotBlank(bo.getSpecification()), ErpSupplierPrice::getSpecification, bo.getSpecification()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpSupplierPriceBo bo) { + ErpSupplierPrice add = BeanUtil.toBean(bo, ErpSupplierPrice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPriceId(add.getPriceId()); + } + return flag; + } + + @Override + public Boolean updateByBo(ErpSupplierPriceBo bo) { + ErpSupplierPrice update = BeanUtil.toBean(bo, ErpSupplierPrice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(ErpSupplierPrice entity) { + // TODO: 唯一性/有效期校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO: 删除前校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List queryMaterialTypeOptions(MaterialTypeQueryBo bo) { + return baseMapper.selectMaterialTypeOptions(bo); + } +} + diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierServiceImpl.java new file mode 100644 index 00000000..58c19ea7 --- /dev/null +++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpSupplierServiceImpl.java @@ -0,0 +1,84 @@ +package com.klp.erp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.erp.domain.ErpSupplier; +import com.klp.erp.domain.bo.ErpSupplierBo; +import com.klp.erp.domain.vo.ErpSupplierVo; +import com.klp.erp.mapper.ErpSupplierMapper; +import com.klp.erp.service.IErpSupplierService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +@RequiredArgsConstructor +@Service +public class ErpSupplierServiceImpl implements IErpSupplierService { + + private final ErpSupplierMapper baseMapper; + + @Override + public ErpSupplierVo queryById(Long supplierId) { + return baseMapper.selectVoById(supplierId); + } + + @Override + public TableDataInfo queryPageList(ErpSupplierBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(ErpSupplierBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(ErpSupplierBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getSupplierCode()), ErpSupplier::getSupplierCode, bo.getSupplierCode()); + lqw.like(StringUtils.isNotBlank(bo.getName()), ErpSupplier::getName, bo.getName()); + lqw.eq(StringUtils.isNotBlank(bo.getType()), ErpSupplier::getType, bo.getType()); + lqw.eq(StringUtils.isNotBlank(bo.getCreditRating()), ErpSupplier::getCreditRating, bo.getCreditRating()); + return lqw; + } + + @Override + public Boolean insertByBo(ErpSupplierBo bo) { + ErpSupplier add = BeanUtil.toBean(bo, ErpSupplier.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setSupplierId(add.getSupplierId()); + } + return flag; + } + + @Override + public Boolean updateByBo(ErpSupplierBo bo) { + ErpSupplier update = BeanUtil.toBean(bo, ErpSupplier.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(ErpSupplier entity) { + // TODO: 唯一性校验 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO: 删除校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderItemMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderItemMapper.xml new file mode 100644 index 00000000..16da9c66 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderItemMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReceiptMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReceiptMapper.xml new file mode 100644 index 00000000..06f80f15 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReceiptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReportMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReportMapper.xml new file mode 100644 index 00000000..29129226 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReportMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnItemMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnItemMapper.xml new file mode 100644 index 00000000..b56525e6 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnItemMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnMapper.xml new file mode 100644 index 00000000..4bed6db3 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseReturnMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpSupplierMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpSupplierMapper.xml new file mode 100644 index 00000000..381a7ada --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpSupplierMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/ErpSupplierPriceMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpSupplierPriceMapper.xml new file mode 100644 index 00000000..1b97e0cc --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/ErpSupplierPriceMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-erp/src/main/resources/mapper/erp/PurchaseRequirementCalcMapper.xml b/klp-erp/src/main/resources/mapper/erp/PurchaseRequirementCalcMapper.xml new file mode 100644 index 00000000..dedbcf95 --- /dev/null +++ b/klp-erp/src/main/resources/mapper/erp/PurchaseRequirementCalcMapper.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FROM erp_purchase_order_item poi + JOIN erp_purchase_order po ON poi.order_id = po.order_id + LEFT JOIN wms_raw_material rm ON rm.raw_material_code = poi.material_type_code + WHERE poi.del_flag = 0 + AND po.del_flag = 0 + AND rm.raw_material_id IS NOT NULL + + + + + + + diff --git a/klp-ui/src/api/erp/purchase.js b/klp-ui/src/api/erp/purchase.js new file mode 100644 index 00000000..d2779437 --- /dev/null +++ b/klp-ui/src/api/erp/purchase.js @@ -0,0 +1,289 @@ +import request from '@/utils/request' + +// 供应商 +export function listSupplier(query) { + return request({ + url: '/erp/supplier/list', + method: 'get', + params: query + }) +} + +export function addSupplier(data) { + return request({ + url: '/erp/supplier', + method: 'post', + data + }) +} + +export function updateSupplier(data) { + return request({ + url: '/erp/supplier', + method: 'put', + data + }) +} + +export function delSupplier(ids) { + return request({ + url: `/erp/supplier/${ids}`, + method: 'delete' + }) +} + +// 供应商价格 +export function listSupplierPrice(query) { + return request({ + url: '/erp/supplierPrice/list', + method: 'get', + params: query + }) +} + +export function addSupplierPrice(data) { + return request({ + url: '/erp/supplierPrice', + method: 'post', + data + }) +} + +export function updateSupplierPrice(data) { + return request({ + url: '/erp/supplierPrice', + method: 'put', + data + }) +} + +export function delSupplierPrice(ids) { + return request({ + url: `/erp/supplierPrice/${ids}`, + method: 'delete' + }) +} + +// 采购订单 +export function listPurchaseOrder(query) { + return request({ + url: '/erp/purchaseOrder/list', + method: 'get', + params: query + }) +} + +export function addPurchaseOrder(data) { + return request({ + url: '/erp/purchaseOrder', + method: 'post', + data + }) +} + +export function updatePurchaseOrder(data) { + return request({ + url: '/erp/purchaseOrder', + method: 'put', + data + }) +} + +export function delPurchaseOrder(ids) { + return request({ + url: `/erp/purchaseOrder/${ids}`, + method: 'delete' + }) +} + +export function confirmPurchaseOrder(orderId) { + return request({ + url: `/erp/purchaseOrder/${orderId}/confirm`, + method: 'put' + }) +} + +export function partialPurchaseOrder(orderId) { + return request({ + url: `/erp/purchaseOrder/${orderId}/partial`, + method: 'put' + }) +} + +export function completePurchaseOrder(orderId) { + return request({ + url: `/erp/purchaseOrder/${orderId}/complete`, + method: 'put' + }) +} + +export function cancelPurchaseOrder(orderId) { + return request({ + url: `/erp/purchaseOrder/${orderId}/cancel`, + method: 'put' + }) +} + +// 采购订单明细 +export function listPurchaseOrderItem(query) { + return request({ + url: '/erp/purchaseOrderItem/list', + method: 'get', + params: query + }) +} + +export function addPurchaseOrderItem(data) { + return request({ + url: '/erp/purchaseOrderItem', + method: 'post', + data + }) +} + +export function updatePurchaseOrderItem(data) { + return request({ + url: '/erp/purchaseOrderItem', + method: 'put', + data + }) +} + +export function delPurchaseOrderItem(ids) { + return request({ + url: `/erp/purchaseOrderItem/${ids}`, + method: 'delete' + }) +} + +// 采购需求分析 +export function analyzePurchaseRequirement(data) { + return request({ + url: '/erp/purchaseRequirement/analyze', + method: 'post', + data + }) +} + +// 收货记录 +export function listPurchaseReceipt(query) { + return request({ + url: '/erp/purchaseReceipt/list', + method: 'get', + params: query + }) +} + +export function addPurchaseReceipt(data) { + return request({ + url: '/erp/purchaseReceipt', + method: 'post', + data + }) +} + +export function updatePurchaseReceipt(data) { + return request({ + url: '/erp/purchaseReceipt', + method: 'put', + data + }) +} + +export function delPurchaseReceipt(receiptId) { + return request({ + url: `/erp/purchaseReceipt/${receiptId}`, + method: 'delete' + }) +} + +// 退货主表 +export function listPurchaseReturn(query) { + return request({ + url: '/erp/purchaseReturn/list', + method: 'get', + params: query + }) +} + +export function addPurchaseReturn(data) { + return request({ + url: '/erp/purchaseReturn', + method: 'post', + data + }) +} + +export function updatePurchaseReturn(data) { + return request({ + url: '/erp/purchaseReturn', + method: 'put', + data + }) +} + +export function delPurchaseReturn(returnIds) { + return request({ + url: `/erp/purchaseReturn/${returnIds}`, + method: 'delete' + }) +} + +// 退货明细 +export function listPurchaseReturnItem(query) { + return request({ + url: '/erp/purchaseReturnItem/list', + method: 'get', + params: query + }) +} + +export function addPurchaseReturnItem(data) { + return request({ + url: '/erp/purchaseReturnItem', + method: 'post', + data + }) +} + +export function updatePurchaseReturnItem(data) { + return request({ + url: '/erp/purchaseReturnItem', + method: 'put', + data + }) +} + +export function delPurchaseReturnItem(itemIds) { + return request({ + url: `/erp/purchaseReturnItem/${itemIds}`, + method: 'delete' + }) +} + +// 报表 +export function getPurchaseReportSummary(params) { + return request({ + url: '/erp/purchaseReport/summary', + method: 'get', + params + }) +} + +export function getPurchasePriceTrend(params) { + return request({ + url: '/erp/purchaseReport/trend', + method: 'get', + params + }) +} + +export function getSupplierQuality(params) { + return request({ + url: '/erp/purchaseReport/supplierQuality', + method: 'get', + params + }) +} + + diff --git a/klp-ui/src/views/erp/order/index.vue b/klp-ui/src/views/erp/order/index.vue new file mode 100644 index 00000000..3b13ad6b --- /dev/null +++ b/klp-ui/src/views/erp/order/index.vue @@ -0,0 +1,394 @@ + + + + + + diff --git a/klp-ui/src/views/erp/purchase/index.vue b/klp-ui/src/views/erp/purchase/index.vue new file mode 100644 index 00000000..a0b0bb83 --- /dev/null +++ b/klp-ui/src/views/erp/purchase/index.vue @@ -0,0 +1,734 @@ + + + + + + diff --git a/klp-ui/src/views/erp/receipt/index.vue b/klp-ui/src/views/erp/receipt/index.vue new file mode 100644 index 00000000..ef4f8c44 --- /dev/null +++ b/klp-ui/src/views/erp/receipt/index.vue @@ -0,0 +1,214 @@ + + + + + + diff --git a/klp-ui/src/views/erp/report/index.vue b/klp-ui/src/views/erp/report/index.vue new file mode 100644 index 00000000..9ccf243d --- /dev/null +++ b/klp-ui/src/views/erp/report/index.vue @@ -0,0 +1,186 @@ + + + + + + diff --git a/klp-ui/src/views/erp/requirement/index.vue b/klp-ui/src/views/erp/requirement/index.vue new file mode 100644 index 00000000..9456e639 --- /dev/null +++ b/klp-ui/src/views/erp/requirement/index.vue @@ -0,0 +1,201 @@ + + + + + + diff --git a/klp-ui/src/views/erp/return/index.vue b/klp-ui/src/views/erp/return/index.vue new file mode 100644 index 00000000..9d5ad272 --- /dev/null +++ b/klp-ui/src/views/erp/return/index.vue @@ -0,0 +1,295 @@ + + + + + + diff --git a/klp-ui/src/views/erp/supplier/index.vue b/klp-ui/src/views/erp/supplier/index.vue new file mode 100644 index 00000000..7e030c8d --- /dev/null +++ b/klp-ui/src/views/erp/supplier/index.vue @@ -0,0 +1,340 @@ + + + + + +