add:单据回传生产入库

This commit is contained in:
zhangzq
2026-06-24 18:21:52 +08:00
parent 1f28c86332
commit eae850d62b
12 changed files with 158 additions and 80 deletions

View File

@@ -2,11 +2,15 @@ package org.nl.wms.ext_manage.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.ext_manage.service.dto.StructLineOfflineDTO;
import org.nl.wms.ext_manage.service.impl.StructOfflineService;
import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -26,6 +30,8 @@ public class MesStructLineController {
@Autowired
private StructOfflineService structOfflineTask;
@Autowired
private IWorkOrderService iWorkOrderService;
/**
* 结构车间生产下料同步接口
@@ -36,6 +42,11 @@ public class MesStructLineController {
@SaIgnore
@Log
public ResponseEntity<Object> confirm(@RequestBody StructLineOfflineDTO structLineOffline) {
final WorkOrderDao workOrder = iWorkOrderService.getOne(new LambdaQueryWrapper<WorkOrderDao>()
.eq(WorkOrderDao::getOrder_code, structLineOffline.getOrderCode()));
if (workOrder == null){
throw new BadRequestException("下料失败,"+workOrder+"工单信息不存在");
}
structOfflineTask.offline(structLineOffline);
return new ResponseEntity<>(HttpStatus.OK);
}

View File

@@ -22,7 +22,7 @@ public interface WmsToErpService {
* message 信息
* }
*/
JSONObject uploadErp(JSONObject whereJson);
void uploadErp(JSONObject whereJson);
/**
* 物料同步

View File

@@ -124,6 +124,9 @@ public class StructOfflineService{
dtl.put("qty_unit_name", materialbase.getQty_unit_name());
dtl.put("qty", plate.getQty());
dtl.put("plan_qty", plate.getQty());
dtl.put("callback_strategy", "dealManufactureRecBillCallback");
dtl.put("ext_type", "生产工单");
dtl.put("ext_code", offlineDTO.getOrderCode());
// 调用新增
tableData.add(dtl);
jsonMst.put("tableData",tableData);

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.config.SpringContextHolder;
import org.nl.wms.ext_manage.util.ErpUtil;
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;
@@ -26,34 +27,8 @@ import org.springframework.stereotype.Service;
public class WmsToErpServiceImpl implements WmsToErpService {
@Override
public JSONObject uploadErp(JSONObject whereJson) {
log.info("uploadErp回传接口输入参数为-------------------" + whereJson.toString());
JSONObject result = new JSONObject();
final Param param = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode(SysParamConstant.ERP_URL);
if (param==null){
throw new BadRequestException("回传ERP失败,未配置erp_url地址");
}
String url = param.getValue();
url = url + EXTConstant.UPLOAD_ERP_API;
try {
String resultMsg = HttpRequest.post(url)
.body(String.valueOf(whereJson))
.execute().body();
result = JSONObject.parseObject(resultMsg);
log.info("uploadErp回传接口输出参数为-------------------" + result.toString());
Integer status = result.getInteger("status");
if (status != HttpStatus.OK.value()) {
throw new BadRequestException(result.getString("message"));
}
} catch (Exception e) {
throw new BadRequestException("ERP提示错误" + e.getMessage());
}
return result;
public void uploadErp(JSONObject requestData) {
ErpUtil.create().login().audit(requestData.toJSONString());
}
@Override

View File

@@ -14,6 +14,7 @@ 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;
@@ -23,7 +24,6 @@ import javax.xml.rpc.encoding.XMLType;
@Slf4j
@Data
public class ErpUtil {
private String loginUrl;
private String auditUrl;
private String userName;
@@ -37,18 +37,15 @@ public class ErpUtil {
private String sessionId;
public static ErpUtil create(){
SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class);
final Param erpLoginParam = sysParamService.findByCode(SysParamConstant.ERP_LOGIN_URL);
final Param erpAuditParam = sysParamService.findByCode(SysParamConstant.ERP_AUDIT_URL);
ErpUtil erpUtil = new ErpUtil();
erpUtil.setLoginUrl(erpLoginParam.getValue());
erpUtil.setAuditUrl(erpAuditParam.getValue());
erpUtil.setLoginUrl(SpringContextHolder.getProperties("erp.loginUrl"));
erpUtil.setAuditUrl(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"));
return new ErpUtil();
return erpUtil;
}
/**
* 登录获取sessionId
@@ -97,7 +94,7 @@ public class ErpUtil {
call.addParameter(
new QName("", "dbType"), // 空命名空间
XMLType.XSD_STRING,
Integer.class,
String.class,
ParameterMode.IN
);
WSContext response = (WSContext)call.invoke(new Object[]{userName, password, slnName, dcName, dbType});

View File

@@ -184,17 +184,10 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchasemstMapper, Purchase
stockReturn.setRequest_data(JSON.toJSONString(dto));
pmStockReturnService.save(stockReturn);
//回传erp
JSONObject result = wmsToErpService.uploadErp((JSONObject) JSONObject.toJSON(dto));
if (!result.getBoolean("status")){
pmStockReturnService.lambdaUpdate()
.set(PmStockReturn::getStatus, StockReturnStatusEnum.FAIL.getCode())
.eq(PmStockReturn::getRequest_Id, mst.getBill_id());
}else {
wmsToErpService.uploadErp((JSONObject) JSONObject.toJSON(dto));
pmStockReturnService.lambdaUpdate()
.set(PmStockReturn::getStatus, StockReturnStatusEnum.SUCESS.getCode())
.eq(PmStockReturn::getRequest_Id, mst.getBill_id());
}
log.info("下发回传单成功, billId: {}, requestId: {}, 明细数: {}", mst.getBill_id(), stockReturn.getRequest_Id(), dtlList.size());
}
}

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.commons.collections4.CollectionUtils;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
@@ -45,7 +46,7 @@ public class BWIPInTask extends AbstractTask {
@Autowired
private ISchBaseTaskService taskService;
@Resource
private IInBillService rawAssistIStorService;
private IInBillService iInBillService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Autowired
@@ -118,25 +119,7 @@ public class BWIPInTask extends AbstractTask {
@Transactional
public void forceFinish(String taskCode) {
SchBaseTask task = taskService.getByCode(taskCode);
// 任务完成
task.setTask_status(TaskStatus.FINISHED.getCode());
task.setRemark("已完成");
taskService.updateById(task);
rawAssistIStorService.taskFinish(task);
//推送入库单
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getTask_id, task.getTask_id())
);
Map<String, BigDecimal> materialQtyMap = new HashMap<>();
for (IOStorInvDis dis : ioStorInvDis) {
String materialCode = dis.getMaterial_code();
BigDecimal planQty = dis.getPlan_qty();
if (materialCode != null && planQty != null) {
materialQtyMap.merge(materialCode, planQty, BigDecimal::add);
}
}
eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams(
ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code())));
this.finishTask(task);
}
@Override
@@ -157,21 +140,13 @@ public class BWIPInTask extends AbstractTask {
task.setTask_status(TaskStatus.FINISHED.getCode());
task.setRemark("已完成");
taskService.updateById(task);
rawAssistIStorService.taskFinish(task);
//推送入库单
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getTask_id, task.getTask_id())
);
Map<String, BigDecimal> materialQtyMap = new HashMap<>();
for (IOStorInvDis dis : ioStorInvDis) {
String materialCode = dis.getMaterial_code();
BigDecimal planQty = dis.getPlan_qty();
if (materialCode != null && planQty != null) {
materialQtyMap.merge(materialCode, planQty, BigDecimal::add);
if (CollectionUtils.isEmpty(ioStorInvDis)) {
throw new BadRequestException("未找到任务对应的分配明细");
}
}
eventPublisher.publishEvent(new PmManageEvent(SourceBillTypeEnum.PM_RECEIVING.getBillType(),new PReceivingParams(
ioStorInvDis.get(0).getIostorinvdis_id(),materialQtyMap,ioStorInvDis.get(0).getSect_code())));
iInBillService.disFinish(ioStorInvDis);
}
@Transactional(rollbackFor = Exception.class)

View File

@@ -7,6 +7,7 @@ import org.nl.common.domain.query.PageQuery;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
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.service.dto.GroupPlateDto;
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDisDto;
import org.nl.wms.warehouse_manage.inAndOut.service.dto.IOStorInvDtlDto;
@@ -50,6 +51,10 @@ public interface IInBillService extends IService<IOStorInv> {
void taskFinish(SchBaseTask task);
void disFinish(List<IOStorInvDis> disList);
List<IOStorInvDisDto> getDisDtl(Map whereJson);
Structattr autoDis(JSONObject whereJson);

View File

@@ -30,10 +30,16 @@ 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.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;
@@ -47,6 +53,8 @@ import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDtlMappe
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.stockReturn.strategy.CallbackStrategyPublish;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
@@ -88,6 +96,12 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
@Resource
private MdPbGroupplateServiceImpl mdPbGroupplateService;
@Autowired
private CallbackStrategyPublish callbackStrategyPublish;
@Autowired
private IStInventoryService iStInventoryService;
@Override
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page) {
HashMap<String, String> map = new HashMap<>();
@@ -193,6 +207,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
ioStorInvDtl.put("qty_unit_name", row.get("qty_unit_name"));
ioStorInvDtl.put("source_bill_type", row.get("ext_type"));
ioStorInvDtl.put("source_bill_code", row.get("ext_code"));
ioStorInvDtl.put("callback_strategy", row.get("callback_strategy"));
ioStorInvDtl.put("assign_qty", "0");
ioStorInvDtl.put("unassign_qty", row.get("qty"));
ioStorInvDtl.put("plan_qty", row.get("qty"));
@@ -711,6 +726,56 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
}
@Override
public void disFinish(List<IOStorInvDis> disList) {
// 完成当前任务对应的所有分配明细
ioStorInvDisMapper.update(null,new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成"))
.in(IOStorInvDis::getIostorinvdis_id,disList.stream()
.map(IOStorInvDis::getIostorinvdis_id).collect(Collectors.toList())));
// 查询该明细下是否还有未完成的分配明细
int countDis = ioStorInvDisMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDis.class)
.eq(IOStorInvDis::getIostorinvdtl_id,disList.get(0).getIostorinvdtl_id())
.ne(IOStorInvDis::getWork_status,IOSEnum.INBILL_DIS_STATUS.code("完成"))
);
final List<AddInvParam> addInvParams = new ArrayList<>();
for (IOStorInvDis invDis : disList) {
AddInvParam addParam = new AddInvParam();
addParam.setPcsn(invDis.getPcsn());
addParam.setMaterialCode(invDis.getMaterial_code());
addParam.setStoragevehicleCode(invDis.getStoragevehicle_code());
addParam.setUnitName(invDis.getQty_unit_name());
addParam.setUnitId(invDis.getQty_unit_id());
addParam.setQty(invDis.getPlan_qty());
addInvParams.add(addParam);
}
iStInventoryService.changeInventory(InventoryChangeType.ADD_INV, addInvParams);
// 如果分配明细全部完成则更新明细表状态
if (countDis == 0){
// 更新明细表状态
final IOStorInvDtl ioStorInvDtl = ioStorInvDtlMapper.selectById(disList.get(0).getIostorinvdtl_id());
ioStorInvDtl.setBill_status(IOSEnum.BILL_STATUS.code("完成"));
ioStorInvDtlMapper.updateById(ioStorInvDtl);
callbackStrategyPublish.callbackStrategy(ioStorInvDtl.getCallback_strategy(),ioStorInvDtl);
// 查看明细是否全部完成
int countDtl = ioStorInvDtlMapper.selectCount(new LambdaQueryWrapper<>(IOStorInvDtl.class)
.eq(IOStorInvDtl::getIostorinv_id,ioStorInvDtl.getIostorinv_id())
.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, SecurityUtils.getCurrentUserId())
.set(IOStorInv::getConfirm_optname, SecurityUtils.getCurrentNickName())
.set(IOStorInv::getConfirm_time, DateUtil.now())
.eq(IOStorInv::getIostorinv_id,ioStorInvDtl.getIostorinv_id())
);
}
}
}
@Override
public List<IOStorInvDisDto> getDisDtl(Map whereJson) {
//查询该明细下的所有入库分配载具明细

View File

@@ -1,9 +1,18 @@
package org.nl.wms.warehouse_manage.stockReturn.strategy.core.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
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.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDtl;
import org.nl.wms.welding_manage.service.work_order.IWorkOrderService;
import org.nl.wms.welding_manage.service.work_order.dao.WorkOrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -18,8 +27,44 @@ public class DealManufactureRecBillCallback implements CallbackStrategy {
@Autowired
private IPmStockReturnService iPmStockReturnService;
@Override
public void buildCallback(IOStorInvDtl param) {
final String orderCode = param.getSource_bill_code();
final WorkOrderDao workOrder = iWorkOrderService.getOne(new LambdaQueryWrapper<WorkOrderDao>()
.eq(WorkOrderDao::getOrder_code, orderCode));
if (workOrder == null){
throw new BadRequestException("工单不存在");
}
//组织报文信息
// 组织报文信息
JSONObject callbackData = new JSONObject();
callbackData.put("method", "DealManufactureRecBill");
callbackData.put("type", "WMS");
// 组装data节点
JSONObject data = new JSONObject();
data.put("bizStatus", "02"); // 业务状态,可根据实际业务逻辑设置
data.put("bizDate", DateUtil.today()); // 业务日期
data.put("createPersonNo", "wms"); // 创建人编号,从当前登录用户获取
data.put("mesNo", param.getIostorinv_id()); // 使用工单编号作为MES单号
// 组装明细列表
JSONArray entrys = new JSONArray();
JSONObject entry = new JSONObject();
entry.put("seq", 1); // 序号
entry.put("qty", param.getReal_qty()); // 数量
entry.put("sourceBillId", workOrder.getOrder_id()); // 来源单据标识
entry.put("sourceBillNo", workOrder.getOrder_code()); // 来源单据编号
entrys.add(entry);
data.put("entrys", entrys);
callbackData.put("data", data);
// 记录回传日志 - 发送前
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(callbackData.toString());
iPmStockReturnService.save(stockReturn);
}
}

View File

@@ -95,7 +95,8 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
}
List<WorkOrderDto.WorkOrderDataDto.WorkOrderBomDto> workOrderBomList = workOrder.getWorkOrderBomList();
//保证一致
workOrderBomList.forEach(a->a.setWorkOrderCode(workOrder.getOrderCode()));
workOrderMapper.saveWorkOrder(workOrder);
workOrderMapper.saveAllBom(workOrderBomList);
}

View File

@@ -181,3 +181,11 @@ eas:
namespace: http://ws.eas.kingdee.com/
inbound:
liku-codes: LK01
erp:
loginUrl: http://192.168.100.100:8080/ormrpc/services/EASLogin?wsdl
busUrl: http://192.168.100.100:8080/ormrpc/services/WSNLMESFacade?wsdl
username: user
password: Noble123!9
slnName: eas
dcName: test
dbType: 1