add:平板移库

This commit is contained in:
2025-09-08 18:57:26 +08:00
parent 35dbb08eb5
commit 08e7c87012
7 changed files with 296 additions and 72 deletions

View File

@@ -42,4 +42,11 @@ public class AcsToWmsController {
return new ResponseEntity<>(acsToWmsService.resultCar(whereJson), HttpStatus.OK);
}
@PostMapping("/resultWeigh")
@Log(value = "ACS给WMS反馈称重重量")
@SaIgnore
public ResponseEntity<Object> resultWeigh(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(acsToWmsService.resultWeigh(whereJson), HttpStatus.OK);
}
}

View File

@@ -35,4 +35,16 @@ public interface AcsToWmsService {
* @return BaseResponse
*/
BaseResponse resultCar(JSONObject whereJson);
/**
* ACS客户端--->WMS服务端
* ACS给WMS反馈称重重量
* @param whereJson {
* task_id: 任务标识
* task_code: 任务编码
* weigh_qty: 称重重量
* }
* @return BaseResponse
*/
BaseResponse resultWeigh(JSONObject whereJson);
}

View File

@@ -127,4 +127,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
}
return BaseResponse.responseOk();
}
@Override
@Transactional(rollbackFor = Exception.class)
public BaseResponse resultWeigh(JSONObject whereJson) {
return null;
}
}

View File

