订单管理相关

This commit is contained in:
潘荣晟
2025-10-11 18:01:39 +08:00
parent 9011d8fc5a
commit 5119c6cdd5
14 changed files with 772 additions and 12 deletions

View File

@@ -0,0 +1,181 @@
package com.zt.plat.module.erp.controller.admin.erp.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* ERP采购订单保存请求VO
*/
@Data
@Schema(description = "ERP采购订单保存请求参数")
public class ErpOrderSaveReqVO {
@Schema(description = "公司代码")
@NotEmpty(message = "公司代码不能为空")
private String compCode; // BUKRS CHAR4
@Schema(description = "供应商帐号")
@NotEmpty(message = "供应商帐号不能为空")
private String vendor; // LIFNR CHAR10
@Schema(description = "采购凭证类型")
@NotEmpty(message = "采购凭证类型不能为空")
private String docType; // BSART CHAR4
@Schema(description = "采购凭证日期")
@NotEmpty(message = "采购凭证日期不能为空")
private LocalDateTime docDate; // BEDAT DATS8格式YYYYMMDD
@Schema(description = "采购组织")
@NotEmpty(message = "采购组织不能为空")
private String purchOrg; // EKORG CHAR4
@Schema(description = "采购组")
@NotEmpty(message = "采购组不能为空")
private String purGroup; // EKGRP CHAR3
@Schema(description = "货币码")
@NotEmpty(message = "货币码不能为空")
private String currency; // WAERS CUKY5
@Schema(description = "汇率")
private BigDecimal exchRate; // WKURS DEC9,5
@NotEmpty(message = "纸质合同号不能为空(已启用财务共享单位)")
private String zzhth; // CHAR60
@Schema(description = "小协议号(绿星链通填入合同名称)")
private String zxxyh; // CHAR60
@Schema(description = "备注(绿星链通填入系统采购订单头号)")
private String znote; // CHAR60
@Schema(description = "代理方(使用客商编码)")
private String zlifnr; // CHAR60
@Schema(description = "行号")
@NotEmpty(message = "行号不能为空")
private Long poItem; // EBELP NUMC5
@Schema(description = "物料号")
private String material; // MATNR CHAR18
@Schema(description = "工厂")
@NotEmpty(message = "工厂不能为空")
private String plant; // WERKS CHAR4
@Schema(description = "库存地点")
private String stgeLoc; // LGORT CHAR4
@Schema(description = "数量")
@NotEmpty(message = "数量不能为空")
private String quantity; // MENGE QUAN13,3
@Schema(description = "计量单位")
@NotNull(message = "计量单位不能为空")
private BigDecimal poUnit; // MEINS UNIT3
@Schema(description = "含税单价")
@NotNull(message = "含税单价不能为空")
private BigDecimal netPrice; // NETPR CURR11,2
@Schema(description = "价格单位默认值1表示以上单价对应的采购单位数量")
private Integer priceUnit; // PEINH DEC5
@Schema(description = "税码")
private String taxCode; // MWSKZ CHAR2
@Schema(description = "基于GR的发票校验")
private String grBasedIv; // WEBRE CHAR1
@Schema(description = "允许无限制过量交货")
private String unlimitedDlv; // UEBTK CHAR1
@Schema(description = "批次")
private String batch; // CHARG CHAR10
@Schema(description = "项目类别委托加工订单时填入L")
private String itemCat; // PSTYP CHAR1原表CAHR为笔误按CHAR处理
@Schema(description = "科目分配类别(固定资产采购:A服务采购S-销售服务费、K-成本中心、F-订单)")
private String acctassCat; // KNTTP CHAR1
@Schema(description = "物料组(服务采购订单必填)")
private String matlGroup; // MATKL CHAR9
@Schema(description = "短文本(服务采购订单必填,绿星链通系统必须填入)")
private String shortText; // TXZ01 CHAR40
@Schema(description = "退货项目标识退货行项目填X")
private String retItem; // RETPO CHAR1
@Schema(description = "免费项目标识免费行项目填X")
private String freeItem; // UMSON CHAR1
@Schema(description = "外部行项目号(绿星链通必填)")
private String vendrBatch; // LICHN CHAR15
@Schema(description = "备注信息-需求单位")
private String noteXq; // TDLINE CHAR132
@Schema(description = "备注信息-物料详细")
private String noteWl; // TDLINE CHAR132
@Schema(description = "交货起止日期格式YYYYMMDD-YYYYMMDD")
private String vendMat; // IDNLF CHAR22原表说明为交货起止日期按说明定义
@Schema(description = "销售物料号科目分配类别为S时必填")
private String zmatnr;
@Schema(description = "统计型内部订单")
private String zaufnr;
@Schema(description = "采购类别0-生产性物资类1-项目投资类)")
private String zpurty;
@Schema(description = "原料湿重")
private BigDecimal zmenge;
@Schema(description = "科目分配的序号从1开始编号")
@NotEmpty(message = "科目分配的序号不能为空")
private String serialNo; // DZEKKN NUMC2
@Schema(description = "总账科目编号")
private String glAccount; // SAKNR CHAR10
@Schema(description = "成本中心科目分配类别为F时必填")
private String costcenter; // KOSTL CHAR10
@Schema(description = "订单号科目分配类别为F时必填")
private String orderid; // AUFNR CHAR12
@Schema(description = "主资产号科目分配类别为A时必填")
private String assetNo; // ANLN1 CHAR12
@Schema(description = "资产子编号科目分配类别为A时必填固定值0")
private String subNumber; // ANLN2 CHAR4
@Schema(description = "计划行号从1开始编号")
private String schedLine; // ETENR NUMC4
@Schema(description = "项目编号从1开始编号")
private String itemNo; // RSPOS NUMC4
@Schema(description = "委托加工需求数量")
@NotNull(message = "委托加工需求数量不能为空")
private BigDecimal entryQuantity; // MENGE QUAN13,3
@Schema(description = "组件计量单位(为空时使用基本计量单位)")
private String entryUom; // MEINS UNIT3
@Schema(description = " 科目分配详情")
private String actsCtgrDtl;
}

