add:新增需求

This commit is contained in:
2026-07-19 17:36:46 +08:00
parent 9c3cb92f7e
commit 3d244462db
28 changed files with 1258 additions and 55 deletions

View File

@@ -0,0 +1,86 @@
package org.nl.wms.basedata_manage.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import org.nl.common.base.TableDataInfo;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.IStockManageService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/stockManage")
public class StockManageController {
@Resource
private final IStockManageService stockManageService;
@Resource
private final IStructattrService structattrService;
@GetMapping
@Log("查询库存管理")
public ResponseEntity<Object> query(@RequestParam Map whereJson, PageQuery page) {
return new ResponseEntity<>(TableDataInfo.build(stockManageService.queryAll(whereJson, page)), HttpStatus.OK);
}
@PostMapping("/updateLock")
@Log("库存管理修改仓位锁定类型")
public ResponseEntity<Object> updateLock(@RequestBody List<JSONObject> updateAttrList) {
if (updateAttrList == null || updateAttrList.isEmpty()) {
throw new BadRequestException("请选择需要操作的库存数据");
}
String targetLockType = updateAttrList.get(0).getString("lock_type");
Set<String> structCodes = updateAttrList.stream()
.map(row -> row.getString("struct_code"))
.filter(code -> code != null && !code.isEmpty())
.collect(Collectors.toSet());
List<Structattr> attrs = structattrService.list(new QueryWrapper<Structattr>().lambda()
.in(Structattr::getStruct_code, structCodes));
if ("99".equals(targetLockType)) {
List<String> invalidCodes = attrs.stream()
.filter(row -> row.getLock_type() != null && !"0".equals(row.getLock_type()))
.map(Structattr::getStruct_code)
.collect(Collectors.toList());
if (!invalidCodes.isEmpty()) {
throw new BadRequestException("仓位已锁定,不能重复锁定:" + String.join("", invalidCodes));
}
} else if ("0".equals(targetLockType)) {
List<String> invalidCodes = attrs.stream()
.filter(row -> !"99".equals(row.getLock_type()))
.map(Structattr::getStruct_code)
.collect(Collectors.toList());
if (!invalidCodes.isEmpty()) {
throw new BadRequestException("仅其它锁仓位允许解锁:" + String.join("", invalidCodes));
}
}
Map<String, Structattr> attrMap = attrs.stream().collect(Collectors.toMap(Structattr::getStruct_code, row -> row));
for (JSONObject row : updateAttrList) {
Structattr attr = attrMap.get(row.getString("struct_code"));
if (attr == null) {
continue;
}
attr.setLock_type(row.getString("lock_type"));
attr.setRemark(row.getString("remark"));
structattrService.updateById(attr);
}
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@@ -73,4 +74,11 @@ public class StructattrController {
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} }
@PostMapping("/updateLock")
@Log("修改仓位锁定类型")
public ResponseEntity<Object> updateLock(@RequestBody List<JSONObject> updateAttrList) {
structattrService.updateLock(updateAttrList);
return new ResponseEntity<>(HttpStatus.OK);
}
} }

View File

@@ -0,0 +1,14 @@
package org.nl.wms.basedata_manage.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import java.util.Map;
public interface IStockManageService extends IService<MdPbStoragevehicleext> {
IPage<JSONObject> queryAll(Map whereJson, PageQuery page);
}

View File

