add:生产领料回传ERP;

opt:ErpUtil;
opt:采购入库单回传逻辑;
This commit is contained in:
zhaoyf
2026-06-25 19:22:50 +08:00
parent 45bd2293f2
commit cce732bc09
13 changed files with 598 additions and 200 deletions

View File

@@ -228,28 +228,22 @@
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1.2</version>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- 2. Commons Discovery(缺少这个导致报错) -->
<!-- 2. Commons Discovery -->
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.5</version>
<version>0.2</version>
</dependency>
<!-- 3. Commons HttpClient调用远程服务必需 -->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- WSDL4J - Axis 解析 WSDL 必需 -->
<dependency>
<groupId>wsdl4j</groupId>

View File

@@ -17,7 +17,7 @@
</resultMap>
<select id="selectByBillId" resultType="org.nl.wms.pm_manage.purchase.service.dao.Purchasemst" resultMap="BaseResultMap">
SELECT
SELECT DISTINCT
billid,
orderNo,
orderType,
@@ -30,7 +30,6 @@
red
FROM v_uc_cgrk06
WHERE billid = #{bill_id}
GROUP BY billid
</select>
</mapper>

View File

@@ -1,9 +1,12 @@
package org.nl.wms.ext_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.wms.ext_manage.service.MesToWmsService;
import org.nl.wms.ext_manage.service.dto.MesTaskParams;
@@ -14,6 +17,12 @@ import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService;
import org.nl.wms.warehouse_manage.stockReturn.service.dao.PmStockReturn;
import org.nl.wms.warehouse_manage.stockReturn.service.enums.StockReturnStatusEnum;
import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderBomDao;
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -28,6 +37,10 @@ public class MesToWmsServiceImpl implements MesToWmsService {
private IMdPbGroupplateService iMdPbGroupplateService;
@Autowired
private ISchBasePointService iSchBasePointService;
@Autowired
private IWorkOrderService iWorkOrderService;
@Autowired
private IPmStockReturnService iPmStockReturnService;
@Transactional
@Override
@@ -85,6 +98,45 @@ public class MesToWmsServiceImpl implements MesToWmsService {
taskFormCall.put("create_name", "MES");
LineCallFullTask lineCallFullTask = SpringContextHolder.getBean("LineCallFullTask");
lineCallFullTask.create(taskFormCall);
//调用eas领料出库单
//获取工单信息
WorkOrderDao workOrder = iWorkOrderService.getWorkOrder(mesTaskParams.getOrderCode());
List<WorkOrderBomDao> orderBomItems = iWorkOrderService.getOrderBomItem(mesTaskParams.getOrderCode());
// 创建最外层的JSONObject
JSONObject root = new JSONObject();
root.put("method", "DealMaterailReqBill");
root.put("type", "MES");
// 创建data对象
JSONObject data = new JSONObject();
data.put("bizStatus", "02");
data.put("mesNo", IdUtil.getLongId());
// 创建entrys数组
JSONArray entrys = new JSONArray();
// 创建第一个entry对象
JSONObject entry = new JSONObject();
for (WorkOrderBomDao orderBomItem : orderBomItems) {
entry.put("qty", groupList.get(0).getQty());
entry.put("sourceBillId", workOrder.getOrder_id());
entry.put("sourceBillEntryId", orderBomItem.getItem_id());
entry.put("sourceBillNo", workOrder.getOrder_code());
}
// 将entry添加到数组中
entrys.add(entry);
// 将entrys数组设置到data中
data.put("entrys", entrys);
// 将data设置到根对象中
root.put("data", data);
// ErpUtil.create().login().audit(root.toJSONString());
//保存回传单
PmStockReturn stockReturn = new PmStockReturn();
stockReturn.setRequest_Id(workOrder.getOrder_id());
stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("生产领料"));
stockReturn.setStatus(StockReturnStatusEnum.TODO.getCode()); // 0-处理中
stockReturn.setCreate_time(DateUtil.now());
stockReturn.setRequest_data(root.toJSONString());
iPmStockReturnService.save(stockReturn);
if (Objects.equals(mesTaskParams.getRequestedCode(), "2")) break;
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.ext_manage.util;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -14,7 +15,6 @@ import org.nl.config.SpringContextHolder;
import org.nl.wms.system_manage.enums.SysParamConstant;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.nl.wms.system_manage.service.param.impl.SysParamServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
@@ -24,27 +24,29 @@ import javax.xml.rpc.encoding.XMLType;
@Slf4j
@Data
public class ErpUtil {
private String loginUrl;
private String auditUrl;
private String busUrl;
private String userName;
private String password;
private String slnName;
private String dcName;
private String dbType;
private int dbType;
private final Service service = new Service();
private Call call;
private String sessionId;
public static ErpUtil create(){
ErpUtil erpUtil = new ErpUtil();
erpUtil.setLoginUrl(SpringContextHolder.getProperties("erp.loginUrl"));
erpUtil.setAuditUrl(SpringContextHolder.getProperties("erp.busUrl"));
erpUtil.setBusUrl(SpringContextHolder.getProperties("erp.busUrl"));
erpUtil.setUserName(SpringContextHolder.getProperties("erp.username"));
erpUtil.setPassword(SpringContextHolder.getProperties("erp.password"));
erpUtil.setSlnName(SpringContextHolder.getProperties("erp.slnName"));
erpUtil.setDcName(SpringContextHolder.getProperties("erp.dcName"));
erpUtil.setDbType(SpringContextHolder.getProperties("erp.dbType"));
erpUtil.setDbType(Integer.parseInt(SpringContextHolder.getProperties("erp.dbType")));
return erpUtil;
}
/**
@@ -53,56 +55,25 @@ public class ErpUtil {
*/
public ErpUtil login(){
try {
Call call = (Call) service.createCall();
call = (Call)service.createCall();
call.setOperationName("login");
//登录的webservice的wsdl的地址
call.setTargetEndpointAddress(loginUrl);
call.setMaintainSession(true);
call.setTimeout(60*1000);
QName wsContextQName = new QName("urn:client", "WSContext");
call.registerTypeMapping(
WSContext.class,
wsContextQName,
BeanSerializerFactory.class,
BeanDeserializerFactory.class
);
call.setReturnType(wsContextQName);
call.setReturnType(new QName("urn:client", "WSContext"));
//本地根据wsdl文件建立的返回对象
call.setReturnClass(WSContext.class);
call.addParameter(
new QName("", "userName"), // 空命名空间
XMLType.XSD_STRING,
String.class,
ParameterMode.IN
);
call.addParameter(
new QName("", "password"), // 空命名空间
XMLType.XSD_STRING,
String.class,
ParameterMode.IN
);
call.addParameter(
new QName("", "slnName"), // 空命名空间
XMLType.XSD_STRING,
String.class,
ParameterMode.IN
);
call.addParameter(
new QName("", "dcName"), // 空命名空间
XMLType.XSD_STRING,
String.class,
ParameterMode.IN
);
call.addParameter(
new QName("", "dbType"), // 空命名空间
XMLType.XSD_STRING,
String.class,
ParameterMode.IN
);
WSContext response = (WSContext)call.invoke(new Object[]{userName, password, slnName, dcName, dbType});
if (StrUtil.isEmptyIfStr(response.getSessionId())){
throw new BadRequestException("erp登录接口请求失败: 返回sessionId为空请检查账户设置是否正确");
}
this.sessionId = response.getSessionId();
log.info("ERP登录接口返回{}", response);
call.setReturnQName(new QName("", "loginReturn"));
//超时时间 自由配置
call.setTimeout(1000 * 15);
call.setMaintainSession(true);
WSContext result = null;
//解决方案eas
//语言L2 简体中文 L3 繁体中文
//数据库类型0 SQL Server 1 Oracle 2 DB2
result = (WSContext) call.invoke(new Object[]{userName, password, slnName, dcName, "L2", dbType, "BaseDB"});
//关键点获取登录时返回的sessionid
sessionId = result.getSessionId();
log.info("ERP登录接口返回{}", result.toString());
} catch (Exception e) {
throw new BadRequestException("erp登录接口请求失败:" + e.getMessage());
}
@@ -113,15 +84,20 @@ public class ErpUtil {
*/
public void audit(String json){
try {
Call call = (Call) service.createCall();
call.clearOperation();
call.setOperationName("dealTask");
call.setTimeout(1000*60);
call.setMaintainSession(true);
call.setTargetEndpointAddress(auditUrl);
call.setReturnQName(new QName("", "erpsyncReturn"));
call.setTargetEndpointAddress(busUrl);
call.setReturnQName(new QName("", "dealTaskReturn"));
call.addHeader(new SOAPHeaderElement("http://login.webservice.bos.kingdee.com", "SessionId", sessionId));
Object result = call.invoke(new Object[]{json});
System.out.println(result);
JSONObject resultJson = JSON.parseObject(result.toString());
if (resultJson.getInteger("result") == 0){
throw new BadRequestException("回传失败:" + resultJson.getString("msg"));
}
log.error("Eas回传接口请求成功");
log.error("Eas回传接口invoke调用结果" + result.toString());
} catch (Exception e) {
throw new BadRequestException("erp审核接口请求失败:" + e.getMessage());
}

View File

@@ -1,13 +1,295 @@
/**
* WSContext.java
*
* This file was auto-generated from WSDL
* by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
*/
package org.nl.wms.ext_manage.util;
import lombok.Data;
public class WSContext implements java.io.Serializable {
private int dbType;
@Data
public class WSContext {
private Integer dbType;
private String dcName;
private String password;
private String sessionId;
private String slnName;
private String userName;
public WSContext() {
}
public WSContext(
int dbType,
String dcName,
String password,
String sessionId,
String slnName,
String userName) {
this.dbType = dbType;
this.dcName = dcName;
this.password = password;
this.sessionId = sessionId;
this.slnName = slnName;
this.userName = userName;
}
/**
* Gets the dbType value for this WSContext.
*
* @return dbType
*/
public int getDbType() {
return dbType;
}
/**
* Sets the dbType value for this WSContext.
*
* @param dbType
*/
public void setDbType(int dbType) {
this.dbType = dbType;
}
/**
* Gets the dcName value for this WSContext.
*
* @return dcName
*/
public String getDcName() {
return dcName;
}
/**
* Sets the dcName value for this WSContext.
*
* @param dcName
*/
public void setDcName(String dcName) {
this.dcName = dcName;
}
/**
* Gets the password value for this WSContext.
*
* @return password
*/
public String getPassword() {
return password;
}
/**
* Sets the password value for this WSContext.
*
* @param password
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Gets the sessionId value for this WSContext.
*
* @return sessionId
*/
public String getSessionId() {
return sessionId;
}
/**
* Sets the sessionId value for this WSContext.
*
* @param sessionId
*/
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
/**
* Gets the slnName value for this WSContext.
*
* @return slnName
*/
public String getSlnName() {
return slnName;
}
/**
* Sets the slnName value for this WSContext.
*
* @param slnName
*/
public void setSlnName(String slnName) {
this.slnName = slnName;
}
/**
* Gets the userName value for this WSContext.
*
* @return userName
*/
public String getUserName() {
return userName;
}
/**
* Sets the userName value for this WSContext.
*
* @param userName
*/
public void setUserName(String userName) {
this.userName = userName;
}
private Object __equalsCalc = null;
public synchronized boolean equals(Object obj) {
if (!(obj instanceof WSContext)) return false;
WSContext other = (WSContext) obj;
if (obj == null) return false;
if (this == obj) return true;
if (__equalsCalc != null) {
return (__equalsCalc == obj);
}
__equalsCalc = obj;
boolean _equals;
_equals = true &&
this.dbType == other.getDbType() &&
((this.dcName==null && other.getDcName()==null) ||
(this.dcName!=null &&
this.dcName.equals(other.getDcName()))) &&
((this.password==null && other.getPassword()==null) ||
(this.password!=null &&
this.password.equals(other.getPassword()))) &&
((this.sessionId==null && other.getSessionId()==null) ||
(this.sessionId!=null &&
this.sessionId.equals(other.getSessionId()))) &&
((this.slnName==null && other.getSlnName()==null) ||
(this.slnName!=null &&
this.slnName.equals(other.getSlnName()))) &&
((this.userName==null && other.getUserName()==null) ||
(this.userName!=null &&
this.userName.equals(other.getUserName())));
__equalsCalc = null;
return _equals;
}
private boolean __hashCodeCalc = false;
public synchronized int hashCode() {
if (__hashCodeCalc) {
return 0;
}
__hashCodeCalc = true;
int _hashCode = 1;
_hashCode += getDbType();
if (getDcName() != null) {
_hashCode += getDcName().hashCode();
}
if (getPassword() != null) {
_hashCode += getPassword().hashCode();
}
if (getSessionId() != null) {
_hashCode += getSessionId().hashCode();
}
if (getSlnName() != null) {
_hashCode += getSlnName().hashCode();
}
if (getUserName() != null) {
_hashCode += getUserName().hashCode();
}
__hashCodeCalc = false;
return _hashCode;
}
// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
new org.apache.axis.description.TypeDesc(WSContext.class, true);
static {
typeDesc.setXmlType(new javax.xml.namespace.QName("urn:client", "WSContext"));
org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("dbType");
elemField.setXmlName(new javax.xml.namespace.QName("", "dbType"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
elemField.setNillable(false);
typeDesc.addFieldDesc(elemField);
elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("dcName");
elemField.setXmlName(new javax.xml.namespace.QName("", "dcName"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(true);
typeDesc.addFieldDesc(elemField);
elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("password");
elemField.setXmlName(new javax.xml.namespace.QName("", "password"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(true);
typeDesc.addFieldDesc(elemField);
elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("sessionId");
elemField.setXmlName(new javax.xml.namespace.QName("", "sessionId"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(true);
typeDesc.addFieldDesc(elemField);
elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("slnName");
elemField.setXmlName(new javax.xml.namespace.QName("", "slnName"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(true);
typeDesc.addFieldDesc(elemField);
elemField = new org.apache.axis.description.ElementDesc();
elemField.setFieldName("userName");
elemField.setXmlName(new javax.xml.namespace.QName("", "userName"));
elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
elemField.setNillable(true);
typeDesc.addFieldDesc(elemField);
}
/**
* Return type metadata object
*/
public static org.apache.axis.description.TypeDesc getTypeDesc() {
return typeDesc;
}
/**
* Get Custom Serializer
*/
public static org.apache.axis.encoding.Serializer getSerializer(
String mechType,
Class _javaType,
javax.xml.namespace.QName _xmlType) {
return
new org.apache.axis.encoding.ser.BeanSerializer(
_javaType, _xmlType, typeDesc);
}
/**
* Get Custom Deserializer
*/
public static org.apache.axis.encoding.Deserializer getDeserializer(
String mechType,
Class _javaType,
javax.xml.namespace.QName _xmlType) {
return
new org.apache.axis.encoding.ser.BeanDeserializer(
_javaType, _xmlType, typeDesc);
}
}

View File

@@ -29,6 +29,7 @@ import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst;
import org.nl.wms.pda_manage.ios_manage.purchase.service.dto.PdaGroupPlateDto;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper;
@@ -241,7 +242,6 @@ public class InboundPdaServiceImpl implements InboundPdaService {
Structattr struct = structList.get(0);
log.info("平库入库:找到虚拟库位{}",JSON.toJSONString(struct));
String storagevehicleCode = struct.getStoragevehicle_code();//载具编码
List<PurchaseListenerParams.DetailItem> items = new ArrayList<>();
boolean flag = false;
for (UsualInboundDto.UsualInboundDtlDto item : usualInboundDto.getDetailList()) {
//判断当前物料是否在库内
@@ -290,10 +290,6 @@ public class InboundPdaServiceImpl implements InboundPdaService {
.create_time(DateUtil.now())
.build();
iMdPbGroupplateService.save(plateDao);
PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem();
detailItem.setItem_no(item.getItem_no());
detailItem.setQty(item.getQty());
items.add(detailItem);
}
if (flag) return;//已存在库存则不用走组盘入库
GroupPlateInboundDto groupPlateInboundDto = new GroupPlateInboundDto();
@@ -332,21 +328,25 @@ public class InboundPdaServiceImpl implements InboundPdaService {
// 组织明细数据
ArrayList<HashMap> tableData = new ArrayList<>();
HashMap<String, String> dtl = new HashMap<>();
GroupPlate plateDao = plateDaoList.get(0);
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code());
dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code());
dtl.put("material_id", materDao.getMaterial_id());
dtl.put("material_code", materDao.getMaterial_code());
dtl.put("material_name", materDao.getMaterial_name());
dtl.put("pcsn", plateDao.getPcsn());
dtl.put("qty_unit_id", plateDao.getQty_unit_id());
dtl.put("qty_unit_name", plateDao.getQty_unit_name());
dtl.put("qty", String.valueOf(total_qty));
dtl.put("plan_qty", String.valueOf(total_qty));
dtl.put("ext_code", plateDao.getExt_code());
dtl.put("ext_type", plateDao.getExt_type());
// 调用新增
tableData.add(dtl);
// GroupPlate plateDao = plateDaoList.get(0);
for (GroupPlate plateDao : plateDaoList) {
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code());
dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code());
dtl.put("material_id", materDao.getMaterial_id());
dtl.put("material_code", materDao.getMaterial_code());
dtl.put("material_name", materDao.getMaterial_name());
dtl.put("pcsn", plateDao.getPcsn());
dtl.put("qty_unit_id", plateDao.getQty_unit_id());
dtl.put("qty_unit_name", plateDao.getQty_unit_name());
dtl.put("qty", String.valueOf(total_qty));
dtl.put("plan_qty", String.valueOf(total_qty));
dtl.put("ext_code", plateDao.getExt_code());
dtl.put("ext_type", plateDao.getExt_type());
dtl.put("callback_strategy", "dealPurchaseRecBillCallback");
// 调用新增
tableData.add(dtl);
}
jsonMst.put("tableData",tableData);
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst);
// 查询仓库
@@ -382,19 +382,22 @@ public class InboundPdaServiceImpl implements InboundPdaService {
sendTask(whereJsonTask);
} else {
// 单据直接完成
JSONObject confirmJson = new JSONObject();
confirmJson.put("iostorinv_id", iostorinv_id);
iRawAssistIStorService.confirm(confirmJson);
// JSONObject confirmJson = new JSONObject();
// confirmJson.put("iostorinv_id", iostorinv_id);
// iRawAssistIStorService.confirm(confirmJson);
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, iostorinv_id));
iRawAssistIStorService.disFinish(ioStorInvDis);
}
PurchaseListenerParams listenerParams = new PurchaseListenerParams();
listenerParams.setBillId(plateDao.getExt_code());
PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem();
detailItem.setQty(plateDao.getQty());
detailItem.setMaterialCode(plateDao.getMaterial_code());
List<PurchaseListenerParams.DetailItem> detailItemList = new ArrayList<>();
detailItemList.add(detailItem);
listenerParams.setDetailItem(detailItemList);
pushEvent(listenerParams);
// PurchaseListenerParams listenerParams = new PurchaseListenerParams();
// listenerParams.setBillId(plateDao.getExt_code());
// PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem();
// detailItem.setQty(plateDao.getQty());
// detailItem.setMaterialCode(plateDao.getMaterial_code());
// List<PurchaseListenerParams.DetailItem> detailItemList = new ArrayList<>();
// detailItemList.add(detailItem);
// listenerParams.setDetailItem(detailItemList);
// pushEvent(listenerParams);
}
@@ -429,21 +432,25 @@ public class InboundPdaServiceImpl implements InboundPdaService {
// 组织明细数据
ArrayList<HashMap> tableData = new ArrayList<>();
HashMap<String, String> dtl = new HashMap<>();
GroupPlate plateDao = plateDaoList.get(0);
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code());
dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code());
dtl.put("material_id", materDao.getMaterial_id());
dtl.put("material_code", materDao.getMaterial_code());
dtl.put("material_name", materDao.getMaterial_name());
dtl.put("pcsn", plateDao.getPcsn());
dtl.put("qty_unit_id", plateDao.getQty_unit_id());
dtl.put("qty_unit_name", plateDao.getQty_unit_name());
dtl.put("qty", String.valueOf(total_qty));
dtl.put("plan_qty", String.valueOf(total_qty));
dtl.put("ext_code", plateDao.getExt_code());
dtl.put("ext_type", plateDao.getExt_type());
// 调用新增入库单
tableData.add(dtl);
// GroupPlate plateDao = plateDaoList.get(0);
for (GroupPlate plateDao : plateDaoList) {
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getByCode(plateDao.getMaterial_code());
dtl.put("storagevehicle_code", plateDao.getStoragevehicle_code());
dtl.put("material_id", materDao.getMaterial_id());
dtl.put("material_code", materDao.getMaterial_code());
dtl.put("material_name", materDao.getMaterial_name());
dtl.put("pcsn", plateDao.getPcsn());
dtl.put("qty_unit_id", plateDao.getQty_unit_id());
dtl.put("qty_unit_name", plateDao.getQty_unit_name());
dtl.put("qty", String.valueOf(total_qty));
dtl.put("plan_qty", String.valueOf(total_qty));
dtl.put("ext_code", plateDao.getExt_code());
dtl.put("ext_type", plateDao.getExt_type());
dtl.put("callback_strategy", "dealPurchaseRecBillCallback");
// 调用新增入库单
tableData.add(dtl);
}
jsonMst.put("tableData",tableData);
String iostorinv_id = iRawAssistIStorService.insertDtl(jsonMst);
// 查询仓库
@@ -478,19 +485,22 @@ public class InboundPdaServiceImpl implements InboundPdaService {
// 调用分配,分配库位
iRawAssistIStorService.divStruct(new JSONObject(jsonMst1));
// 手工入库单据直接完成
JSONObject confirmJson = new JSONObject();
confirmJson.put("iostorinv_id", iostorinv_id);
iRawAssistIStorService.confirm(confirmJson);
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, iostorinv_id));
iRawAssistIStorService.disFinish(ioStorInvDis);
// JSONObject confirmJson = new JSONObject();
// confirmJson.put("iostorinv_id", iostorinv_id);
// iRawAssistIStorService.confirm(confirmJson);
PurchaseListenerParams purchaseListenerParams = new PurchaseListenerParams();
purchaseListenerParams.setBillId(plateDao.getExt_code());
PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem();
detailItem.setMaterialCode(plateDao.getMaterial_code());
detailItem.setQty(plateDao.getQty());
List<PurchaseListenerParams.DetailItem> detailItemList = new ArrayList<>();
detailItemList.add(detailItem);
purchaseListenerParams.setDetailItem(detailItemList);
pushEvent(purchaseListenerParams);
// PurchaseListenerParams purchaseListenerParams = new PurchaseListenerParams();
// purchaseListenerParams.setBillId(plateDao.getExt_code());
// PurchaseListenerParams.DetailItem detailItem = new PurchaseListenerParams.DetailItem();
// detailItem.setMaterialCode(plateDao.getMaterial_code());
// detailItem.setQty(plateDao.getQty());
// List<PurchaseListenerParams.DetailItem> detailItemList = new ArrayList<>();
// detailItemList.add(detailItem);
// purchaseListenerParams.setDetailItem(detailItemList);
// pushEvent(purchaseListenerParams);
}
private Map<String,Object> parseCode(String code){

View File

@@ -25,7 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
/**
* @Author: Liuxy
* @Description: 产线返空托盘
* @Description: 产线叫满
* @Date: 2025/6/6
*/
@Component(value = "LineCallFullTask")

View File

@@ -21,14 +21,6 @@ public class SysParamConstant {
* ERP系统IP
*/
public final static String ERP_URL = "erp_url";
/**
* ERP登录接口
*/
public final static String ERP_LOGIN_URL = "erp_login_url";
/**
* ERP审核接口
*/
public final static String ERP_AUDIT_URL = "erp_audit_url";
/**
* 中鼎系统URL

View File

@@ -28,7 +28,7 @@ public enum IOSEnum {
BILL_STATUS(MapOf.of("生成","10", "分配中", "20", "分配完", "30", "完成", "99")),
// 入库业务类型
BILL_TYPE(MapOf.of("生产入库","0001", "采购入库", "0005", "手工入库", "0009","销售出库","1001","生产出库","1005","调拨出库","1004", "手工出库", "1009")),
BILL_TYPE(MapOf.of("生产入库","0001", "采购入库", "0005","生产领料", "0006", "手工入库", "0009","销售出库","1001","生产出库","1005","调拨出库","1004", "手工出库", "1009")),
//入库分配明细状态
INBILL_DIS_STATUS(MapOf.of("未生成", "00", "生成", "01", "执行中", "02", "完成", "99")),

View File

@@ -30,29 +30,26 @@ import org.nl.wms.basedata_manage.service.dto.StrategyMater;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.basedata_manage.service.dto.StructattrChangeDto;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.core.tasks.StInTask;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inventory.IStInventoryService;
import org.nl.wms.warehouse_manage.inventory.core.enums.InventoryChangeType;
import org.nl.wms.warehouse_manage.inventory.core.param.impl.AddInvParam;
import org.nl.wms.warehouse_manage.inventory.core.param.impl.InFinishParam;
import org.nl.wms.warehouse_manage.inventory.core.param.impl.OutFinishParam;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.impl.MdPbGroupplateServiceImpl;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInv;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_manage.service.dto.GroupPlateDto;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvMapper;
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDtlDto;
import org.nl.wms.warehouse_manage.inventory.IStInventoryService;
import org.nl.wms.warehouse_manage.inventory.core.enums.InventoryChangeType;
import org.nl.wms.warehouse_manage.inventory.core.param.impl.AddInvParam;
import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.nl.wms.warehouse_manage.service.dto.GroupPlateDto;
import org.nl.wms.warehouse_manage.service.impl.MdPbGroupplateServiceImpl;
import org.nl.wms.warehouse_manage.stockReturn.strategy.CallbackStrategyPublish;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -673,9 +670,21 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
if (CollectionUtils.isEmpty(ioStorInvDis)) {
throw new BadRequestException("未找到任务对应的分配明细");
}
String iostorinvId = ioStorInvDis.get(0).getIostorinv_id();
String storagevehicleCode = ioStorInvDis.get(0).getStoragevehicle_code();
String structCode = ioStorInvDis.get(0).getStruct_code();
//库存变动
StructattrChangeDto changeDto = StructattrChangeDto.builder()
.inv(ioStorInvDis.get(0).getIostorinv_id())
.storagevehicleCode(ioStorInvDis.get(0).getStoragevehicle_code())
.structCode(ioStorInvDis.get(0).getStruct_code()).taskType(task.getConfig_code()).inBound(true).build();
iStructattrService.changeStruct(changeDto);
disFinish(ioStorInvDis);
}
@Override
public void disFinish(List<IOStorInvDis> disList) {
String iostorinvId = disList.get(0).getIostorinv_id();
String storagevehicleCode = disList.get(0).getStoragevehicle_code();
String structCode = disList.get(0).getStruct_code();
//解锁库位
JSONObject finish_map = new JSONObject();
finish_map.put("struct_code", structCode);
@@ -684,50 +693,6 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
finish_map.put("inv_id", null);
finish_map.put("inv_code", null);
iStructattrService.updateStatusByCode("1", finish_map);
//库存变动
StructattrChangeDto changeDto = StructattrChangeDto.builder()
.inv(iostorinvId)
.storagevehicleCode(storagevehicleCode)
.structCode(structCode).taskType(task.getConfig_code()).inBound(true).build();
iStructattrService.changeStruct(changeDto);
// 完成当前分配明细
Map<String, BigDecimal> dtlMap = new HashMap<>();
for (IOStorInvDis item : ioStorInvDis) {
ioStorInvDisMapper.update(item, new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("完成"))
.set(IOStorInvDis::getReal_qty, item.getPlan_qty())
.eq(IOStorInvDis::getIostorinvdis_id, item.getIostorinvdis_id()));
dtlMap.put(item.getIostorinvdtl_id(), item.getPlan_qty());
}
//更新明细
for (String dtl_id : dtlMap.keySet()) {
IOStorInvDtl invDtl = new IOStorInvDtl();
invDtl.setIostorinvdtl_id(dtl_id);
invDtl.setReal_qty(dtlMap.get(dtl_id));
invDtl.setBill_status(IOSEnum.BILL_STATUS.code("完成"));
ioStorInvDtlMapper.updateById(invDtl);
}
// 查看明细是否全部完成
int countDtl = ioStorInvDtlMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDtl.class)
.eq(IOStorInvDtl::getIostorinv_id, iostorinvId)
.ne(IOStorInvDtl::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
);
// 如果明细全部完成则更新主表状态
if (countDtl == 0) {
//更新主表状态
ioStorInvMapper.update(new IOStorInv(), new LambdaUpdateWrapper<>(IOStorInv.class)
.set(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
.set(IOStorInv::getConfirm_optid, currentUserId)
.set(IOStorInv::getConfirm_optname, nickName)
.set(IOStorInv::getConfirm_time, now)
.eq(IOStorInv::getIostorinv_id, iostorinvId)
);
}
}
@Override
public void disFinish(List<IOStorInvDis> disList) {
// 完成当前任务对应的所有分配明细
ioStorInvDisMapper.update(null,new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成"))

View File

@@ -0,0 +1,114 @@
package org.nl.wms.warehouse_manage.stockReturn.strategy.core.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang.time.DateFormatUtils;
import org.nl.wms.ext_manage.purchase.service.dto.EasAuditRequestDto;
import org.nl.wms.ext_manage.util.ErpUtil;
import org.nl.wms.pm_manage.purchase.service.PurchaseService;
import org.nl.wms.pm_manage.purchase.service.PurchasedtlService;
import org.nl.wms.pm_manage.purchase.service.dao.Purchasedtl;
import org.nl.wms.pm_manage.purchase.service.dao.Purchasemst;
import org.nl.wms.pm_manage.purchase.service.enums.PurchaseBillStatus;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_manage.stockReturn.service.IPmStockReturnService;
import org.nl.wms.warehouse_manage.stockReturn.service.dao.PmStockReturn;
import org.nl.wms.warehouse_manage.stockReturn.service.enums.StockReturnStatusEnum;
import org.nl.wms.warehouse_manage.stockReturn.strategy.core.CallbackStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 生产入库回传
*/
@Service
public class DealPurchaseRecBillCallback implements CallbackStrategy {
@Autowired
private IPmStockReturnService iPmStockReturnService;
@Autowired
private PurchaseService purchaseService;
@Autowired
private PurchasedtlService purchasedtlService;
@Autowired
private IOStorInvDtlMapper ioStorInvDtlMapper;
@Override
public void buildCallback(IOStorInvDtl param) {
final String orderCode = param.getSource_bill_code();
Purchasemst purchasemst = purchaseService.getOne(new LambdaQueryWrapper<Purchasemst>()
.eq(Purchasemst::getBill_id, orderCode));
List<IOStorInvDtl> ioStorInvDtls = ioStorInvDtlMapper.selectList(new LambdaQueryWrapper<IOStorInvDtl>()
.eq(IOStorInvDtl::getIostorinv_id, param.getIostorinv_id()));
List<EasAuditRequestDto.EasAuditEntryDto> entryList = new ArrayList<>();
for (IOStorInvDtl item : ioStorInvDtls) {
Purchasedtl purchasedtl = purchasedtlService.getOne(new LambdaQueryWrapper<Purchasedtl>()
.eq(Purchasedtl::getBill_id, orderCode)
.eq(Purchasedtl::getSku_code, item.getMaterial_code()));
purchasedtl.setInstock_qty(item.getPlan_qty().add(purchasedtl.getInstock_qty()));
purchasedtlService.updateById(purchasedtl);
EasAuditRequestDto.EasAuditEntryDto easAuditEntryDto = new EasAuditRequestDto.EasAuditEntryDto();
easAuditEntryDto.setSeq(Integer.parseInt(purchasedtl.getItem_no()));
easAuditEntryDto.setQty(item.getPlan_qty());
easAuditEntryDto.setEntryId(purchasedtl.getEntry_id());
entryList.add(easAuditEntryDto);
}
List<Purchasedtl> list = purchasedtlService.list(new LambdaQueryWrapper<Purchasedtl>()
.eq(Purchasedtl::getBill_id, orderCode));
boolean flag = list.stream().anyMatch(i -> i.getQty().compareTo(i.getInstock_qty()) != 0);
if (!flag){
//全部相等则单据完成
purchaseService.lambdaUpdate()
.set(Purchasemst::getBill_status, PurchaseBillStatus.COMPLETED.getCode())
.set(Purchasemst::getModify_date, DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"))
.eq(Purchasemst::getBill_id, orderCode)
.update();
// 保存回传单
EasAuditRequestDto easAuditRequestDto = new EasAuditRequestDto();
easAuditRequestDto.setType("WMS");
easAuditRequestDto.setMethod("DealBill");
EasAuditRequestDto.EasAuditDataDto easAuditDataDto = new EasAuditRequestDto.EasAuditDataDto();
easAuditDataDto.setBillType(purchasemst.getOrder_type());
easAuditDataDto.setBillNo(purchasemst.getOrder_no());
easAuditDataDto.setEntrys(entryList);
easAuditRequestDto.setData(easAuditDataDto);
final PmStockReturn stockReturn = new PmStockReturn();
stockReturn.setRequest_Id(orderCode);
stockReturn.setCreate_time(DateUtil.now());
stockReturn.setRequest_type(IOSEnum.BILL_TYPE.code("采购入库"));
stockReturn.setStatus(StockReturnStatusEnum.TODO.getCode());
stockReturn.setRequest_data(JSON.toJSONString(easAuditRequestDto));
iPmStockReturnService.save(stockReturn);
//回传
try {
ErpUtil.create().login().audit(JSONObject.toJSONString(easAuditRequestDto));
iPmStockReturnService.lambdaUpdate()
.set(PmStockReturn::getStatus,StockReturnStatusEnum.SUCESS.getCode())
.eq(PmStockReturn::getRequest_Id, orderCode);
} catch (Exception e) {
iPmStockReturnService.lambdaUpdate()
.set(PmStockReturn::getStatus,StockReturnStatusEnum.FAIL.getCode())
.eq(PmStockReturn::getRequest_Id, orderCode);
}
}else {
//更新单据状态执行中
purchaseService.lambdaUpdate()
.eq(Purchasemst::getBill_id, orderCode)
.eq(Purchasemst::getBill_status, PurchaseBillStatus.CREATED.getCode())
.set(Purchasemst::getBill_status, PurchaseBillStatus.EXECUTING.getCode())
.update();
}
}
}

View File

@@ -38,4 +38,6 @@ public interface IWorkOrderService extends IService<WorkOrderDao> {
void updateBomUseQty(String id, BigDecimal qty);
List<WorkOrderBomDao> getOrderBomItem(String orderCode);
WorkOrderDao getWorkOrder(String orderCode);
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.welding_manage.service.work_order.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -119,4 +120,15 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
}
return workOrderMapper.getOrderBomItem(orderCode);
}
@Override
public WorkOrderDao getWorkOrder(String orderCode) {
if (StringUtils.isEmpty(orderCode)){
throw new BadRequestException("查询工单失败,工单编号为空");
}
return this.getOne(new LambdaQueryWrapper<WorkOrderDao>()
.eq(WorkOrderDao::getOrder_code, orderCode));
}
}