View File

@@ -0,0 +1,9 @@
package com.zt.plat.module.erp.service.erp;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBillMainSaveReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO;
public interface ErpOrderService {
String submitOrderToErp(ErpOrderSaveReqVO createVo);
}

View File

@@ -0,0 +1,95 @@
package com.zt.plat.module.erp.service.erp;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.erp.api.ErpExternalApi;
import com.zt.plat.module.erp.api.dto.ErpSubmitReqDTO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpBillMainSaveReqVO;
import com.zt.plat.module.erp.controller.admin.erp.vo.ErpOrderSaveReqVO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ErpOrderServiceImpl implements ErpOrderService {
@Resource
public ErpExternalApi erpExternalApi;
@Override
public String submitOrderToErp(ErpOrderSaveReqVO createVo) {
ErpSubmitReqDTO reqDTO = buildBaseReqDTO(createVo, "061");
Map<String, Object> req = new HashMap<>();
Map<String, Object> head = new HashMap<>();
// head
head.put("comp_code", createVo.getCompCode());
head.put("vendor", createVo.getVendor());
head.put("doc_type", createVo.getDocType());
head.put("doc_date", createVo.getDocDate());
head.put("purch_org", createVo.getPurchOrg());
head.put("pur_group", createVo.getPurGroup());
head.put("currency", createVo.getCurrency());
head.put("exch_rate", createVo.getExchRate());
req.put("head", head);
//exte
Map<String, Object> exte = new HashMap<>();
exte.put("zzhth", createVo.getZzhth());
exte.put("zxxyh", createVo.getZxxyh());
exte.put("znote", createVo.getZnote());
exte.put("zlifnr", createVo.getZlifnr());
req.put("exte", exte);
getMaps(createVo, req);
reqDTO.setReq(req);
return submitToErp(reqDTO);
}
private ErpSubmitReqDTO buildBaseReqDTO(ErpOrderSaveReqVO vo, String funcnr) {
ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO();
reqDTO.setFuncnr(funcnr);
reqDTO.setBskey(vo.getOrderid());
reqDTO.setUsrid(String.valueOf(SecurityFrameworkUtils.getLoginUserId()));
reqDTO.setUsrnm((SecurityFrameworkUtils.getLoginUserNickname()));
return reqDTO;
}
private String submitToErp(ErpSubmitReqDTO reqDTO) {
HashMap<String, String> response = erpExternalApi.submitDataToErp(reqDTO);
return response.get("resStr");
}
private void getMaps(ErpOrderSaveReqVO vo, Map<String, Object> req) {
List<Map<String, Object>> items = new ArrayList<>();
Map<String, Object> item = new HashMap<>();
item.put("po_item", vo.getPoItem());
item.put("material", vo.getMaterial());
item.put("plant", vo.getPlant());
item.put("stge_loc", vo.getStgeLoc());
item.put("quantity", vo.getQuantity());
item.put("po_unit", vo.getPoUnit());
item.put("net_price", vo.getNetPrice());
item.put("price_unit", vo.getPriceUnit());
item.put("tax_code", vo.getTaxCode());
item.put("gr_based_iv", vo.getGrBasedIv());
item.put("unlimited_dlv", vo.getUnlimitedDlv());
item.put("batch", vo.getBatch());
item.put("item_cat", vo.getItemCat());
item.put("acctass_cat", vo.getAcctassCat());
item.put("matl_group", vo.getMatlGroup());
item.put("short_text", vo.getShortText());
item.put("ret_item", vo.getRetItem());
item.put("free_item", vo.getFreeItem());
item.put("vendr_batch", vo.getVendrBatch());
item.put("note_xq", vo.getNoteXq());
item.put("note_wl", vo.getNoteWl());
item.put("vend_mat", vo.getVendMat());
items.add(item);
if ("K".equals(vo.getAcctassCat())||"P".equals(vo.getAcctassCat())){
req.put("acct", vo.getActsCtgrDtl());
}
req.put("item", items);
}
}