add:1.主表增加产线信息;trackNo 跟踪号;

2.sn条码校验,非空的不能重复
    3.增加分页,增加状态:1.忽略过账 :状态跟回传异常异样忽略(功能暂时不确定)
    4.物料名称,bom数量有可能为0;为0的也跟回传异常异样忽略;
This commit is contained in:
zhaoyf
2026-08-03 22:11:07 +08:00
parent 9b9654327f
commit 2d0225bc09
13 changed files with 108 additions and 46 deletions

View File

@@ -19,6 +19,8 @@ public class ReceiveOutRequest {
private String requsername;
private String comment;
private String cztype;
private String workArea;
private String trackNo;
private List<Entrys> entrys;
@Data

View File

@@ -1,8 +1,11 @@
package org.nl.wms.ext_manage.mes.mq.producer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.nl.wms.ext_manage.mes.service.dto.WorkReportParam;
import org.nl.wms.warehouse_manage.stockReturn.receiveOutRetur.dao.ReceiveOutReturn;
import org.nl.wms.warehouse_manage.stockReturn.receiveOutRetur.service.IReceiveOutReturnService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -11,8 +14,15 @@ import org.springframework.stereotype.Component;
public class WorkReportProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private IReceiveOutReturnService receiveOutReturnService;
public void send(WorkReportParam param) {
if (!StringUtils.isEmpty(param.getSn())){
ReceiveOutReturn one = receiveOutReturnService.getOne(new LambdaQueryWrapper<ReceiveOutReturn>()
.eq(ReceiveOutReturn::getSn, param.getSn()));
if (one != null) return;//已存在跳过
}
rabbitTemplate.convertAndSend("Mes", "workReport", JSON.toJSONString(param));
}
}

View File