@@ -0,0 +1,15 @@
package org.nl.wms.basedata_manage.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import java.util.Map;
public interface StockManageMapper extends BaseMapper<MdPbStoragevehicleext> {
IPage<JSONObject> queryAllByPage(Page<JSONObject> page, @Param("param") Map whereJson);
}

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.wms.basedata_manage.service.dao.mapper.StockManageMapper">
<select id="queryAllByPage" resultType="com.alibaba.fastjson.JSONObject">
SELECT DISTINCT
ext.group_id AS storagevehicleext_id,
ext.storagevehicle_code,
ext.pcsn,
ext.qty_unit_name,
ext.qty,
ext.frozen_qty,
attr.lock_type,
attr.remark,
ext.create_time,
ext.supp_code,
ext.supp_name,
attr.struct_code,
attr.struct_name,
attr.stor_name,
attr.sect_name,
mater.material_code,
mater.material_name
FROM
md_pb_groupplate ext
INNER JOIN st_ivt_structattr attr ON ext.storagevehicle_code = attr.storagevehicle_code
INNER JOIN md_me_materialbase mater ON mater.material_id = ext.material_id
<where>
1 = 1
AND ext.`status` = '02'
AND attr.occupancy_state = 3
<if test="param.stor_id != null and param.stor_id != ''">
AND attr.stor_id = #{param.stor_id}
</if>
<if test="param.sect_id != null and param.sect_id != ''">
AND attr.sect_id = #{param.sect_id}
</if>
<if test="param.sect_code != null and param.sect_code != ''">
AND attr.sect_code = #{param.sect_code}
</if>
<if test="param.struct_code != null and param.struct_code != ''">
AND (attr.struct_code LIKE #{param.struct_code} OR attr.struct_name LIKE #{param.struct_code})
</if>
<if test="param.material_code != null and param.material_code != ''">
AND (mater.material_code LIKE CONCAT('%', #{param.material_code}, '%') OR
mater.material_name LIKE CONCAT('%', #{param.material_code}, '%'))
</if>
<if test="param.pcsn != null and param.pcsn != ''">
AND ext.pcsn LIKE #{param.pcsn}
</if>
<if test="param.storagevehicle_code != null and param.storagevehicle_code != ''">
AND ext.storagevehicle_code LIKE CONCAT('%', #{param.storagevehicle_code}, '%')
</if>
<if test="param.is_lock != null and param.is_lock != ''">
<choose>
<when test="param.is_lock == '0'">
AND IFNULL(attr.lock_type, '0') = '0'
</when>
<when test="param.is_lock == '1'">
AND IFNULL(attr.lock_type, '0') != '0'
</when>
</choose>
</if>
AND 0 = (
SELECT COUNT(*)
FROM sch_base_task t
WHERE t.task_status <![CDATA[ < ]]> '5'
AND t.is_delete = '0'
AND (t.vehicle_code = ext.storagevehicle_code OR t.vehicle_code2 = ext.storagevehicle_code)
)
</where>
ORDER BY ext.create_time DESC
</select>
</mapper>

View File

@@ -0,0 +1,22 @@
package org.nl.wms.basedata_manage.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.common.domain.query.PageQuery;
import org.nl.wms.basedata_manage.service.IStockManageService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import org.nl.wms.basedata_manage.service.dao.mapper.StockManageMapper;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class StockManageServiceImpl extends ServiceImpl<StockManageMapper, MdPbStoragevehicleext> implements IStockManageService {
@Override
public IPage<JSONObject> queryAll(Map whereJson, PageQuery page) {
return this.baseMapper.queryAllByPage(new Page<>(page.getPage() + 1, page.getSize()), whereJson);
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy; package org.nl.wms.decision_manage.service.strategyConfig.decisioner.impl.diy;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -11,6 +12,8 @@ import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner; import org.nl.wms.decision_manage.service.strategyConfig.decisioner.Decisioner;
import org.nl.wms.sch_manage.enums.StatusEnum; import org.nl.wms.sch_manage.enums.StatusEnum;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis; import org.nl.wms.warehouse_manage.inAndOut.service.dao.IOStorInvDis;
import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper; import org.nl.wms.warehouse_manage.inAndOut.service.dao.mapper.IOStorInvDisMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -34,6 +37,9 @@ public class UnpackingRuleHandler extends Decisioner<Structattr, JSONObject> {
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService; private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
@Resource @Resource
private IOStorInvDisMapper disMapper; private IOStorInvDisMapper disMapper;
@Resource
private ISysParamService paramService;
@Override @Override
public List<Structattr> handler(List<Structattr> list, JSONObject param) { public List<Structattr> handler(List<Structattr> list, JSONObject param) {
IOStorInvDis dis = disMapper.selectById(param.getString("dis_id")); IOStorInvDis dis = disMapper.selectById(param.getString("dis_id"));
@@ -73,19 +79,52 @@ public class UnpackingRuleHandler extends Decisioner<Structattr, JSONObject> {
} }
return outPoints; return outPoints;
} else { } else {
// 获取仓库中对应托盘类型的可出的空桶点位 List<Structattr> outPoints;
List<Structattr> outPoints = iStructattrService.list(new LambdaQueryWrapper<Structattr>() if (requiresEmptyBucketForUnpacking()) {
.eq(Structattr::getOccupancy_state, 2) // 只有走 JbDownAgvTask 的场景才要求目标仓位已存在同类型空桶。
.eq(Structattr::getStoragevehicle_type, vinfo.getStoragevehicle_type()) outPoints = iStructattrService.list(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getLock_type, "0") .eq(Structattr::getOccupancy_state, 2)
.eq(Structattr::getSect_code, param.getString("sect_code")) .eq(Structattr::getStoragevehicle_type, vinfo.getStoragevehicle_type())
.eq(Structattr::getStor_id, param.getString("stor_code")) .eq(Structattr::getLock_type, "0")
.isNotNull(Structattr::getStoragevehicle_code) .eq(Structattr::getSect_code, param.getString("sect_code"))
.isNull(Structattr::getTask_code)); .eq(Structattr::getStor_id, param.getString("stor_code"))
if (outPoints.size() == 0) { .isNotNull(Structattr::getStoragevehicle_code)
throw new BadRequestException("当前出库策略:解包入库,库存分配失败,失败原因:料桶缓存库无空桶!"); .isNull(Structattr::getTask_code));
if (outPoints.size() == 0) {
throw new BadRequestException("当前出库策略:解包入库,库存分配失败,失败原因:料桶缓存库无空桶!");
}
} else {
// 走其它 AGV 分支时不需要空桶,直接找可用空位即可。
outPoints = iStructattrService.list(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getOccupancy_state, 1)
.eq(Structattr::getLock_type, "0")
.eq(Structattr::getSect_code, param.getString("sect_code"))
.eq(Structattr::getStor_id, param.getString("stor_code"))
.isNull(Structattr::getStoragevehicle_code)
.isNull(Structattr::getTask_code));
if (outPoints.size() == 0) {
throw new BadRequestException("当前出库策略:解包入库,库存分配失败,失败原因:料桶缓存库无空位!");
}
} }
return outPoints; return outPoints;
} }
} }
private boolean requiresEmptyBucketForUnpacking() {
String openCbj = getBinaryParamStrict("is_open_cbj");
String openUnsealing = getBinaryParamStrict("is_open_unsealing");
return "1".equals(openCbj) && "1".equals(openUnsealing);
}
private String getBinaryParamStrict(String code) {
Param sysParam = paramService.findByCode(code);
if (ObjectUtil.isEmpty(sysParam) || StrUtil.isBlank(sysParam.getValue())) {
throw new BadRequestException("系统参数配置错误");
}
String value = StrUtil.trim(sysParam.getValue());
if (!"0".equals(value) && !"1".equals(value)) {
throw new BadRequestException("系统参数配置错误");
}
return value;
}
} }

View File

@@ -268,6 +268,10 @@ public class MesToWmsServiceImpl implements MesToWmsService {
table.put("material_name", materialbase.getMaterial_name()); table.put("material_name", materialbase.getMaterial_name());
table.put("material_spec", materialbase.getMaterial_spec()); table.put("material_spec", materialbase.getMaterial_spec());
String invId = outBillService.insertDtl(insertInvObj); String invId = outBillService.insertDtl(insertInvObj);
JSONObject auditParam = new JSONObject();
auditParam.put("iostorinv_id", invId);
auditParam.put("audit_result", 1);
outBillService.audit(auditParam);
// 调用手工分配 // 调用手工分配
JSONObject param = new JSONObject(); JSONObject param = new JSONObject();
JSONObject row = new JSONObject(); JSONObject row = new JSONObject();
@@ -394,6 +398,10 @@ public class MesToWmsServiceImpl implements MesToWmsService {
table.put("material_name", materialbase.getMaterial_name()); table.put("material_name", materialbase.getMaterial_name());
table.put("material_spec", materialbase.getMaterial_spec()); table.put("material_spec", materialbase.getMaterial_spec());
String invId = outBillService.insertDtl(insertInvObj); String invId = outBillService.insertDtl(insertInvObj);
JSONObject auditParam = new JSONObject();
auditParam.put("iostorinv_id", invId);
auditParam.put("audit_result", 1);
outBillService.audit(auditParam);
// 调用手工分配 // 调用手工分配
JSONObject param = new JSONObject(); JSONObject param = new JSONObject();
JSONObject row = new JSONObject(); JSONObject row = new JSONObject();

View File

@@ -230,6 +230,10 @@ public class PdaJBServiceImpl implements PdaJBService {
table.put("material_name", materialbase.getMaterial_name()); table.put("material_name", materialbase.getMaterial_name());
table.put("material_spec", materialbase.getMaterial_spec()); table.put("material_spec", materialbase.getMaterial_spec());
String invId = outBillService.insertDtl(insertInvObj); String invId = outBillService.insertDtl(insertInvObj);
JSONObject auditParam = new JSONObject();
auditParam.put("iostorinv_id", invId);
auditParam.put("audit_result", 1);
outBillService.audit(auditParam);
// 调用手工分配 // 调用手工分配
JSONObject param = new JSONObject(); JSONObject param = new JSONObject();
JSONObject row = new JSONObject(); JSONObject row = new JSONObject();
@@ -446,7 +450,7 @@ public class PdaJBServiceImpl implements PdaJBService {
List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>() List<SchBaseTask> list = taskService.list(new LambdaQueryWrapper<SchBaseTask>()
.lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode()) .lt(SchBaseTask::getTask_status, TaskStatus.FINISHED.getCode())
.eq(SchBaseTask::getIs_delete, false) .eq(SchBaseTask::getIs_delete, false)
.in(SchBaseTask::getConfig_code, Arrays.asList("JbDownAgvTask", "JbDownCloseUnsealingAgvTask", "JbDownManualTask")) .in(SchBaseTask::getConfig_code, Arrays.asList("JbDownAgvTask", "JbDownCloseUnsealingAgvTask", "JbDownCloseCbjAgvTask", "JbDownManualTask"))
.and(ll -> ll.like(SchBaseTask::getPoint_code1, taskPointCode).or() .and(ll -> ll.like(SchBaseTask::getPoint_code1, taskPointCode).or()
.like(SchBaseTask::getPoint_code2, taskPointCode).or() .like(SchBaseTask::getPoint_code2, taskPointCode).or()
.like(SchBaseTask::getPoint_code3, taskPointCode).or() .like(SchBaseTask::getPoint_code3, taskPointCode).or()

View File

@@ -91,6 +91,8 @@ public class PdmBdWorkorder implements Serializable {
private String ext_data; private String ext_data;
private String remark;
private Boolean is_delete; private Boolean is_delete;
private String create_id; private String create_id;
@@ -121,4 +123,7 @@ public class PdmBdWorkorder implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private String material_spec; private String material_spec;
@TableField(exist = false)
private Integer audit_result;
} }

View File

@@ -43,6 +43,7 @@
LEFT JOIN md_me_materialbase mm ON mm.material_id = mg.material_id LEFT JOIN md_me_materialbase mm ON mm.material_id = mg.material_id
WHERE mg.`status` = '02' AND mg.frozen_qty = 0 AND IFNULL(mg.storagevehicle_code,'') <![CDATA[ <> ]]> '' WHERE mg.`status` = '02' AND mg.frozen_qty = 0 AND IFNULL(mg.storagevehicle_code,'') <![CDATA[ <> ]]> ''
AND IFNULL(ss.struct_code,'') <![CDATA[ <> ]]> '' AND IFNULL(ss.struct_code,'') <![CDATA[ <> ]]> ''
AND IFNULL(ss.lock_type, '0') = '0'
AND 0 = (SELECT COUNT(*) FROM pdm_bd_workorder po WHERE po.raw_material_code = mg.storagevehicle_code AND po.workorder_status <![CDATA[ <> ]]> '5') AND 0 = (SELECT COUNT(*) FROM pdm_bd_workorder po WHERE po.raw_material_code = mg.storagevehicle_code AND po.workorder_status <![CDATA[ <> ]]> '5')
<if test="query.stor_id != null and query.stor_id != ''"> <if test="query.stor_id != null and query.stor_id != ''">
AND ss.stor_id = #{query.stor_id} AND ss.stor_id = #{query.stor_id}
@@ -67,6 +68,7 @@
LEFT JOIN md_me_materialbase mm ON mm.material_id = mg.material_id LEFT JOIN md_me_materialbase mm ON mm.material_id = mg.material_id
WHERE mg.`status` = '02' AND mg.frozen_qty = 0 AND IFNULL(mg.storagevehicle_code,'') <![CDATA[ <> ]]> '' WHERE mg.`status` = '02' AND mg.frozen_qty = 0 AND IFNULL(mg.storagevehicle_code,'') <![CDATA[ <> ]]> ''
AND IFNULL(ss.struct_code,'') <![CDATA[ <> ]]> '' AND IFNULL(ss.struct_code,'') <![CDATA[ <> ]]> ''
AND IFNULL(ss.lock_type, '0') = '0'
AND 0 = (SELECT COUNT(*) FROM pdm_bd_workorder po WHERE po.raw_material_code = mg.storagevehicle_code AND po.workorder_status <![CDATA[ <> ]]> '5') AND 0 = (SELECT COUNT(*) FROM pdm_bd_workorder po WHERE po.raw_material_code = mg.storagevehicle_code AND po.workorder_status <![CDATA[ <> ]]> '5')
<if test="query.stor_id != null and query.stor_id != ''"> <if test="query.stor_id != null and query.stor_id != ''">
AND ss.stor_id = #{query.stor_id} AND ss.stor_id = #{query.stor_id}

View File

@@ -144,6 +144,11 @@ public class PdmBdWorkorderDto implements Serializable {
*/ */
private String ext_data; private String ext_data;
/**
* 备注
*/
private String remark;
/** /**
* 是否删除 * 是否删除
*/ */

View File

@@ -3,6 +3,7 @@ package org.nl.wms.pm_manage.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -210,7 +211,17 @@ public class PdmBdWorkorderServiceImpl extends ServiceImpl<PdmBdWorkorderMapper,
if (!WorkOrderStatusEnum.UNPRODUCED.getCode().equals(order.getWorkorder_status())) { if (!WorkOrderStatusEnum.UNPRODUCED.getCode().equals(order.getWorkorder_status())) {
throw new BadRequestException("仅状态为1的工单允许审核"); throw new BadRequestException("仅状态为1的工单允许审核");
} }
order.setWorkorder_status(WorkOrderStatusEnum.ISSUED.getCode()); Integer auditResult = entity.getAudit_result();
if (auditResult == null || (auditResult != 0 && auditResult != 1)) {
throw new BadRequestException("审核结果只能为通过(1)或不通过(0)");
}
if (auditResult == 0 && StrUtil.isBlank(entity.getRemark())) {
throw new BadRequestException("审核不通过时原因不能为空!");
}
order.setWorkorder_status(auditResult == 1
? WorkOrderStatusEnum.ISSUED.getCode()
: WorkOrderStatusEnum.CANCELED.getCode());
order.setRemark(entity.getRemark());
order.setAudit_id(SecurityUtils.getCurrentUserId()); order.setAudit_id(SecurityUtils.getCurrentUserId());
order.setAudit_name(SecurityUtils.getCurrentNickName()); order.setAudit_name(SecurityUtils.getCurrentNickName());
order.setAudit_time(DateUtil.now()); order.setAudit_time(DateUtil.now());

View File

@@ -117,16 +117,15 @@ public class BackInManualTask extends AbstractTask {
inBillService.taskFinish(taskObj); inBillService.taskFinish(taskObj);
iStructattrService.update(new UpdateWrapper<Structattr>().lambda() iStructattrService.update(new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getStoragevehicle_type, "")
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getOccupancy_state, "3")
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))); .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")));
iSchBasePointService.update(new UpdateWrapper<SchBasePoint>().lambda() iSchBasePointService.update(new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getPoint_status, "1") .set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getVehicle_code, null) .set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getIos_id, null)); .set(SchBasePoint::getIos_id, null));
taskObj.setRemark("已完成"); taskObj.setRemark("已完成");
@@ -146,7 +145,6 @@ public class BackInManualTask extends AbstractTask {
public void cancelTask(SchBaseTask taskObj) { public void cancelTask(SchBaseTask taskObj) {
iStructattrService.update(new UpdateWrapper<Structattr>().lambda() iStructattrService.update(new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_type, "")
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))); .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")));

View File

@@ -169,10 +169,7 @@ public class BackInTask extends AbstractTask {
iStructattrService.update( iStructattrService.update(
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getStoragevehicle_type, "")
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getOccupancy_state, "3")
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );
// 更新起点 // 更新起点
@@ -182,6 +179,8 @@ public class BackInTask extends AbstractTask {
.set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getPoint_status, "1") .set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getVehicle_code, null) .set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getIos_id, null) .set(SchBasePoint::getIos_id, null)
); );
@@ -206,7 +205,6 @@ public class BackInTask extends AbstractTask {
iStructattrService.update( iStructattrService.update(
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_type, "")
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );

View File

@@ -8,7 +8,9 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil; import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil; import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBasePointService;
@@ -52,6 +54,9 @@ public class PdaPointTask extends AbstractTask {
@Autowired @Autowired
private IStructattrService iStructattrService; private IStructattrService iStructattrService;
@Autowired
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
@Override @Override
public String create(JSONObject json) { public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask(); SchBaseTask task = new SchBaseTask();
@@ -141,11 +146,14 @@ public class PdaPointTask extends AbstractTask {
@Transactional @Transactional
public void finishTask(SchBaseTask taskObj) { public void finishTask(SchBaseTask taskObj) {
MdPbStoragevehicleinfo storagevehicleinfo = storagevehicleinfoService.getByCode(taskObj.getVehicle_code());
// 更新起点 // 更新起点
iSchBasePointService.update( iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda() new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null) .set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getIos_id, null) .set(SchBasePoint::getIos_id, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"))
); );
@@ -153,6 +161,9 @@ public class PdaPointTask extends AbstractTask {
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1()) .eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getStoragevehicle_code, null) .set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
.set(Structattr::getOccupancy_state, 1)
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );
@@ -161,6 +172,8 @@ public class PdaPointTask extends AbstractTask {
new UpdateWrapper<SchBasePoint>().lambda() new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getVehicle_type, ObjectUtil.isNotEmpty(storagevehicleinfo) ? storagevehicleinfo.getStoragevehicle_type() : null)
.set(SchBasePoint::getVehicle_qty, 1)
.set(SchBasePoint::getIos_id, null) .set(SchBasePoint::getIos_id, null)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货")) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("有货"))
); );
@@ -168,6 +181,9 @@ public class PdaPointTask extends AbstractTask {
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code()) .set(Structattr::getStoragevehicle_code, taskObj.getVehicle_code())
.set(Structattr::getStoragevehicle_type, ObjectUtil.isNotEmpty(storagevehicleinfo) ? storagevehicleinfo.getStoragevehicle_type() : null)
.set(Structattr::getStoragevehicle_qty, 1)
.set(Structattr::getOccupancy_state, 3)
.set(Structattr::getTask_code, null) .set(Structattr::getTask_code, null)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );
@@ -183,22 +199,36 @@ public class PdaPointTask extends AbstractTask {
iSchBasePointService.update( iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda() new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1()) .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code1())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"))
); );
iStructattrService.update( iStructattrService.update(
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code1()) .eq(Structattr::getStruct_code, taskObj.getPoint_code1())
.set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
.set(Structattr::getOccupancy_state, 1)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );
// 更新终点 // 更新终点
iSchBasePointService.update( iSchBasePointService.update(
new UpdateWrapper<SchBasePoint>().lambda() new UpdateWrapper<SchBasePoint>().lambda()
.eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2()) .eq(SchBasePoint::getPoint_code, taskObj.getPoint_code2())
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货")) .set(SchBasePoint::getPoint_status, IOSEnum.POINT_STATUS.code("无货"))
); );
iStructattrService.update( iStructattrService.update(
new UpdateWrapper<Structattr>().lambda() new UpdateWrapper<Structattr>().lambda()
.eq(Structattr::getStruct_code, taskObj.getPoint_code2()) .eq(Structattr::getStruct_code, taskObj.getPoint_code2())
.set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
.set(Structattr::getOccupancy_state, 1)
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
); );
// 更新任务 // 更新任务

