订单管理相关

This commit is contained in:
潘荣晟
2025-10-21 18:04:21 +08:00
parent b6ad2a71e4
commit 688f4f17a0
9 changed files with 459 additions and 227 deletions

View File

@@ -182,4 +182,12 @@ public class PurchaseOrderController implements BusinessControllerMarker {
return success(purchaseOrderService.linkOrder(req));
}
@PostMapping("/order-pass-reject")
@Operation(summary = "订单审核")
public CommonResult<Boolean> orderPassReject(@RequestBody PurchaseorderReqVO reqVO){
return success(purchaseOrderService.orderPassReject(reqVO));
}
}

View File

@@ -175,4 +175,25 @@ public class PurchaseOrderRespVO {
@Schema(description = "订单分类", example = "2")
@ExcelProperty("订单分类")
private String splyBsnTp;
@Schema(description = "公司名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("公司名称")
private String cpName;
@Schema(description = "是否提交审核value为0或1")
@ExcelProperty("是否提交审核")
private int isPush;
@Schema(description = "流程实例编号")
@ExcelProperty("流程实例编号")
private String processInstanceId;
@Schema(description = "流程当前任务节点id")
@ExcelProperty("流程当前任务节点id")
private String taskId;
@Schema(description = " 审批意见")
@ExcelProperty(" 审批意见")
private String reviewOpinion;
}

View File

@@ -0,0 +1,23 @@
package com.zt.plat.module.contractorder.controller.admin.purchaseorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 订单审核请求对象 Request VO")
@Data
public class PurchaseorderReqVO {
@Schema(description = "合同主键ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "合同主键ID不能为空")
private Long id;
@Schema(description = "审批意见", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "审核意见不能为空")
private String reviewOpinion;
@Schema(description = "状态:待推送 WAIT_PUSH已驳回 REJECTED", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "审核状态不能为空")
private String status;
}

View File

@@ -84,7 +84,7 @@ public class PrchOrdDtlDO extends BusinessBaseDO {
* 暂估数量;推送ERP必须
*/
@TableField("QTY")
private String qty;
private BigDecimal qty;
/**
* 计量单位;推送ERP必须
*/

View File

@@ -110,4 +110,11 @@ public interface PurchaseOrderService {
*
*/
boolean linkOrder(LinkOrderReqVO reqVO);
/**
* 订单审核通过和不通过
*
* @param purchaseorderReqVO 采购审核
*
*/
boolean orderPassReject(PurchaseorderReqVO purchaseorderReqVO);
}

View File

@@ -9,16 +9,14 @@ import com.zt.plat.framework.common.pojo.CommonResult;
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;
import com.zt.plat.module.bpm.api.task.dto.BpmApprovalDetailReqDTO;
import com.zt.plat.module.bpm.api.task.dto.BpmApprovalDetailRespDTO;
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.api.task.dto.*;
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.contract.DictEnum;
import com.zt.plat.module.contractorder.enums.purchaseorder.PurchaseOrderStatusEnum;
import com.zt.plat.module.contractorder.service.contract.ContractService;
import com.zt.plat.module.contractorder.util.constants.ProcessDefinitionKeyConstants;
@@ -37,6 +35,7 @@ import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -95,7 +94,10 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
String orderNumber = generateOrderNumber(purchaseOrder.getMtrlTp());
purchaseOrder.setSystemOrderNumber(orderNumber);
purchaseOrderMapper.insert(purchaseOrder);
// 返回
if (createReqVO.getPrchOrdDtlSaveReqVOS().isEmpty()){
return BeanUtils.toBean(purchaseOrder, PurchaseOrderRespVO.class);
}
//批量插入订单明细
createReqVO.getPrchOrdDtlSaveReqVOS().forEach(prchOrdDtlSaveReqVO -> prchOrdDtlSaveReqVO.setOrdId(purchaseOrder.getId()));
List<PrchOrdDtlRespVO> prchOrdDtlRespVOS = prchOrdDtlService.batchCreatePrchOrdDtl(createReqVO.getPrchOrdDtlSaveReqVOS());
@@ -113,13 +115,13 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
PurchaseOrderDO updateObj = BeanUtils.toBean(updateReqVO, PurchaseOrderDO.class);
purchaseOrderMapper.updateById(updateObj);
//删除订单明细
prchOrdDtlService.deletePrchOrdDtlListByOrdIds(Collections.singletonList(updateReqVO.getId()));
log.info("删除旧的订单明细成功");
// prchOrdDtlService.deletePrchOrdDtlListByOrdIds(Collections.singletonList(updateReqVO.getId()));
// log.info("删除旧的订单明细成功");
// 返回
//批量插入订单明细
updateReqVO.getPrchOrdDtlSaveReqVOS().forEach(prchOrdDtlSaveReqVO -> prchOrdDtlSaveReqVO.setOrdId(updateReqVO.getId()));
prchOrdDtlService.batchCreatePrchOrdDtl(updateReqVO.getPrchOrdDtlSaveReqVOS());
log.info("更新订单明细成功");
// updateReqVO.getPrchOrdDtlSaveReqVOS().forEach(prchOrdDtlSaveReqVO -> prchOrdDtlSaveReqVO.setOrdId(updateReqVO.getId()));
// prchOrdDtlService.batchCreatePrchOrdDtl(updateReqVO.getPrchOrdDtlSaveReqVOS());
log.info("更新订单明细成功");
}
@Override
@@ -140,7 +142,8 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
prchOrdDtlService.deletePrchOrdDtlListByOrdIds(ids);
}
private void validatePurchaseOrderNosExists(List<String> orderNos){
private void validatePurchaseOrderNosExists(List<String> orderNos) {
List<PurchaseOrderDO> list = purchaseOrderMapper.selectList(new LambdaQueryWrapper<PurchaseOrderDO>().in(PurchaseOrderDO::getSystemOrderNumber, orderNos));
if (CollUtil.isEmpty(list) || list.size() != orderNos.size()) {
throw exception(PURCHASE_ORDER_NOT_EXISTS);
@@ -239,51 +242,127 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Override
@Transactional
public String submitErp061(List<Long> ids) {
//通过订单号查询订单
// 通过订单号查询订单
List<PurchaseOrderWithDetailsVO> purchaseOrderWithDetailsVOS = purchaseOrderMapper.selectOrderByIds(ids);
if (!purchaseOrderWithDetailsVOS.isEmpty()) {
purchaseOrderWithDetailsVOS.forEach(purchaseOrderWithDetailsVO -> {
ErpOrderSaveReqVO erpOrderSaveReqVO = new ErpOrderSaveReqVO();
if (purchaseOrderWithDetailsVO.getPurchaseOrder() != null) {
erpOrderSaveReqVO.setOrderid(purchaseOrderWithDetailsVO.getPurchaseOrder().getSystemOrderNumber());
erpOrderSaveReqVO.setCompCode(purchaseOrderWithDetailsVO.getPurchaseOrder().getCompanyNumber());//公司代码
erpOrderSaveReqVO.setVendor(purchaseOrderWithDetailsVO.getPurchaseOrder().getSupplierNumber());// 供应商帐号
erpOrderSaveReqVO.setDocType(purchaseOrderWithDetailsVO.getPurchaseOrder().getType());//采购凭证类型
erpOrderSaveReqVO.setDocDate(purchaseOrderWithDetailsVO.getPurchaseOrder().getVoucherDate()); //采购凭证日期
erpOrderSaveReqVO.setPurchOrg(purchaseOrderWithDetailsVO.getPurchaseOrder().getPurchaseOrganizationCustomsDeclaration());//采购组织
erpOrderSaveReqVO.setPurGroup(purchaseOrderWithDetailsVO.getPurchaseOrder().getPurchaseGroup());//采购组
erpOrderSaveReqVO.setCurrency(purchaseOrderWithDetailsVO.getPurchaseOrder().getCurrencyNumber()); // 货币码
erpOrderSaveReqVO.setExchRate(purchaseOrderWithDetailsVO.getPurchaseOrder().getExchangeRate());//汇率
erpOrderSaveReqVO.setZzhth(purchaseOrderWithDetailsVO.getPurchaseOrder().getContractNumber());//纸质合同号
erpOrderSaveReqVO.setZxxyh(purchaseOrderWithDetailsVO.getPurchaseOrder().getPaperContractNumber());//小协议号
PurchaseOrderDO order = purchaseOrderWithDetailsVO.getPurchaseOrder();
erpOrderSaveReqVO.setOrderNo(order.getSystemOrderNumber());
// 1. 处理抬头信息(Head)
ErpOrderSaveReqVO.Head head = new ErpOrderSaveReqVO.Head();
head.setComp_code(order.getCompanyNumber()); // 公司编码 -> 公司代码
head.setVendor(order.getSupplierNumber()); // 客商编码 -> 供应商帐号
head.setDoc_type(order.getType()); // 订单类型 -> 采购凭证类型
head.setDoc_date(order.getVoucherDate() != null ? order.getVoucherDate().toLocalDate() : null); // 凭证日期 -> 采购凭证日期
head.setPurch_org(order.getPurchaseOrganizationCustomsDeclaration()); // 采购组织编码 -> 采购组织
head.setPur_group(order.getPurchaseGroup()); // 采购组编码 -> 采购组
head.setCurrency(order.getCurrencyNumber()); // 货币码 -> 货币码
head.setExch_rate(order.getExchangeRate()); // 汇率 -> 汇率
erpOrderSaveReqVO.setHead(head);
// 2. 处理抬头扩展信息(Exte)
ErpOrderSaveReqVO.Exte exte = new ErpOrderSaveReqVO.Exte();
exte.setZzhth(order.getPaperContractNumber()); // 合同纸质合同号 -> 纸质合同号
exte.setZxxyh(order.getAgreementNumber()); // 小协议号 -> 小协议号
exte.setZnote(order.getRemark()); // 备注 -> 备注
exte.setZlifnr(order.getAgentNumber()); // 代理方编码 -> 代理方
erpOrderSaveReqVO.setExte(exte);
List<JSONObject> actsCtgrDtlList = purchaseOrderWithDetailsVO.getOrderDetails().stream()
.map(PrchOrdDtlDO::getActsCtgrDtl).map(JSONObject::parseObject)
.toList();
JSONArray jsonArray = JSONArray.from(actsCtgrDtlList);
erpOrderSaveReqVO.setAccts(jsonArray);
// 3. 处理行项目信息(Item)
List<PrchOrdDtlDO> details = purchaseOrderWithDetailsVO.getOrderDetails();
if (details != null && !details.isEmpty()) {
List<ErpOrderSaveReqVO.Item> items = new ArrayList<>();
for (PrchOrdDtlDO detail : details) {
ErpOrderSaveReqVO.Item item = new ErpOrderSaveReqVO.Item();
// 3.1 行项目基本信息
item.setPo_item(detail.getLineNum() != null ? detail.getLineNum().intValue() : null); // 行项目 -> 行号
item.setMaterial(detail.getMtrlNum()); // 物料编码 -> 物料号
item.setPlant(detail.getRcvFactNum()); // 收货工厂编码 -> 工厂
item.setStge_loc(detail.getRcvWrhNum()); // 收货库位编码 -> 库存地点
item.setQuantity(detail.getQty()); // 暂估数量 -> 数量
item.setPo_unit(detail.getUnt()); // 计量单位 -> 计量单位
item.setNet_price(detail.getInTaxUprc()); // 含税单价 -> 含税单价
item.setPrice_unit(detail.getPrcUnt() != null ? detail.getPrcUnt().intValue() : 1); // 价格单位 -> 价格单位
item.setTax_code(detail.getTaxNum()); // 税码 -> 税码
item.setGr_basediv(detail.getIsGrInv()); // 是否基于GR的发票校验 -> 基于GR的发票校验
item.setUnlimited_dlv(detail.getIsUnlRcv()); // 是否允许无限制收货 -> 允许无限制过量交货
item.setBatch(detail.getBat()); // 批次 -> 批次
item.setAcctasscat(detail.getActsCtgr()); // 科目分配类别 -> 科目分配类别
item.setMatl_group(detail.getMtrlCpntNum()); // 物料组编码 -> 物料组
item.setShort_text(detail.getShrtTxt()); // 短文本 -> 短文本
item.setRet_item(detail.getIsRlbkCgo()); // 退货标识 -> 退货项目标识
item.setFree_item(detail.getIsFreeRcv()); // 是否免费收货标识 -> 免费项目标识
item.setVendrbatch(String.valueOf(detail.getOutLineNum())); // 外部行项目号 -> 外部行项目号
item.setNote_xq(detail.getRmkUnt()); // 备注信息-需求单位 -> 备注信息-需求单位
item.setNote_wl(detail.getRmkMtrl()); // 备注信息-物料详细 -> 备注信息-物料详细
// 处理交货起止日期(格式:YYYYMMDD-YYYYMMDD)
StringBuilder vendMat = new StringBuilder();
if (detail.getBgnDt() != null) {
vendMat.append(detail.getBgnDt().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
}
vendMat.append("-");
if (detail.getDdlDt() != null) {
vendMat.append(detail.getDdlDt().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
}
item.setVend_mat(vendMat.toString());
// 3.2 行项目扩展信息(Itex)
ErpOrderSaveReqVO.Itex itex = new ErpOrderSaveReqVO.Itex();
itex.setZmatnr(detail.getSaleMtrlNum()); // 销售物料号 -> 销售物料号
itex.setZaufnr(detail.getInOrd()); // 统计型内部订单 -> 统计型内部订单
itex.setZpurty(detail.getPrchCtgr()); // 采购类别 -> 采购类别
itex.setZmenge(detail.getOrigWet()); // 原料湿重 -> 原料湿重
item.setItex(itex);
// 3.4 委托加工物料信息(Comp) - 简化处理实际需解析JSON
// List<ErpOrderSaveReqVO.Comp> comps = new ArrayList<>();
// if (detail.getEnttDtl() != null && !detail.getEnttDtl().isEmpty()) {
// // 假设ENTT_DTL是JSON数组实际需根据具体格式解析
// ErpOrderSaveReqVO.Comp comp = new ErpOrderSaveReqVO.Comp();
// comp.setSched_line(1); // 计划行号(示例)
// comp.setItem_no(1); // 项目编号(示例)
// // 其他字段需从JSON中解析material、plant、entry_quantity等
// comps.add(comp);
// }
// item.setComps(comps);
items.add(item);
}
erpOrderSaveReqVO.setItems(items);
}
if (purchaseOrderWithDetailsVO.getOrderDetails() != null) {
purchaseOrderWithDetailsVO.getOrderDetails().forEach(orderDetail -> {
erpOrderSaveReqVO.setPoItem(orderDetail.getLineNum()); //行号
erpOrderSaveReqVO.setMaterial(orderDetail.getRcvFactNum());//物料号
erpOrderSaveReqVO.setQuantity(orderDetail.getQty());// 数量
erpOrderSaveReqVO.setPoUnit(orderDetail.getUnt());// 计量单位
erpOrderSaveReqVO.setNetPrice(orderDetail.getInTaxUprc());// 含税单价
erpOrderSaveReqVO.setActsCtgrDtl(orderDetail.getActsCtgrDtl());
});
}
// 4. 推送ERP并处理返回结果
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());
log.info("订单推送成功,订单id【{}】", order.getId());
// 解析ERP返回的ID
JSONObject jsonObject = JSONObject.parseObject(s);
String erpId = jsonObject.getString("id");
if (erpId != null && !erpId.isEmpty()) {
// 更新订单ERP编号
PurchaseOrderDO updateDO = new PurchaseOrderDO();
updateDO.setId(order.getId());
updateDO.setOrderSAPNumber(erpId);
int updateCount = purchaseOrderMapper.updateById(updateDO);
if (updateCount > 0) {
log.info("更新订单ERPID成功,订单id【{}】", order.getId());
} else {
log.info("订单更新失败,订单id【{}】", purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
log.error("订单更新失败,订单id【{}】", order.getId());
throw new RuntimeException("订单更新失败");
}
} else {
log.error("ERP返回ID为空,订单id【{}】", order.getId());
throw new RuntimeException("ERP返回ID为空");
}
});
//推送后把erp订单id设置到订单里
return "ERP推送成功";
} else {
return "订单不存在";
@@ -341,27 +420,27 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
@Override
public void updateOrderStatusByIdOrOrderNo(PurchaseOrderStsReqVO reqVO) {
// 校验存在
if (reqVO.getIds()!=null){
validatePurchaseOrderExists(reqVO.getIds());
}
if (reqVO.getOrderNos()!=null){
validatePurchaseOrderNosExists(reqVO.getOrderNos());
}
if (reqVO.getIds() != null) {
validatePurchaseOrderExists(reqVO.getIds());
}
if (reqVO.getOrderNos() != null) {
validatePurchaseOrderNosExists(reqVO.getOrderNos());
}
PurchaseOrderStatusEnum byCode = PurchaseOrderStatusEnum.getByCode(reqVO.getSts());
if (byCode == null) {
throw exception(PURCHASE_ORDER_STATUS_ERROR);
}
purchaseOrderMapper.update(new LambdaUpdateWrapper<PurchaseOrderDO>().in(reqVO.getOrderNos()!=null,PurchaseOrderDO::getSystemOrderNumber, reqVO.getOrderNos()).in(reqVO.getIds()!=null,PurchaseOrderDO::getId, reqVO.getIds()).set(PurchaseOrderDO::getStatus, reqVO.getSts()));
purchaseOrderMapper.update(new LambdaUpdateWrapper<PurchaseOrderDO>().in(reqVO.getOrderNos() != null, PurchaseOrderDO::getSystemOrderNumber, reqVO.getOrderNos()).in(reqVO.getIds() != null, PurchaseOrderDO::getId, reqVO.getIds()).set(PurchaseOrderDO::getStatus, reqVO.getSts()));
}
@Override
public CommonResult<MaterialRespVO> getMaterial(String orderNo) {
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectOne(new LambdaQueryWrapper<PurchaseOrderDO>().eq(PurchaseOrderDO::getSystemOrderNumber, orderNo));
if (purchaseOrderDO == null){
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
if (purchaseOrderDO == null) {
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
String mtrlTp = purchaseOrderDO.getMtrlTp();
if ("RAW".equals(mtrlTp)){
if ("RAW".equals(mtrlTp)) {
//原料
MaterialRespVO materialRespVO = new MaterialRespVO();
materialRespVO.setMaterialType(mtrlTp);
@@ -374,7 +453,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
materialDetails.setMaterialType(purchaseOrderDO.getMtrlTp());
materialRespVO.setMaterialDetails(List.of(materialDetails));
return CommonResult.success(materialRespVO);
}else {
} else {
List<PrchOrdDtlDO> detailsByOrderIds = prchOrdDtlService.getDetailsByOrderId(purchaseOrderDO.getId());
MaterialRespVO materialRespVO = new MaterialRespVO();
materialRespVO.setMaterialType(mtrlTp);
@@ -399,6 +478,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
return contractService.linkOrder(reqVO);
}
private void setValue(ErpOrderUpdateReqVO erpOrderUpdateReqVO, PurchaseOrderWithDetailsVO purchaseOrderWithDetailsVO) {
//head
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseOrderWithDetailsVO.getPurchaseOrder().getId());
@@ -428,7 +508,7 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
item.setMaterial(prchOrdDtlDO.getRcvFactNum());//物料号
item.setPlant(prchOrdDtlDO.getRcvFactNum());//工厂
item.setStge_loc(prchOrdDtlDO.getRcvWrhNum());//库位
item.setQuantity(prchOrdDtlDO.getQty());// 数量
item.setQuantity(String.valueOf(prchOrdDtlDO.getQty()));// 数量
item.setPo_unit(prchOrdDtlDO.getUnt());// 计量单位
item.setNet_price(prchOrdDtlDO.getInTaxUprc());// 含税单价
item.setTax_code(prchOrdDtlDO.getTaxNum());//税码
@@ -452,8 +532,57 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
});
erpOrderUpdateReqVO.setItexs(itexs);
}
private String generateOrderNumber(String materialType) {
return sequenceApi.getNextSequence("PURCHASE_ORDER_NUMBER", null, null).getData();
}
@Override
public boolean orderPassReject(PurchaseorderReqVO purchaseorderReqVO) {
PurchaseOrderDO purchaseOrderDO = purchaseOrderMapper.selectById(purchaseorderReqVO.getId());
if (ObjectUtils.isEmpty(purchaseOrderDO)) {
throw exception(PURCHASE_ORDER_NOT_EXISTS);
}
AdminUserRespDTO adminUserRespDTO = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUserId()).getData();
// 获取当前流程正在审批的任务节点
List<BpmTaskRespDTO> taskList = bpmTaskApi.getTaskListByProcessInstanceId(purchaseOrderDO.getProcessInstanceId()).getData();
BpmTaskRespDTO undoTask = taskList.get(taskList.size() - 1);
// 判断是否流程已经通过、驳回
BpmApprovalDetailReqDTO badrDto = new BpmApprovalDetailReqDTO();
badrDto.setProcessInstanceId(purchaseOrderDO.getProcessInstanceId()); // 流程实例id
badrDto.setTaskId(undoTask.getId()); // 当前审核任务节点id
BpmApprovalDetailRespDTO approvalDetail = bpmProcessInstanceApi.getApprovalDetail(SecurityFrameworkUtils.getLoginUserId(), badrDto).getData();
//如果审核通过
if (BpmProcessInstanceStatusEnum.APPROVE.getStatus().equals(approvalDetail.getStatus())) {
purchaseOrderDO.setStatus(PurchaseOrderStatusEnum.TO_SUBMIT_ERP.getCode());
} else if (BpmProcessInstanceStatusEnum.REJECT.getStatus().equals(approvalDetail.getStatus())) {
//如果审核不通过
purchaseOrderDO.setStatus(PurchaseOrderStatusEnum.DRAFT.getCode());
}
//设置审核意见
purchaseOrderDO.setReviewOpinion(purchaseorderReqVO.getReviewOpinion());
if (ObjectUtils.isNotEmpty(undoTask)) {
purchaseOrderDO.setTaskId(undoTask.getId());
}
purchaseOrderMapper.updateById(purchaseOrderDO); //更新状态
// 需要调用bpm 审核接口更新审批中的状态
if (DictEnum.BSE_CTRT_STS_WAIT_PUSH.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) {
if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) {
BpmTaskApproveReqDTO btarDto = new BpmTaskApproveReqDTO();
btarDto.setId(undoTask.getId());
btarDto.setReason(purchaseorderReqVO.getReviewOpinion());
bpmProcessInstanceApi.approveTask(btarDto);
}
} else if (DictEnum.BSE_CTRT_STS_REJECTED.getCode().equals(purchaseorderReqVO.getStatus()) && ObjectUtils.isNotEmpty(undoTask)) {
if (approvalDetail.getStatus().equals(BpmProcessInstanceStatusEnum.RUNNING.getStatus())) {
BpmTaskRejectReqDTO btrrDto = new BpmTaskRejectReqDTO();
btrrDto.setId(undoTask.getId());
btrrDto.setReason(purchaseorderReqVO.getReviewOpinion());
bpmProcessInstanceApi.rejectTask(btrrDto);
}
}
return false;
}
}

View File

@@ -2,5 +2,5 @@ package com.zt.plat.module.contractorder.util.constants;
public interface ProcessDefinitionKeyConstants {
String PURCHASE_ORDER_REVIEW_PROCESS = "purchase_order_review_process";
String PURCHASE_ORDER_REVIEW_PROCESS = "purchase_order_review";
}

View File

@@ -1,11 +1,15 @@
package com.zt.plat.module.erp.controller.admin.erp.vo;
import com.alibaba.fastjson2.JSONArray;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.util.List;
/**
* ERP采购订单保存请求VO
@@ -14,168 +18,221 @@ import java.time.LocalDateTime;
@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
@NotEmpty(message = "订单号不能为空")
private String orderNo;
@Schema(description = "备注(绿星链通填入系统采购订单头号)")
private String znote; // CHAR60
@Valid
@NotNull(message = "采购订单抬头信息不能为空")
private Head head;
@Schema(description = "代理方(使用客商编码)")
private String zlifnr; // CHAR60
@Valid
@NotNull(message = "采购订单抬头扩展信息不能为空")
private Exte exte;
@Valid
@NotEmpty(message = "采购订单行项目列表不能为空")
private List<Item> items;
@Schema(description = "行号")
@NotEmpty(message = "行号不能为空")
private Long poItem; // EBELP NUMC5
private JSONArray accts; // 科目分配信息(科目分配类别为K或P时使用)
@Valid
private List<Comp> comps; // 委托加工物料信息(委托加工订单时使用)
@Schema(description = "物料号")
private String material; // MATNR CHAR18
@Schema(description = "采购订单抬头信息")
@Data
public static class Head {
@Schema(description = "公司代码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "公司代码不能为空")
private String comp_code; // BUKRS CHAR4
@Schema(description = "工厂")
@NotEmpty(message = "工厂不能为空")
private String plant; // WERKS CHAR4
@Schema(description = "供应商帐号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "供应商帐号不能为空")
private String vendor; // LIFNR CHAR10
@Schema(description = "库存地点")
private String stgeLoc; // LGORT CHAR4
@Schema(description = "采购凭证类型", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "采购凭证类型不能为空")
private String doc_type; // BSART CHAR4
@Schema(description = "数量")
@NotEmpty(message = "数量不能为空")
private String quantity; // MENGE QUAN13,3
@Schema(description = "采购凭证日期(YYYY-MM-DD)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "采购凭证日期不能为空")
private LocalDate doc_date; // BEDAT DATS8
@Schema(description = "计量单位")
@NotNull(message = "计量单位不能为空")
private String poUnit; // MEINS UNIT3
@Schema(description = "采购组织", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "采购组织不能为空")
private String purch_org; // EKORG CHAR4
@Schema(description = "含税单价")
@NotNull(message = "含税单价不能为空")
private BigDecimal netPrice; // NETPR CURR11,2
@Schema(description = "采购组", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "采购组不能为空")
private String pur_group; // EKGRP CHAR3
@Schema(description = "价格单位默认值1表示以上单价对应的采购单位数量")
private Integer priceUnit; // PEINH DEC5
@Schema(description = "货币码", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "货币码不能为空")
private String currency; // WAERS CUKY5
@Schema(description = "税码")
private String taxCode; // MWSKZ CHAR2
@Schema(description = "汇率(保留5位小数)")
private BigDecimal exch_rate; // WKURS DEC9,5
}
@Schema(description = "基于GR的发票校验")
private String grBasedIv; // WEBRE CHAR1
@Schema(description = "采购订单抬头扩展信息")
@Data
public static class Exte {
@Schema(description = "纸质合同号(已启用财务共享单位必填)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "纸质合同号不能为空")
private String zzhth; // CHAR60
@Schema(description = "允许无限制过量交货")
private String unlimitedDlv; // UEBTK CHAR1
@Schema(description = "小协议号(绿星链通填入合同名称)")
private String zxxyh; // CHAR60
@Schema(description = "批次")
private String batch; // CHARG CHAR10
@Schema(description = "备注(绿星链通填入系统采购订单头号)")
private String znote; // CHAR60
@Schema(description = "项目类别委托加工订单时填入L")
private String itemCat; // PSTYP CHAR1原表CAHR为笔误按CHAR处理
@Schema(description = "代理方(使用客商编码)")
private String zlifnr; // CHAR60
}
@Schema(description = "科目分配类别(固定资产采购:A服务采购S-销售服务费、K-成本中心、F-订单)")
private String acctassCat; // KNTTP CHAR1
@Schema(description = "采购订单行项目信息")
@Data
public static class Item {
@Schema(description = "行号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "行号不能为空")
private Integer po_item; // EBELP NUMC5
@Schema(description = "物料组(服务采购订单必填)")
private String matlGroup; // MATKL CHAR9
@Schema(description = "物料")
private String material; // MATNR CHAR18
@Schema(description = "短文本(服务采购订单必填,绿星链通系统必须填入)")
private String shortText; // TXZ01 CHAR40
@Schema(description = "工厂", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "工厂不能为空")
private String plant; // WERKS CHAR4
@Schema(description = "退货项目标识退货行项目填X")
private String retItem; // RETPO CHAR1
@Schema(description = "库存地点")
private String stge_loc; // LGORT CHAR4
@Schema(description = "免费项目标识免费行项目填X")
private String freeItem; // UMSON CHAR1
@Schema(description = "数量(保留3位小数)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "数量不能为空")
private BigDecimal quantity; // MENGE QUAN13,3
@Schema(description = "外部行项目号(绿星链通必填)")
private String vendrBatch; // LICHN CHAR15
@Schema(description = "计量单位", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "计量单位不能为空")
private String po_unit; // MEINS UNIT3
@Schema(description = "备注信息-需求单位")
private String noteXq; // TDLINE CHAR132
@Schema(description = "含税单价(保留2位小数)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "含税单价不能为空")
private BigDecimal net_price; // NETPR CURR11,2
@Schema(description = "备注信息-物料详细")
private String noteWl; // TDLINE CHAR132
@Schema(description = "价格单位(默认值1)")
private Integer price_unit = 1; // PEINH DEC5
@Schema(description = "交货起止日期格式YYYYMMDD-YYYYMMDD")
private String vendMat; // IDNLF CHAR22原表说明为交货起止日期按说明定义
@Schema(description = "税码")
private String tax_code; // MWSKZ CHAR2
@Schema(description = "销售物料号科目分配类别为S时必填")
private String zmatnr;
@Schema(description = "基于GR的发票校验(Y/N)")
private String gr_basediv; // WEBRE CHAR1原字段名gr_basediv保持与源数据一致
@Schema(description = "统计型内部订单")
private String zaufnr;
@Schema(description = "允许无限制过量交货(Y/N)")
private String unlimited_dlv; // UEBTK CHAR1
@Schema(description = "采购类别0-生产性物资类1-项目投资类)")
private String zpurty;
@Schema(description = "批次")
private String batch; // CHARG CHAR10
@Schema(description = "原料湿重")
private BigDecimal zmenge;
@Schema(description = "项目类别(委托加工填L)")
private String item_cat; // PSTYP CHAR1
@Schema(description = "科目分配类别(A-固定资产/S-服务/K-成本中心/F-订单)")
private String acctasscat; // KNTTP CHAR1
@Schema(description = "科目分配的序号从1开始编号")
@NotEmpty(message = "科目分配的序号不能为空")
private String serialNo; // DZEKKN NUMC2
@Schema(description = "物料组(服务采购必填)")
private String matl_group; // MATKL CHAR9
@Schema(description = "总账科目编号")
private String glAccount; // SAKNR CHAR10
@Schema(description = "短文本(服务采购必填)")
private String short_text; // TXZ01 CHAR40
@Schema(description = "成本中心科目分配类别为F时必填")
private String costcenter; // KOSTL CHAR10
@Schema(description = "退货项目标识(X-是)")
private String ret_item; // RETPO CHAR1
@Schema(description = "订单号科目分配类别为F时必填")
private String orderid; // AUFNR CHAR12
@Schema(description = "免费项目标识(X-是)")
private String free_item; // UMSON CHAR1
@Schema(description = "主资产号科目分配类别为A时必填")
private String assetNo; // ANLN1 CHAR12
@Schema(description = "外部行项目号(绿星链通必填)")
private String vendrbatch; // LICHN CHAR15
@Schema(description = "资产子编号科目分配类别为A时必填固定值0")
private String subNumber; // ANLN2 CHAR4
@Schema(description = "备注信息-需求单位")
private String note_xq; // TDLINE CHAR132
@Schema(description = "备注信息-物料详细")
private String note_wl; // TDLINE CHAR132
@Schema(description = "计划行号从1开始编号")
private String schedLine; // ETENR NUMC4
@Schema(description = "交货起止日期(格式:YYYYMMDD-YYYYMMDD)")
private String vend_mat; // IDNLF CHAR22
@Schema(description = "项目编号从1开始编号")
private String itemNo; // RSPOS NUMC4
@Valid
private Itex itex; // 行项目扩展信息
@Schema(description = "委托加工需求数量")
@NotNull(message = "委托加工需求数量不能为空")
private BigDecimal entryQuantity; // MENGE QUAN13,3
}
@Schema(description = "组件计量单位(为空时使用基本计量单位)")
private String entryUom; // MEINS UNIT3
@Schema(description = "行项目扩展信息")
@Data
public static class Itex {
@Schema(description = "销售物料号(科目分配类别为S时必填)")
private String zmatnr;
@Schema(description = " 科目分配详情")
private String actsCtgrDtl;
@Schema(description = "统计型内部订单")
private String zaufnr;
@Schema(description = "采购类别(0-生产性物资类/1-项目投资类)")
private String zpurty;
@Schema(description = "原料湿重")
private BigDecimal zmenge;
}
// @Schema(description = "行项目科目分配信息")
// @Data
// public static class Acct {
// @Schema(description = "科目分配序号(从1开始)", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotNull(message = "科目分配序号不能为空")
// private Integer serial_no; // DZEKKN NUMC2
//
// @Schema(description = "总账科目编号")
// private String gl_account; // SAKNR CHAR10
//
// @Schema(description = "成本中心(科目分配类别为F时必填)")
// private String costcenter; // KOSTL CHAR10源数据为costcenter保持一致
//
// @Schema(description = "订单号(科目分配类别为F时必填)")
// private String orderid; // AUFNR CHAR12源数据为orderid保持一致
//
// @Schema(description = "主资产号(科目分配类别为A时必填)")
// private String asset_no; // ANLN1 CHAR12
//
// @Schema(description = "资产子编号(科目分配类别为A时必填固定值'0')")
// private String sub_number; // ANLN2 CHAR4
// }
@Schema(description = "委托加工物料信息")
@Data
public static class Comp {
@Schema(description = "计划行号(从1开始)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "计划行号不能为空")
private Integer sched_line; // ETENR NUMC4
@Schema(description = "项目编号(从1开始)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "项目编号不能为空")
private Integer item_no; // RSPOS NUMC4
@Schema(description = "加工前物料号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "加工前物料号不能为空")
private String material; // MATNR CHAR18
@Schema(description = "委托加工发货工厂", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "委托加工发货工厂不能为空")
private String plant; // PLANT CHAR4
@Schema(description = "委托加工需求数量(保留3位小数)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "委托加工需求数量不能为空")
private BigDecimal entry_quantity; // MENGE QUAN13,3
@Schema(description = "组件计量单位(为空使用基本计量单位)")
private String entry_uom; // MEINS UNIT3
}
}

View File

@@ -26,25 +26,12 @@ public class ErpOrderServiceImpl implements ErpOrderService {
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);
req.put("head", createVo.getHead());
req.put("item", createVo.getItems());
req.put("comp", createVo.getComps());
req.put("exte", createVo.getExte());
req.put("acct", createVo.getAccts());
reqDTO.setReq(req);
return submitToErp(reqDTO);
@@ -53,7 +40,7 @@ public class ErpOrderServiceImpl implements ErpOrderService {
private ErpSubmitReqDTO buildBaseReqDTO(ErpOrderSaveReqVO vo, String funcnr) {
ErpSubmitReqDTO reqDTO = new ErpSubmitReqDTO();
reqDTO.setFuncnr(funcnr);
reqDTO.setBskey(vo.getOrderid());
reqDTO.setBskey(vo.getOrderNo());
reqDTO.setUsrid(String.valueOf(SecurityFrameworkUtils.getLoginUserId()));
reqDTO.setUsrnm((SecurityFrameworkUtils.getLoginUserNickname()));
return reqDTO;
@@ -66,35 +53,35 @@ public class ErpOrderServiceImpl implements ErpOrderService {
}
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);
// 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);
}
@Override