@@ -8,11 +8,8 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.ext_manage.api.MesApi;
import org.nl.wms.ext_manage.mes.service.MesReportService;
import org.nl.wms.ext_manage.mes.service.dto.WorkOrderBomItem;
import org.nl.wms.ext_manage.mes.service.dto.WorkReportParam;
import org.nl.wms.ext_manage.service.WmsToZDWmdService;
import org.nl.wms.pda_manage.ios_manage.service.PdaIosOutService;
import org.nl.wms.pda_manage.outBound.dto.LineSideDto;
import org.nl.wms.sch_manage.service.ISchBaseRegionService;
@@ -25,9 +22,6 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class MesReportServiceImpl implements MesReportService {
@@ -74,6 +68,8 @@ public class MesReportServiceImpl implements MesReportService {
sideDto.setSn(workReportParam.getSn());
sideDto.setStorageVehicleCode(one.getStoragevehicle_code());
sideDto.setReportParam(JSON.toJSONString(workReportParam));
sideDto.setTrackNo(workReportParam.getTrackNo());
sideDto.setWorkArea(workReportParam.getWorkArea());
pdaIosOutService.directConfirm(sideDto);
}catch (Exception ex){
ReceiveOutReturn entity = new ReceiveOutReturn();
@@ -87,6 +83,8 @@ public class MesReportServiceImpl implements MesReportService {
entity.setRequserno("WMS");
entity.setRequsername("WMS");
entity.setCztype("02");
entity.setTrackNo(workReportParam.getTrackNo());
entity.setWorkArea(workReportParam.getWorkArea());
entity.setCreateTime(DateUtil.now());
entity.setRemark(ex.getMessage());
entity.setStatus(StockReturnStatusEnum.ERROR.getCode() );

View File

@@ -560,6 +560,11 @@ public class InboundEasSyncServiceImpl implements InboundEasSyncService {
}
}
/**
* 退料入库
* 注意是红字单据
* @param billChangeDto
*/
@Override
public void syncReturnInBill(BillChangeDto billChangeDto) {
String billId = billChangeDto.getBillid();
@@ -606,6 +611,7 @@ public class InboundEasSyncServiceImpl implements InboundEasSyncService {
//更新单据
Boolean allZD = true;
for (Purchasedtl dtl : easDtlList) {
dtl.setQty(dtl.getQty().abs());
if (ZD_STOR_SET.contains(dtl.getHouse_code())){
//中鼎立库
dtl.setInstock_qty(dtl.getQty());

View File

@@ -2,7 +2,6 @@ package org.nl.wms.pda_manage.ios_manage.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -37,30 +36,27 @@ import org.nl.wms.pda_manage.util.PdaResponse;
import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.sch_manage.enums.TaskEnum;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.sch_manage.service.core.AbstractTask;
import org.nl.wms.sch_manage.service.core.tasks.PdaPointTask;
import org.nl.wms.sch_manage.service.core.tasks.VehicleOutTask;
import org.nl.wms.sch_manage.service.dao.SchBasePoint;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IOutBillService;
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.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.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.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.inventory.IStInventoryService;
import org.nl.wms.warehouse_manage.inventory.core.enums.InventoryChangeType;
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.dao.GroupPlate;
import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateMapper;
import org.nl.wms.warehouse_manage.stockReturn.receiveOutRetur.dao.ReceiveOutReturn;
import org.nl.wms.warehouse_manage.stockReturn.receiveOutRetur.service.IReceiveOutReturnService;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -296,8 +292,11 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
entry.setSrcbillentryid(bomItem.getItemId());
if (qty.compareTo(actualQty) > 0) {
status = StockReturnStatusEnum.FAIL.getCode();
entry.setStatus(StockReturnStatusEnum.TODO.getCode());
entry.setStatus(StockReturnStatusEnum.FAIL.getCode());
entry.setRemark(materialCode+"WMS库存不足:当前" + actualQty + "需求" + qty.intValue());
if (entry.getBaseqty().compareTo(BigDecimal.ZERO) == 0){
entry.setStatus(StockReturnStatusEnum.IGNORE.getCode());
}
entrys.add(entry);
}else {
final IOStorInvDtl ioStorInvDtl = new IOStorInvDtl();
@@ -358,7 +357,7 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
}
entry.setRemark("等待回传EAS");
entry.setStatus(StockReturnStatusEnum.FAIL.getCode());
entry.setStatus(StockReturnStatusEnum.TODO.getCode());
entrys.add(entry);
}
}
@@ -383,6 +382,8 @@ public class PdaIosOutServiceImpl implements PdaIosOutService {
receiveOutRequest.setRequsername("WMS");
receiveOutRequest.setDeptno("01.09.14.02");
receiveOutRequest.setDeptno("01.09.14.02");
receiveOutRequest.setTrackNo(param.getTrackNo());
receiveOutRequest.setWorkArea(param.getWorkArea());
receiveOutRequest.setEntrys(entrys);
ReceiveOutReturn entity = receiveOutReturnService.saveFromRequest(
receiveOutRequest, status, null,CollectionUtils.isEmpty(ioStorInvDtls)?null:ioStorInv.getBill_code(),param.getReportParam());

View File

@@ -1,11 +1,8 @@
package org.nl.wms.pda_manage.outBound.dto;
import lombok.Data;
import org.nl.wms.ext_manage.mes.service.dto.WorkOrderBomItem;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Data
public class LineSideDto {
@@ -31,5 +28,7 @@ public class LineSideDto {
private BigDecimal reportedQty;
private String storageVehicleCode;
private String reportParam;
private String trackNo;
private String workArea;
}

View File

@@ -35,7 +35,11 @@ public class FormReturnAutoTask {
List<PmStockReturn> rows = new ArrayList<>();
for (PmStockReturn item : list) {
rows.add(item);
pmStockReturnService.uploadRows(rows);
try {
pmStockReturnService.uploadRows(rows);
} catch (Exception e) {
log.error("定时回传任务错误{}",e.getMessage());
}
Thread.sleep(1000 * 5);
rows.remove(item);
}

View File

@@ -33,7 +33,11 @@ public class ReceiveReturnAutoTask {
.last("limit 5"));
log.info("========>倒冲领料定时回传列表:{}", JSON.toJSONString(list));
for (ReceiveOutReturn item : list) {
receiveOutReturnService.uploadErp(item);
try {
receiveOutReturnService.uploadErp(item);
} catch (Exception e) {
log.error("========>倒冲领料定时回传错误:{}", e.getMessage());
}
Thread.sleep(1000 * 5);
}
}

View File

@@ -29,6 +29,10 @@ public class ReceiveOutReturn implements Serializable {
private String requsername;
private String comment;
private String cztype;
@TableField("track_no")
private String trackNo;
@TableField("work_area")
private String workArea;
@TableField("create_time")
private String createTime;

View File

@@ -36,6 +36,7 @@ public class ReceiveOutReturnDetail implements Serializable {
private String lotnumber;
private String stockerno;
private String stockername;
private String iobillcode;
@TableField("update_time")
private String updateTime;
private String status;

View File

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
@@ -19,7 +18,6 @@ import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.ISectattrService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.Sectattr;
@@ -27,8 +25,6 @@ import org.nl.wms.ext_manage.api.EasApi;
import org.nl.wms.ext_manage.api.request.QueryEasStockRequest;
import org.nl.wms.ext_manage.api.request.ReceiveOutRequest;
import org.nl.wms.ext_manage.api.response.QueryEasStockResponse;
import org.nl.wms.ext_manage.mes.service.dto.WorkOrderBomItem;
import org.nl.wms.ext_manage.service.WmsToErpService;
import org.nl.wms.ext_manage.util.ErpUtil;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInv;
@@ -200,13 +196,15 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
entity.setRequestId(ioBillCode);
entity.setCreatedBy(SecurityUtils.getCurrentUsername());
entity.setReportParam(reportParam);
entity.setWorkArea(request.getWorkArea());
entity.setTrackNo(request.getTrackNo());
this.save(entity);
saveRequestDetails(entity.getId(), request.getEntrys());
saveRequestDetails(entity.getId(), request.getEntrys(), ioBillCode);
return entity;
}
private void saveRequestDetails(Long returnId, List<ReceiveOutRequest.Entrys> entrys) {
private void saveRequestDetails(Long returnId, List<ReceiveOutRequest.Entrys> entrys, String ioBillCode) {
if (entrys == null || entrys.isEmpty()) {
return;
}
@@ -232,6 +230,7 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
detail.setStockername(entry.getStockername());
detail.setStatus(entry.getStatus());
detail.setUpdateTime(now);
detail.setIobillcode(ioBillCode);
receiveOutReturnDetailMapper.insert(detail);
}
}
@@ -311,6 +310,7 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
}
@Override
@Transactional
public void uploadErp(ReceiveOutReturn mst) {
if (mst == null || mst.getId() == null) {throw new BadRequestException("请选择需要回传的数据");}
ReceiveOutReturn entity = this.getById(mst.getId());
@@ -381,12 +381,20 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
final String materialCode = detail.getMaterialno();
final BigDecimal qty = detail.getQty();
final BigDecimal actualQty = groupInventoryMap.get(materialCode) == null?BigDecimal.ZERO:groupInventoryMap.get(materialCode);
if (qty.compareTo(actualQty) > 0) {
if (qty.compareTo(actualQty) > 0 && detail.getStatus().equals(StockReturnStatusEnum.FAIL.getCode())) {
//跳过
sucess = Boolean.FALSE;
continue;
} else if (qty.compareTo(actualQty) > 0 && detail.getStatus().equals(StockReturnStatusEnum.TODO.getCode())) {
sucess = Boolean.FALSE;
continue;//库存不足但是同步时生成过出入库单
} else{
detail.setStatus(StockReturnStatusEnum.TODO.getCode());
detail.setIobillcode(ioStorInv.getBill_code());
}
entrys.add(detail);
//待回传的说明还没做库存变动
if (detail.getStatus().equals(StockReturnStatusEnum.FAIL.getCode())){
if (detail.getStatus().equals(StockReturnStatusEnum.FAIL.getCode())){//失败说明库存不足,直接跳过
continue;
}
final IOStorInvDtl ioStorInvDtl = new IOStorInvDtl();
@@ -453,6 +461,7 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
ioStorInvDisMapper.batchSave(iOStorInvDiss);
iStInventoryService.changeInventory(InventoryChangeType.OUT_FINS, outFinsParams);
}
mst.setRequestId(mst.getRequestId() + "," + ioStorInv.getBill_code());
final String warehouseno = entrys.get(0).getWarehouseno();
final QueryEasStockRequest easStockRequest = new QueryEasStockRequest();
@@ -482,7 +491,7 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(unsatisfiedList)){
receiveOutReturnDetailMapper.update(null,new LambdaUpdateWrapper<ReceiveOutReturnDetail>()
.set(ReceiveOutReturnDetail::getStatus,StockReturnStatusEnum.FAIL.getCode())
// .set(ReceiveOutReturnDetail::getStatus,StockReturnStatusEnum.FAIL.getCode())
.set(ReceiveOutReturnDetail::getRemark,"EAS库存不足")
.set(ReceiveOutReturnDetail::getUpdateTime,now)
.in(ReceiveOutReturnDetail::getId,unsatisfiedList.stream()
@@ -497,11 +506,8 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
}
}
}
@Transactional
public Boolean callEasByAllBill(ReceiveOutReturn entity, Long id, List<ReceiveOutReturnDetail> details, String now, ErpUtil login) {
String status;
String remark = "";
Boolean sucess =Boolean.TRUE;
if (id == null ) {
throw new IllegalArgumentException("回传记录ID和明细ID不能为空");
}
@@ -513,20 +519,17 @@ public class ReceiveOutReturnServiceImpl extends ServiceImpl<ReceiveOutReturnMap
req.put("data", receiveOutRequest);
log.info("======>请求EAS领料出库单接口" + JSONObject.toJSONString(req));
login.audit(req.toJSONString());
status = StockReturnStatusEnum.SUCESS.getCode();
} catch (Exception e) {
sucess = Boolean.FALSE;
log.error("请求EAS领料出库单接口失败回传记录ID{}", id, e);
status = StockReturnStatusEnum.FAIL.getCode();
remark = e.getMessage();
throw new BadRequestException(e.getMessage());
}
receiveOutReturnDetailMapper.update(null,new LambdaUpdateWrapper<ReceiveOutReturnDetail>()
.set(ReceiveOutReturnDetail::getStatus,status)
.set(ReceiveOutReturnDetail::getRemark,remark)
.set(ReceiveOutReturnDetail::getStatus,StockReturnStatusEnum.SUCESS.getCode())
.set(ReceiveOutReturnDetail::getRemark,"")
.set(ReceiveOutReturnDetail::getUpdateTime,now)
.in(ReceiveOutReturnDetail::getId,details.stream()
.map(ReceiveOutReturnDetail::getId).collect(Collectors.toList())));
return sucess;
return Boolean.TRUE;
}
private Boolean callEasByOneBill(ReceiveOutReturn entity, Boolean sucess, Long id, List<ReceiveOutReturnDetail> details, String now, ErpUtil login) {

View File

@@ -11,6 +11,7 @@ public enum StockReturnStatusEnum {
SUCESS("1","回传成功"),
FAIL("2","回传失败"),
ERROR("3","回传异常"),
IGNORE("4","忽略过账"),
;
StockReturnStatusEnum(String code, String desc) {

View File

@@ -73,6 +73,8 @@
<el-table-column prop="orgno" label="机构编号" min-width="120" />
<el-table-column prop="biztype" label="业务类型" min-width="100" />
<el-table-column prop="invscheme" label="库存方案" min-width="100" />
<el-table-column prop="trackNo" label="跟踪号" min-width="100" />
<el-table-column prop="workArea" label="产线" min-width="100" />
<el-table-column prop="transtype" label="交易类型" min-width="100" />
<el-table-column prop="biztime" label="业务时间" min-width="160" />
<el-table-column prop="createTime" label="创建时间" min-width="160" />
@@ -121,7 +123,7 @@
<el-descriptions-item label="回传备注" :span="2">{{ currentRow.remark }}</el-descriptions-item>
<el-descriptions-item label="报工参数" :span="2">{{ currentRow.reportParam }}</el-descriptions-item>
</el-descriptions>
<el-table :data="currentRow.details || []" size="mini" style="width: 100%; margin-top: 12px;">
<el-table :data="pagedDetails" size="mini" style="width: 100%; margin-top: 12px;">
<el-table-column prop="seq" label="行序号" width="80" />
<el-table-column label="回传状态" min-width="140">
<template slot-scope="scope">
@@ -154,6 +156,14 @@
</template>
</el-table-column>
</el-table>
<el-pagination
style="margin-top: 8px; text-align: right;"
:current-page.sync="detailPage.page"
:page-size.sync="detailPage.size"
:page-sizes="[10, 20, 50, 100]"
:total="(currentRow.details || []).length"
layout="total, prev, pager, next, sizes"
/>
<div slot="footer" class="dialog-footer"><el-button type="primary" @click="viewShow = false">关闭</el-button></div>
</el-dialog>
</div>
@@ -212,6 +222,7 @@ export default {
viewShow: false,
uploadFlag: true,
currentRow: {},
detailPage: { page: 1, size: 10 },
permission: {
add: ['purchasemst:add'],
edit: ['purchasemst:edit'],
@@ -221,7 +232,8 @@ export default {
{ value: '0', label: '待回传' },
{ value: '1', label: '回传成功' },
{ value: '2', label: '回传失败' },
{ value: '3', label: '回传异常' }
{ value: '3', label: '回传异常' },
{ value: '4', label: '忽略过账' },
],
rules: {
orgno: [{ required: true, message: '请输入机构编号', trigger: 'blur' }],
@@ -230,6 +242,22 @@ export default {
}
}
},
computed: {
pagedDetails() {
const list = this.currentRow.details || []
const start = (this.detailPage.page - 1) * this.detailPage.size
return list.slice(start, start + this.detailPage.size)
}
},
watch: {
'detailPage.size'() {
const total = (this.currentRow.details || []).length
const maxPage = Math.max(1, Math.ceil(total / this.detailPage.size))
if (this.detailPage.page > maxPage) {
this.detailPage.page = maxPage
}
}
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
if (this.query.dateRange) {
@@ -332,6 +360,7 @@ export default {
toView(row) {
get(row.id).then(res => {
this.currentRow = res.data
this.detailPage.page = 1
this.viewShow = true
})
}