View File

@@ -9,7 +9,9 @@ import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil; import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum; import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.sch_manage.enums.TaskStatus; import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService; import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -64,6 +66,9 @@ public class StOutTask extends AbstractTask {
@Autowired @Autowired
private IMdPbGroupplateService iMdPbGroupplateService; private IMdPbGroupplateService iMdPbGroupplateService;
@Autowired
private IMdPbStoragevehicleinfoService storagevehicleinfoService;
@Override @Override
public String create(JSONObject json) { public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask(); SchBaseTask task = new SchBaseTask();
@@ -157,6 +162,7 @@ public class StOutTask extends AbstractTask {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void finishTask(SchBaseTask taskObj) { public void finishTask(SchBaseTask taskObj) {
MdPbStoragevehicleinfo storagevehicleinfo = storagevehicleinfoService.getByCode(taskObj.getVehicle_code());
// 任务完成 // 任务完成
taskObj.setTask_status(TaskStatus.FINISHED.getCode()); taskObj.setTask_status(TaskStatus.FINISHED.getCode());
taskObj.setRemark("已完成"); taskObj.setRemark("已完成");
@@ -170,6 +176,8 @@ public class StOutTask extends AbstractTask {
.set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getPoint_status,"3") .set(SchBasePoint::getPoint_status,"3")
.set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code()) .set(SchBasePoint::getVehicle_code, taskObj.getVehicle_code())
.set(SchBasePoint::getVehicle_type, ObjectUtil.isNotEmpty(storagevehicleinfo) ? storagevehicleinfo.getStoragevehicle_type() : null)
.set(SchBasePoint::getVehicle_qty, 1)
.set(SchBasePoint::getIos_id, null) .set(SchBasePoint::getIos_id, null)
); );
} }

