订单绑定相关

This commit is contained in:
潘荣晟
2026-02-10 19:00:02 +08:00
parent 5a38bca0da
commit f233076fd0
10 changed files with 222 additions and 5 deletions

View File

@@ -0,0 +1,48 @@
package com.zt.plat.module.contractorder.enums;
import lombok.Getter;
@Getter
public enum OrderTypeEnum {
// 基础业务订单
SALE("SALE", "销售", 0),
PUR("PUR", "采购", 1),
ENT("ENT", "委托加工", 2),
ENTED_PUR("ENTED_PUR", "来料加工-采购", 3),
ENTED_SALE("ENTED_SALE", "来料加工-销售", 10),
// 物流服务订单
HD_13("13HD", "货运代理", 4),
YS_10("10YS", "货物运输", 5),
CC_11("11CC", "货物保管仓储", 6),
BX_03("03BX", "货物保险", 7);
/** 订单类型编码(字典键值) */
private final String code;
/** 订单类型描述(字典标签) */
private final String description;
/** 排序号(字典排序) */
private final Integer sort;
OrderTypeEnum(String code, String description, Integer sort) {
this.code = code;
this.description = description;
this.sort = sort;
}
/**
* 根据编码获取枚举
*/
public static OrderTypeEnum getByCode(String code) {
if (code == null || code.trim().isEmpty()) {
return null;
}
for (OrderTypeEnum type : values()) {
if (type.getCode().equals(code.trim())) {
return type;
}
}
return null;
}
}

View File

@@ -11,7 +11,7 @@ import com.zt.plat.framework.common.exception.ErrorCode;
*/ */
public interface ErrorCodeConstants { public interface ErrorCodeConstants {
ErrorCode PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_008_000_001, "采购订单不存在"); ErrorCode PURCHASE_ORDER_NOT_EXISTS = new ErrorCode(1_008_000_001, "订单不存在");
ErrorCode ORDER_ID_NOT_EXISTS = new ErrorCode(1_008_000_010, "订单id不能为空"); ErrorCode ORDER_ID_NOT_EXISTS = new ErrorCode(1_008_000_010, "订单id不能为空");
ErrorCode PRCH_ORD_DTL_NOT_EXISTS = new ErrorCode(1_008_001_001, "采购订单明细不存在"); ErrorCode PRCH_ORD_DTL_NOT_EXISTS = new ErrorCode(1_008_001_001, "采购订单明细不存在");
ErrorCode PURCHASE_ORDER_STATUS_ERROR = new ErrorCode(1_008_001_020, "非法的订单状态"); ErrorCode PURCHASE_ORDER_STATUS_ERROR = new ErrorCode(1_008_001_020, "非法的订单状态");
@@ -22,4 +22,7 @@ public interface ErrorCodeConstants {
ErrorCode WAREHOUSE_CODE_OR_FACTORY_CODE_NOT_EXISTS = new ErrorCode(1_008_000_151, "{}"); ErrorCode WAREHOUSE_CODE_OR_FACTORY_CODE_NOT_EXISTS = new ErrorCode(1_008_000_151, "{}");
ErrorCode ERP_ORDER_UPDATE_FAILED = new ErrorCode(1_008_000_160, "erp订单更新失败"); ErrorCode ERP_ORDER_UPDATE_FAILED = new ErrorCode(1_008_000_160, "erp订单更新失败");
ErrorCode ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_008_000_060, "订单明细不能为空"); ErrorCode ORDER_DETAIL_NOT_EXISTS = new ErrorCode(1_008_000_060, "订单明细不能为空");
ErrorCode PURCHASE_ORDER_ID_IS_NULL = new ErrorCode(1_008_000_070, "订单ID不能为空");
ErrorCode PURCHASE_ORDER_ID_IS_EMPTY = new ErrorCode(1_008_000_080, "业务订单类型非法请参考字典SPLY_BSN_TP");
ErrorCode PURCHASE_ORDER_NOT_ALLOW_BIND = new ErrorCode(1_008_000_090, "来料销售加工订单不允许绑定订单");
} }