@@ -2,11 +2,14 @@ package org.nl.wms.pda.large_material_box.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils;
@@ -19,18 +22,15 @@ import org.nl.wms.pdm_manage.service.IPdmBomCallMaterialDtlService;
import org.nl.wms.pdm_manage.service.IPdmBomCallMaterialService;
import org.nl.wms.pdm_manage.service.dao.PdmBomCallMaterial;
import org.nl.wms.pdm_manage.service.dao.PdmBomCallMaterialDtl;
import org.nl.wms.warehouse_management.enums.IOSConstant;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.nl.wms.warehouse_management.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_management.service.IOutBillService;
import org.nl.wms.warehouse_management.service.IRawAssistIStorService;
import org.nl.wms.warehouse_management.service.dao.GroupPlate;
import org.nl.wms.warehouse_management.service.dao.IOStorInv;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_management.service.dao.IOStorInvDtl;
import org.nl.wms.warehouse_management.service.*;
import org.nl.wms.warehouse_management.service.dao.*;
import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDisMapper;
import org.nl.wms.warehouse_management.service.dao.mapper.IOStorInvDtlMapper;
import org.nl.wms.warehouse_management.service.dao.mapper.StIvtCheckdtlMapper;
import org.nl.wms.warehouse_management.service.dao.mapper.StIvtMoveinvdtlMapper;
import org.nl.wms.warehouse_management.service.dto.MoveInsertDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -78,6 +78,14 @@ public class PadLargeMaterialBoxServiceImpl implements PdaLargeMaterialBoxServic
private IRawAssistIStorService rawAssistIStorService;
@Autowired
private IPdmBomCallMaterialDtlService pdmBomCallMaterialDtlService;
@Autowired
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
@Autowired
private IStIvtMoveinvdtlService iStIvtMoveinvdtlService;
@Autowired
private IStIvtMoveinvService iStIvtMoveinvService;
@Autowired
private IMdPbMeasureunitService iMdPbMeasureunitService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -412,9 +420,158 @@ public class PadLargeMaterialBoxServiceImpl implements PdaLargeMaterialBoxServic
@Override
public PdaResponse materialBoxMoveConfirm(JSONObject reqParam) {
JSONObject jsonOut = reqParam.getJSONArray("rows_out").toJavaList(JSONObject.class).get(0);
JSONObject jsonIn = reqParam.getJSONArray("rows_in").toJavaList(JSONObject.class).get(0);
// 判断移出货位是库存物料
if (ObjectUtil.isEmpty(jsonOut.getString("qty"))) {
throw new BadRequestException("请选择库内库存物料!");
}
// 判断是否有单据
if (ObjectUtil.isNotEmpty(jsonOut.getString("moveinv_id"))) {
// 查询移入货位
Structattr attrIn = structattrService.getByCode(jsonIn.getString("struct_code"));
// 调用移库单确认
StIvtMoveinvdtl dtlDao = iStIvtMoveinvdtlService.getById(jsonOut.getString("moveinvdtl_id"));
// 判断移入货位是否是空载具
if (!attrIn.getIs_emptyvehicle().equals(IOSConstant.ONE) && ObjectUtil.isNotEmpty(attrIn.getStoragevehicle_code())) {
// 更新移入库存信息
iMdPbStoragevehicleextService.update(
new UpdateWrapper<MdPbStoragevehicleext>().lambda()
.set(MdPbStoragevehicleext::getCanuse_qty, NumberUtil.add(jsonOut.getBigDecimal("qty"),jsonIn.getBigDecimal("qty")))
.eq(MdPbStoragevehicleext::getStoragevehicle_code, jsonIn.getString("storagevehicle_code"))
.eq(MdPbStoragevehicleext::getMaterial_id, jsonIn.getString("material_id"))
.eq(MdPbStoragevehicleext::getPcsn, jsonIn.getString("pcsn"))
);
// 更新组盘信息
mdPbGroupplateService.update(
new UpdateWrapper<GroupPlate>().lambda()
.set(GroupPlate::getQty, NumberUtil.add(jsonOut.getBigDecimal("qty"),jsonIn.getBigDecimal("qty")))
.eq(GroupPlate::getGroup_id, jsonIn.getString("group_id"))
);
// 删除移出货位组盘信息
mdPbGroupplateService.removeById(jsonOut.getString("group_id"));
// 删除库存信息
iMdPbStoragevehicleextService.remove(
new QueryWrapper<MdPbStoragevehicleext>().lambda()
.eq(MdPbStoragevehicleext::getStoragevehicle_code, jsonOut.getString("storagevehicle_code"))
);
// 更新移出仓位为空载具
Structattr attrOutNew = structattrService.getByCode(jsonOut.getString("struct_code"));
attrOutNew.setIs_emptyvehicle(IOSConstant.ONE);
structattrService.updateById(attrOutNew);
dtlDao.setIs_update_point(IOSConstant.ZERO);
}
iStIvtMoveinvService.confirmTask(dtlDao);
} else {
// 创建移库单据并确认
createPdaMove(jsonOut,jsonIn);
}
return PdaResponse.requestOk();
}
/**
* 创建移库单据
* @param jsonOut 移出数据
* @param jsonIn 移入数据
*/
private void createPdaMove(JSONObject jsonOut, JSONObject jsonIn) {
// 查询移出货位
Structattr attrOut = structattrService.getByCode(jsonOut.getString("struct_code"));
if (!attrOut.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
throw new BadRequestException("当前移出货位被锁定!");
}
// 查询移入货位
Structattr attrIn = structattrService.getByCode(jsonIn.getString("struct_code"));
if (!attrIn.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
throw new BadRequestException("当前移入货位被锁定!");
}
// 组织主表
MoveInsertDto moveInsertDto = new MoveInsertDto();
moveInsertDto.setBill_type(IOSEnum.MOVE_BILL_TYPE.code("库内移库"));
moveInsertDto.setBiz_date(DateUtil.today());
moveInsertDto.setStor_id(attrOut.getStor_id());
moveInsertDto.setTotal_qty(jsonOut.getBigDecimal("qty"));
moveInsertDto.setDetail_count(BigDecimal.ONE);
moveInsertDto.setBill_status(IOSEnum.MOVE_MST_STATUS.code("生成"));
moveInsertDto.setRemark("由平板移库创建!");
// 组织明细
List<JSONObject> dtlList = new ArrayList<>();
JSONObject jsonDtl = new JSONObject();
jsonDtl.put("turnout_sect_code", attrOut.getSect_code());
jsonDtl.put("turnout_struct_code", attrOut.getStruct_code());
MdMeMaterialbase materDao = mdMeMaterialbaseService.getById(jsonOut.getString("material_id"));
jsonDtl.put("material_code", materDao.getMaterial_code());
jsonDtl.put("material_id", materDao.getMaterial_id());
jsonDtl.put("pcsn", jsonOut.getString("pcsn"));
MdPbMeasureunit unitDao = iMdPbMeasureunitService.getByCode("KG");
jsonDtl.put("qty_unit_id", unitDao.getMeasure_unit_id());
jsonDtl.put("qty_unit_name", unitDao.getUnit_name());
jsonDtl.put("qty", jsonOut.getBigDecimal("qty"));
jsonDtl.put("turnin_sect_code", attrIn.getSect_code());
jsonDtl.put("turnin_struct_code", attrIn.getStruct_code());
jsonDtl.put("work_status", IOSEnum.MOVE_DTL_STATUS.code("生成"));
jsonDtl.put("storagevehicle_code", attrOut.getStoragevehicle_code());
jsonDtl.put("storagevehicle_code2", attrIn.getStoragevehicle_code());
dtlList.add(jsonDtl);
moveInsertDto.setTableData(dtlList);
// 调用移库单新增
String move_id = iStIvtMoveinvService.create(moveInsertDto);
StIvtMoveinvdtl paramDtl = iStIvtMoveinvdtlService.list(
new QueryWrapper<StIvtMoveinvdtl>().lambda()
.eq(StIvtMoveinvdtl::getMoveinv_id, move_id)
).get(0);
// 判断移入货位是否是空载具
if (!attrIn.getIs_emptyvehicle().equals(IOSConstant.ONE) && ObjectUtil.isNotEmpty(attrIn.getStoragevehicle_code())) {
// 更新移入库存信息
iMdPbStoragevehicleextService.update(
new UpdateWrapper<MdPbStoragevehicleext>().lambda()
.set(MdPbStoragevehicleext::getCanuse_qty, NumberUtil.add(jsonOut.getBigDecimal("qty"),jsonIn.getBigDecimal("qty")))
.eq(MdPbStoragevehicleext::getStoragevehicle_code, jsonIn.getString("storagevehicle_code"))
.eq(MdPbStoragevehicleext::getMaterial_id, jsonIn.getString("material_id"))
.eq(MdPbStoragevehicleext::getPcsn, jsonIn.getString("pcsn"))
);
// 更新组盘信息
mdPbGroupplateService.update(
new UpdateWrapper<GroupPlate>().lambda()
.set(GroupPlate::getQty, NumberUtil.add(jsonOut.getBigDecimal("qty"),jsonIn.getBigDecimal("qty")))
.eq(GroupPlate::getGroup_id, jsonIn.getString("group_id"))
);
// 删除库存信息
iMdPbStoragevehicleextService.remove(
new QueryWrapper<MdPbStoragevehicleext>().lambda()
.eq(MdPbStoragevehicleext::getStoragevehicle_code, jsonOut.getString("storagevehicle_code"))
);
// 删除移出货位组盘信息
mdPbGroupplateService.removeById(jsonOut.getString("group_id"));
// 更新移出仓位为空载具
Structattr attrOutNew = structattrService.getByCode(jsonOut.getString("struct_code"));
attrOutNew.setIs_emptyvehicle(IOSConstant.ONE);
structattrService.updateById(attrOutNew);
paramDtl.setIs_update_point(IOSConstant.ZERO);
}
// 确认移库单据
iStIvtMoveinvService.confirmTask(paramDtl);
}
@Override
public PdaResponse materialBoxInventoryConfirm(JSONObject reqParam) {
return PdaResponse.requestOk();
@@ -600,9 +757,15 @@ public class PadLargeMaterialBoxServiceImpl implements PdaLargeMaterialBoxServic
String type = reqParam.getString("type");
Assert.notBlank(type, "移库类型不能为空!");
String vehicleStructCode = reqParam.getString("vehicleStructCode");
Assert.notBlank(vehicleStructCode, "载具编码或点位编码不能为空!");
if(ObjectUtil.isEmpty(vehicleStructCode)) {
if (ObjectUtil.isEmpty(reqParam.getString("moveinvdtl_id"))) {
throw new BadRequestException("载具编码或点位编码不能为空!");
}
}
JSONObject param = new JSONObject();
param.put("vehicleStructCode", vehicleStructCode);
param.put("moveinvdtl_id", reqParam.getString("moveinvdtl_id"));
List<Map<String, Object>> mapList = new ArrayList<>();
if (StrUtil.equals("1", type)) {
mapList = stIvtMoveinvdtlMapper.getOutMoveDtlByVehicleStructCode(param);

View File

@@ -1,5 +1,6 @@
package org.nl.wms.warehouse_management.service.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -119,5 +120,11 @@ public class StIvtMoveinvdtl implements Serializable {
*/
private String remark;
/**
* 是否更新点位
*/
@TableField(exist = false)
private String is_update_point;
}

View File

@@ -41,59 +41,70 @@
<select id="getOutMoveDtlByVehicleStructCode" resultType="java.util.Map">
SELECT
dtl.moveinvdtl_id,
dtl.moveinv_id,
dtl.turnout_struct_code as struct_code,
dtl.storagevehicle_code as storagevehicle_code,
dtl.pcsn,
dtl.qty,
mb.material_id,
mb.material_code,
mb.material_name,
gp.group_id,
gp.produce_time,
gp.bake_num,
sb.supp_code,
sb.supp_name
FROM st_ivt_moveinvdtl dtl
LEFT JOIN md_pb_groupplate gp ON dtl.storagevehicle_code = gp.storagevehicle_code
LEFT JOIN md_me_materialbase mb ON mb.material_code = dtl.material_code
LEFT JOIN md_cs_supplierbase sb ON sb.supp_code = gp.supp_code
attr.struct_code,
attr.storagevehicle_code,
dtl.moveinv_id,
dtl.moveinvdtl_id,
gp.pcsn,
gp.qty,
mb.material_id,
mb.material_code,
mb.material_name,
gp.produce_time,
gp.bake_num,
gp.group_id,
sb.supp_code,
sb.supp_name
FROM st_ivt_structattr attr
LEFT JOIN st_ivt_moveinvdtl dtl ON dtl.storagevehicle_code = attr.storagevehicle_code AND dtl.work_status = '10'
LEFT JOIN md_pb_groupplate gp ON attr.storagevehicle_code = gp.storagevehicle_code AND gp.status = '2'
LEFT JOIN md_me_materialbase mb ON mb.material_id = gp.material_id
LEFT JOIN md_cs_supplierbase sb ON sb.supp_code = gp.supp_code
<where>
dtl.work_status = '10' AND gp.is_delete = '0' AND gp.status = '2'
<if test="param.vehicleStructCode != null and param.vehicleStructCode != ''">
AND (
dtl.storagevehicle_code = #{param.vehicleStructCode}
OR dtl.turnout_struct_code = #{param.vehicleStructCode}
)
</if>
1 = 1
<if test="param.vehicleStructCode != null and param.vehicleStructCode != ''">
AND (
attr.storagevehicle_code = #{param.vehicleStructCode}
OR attr.struct_code = #{param.vehicleStructCode}
)
</if>
</where>
</select>
<select id="getInMoveDtlByVehicleStructCode" resultType="java.util.Map">
SELECT
dtl.turnin_struct_code as struct_code,
dtl.storagevehicle_code2 as storagevehicle_code,
dtl.pcsn,
dtl.qty,
mb.material_code,
mb.material_name,
gp.produce_time,
gp.bake_num,
sb.supp_code,
sb.supp_name
FROM st_ivt_moveinvdtl dtl
LEFT JOIN md_pb_groupplate gp ON dtl.storagevehicle_code2 = gp.storagevehicle_code
LEFT JOIN md_me_materialbase mb ON mb.material_code = dtl.material_code
LEFT JOIN md_cs_supplierbase sb ON sb.supp_code = gp.supp_code
attr.struct_code,
attr.storagevehicle_code,
dtl.moveinv_id,
dtl.moveinvdtl_id,
gp.pcsn,
gp.qty,
mb.material_id,
mb.material_code,
mb.material_name,
gp.produce_time,
gp.bake_num,
gp.group_id,
sb.supp_code,
sb.supp_name
FROM st_ivt_structattr attr
LEFT JOIN st_ivt_moveinvdtl dtl ON dtl.storagevehicle_code2 = attr.storagevehicle_code AND dtl.work_status = '10'
LEFT JOIN md_pb_groupplate gp ON attr.storagevehicle_code = gp.storagevehicle_code
LEFT JOIN md_me_materialbase mb ON mb.material_id = gp.material_id
LEFT JOIN md_cs_supplierbase sb ON sb.supp_code = gp.supp_code
<where>
dtl.work_status = '10' AND gp.is_delete = '0' AND gp.status = '2'
1 = 1
<if test="param.vehicleStructCode != null and param.vehicleStructCode != ''">
AND (
dtl.storagevehicle_code2 = #{param.vehicleStructCode}
OR dtl.turnin_struct_code = #{param.vehicleStructCode}
attr.storagevehicle_code = #{param.vehicleStructCode}
OR attr.struct_code = #{param.vehicleStructCode}
)
</if>
<if test="param.moveinvdtl_id != null and param.moveinvdtl_id != ''">
AND
dtl.moveinvdtl_id = #{param.moveinvdtl_id}
</if>
</where>
</select>
</mapper>

View File

@@ -200,29 +200,47 @@ public class StIvtMoveinvServiceImpl extends ServiceImpl<StIvtMoveinvMapper, StI
Structattr inStruct = iStructattrService.getByCode(dtlDao.getTurnin_struct_code());
// 查询移出货位
Structattr outStruct = iStructattrService.getByCode(dtlDao.getTurnout_struct_code());
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnout_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code2())
.set(Structattr::getIs_emptyvehicle,
inStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
if (ObjectUtil.isEmpty(dtlDao.getIs_update_point()) || !dtlDao.getIs_update_point().equals(IOSConstant.ZERO)) {
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnout_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code2())
.set(Structattr::getIs_emptyvehicle,
inStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnin_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code())
.set(Structattr::getIs_emptyvehicle,
outStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnin_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code())
.set(Structattr::getIs_emptyvehicle,
outStruct.getIs_emptyvehicle().equals(IOSConstant.IS_DELETE_YES) ? IOSConstant.IS_DELETE_YES
: IOSConstant.IS_DELETE_NO
)
);
} else {
// 更新起点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnout_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getIs_emptyvehicle, IOSConstant.IS_DELETE_YES)
);
// 更新终点
iStructattrService.update(
new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, dtlDao.getTurnin_struct_code())
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getIs_emptyvehicle,IOSConstant.IS_DELETE_NO)
);
}
// 更新明细状态
dtlDao.setWork_status(IOSEnum.MOVE_DTL_STATUS.code("完成"));