View File

@@ -0,0 +1,279 @@
package org.nl.wms.sch_manage.service.util.tasks.jb;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.IdUtil;
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.sch_manage.enums.TaskFinishedTypeEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBasePointService;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.ISchBaseTaskconfigService;
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.dao.SchBaseTaskconfig;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.nl.wms.sch_manage.service.util.TaskUtils;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
import org.nl.wms.warehouse_manage.inAndOut.service.IInBillService;
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.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* 解包下料-屏蔽解包机 AGV 任务
*/
@Slf4j
@Component("JbDownCloseCbjAgvTask")
public class JbDownCloseCbjAgvTask extends AbstractTask {
@Resource
private ISchBaseTaskService taskService;
@Resource
private IInBillService inBillService;
@Resource
private IOStorInvDisMapper ioStorInvDisMapper;
@Resource
private ISchBasePointService pointService;
@Resource
private ISchBaseTaskconfigService taskconfigService;
@Resource
private IStructattrService structattrService;
@Resource
private IOStorInvMapper ioStorInvMapper;
@Resource
private IOStorInvDtlMapper ioStorInvDtlMapper;
@Resource
private IMdPbGroupplateService groupplateService;
@Override
public String create(JSONObject param) {
JSONArray tasks = param.getJSONArray("tasks");
List<SchBaseTask> batchTask = new ArrayList<>();
for (int i = 0; i < tasks.size(); i++) {
JSONObject json = tasks.getJSONObject(i);
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATED.getCode());
task.setConfig_code(json.getString("task_type"));
task.setPoint_code1(json.getString("point_code1"));
task.setPoint_code2(json.getString("point_code2"));
task.setPoint_code3(json.getString("point_code3"));
task.setPoint_code4(json.getString("point_code4"));
task.setVehicle_code(json.getString("vehicle_code"));
task.setVehicle_code2(json.getString("vehicle_code2"));
task.setVehicle_type(json.getString("vehicle_type"));
task.setGroup_id(json.getString("group_id"));
task.setTask_group_id(json.getString("task_group_id"));
task.setTask_group_seq(json.getBigDecimal("task_group_seq"));
task.setRequest_param(json.toString());
task.setPriority(json.getString("Priority"));
task.setCreate_id(SecurityUtils.getCurrentUserId());
task.setCreate_name(SecurityUtils.getCurrentNickName());
task.setCreate_time(DateUtil.now());
batchTask.add(task);
}
taskService.saveBatch(batchTask);
return batchTask.get(batchTask.size() - 1).getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
SchBaseTask taskDao = taskService.getById(taskId);
SchBaseTaskconfig taskconfig = taskconfigService.getTaskByConfigCode(taskDao.getConfig_code());
JSONObject object = JSONObject.parseObject(taskDao.getRequest_param());
AcsTaskDto acsTaskDto = new AcsTaskDto();
acsTaskDto.setExt_task_uuid(taskDao.getTask_id());
acsTaskDto.setTask_code(taskDao.getTask_code());
acsTaskDto.setStart_device_code(taskDao.getPoint_code1());
acsTaskDto.setNext_device_code(taskDao.getPoint_code2());
acsTaskDto.setAgv_system_type(normalizeAgvSystemType("2"));
acsTaskDto.setPriority(taskDao.getPriority());
acsTaskDto.setTask_type(taskconfig.getTask_type());
acsTaskDto.setTruss_type(object.getString("truss_type"));
acsTaskDto.setInteraction_json(new JSONObject().fluentPut("have_lid", object.getString("have_lid")));
fillCommonAcsTaskFields(taskDao, acsTaskDto);
acsTaskDto.setVehicle_code2(null);
return acsTaskDto;
}
@Override
protected void updateStatus(String task_code, TaskStatus status) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (taskObj.getTask_status().equals(TaskStatus.FINISHED.getCode())) {
throw new BadRequestException("该任务已完成!");
}
if (taskObj.getTask_status().equals(TaskStatus.CANCELED.getCode())) {
throw new BadRequestException("该任务已取消!");
}
if (status.equals(TaskStatus.EXECUTING)) {
taskObj.setTask_status(TaskStatus.EXECUTING.getCode());
taskObj.setRemark("执行中");
TaskUtils.setUpdateByAcs(taskObj);
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj, TaskFinishedTypeEnum.AUTO_ACS);
}
}
@Transactional(rollbackFor = Exception.class)
public void cancelTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
List<IOStorInvDis> disList = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getTask_id, taskObj.getTask_id()));
taskObj.setTask_status(TaskStatus.CANCELED.getCode());
taskObj.setRemark("已取消");
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
clearPoint(taskObj.getPoint_code1());
unlockTargetStruct(taskObj.getPoint_code2());
ioStorInvDisMapper.update(new IOStorInvDis(), new LambdaUpdateWrapper<>(IOStorInvDis.class)
.set(IOStorInvDis::getTask_id, null)
.set(IOStorInvDis::getPoint_code, null)
.set(IOStorInvDis::getIs_issued, 0)
.set(IOStorInvDis::getWork_status, IOSEnum.INBILL_DIS_STATUS.code("未生成"))
.eq(IOStorInvDis::getTask_id, taskObj.getTask_id()));
clearPointTaskCode(taskObj.getPoint_code1());
clearStructTaskCode(taskObj.getPoint_code2());
deleteRelatedInBills(disList);
deleteRelatedGroupPlate(taskObj.getGroup_id());
}
public void finishTask(SchBaseTask taskObj, TaskFinishedTypeEnum taskFinishedType) {
clearPoint(taskObj.getPoint_code1());
occupyStruct(taskObj.getPoint_code2(), taskObj.getVehicle_code(), taskObj.getVehicle_type());
taskObj.setRemark("任务执行完毕");
inBillService.taskFinish(taskObj);
taskObj.setTask_status(TaskStatus.FINISHED.getCode());
TaskUtils.setUpdateByType(taskObj, taskFinishedType);
taskService.updateById(taskObj);
}
private void clearPoint(String code) {
SchBasePoint point = pointService.getById(code);
if (ObjectUtil.isEmpty(point)) {
throw new BadRequestException("点位不存在:" + code);
}
point.setPoint_status("1");
point.setVehicle_code(null);
point.setVehicle_type(null);
point.setUpdate_time(DateUtil.now());
pointService.updateById(point);
}
private void occupyStruct(String code, String vehicleCode, String vehicleType) {
Structattr struct = structattrService.getByCode(code);
if (ObjectUtil.isEmpty(struct)) {
throw new BadRequestException("仓位不存在:" + code);
}
structattrService.update(new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getStoragevehicle_code, vehicleCode)
.set(Structattr::getStoragevehicle_type, vehicleType)
.set(Structattr::getOccupancy_state, "2")
.eq(Structattr::getStruct_code, code));
}
private void clearPointTaskCode(String code) {
if (ObjectUtil.isEmpty(code)) {
return;
}
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getIng_task_code, null)
.eq(SchBasePoint::getPoint_code, code));
}
private void clearStructTaskCode(String code) {
if (ObjectUtil.isEmpty(code)) {
return;
}
structattrService.update(new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getTask_code, null)
.eq(Structattr::getStruct_code, code));
}
private void unlockTargetStruct(String code) {
if (ObjectUtil.isEmpty(code)) {
return;
}
JSONObject unlockMap = new JSONObject();
unlockMap.put("struct_code", code);
unlockMap.put("inv_id", null);
unlockMap.put("inv_code", null);
unlockMap.put("inv_type", null);
structattrService.updateStatusByCode("2", unlockMap);
}
private void deleteRelatedInBills(List<IOStorInvDis> disList) {
if (ObjectUtil.isEmpty(disList)) {
return;
}
List<String> invIds = new ArrayList<>();
for (IOStorInvDis dis : disList) {
if (ObjectUtil.isNotEmpty(dis.getIostorinv_id()) && !invIds.contains(dis.getIostorinv_id())) {
invIds.add(dis.getIostorinv_id());
}
}
for (String invId : invIds) {
ioStorInvDisMapper.delete(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, invId));
ioStorInvDtlMapper.delete(new LambdaQueryWrapper<IOStorInvDtl>()
.eq(IOStorInvDtl::getIostorinv_id, invId));
ioStorInvMapper.deleteById(invId);
}
}
private void deleteRelatedGroupPlate(String groupId) {
if (ObjectUtil.isEmpty(groupId)) {
return;
}
groupplateService.remove(new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getGroup_id, groupId));
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.cancelTask(taskObj, TaskFinishedTypeEnum.MANUAL_PC);
}
@Override
public void backMes(String task_code) {
}
}

View File