View File

@@ -218,5 +218,21 @@ public class PurchaseOrderController implements BusinessControllerMarker {
return success(purchaseOrderService.getBindOrderByOrder(reqVO)); return success(purchaseOrderService.getBindOrderByOrder(reqVO));
} }
//无权限查询订单
@PostMapping("/page-no-permission")
@Operation(summary = "无权限查询订单")
@PreAuthorize("@ss.hasAnyPermissions('base:purchase-order:query')")
public CommonResult<PageResult<PurchaseOrderRespVO>> pageOrderNoPermission(@RequestBody PurchaseOrderPageReqVO pageReqVO) {
PageResult<PurchaseOrderDO> pageResult = purchaseOrderService.pageOrderNoPermission(pageReqVO);
return success( BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class));
}
//关联订单
@PostMapping("/bound-order")
@Operation(summary = "关联订单")
@PreAuthorize("@ss.hasAnyPermissions('base:purchase-order:update','purchase:order:list:OrderList:edit')")
public CommonResult<Boolean> boundOrder(@RequestBody @Validated BoundOrderReqVO req) {
purchaseOrderService.boundOrder(req);
return success(true);
}
} }

View File

@@ -0,0 +1,18 @@
package com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.validation.annotation.Validated;
@Data
@Validated
@Schema(description = "绑定订单请求参数")
public class BoundOrderReqVO {
@Schema(description = "订单ID")
@NotNull(message = "订单ID不能为空")
private Long id;
@Schema(description = "绑定的订单ID")
@NotNull(message = "被绑定的订单ID不能为空")
private Long boundId;
}

View File

