add:增加料箱/托盘称重检测功能。

This commit is contained in:
2026-01-28 20:22:06 +08:00
parent 3a8ca11b88
commit de0e4b62da
18 changed files with 391 additions and 115 deletions

View File

@@ -62,7 +62,7 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
String start_point = param.getString("start_point");
String errorTask = param.getString("errorTask");
log.info("限位策略:起点为" + start_point + ",载具号:" + vehicleCode + "执行策略前仓位位数为:" + list.size() + ",第一个仓位为:" + list.get(0).getStruct_code());
if ((StringUtils.isNotBlank(start_point) || StringUtils.isNotBlank(errorTask))) {
if ((StringUtils.isNotBlank(start_point) || StringUtils.isNotBlank(errorTask))&&!vehicleCode.contains("T")) {
list = list.stream().filter(struct -> struct.getCol_num() > 2).collect(Collectors.toList());
if ("1109".equals(start_point)) {
log.info("限位策略起点为1109载具号" + vehicleCode + "排除小于3排的仓位成功");
@@ -98,6 +98,7 @@ public class LimitStorageRuleHandler extends Decisioner<StIvtStructattr, JSONObj
vehicle.setW(0);
vehicle.setL(0);
vehicle.setWeight(0);
}
BmVehicleInfo finalVehicle = vehicle;
Predicate<StIvtStructattr> eqLimt = stIvtStructattr -> {

View File

@@ -62,6 +62,7 @@ public class InStorageTask extends AbstractTask {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + list.get(0).getTask_code());
}else {
task.setStatus(StatusEnum.FORM_STATUS.code("待回传"));
task.setRemark("该任务属于混托任务多个任务中只需数据回传的任务");
}
}
task.setId(IdUtil.getStringId());

View File

@@ -66,37 +66,42 @@ public class PalletInStorageTask extends AbstractTask {
String point_code1 = data.getString("start_point");
String vehicle_code = data.getString("vehicle_code");
String h = data.getString("height");
String w = data.getString("weight");
if (StringUtils.isEmpty(point_code1)){
throw new BadRequestException("申请任务失败:请求参数点位数据异常");
throw new BadRequestException("weightError-申请任务失败:请求参数点位数据异常");
}
if (StringUtils.isEmpty(vehicle_code)){
throw new BadRequestException("申请任务失败:请求参数托盘数据异常");
throw new BadRequestException("weightError-申请任务失败:请求参数托盘数据异常");
}
if (StringUtils.isEmpty(h)){
throw new BadRequestException("申请任务失败:请求参数高度点位数据异常");
throw new BadRequestException("weightError-申请任务失败:请求参数高度点位数据异常");
}
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.getOne(new QueryWrapper<BmVehicleInfo>()
.eq("vehicle_code", vehicle_code));
if (vehicleInfo == null) {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "信息不存在");
throw new BadRequestException("weightError-申请任务失败:载具" + vehicle_code + "信息不存在");
}
if (!(vehicleInfo.getWeight() > 0)) {
throw new BadRequestException("weightError-"+String.format(vehicle_code + "的重量未维护,请在载具管理中维护该类型载具重量。"));
}
List<MdPbVehicleMaterVo> item = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code);
if (CollectionUtils.isEmpty(item)) {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "载具物料信息信息不存在");
throw new BadRequestException("weightError-申请任务失败:载具" + vehicle_code + "载具物料信息信息不存在");
}
List<MdPbVehicleMaterVo> newVehicleMater =new ArrayList<>();
iMdGruopDickService.pdaInWeightCheck(point_code1,w,vehicleInfo.getWeight(),item);
List<MdPbVehicleMaterVo> newVehicleMater;
//混托任务判断
if (item.get(0).getVehicle_code().contains("T")&&item.size() > 1) {
newVehicleMater= item.stream().filter(r -> r.getNeed_pick() == null || !r.getNeed_pick()).collect(Collectors.toList());
if (newVehicleMater.size() ==item.size()) {
newVehicleMater.get(0).setNeed_pick(true);
}else{
item.stream().filter(r -> r.getNeed_pick() != null && r.getNeed_pick()).findFirst().ifPresent(newVehicleMater::add);
item.stream().filter(r -> r.getNeed_pick() != null&&StringUtils.isNotBlank(r.getGroup_id())&&r.getNeed_pick()).findFirst().ifPresent(newVehicleMater::add);
}
} else {
newVehicleMater = item;
}
newVehicleMater.forEach(r -> {
for (MdPbVehicleMaterVo r : newVehicleMater) {
String remark = r.getRemark();
String isCheck = StringUtils.isNotBlank(r.getIs_check()) ? "1" : r.getIs_check();
if ("空托盘入库".equals(remark)) {
@@ -120,7 +125,8 @@ public class PalletInStorageTask extends AbstractTask {
String groupId = r.getGroup_id();
MdGruopDick mst = iMdGruopDickService.getById(groupId);
if (mst == null) {
throw new BadRequestException("申请任务失败,载具没有组盘信息!");
continue;
//throw new BadRequestException("申请任务失败,载具没有组盘信息!");
}
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.lt("status", StatusEnum.FORM_STATUS.code("完成")).select("vehicle_code"));
@@ -129,14 +135,6 @@ public class PalletInStorageTask extends AbstractTask {
throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + list.get(0).getTask_code());
}
}
// SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper<SchBaseTask>()
// .eq("vehicle_code", vehicle_code).select("task_code","vehicle_code")
// .lt("status", StatusEnum.FORM_STATUS.code("完成")));
// if (schBaseTask != null) {
// if (!schBaseTask.getVehicle_code().contains("T")) {
// throw new BadRequestException("申请任务失败:载具" + vehicle_code + "已经存任务" + schBaseTask.getTask_code());
// }
// }
iBmVehicleInfoService.update(new UpdateWrapper<BmVehicleInfo>()
.set("h", Integer.valueOf(h))
.set("update_time", DateUtil.now())
@@ -157,7 +155,7 @@ public class PalletInStorageTask extends AbstractTask {
.build("md_pb_vehicleMater", item)
);
}
});
}
List<SchBaseTask> list = iSchBaseTaskService.list(new QueryWrapper<SchBaseTask>().eq("vehicle_code", vehicle_code)
.lt("status", StatusEnum.FORM_STATUS.code("完成")));
if (ObjectUtils.isNotEmpty(list)) {

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
@@ -45,6 +46,7 @@ public class AcsToWmsService {
private ISchBasePointService iSchBasePointService;
public String applyTask(String service, String type, JSONObject data, InteracteDto<Map> param) {
String errorMsg = null;
if ("InStorage".equals(service)) {
try {
JSONObject task = applyTaskMap.get(type).createTask(data);
@@ -58,7 +60,14 @@ public class AcsToWmsService {
String title = param.getType() + DateUtil.today() + param.getData().toString();
iSchBasePointService.sendErrorMsg("1", title, "任务申请失败,申请参数为:" + JSON.toJSONString(param) + "请查看错误日志" + e);
}
throw new BadRequestException("申请任务失败,申请参数为:" + JSON.toJSONString(param) + "请查看错误日志:" + e);
if (StringUtils.isNotBlank(e.getMessage())) {
if (e.getMessage().contains("weightError")) {
errorMsg = e.getMessage().substring(e.getMessage().indexOf("weightError"));
} else {
errorMsg = "申请任务失败,申请参数为:" + JSON.toJSONString(param) + "请查看错误日志:" + e;
}
}
throw new BadRequestException(errorMsg);
}
}
return null;

View File

@@ -156,5 +156,10 @@ public class SyncErpService {
return erpServiceUtils.queryBills(query);
}
}

View File

@@ -49,4 +49,14 @@ public interface IMdGruopDickService extends IService<MdGruopDick> {
*/
List<MdPbVehicleMaterVo> getGroupDtl(String vehicle);
/**
* 校验称重是否超出误差范围
* deviceCode 点位名称
* w 称重
* 载具单重
* 组盘信息
*/
void pdaInWeightCheck(String deviceCode, String w,Integer weight, List<MdPbVehicleMaterVo> item);
}

View File

@@ -25,6 +25,7 @@ import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.external_system.dto.InteracteDto;
import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService;
import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution;
import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService;
@@ -38,7 +39,10 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService;
import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.nl.wms.system_manage.service.quartz.task.SyncErpBillsScheduleService;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -63,7 +67,8 @@ import java.util.stream.Collectors;
@Service
public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGruopDick> implements IMdGruopDickService {
@Autowired
private ISysParamService iSysParamService;
@Autowired
private IMdPbVehicleMaterService iMdPbVehicleMaterService;
@Autowired
@@ -243,6 +248,10 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
}
JSONObject item0 = new JSONObject(tableData.get(0));
String vehicle0 = item0.getString("vehicle_code");
if (StringUtils.isBlank(vehicle0)) {
throw new BadRequestException("组盘失败:载具号不能为空!");
}
vehicle0 = vehicle0.trim();
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicle0);
if (vehicleInfo == null) {
throw new BadRequestException("组盘失败:载具" + vehicle0 + "信息不存在请在载具信息中维护");
@@ -271,14 +280,14 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
throw new BadRequestException("入库失败:当前仓库可用库位小于" + DictConstantPool.STRUCT_COUNT);
}
}
}, StatusEnum.STRATEGY_TYPE.code("入库")+forms.getString("stor_code"),5);
}, StatusEnum.STRATEGY_TYPE.code("入库") + forms.getString("stor_code"), 5);
String now = DateUtil.now();
forms.put("create_name",SecurityUtils.getCurrentNickName());
forms.put("create_name", SecurityUtils.getCurrentNickName());
forms.put("create_time", now);
forms.put("status", StatusEnum.FORM_STATUS.code("生成"));
List<MdPbVehicleMater> vehicleMaters = new ArrayList<>();
Map<String, MdGruopDick> map = new HashMap<>();
if (!CollectionUtils.isEmpty(forms)){
if (!CollectionUtils.isEmpty(forms)) {
for (int i = 0; i < tableData.size(); i++) {
Map itemMap = tableData.get(i);
JSONObject item = new JSONObject(itemMap);
@@ -522,14 +531,140 @@ public class MdGruopDickServiceImpl extends ServiceImpl<MdGruopDickMapper, MdGru
this.saveBatch(groups);
}
}catch (Exception ex){
throw new BadRequestException("导入失败"+ex.getMessage());
throw new BadRequestException("导入失败" + ex.getMessage());
}
}
@Override
public List<MdPbVehicleMaterVo> getGroupDtl(String vehicle_code) {
if (StringUtils.isEmpty(vehicle_code)){
if (StringUtils.isEmpty(vehicle_code)) {
return new ArrayList<>();
}
return iMdPbVehicleMaterService.getVehicleMaters(vehicle_code);
}
/**
* 校验称重是否超出误差范围
*
* @param deviceCode 点位名称
* @param weight 载具皮重
* @param item 组盘物料信息
*/
@Override
public void pdaInWeightCheck(String deviceCode, String w, Integer weight, List<MdPbVehicleMaterVo> item) {
//称重检测校验是否开启
Param isCheck = iSysParamService.findByCode("weight_check");
if ("1".equals(isCheck.getValue())) {
if (CollectionUtils.isEmpty(item)) {
return;
}
//实际称重kg
BigDecimal actualWeightKg = BigDecimal.ZERO;
//同步并校验物料单重
K3CloudApi k3CloudApi = erpServiceUtils.getCloudApi();
SyncFormMapping syncFormMapping = syncFormMappingServiceImpl.getOne(
new LambdaQueryWrapper<SyncFormMapping>()
.in(SyncFormMapping::getForm_type, "BD_MATERIAL")
);
String materialMappingString = JSON.toJSONString(syncFormMapping.getMapping_json());
for (MdPbVehicleMaterVo r : item) {
MdMeMaterialbase materialInfo =
syncErpBillsScheduleService.queryMaterialResult(
materialMappingString,
"BD_MATERIAL",
false,
r.getMaterial_code(),
k3CloudApi
);
if (materialInfo == null) {
throw new BadRequestException(
"weightError-载具" + item.get(0).getVehicle_code()
+ "上的物料:" + r.getMaterial_code()
+ "在ERP系统上检索不到相关物料信息请检查"
);
}
r.setSingle_weight(materialInfo.getSingle_weight());
}
//过滤出需要称重校验的物料(单重 > 0
List<MdPbVehicleMaterVo> validItems = item.stream()
.filter(r -> r.getSingle_weight() != null
&& r.getSingle_weight().compareTo(BigDecimal.ZERO) > 0)
.collect(Collectors.toList());
if (validItems.isEmpty()) {
return;
}
if (StringUtils.isNotBlank(w)) {
try {
actualWeightKg = new BigDecimal(w.trim());
} catch (Exception e) {
throw new BadRequestException("weightError-称重数据格式非法:" + deviceCode + w);
}
} else {
try {
InteracteDto<Object> dto = InteracteDto.builder()
.service("wmsToAcsService")
.trace_id(MDC.get("trace_id"))
.type("getWeight")
.data(new JSONObject().fluentPut("device_code", deviceCode))
.build();
TableDataInfo result = InterationUtil.notifyExt(
"/api/wmsToAcs/apply",
(JSONObject) JSON.toJSON(dto)
);
if ("200".equals(result.getCode()) && result.getData() != null) {
JSONObject data = JSONObject.parseObject(result.getData().toString());
String weightStr = data.getString("weight");
if (ObjectUtil.isNotEmpty(weightStr)) {
actualWeightKg = new BigDecimal(weightStr.trim());
}
}
} catch (Exception ex) {
log.error("获取称重失败" + deviceCode + ex.getMessage());
}
}
if (actualWeightKg.compareTo(BigDecimal.ZERO) <= 0) {
throw new BadRequestException(
String.format("weightError-该点位:%s反馈称重为0称重异常请检查。", deviceCode)
);
}
//查询出入库配置规则
Param byCode = iSysParamService.findByCode(item.get(0).getVehicle_code().contains("T") ? "tp_range" : "lx_range");
if (byCode == null || StringUtils.isEmpty(byCode.getValue())) {
throw new BadRequestException("weightError-未配置托盘或料箱的误差值,请检查。");
}
// 误差值
BigDecimal relativeError = new BigDecimal(byCode.getValue().trim());
// 物料理论总重量 = Σ(单重 × 数量)
BigDecimal materialWeight = validItems.stream()
.map(r -> {
BigDecimal singleWeight = r.getSingle_weight();
// 辅助单位包含 kg
if (StringUtils.isNotBlank(r.getAssist_unit_id())) {
if (r.getAssist_unit_id().toLowerCase().contains("kg")) {
singleWeight = singleWeight.multiply(BigDecimal.valueOf(1000));
}
}
// 单重 × 数量
return singleWeight.multiply(r.getQty());
})
.reduce(BigDecimal.ZERO, BigDecimal::add);
//实际称重换算克
BigDecimal actualWeightG = actualWeightKg.multiply(BigDecimal.valueOf(1000));
// 净重 = 实际称重 - 载具皮重
BigDecimal netWeight = actualWeightG.subtract(BigDecimal.valueOf(weight));
if (netWeight.compareTo(BigDecimal.ZERO) < 0) {
netWeight = BigDecimal.ZERO;
}
// 差异重量 = 净重 - 理论重量 - 误差
BigDecimal diffWeight = netWeight
.subtract(materialWeight)
.abs();
if (diffWeight.compareTo(relativeError) > 0) {
throw new BadRequestException(
String.format("weightError-该载具:%s称重重量为%s与物料实际重量:%s进行对比已超过误差值%sg不允许入库请检查。",
item.get(0).getVehicle_code(), netWeight, materialWeight, diffWeight)
);
}
}
}
}