@@ -220,6 +220,8 @@ public class SeparateMaterialManualTask extends AbstractTask {
//点位1 //点位1
iStructattrService.update(new LambdaUpdateWrapper<Structattr>() iStructattrService.update(new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getStoragevehicle_code, null) .set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
.set(Structattr::getOccupancy_state, "1") .set(Structattr::getOccupancy_state, "1")
.set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId()) .set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName()) .set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName())
@@ -299,7 +301,9 @@ public class SeparateMaterialManualTask extends AbstractTask {
// 回滚目标点位,解除进行中任务占用 // 回滚目标点位,解除进行中任务占用
pointService.update(new LambdaUpdateWrapper<SchBasePoint>() pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getVehicle_type, "") .set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getPoint_status, "1") .set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())

View File

@@ -233,6 +233,8 @@ public class SeparateMaterialTask extends AbstractTask {
//点位1 //点位1
iStructattrService.update(new LambdaUpdateWrapper<Structattr>() iStructattrService.update(new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getStoragevehicle_code, null) .set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
.set(Structattr::getOccupancy_state, "1") .set(Structattr::getOccupancy_state, "1")
.set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId()) .set(Structattr::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName()) .set(Structattr::getUpdate_name, SecurityUtils.getCurrentNickName())
@@ -312,7 +314,9 @@ public class SeparateMaterialTask extends AbstractTask {
// 回滚目标点位,解除进行中任务占用 // 回滚目标点位,解除进行中任务占用
pointService.update(new LambdaUpdateWrapper<SchBasePoint>() pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getIng_task_code, null) .set(SchBasePoint::getIng_task_code, null)
.set(SchBasePoint::getVehicle_type, "") .set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getVehicle_qty, 0)
.set(SchBasePoint::getPoint_status, "1") .set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId()) .set(SchBasePoint::getUpdate_id, SecurityUtils.getCurrentUserId())
.set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName()) .set(SchBasePoint::getUpdate_name, SecurityUtils.getCurrentNickName())

View File

@@ -41,6 +41,7 @@ import org.nl.wms.sch_manage.service.util.tasks.StInTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackAgvTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackManualTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackManualTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownCloseCbjAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownCloseUnsealingAgvTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownCloseUnsealingAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownManualTask; import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownManualTask;
import org.nl.wms.system_manage.service.param.ISysParamService; import org.nl.wms.system_manage.service.param.ISysParamService;
@@ -107,6 +108,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
@Resource @Resource
private JbDownAgvTask jbDownAgvTask; private JbDownAgvTask jbDownAgvTask;
@Resource @Resource
private JbDownCloseCbjAgvTask jbDownCloseCbjAgvTask;
@Resource
private JbDownCloseUnsealingAgvTask jbDownCloseUnsealingAgvTask; private JbDownCloseUnsealingAgvTask jbDownCloseUnsealingAgvTask;
@Resource @Resource
private JbBackAgvTask jbBackAgvTask; private JbBackAgvTask jbBackAgvTask;
@@ -764,6 +767,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
public void divPoint(Map whereJson) { public void divPoint(Map whereJson) {
ArrayList<HashMap> rows = (ArrayList<HashMap>) whereJson.get("tableMater"); ArrayList<HashMap> rows = (ArrayList<HashMap>) whereJson.get("tableMater");
String point_code = (String) whereJson.get("point_code"); String point_code = (String) whereJson.get("point_code");
String type = String.valueOf(whereJson.get("type"));
HashMap<String, String> map = rows.get(0); HashMap<String, String> map = rows.get(0);
IOStorInv invObj = this.getById(map.get("iostorinv_id")); IOStorInv invObj = this.getById(map.get("iostorinv_id"));
@@ -804,8 +808,41 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
|| !"2".equals(intoPoint.getPoint_type())) { || !"2".equals(intoPoint.getPoint_type())) {
throw new BadRequestException("请选择超细/中粗吨袋解包区对接位!"); throw new BadRequestException("请选择超细/中粗吨袋解包区对接位!");
} }
if (isOpenUnsealingEnabled()) { if ("0".equals(type)) {
String cfgPointType = "CXDDJBQ".equals(intoPoint.getRegion_code()) ? "1" : "2"; throw new BadRequestException("解包入库不支持人工转运类型!");
}
if (!"1".equals(type)) {
throw new BadRequestException("type参数错误仅支持0(人工转运)或1(AGV转运)");
}
String openCbj = getBinaryParamStrict("is_open_cbj");
String openUnsealing = getBinaryParamStrict("is_open_unsealing");
String cfgPointType = "CXDDJBQ".equals(intoPoint.getRegion_code()) ? "1" : "2";
SchBasePoint cfgjPoint = findCloseCbjPoint(map.get("storagevehicle_code"), intoPoint, cfgPointType);
if ("0".equals(openCbj)) {
prepareBucketForCloseCbjTask(map.get("storagevehicle_code"), inStruct.getStoragevehicle_type(), cfgjPoint);
String taskGroupId = IdUtil.getStringId();
JSONObject task = new JSONObject();
task.put("task_type", "JbDownCloseCbjAgvTask");
task.put("group_id", groupPlate.getGroup_id());
task.put("workorder_id", whereJson.get("workorder_id"));
task.put("task_group_id", taskGroupId);
task.put("task_group_seq", 1);
task.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task.put("point_code1", cfgjPoint.getPoint_code());
task.put("point_code2", structCode);
task.put("point_code3", null);
task.put("point_code4", null);
task.put("truss_type", "3");
task.put("have_lid", "1");
task.put("vehicle_type", inStruct.getStoragevehicle_type());
task.put("seq", 1);
task.put("vehicle_code", map.get("storagevehicle_code"));
task.put("vehicle_code2", null);
List<JSONObject> jsonObjects = Arrays.asList(task);
JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownCloseCbjAgvTask.create(requestTaskParam);
} else if ("1".equals(openCbj) && "1".equals(openUnsealing)) {
String parentPointCode = intoPoint.getParent_point_code(); String parentPointCode = intoPoint.getParent_point_code();
if (ObjectUtil.isEmpty(parentPointCode)) { if (ObjectUtil.isEmpty(parentPointCode)) {
throw new BadRequestException("解包对接点未配置父类编码!"); throw new BadRequestException("解包对接点未配置父类编码!");
@@ -814,12 +851,6 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
if (ObjectUtil.isEmpty(emptyPoint)) { if (ObjectUtil.isEmpty(emptyPoint)) {
throw new BadRequestException("找不到可用的空桶缓存位!"); throw new BadRequestException("找不到可用的空桶缓存位!");
} }
// 获取无盖子的对应的点位
List<SchBasePoint> canUseCFGJs = pointService.getCanUseCFGJs(intoPoint, "1", cfgPointType);
if (canUseCFGJs.size() == 0) {
throw new BadRequestException("找不到可用的拆封盖机");
}
SchBasePoint cfgjPoint = canUseCFGJs.get(0);
// 创建任务1 // 创建任务1
String taskGroupId = IdUtil.getStringId(); String taskGroupId = IdUtil.getStringId();
JSONObject task1 = new JSONObject(); JSONObject task1 = new JSONObject();
@@ -879,7 +910,7 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
JSONObject requestTaskParam = new JSONObject(); JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects); requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownAgvTask.create(requestTaskParam); task_id = jbDownAgvTask.create(requestTaskParam);
} else { } else if ("1".equals(openCbj) && "0".equals(openUnsealing)) {
String taskGroupId = IdUtil.getStringId(); String taskGroupId = IdUtil.getStringId();
JSONObject task = new JSONObject(); JSONObject task = new JSONObject();
task.put("task_type", "JbDownCloseUnsealingAgvTask"); task.put("task_type", "JbDownCloseUnsealingAgvTask");
@@ -902,6 +933,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
JSONObject requestTaskParam = new JSONObject(); JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects); requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownCloseUnsealingAgvTask.create(requestTaskParam); task_id = jbDownCloseUnsealingAgvTask.create(requestTaskParam);
} else {
throw new BadRequestException("系统参数配置错误");
} }
} else if (StatusEnum.IOBILL_TYPE_IN.code("解包直接入库").equals(invObj.getBill_type())) { } else if (StatusEnum.IOBILL_TYPE_IN.code("解包直接入库").equals(invObj.getBill_type())) {
// 创建人工四点任务 // 创建人工四点任务
@@ -985,8 +1018,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
task.put("task_group_seq", whereJson.get("task_group_seq")); task.put("task_group_seq", whereJson.get("task_group_seq"));
task.put("task_group_id", whereJson.get("task_group_id")); task.put("task_group_id", whereJson.get("task_group_id"));
task.put("vehicle_code", materialPoint.getVehicle_code()); task.put("vehicle_code", materialPoint.getVehicle_code());
String type = String.valueOf(whereJson.get("type")); String backType = String.valueOf(whereJson.get("type"));
if ("0".equals(type)) { if ("0".equals(backType)) {
task.put("task_type", "JbBackManualTask"); task.put("task_type", "JbBackManualTask");
task_id = jbBackManualTask.create(task); task_id = jbBackManualTask.create(task);
} else { } else {
@@ -1122,12 +1155,81 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
ioStorInvDisMapper.updateById(dis); ioStorInvDisMapper.updateById(dis);
} }
private boolean isOpenUnsealingEnabled() { private String getBinaryParamStrict(String code) {
Param param = paramService.findByCode("is_open_unsealing"); Param param = paramService.findByCode(code);
if (ObjectUtil.isEmpty(param) || StrUtil.isBlank(param.getValue())) { if (ObjectUtil.isEmpty(param) || StrUtil.isBlank(param.getValue())) {
return true; throw new BadRequestException("系统参数配置错误");
} }
return "1".equals(StrUtil.trim(param.getValue())); String value = StrUtil.trim(param.getValue());
if (!"0".equals(value) && !"1".equals(value)) {
throw new BadRequestException("系统参数配置错误");
}
return value;
}
private SchBasePoint findCloseCbjPoint(String bucketCode, SchBasePoint intoPoint, String cfgPointType) {
SchBasePoint currentBucketPoint = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getVehicle_code, bucketCode), false);
if (ObjectUtil.isNotEmpty(currentBucketPoint)
&& "DTCFGQ".equals(currentBucketPoint.getRegion_code())
&& cfgPointType.equals(currentBucketPoint.getPoint_type())) {
return currentBucketPoint;
}
List<SchBasePoint> canUseCFGJs = pointService.getCanUseCFGJs(intoPoint, "1", cfgPointType);
if (canUseCFGJs.size() == 0) {
throw new BadRequestException("找不到可用的拆封盖机");
}
return canUseCFGJs.get(0);
}
private void prepareBucketForCloseCbjTask(String bucketCode, String vehicleType, SchBasePoint cbjPoint) {
SchBasePoint oldPoint = pointService.getOne(new LambdaQueryWrapper<SchBasePoint>()
.eq(SchBasePoint::getVehicle_code, bucketCode), false);
Structattr oldStruct = iStructattrService.getOne(new LambdaQueryWrapper<Structattr>()
.eq(Structattr::getStoragevehicle_code, bucketCode), false);
if (ObjectUtil.isNotEmpty(oldPoint) && ObjectUtil.isNotEmpty(oldStruct)) {
throw new BadRequestException("料桶码存在多位置绑定,请先处理异常数据");
}
if (ObjectUtil.isNotEmpty(oldPoint)) {
if (!cbjPoint.getPoint_code().equals(oldPoint.getPoint_code())) {
clearBucketFromPoint(oldPoint.getPoint_code());
bindBucketToPoint(cbjPoint.getPoint_code(), bucketCode, vehicleType);
}
return;
}
if (ObjectUtil.isNotEmpty(oldStruct)) {
clearBucketFromStruct(oldStruct.getStruct_code());
bindBucketToPoint(cbjPoint.getPoint_code(), bucketCode, vehicleType);
return;
}
bindBucketToPoint(cbjPoint.getPoint_code(), bucketCode, vehicleType);
}
private void clearBucketFromPoint(String pointCode) {
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getVehicle_code, null)
.set(SchBasePoint::getVehicle_type, null)
.set(SchBasePoint::getPoint_status, "1")
.set(SchBasePoint::getIng_task_code, null)
.eq(SchBasePoint::getPoint_code, pointCode));
}
private void clearBucketFromStruct(String structCode) {
iStructattrService.update(new LambdaUpdateWrapper<Structattr>()
.set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getOccupancy_state, "1")
.set(Structattr::getTask_code, null)
.eq(Structattr::getStruct_code, structCode));
}
private void bindBucketToPoint(String pointCode, String bucketCode, String vehicleType) {
pointService.update(new LambdaUpdateWrapper<SchBasePoint>()
.set(SchBasePoint::getVehicle_code, bucketCode)
.set(SchBasePoint::getVehicle_type, vehicleType)
.set(SchBasePoint::getPoint_status, "3")
.eq(SchBasePoint::getPoint_code, pointCode));
} }
@Override @Override