@@ -14,7 +14,8 @@ import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH
@Schema(description = "管理后台 - 采购订单分页 Request VO") @Schema(description = "管理后台 - 采购订单分页 Request VO")
@Data @Data
public class PurchaseOrderPageReqVO extends PageParam { public class PurchaseOrderPageReqVO extends PageParam {
@Schema(description = "订单主键")
private Long id;
@Schema(description = "ERP订单号") @Schema(description = "ERP订单号")
private String orderSAPNumber; private String orderSAPNumber;

View File

@@ -295,5 +295,9 @@ public class PurchaseOrderDO extends BusinessBaseDO {
@TableField("ISS_CAUS") @TableField("ISS_CAUS")
private String issueCause; private String issueCause;
/**
* 关联订单ID
*/
@TableField(value = "REL_ORD_ID")
private Long relatedOrderId;
} }

View File

@@ -3,6 +3,8 @@ package com.zt.plat.module.contractorder.dal.mysql.purchaseorder;
import java.util.*; import java.util.*;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.datapermission.core.annotation.CompanyDataPermissionIgnore;
import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX; import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
@@ -78,4 +80,50 @@ public interface PurchaseOrderMapper extends BaseMapperX<PurchaseOrderDO> {
List<PurchaseOrderWithDetailsVO> selectOrderByAndAllIds(@Param("ids") List<Long> ids); List<PurchaseOrderWithDetailsVO> selectOrderByAndAllIds(@Param("ids") List<Long> ids);
PurchaseOrderDO findOrderById(@Param("id") Long id); PurchaseOrderDO findOrderById(@Param("id") Long id);
@CompanyDataPermissionIgnore
@DeptDataPermissionIgnore
default PageResult<PurchaseOrderDO> selectLinkPage(PurchaseOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PurchaseOrderDO>()
.likeIfPresent(PurchaseOrderDO::getOrderSAPNumber, reqVO.getOrderSAPNumber())
.likeIfPresent(PurchaseOrderDO::getSystemOrderNumber, reqVO.getSystemOrderNumber())
.likeIfPresent(PurchaseOrderDO::getCpNum, reqVO.getCompanyNumber())
.likeIfPresent(PurchaseOrderDO::getSupplierNumber, reqVO.getSupplierNumber())
.likeIfPresent(PurchaseOrderDO::getSupplierName, reqVO.getSupplierName())
.eqIfPresent(PurchaseOrderDO::getType, reqVO.getType())
.betweenIfPresent(PurchaseOrderDO::getVoucherDate, reqVO.getVoucherDate())
.eqIfPresent(PurchaseOrderDO::getPurchaseOrganizationCustomsDeclaration, reqVO.getPurchaseOrganizationCustomsDeclaration())
.likeIfPresent(PurchaseOrderDO::getReceiveFactoryName, reqVO.getReceiveFactoryName())
.eqIfPresent(PurchaseOrderDO::getReceiveFactoryNumber, reqVO.getReceiveFactoryNumber())
.likeIfPresent(PurchaseOrderDO::getReceiveWarehouseName, reqVO.getReceiveWarehouseName())
.eqIfPresent(PurchaseOrderDO::getReceiveWarehouseNumber, reqVO.getReceiveWarehouseNumber())
.eqIfPresent(PurchaseOrderDO::getPurchaseGroup, reqVO.getPurchaseGroup())
.eqIfPresent(PurchaseOrderDO::getCurrencyNumber, reqVO.getCurrencyNumber())
.eqIfPresent(PurchaseOrderDO::getExchangeRate, reqVO.getExchangeRate())
.likeIfPresent(PurchaseOrderDO::getPaperContractNumber, reqVO.getPaperContractNumber())
.likeIfPresent(PurchaseOrderDO::getAgreementNumber, reqVO.getAgreementNumber())
.eqIfPresent(PurchaseOrderDO::getRemark, reqVO.getRemark())
.eqIfPresent(PurchaseOrderDO::getAgentNumber, reqVO.getAgentNumber())
.likeIfPresent(PurchaseOrderDO::getAgentName, reqVO.getAgentName())
.eqIfPresent(PurchaseOrderDO::getMtrlTp, reqVO.getMtrlTp())
// .eqIfPresent(PurchaseOrderDO::getOrderNumber, reqVO.getOrderNumber())
.eqIfPresent(PurchaseOrderDO::getContractNumber, reqVO.getContractNumber())
.eqIfPresent(PurchaseOrderDO::getMaterialNumber, reqVO.getMaterialNumber())
.likeIfPresent(PurchaseOrderDO::getMaterialName, reqVO.getMaterialName())
.likeIfPresent(PurchaseOrderDO::getContractName, reqVO.getContractName())
.likeIfPresent(PurchaseOrderDO::getTenantNumber, reqVO.getTenantNumber())
.betweenIfPresent(PurchaseOrderDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(PurchaseOrderDO::getErpPurchaseCompanyNumber, reqVO.getErpPurchaseCompanyNumber())
.likeIfPresent(PurchaseOrderDO::getErpPurchaseCompanyName, reqVO.getErpPurchaseCompanyName())
.eqIfPresent(PurchaseOrderDO::getErpSalesCompanyNumber, reqVO.getErpSalesCompanyNumber())
.likeIfPresent(PurchaseOrderDO::getErpSalesCompanyName, reqVO.getErpSalesCompanyName())
.likeIfPresent(PurchaseOrderDO::getPurchaseOrganizationName, reqVO.getPurchaseOrganizationName())
.eqIfPresent(PurchaseOrderDO::getErpStatus, reqVO.getErpStatus())
.eqIfPresent(PurchaseOrderDO::getSplyBsnTp, reqVO.getSplyBsnTp() != null ? reqVO.getSplyBsnTp() : "PUR")
.eqIfPresent(PurchaseOrderDO::getCause, reqVO.getCause())
.eqIfPresent(PurchaseOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(PurchaseOrderDO::getMeteringType, reqVO.getMeteringType())
.likeIfPresent(PurchaseOrderDO::getPurchaseGroupName, reqVO.getPurchaseGroupName())
.orderByDesc(PurchaseOrderDO::getId));
}
} }

View File

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.datapermission.core.annotation.CompanyDataPermissionIgnore;
import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX; import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.security.core.LoginUser; import com.zt.plat.framework.security.core.LoginUser;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
@@ -2093,6 +2095,8 @@ public class ContractServiceImpl implements ContractService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@CompanyDataPermissionIgnore
@DeptDataPermissionIgnore
public void relationContract(RelationContractVO relationContractVO) { public void relationContract(RelationContractVO relationContractVO) {
//查询当前订单是否已经绑定订单了 //查询当前订单是否已经绑定订单了
ContractMainDO contractMainDO = contractMainMapper.selectById(relationContractVO.getContractId()); ContractMainDO contractMainDO = contractMainMapper.selectById(relationContractVO.getContractId());

View File

@@ -156,4 +156,12 @@ public interface PurchaseOrderService {
* @return 订单和计划数据 * @return 订单和计划数据
*/ */
PageResult<PurchaseOrderDO> queryOrderAndPlanData(OrderAndPlanDataReqDTO reqDTO); PageResult<PurchaseOrderDO> queryOrderAndPlanData(OrderAndPlanDataReqDTO reqDTO);
/**
* 分页查询订单数据
*
* @param pageReqVO 查询条件
* @return 订单数据
*/
PageResult<PurchaseOrderDO> pageOrderNoPermission(PurchaseOrderPageReqVO pageReqVO);
void boundOrder(BoundOrderReqVO reqVO);
} }

View File

@@ -10,6 +10,8 @@ import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageParam; import com.zt.plat.framework.common.pojo.PageParam;
import com.zt.plat.framework.common.pojo.PageResult; import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils; import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.datapermission.core.annotation.CompanyDataPermissionIgnore;
import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIgnore;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi; import com.zt.plat.module.base.api.materialinfomation.MaterialInfomationApi;
import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationPageReqDTO; import com.zt.plat.module.base.api.materialinfomation.dto.MaterialInfomationPageReqDTO;
@@ -23,14 +25,17 @@ import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import com.zt.plat.module.contractorder.api.dto.order.OrderAndPlanDataReqDTO; import com.zt.plat.module.contractorder.api.dto.order.OrderAndPlanDataReqDTO;
import com.zt.plat.module.contractorder.api.vo.contract.ContractRespVO; import com.zt.plat.module.contractorder.api.vo.contract.ContractRespVO;
import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.*; import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.*;
import com.zt.plat.module.contractorder.dal.dataobject.contract.ContractMainDO;
import com.zt.plat.module.contractorder.dal.dataobject.contract.SystemRelativityDO; import com.zt.plat.module.contractorder.dal.dataobject.contract.SystemRelativityDO;
import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PrchOrdDtlDO; import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PrchOrdDtlDO;
import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO; import com.zt.plat.module.contractorder.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDO; import com.zt.plat.module.contractorder.dal.dataobject.salesorder.SalesOrderDO;
import com.zt.plat.module.contractorder.dal.mysql.contract.ContractMainMapper;
import com.zt.plat.module.contractorder.dal.mysql.contract.SystemRelativityMapper; import com.zt.plat.module.contractorder.dal.mysql.contract.SystemRelativityMapper;
import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PrchOrdDtlMapper; import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PrchOrdDtlMapper;
import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PurchaseOrderMapper; import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PurchaseOrderMapper;
import com.zt.plat.module.contractorder.enums.ErpConstants; import com.zt.plat.module.contractorder.enums.ErpConstants;
import com.zt.plat.module.contractorder.enums.OrderTypeEnum;
import com.zt.plat.module.contractorder.enums.contract.DictEnum; import com.zt.plat.module.contractorder.enums.contract.DictEnum;
import com.zt.plat.module.contractorder.enums.purchaseorder.OrderStatusEnum; import com.zt.plat.module.contractorder.enums.purchaseorder.OrderStatusEnum;
import com.zt.plat.module.contractorder.service.contract.ContractService; import com.zt.plat.module.contractorder.service.contract.ContractService;
@@ -105,6 +110,16 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
private WarehouseFactoryService warehouseFactoryService; private WarehouseFactoryService warehouseFactoryService;
@Resource @Resource
private InternalWarehouseService internalWarehouseService; private InternalWarehouseService internalWarehouseService;
@Resource
private ContractMainMapper contractMainMapper;
private static final Map<String, String> VALID_RELATIONS = new HashMap<>();
static {
// 初始化合法的双向映射关系
VALID_RELATIONS.put("ENT", "ENTED_PUR");
VALID_RELATIONS.put("ENTED_PUR", "ENT");
VALID_RELATIONS.put("PUR", "SALE");
VALID_RELATIONS.put("SALE", "PUR");
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -903,6 +918,58 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
return new PageResult<>(pageData, (long) allData.size()); return new PageResult<>(pageData, (long) allData.size());
} }
@Override
@CompanyDataPermissionIgnore
@DeptDataPermissionIgnore
public PageResult<PurchaseOrderDO> pageOrderNoPermission(PurchaseOrderPageReqVO pageReqVO) {
if (pageReqVO.getId() == null){
throw exception(PURCHASE_ORDER_ID_IS_NULL);
}
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(pageReqVO.getId());
ContractMainDO contractMainDO = contractMainMapper.selectOne(new LambdaQueryWrapper<ContractMainDO>()
.eq(ContractMainDO::getId, purchaseOrderDO.getContractNumber()));
ContractMainDO relatedContract = contractMainMapper.selectById(contractMainDO.getRelatedContractId());
String splyBsnTp = VALID_RELATIONS.getOrDefault(purchaseOrderDO.getSplyBsnTp(), null); // 获取供应商业务类型
if (splyBsnTp == null){
throw exception(PURCHASE_ORDER_ID_IS_EMPTY);
}
pageReqVO.setContractNumber(relatedContract.getSystemContractNumber());
pageReqVO.setSplyBsnTp(splyBsnTp);
return purchaseOrderMapper.selectLinkPage(pageReqVO);
}
@Override
@CompanyDataPermissionIgnore
@DeptDataPermissionIgnore
@Transactional(rollbackFor = Exception.class)
public void boundOrder(BoundOrderReqVO reqVO) {
log.info("开始执行绑定订单操作,请求参数:{}", reqVO);
//查询当前订单是否已经绑定订单
PurchaseOrderDO orderDO = purchaseOrderMapper.selectById(reqVO.getId());
PurchaseOrderDO boundOrder = purchaseOrderMapper.selectById(reqVO.getBoundId());
if (boundOrder == null|| orderDO==null){
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
//判断当前订单是否是来料加工销售订单(来料加工消费订单不允许绑定订单)
if (OrderTypeEnum.ENTED_SALE.getCode().equals(orderDO.getSplyBsnTp())) {
throw exception(PURCHASE_ORDER_NOT_ALLOW_BIND);
}
if (orderDO.getRelatedOrderId()!=null){
//将已绑定的订单置空
PurchaseOrderDO relatedOrder = purchaseOrderMapper.selectById(orderDO.getRelatedOrderId());
relatedOrder.setRelatedOrderId(null);
purchaseOrderMapper.updateById(relatedOrder);
log.info("已绑定的订单已解绑订单ID{}", relatedOrder.getId());
}
orderDO.setRelatedOrderId(reqVO.getBoundId());
purchaseOrderMapper.updateById(orderDO);
log.info("订单ID{} 已绑定订单ID{}", reqVO.getId(), reqVO.getBoundId());
//修改已绑定的的订单
boundOrder.setRelatedOrderId(reqVO.getId());
purchaseOrderMapper.updateById(boundOrder);
log.info("绑定订单操作完成订单ID{}", reqVO.getId());
}
public WarehouseFactoryRespVO getBoundFactoryAndWarehouse(String factoryCode, String warehouseCode) { public WarehouseFactoryRespVO getBoundFactoryAndWarehouse(String factoryCode, String warehouseCode) {
// 1. 查询主库信息,空值直接抛异常(精准异常信息) // 1. 查询主库信息,空值直接抛异常(精准异常信息)