diff --git a/api/oms-api/pom.xml b/api/oms-api/pom.xml
index cacb0666..bdf591c7 100644
--- a/api/oms-api/pom.xml
+++ b/api/oms-api/pom.xml
@@ -77,6 +77,11 @@
security
1.0
+
+ cn.qihangerp.service
+ erp
+ 2.0.0
+
diff --git a/api/oms-api/src/main/java/cn/qihangerp/oms/controller/PurchaseOrderController.java b/api/oms-api/src/main/java/cn/qihangerp/oms/controller/PurchaseOrderController.java
new file mode 100644
index 00000000..cd69eb6f
--- /dev/null
+++ b/api/oms-api/src/main/java/cn/qihangerp/oms/controller/PurchaseOrderController.java
@@ -0,0 +1,64 @@
+package cn.qihangerp.oms.controller;
+
+import cn.qihangerp.common.AjaxResult;
+import cn.qihangerp.common.PageQuery;
+import cn.qihangerp.common.PageResult;
+import cn.qihangerp.common.TableDataInfo;
+import cn.qihangerp.model.bo.PurchaseOrderAddBo;
+import cn.qihangerp.model.bo.PurchaseOrderOptionBo;
+import cn.qihangerp.model.entity.ErpPurchaseOrder;
+import cn.qihangerp.model.query.PurchaseOrderSearchBo;
+import cn.qihangerp.module.erp.service.ErpPurchaseOrderService;
+import cn.qihangerp.security.common.BaseController;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 商品管理Controller
+ *
+ * @author qihang
+ * @date 2023-12-29
+ */
+@AllArgsConstructor
+@RestController
+@RequestMapping("/erp/purchase")
+public class PurchaseOrderController extends BaseController
+{
+ private final ErpPurchaseOrderService erpPurchaseOrderService;
+ /**
+ *
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PurchaseOrderSearchBo bo, PageQuery pageQuery)
+ {
+ PageResult pageResult = erpPurchaseOrderService.queryPageList(bo, pageQuery);
+ return getDataTable(pageResult);
+ }
+
+ @GetMapping(value = "/detail/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id)
+ {
+ ErpPurchaseOrder detail = erpPurchaseOrderService.getDetailById(id);
+ return AjaxResult.success(detail);
+ }
+
+ @PostMapping("/create")
+ public AjaxResult add(@RequestBody PurchaseOrderAddBo addBo, HttpServletRequest request)
+ {
+ addBo.setCreateBy(getUsername());
+ return toAjax(erpPurchaseOrderService.createPurchaseOrder(addBo));
+ }
+ @PutMapping("/updateStatus")
+ public AjaxResult updateStatus(@RequestBody PurchaseOrderOptionBo req, HttpServletRequest request)
+ {
+ req.setUpdateBy(getUsername());
+ int result = erpPurchaseOrderService.updateScmPurchaseOrder(req);
+ if(result == -1){
+ return new AjaxResult(0,"状态不正确");
+ }else{
+ return toAjax(result);
+ }
+
+ }
+}
diff --git a/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddBo.java b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddBo.java
new file mode 100644
index 00000000..11640ace
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddBo.java
@@ -0,0 +1,38 @@
+package cn.qihangerp.model.bo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 采购订单对象 scm_purchase_order
+ *
+ * @author qihang
+ * @date 2023-12-29
+ */
+@Data
+public class PurchaseOrderAddBo
+{
+ private static final long serialVersionUID = 1L;
+
+
+ /** 供应商id */
+ private Long contactId;
+
+ /** 订单编号 */
+ private String orderNo;
+
+ /** 订单日期 */
+ private Date orderDate;
+
+
+ /** 订单总金额 */
+ private BigDecimal orderAmount;
+ private String createBy;
+
+ private List goodsList;
+
+
+}
diff --git a/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddItemBo.java b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddItemBo.java
new file mode 100644
index 00000000..3896c406
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderAddItemBo.java
@@ -0,0 +1,31 @@
+package cn.qihangerp.model.bo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购订单对象 scm_purchase_order
+ *
+ * @author qihang
+ * @date 2023-12-29
+ */
+@Data
+public class PurchaseOrderAddItemBo {
+ private static final long serialVersionUID = 1L;
+
+
+ private Long id;
+ private String colorImage;
+ private String goodsName;
+ private BigDecimal purPrice;
+ private Long quantity;
+ private BigDecimal amount;
+ private Long goodsId;
+ private String colorValue;
+ private String number;
+ private String sizeValue;
+ private String skuCode;
+ private String styleValue;
+
+}
diff --git a/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderOptionBo.java b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderOptionBo.java
new file mode 100644
index 00000000..86f5c8e1
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/bo/PurchaseOrderOptionBo.java
@@ -0,0 +1,111 @@
+package cn.qihangerp.model.bo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class PurchaseOrderOptionBo {
+ private Long id;
+ private String optionType;//操作类型(audit:审核;confirm:确认(和供应商确认成功);SupplierShip:供应商发货)
+ private String remark;
+ private String auditUser;
+
+ private String confirmUser;//采购单确认人
+
+ // 供应商发货
+ private Date supplierDeliveryTime;
+ private String shipCompany;
+ private String shipNo;
+
+ private BigDecimal shipCost;
+ private BigDecimal totalAmount;
+
+ private String updateBy;
+
+ public String getConfirmUser() {
+ return confirmUser;
+ }
+
+ public void setConfirmUser(String confirmUser) {
+ this.confirmUser = confirmUser;
+ }
+
+ public BigDecimal getShipCost() {
+ return shipCost;
+ }
+
+ public void setShipCost(BigDecimal shipCost) {
+ this.shipCost = shipCost;
+ }
+
+ public BigDecimal getTotalAmount() {
+ return totalAmount;
+ }
+
+ public void setTotalAmount(BigDecimal totalAmount) {
+ this.totalAmount = totalAmount;
+ }
+
+ public Date getSupplierDeliveryTime() {
+ return supplierDeliveryTime;
+ }
+
+ public void setSupplierDeliveryTime(Date supplierDeliveryTime) {
+ this.supplierDeliveryTime = supplierDeliveryTime;
+ }
+
+ public String getShipCompany() {
+ return shipCompany;
+ }
+
+ public void setShipCompany(String shipCompany) {
+ this.shipCompany = shipCompany;
+ }
+
+ public String getShipNo() {
+ return shipNo;
+ }
+
+ public void setShipNo(String shipNo) {
+ this.shipNo = shipNo;
+ }
+
+ public String getUpdateBy() {
+ return updateBy;
+ }
+
+ public void setUpdateBy(String updateBy) {
+ this.updateBy = updateBy;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getOptionType() {
+ return optionType;
+ }
+
+ public void setOptionType(String optionType) {
+ this.optionType = optionType;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public String getAuditUser() {
+ return auditUser;
+ }
+
+ public void setAuditUser(String auditUser) {
+ this.auditUser = auditUser;
+ }
+}
diff --git a/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrder.java b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrder.java
new file mode 100644
index 00000000..c9e1c55f
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrder.java
@@ -0,0 +1,118 @@
+package cn.qihangerp.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 采购订单
+ * @TableName erp_purchase_order
+ */
+@TableName(value ="erp_purchase_order")
+@Data
+public class ErpPurchaseOrder {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 供应商id
+ */
+ private Long supplierId;
+
+ /**
+ * 订单编号
+ */
+ private String orderNum;
+
+ /**
+ * 订单日期
+ */
+ private Date orderDate;
+
+ /**
+ * 订单创建时间
+ */
+ private Long orderTime;
+
+ /**
+ * 订单总金额
+ */
+ private BigDecimal orderAmount;
+
+ /**
+ * 物流费用
+ */
+ private BigDecimal shipAmount;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 订单状态 0待审核1已审核101供应商已确认102供应商已发货2已收货3已入库
+ */
+ private Integer status;
+
+ /**
+ * 采购单审核人
+ */
+ private String auditUser;
+
+ /**
+ * 审核时间
+ */
+ private Long auditTime;
+
+ /**
+ * 供应商确认时间
+ */
+ private Date supplierConfirmTime;
+
+ /**
+ * 供应商发货时间
+ */
+ private Date supplierDeliveryTime;
+
+ /**
+ * 收货时间
+ */
+ private Date receivedTime;
+
+ /**
+ * 入库时间
+ */
+ private Date stockInTime;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新人
+ */
+ private String updateBy;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ @TableField(exist = false)
+ private List itemList;
+}
\ No newline at end of file
diff --git a/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderItem.java b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderItem.java
new file mode 100644
index 00000000..b0a12d8e
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderItem.java
@@ -0,0 +1,138 @@
+package cn.qihangerp.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 采购订单明细
+ * @TableName erp_purchase_order_item
+ */
+@TableName(value ="erp_purchase_order_item")
+@Data
+public class ErpPurchaseOrderItem {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 订单id
+ */
+ private Long orderId;
+
+ /**
+ * 订单编号
+ */
+ private String orderNum;
+
+ /**
+ * 150501采购 150502退货
+ */
+ private String transType;
+
+ /**
+ * 购货金额
+ */
+ private Double amount;
+
+ /**
+ * 订单日期
+ */
+ private Date orderDate;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 商品ID
+ */
+ private Long goodsId;
+
+ /**
+ * 商品编码
+ */
+ private String goodsNum;
+
+ /**
+ * 商品名称
+ */
+ private String goodsName;
+
+ /**
+ * 商品规格id
+ */
+ private Long specId;
+
+ /**
+ * 商品规格编码
+ */
+ private String specNum;
+
+ /**
+ * 颜色
+ */
+ private String colorValue;
+
+ /**
+ * 图片
+ */
+ private String colorImage;
+
+ /**
+ * 尺码
+ */
+ private String sizeValue;
+
+ /**
+ * 款式
+ */
+ private String styleValue;
+
+ /**
+ * 单价
+ */
+ private BigDecimal price;
+
+ /**
+ * 折扣额
+ */
+ private BigDecimal disAmount;
+
+ /**
+ * 折扣率
+ */
+ private BigDecimal disRate;
+
+ /**
+ * 数量(采购单据)
+ */
+ private Long quantity;
+
+ /**
+ * 已入库数量
+ */
+ private Long inqty;
+
+ /**
+ * 入库的仓库id
+ */
+ private Integer locationid;
+
+ /**
+ * 1删除 0正常
+ */
+ private Integer isDelete;
+
+ /**
+ * 状态(同billStatus)0待审核1正常2已作废3已入库
+ */
+ private Integer status;
+}
\ No newline at end of file
diff --git a/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderShip.java b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderShip.java
new file mode 100644
index 00000000..8bd74ff7
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/entity/ErpPurchaseOrderShip.java
@@ -0,0 +1,128 @@
+package cn.qihangerp.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 采购订单物流表
+ * @TableName erp_purchase_order_ship
+ */
+@TableName(value ="erp_purchase_order_ship")
+@Data
+public class ErpPurchaseOrderShip {
+ /**
+ * 采购单ID(主键)
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 供应商id
+ */
+ private Long supplierId;
+
+ /**
+ *
+ */
+ private Long orderId;
+
+ /**
+ * 物流公司
+ */
+ private String shipCompany;
+
+ /**
+ * 物流单号
+ */
+ private String shipNum;
+
+ /**
+ * 运费
+ */
+ private BigDecimal freight;
+
+ /**
+ * 发货时间
+ */
+ private Date shipTime;
+
+ /**
+ * 收货时间
+ */
+ private Date receiptTime;
+
+ /**
+ * 创建人
+ */
+ private String createBy;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 状态(0未收货1已收货2已入库)
+ */
+ private Integer status;
+
+ /**
+ * 说明
+ */
+ private String remark;
+
+ /**
+ * 退回数量
+ */
+ private Integer backCount;
+
+ /**
+ * 入库时间
+ */
+ private Date stockInTime;
+
+ /**
+ * 入库数量
+ */
+ private Integer stockInCount;
+
+ /**
+ * 更新人
+ */
+ private String updateBy;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 采购订单日期
+ */
+ private Date orderDate;
+
+ /**
+ * 采购订单编号
+ */
+ private String orderNum;
+
+ /**
+ * 采购订单商品规格数
+ */
+ private Integer orderSpecUnit;
+
+ /**
+ * 采购订单商品数
+ */
+ private Integer orderGoodsUnit;
+
+ /**
+ * 采购订单总件数
+ */
+ private Integer orderSpecUnitTotal;
+}
\ No newline at end of file
diff --git a/core/model/src/main/java/cn/qihangerp/model/query/MenuQuery.java b/core/model/src/main/java/cn/qihangerp/model/query/MenuQuery.java
new file mode 100644
index 00000000..6e2c7f81
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/query/MenuQuery.java
@@ -0,0 +1,22 @@
+package cn.qihangerp.model.query;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 菜单查询对象
+ *
+ * @author haoxr
+ * @since 2022/10/28
+ */
+@Schema(description ="菜单查询对象")
+@Data
+public class MenuQuery {
+
+ @Schema(description="关键字(菜单名称)")
+ private String keywords;
+
+ @Schema(description="状态(1->显示;0->隐藏)")
+ private Integer status;
+
+}
diff --git a/core/model/src/main/java/cn/qihangerp/model/query/PurchaseOrderSearchBo.java b/core/model/src/main/java/cn/qihangerp/model/query/PurchaseOrderSearchBo.java
new file mode 100644
index 00000000..4a88af6c
--- /dev/null
+++ b/core/model/src/main/java/cn/qihangerp/model/query/PurchaseOrderSearchBo.java
@@ -0,0 +1,13 @@
+package cn.qihangerp.model.query;
+
+import lombok.Data;
+
+@Data
+public class PurchaseOrderSearchBo {
+ // 供应商id
+ private Integer supplierId;
+ private String orderNum;
+ private String orderStatus;
+ private String startTime;
+ private String endTime;
+}
diff --git a/serviceImpl/erp/pom.xml b/serviceImpl/erp/pom.xml
new file mode 100644
index 00000000..afb26145
--- /dev/null
+++ b/serviceImpl/erp/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+
+ cn.qihangerp.service
+ serviceImpl
+ 2.0.0
+
+
+ erp
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+ cn.qihangerp.core
+ common
+ 1.0
+ compile
+
+
+ cn.qihangerp.model
+ model
+ 2.0.0
+
+
+
\ No newline at end of file
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.java
new file mode 100644
index 00000000..3324f900
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.java
@@ -0,0 +1,18 @@
+package cn.qihangerp.module.erp.mapper;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_item(采购订单明细)】的数据库操作Mapper
+* @createDate 2025-09-09 09:51:48
+* @Entity cn.qihangerp.model.entity.ErpPurchaseOrderItem
+*/
+public interface ErpPurchaseOrderItemMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.java
new file mode 100644
index 00000000..a3f32221
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.java
@@ -0,0 +1,18 @@
+package cn.qihangerp.module.erp.mapper;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order(采购订单)】的数据库操作Mapper
+* @createDate 2025-09-09 09:51:48
+* @Entity cn.qihangerp.model.entity.ErpPurchaseOrder
+*/
+public interface ErpPurchaseOrderMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.java
new file mode 100644
index 00000000..85ba5f8d
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.java
@@ -0,0 +1,18 @@
+package cn.qihangerp.module.erp.mapper;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderShip;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_ship(采购订单物流表)】的数据库操作Mapper
+* @createDate 2025-09-09 10:40:41
+* @Entity cn.qihangerp.model.entity.ErpPurchaseOrderShip
+*/
+public interface ErpPurchaseOrderShipMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderItemService.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderItemService.java
new file mode 100644
index 00000000..9e905901
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderItemService.java
@@ -0,0 +1,13 @@
+package cn.qihangerp.module.erp.service;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderItem;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_item(采购订单明细)】的数据库操作Service
+* @createDate 2025-09-09 09:51:48
+*/
+public interface ErpPurchaseOrderItemService extends IService {
+
+}
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderService.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderService.java
new file mode 100644
index 00000000..df5a70fa
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderService.java
@@ -0,0 +1,21 @@
+package cn.qihangerp.module.erp.service;
+
+import cn.qihangerp.common.PageQuery;
+import cn.qihangerp.common.PageResult;
+import cn.qihangerp.model.bo.PurchaseOrderAddBo;
+import cn.qihangerp.model.bo.PurchaseOrderOptionBo;
+import cn.qihangerp.model.entity.ErpPurchaseOrder;
+import cn.qihangerp.model.query.PurchaseOrderSearchBo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order(采购订单)】的数据库操作Service
+* @createDate 2025-09-09 09:51:48
+*/
+public interface ErpPurchaseOrderService extends IService {
+ PageResult queryPageList(PurchaseOrderSearchBo bo, PageQuery pageQuery);
+ ErpPurchaseOrder getDetailById(Long id);
+ int createPurchaseOrder(PurchaseOrderAddBo addBo);
+ int updateScmPurchaseOrder(PurchaseOrderOptionBo request);
+}
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderShipService.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderShipService.java
new file mode 100644
index 00000000..7d4afa00
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/ErpPurchaseOrderShipService.java
@@ -0,0 +1,13 @@
+package cn.qihangerp.module.erp.service;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderShip;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_ship(采购订单物流表)】的数据库操作Service
+* @createDate 2025-09-09 10:40:41
+*/
+public interface ErpPurchaseOrderShipService extends IService {
+
+}
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java
new file mode 100644
index 00000000..75c77412
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderItemServiceImpl.java
@@ -0,0 +1,22 @@
+package cn.qihangerp.module.erp.service.impl;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderItem;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.qihangerp.module.erp.service.ErpPurchaseOrderItemService;
+import cn.qihangerp.module.erp.mapper.ErpPurchaseOrderItemMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_item(采购订单明细)】的数据库操作Service实现
+* @createDate 2025-09-09 09:51:48
+*/
+@Service
+public class ErpPurchaseOrderItemServiceImpl extends ServiceImpl
+ implements ErpPurchaseOrderItemService{
+
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderServiceImpl.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderServiceImpl.java
new file mode 100644
index 00000000..dd8f894a
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderServiceImpl.java
@@ -0,0 +1,276 @@
+package cn.qihangerp.module.erp.service.impl;
+
+import cn.qihangerp.common.PageQuery;
+import cn.qihangerp.common.PageResult;
+import cn.qihangerp.common.utils.DateUtils;
+
+import cn.qihangerp.model.bo.PurchaseOrderAddBo;
+import cn.qihangerp.model.bo.PurchaseOrderAddItemBo;
+import cn.qihangerp.model.bo.PurchaseOrderOptionBo;
+import cn.qihangerp.model.entity.ErpPurchaseOrder;
+import cn.qihangerp.model.entity.ErpPurchaseOrderItem;
+import cn.qihangerp.model.entity.ErpPurchaseOrderShip;
+import cn.qihangerp.model.query.PurchaseOrderSearchBo;
+import cn.qihangerp.module.erp.mapper.ErpPurchaseOrderItemMapper;
+import cn.qihangerp.module.erp.mapper.ErpPurchaseOrderShipMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import cn.qihangerp.module.erp.service.ErpPurchaseOrderService;
+import cn.qihangerp.module.erp.mapper.ErpPurchaseOrderMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order(采购订单)】的数据库操作Service实现
+* @createDate 2025-09-09 09:51:48
+*/
+@AllArgsConstructor
+@Service
+public class ErpPurchaseOrderServiceImpl extends ServiceImpl
+ implements ErpPurchaseOrderService{
+ private final ErpPurchaseOrderMapper erpPurchaseOrderMapper;
+ private final ErpPurchaseOrderItemMapper erpPurchaseOrderItemMapper;
+ private final ErpPurchaseOrderShipMapper shipMapper;
+
+ private final String DATE_PATTERN =
+ "^(?:(?:(?:\\d{4}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\\d|2[0-8]))|(?:(?:(?:\\d{2}(?:0[48]|[2468][048]|[13579][26])|(?:(?:0[48]|[2468][048]|[13579][26])00))-0?2-29))$)|(?:(?:(?:\\d{4}-(?:0?[13578]|1[02]))-(?:0?[1-9]|[12]\\d|30))$)|(?:(?:(?:\\d{4}-0?[13-9]|1[0-2])-(?:0?[1-9]|[1-2]\\d|30))$)|(?:(?:(?:\\d{2}(?:0[48]|[13579][26]|[2468][048])|(?:(?:0[48]|[13579][26]|[2468][048])00))-0?2-29))$)$";
+ private final Pattern DATE_FORMAT = Pattern.compile(DATE_PATTERN);
+ @Override
+ public PageResult queryPageList(PurchaseOrderSearchBo bo, PageQuery pageQuery) {
+ if(org.springframework.util.StringUtils.hasText(bo.getStartTime())){
+ Matcher matcher = DATE_FORMAT.matcher(bo.getStartTime());
+ boolean b = matcher.find();
+ if(b){
+ bo.setStartTime(bo.getStartTime()+" 00:00:00");
+ }
+ }
+ if(org.springframework.util.StringUtils.hasText(bo.getEndTime())){
+ Matcher matcher = DATE_FORMAT.matcher(bo.getEndTime());
+ boolean b = matcher.find();
+ if(b){
+ bo.setEndTime(bo.getEndTime()+" 23:59:59");
+ }
+ }
+
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
+ .eq(bo.getSupplierId()!=null, ErpPurchaseOrder::getSupplierId,bo.getSupplierId())
+ .eq(org.springframework.util.StringUtils.hasText(bo.getOrderNum()), ErpPurchaseOrder::getOrderNum,bo.getOrderNum())
+ .eq(bo.getOrderStatus()!=null, ErpPurchaseOrder::getStatus,bo.getOrderStatus())
+ .ge(org.springframework.util.StringUtils.hasText(bo.getStartTime()), ErpPurchaseOrder::getOrderTime,bo.getStartTime()+" 00:00:00")
+ .le(org.springframework.util.StringUtils.hasText(bo.getEndTime()), ErpPurchaseOrder::getOrderTime,bo.getEndTime()+" 23:59:59")
+ ;
+
+ pageQuery.setOrderByColumn("order_time");
+ pageQuery.setIsAsc("desc");
+ Page pages = erpPurchaseOrderMapper.selectPage(pageQuery.build(), queryWrapper);
+
+ // 查询子订单
+ if(pages.getRecords()!=null){
+ for (ErpPurchaseOrder order:pages.getRecords()) {
+ order.setItemList(erpPurchaseOrderItemMapper.selectList(new LambdaQueryWrapper().eq(ErpPurchaseOrderItem::getOrderId, order.getId())));
+
+ }
+ }
+
+ return PageResult.build(pages);
+ }
+
+ @Override
+ public ErpPurchaseOrder getDetailById(Long id) {
+ ErpPurchaseOrder order = erpPurchaseOrderMapper.selectById(id);
+ if(order!=null){
+ order.setItemList(erpPurchaseOrderItemMapper.selectList(new LambdaQueryWrapper().eq(ErpPurchaseOrderItem::getOrderId, order.getId())));
+ return order;
+ }else
+ return null;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ @Override
+ public int createPurchaseOrder(PurchaseOrderAddBo addBo) {
+ if(addBo.getGoodsList() == null || addBo.getGoodsList().isEmpty()) return -1;
+ // 添加主表
+ ErpPurchaseOrder erpPurchaseOrder = new ErpPurchaseOrder();
+
+ erpPurchaseOrder.setOrderNum("PUR"+ DateUtils.parseDateToStr("yyyyMMddHHmmss",new Date()));
+ erpPurchaseOrder.setOrderAmount(addBo.getOrderAmount());
+ erpPurchaseOrder.setCreateTime(DateUtils.getNowDate());
+ erpPurchaseOrder.setOrderDate(addBo.getOrderDate());
+ erpPurchaseOrder.setSupplierId(addBo.getContactId());
+ erpPurchaseOrder.setOrderTime(System.currentTimeMillis()/1000);
+ erpPurchaseOrder.setCreateBy(addBo.getCreateBy());
+ erpPurchaseOrder.setStatus(0);
+ erpPurchaseOrder.setShipAmount(BigDecimal.ZERO);
+ erpPurchaseOrderMapper.insert(erpPurchaseOrder);
+
+ // 添加子表
+ for (PurchaseOrderAddItemBo item:addBo.getGoodsList()) {
+ ErpPurchaseOrderItem orderItem = new ErpPurchaseOrderItem();
+ orderItem.setOrderDate(addBo.getOrderDate());
+ orderItem.setOrderId(erpPurchaseOrder.getId());
+ orderItem.setOrderNum(erpPurchaseOrder.getOrderNum());
+ if(item.getAmount()!=null) {
+ orderItem.setAmount(item.getAmount().doubleValue());
+ }else{
+
+ orderItem.setAmount(item.getPurPrice()==null?0.0:item.getPurPrice().multiply(BigDecimal.valueOf(item.getQuantity())).doubleValue());
+ }
+ orderItem.setGoodsId(item.getGoodsId());
+ orderItem.setGoodsNum(item.getNumber());
+ orderItem.setIsDelete(0);
+ orderItem.setPrice(item.getPurPrice());
+ orderItem.setQuantity(item.getQuantity());
+ orderItem.setSpecId(item.getId());
+ orderItem.setSpecNum(item.getSkuCode());
+ orderItem.setStatus(0);
+ orderItem.setTransType("Purchase");
+ orderItem.setGoodsName(item.getGoodsName());
+ orderItem.setColorValue(item.getColorValue());
+ orderItem.setColorImage(item.getColorImage());
+ orderItem.setSizeValue(item.getSizeValue());
+ orderItem.setStyleValue(item.getStyleValue());
+
+ erpPurchaseOrderItemMapper.insert(orderItem);
+ }
+ return 1;
+ }
+
+ @Override
+ public int updateScmPurchaseOrder(PurchaseOrderOptionBo request) {
+ ErpPurchaseOrder order = erpPurchaseOrderMapper.selectById(request.getId());
+ if(order == null) return -1;
+
+
+ if(request.getOptionType().equals("audit")){
+ if(order.getStatus() !=0){
+ // 状态不是待审核的
+ return -1;
+ }
+ ErpPurchaseOrder erpPurchaseOrder = new ErpPurchaseOrder();
+ erpPurchaseOrder.setId(order.getId());
+ erpPurchaseOrder.setUpdateBy(request.getUpdateBy());
+ erpPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
+ erpPurchaseOrder.setAuditUser(request.getAuditUser());
+ erpPurchaseOrder.setAuditTime(System.currentTimeMillis()/1000);
+ erpPurchaseOrder.setRemark(request.getRemark());
+ erpPurchaseOrder.setStatus(1);
+ return erpPurchaseOrderMapper.updateById(erpPurchaseOrder);
+ }
+ else if (request.getOptionType().equals("confirm")) {
+ if(order.getStatus() !=1){
+ // 状态不是已审核的不能确认
+ return -1;
+ }
+ // 查询数据
+ List items = erpPurchaseOrderItemMapper.selectList(new LambdaQueryWrapper().eq(ErpPurchaseOrderItem::getOrderId, request.getId()));
+
+ Map> goodsGroup = items.stream().collect(Collectors.groupingBy(x -> x.getGoodsId()));
+ Long total = items.stream().mapToLong(ErpPurchaseOrderItem::getQuantity).sum();
+ // 生成费用信息
+// ScmPurchaseOrderCost cost = new ScmPurchaseOrderCost();
+// cost.setId(order.getId());
+// cost.setOrderId(order.getId());
+// cost.setSupplierId(order.getSupplierId());
+// cost.setOrderNum(order.getOrderNum());
+// cost.setOrderDate(order.getOrderDate());
+// cost.setOrderGoodsUnit(goodsGroup.size());
+// cost.setOrderSpecUnit(items.size());
+// cost.setOrderSpecUnitTotal(total.intValue());
+// cost.setOrderAmount(order.getOrderAmount());
+// cost.setActualAmount(request.getTotalAmount());
+// cost.setFreight(BigDecimal.ZERO);
+// cost.setConfirmUser(request.getConfirmUser());
+// cost.setConfirmTime(new Date());
+// cost.setCreateBy(request.getUpdateBy());
+// cost.setPayAmount(BigDecimal.ZERO);
+// cost.setPayCount(0);
+// cost.setStatus(0);
+// costMapper.insert(cost);
+
+ // 更新主表
+ ErpPurchaseOrder erpPurchaseOrder = new ErpPurchaseOrder();
+ erpPurchaseOrder.setId(order.getId());
+ erpPurchaseOrder.setUpdateBy(request.getUpdateBy());
+ erpPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
+ erpPurchaseOrder.setStatus(101);
+ erpPurchaseOrder.setSupplierConfirmTime(new Date());
+ erpPurchaseOrderMapper.updateById(erpPurchaseOrder);
+ }
+ else if (request.getOptionType().equals("SupplierShip")) {
+ if(order.getStatus() !=101 && order.getStatus()!=1){
+ // 状态不是已确认的不能发货
+ return -1;
+ }
+ // 查询数据
+ List items = erpPurchaseOrderItemMapper.selectList(new LambdaQueryWrapper().eq(ErpPurchaseOrderItem::getOrderId, request.getId()));
+
+ Map> goodsGroup = items.stream().collect(Collectors.groupingBy(x -> x.getGoodsId()));
+ Long total = items.stream().mapToLong(ErpPurchaseOrderItem::getQuantity).sum();
+
+ // 生成物流信息
+ ErpPurchaseOrderShip ship = new ErpPurchaseOrderShip();
+
+ ship.setId(order.getId());
+ ship.setOrderId(order.getId());
+ ship.setSupplierId(order.getSupplierId());
+ ship.setOrderNum(order.getOrderNum());
+ ship.setOrderDate(order.getOrderDate());
+ ship.setOrderGoodsUnit(goodsGroup.size());
+ ship.setOrderSpecUnit(items.size());
+ ship.setOrderSpecUnitTotal(total.intValue());
+ ship.setShipCompany(request.getShipCompany());
+ ship.setShipNum(request.getShipNo());
+ ship.setFreight(request.getShipCost());
+ ship.setShipTime(request.getSupplierDeliveryTime());
+ ship.setCreateBy(request.getUpdateBy());
+ ship.setCreateTime(new Date());
+ ship.setStatus(0);
+ ship.setBackCount(0);
+ ship.setStockInCount(0);
+ shipMapper.insert(ship);
+ // 更新费用表
+
+
+// ScmSupplier scmSupplier = supplierMapper.selectScmSupplierById(order.getContactId());
+ // 生成应付信息fms_payable_purchase
+// ScmPurchaseOrderPayable payable = new ScmPurchaseOrderPayable();
+// payable.setSupplierId(order.getSupplierId());
+//// fmsPP.setSupplierName(scmSupplier!=null ? scmSupplier.getName():"数据库未找到供应商信息");
+// payable.setAmount(order.getOrderAmount().add(request.getShipCost()));
+// payable.setDate(new Date());
+// payable.setPurchaseOrderNum(order.getOrderNum());
+// payable.setPurchaseDesc("{采购商品总数量:"+total+",不同款式:"+goodsGroup.size()+",不同SKU:"+items.size()+",商品总价:"+order.getOrderAmount()+",运费:"+request.getShipCost()+"}");
+// payable.setStatus(0);
+// payable.setCreateTime(new Date());
+// payable.setCreateBy(request.getUpdateBy());
+// payableMapper.insert(payable);
+
+ // 更新主表
+ ErpPurchaseOrder erpPurchaseOrder = new ErpPurchaseOrder();
+ erpPurchaseOrder.setId(order.getId());
+ erpPurchaseOrder.setUpdateBy(request.getUpdateBy());
+ erpPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
+ erpPurchaseOrder.setStatus(102);
+ erpPurchaseOrder.setSupplierDeliveryTime(new Date());
+ erpPurchaseOrder.setShipAmount(request.getShipCost());
+ erpPurchaseOrderMapper.updateById(erpPurchaseOrder);
+ }
+ return 1;
+ }
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderShipServiceImpl.java b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderShipServiceImpl.java
new file mode 100644
index 00000000..cf07f7bc
--- /dev/null
+++ b/serviceImpl/erp/src/main/java/cn/qihangerp/module/erp/service/impl/ErpPurchaseOrderShipServiceImpl.java
@@ -0,0 +1,22 @@
+package cn.qihangerp.module.erp.service.impl;
+
+import cn.qihangerp.model.entity.ErpPurchaseOrderShip;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.qihangerp.module.erp.service.ErpPurchaseOrderShipService;
+import cn.qihangerp.module.erp.mapper.ErpPurchaseOrderShipMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author 1
+* @description 针对表【erp_purchase_order_ship(采购订单物流表)】的数据库操作Service实现
+* @createDate 2025-09-09 10:40:41
+*/
+@Service
+public class ErpPurchaseOrderShipServiceImpl extends ServiceImpl
+ implements ErpPurchaseOrderShipService{
+
+}
+
+
+
+
diff --git a/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.xml b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.xml
new file mode 100644
index 00000000..b33c673b
--- /dev/null
+++ b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderItemMapper.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id,order_id,order_num,trans_type,amount,order_date,
+ remark,goods_id,goods_num,goods_name,spec_id,
+ spec_num,color_value,color_image,size_value,style_value,
+ price,dis_amount,dis_rate,quantity,inQty,
+ locationId,is_delete,status
+
+
diff --git a/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.xml b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.xml
new file mode 100644
index 00000000..761e1550
--- /dev/null
+++ b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderMapper.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id,supplier_id,order_num,order_date,order_time,order_amount,
+ ship_amount,remark,status,audit_user,audit_time,
+ supplier_confirm_time,supplier_delivery_time,received_time,stock_in_time,create_by,
+ create_time,update_by,update_time
+
+
diff --git a/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.xml b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.xml
new file mode 100644
index 00000000..db3f63a2
--- /dev/null
+++ b/serviceImpl/erp/src/main/resources/cn/qihangerp/module/erp/mapper/ErpPurchaseOrderShipMapper.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id,supplier_id,order_id,ship_company,ship_num,freight,
+ ship_time,receipt_time,create_by,create_time,status,
+ remark,back_count,stock_in_time,stock_in_count,update_by,
+ update_time,order_date,order_num,order_spec_unit,order_goods_unit,
+ order_spec_unit_total
+
+
diff --git a/serviceImpl/pom.xml b/serviceImpl/pom.xml
index eb026ac8..52228894 100644
--- a/serviceImpl/pom.xml
+++ b/serviceImpl/pom.xml
@@ -25,6 +25,7 @@
dou
tao
pdd
+ erp
diff --git a/vue/src/api/purchase/purchaseOrder.js b/vue/src/api/purchase/purchaseOrder.js
index b35a0804..724841ea 100644
--- a/vue/src/api/purchase/purchaseOrder.js
+++ b/vue/src/api/purchase/purchaseOrder.js
@@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询采购订单列表
export function listPurchaseOrder(query) {
return request({
- url: '/erp/purchase/list',
+ url: '/api/erp-api/erp/purchase/list',
method: 'get',
params: query
})