View File

@@ -395,6 +395,14 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
String iostorinvId = whereJson.getString("iostorinv_id"); String iostorinvId = whereJson.getString("iostorinv_id");
IOStorInv ioStorInv = getOutBillOrThrow(iostorinvId); IOStorInv ioStorInv = getOutBillOrThrow(iostorinvId);
ensureOutBillStatus(ioStorInv, OUT_BILL_STATUS_CREATED); ensureOutBillStatus(ioStorInv, OUT_BILL_STATUS_CREATED);
Integer auditResult = whereJson.getInteger("audit_result");
String remark = whereJson.getString("remark");
if (auditResult == null || (auditResult != 1 && auditResult != 2)) {
throw new BadRequestException("审核结果只能为通过(1)或不通过(2)");
}
if (auditResult == 2 && StrUtil.isBlank(remark)) {
throw new BadRequestException("审核不通过时原因不能为空!");
}
String currentUserId = SecurityUtils.getCurrentUserId(); String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName(); String nickName = SecurityUtils.getCurrentNickName();
@@ -402,10 +410,15 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
IOStorInv updateMst = new IOStorInv(); IOStorInv updateMst = new IOStorInv();
updateMst.setIostorinv_id(iostorinvId); updateMst.setIostorinv_id(iostorinvId);
updateMst.setBill_status(IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_AUDITED)); updateMst.setBill_status(auditResult == 1
? IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_AUDITED)
: IOSEnum.BILL_STATUS.code("完成"));
updateMst.setAudit_optid(currentUserId); updateMst.setAudit_optid(currentUserId);
updateMst.setAudit_optname(nickName); updateMst.setAudit_optname(nickName);
updateMst.setAudit_time(now); updateMst.setAudit_time(now);
if (auditResult == 2) {
updateMst.setRemark(remark);
}
updateMst.setUpdate_optid(currentUserId); updateMst.setUpdate_optid(currentUserId);
updateMst.setUpdate_optname(nickName); updateMst.setUpdate_optname(nickName);
updateMst.setUpdate_time(now); updateMst.setUpdate_time(now);
@@ -413,7 +426,9 @@ public class OutBillServiceImpl extends ServiceImpl<IOStorInvMapper,IOStorInv> i
ioStorInvDtlMapper.update(new IOStorInvDtl(), ioStorInvDtlMapper.update(new IOStorInvDtl(),
new LambdaUpdateWrapper<IOStorInvDtl>() new LambdaUpdateWrapper<IOStorInvDtl>()
.set(IOStorInvDtl::getBill_status, IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_AUDITED)) .set(IOStorInvDtl::getBill_status, auditResult == 1
? IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_AUDITED)
: IOSEnum.BILL_STATUS.code("完成"))
.eq(IOStorInvDtl::getIostorinv_id, iostorinvId) .eq(IOStorInvDtl::getIostorinv_id, iostorinvId)
.eq(IOStorInvDtl::getBill_status, IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_CREATED))); .eq(IOStorInvDtl::getBill_status, IOSEnum.BILL_STATUS.code(OUT_BILL_STATUS_CREATED)));
} }

View File

@@ -1,6 +1,7 @@
package org.nl.wms.warehouse_manage.service.impl; package org.nl.wms.warehouse_manage.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -14,8 +15,10 @@ import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.IdUtil; import org.nl.common.utils.IdUtil;
import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.SecurityUtils;
import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService; import org.nl.wms.basedata_manage.service.IMdMeMaterialbaseService;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleinfoService;
import org.nl.wms.basedata_manage.service.IStructattrService; import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase; import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleinfo;
import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
import org.nl.wms.sch_manage.service.ISchBaseTaskService; import org.nl.wms.sch_manage.service.ISchBaseTaskService;
@@ -79,6 +82,9 @@ public class StIvtMoveinvServiceImpl extends ServiceImpl<StIvtMoveinvMapper, StI
@Autowired @Autowired
private IStructattrService iStructattrService; private IStructattrService iStructattrService;
@Autowired
private IMdPbStoragevehicleinfoService iMdPbStoragevehicleinfoService;
/** /**
* 任务服务 * 任务服务
*/ */
@@ -228,6 +234,7 @@ public class StIvtMoveinvServiceImpl extends ServiceImpl<StIvtMoveinvMapper, StI
@Override @Override
public void confirmTask(StIvtMoveinvdtl dtlDao) { public void confirmTask(StIvtMoveinvdtl dtlDao) {
MdPbStoragevehicleinfo storagevehicleinfo = iMdPbStoragevehicleinfoService.getByCode(dtlDao.getStoragevehicle_code());
// 需要更新库存集合 // 需要更新库存集合
List<JSONObject> updateIvtList = new ArrayList<>(); List<JSONObject> updateIvtList = new ArrayList<>();
// 查询物料 // 查询物料
@@ -263,6 +270,8 @@ public class StIvtMoveinvServiceImpl extends ServiceImpl<StIvtMoveinvMapper, StI
.set(Structattr::getOccupancy_state,"1") .set(Structattr::getOccupancy_state,"1")
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getStoragevehicle_code, null) .set(Structattr::getStoragevehicle_code, null)
.set(Structattr::getStoragevehicle_type, null)
.set(Structattr::getStoragevehicle_qty, 0)
); );
// 更新终点 // 更新终点
iStructattrService.update( iStructattrService.update(
@@ -271,6 +280,8 @@ public class StIvtMoveinvServiceImpl extends ServiceImpl<StIvtMoveinvMapper, StI
.set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定")) .set(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.set(Structattr::getOccupancy_state,"3") .set(Structattr::getOccupancy_state,"3")
.set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code()) .set(Structattr::getStoragevehicle_code, dtlDao.getStoragevehicle_code())
.set(Structattr::getStoragevehicle_type, ObjectUtil.isNotEmpty(storagevehicleinfo) ? storagevehicleinfo.getStoragevehicle_type() : null)
.set(Structattr::getStoragevehicle_qty, 1)
); );
// 更新明细状态 // 更新明细状态

