订单管理相关

This commit is contained in:
潘荣晟
2025-10-14 17:40:18 +08:00
parent db04862660
commit a1747fba8b
13 changed files with 381 additions and 194 deletions

View File

@@ -86,7 +86,9 @@ public class PurchaseOrderController implements BusinessControllerMarker {
@PreAuthorize("@ss.hasPermission('bse:purchase-order:query')")
public CommonResult<PurchaseOrderRespVO> getPurchaseOrder(@RequestParam("id") Long id) {
PurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(id);
return success(BeanUtils.toBean(purchaseOrder, PurchaseOrderRespVO.class));
PurchaseOrderRespVO purchaseOrderRespVO = BeanUtils.toBean(purchaseOrder, PurchaseOrderRespVO.class);
purchaseOrderService.setOrderDetails(purchaseOrderRespVO);
return success(purchaseOrderRespVO);
}
@GetMapping("/page")
@@ -94,7 +96,9 @@ public class PurchaseOrderController implements BusinessControllerMarker {
@PreAuthorize("@ss.hasPermission('bse:purchase-order:query')")
public CommonResult<PageResult<PurchaseOrderRespVO>> getPurchaseOrderPage(@Valid PurchaseOrderPageReqVO pageReqVO) {
PageResult<PurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class));
PageResult<PurchaseOrderRespVO> purchaseOrderRespVOPageResult = BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class);
purchaseOrderRespVOPageResult.getList().forEach(purchaseOrderRespVO -> purchaseOrderService.setOrderDetails(purchaseOrderRespVO));
return success(purchaseOrderRespVOPageResult);
}
@GetMapping("/export-excel")
@@ -135,7 +139,7 @@ public class PurchaseOrderController implements BusinessControllerMarker {
//通过订单号查询订单信息
@PostMapping("/get-order-by-order-no")
@Operation(summary = "通过订单号查询订单信息")
@Operation(summary = "通过订单号查询订单信息", description = "通过订单号查询订单信息")
public CommonResult<List<PurchaseOrderDetailsRespVO>> getOrderByOrderNo(@RequestBody @Validated @NotEmpty(message = "采购订单不能为空") List<String> orderNos){
return success(purchaseOrderService.getOrderByOrderNo(orderNos));
}

View File

@@ -1,5 +1,6 @@
package com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo;
import com.alibaba.fastjson2.JSONObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@@ -62,7 +63,7 @@ public class PrchOrdDtlSaveReqVO {
@Schema(description = "税码(字典: PRCH_TAX);推送ERP", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "税码(字典: PRCH_TAX);推送ERP不能为空")
private BigDecimal taxNum;
private String taxNum;
@Schema(description = "是否基于GR的发票校验;推送ERP")
private String isGrInv;
@@ -149,7 +150,7 @@ public class PrchOrdDtlSaveReqVO {
private String isEnb;
@Schema(description = "科目分配详情;科目分配类别为K或P时使用(JSON)")
private String actsCtgrDtl;
private JSONObject actsCtgrDtl;
@Schema(description = "委托加工详情;委托加工订单使用(JSON)")
private String enttDtl;

View File

@@ -164,6 +164,7 @@ public class PurchaseOrderRespVO {
@Schema(description = "订单明细")
@ExcelProperty("订单明细")
private List<PrchOrdDtlRespVO> prchOrdDtlRespVOS;
@Schema(description = "物料类型(字典:MTRL_TP)", example = "2")
@ExcelProperty("物料类型(字典:MTRL_TP)")
private String mtrlTp;

View File

@@ -24,9 +24,9 @@ public class PurchaseOrderSaveReqVO {
@Schema(description = "ERP订单号")
private String orderSAPNumber;
@Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "订单号不能为空")
private String systemOrderNumber;
// @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotEmpty(message = "订单号不能为空")
// private String systemOrderNumber;
@Schema(description = "公司编码;推送ERP必须", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "公司编码;推送ERP必须不能为空")
@@ -94,10 +94,10 @@ public class PurchaseOrderSaveReqVO {
@Schema(description = "代理方名称", example = "张三")
private String agentName;
@Schema(description = "订单编码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "订单编码不能为空")
private String orderNumber;
//
// @Schema(description = "订单编码", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotEmpty(message = "订单编码不能为空")
// private String orderNumber;
@Schema(description = "系统合同编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "系统合同编号不能为空")

View File

@@ -104,7 +104,7 @@ public class PrchOrdDtlDO extends BusinessBaseDO {
* 税码(字典: PRCH_TAX);推送ERP
*/
@TableField("TAX_NUM")
private BigDecimal taxNum;
private String taxNum;
/**
* 是否基于GR的发票校验;推送ERP
*/
@@ -271,11 +271,4 @@ public class PrchOrdDtlDO extends BusinessBaseDO {
@TableField("ELEM_CDG")
private String elemCdg;
/**
* 物料字典
*
*/
@TableField("MTRL_TP")
private String mtrlTp;
}

View File

@@ -141,8 +141,8 @@ public class PurchaseOrderDO extends BusinessBaseDO {
/**
* 订单编码
*/
@TableField("ORD_NUM")
private String orderNumber;
// @TableField("ORD_NUM")
// private String orderNumber;
/**
* 系统合同编号
*/
@@ -237,4 +237,12 @@ public class PurchaseOrderDO extends BusinessBaseDO {
*/
@TableField("IS_PUSH")
private int isPush;
/**
* 物料字典
*
*/
@TableField("MTRL_TP")
private String mtrlTp;
}

View File

@@ -43,7 +43,7 @@ public interface PurchaseOrderMapper extends BaseMapperX<PurchaseOrderDO> {
.eqIfPresent(PurchaseOrderDO::getRemark, reqVO.getRemark())
.eqIfPresent(PurchaseOrderDO::getAgentNumber, reqVO.getAgentNumber())
.likeIfPresent(PurchaseOrderDO::getAgentName, reqVO.getAgentName())
.eqIfPresent(PurchaseOrderDO::getOrderNumber, reqVO.getOrderNumber())
// .eqIfPresent(PurchaseOrderDO::getOrderNumber, reqVO.getOrderNumber())
.eqIfPresent(PurchaseOrderDO::getContractNumber, reqVO.getContractNumber())
.eqIfPresent(PurchaseOrderDO::getMaterialNumber, reqVO.getMaterialNumber())
.likeIfPresent(PurchaseOrderDO::getMaterialName, reqVO.getMaterialName())

View File

@@ -81,4 +81,6 @@ public interface PurchaseOrderService {
* @return 订单信息
*/
List<PurchaseOrderDetailsRespVO> getOrderByOrderNo(List<String> orderNo);
void setOrderDetails(PurchaseOrderRespVO purchaseOrderRespVO);
}

View File

@@ -1,6 +1,9 @@
package com.zt.plat.module.contractorder.service.purchaseorder;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi;
import com.zt.plat.module.bpm.api.task.BpmTaskApi;
@@ -10,12 +13,16 @@ import com.zt.plat.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO;
import com.zt.plat.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo.*;
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.mysql.purchaseorder.PrchOrdDtlMapper;
import com.zt.plat.module.contractorder.dal.mysql.purchaseorder.PurchaseOrderMapper;
import com.zt.plat.module.contractorder.enums.purchaseorder.PurchaseOrderStatusEnum;
import com.zt.plat.module.contractorder.util.constants.ProcessDefinitionKeyConstants;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderUpdateReqVO;
import com.zt.plat.module.erp.service.erp.ErpOrderService;
import com.zt.plat.module.system.api.sequence.SequenceApi;
import com.zt.plat.module.system.api.user.AdminUserApi;
import com.zt.plat.module.system.api.user.dto.AdminUserRespDTO;
import lombok.extern.slf4j.Slf4j;
@@ -62,6 +69,12 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Resource
private BpmTaskApi bpmTaskApi;
@Resource
private PrchOrdDtlMapper prchOrdDtlMapper;
@Resource
private SequenceApi sequenceApi;
@Override
public PurchaseOrderRespVO createPurchaseOrder(PurchaseOrderSaveReqVO createReqVO) {
@@ -72,6 +85,9 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
} else {
purchaseOrder.setStatus(PurchaseOrderStatusEnum.TO_SUBMIT_ERP.getCode());
}
//生成订单号
String orderNumber = generateOrderNumber(purchaseOrder.getMtrlTp());
purchaseOrder.setSystemOrderNumber(orderNumber);
purchaseOrderMapper.insert(purchaseOrder);
// 返回
//批量插入订单明细
@@ -200,6 +216,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
}
@Override
@Transactional
public String submitErp061(List<Long> ids) {
//通过订单号查询订单
List<PurchaseOrderWithDetailsVO> purchaseOrderWithDetailsVOS = purchaseOrderMapper.selectOrderByIds(ids);
@@ -207,7 +224,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
purchaseOrderWithDetailsVOS.forEach(purchaseOrderWithDetailsVO -> {
ErpOrderSaveReqVO erpOrderSaveReqVO = new ErpOrderSaveReqVO();
if (purchaseOrderWithDetailsVO.getPurchaseOrder() != null) {
erpOrderSaveReqVO.setOrderid(purchaseOrderWithDetailsVO.getPurchaseOrder().getOrderNumber());
erpOrderSaveReqVO.setOrderid(purchaseOrderWithDetailsVO.getPurchaseOrder().getSystemOrderNumber());
erpOrderSaveReqVO.setCompCode(purchaseOrderWithDetailsVO.getPurchaseOrder().getCompanyNumber());//公司代码
erpOrderSaveReqVO.setVendor(purchaseOrderWithDetailsVO.getPurchaseOrder().getSupplierNumber());// 供应商帐号
erpOrderSaveReqVO.setDocType(purchaseOrderWithDetailsVO.getPurchaseOrder().getType());//采购凭证类型
@@ -220,7 +237,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
erpOrderSaveReqVO.setZxxyh(purchaseOrderWithDetailsVO.getPurchaseOrder().getPaperContractNumber());//小协议号
}
if (purchaseOrderWithDetailsVO.getOrderDetails()!= null){
if (purchaseOrderWithDetailsVO.getOrderDetails() != null) {
purchaseOrderWithDetailsVO.getOrderDetails().forEach(orderDetail -> {
erpOrderSaveReqVO.setPoItem(orderDetail.getLineNum()); //行号
erpOrderSaveReqVO.setMaterial(orderDetail.getRcvFactNum());//物料号
@@ -230,9 +247,22 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
erpOrderSaveReqVO.setActsCtgrDtl(orderDetail.getActsCtgrDtl());
});
}
erpOrderService.submitOrderToErp(erpOrderSaveReqVO);
String s = erpOrderService.submitOrderToErp061(erpOrderSaveReqVO);
log.info("订单推送成功,订单id【{}】", purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
String erpId = JSONObject.parseObject(s).get("id").toString();
if (erpId != null) {
//更新订单
int i = purchaseOrderMapper.updateById(new PurchaseOrderDO().setId(purchaseOrderWithDetailsVO.getPurchaseOrder().getId()).setOrderSAPNumber(erpId));
if (i > 0) {
log.info("更新订单ERPID成功,订单id【{}】", purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
} else {
log.info("订单更新失败,订单id【{}】", purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
throw new RuntimeException("订单更新失败");
}
}
});
//推送后把erp订单id设置到订单里
return "ERP推送成功";
} else {
return "订单不存在";
@@ -241,12 +271,16 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Override
public boolean submitErp062(Long id) {
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectByOrderId(id);
if (purchaseOrderDO== null){
List<PurchaseOrderWithDetailsVO> purchaseOrderWithDetailsVOS = purchaseOrderMapper.selectOrderByIds(List.of(id));
if (purchaseOrderWithDetailsVOS.isEmpty()) {
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
if (purchaseOrderDO.getOrderSAPNumber().isEmpty()){ return true;}
if (purchaseOrderWithDetailsVOS.get(0).getPurchaseOrder().getOrderSAPNumber().isEmpty()) {
return true;
}
ErpOrderUpdateReqVO erpOrderUpdateReqVO = new ErpOrderUpdateReqVO();
setValue(erpOrderUpdateReqVO, purchaseOrderWithDetailsVOS.get(0));
erpOrderService.submitOrderToErp062(erpOrderUpdateReqVO);
return true;
}
@@ -255,10 +289,10 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
// 校验存在
validatePurchaseOrderExists(orderId);
PurchaseOrderStatusEnum byCode = PurchaseOrderStatusEnum.getByCode(status);
if (byCode== null){
if (byCode == null) {
throw exception(PURCHASE_ORDER_STATUS_ERROR);
}
return purchaseOrderMapper.updateById(new PurchaseOrderDO().setId(orderId).setStatus(status))>0;
return purchaseOrderMapper.updateById(new PurchaseOrderDO().setId(orderId).setStatus(status)) > 0;
}
@Override
@@ -273,5 +307,76 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
return purchaseOrderDetailsRespVOS;
}
@Override
public void setOrderDetails(PurchaseOrderRespVO purchaseOrderRespVO) {
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseOrderRespVO.getId());
if (purchaseOrderDO == null) {
return;
}
List<PrchOrdDtlDO> prchOrdDtlDOS = prchOrdDtlMapper.selectList(new LambdaQueryWrapper<PrchOrdDtlDO>().eq(PrchOrdDtlDO::getOrdId, purchaseOrderDO.getId()));
purchaseOrderRespVO.setPrchOrdDtlRespVOS(BeanUtils.toBean(prchOrdDtlDOS, PrchOrdDtlRespVO.class));
}
private void setValue(ErpOrderUpdateReqVO erpOrderUpdateReqVO, PurchaseOrderWithDetailsVO purchaseOrderWithDetailsVO) {
//head
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
erpOrderUpdateReqVO.setPoNumber(purchaseOrderWithDetailsVO.getPurchaseOrder().getOrderSAPNumber()).setDeleteInd(purchaseOrderDO.getDeleted() ? 1 : 0).setCurrency(purchaseOrderWithDetailsVO.getPurchaseOrder().getCurrencyNumber()).setExchRate(purchaseOrderWithDetailsVO.getPurchaseOrder().getExchangeRate());
//exte
erpOrderUpdateReqVO.setZzhth(purchaseOrderWithDetailsVO.getPurchaseOrder().getPaperContractNumber()).setZxxyh(purchaseOrderWithDetailsVO.getPurchaseOrder().getAgreementNumber()).setZnote(purchaseOrderWithDetailsVO.getPurchaseOrder().getRemark()).setZlifnr(purchaseOrderWithDetailsVO.getPurchaseOrder().getAgreementNumber());
//item
setItems(erpOrderUpdateReqVO, purchaseOrderWithDetailsVO);
//itex
setItex(erpOrderUpdateReqVO, purchaseOrderWithDetailsVO);
//acct
// 使用FastJSON2直接将List转换为JSONArray
// acct部分转换List为JSONArray
List<JSONObject> actsCtgrDtlList = purchaseOrderWithDetailsVO.getOrderDetails().stream()
.map(PrchOrdDtlDO::getActsCtgrDtl).map(JSONObject::parseObject)
.toList();
// 直接使用FastJSON2将List转换为JSONArray关键优化点
JSONArray jsonArray = JSONArray.from(actsCtgrDtlList);
// 设置到对象中
erpOrderUpdateReqVO.setAccts(jsonArray);
}
private void setItems(ErpOrderUpdateReqVO erpOrderUpdateReqVO, PurchaseOrderWithDetailsVO purchaseOrderWithDetailsVO) {
List<ErpOrderUpdateReqVO.item> items = new ArrayList<>();
purchaseOrderWithDetailsVO.getOrderDetails().forEach(orderDetail -> {
PrchOrdDtlDO prchOrdDtlDO = prchOrdDtlMapper.selectById(orderDetail.getId());
ErpOrderUpdateReqVO.item item = new ErpOrderUpdateReqVO.item(); // item
item.setPo_item(prchOrdDtlDO.getLineNum());//行号
item.setMaterial(prchOrdDtlDO.getRcvFactNum());//物料号
item.setPlant(prchOrdDtlDO.getRcvFactNum());//工厂
item.setStge_loc(prchOrdDtlDO.getRcvWrhNum());//库位
item.setQuantity(prchOrdDtlDO.getQty());// 数量
item.setPo_unit(prchOrdDtlDO.getUnt());// 计量单位
item.setNet_price(prchOrdDtlDO.getInTaxUprc());// 含税单价
item.setTax_code(prchOrdDtlDO.getTaxNum());//税码
item.setAcctasscat(prchOrdDtlDO.getActsCtgr());//科目分配类别
item.setMatl_group(prchOrdDtlDO.getMtrlCpntNum());//物料组
item.setShort_text(prchOrdDtlDO.getShrtTxt());//短文本
item.setDelete_ind(prchOrdDtlDO.getDeleted() ? 1 : 0);//行项目删除标识
items.add(item);
});
erpOrderUpdateReqVO.setItems(items);
}
private void setItex(ErpOrderUpdateReqVO erpOrderUpdateReqVO, PurchaseOrderWithDetailsVO purchaseOrderWithDetailsVO) {
List<ErpOrderUpdateReqVO.itex> itexs = new ArrayList<>();
purchaseOrderWithDetailsVO.getOrderDetails().forEach(orderDetail -> {
ErpOrderUpdateReqVO.itex itex = new ErpOrderUpdateReqVO.itex(); // itex
itex.setPo_item(orderDetail.getLineNum()); //行号
itex.setZpurty(orderDetail.getPrchCtgr());//采购类别
itex.setZmatnr(orderDetail.getOrigWet()); // 原料湿重
itexs.add(itex);
});
erpOrderUpdateReqVO.setItexs(itexs);
}
private String generateOrderNumber(String materialType) {
return sequenceApi.getNextSequence("PURCHASE_ORDER_NUMBER", null, null).getData();
}
}

View File

@@ -33,7 +33,6 @@
po.RMK,
po.AGT_NUM,
po.AGT_NAME,
po.ORD_NUM,
po.CTRT_NUM,
po.MTRL_NUM,
po.MTRL_NAME,
@@ -140,7 +139,6 @@
po.RMK,
po.AGT_NUM,
po.AGT_NAME,
po.ORD_NUM,
po.CTRT_NUM,
po.MTRL_NUM,
po.MTRL_NAME,
@@ -256,7 +254,6 @@
<result column="RMK" property="remark"/>
<result column="AGT_NUM" property="agentNumber"/>
<result column="AGT_NAME" property="agentName"/>
<result column="ORD_NUM" property="orderNumber"/>
<result column="CTRT_NUM" property="contractNumber"/>
<result column="MTRL_NUM" property="materialNumber"/>
<result column="MTRL_NAME" property="materialName"/>