View File

@@ -31,7 +31,7 @@ public interface IMdPbVehicleMaterService extends IService<MdPbVehicleMater> {
/**
* 载具编码与id对应关系
* @param vehicle_code
* @return
* @return 1
*/
Map<String, String> getVehicleCode2Id(String material_id,String...vehicle_code);

View File

@@ -17,13 +17,14 @@
<result property="material_name" column="material_name"/>
<result property="material_spec" column="material_spec"/>
<result property="single_weight" column="single_weight"/>
<result property="assist_unit_id" column="assist_unit_id"/>
<result property="unit_name" column="unit_name"/>
<result property="form_data" column="form_data"
typeHandler="org.nl.common.domain.mybatis.handler.FastjsonSortTypeHandler"/>
</resultMap>
<select id="getVehicleMaters"
resultMap="VoResultMap">
select md_pb_vehicleMater.*, material_code, material_name, material_spec
select md_pb_vehicleMater.*, material_code, material_name, material_spec,single_weight,assist_unit_id
from md_pb_vehicleMater
left join md_me_materialbase
on md_pb_vehicleMater.material_id = md_me_materialbase.material_id

View File

@@ -22,7 +22,8 @@ public class MdPbVehicleMaterVo extends MdPbVehicleMater {
private String material_code;
private String material_name;
private String material_spec;
private String single_weight;
//辅助重量
private String assist_unit_id;
private BigDecimal single_weight;
private String unit_name;
}

View File

@@ -6,12 +6,14 @@ import cn.hutool.core.lang.Assert;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.anno.Log;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.ErpServiceUtils;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.RedissonUtils;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
@@ -20,6 +22,7 @@ import org.nl.wms.dispatch_manage.point.service.ISchBasePointService;
import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint;
import org.nl.wms.dispatch_manage.task.handler.impl.TranforTask;
import org.nl.wms.external_system.acs.service.WmsToAcsService;
import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService;
import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService;
import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo;
import org.nl.wms.pda_manage.devicemanage.dto.ComTp;
@@ -40,11 +43,14 @@ import java.util.List;
import java.util.Map;
/**
*设备操控
* 设备操控
*
* @author generator
* @since 2024-03-28
*/
@RestController
@Slf4j
@RequestMapping("api/deviceManage")
public class DeviceManageController {
@@ -60,8 +66,14 @@ public class DeviceManageController {
private TranforTask tranforTask;
@Autowired
private IStIvtStructattrService iStIvtStructattrService;
@Autowired
private IMdGruopDickService iMdGruopDickService;
/**
* 切换出入库模式
*
* @param form
* @return
*/
@@ -69,7 +81,7 @@ public class DeviceManageController {
@SaIgnore
@Log("切换出入库模式")
public ResponseEntity<TableDataInfo> changeModeIO(@RequestBody ComTp form) {
wmsToAcsService.changeMode(form.getDevice_code(),"switchInOut",form.getMode());
wmsToAcsService.changeMode(form.getDevice_code(), "switchInOut", form.getMode());
return new ResponseEntity<>(TableDataInfo.build(),HttpStatus.OK);
}
@@ -106,29 +118,33 @@ public class DeviceManageController {
Assert.noNullElements(new Object[]{form.getDevice_code(), form.getVehicle_code()}, "请求参数不能为空");
String device_code = form.getDevice_code();
String vehicleCode = form.getVehicle_code();
String is_check = form.getIs_check();
if (StringUtils.isBlank(is_check)) {
is_check = "1";
String isCheck = form.getIs_check();
if (StringUtils.isBlank(isCheck)) {
isCheck = "1";
}
SchBasePoint code = iSchBasePointService.getOne(new QueryWrapper<SchBasePoint>().eq("code", device_code));
if (code != null && !code.getIs_used()) {
throw new BadRequestException(String.format("输送线%s模式不正确不允许下发运动", device_code));
throw new BadRequestException("weightError-"+String.format("输送线%s模式不正确不允许下发运动", device_code));
}
BmVehicleInfo vehicleInfo = iBmVehicleInfoService.getOne(new QueryWrapper<BmVehicleInfo>()
.eq("vehicle_code", vehicleCode));
if (vehicleInfo == null) {
throw new BadRequestException(String.format(vehicleCode + "载具信息不存在"));
throw new BadRequestException("weightError-"+String.format(vehicleCode + "载具信息不存在"));
}
if (!(vehicleInfo.getWeight() > 0)) {
throw new BadRequestException("weightError-"+String.format(vehicleCode + "的重量未维护,请在载具管理中维护该类型载具重量。"));
}
List<MdPbVehicleMaterVo> item = iMdPbVehicleMaterService.getVehicleMaters(vehicleCode);
if (CollectionUtils.isEmpty(item)) {
throw new BadRequestException(String.format(vehicleCode + "载具组盘信息不存在"));
throw new BadRequestException("weightError-"+String.format(vehicleCode + "载具组盘信息不存在"));
}
for (MdPbVehicleMaterVo materVo : item) {
if (materVo.getQty().intValue() == 0) {
throw new BadRequestException(String.format(vehicleCode + "组盘异常,确认是否出库后组盘"));
throw new BadRequestException(String.format("weightError-"+vehicleCode + "组盘异常,确认是否出库后组盘"));
}
}
if ("1".equals(is_check)) {
iMdGruopDickService.pdaInWeightCheck(device_code,null,vehicleInfo.getWeight(), item);
if ("1".equals(isCheck)) {
//校验料箱是否还存在库存
RedissonUtils.lock(() -> {
QueryWrapper<StIvtStructattr> query = new QueryWrapper<StIvtStructattr>()
@@ -141,7 +157,7 @@ public class DeviceManageController {
}
}, StatusEnum.STRATEGY_TYPE.code("入库") + vehicleCode, 5);
}
wmsToAcsService.toCommand(device_code, "1", vehicleInfo.getH(),"");
wmsToAcsService.toCommand(device_code, "1", vehicleInfo.getH(), "");
return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK);
}
@PostMapping("transf")

View File

@@ -1,8 +1,15 @@
package org.nl.wms.pda_manage.iostorage.sevice;
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.kingdee.bos.webapi.sdk.K3CloudApi;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.TableDataInfo;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.ErpServiceUtils;
import org.nl.common.utils.InterationUtil;
import org.nl.common.utils.ListOf;
import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
@@ -10,15 +17,24 @@ import org.nl.wms.base_manage.measure.service.IBmMeasureUnitService;
import org.nl.wms.base_manage.measure.service.dao.BmMeasureUnit;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.external_system.dto.InteracteDto;
import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService;
import org.nl.wms.pda_manage.group.dto.GroupItemData;
import org.nl.wms.pda_manage.group.dto.MaterGroupDto;
import org.nl.wms.pda_manage.group.dto.MaterItem;
import org.nl.wms.pda_manage.iostorage.server.dto.PdaFormInMst;
import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping;
import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl;
import org.nl.wms.system_manage.service.quartz.task.SyncErpBillsScheduleService;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Service
public class PdaInIOService {
@Autowired
@@ -32,6 +48,17 @@ public class PdaInIOService {
@Autowired
IBmMeasureUnitService iBmMeasureUnitService;
@Autowired
private ErpServiceUtils erpServiceUtils;
@Autowired
private SyncFormMappingServiceImpl syncFormMappingServiceImpl;
@Lazy
@Autowired
private SyncErpBillsScheduleService syncErpBillsScheduleService;
/**
* 合格证入库
* 确认参数完整性
@@ -76,6 +103,10 @@ public class PdaInIOService {
}
String materialId = mst.getMaterial_id();
String vehicleCode = mst.getVehicle_code();
if (StringUtils.isBlank(vehicleCode)) {
throw new BadRequestException("组盘失败:载具号不能为空!");
}
vehicleCode = vehicleCode.trim();
String unitId = mst.getUnit_id();
mst.setStockId("FStockPallet".equals(mst.getStor_code()) ? "24" : "25");
if (StringUtils.isBlank(mst.getSrcBillNo())) {
@@ -139,5 +170,4 @@ public class PdaInIOService {
// });
}
}

View File

@@ -65,6 +65,7 @@
LEFT JOIN md_pb_vehicleMater ON st_ivt_structattr.vehicle_code = md_pb_vehicleMater.vehicle_code
WHERE st_ivt_structattr.vehicle_code is not null and md_pb_vehicleMater.frozen_qty = 0
and md_pb_vehicleMater.is_lock = false
and md_pb_vehicleMater.is_delete = false
<if test="stor_code != null and stor_code != ''">
and st_ivt_structattr.stor_code = #{stor_code}
</if>

View File

@@ -17,6 +17,8 @@ import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.*;
import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.decision_manage.handler.decisioner.impl.base.SameBlockNumRuleHandler;
import org.nl.wms.dispatch_manage.task.handler.impl.MoveStorageTask;
import org.nl.wms.dispatch_manage.task.handler.impl.OutStorageTask;
@@ -70,7 +72,8 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
private IMdPbVehicleMaterService vehicleMaterService;
@Autowired
private IStIvtStructivtflowService structivtflowService;
@Autowired
private IMdMeMaterialbaseService mdMeMaterialbaseService;
@Autowired
private StIvtStructattrMapper stIvtStructattrMapper;
@@ -139,6 +142,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
//更新冻结数量
for (MdPbVehicleMater vehicleMater : vehicleMaters) {
String vehicleCode = vehicleMater.getVehicle_code();
MdMeMaterialbase materialbase = mdMeMaterialbaseService.getById(vehicleMater.getMaterial_id());
BigDecimal subtract = vehicleMater.getQty().subtract(vehicleMater.getFrozen_qty());
//100-出50 = 50
UpdateWrapper<MdPbVehicleMater> update = new UpdateWrapper<MdPbVehicleMater>()
@@ -150,6 +154,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
if (subtract.intValue() > 0) {
//托盘拣选
if (vehicleCode.contains("T")) {
if (vehicleMater.getFrozen_qty().compareTo(BigDecimal.ZERO) > 0) {
String groupId = vehicleMater.getGroup_id();
MdGruopDick mst = iMdGruopDickService.getById(groupId);
if (mst != null) {
@@ -160,10 +165,9 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
.eq("id", groupId));
}
update.set("need_pick", true);
if (vehicleMater.getFrozen_qty().compareTo(BigDecimal.ZERO) > 0) {
//托盘出库提示拣选信息
if (!growth) {
update.set("remark", "该托盘需要拣选数量为:" + vehicleMater.getFrozen_qty() + ",拣选完请把托盘剩余物料拉到入库口进行回库");
update.set("remark", "该托盘需要拣选的物料为:" + materialbase.getMaterial_name() + ",物料编码为:" + materialbase.getMaterial_code() + ",数量为:" + vehicleMater.getFrozen_qty() + ",拣选完请把托盘剩余物料拉到入库口进行回库");
}
} else {
//托盘入库清除拣选信息
@@ -178,7 +182,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
//托盘整出需要扣库存,除了二楼料箱整出不扣库存,其他都扣库存
if (!("2114").equals(point_code2)) {
if (vehicleCode.contains("T")) {
update.set("remark", "该托盘需要取走全部数量,拣选数量为:" + vehicleMater.getFrozen_qty() + "拣选完该物料数量为0如果托盘不存在其他类型物料则作为空托盘使用无需回库");
update.set("remark", "该托盘需要拣选的物料为:"+materialbase.getMaterial_name()+",物料编码为:"+materialbase.getMaterial_code()+",数量为:"+ vehicleMater.getFrozen_qty() + "拣选完该物料数量为0如果托盘不存在其他类型物料则作为空托盘使用无需回库").set("need_pick",false);
}
if (!task_type.equals(StatusEnum.IOBILL_TYPE_OUT.code("盘点出库"))) {
update.set("qty", subtract);
@@ -419,7 +423,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl<StIvtStructattrMappe
@Override
public List<StructAssignQty> getStructIvtAssign(List<String> materials, String stor_code) {
if (StringUtils.isEmpty(stor_code) || materials == null || materials.size() == 0) {
throw new BadRequestException("查询可用库存失败:物料或仓库未指定");
throw new BadRequestException("查询可用库存失败:该单据的物料或仓库不属于料箱库或托盘库请检查ERP单据的物料或仓库信息是否正确");
}
List<StructAssignQty> mst_detail = this.baseMapper.getStructIvtAssign(materials, stor_code);
return mst_detail;

View File

@@ -3,19 +3,22 @@ package org.nl.wms.system_manage.service.param.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 lombok.RequiredArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.domain.entity.PageQuery;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.common.utils.SecurityUtils;
import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService;
import org.nl.wms.base_manage.vehicle.service.dao.BmVehicleInfo;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.nl.wms.system_manage.service.param.dao.mapper.SysParamMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -39,6 +42,9 @@ public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> impl
private final SysParamMapper paramMapper;
@Autowired
private IBmVehicleInfoService iBmVehicleInfoService;
@Override
public IPage<Param> queryPage(Map whereJson, PageQuery page) {
QueryWrapper<Param> queryWrapper = new QueryWrapper<>();
@@ -75,6 +81,13 @@ public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, Param> impl
param.setUpdate_name(SecurityUtils.getCurrentNickName());
param.setUpdate_time(new Date());
paramMapper.updateById(param);
if (param.getCode().contains("blx_weight") && param.getName().contains("大料箱")) {
iBmVehicleInfoService.update(new LambdaUpdateWrapper<BmVehicleInfo>().set(BmVehicleInfo::getWeight, param.getValue()).eq(BmVehicleInfo::getVehicle_type, "02"));
} else if (param.getCode().contains("mlx_weight") && param.getName().contains("中料箱")) {
iBmVehicleInfoService.update(new LambdaUpdateWrapper<BmVehicleInfo>().set(BmVehicleInfo::getWeight, param.getValue()).eq(BmVehicleInfo::getVehicle_type, "03"));
} else if (param.getCode().contains("btp_weight") && param.getName().contains("铁托盘")) {
iBmVehicleInfoService.update(new LambdaUpdateWrapper<BmVehicleInfo>().set(BmVehicleInfo::getWeight, param.getValue()).eq(BmVehicleInfo::getVehicle_type, "01"));
}
}
@Override

View File

@@ -13,14 +13,12 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.domain.exception.BadRequestException;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.*;
import org.nl.config.lucene.LuceneAppender;
import org.nl.wms.base_manage.material.service.IMdMeMaterialbaseService;
import org.nl.wms.base_manage.material.service.dao.MdMeMaterialbase;
import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc;
import org.nl.wms.config_manage.form_struc.service.impl.BmFormStrucServiceImpl;
import org.nl.wms.dispatch_manage.task.service.impl.SchBaseTaskServiceImpl;
import org.nl.wms.external_system.erp.dto.ErpQuery;
import org.nl.wms.external_system.erp.dto.ErpSec;
import org.nl.wms.pm_manage.form_data.service.IPmFormDataService;
@@ -35,6 +33,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
@@ -54,8 +53,7 @@ public class SyncErpBillsScheduleService {
@Autowired
private SyncFormMappingServiceImpl syncFormMappingServiceImpl;
@Autowired
private SchBaseTaskServiceImpl schBaseTaskServiceImpl;
@Autowired
@@ -135,7 +133,7 @@ public class SyncErpBillsScheduleService {
// 获取当前日期
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -15);
calendar.add(Calendar.DAY_OF_MONTH, -210);
String sevenDaysAgo = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
String filterString;
if (StringUtils.isNotBlank(billCode)) {
@@ -370,9 +368,6 @@ public class SyncErpBillsScheduleService {
List<Object> result = new ArrayList<>();
result.add(view.getResult().getResult());
getData(mappingJson, formType, dtlSplit, result);
} else {
ArrayList<RepoError> errors = status.getErrors();
String errorMsg = errors.stream().map(RepoError::getMessage).collect(Collectors.joining(","));
}
} catch (Exception e) {
log.error("处理ID [{}] 时出现异常: {}", fid, e.getMessage());
@@ -387,10 +382,53 @@ public class SyncErpBillsScheduleService {
}
}
public MdMeMaterialbase queryMaterialResult(String mappingJson, String formType, Boolean dtlSplit, String id, K3CloudApi cloudApi) {
MdMeMaterialbase materialBase = new MdMeMaterialbase();
try {
{
ErpQuery query = new ErpQuery();
query.setFilterString(id.contains(".") ? "FUseOrgId='750572' AND FNUMBER ='" + id + "'" : "FUseOrgId='750572' AND FMATERIALID ='" + id + "'");
query.setFormId(formType);
query.setFieldKeys("FMATERIALID");
query.setLimit(0);
String jsonString = JSON.toJSONString(query);
List<List<Object>> lists = cloudApi.executeBillQuery(jsonString);
// Set<String> exitFormDataList = pmFormDataMapper.existFormDataList();
for (List<Object> list : lists) {
for (Object r : list) {
String fid = r.toString();
if (StringUtils.isEmpty(fid)) {
log.error("单据同步失败,没有找到FID");
continue;
}
try {
OperateParam param = new OperateParam();
param.setId(fid);
OperatorResult view = cloudApi.view(formType, param);
RepoStatus status = view.getResult().getResponseStatus();
if (status.isIsSuccess()) {
List<Object> result = new ArrayList<>();
result.add(view.getResult().getResult());
materialBase = getData(mappingJson, formType, dtlSplit, result);
}
} catch (Exception e) {
log.error("处理ID [{}] 时出现异常: {}", fid, e.getMessage());
}
}
}
}
return materialBase;
} catch (Exception ex) {
log.error("同步数据时出现异常: {}", ex.getMessage());
return null;
}
}
/**
* 处理物料信息
*/
private void getData(String mappingJson, String formType, Boolean dtlSplit, List<Object> result) {
private MdMeMaterialbase getData(String mappingJson, String formType, Boolean dtlSplit, List<Object> result) {
MdMeMaterialbase materialBase = new MdMeMaterialbase();
外部:
for (Object r : result) {
try {
@@ -398,12 +436,19 @@ public class SyncErpBillsScheduleService {
List<PmFormData> formDataList = formDataService.syncAnalyse(mappingJsonArray, formType, dtlSplit, JSON.toJSONString(r));
if (ObjectUtils.isNotEmpty(formDataList)) {
String assistUint = "0";
String netWeight = "0";
JSONArray uintJsonArray = JSONObject.parseObject(JSON.toJSONString(r)).getJSONArray("MaterialStock");
if (ObjectUtils.isNotEmpty(uintJsonArray)) {
JSONObject u1 = JSONObject.parseObject(JSON.toJSONString(uintJsonArray.get(0)));
JSONObject u2 = u1.getJSONObject("AuxUnitID");
assistUint = u2 != null ? u2.getString("Number") : "0";
}
JSONArray netWeightArray = JSONObject.parseObject(JSON.toJSONString(r)).getJSONArray("MaterialBase");
if (ObjectUtils.isNotEmpty(netWeightArray)) {
JSONObject u1 = JSONObject.parseObject(JSON.toJSONString(netWeightArray.get(0)));
String u2 = u1.getString("NETWEIGHT");
netWeight = StringUtils.isNotBlank(u2) ? u2 : "0";
}
PmFormData mainFormData = formDataList.stream().filter(rs1 -> "BD_MATERIAL".equals(rs1.getForm_type())).collect(Collectors.toList()).get(0);
JSONObject object = mainFormData.getForm_data();
String m_code = object.getString("m_code");
@@ -412,6 +457,21 @@ public class SyncErpBillsScheduleService {
String m_unit = mainFormData.getUnit_id();
PmFormData formData = formDataList.stream().filter(rs1 -> "BD_MATERIAL_1".equals(rs1.getForm_type())).collect(Collectors.toList()).get(0);
MdMeMaterialbase materialInfo = iMdMeMaterialbaseService.getOne(new QueryWrapper<MdMeMaterialbase>().eq("material_id", mainFormData.getId()));
materialBase.setMaterial_id(mainFormData.getId());
materialBase.setMaterial_code(m_code);
materialBase.setMaterial_name(m_name);
materialBase.setMaterial_spec(m_spec);
materialBase.setQty_unit_id(m_unit);
materialBase.setAssist_unit_id(assistUint);
BigDecimal netWeightGet = new BigDecimal(netWeight);
//辅助单位净重为kg
if (netWeightGet.compareTo(BigDecimal.ZERO) > 0 && assistUint.contains("kg")) {
BigDecimal newWeightGet = netWeightGet.multiply(new BigDecimal(1000));
materialBase.setNet_weight(newWeightGet);
} else {
materialBase.setNet_weight(netWeightGet);
}
materialBase.setPrint_no(formData.getPcsn());
if (materialInfo != null) {
iMdMeMaterialbaseService.update(new LambdaUpdateWrapper<MdMeMaterialbase>()
.set(MdMeMaterialbase::getMaterial_id, mainFormData.getId())
@@ -424,14 +484,6 @@ public class SyncErpBillsScheduleService {
.set(MdMeMaterialbase::getEnglish_name, "id变更前id:" + materialInfo.getMaterial_id())
.eq(MdMeMaterialbase::getMaterial_code, m_code));
} else {
MdMeMaterialbase materialBase = new MdMeMaterialbase();
materialBase.setMaterial_id(mainFormData.getId());
materialBase.setMaterial_code(m_code);
materialBase.setMaterial_name(m_name);
materialBase.setMaterial_spec(m_spec);
materialBase.setQty_unit_id(m_unit);
materialBase.setAssist_unit_id(assistUint);
materialBase.setPrint_no(formData.getPcsn());
iMdMeMaterialbaseService.save(materialBase);
}
}
@@ -439,6 +491,7 @@ public class SyncErpBillsScheduleService {
log.error("解析数据 [{}] 时出现异常: {}", JSON.toJSONString(r), e.getMessage());
}
}
return materialBase;
}
/**
@@ -506,7 +559,4 @@ public class SyncErpBillsScheduleService {
}
}
}

View File

@@ -8,7 +8,7 @@ spring:
db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://${DB_HOST:192.168.8.218}:${DB_PORT:3306}/${DB_NAME:wms}?serverTimxezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_hs2}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false&socketTimeout=28800000
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:wms_hs4}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true&useSSL=false&socketTimeout=28800000
username: ${DB_USER:root}
password: ${DB_PWD:123456}
@@ -156,9 +156,9 @@ lucene:
index:
path: D:\lms\lucene\index
kdapi:
appId: 295539_RY4pS/CH0vl8TfUo652sR+1KULwdQNOG
appSecret: 0d47d08ee5014643b91a764e121e0bcb
appId: 295539_RY4pS/CH0vl8TfUo652sR+1KULwdQNOG111
appSecret: 0d47d08ee5014643b91a764e121e0bcb1111
userName: 管理员
pwd: ty.87016362
serverUrl: http://192.168.16.249/k3cloud/
pwd: ty.870163621
serverUrl: http://192.168.16.249/k3cloud/111
dCID: 65b078e7ea0ce6

View File

@@ -30,6 +30,7 @@ spring:
runTimeout: 5000
task:
pool:
# 线程大小设置
# 核心线程池大小
core-pool-size: 10
# 最大线程数