diff --git a/klp-admin/pom.xml b/klp-admin/pom.xml
index 3bdfdcd5..5b446de1 100644
--- a/klp-admin/pom.xml
+++ b/klp-admin/pom.xml
@@ -104,6 +104,10 @@
com.klp
klp-pocket
+
+ com.klp
+ klp-erp
+
diff --git a/klp-admin/src/main/resources/application-prod.yml b/klp-admin/src/main/resources/application-prod.yml
index ac0a944c..2ec08cf3 100644
--- a/klp-admin/src/main/resources/application-prod.yml
+++ b/klp-admin/src/main/resources/application-prod.yml
@@ -123,7 +123,7 @@ spring:
# 密码(如没有密码请注释掉)
password: KeLunPu123!
# 连接超时时间
- timeout: 10s
+ timeout: 30s
# 是否开启ssl
ssl: false
@@ -143,9 +143,9 @@ redisson:
# 连接池大小
connectionPoolSize: 64
# 连接空闲超时,单位:毫秒
- idleConnectionTimeout: 10000
+ idleConnectionTimeout: 100000
# 命令等待超时,单位:毫秒
- timeout: 3000
+ timeout: 30000
# 发布和订阅连接池大小
subscriptionConnectionPoolSize: 50
diff --git a/klp-erp/pom.xml b/klp-erp/pom.xml
new file mode 100644
index 00000000..8e1059a4
--- /dev/null
+++ b/klp-erp/pom.xml
@@ -0,0 +1,22 @@
+
+ 4.0.0
+
+ com.klp
+ klp-oa
+ 0.8.3
+
+ klp-erp
+ klp-erp
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+
+ com.klp
+ klp-wms
+
+
+
diff --git a/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderController.java b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderController.java
new file mode 100644
index 00000000..f324fcd9
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/controller/ErpPurchaseOrderController.java
@@ -0,0 +1,99 @@
+package com.klp.erp.controller;
+
+import java.util.List;
+import java.util.Arrays;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.klp.common.annotation.RepeatSubmit;
+import com.klp.common.annotation.Log;
+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.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.vo.ErpPurchaseOrderVo;
+import com.klp.erp.domain.bo.ErpPurchaseOrderBo;
+import com.klp.erp.service.IErpPurchaseOrderService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 采购订单主
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/erp/purchaseOrder")
+public class ErpPurchaseOrderController extends BaseController {
+
+ private final IErpPurchaseOrderService iErpPurchaseOrderService;
+
+ /**
+ * 查询采购订单主列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(ErpPurchaseOrderBo bo, PageQuery pageQuery) {
+ return iErpPurchaseOrderService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出采购订单主列表
+ */
+ @Log(title = "采购订单主", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(ErpPurchaseOrderBo bo, HttpServletResponse response) {
+ List list = iErpPurchaseOrderService.queryList(bo);
+ ExcelUtil.exportExcel(list, "采购订单主", ErpPurchaseOrderVo.class, response);
+ }
+
+ /**
+ * 获取采购订单主详细信息
+ *
+ * @param orderId 主键
+ */
+ @GetMapping("/{orderId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long orderId) {
+ return R.ok(iErpPurchaseOrderService.queryById(orderId));
+ }
+
+ /**
+ * 新增采购订单主
+ */
+ @Log(title = "采购订单主", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody ErpPurchaseOrderBo bo) {
+ return toAjax(iErpPurchaseOrderService.insertByBo(bo));
+ }
+
+ /**
+ * 修改采购订单主
+ */
+ @Log(title = "采购订单主", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody ErpPurchaseOrderBo bo) {
+ return toAjax(iErpPurchaseOrderService.updateByBo(bo));
+ }
+
+ /**
+ * 删除采购订单主
+ *
+ * @param orderIds 主键串
+ */
+ @Log(title = "采购订单主", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{orderIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] orderIds) {
+ return toAjax(iErpPurchaseOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true));
+ }
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrder.java b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrder.java
new file mode 100644
index 00000000..e9ec1cad
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/domain/ErpPurchaseOrder.java
@@ -0,0 +1,68 @@
+package com.klp.erp.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 采购订单主对象 erp_purchase_order
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("erp_purchase_order")
+public class ErpPurchaseOrder extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 订单ID
+ */
+ @TableId(value = "order_id")
+ private Long orderId;
+ /**
+ * 订单编号
+ */
+ private String orderCode;
+ /**
+ * 供应商ID
+ */
+ private Long supplierId;
+ /**
+ * 下单日期
+ */
+ private Date orderDate;
+ /**
+ * 预计到货日期
+ */
+ private Date expectedArrival;
+ /**
+ * 订单类型
+ */
+ private String orderType;
+ /**
+ * 订单总金额
+ */
+ private BigDecimal totalAmount;
+ /**
+ * 订单状态
+ */
+ private Long orderStatus;
+ /**
+ * 删除标志
+ */
+ @TableLogic
+ private Long delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderBo.java b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderBo.java
new file mode 100644
index 00000000..b2337c76
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/domain/bo/ErpPurchaseOrderBo.java
@@ -0,0 +1,69 @@
+package com.klp.erp.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 采购订单主业务对象 erp_purchase_order
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ErpPurchaseOrderBo extends BaseEntity {
+
+ /**
+ * 订单ID
+ */
+ private Long orderId;
+
+ /**
+ * 订单编号
+ */
+ private String orderCode;
+
+ /**
+ * 供应商ID
+ */
+ private Long supplierId;
+
+ /**
+ * 下单日期
+ */
+ private Date orderDate;
+
+ /**
+ * 预计到货日期
+ */
+ private Date expectedArrival;
+
+ /**
+ * 订单类型
+ */
+ private String orderType;
+
+ /**
+ * 订单总金额
+ */
+ private BigDecimal totalAmount;
+
+ /**
+ * 订单状态
+ */
+ private Long orderStatus;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderVo.java b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderVo.java
new file mode 100644
index 00000000..1d7fc666
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/domain/vo/ErpPurchaseOrderVo.java
@@ -0,0 +1,80 @@
+package com.klp.erp.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 采购订单主视图对象 erp_purchase_order
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class ErpPurchaseOrderVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 订单ID
+ */
+ @ExcelProperty(value = "订单ID")
+ private Long orderId;
+
+ /**
+ * 订单编号
+ */
+ @ExcelProperty(value = "订单编号")
+ private String orderCode;
+
+ /**
+ * 供应商ID
+ */
+ @ExcelProperty(value = "供应商ID")
+ private Long supplierId;
+
+ /**
+ * 下单日期
+ */
+ @ExcelProperty(value = "下单日期")
+ private Date orderDate;
+
+ /**
+ * 预计到货日期
+ */
+ @ExcelProperty(value = "预计到货日期")
+ private Date expectedArrival;
+
+ /**
+ * 订单类型
+ */
+ @ExcelProperty(value = "订单类型")
+ private String orderType;
+
+ /**
+ * 订单总金额
+ */
+ @ExcelProperty(value = "订单总金额")
+ private BigDecimal totalAmount;
+
+ /**
+ * 订单状态
+ */
+ @ExcelProperty(value = "订单状态")
+ private Long orderStatus;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderMapper.java b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderMapper.java
new file mode 100644
index 00000000..6b10e7c4
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/mapper/ErpPurchaseOrderMapper.java
@@ -0,0 +1,15 @@
+package com.klp.erp.mapper;
+
+import com.klp.erp.domain.ErpPurchaseOrder;
+import com.klp.erp.domain.vo.ErpPurchaseOrderVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 采购订单主Mapper接口
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+public interface ErpPurchaseOrderMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderService.java b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderService.java
new file mode 100644
index 00000000..c2160b9a
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/service/IErpPurchaseOrderService.java
@@ -0,0 +1,49 @@
+package com.klp.erp.service;
+
+import com.klp.erp.domain.ErpPurchaseOrder;
+import com.klp.erp.domain.vo.ErpPurchaseOrderVo;
+import com.klp.erp.domain.bo.ErpPurchaseOrderBo;
+import com.klp.common.core.page.TableDataInfo;
+import com.klp.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 采购订单主Service接口
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+public interface IErpPurchaseOrderService {
+
+ /**
+ * 查询采购订单主
+ */
+ ErpPurchaseOrderVo queryById(Long orderId);
+
+ /**
+ * 查询采购订单主列表
+ */
+ TableDataInfo queryPageList(ErpPurchaseOrderBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询采购订单主列表
+ */
+ List queryList(ErpPurchaseOrderBo bo);
+
+ /**
+ * 新增采购订单主
+ */
+ Boolean insertByBo(ErpPurchaseOrderBo bo);
+
+ /**
+ * 修改采购订单主
+ */
+ Boolean updateByBo(ErpPurchaseOrderBo bo);
+
+ /**
+ * 校验并批量删除采购订单主信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderServiceImpl.java b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderServiceImpl.java
new file mode 100644
index 00000000..ce317783
--- /dev/null
+++ b/klp-erp/src/main/java/com/klp/erp/service/impl/ErpPurchaseOrderServiceImpl.java
@@ -0,0 +1,116 @@
+package com.klp.erp.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.klp.common.core.page.TableDataInfo;
+import com.klp.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.klp.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import com.klp.erp.domain.bo.ErpPurchaseOrderBo;
+import com.klp.erp.domain.vo.ErpPurchaseOrderVo;
+import com.klp.erp.domain.ErpPurchaseOrder;
+import com.klp.erp.mapper.ErpPurchaseOrderMapper;
+import com.klp.erp.service.IErpPurchaseOrderService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 采购订单主Service业务层处理
+ *
+ * @author klp
+ * @date 2025-11-13
+ */
+@RequiredArgsConstructor
+@Service
+public class ErpPurchaseOrderServiceImpl implements IErpPurchaseOrderService {
+
+ private final ErpPurchaseOrderMapper baseMapper;
+
+ /**
+ * 查询采购订单主
+ */
+ @Override
+ public ErpPurchaseOrderVo queryById(Long orderId){
+ return baseMapper.selectVoById(orderId);
+ }
+
+ /**
+ * 查询采购订单主列表
+ */
+ @Override
+ public TableDataInfo queryPageList(ErpPurchaseOrderBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询采购订单主列表
+ */
+ @Override
+ public List queryList(ErpPurchaseOrderBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(ErpPurchaseOrderBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getOrderCode()), ErpPurchaseOrder::getOrderCode, bo.getOrderCode());
+ lqw.eq(bo.getSupplierId() != null, ErpPurchaseOrder::getSupplierId, bo.getSupplierId());
+ lqw.eq(bo.getOrderDate() != null, ErpPurchaseOrder::getOrderDate, bo.getOrderDate());
+ lqw.eq(bo.getExpectedArrival() != null, ErpPurchaseOrder::getExpectedArrival, bo.getExpectedArrival());
+ lqw.eq(StringUtils.isNotBlank(bo.getOrderType()), ErpPurchaseOrder::getOrderType, bo.getOrderType());
+ lqw.eq(bo.getTotalAmount() != null, ErpPurchaseOrder::getTotalAmount, bo.getTotalAmount());
+ lqw.eq(bo.getOrderStatus() != null, ErpPurchaseOrder::getOrderStatus, bo.getOrderStatus());
+ return lqw;
+ }
+
+ /**
+ * 新增采购订单主
+ */
+ @Override
+ public Boolean insertByBo(ErpPurchaseOrderBo bo) {
+ ErpPurchaseOrder add = BeanUtil.toBean(bo, ErpPurchaseOrder.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setOrderId(add.getOrderId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改采购订单主
+ */
+ @Override
+ public Boolean updateByBo(ErpPurchaseOrderBo bo) {
+ ErpPurchaseOrder update = BeanUtil.toBean(bo, ErpPurchaseOrder.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(ErpPurchaseOrder 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/ErpPurchaseOrderMapper.xml b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderMapper.xml
new file mode 100644
index 00000000..2eccdd13
--- /dev/null
+++ b/klp-erp/src/main/resources/mapper/erp/ErpPurchaseOrderMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 8da9bd38..e94c8b15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -386,6 +386,11 @@
klp-pocket
${klp-flowable-plus.version}
+
+ com.klp
+ klp-erp
+ ${klp-flowable-plus.version}
+
@@ -408,6 +413,7 @@
klp-mes
klp-ems
klp-pocket
+ klp-erp
pom