This commit is contained in:
zgw
2026-07-10 16:07:21 +08:00
parent a854f24ac4
commit e004148f19
17 changed files with 185 additions and 46 deletions

View File

@@ -3,9 +3,6 @@ package com.ruoyi.api.domain.erp;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* ERP入库回传请求参数
*/
@@ -40,7 +37,7 @@ public class ErpInStockinConfirmRequest {
* 入库明细
*/
@JsonProperty("KuinList")
private List<ErpInStockinDetailConfirmRequest> kuinList;
private String kuinList;
/**
* 客户名称

View File

@@ -7,7 +7,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
@@ -21,7 +20,7 @@ public class ReceiveOutStockConfirm {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date5;
private List<Kuout> kuoutList;
private String kuoutList;
@JsonProperty("!B__SysCusmf_0_62001_511_0")
private String sysCusmfField511;

View File

@@ -338,6 +338,7 @@ public class ToErpServiceImpl implements IToErpService {
erpOutStock.setSpare4(Convert.toStr(row.get(27)));
String stockOutId = basJobIdService.getJobId("CKD");
outStockout.setStockoutId(stockOutId);
outStockout.setClassNowId(erpOutStock.getStockoutId());
outStockout.setWarehouseId(Convert.toStr(row.get(2)));
outStockout.setErpStockoutId(Convert.toStr(row.get(0)));
outStockout.setStockoutGuid(stockOutId);
@@ -754,7 +755,7 @@ public class ToErpServiceImpl implements IToErpService {
newStockin.setProductDetails(Convert.toStr(row.get(15)));
newStockin.setCustomerName(Convert.toStr(row.get(16)));
newStockin.setWeighbillNo(Convert.toStr(row.get(17)));
newStockin.setVehicleNo(Convert.toStr(row.get(18)));
newStockin.setVehicleNo(Convert.toStr(row.get(1)));
newStockin.setOrderSrc("ERP");
try {
java.math.BigDecimal orderSum = new java.math.BigDecimal("0");
@@ -851,15 +852,15 @@ public class ToErpServiceImpl implements IToErpService {
//回传ERP
try {
ErpInStockinConfirmRequest request = new ErpInStockinConfirmRequest();
request.setOrd(inStockinN.getErpStockinId());
request.setOrd(inStockinN.getVehicleNo());
request.setDate5(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
request.setComplete1(1);
request.setComplete1(3);
request.setIntro2(inStockinN.getRemark());
request.setCustomerName(inStockinN.getCustomerName());
request.setWeighbillNo(inStockinN.getWeighbillNo());
request.setVehicleNo(inStockinN.getVehicleNo());
List<ErpInStockinDetailConfirmRequest> detailList = getErp(stockinDetailNs);
request.setKuinList(detailList);
request.setKuinList(JSONUtil.toJsonStr(detailList));
String json = objectMapper.writeValueAsString(request);
if (!post(stockinConfirmUrl,json,"入库确认").getSuccess()) {
throw new RuntimeException("回传ERP失败");

View File

@@ -309,18 +309,12 @@ public class ToWmsServiceImpl implements IToWmsService {
// 先尝试传入的两层
plan.add(normalized.toArray(new Integer[0]));
// 再尝试中间层补位(如 1、3 -> 2)
Set<Integer> assigned = new LinkedHashSet<>(normalized);
List<Integer> middle = new ArrayList<>();
int min = normalized.get(0);
int max = normalized.get(1);
for (int i = min + 1; i < max; i++) {
if (SUPPORTED_LAYERS.contains(i) && !assigned.contains(i)) {
middle.add(i);
}
}
if (!middle.isEmpty()) {
plan.add(middle.toArray(new Integer[0]));
// 再尝试未传入的剩余层(如 1、2 -> 3,2、3 -> 1,1、3 -> 2)
List<Integer> remaining = SUPPORTED_LAYERS.stream()
.filter(layer -> !normalized.contains(layer))
.collect(java.util.stream.Collectors.toList());
if (!remaining.isEmpty()) {
plan.add(remaining.toArray(new Integer[0]));
}
return plan;
}
@@ -384,8 +378,15 @@ public class ToWmsServiceImpl implements IToWmsService {
outJob.setExecutionPhase("2");
mydoJobService.updateMydoJob(outJob);
BasCargoSpace basCargoSpace =basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(outJob.getCargoSpaceId());
basCargoSpace.setStatus("1");
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
if (basCargoSpace != null && outJob.getTrayCode().equals(basCargoSpace.getTrayCode())) {
basCargoSpace.setStatus("1");
basCargoSpace.setTrayCode(null);
basCargoSpaceService.updateBasCargoSpace(basCargoSpace);
} else {
log.warn("出库完成不清空货位,货位已被其他托盘占用: taskNo={}, jobId={}, cargoSpaceId={}, outTray={}, currTray={}",
outJob.getTaskNo(), outJob.getJobId(), outJob.getCargoSpaceId(), outJob.getTrayCode(),
basCargoSpace == null ? null : basCargoSpace.getTrayCode());
}
break;
default:

View File

@@ -43,6 +43,10 @@ public class ViewHandAllotStock extends BaseEntity
@Excel(name = "库存数量")
private String quantity;
/** 最近入库时间 */
@Excel(name = "最近入库时间")
private String inDate;
public void setOnlyIdentity(Long onlyIdentity)
{
this.onlyIdentity = onlyIdentity;
@@ -113,6 +117,16 @@ public class ViewHandAllotStock extends BaseEntity
return quantity;
}
public void setInDate(String inDate)
{
this.inDate = inDate;
}
public String getInDate()
{
return inDate;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -123,6 +137,7 @@ public class ViewHandAllotStock extends BaseEntity
.append("productName", getProductName())
.append("groupCodingNo", getGroupCodingNo())
.append("quantity", getQuantity())
.append("inDate", getInDate())
.toString();
}
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.out.outStockout.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.api.domain.erp.ReceiveOutStockConfirm;
import com.ruoyi.api.service.IToWcsService;
import com.ruoyi.api.service.impl.ToErpServiceImpl;
@@ -160,7 +161,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService
ReceiveOutStockConfirm receiveOutStockConfirm = new ReceiveOutStockConfirm();
OutStockout outStockout = selectOutStockoutByStockoutGuid(stockoutId);
List<OutStockoutDetail> outStockoutDetails = outStockoutDetailService.selectOutStockoutDetailByStockoutGuid(stockoutId);
receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getErpStockoutId()));
receiveOutStockConfirm.setOrd(Convert.toInt(outStockout.getClassNowId()));
receiveOutStockConfirm.setComplete1(3);
receiveOutStockConfirm.setIntro2("出库确认完成,货物已全部发出");
receiveOutStockConfirm.setDate5(new Date());
@@ -172,7 +173,7 @@ public class OutStockoutServiceImpl implements IOutStockoutService
kuout.setCk(Convert.toInt(outStockout.getWarehouseId()));
kuouts.add(kuout);
}
receiveOutStockConfirm.setKuoutList(kuouts);
receiveOutStockConfirm.setKuoutList(JSONUtil.toJsonStr(kuouts));
AjaxResult ajaxResult = toErpService.callErp(receiveOutStockConfirm);
if (!ajaxResult.isSuccess()){
stringBuilder.append(",").append(stockoutId).append(ajaxResult.get("msg"));

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.api.domain.RequestEnter;
import com.ruoyi.api.service.IToWmsService;
import com.ruoyi.bas.cargoSpace.domain.BasCargoSpace;
import com.ruoyi.bas.cargoSpace.service.IBasCargoSpaceService;
import com.ruoyi.bas.warehouse.domain.BasWarehouse;
import com.ruoyi.bas.warehouse.mapper.BasWarehouseMapper;
import com.ruoyi.check.commit.domain.CheckCommitRecord;
@@ -57,6 +59,8 @@ public class PdaServiceImp implements PdaService {
private BasWarehouseMapper basWarehouseMapper;
@Autowired
private BasStockMapper basStockMapper;
@Autowired
private IBasCargoSpaceService basCargoSpaceService;
@Override
@@ -111,17 +115,44 @@ public class PdaServiceImp implements PdaService {
if(mydoJobDetails.isEmpty() ){
return AjaxResult.error("该物料没有出库作业,请检查");
}
List<MydoJob> mydoJobs = mydoJobService.selectMydoJobList(mydoJobParam);
String cargoSpaceId = CollUtil.isEmpty(mydoJobs) ? null : mydoJobs.get(0).getCargoSpaceId();
HashMap<String, Object> map = new HashMap<>();
map.put("v_tray_code", trayCodeMakeSure.getTrayCode());
pdaMapper.outMakeSure(map);
String result = map.get("v_result").toString();
if ("10".equals(result)) {
restoreCargoSpaceIfOccupied(trayCodeMakeSure.getTrayCode(), cargoSpaceId);
return AjaxResult.success();
} else {
return AjaxResult.error( map.get("v_resultmsg").toString());
}
}
private void restoreCargoSpaceIfOccupied(String trayCode, String cargoSpaceId) {
if (StrUtil.isEmpty(cargoSpaceId)) {
return;
}
BasStock stockQuery = new BasStock();
stockQuery.setCargoSpaceId(cargoSpaceId);
List<BasStock> stockList = basStockMapper.selectBasStockList(stockQuery);
if (CollUtil.isEmpty(stockList)) {
return;
}
BasStock stock = stockList.get(0);
BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId);
if (cargoSpace == null) {
return;
}
cargoSpace.setStatus("2");
cargoSpace.setTrayCode(stock.getTrayCode());
basCargoSpaceService.updateBasCargoSpace(cargoSpace);
log.warn("PDA出库确认后发现货位仍有库存,已恢复货位状态: outTray={}, cargoSpaceId={}, stockTray={}",
trayCode, cargoSpaceId, stock.getTrayCode());
}
@Override
//@Transactional(rollbackFor = Exception.class)

View File

@@ -4,9 +4,13 @@ import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.pda.trayMsg.domain.TrayMsg;
import com.ruoyi.pda.trayMsg.mapper.TrayMsgMapper;
import com.ruoyi.pda.trayMsg.service.ITrayMsgService;
import com.ruoyi.system.domain.InStockinDetailN;
import com.ruoyi.system.service.IInStockinDetailNService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -21,6 +25,9 @@ public class TrayMsgServiceImpl implements ITrayMsgService
@Autowired
private TrayMsgMapper trayMsgMapper;
@Autowired
private IInStockinDetailNService stockinDetailNService;
/**
* 查询trayMsg
*
@@ -76,9 +83,49 @@ public class TrayMsgServiceImpl implements ITrayMsgService
* @return 结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteTrayMsgByIds(String[] ids)
{
return trayMsgMapper.deleteTrayMsgByIds(ids);
for (String id : ids)
{
TrayMsg trayMsg = trayMsgMapper.selectTrayMsgById(id);
if (trayMsg == null || trayMsg.getStockinDetailId() == null)
{
throw new IllegalStateException("托盘记录不存在或入库子单编码为空,id=" + id);
}
String stockInDetailId = trayMsg.getStockinDetailId();
InStockinDetailN inStockinDetailN = stockinDetailNService.selectInStockinDetailNByStockinDetailId(stockInDetailId);
if (inStockinDetailN == null)
{
throw new IllegalStateException("未找到对应的入库子单,stockinDetailId=" + stockInDetailId);
}
BigDecimal smNum = inStockinDetailN.getSmNum() == null ? BigDecimal.ZERO : inStockinDetailN.getSmNum();
BigDecimal trayQuantity = toBigDecimal(trayMsg.getQuantity());
inStockinDetailN.setSmNum(smNum.subtract(trayQuantity));
int updateRows = stockinDetailNService.updateInStockinDetailN(inStockinDetailN);
if (updateRows <= 0)
{
throw new IllegalStateException("更新入库子单失败,stockinDetailId=" + stockInDetailId);
}
}
int deleteRows = trayMsgMapper.deleteTrayMsgByIds(ids);
if (deleteRows != ids.length)
{
throw new IllegalStateException("删除托盘记录失败,期望删除 " + ids.length + " 条,实际删除 " + deleteRows + " 条");
}
return deleteRows;
}
private BigDecimal toBigDecimal(String value)
{
if (value == null || value.trim().isEmpty())
{
return BigDecimal.ZERO;
}
return new BigDecimal(value.trim());
}
/**

View File

@@ -279,7 +279,7 @@
<select id="selectFirstEmptyGroupCodingNo" resultType="String">
SELECT TOP 1 group_coding_no
FROM bas_cargo_space
WHERE group_coding_no BETWEEN '001' AND '045'
WHERE group_coding_no BETWEEN '001' AND '048'
GROUP BY group_coding_no
HAVING SUM(CASE WHEN status != '1' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN locked != 'N' THEN 1 ELSE 0 END) = 0
@@ -309,7 +309,7 @@
<select id="selectFirstEmptyGroupCodingNoWithLayer" resultType="String">
SELECT TOP 1 group_coding_no
FROM bas_cargo_space
WHERE group_coding_no BETWEEN '001' AND '045'
WHERE group_coding_no BETWEEN '001' AND '048'
GROUP BY group_coding_no
HAVING SUM(CASE WHEN status != '1' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN locked != 'N' THEN 1 ELSE 0 END) = 0

View File

@@ -12,10 +12,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="productName" column="product_name" />
<result property="groupCodingNo" column="group_coding_no" />
<result property="quantity" column="quantity" />
<result property="inDate" column="in_date" />
</resultMap>
<sql id="selectViewHandAllotStockVo">
select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity from view_hand_allot_stock
select only_identity, the_column, the_floor, product_id, product_name, group_coding_no, quantity, in_date from view_hand_allot_stock
</sql>
<select id="selectViewHandAllotStockList" parameterType="ViewHandAllotStock" resultMap="ViewHandAllotStockResult">
@@ -28,6 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null and productName != ''"> and product_name like concat('%', #{productName}, '%')</if>
<if test="groupCodingNo != null and groupCodingNo != ''"> and group_coding_no = #{groupCodingNo}</if>
<if test="quantity != null and quantity != ''"> and quantity = #{quantity}</if>
<if test="inDate != null and inDate != ''"> and in_date = #{inDate}</if>
</where>
</select>
@@ -46,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">product_name,</if>
<if test="groupCodingNo != null">group_coding_no,</if>
<if test="quantity != null">quantity,</if>
<if test="inDate != null">in_date,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="onlyIdentity != null">#{onlyIdentity},</if>
@@ -55,6 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">#{productName},</if>
<if test="groupCodingNo != null">#{groupCodingNo},</if>
<if test="quantity != null">#{quantity},</if>
<if test="inDate != null">#{inDate},</if>
</trim>
</insert>
@@ -67,6 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="productName != null">product_name = #{productName},</if>
<if test="groupCodingNo != null">group_coding_no = #{groupCodingNo},</if>
<if test="quantity != null">quantity = #{quantity},</if>
<if test="inDate != null">in_date = #{inDate},</if>
</trim>
where only_identity = #{onlyIdentity}
</update>
@@ -81,4 +86,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{onlyIdentity}
</foreach>
</delete>
</mapper>
</mapper>

View File

@@ -21,8 +21,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTrayMsgList" parameterType="TrayMsg" resultMap="TrayMsgResult">
select t.id, t.tray_code, t.stockin_detail_id, t.quantity,d.product_name,t.warehouse_id,w.warehouse_name,w.warehouse_type from tray_msg t
left join in_stockin_detail d on t.stockin_detail_id = d.stockin_detail_id
left join bas_product p on d.product_id=p.product_id
left join in_stockin_detail_n d on t.stockin_detail_id = d.stockin_detail_id
left join bas_product p on d.product_model=p.product_id
left join bas_warehouse w on t.warehouse_id=w.warehouse_id
<where>
<if test="trayCode != null and trayCode != ''"> and t.tray_code = #{trayCode}</if>

View File

@@ -439,8 +439,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 已移除 update set for stacking_id -->
<if test="productId != null">product_id = #{productId},</if>
<if test="productName != null">product_name = #{productName},</if>
<!-- 以下为非 bas_stock 字段,注释保留 -->
<!-- <if test="productName != null">product_name = #{productName},</if> -->
<!-- <if test="voltage != null">voltage = #{voltage},</if> -->
<!-- power 字段已移除 -->
<!-- <if test="netWeight != null">net_weight = #{netWeight},</if> -->