添加采购订单同步ERP接口

(cherry picked from commit d20be534c2)
This commit is contained in:
彭枝刚 2024-11-17 16:40:01 +08:00
parent c2a58aac64
commit 04d44bb961
3 changed files with 283 additions and 1 deletions

View File

@ -17,7 +17,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableMomResourceServer
@SpringBootApplication(scanBasePackages = {"com.foreverwin.nlv", "com.foreverwin.mom", "com.foreverwin.iep"})
// 需配置不然扫不到mes-db的mapper
@MapperScan({"com.foreverwin.iep.**.mapper"})
@MapperScan({"com.foreverwin.iep.**.mapper","com.foreverwin.nlv.**.mapper"})
@EnableAsync
public class Application {

View File

@ -134,6 +134,12 @@
<artifactId>wms-api</artifactId>
</dependency>
<dependency>
<groupId>com.foreverwin</groupId>
<artifactId>wms-db</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>qms-api</artifactId>

View File

@ -0,0 +1,276 @@
package com.foreverwin.iep.integration.handler.def.sap;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.foreverwin.iep.common.faas.common.util.StringUtils;
import com.foreverwin.iep.integration.constant.Msg;
import com.foreverwin.iep.integration.domain.InvokeRequest;
import com.foreverwin.iep.integration.domain.InvokeResponse;
import com.foreverwin.iep.integration.entity.IntInData;
import com.foreverwin.iep.integration.entity.IntInDataLog;
import com.foreverwin.iep.integration.service.HandlerService;
import com.foreverwin.iep.integration.service.IntInDataLogService;
import com.foreverwin.iep.integration.service.IntInDataService;
import com.foreverwin.iep.integration.utils.JS;
import com.foreverwin.iep.integration.utils.Local;
import com.foreverwin.iep.prd.domain.GenerateNextNumberRequest;
import com.foreverwin.iep.prd.domain.GenerateNextNumberResponse;
import com.foreverwin.iep.prd.feign.RemoteNextNumberService;
import com.foreverwin.mom.common.core.constant.SecurityConstants;
import com.foreverwin.mom.common.data.tenant.TenantContextHolder;
import com.foreverwin.mom.common.security.util.SecurityUtils;
import com.foreverwin.nlv.wms.entity.ZwDocument;
import com.foreverwin.nlv.wms.entity.ZwDocumentDetail;
import com.foreverwin.nlv.wms.entity.ZwPoOrder;
import com.foreverwin.nlv.wms.entity.ZwPoOrderDetail;
import com.foreverwin.nlv.wms.mapper.ZwDocumentDetailMapper;
import com.foreverwin.nlv.wms.mapper.ZwDocumentMapper;
import com.foreverwin.nlv.wms.mapper.ZwPoOrderDetailMapper;
import com.foreverwin.nlv.wms.mapper.ZwPoOrderMapper;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* 采购订单同步到MES
*/
@AllArgsConstructor
@Service("ZMM_MES_FSMM003")
public class Fsmm003Service implements HandlerService {
private final ZwPoOrderMapper zwPoOrderMapper;
private final ZwPoOrderDetailMapper zwPoOrderDetailMapper;
private final ZwDocumentMapper zwDocumentMapper;
private final ZwDocumentDetailMapper zwDocumentDetailMapper;
private final IntInDataService intInDataService;
private final IntInDataLogService intInDataLogService;
private final RemoteNextNumberService remoteNextNumberService;
@Override
@GlobalTransactional
public InvokeResponse call(InvokeRequest invokeRequest) {
String reqId = invokeRequest.getTransSid();
JSONObject jsonObject = JS.parseObject(invokeRequest.getMessageContent());
JSONObject messageObj = jsonObject.getJSONObject("messageContent");
JSONObject result = dealPoDataLogic(messageObj);
InvokeResponse response = new InvokeResponse(invokeRequest);
response.setTransTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
if ("S".equals(result.getString("MSGTY"))) {
response.setResult("S");
response.setMessageContent(Msg.SUCCESS);
} else {
response.setResult("E");
response.setMessageContent(result.getString("MSGTX"));
}
response.setTransSid(reqId);
return response;
}
private JSONObject dealPoDataLogic(JSONObject messageObj){
JSONObject result = new JSONObject();
String msgty = "S";
String msgtx = "OK";
String msgid = "";
String msgno = "";
String rvar1 = "";
String rvar2 = "";
String rvar3 = "";
String rvar4 = "";
String EBELN = messageObj.getString("EBELN"); // 采购凭证编号
String BUKRS = messageObj.getString("BUKRS"); // 公司代码
String BSART = messageObj.getString("BSART"); // 采购凭证类型
String EKGRP = messageObj.getString("EKGRP"); // 采购组
String BEDAT = messageObj.getString("BEDAT"); // 采购凭证日期
String LIFNR = messageObj.getString("LIFNR"); // 供应商科目编号
String RESWK = messageObj.getString("RESWK"); // 发出工厂
String UNSEZ = messageObj.getString("UNSEZ"); // 我方参考
String site = "";
ZwPoOrder zwPoOrder = new ZwPoOrder();
zwPoOrder.setPo(EBELN);
zwPoOrder.setBusinessType(BSART);
zwPoOrder.setPurchaser(EKGRP);
zwPoOrder.setProcurementDate(Local.toLocalDateTime(BEDAT));
zwPoOrder.setCustomerNo(LIFNR);
zwPoOrder.setNote(UNSEZ);
JSONArray linInfoArray = messageObj.getJSONArray("LINE_INFO");
if(linInfoArray==null && linInfoArray.size()<1){
msgty = "E";
msgtx = "行数据不能为空";
}else if(!("Z001".equals(BSART) || "ZT01".equals(BSART))){
msgty = "E";
msgtx = BSART+ "单据类型无法解析";
} else{
site = linInfoArray.getJSONObject(0).getString("WERKS");
ZwPoOrder srcPoOrder = zwPoOrderMapper.selectById(zwPoOrder.getHandle());
if(srcPoOrder==null){
zwPoOrder.setCreateDate(LocalDateTime.now());
zwPoOrder.setCreateUser(SecurityUtils.getUserName());
zwPoOrderMapper.insert(zwPoOrder);
}else{
zwPoOrder.setUpdateDate(LocalDateTime.now());
zwPoOrder.setUpdateUser(SecurityUtils.getUserName());
zwPoOrderMapper.updateById(zwPoOrder);
}
boolean allDelete = true;
List<ZwPoOrderDetail> detailList = new ArrayList<>();
for (int i = 0; i < linInfoArray.size(); i++) {
JSONObject linInfoObj = linInfoArray.getJSONObject(i);
zwPoOrder.setHandle(ZwPoOrder.genHandle(site,EBELN));
ZwPoOrderDetail zwPoOrderDetail = new ZwPoOrderDetail();
zwPoOrderDetail.setBseg(linInfoObj.getInteger("EBELP"));
zwPoOrderDetail.setMatnr(linInfoObj.getString("MATNR"));
zwPoOrderDetail.setNote(linInfoObj.getString("TXZ01"));
zwPoOrderDetail.setStoragLocation(linInfoObj.getString("LGORT"));
zwPoOrderDetail.setQty(linInfoObj.getBigDecimal("MENGE"));
zwPoOrderDetail.setUnit(linInfoObj.getString("MEINS"));
zwPoOrderDetail.setUebto(linInfoObj.getString("UEBTO"));
zwPoOrderDetail.setUntto(linInfoObj.getString("UNTTO"));
if(StringUtils.isNotEmpty(linInfoObj.getString("EINDT"))){
zwPoOrderDetail.setEindt(Local.toLocalDateTime(linInfoObj.getString("EINDT")));
}
zwPoOrderDetail.setKnttp(linInfoObj.getString("KNTTP"));
zwPoOrderDetail.setVbeln(linInfoObj.getString("VBELN"));
zwPoOrderDetail.setVbelp(linInfoObj.getInteger("VBELP"));
zwPoOrderDetail.setPoOrderBo(zwPoOrder.getHandle());
zwPoOrderDetail.setState("X".equals(linInfoObj.getString("LOEKZ"))?"D":"A");
if("A".equals(zwPoOrderDetail.getState())){
allDelete = false;
}
zwPoOrderDetail.setHandle(ZwPoOrderDetail.genHandle(zwPoOrderDetail.getPoOrderBo(),zwPoOrderDetail.getMatnr(),zwPoOrderDetail.getBseg().toString()));
ZwPoOrderDetail srcDetailObj = zwPoOrderDetailMapper.selectById(zwPoOrderDetail.getHandle());
if(srcDetailObj == null){
zwPoOrderDetail.setCreateDate(LocalDateTime.now());
zwPoOrderDetail.setCreateUser(SecurityUtils.getUserName());
zwPoOrderDetailMapper.insert(zwPoOrderDetail);
}else{
zwPoOrderDetail.setUpdateDate(LocalDateTime.now());
zwPoOrderDetail.setUpdateUser(SecurityUtils.getUserName());
zwPoOrderDetailMapper.updateById(zwPoOrderDetail);
}
detailList.add(zwPoOrderDetail);
}
// 如果单据类型为ZT01,还需写入单据表
if("ZT01".equals(BSART)){
ZwDocument zwDocument = new ZwDocument();
zwDocument.setSite(site);
String documentBo = "";
zwDocument.setDocumentType("PURCHASE_RETURN");
zwDocument.setExternalDocumentNo(zwPoOrder.getPo());
QueryWrapper<ZwDocument> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(ZwDocument::getExternalDocumentNo, zwDocument.getExternalDocumentNo());
List<ZwDocument> documentList = zwDocumentMapper.selectList(queryWrapper);
if(documentList==null || documentList.size()<1){
// 全部新增
//根据编号规则生成箱号
GenerateNextNumberRequest generateNextNumberRequest = new GenerateNextNumberRequest();
generateNextNumberRequest.setSite(TenantContextHolder.getTenantId());
generateNextNumberRequest.setNextNumberType("ZW_DOCUMENT_NO");
generateNextNumberRequest.setNumberOfValues(1);
GenerateNextNumberResponse nextNumberResponse = remoteNextNumberService.generate(generateNextNumberRequest, SecurityConstants.FROM_IN).getData();
if (nextNumberResponse == null || nextNumberResponse.getIds() == null || nextNumberResponse.getIds().size() == 0) {
msgty = "E";
msgtx = BSART+ "创建单据号失败";
}
zwDocument.setDocumentNo(nextNumberResponse.getIds().get(0));
zwDocument.setState(allDelete?"CANCEL": "SUBMIT");
documentBo = ZwDocument.genHandle(zwDocument.getSite(),zwDocument.getDocumentNo());
zwDocument.setHandle(documentBo);
zwDocument.setCreateDate(LocalDateTime.now());
zwDocument.setCreateUser(SecurityUtils.getUserName());
zwDocumentMapper.insert(zwDocument);
}else{
// 更新
ZwDocument srcDocument = documentList.get(0);
srcDocument.setState(allDelete?"CANCEL": "SUBMIT");
srcDocument.setUpdateDate(LocalDateTime.now());
srcDocument.setUpdateUser(SecurityUtils.getUserName());
documentBo = srcDocument.getHandle();
zwDocumentMapper.updateById(srcDocument);
}
// 处理明细
for (ZwPoOrderDetail zwPoOrderDetail:detailList){
ZwDocumentDetail zwDocumentDetail = new ZwDocumentDetail();
zwDocumentDetail.setHandle(ZwDocumentDetail.genHandle(documentBo,zwPoOrderDetail.getMatnr(),zwPoOrderDetail.getBseg()));
ZwDocumentDetail srcDocumentDetail = zwDocumentDetailMapper.selectById(zwDocumentDetail.getHandle());
if(srcDocumentDetail==null){
// 新增
zwDocumentDetail.setDocumentBo(documentBo);
zwDocumentDetail.setItem(zwPoOrderDetail.getMatnr());
zwDocumentDetail.setSeq(zwPoOrderDetail.getBseg());
zwDocumentDetail.setUnitOfMeasure(zwPoOrderDetail.getUnit());
zwDocumentDetail.setApplicationsQuantity(zwPoOrderDetail.getQty());
zwDocumentDetail.setState(zwPoOrderDetail.getState());
zwDocumentDetail.setSalesOrder(zwPoOrderDetail.getVbeln());
zwDocumentDetail.setSalesOrderSeq(zwPoOrderDetail.getVbelp());
zwDocumentDetail.setCreateDate(LocalDateTime.now());
zwDocumentDetail.setCreateUser(SecurityUtils.getUserName());
zwDocumentDetailMapper.insert(zwDocumentDetail);
}else{
// 修改
srcDocumentDetail.setApplicationsQuantity(zwPoOrderDetail.getQty());
srcDocumentDetail.setState(zwPoOrderDetail.getState());
srcDocumentDetail.setUnitOfMeasure(zwPoOrderDetail.getUnit());
srcDocumentDetail.setSalesOrder(zwPoOrderDetail.getVbeln());
srcDocumentDetail.setSalesOrderSeq(zwPoOrderDetail.getVbelp());
srcDocumentDetail.setUpdateDate(LocalDateTime.now());
srcDocumentDetail.setUpdateUser(SecurityUtils.getUserName());
zwDocumentDetailMapper.updateById(srcDocumentDetail);
}
}
}
}
result.put("MSGTY",msgty);
result.put("MSGTX",msgtx);
result.put("MSGID",msgid);
result.put("MSGNO",msgno);
result.put("RVAR1",rvar1);
result.put("RVAR2",rvar2);
result.put("RVAR3",rvar3);
result.put("RVAR4",rvar4);
return result;
}
@Override
public String validation(InvokeRequest invokeRequest) {
return null;
}
private void saveLogData(InvokeRequest invokeRequest,InvokeResponse invokeResponse){
if(StringUtils.isNotEmpty(invokeRequest.getTransSid())){
// 存储日志
IntInData intInData = new IntInData();
intInData.setSid(invokeRequest.getTransSid());
intInData.setRequest(invokeRequest.getMessageContent());
intInData.setFunctionName(invokeRequest.getMessageId());
intInData.setKeyValue(invokeRequest.getKeyValue());
intInData.setFromSystem(invokeRequest.getFromSystem());
intInData.setToSystem(invokeRequest.getToSystem());
intInData.setRetryCount(0);
intInData.setSite(invokeRequest.getSite());
intInData.setCreator(SecurityUtils.getUserName());
intInData.setDateCreate(LocalDateTime.now());
intInDataService.save(intInData);
IntInDataLog log = new IntInDataLog();
log.setSid(UUID.randomUUID().toString());
log.setIntInDataSid(intInData.getSid());
log.setCreator(SecurityUtils.getUserName());
log.setDateCreate(LocalDateTime.now());
log.setSeq(0);
log.setMessage(StringUtils.isEmpty(invokeResponse.getMessageContent())?"N/A":invokeResponse.getMessageContent());
log.setResponse(invokeResponse.getObjectResponse().toJSONString());
log.setState(invokeResponse.getResult());
intInDataLogService.save(log);
}
}
}