View File

@@ -0,0 +1,2 @@
ALTER TABLE `pdm_bd_workorder`
ADD COLUMN `remark` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NULL DEFAULT NULL COMMENT '备注' AFTER `ext_data`;

View File

@@ -127,6 +127,42 @@
强制完工 强制完工
</el-button> </el-button>
</crudOperation> </crudOperation>
<el-dialog
:close-on-click-modal="false"
:visible.sync="auditDialogVisible"
title="审核"
width="520px"
>
<el-form
ref="auditForm"
:model="auditForm"
:rules="auditRules"
size="mini"
label-width="90px"
label-suffix=":"
>
<el-form-item label="审核结果" prop="audit_result">
<el-radio-group v-model="auditForm.audit_result">
<el-radio :label="1">通过</el-radio>
<el-radio :label="0">不通过</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="原因" prop="remark">
<el-input
v-model="auditForm.remark"
type="textarea"
:rows="4"
maxlength="255"
show-word-limit
placeholder="请输入审核原因"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="closeAuditDialog">取消</el-button>
<el-button type="primary" @click="submitAudit">确认</el-button>
</div>
</el-dialog>
<!--表单组件--> <!--表单组件-->
<el-dialog <el-dialog
:close-on-click-modal="false" :close-on-click-modal="false"
@@ -320,6 +356,17 @@
style="width: 240px;" style="width: 240px;"
/> />
</el-form-item> </el-form-item>
<el-form-item label="备注">
<el-input
v-model="form.remark"
type="textarea"
:rows="3"
maxlength="255"
show-word-limit
style="width: 510px;"
placeholder="请输入备注"
/>
</el-form-item>
<el-form-item v-if="false" label="工单类型" prop="workorder_type"> <el-form-item v-if="false" label="工单类型" prop="workorder_type">
<el-input v-model="form.workorder_type" style="width: 240px;" /> <el-input v-model="form.workorder_type" style="width: 240px;" />
</el-form-item> </el-form-item>
@@ -395,6 +442,12 @@
label="批次号" label="批次号"
:min-width="flexWidth('batch_no',crud.data,'批次号')" :min-width="flexWidth('batch_no',crud.data,'批次号')"
/> />
<el-table-column
prop="remark"
label="备注"
:min-width="flexWidth('remark',crud.data,'备注', 40)"
show-overflow-tooltip
/>
<el-table-column <el-table-column
prop="vehicle_type" prop="vehicle_type"
label="载具类型" label="载具类型"
@@ -545,9 +598,15 @@ const defaultForm = {
plan_weight: 0, plan_weight: 0,
guadansum: 0, guadansum: 0,
ext_data: null, ext_data: null,
remark: null,
priority: 1, priority: 1,
show: false show: false
} }
const defaultAuditForm = {
workorder_id: null,
audit_result: 1,
remark: ''
}
export default { export default {
name: 'PdmBdWorkorder', name: 'PdmBdWorkorder',
dicts: ['storagevehicle_type', 'pdm_workorder_status'], dicts: ['storagevehicle_type', 'pdm_workorder_status'],
@@ -595,6 +654,14 @@ export default {
{ required: true, message: '工单类型不能为空', trigger: 'blur' } { required: true, message: '工单类型不能为空', trigger: 'blur' }
]*/ ]*/
}, },
auditRules: {
audit_result: [
{ required: true, message: '请选择审核结果', trigger: 'change' }
],
remark: [
{ validator: this.validateAuditRemark, trigger: 'blur' }
]
},
queryTypeOptions: [ queryTypeOptions: [
{ key: 'workorder_code', display_name: '工单编号' }, { key: 'workorder_code', display_name: '工单编号' },
{ key: 'point_code', display_name: '设备编码' } { key: 'point_code', display_name: '设备编码' }
@@ -607,6 +674,8 @@ export default {
materialDialog: false, materialDialog: false,
orderDialog: false, orderDialog: false,
batchAdd: false, batchAdd: false,
auditDialogVisible: false,
auditForm: { ...defaultAuditForm },
fullscreenLoading: false, fullscreenLoading: false,
materialCode: null, materialCode: null,
flag: 1 flag: 1
@@ -762,19 +831,54 @@ export default {
} }
this.crud.toQuery() this.crud.toQuery()
}, },
validateAuditRemark(rule, value, callback) {
if (this.auditForm.audit_result === 0 && !value) {
callback(new Error('审核不通过时原因不能为空'))
return
}
callback()
},
closeAuditDialog() {
this.auditDialogVisible = false
this.auditForm = { ...defaultAuditForm }
this.$nextTick(() => {
if (this.$refs.auditForm) {
this.$refs.auditForm.clearValidate()
}
})
},
audit(row) { audit(row) {
if (String(row.workorder_status) !== '1') { if (String(row.workorder_status) !== '1') {
this.$message.warning('仅工单状态为1时允许审核') this.$message.warning('仅工单状态为1时允许审核')
return return
} }
this.fullscreenLoading = true this.auditForm = {
crudPdmBdWorkorder.audit(row).then(res => { ...defaultAuditForm,
this.crud.notify('审核成功', CRUD.NOTIFICATION_TYPE.SUCCESS) workorder_id: row.workorder_id,
this.crud.toQuery() remark: row.remark || ''
}).catch(() => { }
this.fullscreenLoading = false this.auditDialogVisible = true
}).finally(() => { this.$nextTick(() => {
this.fullscreenLoading = false if (this.$refs.auditForm) {
this.$refs.auditForm.clearValidate()
}
})
},
submitAudit() {
this.$refs.auditForm.validate(valid => {
if (!valid) {
return
}
this.fullscreenLoading = true
crudPdmBdWorkorder.audit(this.auditForm).then(res => {
this.crud.notify('审核成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.closeAuditDialog()
this.crud.toQuery()
}).catch(() => {
this.fullscreenLoading = false
}).finally(() => {
this.fullscreenLoading = false
})
}) })
}, },
// 下发 // 下发

View File

@@ -0,0 +1,258 @@
<template>
<div class="app-container">
<div class="head-container">
<div v-if="crud.props.searchToggle">
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-width="90px"
label-suffix=":"
>
<el-form-item label="所属库区">
<el-cascader
placeholder="所属库区"
:options="sects"
:props="{ checkStrictly: true }"
clearable
class="filter-item"
style="width: 200px;"
@change="sectQueryChange"
/>
</el-form-item>
<el-form-item label="仓位搜索">
<el-input
v-model="query.struct_code"
clearable
size="small"
placeholder="仓位编码或名称"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item label="物料搜索">
<el-input
v-model="query.material_code"
clearable
size="small"
placeholder="物料编码、名称或规格"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item label="批次号">
<el-input
v-model="query.pcsn"
clearable
size="small"
placeholder="批次号"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item label="载具号">
<el-input
v-model="query.storagevehicle_code"
clearable
size="small"
placeholder="载具号"
style="width: 200px;"
class="filter-item"
/>
</el-form-item>
<el-form-item label="是否锁定">
<el-select
v-model="query.is_lock"
clearable
size="small"
placeholder="是否锁定"
style="width: 200px;"
class="filter-item"
>
<el-option label="否" value="0" />
<el-option label="是" value="1" />
</el-select>
</el-form-item>
<rrOperation :crud="crud" />
</el-form>
</div>
<crudOperation :permission="permission">
<el-button
slot="right"
class="filter-item"
size="mini"
type="warning"
icon="el-icon-lock"
:disabled="crud.selections.length === 0"
@click="handleStockLock"
>
库存锁定
</el-button>
<el-button
slot="right"
class="filter-item"
size="mini"
type="info"
icon="el-icon-unlock"
:disabled="crud.selections.length === 0"
@click="handleStockUnlock"
>
库存解锁
</el-button>
</crudOperation>
<el-table
ref="table"
v-loading="crud.loading"
:data="crud.data"
size="mini"
style="width: 100%;"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column prop="struct_code" label="仓位编码" :min-width="flexWidth('struct_code',crud.data,'仓位编码')" />
<el-table-column prop="struct_name" label="仓位名称" :min-width="flexWidth('struct_name',crud.data,'仓位名称')" />
<el-table-column prop="stor_name" label="仓库" :min-width="flexWidth('stor_name',crud.data,'仓库')" />
<el-table-column prop="sect_name" label="库区" :min-width="flexWidth('sect_name',crud.data,'库区')" />
<el-table-column prop="material_code" label="物料编码" :min-width="flexWidth('material_code',crud.data,'物料编码')" />
<el-table-column prop="material_name" label="物料名称" :min-width="flexWidth('material_name',crud.data,'物料名称')" />
<el-table-column prop="pcsn" label="批次号" :min-width="flexWidth('pcsn',crud.data,'批次号')" />
<el-table-column prop="storagevehicle_code" label="载具号" :min-width="flexWidth('storagevehicle_code',crud.data,'载具号')" />
<el-table-column prop="qty" label="总数" :formatter="crud.formatNum3" :min-width="100" />
<el-table-column label="可用数" :min-width="100">
<template slot-scope="scope">
<span>{{ scope.row.qty - scope.row.frozen_qty }}</span>
</template>
</el-table-column>
<el-table-column prop="frozen_qty" label="冻结数" :formatter="crud.formatNum3" :min-width="100" />
<el-table-column label="锁定状态" :min-width="100">
<template slot-scope="scope">
<span>{{ formatLockStatus(scope.row.lock_type) }}</span>
</template>
</el-table-column>
<el-table-column prop="qty_unit_name" label="计量单位" :min-width="flexWidth('qty_unit_name',crud.data,'计量单位')" />
<el-table-column prop="remark" label="备注" :min-width="flexWidth('remark',crud.data,'备注')" />
<el-table-column prop="create_time" label="入库时间" width="170" />
<el-table-column prop="supp_code" label="供应商编码" :min-width="flexWidth('supp_code',crud.data,'供应商编码')" />
<el-table-column prop="supp_name" label="供应商名称" :min-width="flexWidth('supp_name',crud.data,'供应商名称')" />
</el-table>
<pagination />
</div>
</div>
</template>
<script>
import stockManageApi from '@/views/wms/st/ivt/stockManage'
import CRUD, { presenter, header, crud } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import crudSectattr from '@/views/wms/basedata/sectattr/sectattr'
export default {
name: 'StockManage',
components: { pagination, rrOperation, crudOperation },
mixins: [presenter(), header(), crud()],
cruds() {
return CRUD({
title: '库存管理', url: 'api/stockManage', idField: 'stockrecord_id', sort: 'stockrecord_id,desc',
optShow: {
add: false,
edit: false,
showDtlLoading: false,
del: false,
download: false,
reset: true
},
crudMethod: { ...stockManageApi }
})
},
data() {
return {
sects: [],
permission: {},
rules: {}
}
},
created() {
crudSectattr.getSect({ stor_id: '' }).then(res => {
this.sects = res.content
})
},
methods: {
hand(value) {
this.crud.toQuery()
},
sectQueryChange(val) {
if (val.length === 1) {
this.query.stor_id = val[0]
this.query.sect_code = ''
}
if (val.length === 0) {
this.query.sect_code = ''
this.query.stor_id = ''
}
if (val.length === 2) {
this.query.stor_id = val[0]
this.query.sect_code = val[1]
}
this.crud.toQuery()
},
querytable() {
this.crud.toQuery()
},
formatLockStatus(lockType) {
return String(lockType || '0') === '0' ? '否' : '是'
},
handleStockLock() {
this.promptLockReason('库存锁定原因', '请输入锁定原因', reason => {
this.changeStockLock('99', reason, '库存锁定成功')
})
},
handleStockUnlock() {
this.promptLockReason('库存解锁原因', '请输入解锁原因', reason => {
this.changeStockLock('0', reason, '库存解锁成功')
})
},
promptLockReason(title, inputPlaceholder, onConfirm) {
this.$prompt('', title, {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPlaceholder,
inputValidator: value => {
if (!value || !value.trim()) {
return '原因不能为空'
}
return true
}
}).then(({ value }) => {
onConfirm(value.trim())
}).catch(() => {})
},
changeStockLock(lockType, remark, message) {
const selectedRows = this.crud.selections || []
const structMap = new Map()
selectedRows.forEach(row => {
if (row.struct_code) {
structMap.set(row.struct_code, {
struct_code: row.struct_code,
lock_type: lockType,
remark
})
}
})
const payload = Array.from(structMap.values())
if (payload.length === 0) {
this.$message({
type: 'warning',
message: '请选择需要操作的库存数据'
})
return
}
stockManageApi.updateLock(payload).then(() => {
this.crud.notify(message, CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
}
}
}
</script>

View File

@@ -0,0 +1,11 @@
import request from '@/utils/request'
export function updateLock(data) {
return request({
url: 'api/stockManage/updateLock',
method: 'post',
data
})
}
export default { updateLock }

View File

@@ -155,6 +155,42 @@
强制确认 强制确认
</el-button> </el-button>
</crudOperation> </crudOperation>
<el-dialog
:close-on-click-modal="false"
:visible.sync="auditDialogVisible"
title="审核"
width="520px"
>
<el-form
ref="auditForm"
:model="auditForm"
:rules="auditRules"
size="mini"
label-width="90px"
label-suffix=":"
>
<el-form-item label="审核结果" prop="audit_result">
<el-radio-group v-model="auditForm.audit_result">
<el-radio :label="1">通过</el-radio>
<el-radio :label="2">不通过</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="原因" prop="remark">
<el-input
v-model="auditForm.remark"
type="textarea"
:rows="4"
maxlength="255"
show-word-limit
placeholder="请输入审核原因"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="closeAuditDialog">取消</el-button>
<el-button type="primary" @click="submitAudit">确认</el-button>
</div>
</el-dialog>
<!--表格渲染--> <!--表格渲染-->
<el-table <el-table
ref="table" ref="table"
@@ -234,6 +270,11 @@ import ViewDialog from '@/views/wms/st/outbill/ViewDialog'
import crudBsrealstorattr from '@/views/wms/basedata/bsrealstorattr/bsrealstorattr' import crudBsrealstorattr from '@/views/wms/basedata/bsrealstorattr/bsrealstorattr'
const start = new Date() const start = new Date()
const defaultAuditForm = {
iostorinv_id: null,
audit_result: 1,
remark: ''
}
export default { export default {
name: 'Checkoutbill', name: 'Checkoutbill',
@@ -264,6 +305,16 @@ export default {
}, },
loadingConfirm: false, loadingConfirm: false,
loadingAudit: false, loadingAudit: false,
auditDialogVisible: false,
auditForm: { ...defaultAuditForm },
auditRules: {
audit_result: [
{ required: true, message: '请选择审核结果', trigger: 'change' }
],
remark: [
{ validator: this.validateAuditRemark, trigger: 'blur' }
]
},
divShow: false, divShow: false,
audit_flag: true, audit_flag: true,
dis_flag: true, dis_flag: true,
@@ -405,14 +456,49 @@ export default {
this.mstrow = this.currentRow this.mstrow = this.currentRow
}) })
}, },
validateAuditRemark(rule, value, callback) {
if (this.auditForm.audit_result === 2 && !value) {
callback(new Error('审核不通过时原因不能为空'))
return
}
callback()
},
closeAuditDialog() {
this.auditDialogVisible = false
this.auditForm = { ...defaultAuditForm }
this.$nextTick(() => {
if (this.$refs.auditForm) {
this.$refs.auditForm.clearValidate()
}
})
},
audit() { audit() {
this.loadingAudit = true this.auditForm = {
checkoutbill.audit({ 'iostorinv_id': this.currentRow.iostorinv_id }).then(() => { ...defaultAuditForm,
this.querytable() iostorinv_id: this.currentRow.iostorinv_id,
this.crud.notify('审核成功!', CRUD.NOTIFICATION_TYPE.SUCCESS) remark: this.currentRow.remark || ''
this.loadingAudit = false }
}).catch(() => { this.auditDialogVisible = true
this.loadingAudit = false this.$nextTick(() => {
if (this.$refs.auditForm) {
this.$refs.auditForm.clearValidate()
}
})
},
submitAudit() {
this.$refs.auditForm.validate(valid => {
if (!valid) {
return
}
this.loadingAudit = true
checkoutbill.audit(this.auditForm).then(() => {
this.closeAuditDialog()
this.querytable()
this.crud.notify('审核成功!', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.loadingAudit = false
}).catch(() => {
this.loadingAudit = false
})
}) })
}, },
confirm() { confirm() {