add:二期出库

This commit is contained in:
2024-01-24 14:01:54 +08:00
parent d93fe3a4ed
commit b3da793a4c
21 changed files with 2442 additions and 34 deletions

View File

@@ -0,0 +1,187 @@
package org.nl.b_lms.sch.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.sch.AcsTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.st.inbill.service.CheckOutBillService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Lxy on 2021/12/22.
*/
@Component
@RequiredArgsConstructor
public class TwoOutTask extends AbstractAcsTask {
private final String THIS_CLASS = TwoOutTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
/*
* 下发给ACS时需要特殊处理
*/
//任务表
WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject map = new JSONObject();
map.put("flag", "1");
map.put("handle_class", THIS_CLASS);
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> resultList = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
char dtl_type = json.getString("task_type").charAt(json.getString("task_type").length() - 1);
AcsTaskDto dto = AcsTaskDto.builder()
.ext_task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(json.getString("point_code1"))
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.priority(json.getString("priority"))
.class_type(json.getString("task_type"))
.dtl_type(String.valueOf(dtl_type))
.remark(json.getString("remark"))
.build();
resultList.add(dto);
// 更新任务为下发
JSONObject paramMap = new JSONObject();
paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode());
wo_Task.update(paramMap, "task_id ='" + json.getString("task_id") + "'");
}
return resultList;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject taskObj, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject disTab = WQLObject.getWQLObject("st_ivt_iostorinvdis"); // 出入库分配表
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "' and task_status < '07'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonTask)) {
if (StrUtil.equals(status, "0")) {
// 任务为执行之后就不允许取消
if (jsonTask.getIntValue("task_status") > Integer.valueOf(TaskStatusEnum.ISSUE.getCode())) {
throw new BadRequestException("任务:" + jsonTask.getString("task_code") + "已执行,不可取消");
}
// 更新删除字段
jsonTask.put("is_delete", "1");
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
// 更新分配明细为:未生成
JSONObject map = new JSONObject();
map.put("work_status", "00");
map.put("point_id", "");
disTab.update(map, "task_id = '" + task_id + "'");
}
if (TaskStatusEnum.EXECUTING.getCode().equals(status)) {
// 更新任务状态为执行中
jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
}
if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) {
String currentUserId = SecurityUtils.getCurrentUserId();
String currentUsername = SecurityUtils.getCurrentUsername();
// 判断此任务是否有任务组
String task_group_id = jsonTask.getString("task_group_id");
if (ObjectUtil.isNotEmpty(task_group_id)) {
// 上一个任务组顺序号
String sort_seq_last = NumberUtil.sub(jsonTask.getString("sort_seq"), "1").toString();
}
// 调用标识完成
CheckOutBillService checkOutBillService = SpringContextHolder.getBean(CheckOutBillService.class);
checkOutBillService.finishTask(jsonTask);
// 更改任务状态为完成
jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode());
jsonTask.put("update_optid", currentUserId);
jsonTask.put("update_optname", currentUsername);
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
}
}
}
@Override
public void findStartPoint() {
}
@Override
public void findNextPoint() {
}
@Override
public String createTask(JSONObject form) {
String currentUserId = SecurityUtils.getCurrentUserId();
String currentUsername = SecurityUtils.getCurrentUsername();
JSONObject json = new JSONObject();
json.put("task_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_code", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_type", form.getString("task_type"));
json.put("vehicle_code", form.getString("vehicle_code"));
json.put("task_name", form.getString("task_name"));
json.put("point_code1", form.getString("point_code1"));
json.put("point_code2", form.getString("point_code2"));
json.put("material_id", form.getString("material_id"));
json.put("task_group_id", form.getString("task_group_id"));
json.put("sort_seq", form.getString("sort_seq"));
json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
json.put("handle_class", THIS_CLASS);
json.put("create_id", currentUserId);
json.put("create_name", currentUsername);
json.put("create_time", DateUtil.now());
json.put("acs_task_type", "7");
WQLObject.getWQLObject("SCH_BASE_Task").insert(json);
return json.getString("task_id");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void forceFinish(String task_id) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode());
}
@Override
public void cancel(String task_id) {
JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
this.updateTaskStatus(taskObj, "0");
}
}

View File

@@ -46,6 +46,18 @@ public enum IOSEnum {
"手工出库", "1009"
)),
//移库单据类型
MOVE_TYPE(MapOf.of("出库移库", "21")),
//移库单据装填
MOVE_STATUS(MapOf.of("生成", "10","提交","20","执行中","30","完成","99")),
//出库单分配类型
OUT_DIV_TYPE(MapOf.of("全部分配", "1","自动分配","2")),
//出库单取消分配类型
OUT_CANCEL_TYPE(MapOf.of("全部取消", "1","自动取消","2","删除一个","3")),
//仓位锁定类型
LOCK_TYPE(MapOf.of("未锁定", "1", "入库锁", "2", "出库锁", "3", "空托盘出库锁", "4",
"空托盘入库锁", "5", "移出锁", "6", "移入锁", "7", "其它", "99"
@@ -57,14 +69,20 @@ public enum IOSEnum {
//仓位锁定类型
LOCK_OPERATE(MapOf.of("入库锁定", "1","入库取消","2")),
//库存品质类型
QUALITY_SCODE(MapOf.of("待检品", "00","合格品","01","不合格","02")),
//库区类型
SECT_TYPE(MapOf.of("主存区", "00","暂存区","01","虚拟区","09")),
//库存变动类型
IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32")),
IVT_CHANGE(MapOf.of("加待入", "31","加库存","33","减待入","32","加冻结","11","减冻结","12","减库存","21")),
//仓位伸位
ZDEPTH_STRUCT(MapOf.of("", "1","","2","","3")),
//外部系统
EXT_SYSTEM(MapOf.of("mes", "mes","sap","sap","crm","crm")),
;
private Map<String, String> code;

View File

@@ -1,8 +1,12 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
import org.springframework.data.domain.Pageable;
import java.util.Map;
/**
* <p>
@@ -13,4 +17,106 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
* @since 2023-11-10
*/
public interface IStIvtIostorinvOutService extends IService<StIvtIostorinv> {
/**
* 新增出库单
* @param whereJson {
* biz_date: 业务日期
* stor_code 仓库编码
* stor_id 仓库标识
* stor_name 仓库名称
* total_qty 总数量
* remark 备注
* bill_status 单据状态
* detail_count 明细数
* create_mode 创建方式
* bill_type 业务类型
* out_stor_id 移出仓库标识
* tableData[
* {
* qty_unit_id 计量单位标识
* qty_unit_name 计量单位名称
* plan_qty 计划数量
* canuse_qty 可用数量
* stockrecord_id 库存记录标识
* instorage_time 入库时间
* quality_scode 品质类型
* struct_id 仓位标识
* struct_name 仓位名称
* struct_code 仓位编码
* material_id 物料标识
* material_name 物料名称
* material_code 物料编码
* pcsn 批次
* box_no 箱号
* sap_pcsn sap批次
* 外部系统:
* }
* ]
* }
* @return iostorinv_id 主表标识
*/
String insertMst(JSONObject whereJson);
/**
* 出库单修改
* @param whereJson {
* 参数桶入库新增
* }
*/
void update(JSONObject whereJson);
/**
* 删除出库单
* @param ids[主表标识]
*/
void deleteAll(Long[] ids);
/**
* 全部分配 || 自动分配
* @param whereJson{
* 全部分配: 主表对象
* 自动分配: 明细对象
* }
*/
void allDiv(JSONObject whereJson);
/**
* 手工分配
* @param whereJson{
* row明细对象
* ros[库存对象]
* }
*/
void manualDiv(JSONObject whereJson);
/**
* 取消分配:全部取消 || 自动取消 || 删除分配明细
* @param whereJson : {
* 全部取消:主表对象
* 自动取消:明细对象
* 删除分配明细:分配明细对象
* }
*/
void cancelDiv(JSONObject whereJson);
/**
* 全部设置站点
* @param whereJson {
* iostorinv_id 单据标识
* bill_code单据编码
* checked是否异常出库
* point_code终点编码
* }
*/
void allSetPoint(JSONObject whereJson);
/**
* 出库强制确认
* @param whereJson {
* iostorinv_id 主表标识
* }
*/
void confirm(JSONObject whereJson);
}

View File

@@ -65,7 +65,7 @@ public interface IStIvtIostorinvService extends IService<StIvtIostorinv> {
void update(Map whereJson);
/**
* 删除库单
* 删除库单
* @param ids[主表标识]
*/
void deleteAll(Long[] ids);

View File

@@ -19,7 +19,7 @@ import java.util.List;
public interface IStIvtIostorinvdtlService extends IService<StIvtIostorinvdtl> {
/**
* 新增入库明细
* 新增入库明细
*
* @param rows: {
* package_box_sn:木箱号
@@ -44,6 +44,31 @@ public interface IStIvtIostorinvdtlService extends IService<StIvtIostorinvdtl> {
*/
HashMap<String, ArrayList<JSONObject>> insertDtl(List<JSONObject> rows, Long iostorinv_id);
/**
* 新增入出库明细
*
* @param rows: {
* qty_unit_id 计量单位标识
* qty_unit_name 计量单位名称
* plan_qty 计划数量
* canuse_qty 可用数量
* stockrecord_id 库存记录标识
* instorage_time 入库时间
* quality_scode 品质类型
* struct_id 仓位标识
* struct_name 仓位名称
* struct_code 仓位编码
* material_id 物料标识
* material_name 物料名称
* material_code 物料编码
* pcsn 批次
* box_no 箱号
* sap_pcsn sap批次
* }
* @param iostorinv_id: 主表标识
*/
void insertOutDtl(List<JSONObject> rows, Long iostorinv_id);
/**
* 更新明细状态
*

View File

@@ -3,6 +3,10 @@ package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
/**
* <p>

View File

@@ -1,8 +1,11 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import java.util.List;
/**
* <p>
* 出入库单分配表 Mapper 接口
@@ -13,4 +16,34 @@ import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
*/
public interface StIvtIostorinvdisMapper extends BaseMapper<StIvtIostorinvdis> {
/**
* 获取全部已分配未下发的分配明细
* @param whereJson :{
* iostorinvdtl_id 明细标识 (自动取消时传)
* box_no 箱号 (自动取消时传)
* iostorinv_id 单据标识
* bill_status 明细状态
* is_issued 是否已下发
* }
* @return List<JSONObject> 分配明细实体类集合
*/
List<JSONObject> getDivIosDisAll(JSONObject whereJson);
/**
*
* @param list [明细标识]
* @return List<JSONObject> 分配明细集合
*/
List<JSONObject> getDivTaskDis(List<String> list);
/**
* 获取此单据下/此明细下 所有未生成的分配明细
* @param whereJson :{
* iostorinvdtl_id 明细标识
* iostorinv_id 单据标识
* }
* @return List<JSONObject> 分配明细实体类集合
*/
List<JSONObject> getNotCreateDis(JSONObject whereJson);
}

View File

@@ -2,4 +2,130 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdisMapper">
<select id="getDivIosDisAll" resultType="com.alibaba.fastjson.JSONObject">
SELECT
dis.*,
ios.io_type,
ios.bill_code,
mb.material_code,
mb.material_name,
task.task_code,
task.task_status,
task.task_type,
point2.point_code,
sub.sap_pcsn,
attr.out_order_seq,
attr.row_num,
attr.col_num,
attr.layer_num,
attr.block_num,
attr.placement_type,
sub.sale_order_name,
sub.width_standard,
dis.plan_qty AS canuse_qty
FROM
ST_IVT_IOStorInvDis dis
LEFT JOIN ST_IVT_IOStorInv ios ON ios.iostorinv_id = dis.iostorinv_id
LEFT JOIN md_me_materialbase mb ON mb.material_id = dis.material_id
LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0'
LEFT JOIN SCH_BASE_Point point2 ON point2.point_id = dis.point_id
LEFT JOIN st_ivt_structattr attr ON attr.struct_id = dis.struct_id
LEFT JOIN pdm_bi_subpackagerelationrecord sub ON sub.container_name = dis.pcsn AND ios.bill_code = sub.bill_code
WHERE
1 = 1
<if test="iostorinvdtl_id != null and iostorinvdtl_id != ''">
AND dis.iostorinvdtl_id= #{iostorinvdtl_id}
</if>
<if test="task_id != null and task_id != ''">
AND dis.task_id = #{task_id}
</if>
<if test="iostorinv_id != null and iostorinv_id != ''">
AND dis.iostorinv_id = #{iostorinv_id}
</if>
<if test="iostorinvdis_id != null and iostorinvdis_id != ''">
AND dis.iostorinvdis_id = #{iostorinvdis_id}
</if>
<if test="is_issued != null and is_issued != ''">
AND dis.is_issued = #{is_issued}
</if>
<if test="box_no != null and box_no != ''">
AND dis.box_no = #{box_no}
</if>
<if test="work_status != null and work_status != ''">
AND #{work_status} >= dis.work_status
</if>
order by dis.box_no,dis.pcsn
</select>
<select id="getDivTaskDis" resultType="com.alibaba.fastjson.JSONObject">
SELECT
dis.iostorinvdis_id
FROM
ST_IVT_IOStorInvDis dis
WHERE
dis.work_status IN ('02', '99')
<if test="list != null and list != ''">
and dis.iostorinvdtl_id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</if>
UNION
SELECT
dis.iostorinvdis_id
FROM
ST_IVT_IOStorInvDis dis
LEFT JOIN SCH_BASE_Task task ON dis.task_id = task.task_id AND task.is_delete = '0'
WHERE
dis.work_status = '01'
AND task.task_status IN ('02', '03','05','06','99')
<if test="list != null and list != ''">
and dis.iostorinvdtl_id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
<select id="getNotCreateDis" resultType="com.alibaba.fastjson.JSONObject">
SELECT
dis.*,
sub.box_length,
sub.box_width,
sub.box_high,
sub.sale_order_name
FROM
ST_IVT_IOStorInvDis dis
LEFT JOIN pdm_bi_subpackagerelation sub ON sub.container_name = dis.pcsn
WHERE
1 = 1
<if test="iostorinvdtl_id != null and iostorinvdtl_id != ''">
AND dis.iostorinvdtl_id= #{iostorinvdtl_id}
</if>
<if test="iostorinv_id != null and iostorinv_id != ''">
AND dis.iostorinv_id = #{iostorinv_id}
</if>
<if test="iostorinvdis_id != null and iostorinvdis_id != ''">
AND dis.iostorinvdis_id = #{iostorinvdis_id}
</if>
</select>
</mapper>

View File

@@ -279,15 +279,16 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
attrParam.put("material_id", disDao.getMaterial_id());
attrParam.put("box_no", disDao.getBox_no());
jsonAttr = inBussManageService.getOneStruct(attrParam);
JSONObject jsonSect = sectTab.query("sect_id = '" + jsonObject.getString("sect_id") + "'").uniqueResult(0);
// 判断是否是虚拟区
if (jsonSect.getString("sect_type_attr").equals(IOSEnum.SECT_TYPE.code("虚拟区"))) {
jsonAttr = attrTab.query("sect_id = '" + jsonObject.getString("sect_id") + "' AND lock_type = '1' AND is_delete = '0' AND IFNULL( storagevehicle_code, '' ) = ''").uniqueResult(0);
} else {
jsonAttr = inBussManageService.getOneStruct(attrParam);
}
} else {
// 指定分配
jsonLock.put("inv_type", mstDao.getBill_type());
jsonLock.put("inv_id", mstDao.getIostorinv_id());
jsonLock.put("inv_code", mstDao.getBill_code());
jsonLock.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
jsonLock.put("operate", IOSEnum.IO_TYPE.code("入库"));
jsonAttr = attrTab.query("struct_id = '" + jsonDis.getString("struct_id") + "'").uniqueResult(0);
}
@@ -297,6 +298,12 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
// 调用业务处理类锁定货位
paramLockList.add(jsonAttr.getString("struct_code"));
jsonLock.put("inv_type", mstDao.getBill_type());
jsonLock.put("inv_id", mstDao.getIostorinv_id());
jsonLock.put("inv_code", mstDao.getBill_code());
jsonLock.put("lock_type", IOSEnum.LOCK_TYPE.code("入库锁"));
jsonLock.put("operate", IOSEnum.IO_TYPE.code("入库"));
inBussManageService.lockStruct(paramLockList, jsonLock);
// 判断是否虚拟区
@@ -702,6 +709,12 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
// 仓位表
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
// 子卷包装关系表
WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
// 包装关系出入库记录表
WQLObject subRecordTab = WQLObject.getWQLObject("pdm_bi_subpackagerelationrecord");
// 更新库存
List<StIvtIostorinvdis> disDaoList = iStIvtIostorinvdisService.list(
new QueryWrapper<StIvtIostorinvdis>().lambda()
@@ -782,6 +795,47 @@ public class StIvtIostorinvServiceImpl extends ServiceImpl<StIvtIostorinvMapper,
taskTab.update(jsonTaskParam,"task_id IN ('"+task_id_in+"') AND task_status <> '"+TaskStatusEnum.FINISHED.getCode()+"'");
// 更新子卷包装关系
String pcsn_in = disDaoList.stream()
.map(StIvtIostorinvdis::getPcsn)
.collect(Collectors.joining("','"));
JSONObject jsonSubParam = new JSONObject();
jsonSubParam.put("status", SUBEnum.STATUS.code("入库"));
subTab.update(jsonSubParam,"container_name IN ('"+pcsn_in+"')");
/*
* 插入子卷包装关系出入记录
*/
// 子卷包装集合
List<JSONObject> subList = subTab.query("container_name IN ('" + pcsn_in + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
for (int i = 0; i < disDaoList.size(); i++) {
StIvtIostorinvdis disDao = disDaoList.get(i);
List<JSONObject> subJoList = subList.stream()
.filter(row -> row.getString("container_name").equals(disDao.getPcsn()))
.collect(Collectors.toList());
JSONObject jsonSub;
if (ObjectUtil.isNotEmpty(subJoList)) {
jsonSub = subJoList.get(0);
} else {
throw new BadRequestException("未查询到子卷号为:" + disDao.getPcsn() + "对应的包装关系!");
}
//插入包装关系出入库记录表
jsonSub.put("bill_code", mstDao.getBill_code());
jsonSub.put("bill_id", mstDao.getIostorinv_id());
jsonSub.put("bill_type", mstDao.getBill_type());
jsonSub.put("io_type", IOSEnum.IO_TYPE.code("入库"));
jsonSub.put("insert_time", DateUtil.now());
jsonSub.put("record_id", cn.hutool.core.util.IdUtil.getSnowflake(1, 1).nextId());
subRecordTab.insert(jsonSub);
}
//返检入库将回传字段改为1
if (mstDao.getBill_type().equals(IOSEnum.IN_TYPE.code("返检入库"))) {
mstDao.setIs_upload(IOSEnum.IS_NOTANDYES.code(""));

View File

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.b_lms.pdm_manage.enums.SUBEnum;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdisService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.mapper.StIvtIostorinvdtlMapper;
@@ -41,8 +43,16 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl<StIvtIostorinvdtlM
@Autowired
private IStIvtIostorinvdisService iStIvtIostorinvdisService;
/**
* 入库服务
*/
@Autowired
private IStIvtIostorinvService iStIvtIostorinvService;
@Override
public HashMap<String, ArrayList<JSONObject>>insertDtl(List<JSONObject> rows, Long iostorinv_id) {
StIvtIostorinv mstDao = iStIvtIostorinvService.getById(iostorinv_id);
// 先删除所有明细并更新子卷包装关系
updateSub(iostorinv_id);
@@ -130,6 +140,12 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl<StIvtIostorinvdtlM
dtlDao.setBase_billdtl_id(row.getLongValue("base_billdtl_id"));
}
if (mstDao.getBill_type().equals(IOSEnum.IN_TYPE.code("调拨入库"))) {
dtlDao.setBill_status(IOSEnum.BILL_STATUS.code("分配中"));
dtlDao.setUnassign_qty(BigDecimal.valueOf(0));
}
dtlDaoList.add(dtlDao);
// 1明细对应多条分配明细此处为1对1
@@ -147,6 +163,103 @@ public class StIvtIostorinvdtlServiceImpl extends ServiceImpl<StIvtIostorinvdtlM
return map;
}
@Override
public void insertOutDtl(List<JSONObject> rows, Long iostorinv_id) {
// 删除明细
this.remove(
new QueryWrapper<StIvtIostorinvdtl>().lambda()
.eq(StIvtIostorinvdtl::getIostorinv_id, iostorinv_id)
);
// 查询所有对应物料集合
String materialIdIn = rows.stream()
.map(row -> JSONObject.parseObject(JSON.toJSONString(row)).getString("material_id"))
.distinct()
.collect(Collectors.joining("','"));
List<JSONObject> materList = WQLObject.getWQLObject("md_me_materialbase")
.query("material_id in ('" + materialIdIn + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 查询所有物料对应的计量单位
String unitIdIn = materList.stream()
.map(row -> row.getString("base_unit_id"))
.distinct()
.collect(Collectors.joining("','"));
List<JSONObject> unitList = WQLObject.getWQLObject("md_pb_measureunit")
.query("measure_unit_id in ('" + unitIdIn + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 明细批量插入集合
ArrayList<StIvtIostorinvdtl> dtlDaoList = new ArrayList<>();
for (int i = 0; i < rows.size(); i++) {
JSONObject row = rows.get(i);
// 匹配对应物料
List<JSONObject> materDaoList = materList.stream()
.filter(item -> item.getString("material_id").equals(row.getString("material_id")))
.collect(Collectors.toList());
if (ObjectUtil.isEmpty(materDaoList)) {
throw new BadRequestException("物料:"+row.getString("product_name")+"不存在,请检查数据!");
}
JSONObject materDao = materDaoList.get(0);
// 匹配物料对应的计量单位
List<JSONObject> unitDaoList = unitList.stream()
.filter(item -> item.getString("measure_unit_id").equals(materDao.getString("base_unit_id")))
.collect(Collectors.toList());
if (ObjectUtil.isEmpty(unitDaoList)) {
throw new BadRequestException("物料:"+row.getString("product_name")+"的计量单位不存在,请检查数据!");
}
JSONObject unitDao = unitDaoList.get(0);
StIvtIostorinvdtl dtlDao = StIvtIostorinvdtl.builder()
.iostorinvdtl_id(IdUtil.getLongId())
.iostorinv_id(iostorinv_id)
.seq_no(BigDecimal.valueOf(i+1))
.material_id(materDao.getLongValue("material_id"))
.pcsn(row.getString("pcsn"))
.quality_scode(row.getString("quality_scode"))
.bill_status(IOSEnum.BILL_STATUS.code("生成"))
.qty_unit_id(unitDao.getLongValue("measure_unit_id"))
.qty_unit_name(unitDao.getString("unit_name"))
.plan_qty(row.getBigDecimal("plan_qty"))
.source_bill_type(row.getString("source_bill_type"))
.source_bill_code(row.getString("source_bill_code"))
.source_bill_table(row.getString("source_bill_table"))
.base_bill_type(row.getString("base_bill_type"))
.base_bill_code(row.getString("base_bill_code"))
.base_bill_table(row.getString("base_bill_table"))
.remark(row.getString("remark"))
.assign_qty(BigDecimal.valueOf(0))
.unassign_qty(row.getBigDecimal("plan_qty"))
.box_no(row.getString("box_no"))
.vbeln(row.getString("vbeln"))
.posnr(row.getString("posnr"))
.width(row.getString("width")).build();
if (ObjectUtil.isNotEmpty(row.getString("source_billdtl_id"))) {
dtlDao.setSource_billdtl_id(row.getLongValue("source_billdtl_id"));
}
if (ObjectUtil.isNotEmpty(row.getString("base_billdtl_id"))) {
dtlDao.setBase_billdtl_id(row.getLongValue("base_billdtl_id"));
}
dtlDaoList.add(dtlDao);
}
this.saveBatch(dtlDaoList);
}
@Override
public void updateStatus(Long iostorinvdtl_id) {

View File

@@ -446,10 +446,16 @@ public class InBussManageServiceImpl implements InBussManageService {
// 判断是否有木箱
JSONObject jsonAttrDark = darkAttr.get(0);
if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code")) && jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
jsonAttr = json;
if (ObjectUtil.isNotEmpty(jsonAttrDark.getString("storagevehicle_code"))) {
if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
jsonAttr = json;
}
} else {
jsonAttr = jsonAttrDark;
if (jsonAttrDark.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) {
jsonAttr = jsonAttrDark;
}
}
}

View File

@@ -0,0 +1,438 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.b_lms.sch.tasks.TwoOutTask;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvdtlService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.InBussManageService;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service.OutBussManageService;
import org.nl.common.utils.IdUtil;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.pda.mps.eum.RegionTypeEnum;
import org.nl.wms.st.inbill.service.StorPublicService;
import org.nl.wms.st.instor.service.HandMoveStorService;
import org.nl.wms.st.instor.task.HandMoveStorAcsTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* <p>
* 出库业务处理 服务实现类
* </p>
*
* @author generator
* @since 2023-11-10
*/
@Service
public class OutBussManageServiceImpl implements OutBussManageService {
/**
* 出库主表服务
*/
@Autowired
private IStIvtIostorinvOutService stIvtIostorinvOutService;
/**
* 出入库明细服务
*/
@Autowired
private IStIvtIostorinvdtlService iStIvtIostorinvdtlService;
/**
* 仓位库存服务
*/
@Autowired
private StorPublicService storPublicService;
/**
* 入库业务处理服务
*/
@Autowired
private InBussManageService inBussManageService;
/**
* 移库服务
*/
@Autowired
private HandMoveStorService handMoveStorService;
@Override
@Transactional
public void lockStruct(List<String> param, JSONObject json) {
if (ObjectUtil.isEmpty(param)) {
throw new BadRequestException("锁定或解锁仓位不能为空!");
}
// 仓位表
WQLObject attrTab = WQLObject.getWQLObject("ST_IVT_StructAttr");
String operate = json.getString("operate");
if (operate.equals(IOSEnum.IO_TYPE.code("出库"))) {
attrTab.update(json, "struct_code IN ('" + String.join("','", param) + "')");
}
}
@Override
public List<StIvtIostorinvdis> divIvt(StIvtIostorinvdtl dtlDao, List<JSONObject> ivtList) {
StIvtIostorinv mstDao = stIvtIostorinvOutService.getById(dtlDao.getIostorinv_id());
// 需要返回的分配明细对象集合
List<StIvtIostorinvdis> resultDisList = new ArrayList<>();
// 需要更新库存的集合
List<JSONObject> updateIvtList = new ArrayList<>();
// 已分配重量
double assign_qty = dtlDao.getAssign_qty().doubleValue();
// 未分配重量
double unassign_qty = dtlDao.getUnassign_qty().doubleValue();
if (ObjectUtil.isNotEmpty(dtlDao.getSource_bill_code())) {
// 有订单号: 找相同物料、订单号的库存,并根据仓位分组、即木箱分组
Map<String, List<JSONObject>> likeMaterOrderMap = ivtList.stream()
.filter(row -> row.getString("material_id").equals(dtlDao.getMaterial_id().toString()) &&
row.getString("sale_order_name").equals(dtlDao.getSource_bill_code()))
.collect(Collectors.groupingBy(row -> row.getString("struct_code")));
if (ObjectUtil.isEmpty(likeMaterOrderMap)) {
throw new BadRequestException("库存不足!");
}
for (String struct_code : likeMaterOrderMap.keySet()) {
// 判断是否继续分配库存
if (unassign_qty <= 0) {
break;
}
// 相同箱号的库存
List<JSONObject> likeBoxList = likeMaterOrderMap.get(struct_code);
// 计算重量
double canuse_qty = likeBoxList.stream()
.map(row -> row.getBigDecimal("canuse_qty"))
.reduce(BigDecimal.ZERO, BigDecimal::add)
.doubleValue();
// 加已分配重量
assign_qty = NumberUtil.add(assign_qty, canuse_qty);
// 减未分配重量
if (unassign_qty >= canuse_qty) {
unassign_qty = NumberUtil.sub(unassign_qty, canuse_qty);
} else {
unassign_qty = 0;
}
// 添加需要更新的库存
updateIvtList.addAll(likeBoxList);
// 添加生成分配明细
List<StIvtIostorinvdis> disDaoList= divDisParam(likeBoxList, dtlDao);
resultDisList.addAll(disDaoList);
}
} else {
// 确定子卷: 找相同物料、批次的箱子
List<JSONObject> likePcsnBoxList = ivtList.stream()
.filter(row -> row.getString("material_id").equals(dtlDao.getMaterial_id().toString()) &&
row.getString("pcsn").equals(dtlDao.getPcsn())
)
.collect(Collectors.toList());
if (ObjectUtil.isEmpty(likePcsnBoxList)) {
throw new BadRequestException("库存不足!");
}
// 计算重量
double canuse_qty = likePcsnBoxList.stream()
.map(row -> row.getBigDecimal("canuse_qty"))
.reduce(BigDecimal.ZERO, BigDecimal::add)
.doubleValue();
unassign_qty = 0;
assign_qty = NumberUtil.add(assign_qty, canuse_qty);
// 添加需要更新的库存
updateIvtList.addAll(likePcsnBoxList);
// 添加生成分配明细
List<StIvtIostorinvdis> disDaoList= divDisParam(likePcsnBoxList, dtlDao);
resultDisList.addAll(disDaoList);
}
// 更新库存
upateIvt(updateIvtList, mstDao, IOSEnum.IVT_CHANGE.code("加冻结"));
// 更新明细
dtlDao.setAssign_qty(BigDecimal.valueOf(assign_qty));
dtlDao.setUnassign_qty(BigDecimal.valueOf(unassign_qty));
dtlDao.setBill_status(unassign_qty == 0 ? IOSEnum.BILL_STATUS.code("分配完") : IOSEnum.BILL_STATUS.code("分配中"));
iStIvtIostorinvdtlService.updateById(dtlDao);
return resultDisList;
}
@Override
public List<StIvtIostorinvdis> manualDivIvt(StIvtIostorinvdtl dtlDao, List<JSONObject> ivtList) {
/*更新明细*/
// 加已分配数量
double canuse_qty = ivtList.stream()
.map(row -> row.getBigDecimal("canuse_qty"))
.reduce(BigDecimal.ZERO, BigDecimal::add)
.doubleValue();
dtlDao.setAssign_qty(NumberUtil.add(dtlDao.getAssign_qty(),canuse_qty));
// 减未分配数量
dtlDao.setUnassign_qty(NumberUtil.sub(dtlDao.getUnassign_qty(), canuse_qty));
if (dtlDao.getUnassign_qty().doubleValue() <= 0 ) {
dtlDao.setUnassign_qty(BigDecimal.valueOf(0));
}
dtlDao.setBill_status(dtlDao.getUnassign_qty().doubleValue() == 0 ? IOSEnum.BILL_STATUS.code("分配完") : IOSEnum.BILL_STATUS.code("分配中"));
iStIvtIostorinvdtlService.updateById(dtlDao);
/*更新库存*/
// 添加需要更新的库存
StIvtIostorinv mstDao = stIvtIostorinvOutService.getById(dtlDao.getIostorinv_id());
upateIvt(ivtList, mstDao, IOSEnum.IVT_CHANGE.code("加冻结"));
return divDisParam(ivtList, dtlDao);
}
/**
* 准备插入分配明细的参数
* @param likeBoxList 相同木箱的库存
* @param dtlDao 明细对象
* @return List<StIvtIostorinvdis> 分配明细对象集合
*/
private List<StIvtIostorinvdis> divDisParam(List<JSONObject> likeBoxList, StIvtIostorinvdtl dtlDao) {
List<StIvtIostorinvdis> resultDisList = new ArrayList<>();
// 查询库区
JSONObject jsonSect = WQLObject.getWQLObject("st_ivt_sectattr")
.query("sect_id = '" + likeBoxList.get(0).getString("sect_id") + "'")
.uniqueResult(0);
String work_status;
if (jsonSect.getString("sect_type_attr").equals(IOSEnum.SECT_TYPE.code("虚拟区"))) {
work_status = IOSEnum.WORK_STATUS.code("生成");
} else {
work_status = IOSEnum.WORK_STATUS.code("未生成");
}
// 查询计量单位
JSONObject jsonUnit = WQLObject.getWQLObject("md_pb_measureunit")
.query("measure_unit_id = '" + likeBoxList.get(0).getString("qty_unit_id") + "'")
.uniqueResult(0);
// 查询子卷包装关系
String pcsn_in = likeBoxList.stream()
.map(row -> row.getString("pcsn"))
.collect(Collectors.joining("','"));
List<JSONObject> subList = WQLObject.getWQLObject("pdm_bi_subpackagerelation")
.query("container_name in ('" + pcsn_in + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
for (int i = 0; i < likeBoxList.size(); i++) {
JSONObject jsonIvt = likeBoxList.get(i);
JSONObject jsonSub = subList.stream()
.filter(row -> row.getString("container_name").equals(jsonIvt.getString("pcsn")))
.collect(Collectors.toList()).get(0);
StIvtIostorinvdis disDao = StIvtIostorinvdis.builder()
.iostorinvdis_id(IdUtil.getLongId())
.iostorinv_id(dtlDao.getIostorinv_id())
.iostorinvdtl_id(dtlDao.getIostorinvdtl_id())
.seq_no(BigDecimal.valueOf(i + 1))
.sect_id(jsonIvt.getLongValue("sect_id"))
.sect_code(jsonIvt.getString("sect_code"))
.sect_name(jsonIvt.getString("sect_name"))
.struct_id(jsonIvt.getLongValue("struct_id"))
.struct_code(jsonIvt.getString("struct_code"))
.struct_name(jsonIvt.getString("struct_name"))
.material_id(jsonIvt.getLongValue("material_id"))
.pcsn(jsonIvt.getString("pcsn"))
.quality_scode("01")
.storagevehicle_id(jsonIvt.getLongValue("storagevehicle_id"))
.storagevehicle_code(jsonIvt.getString("storagevehicle_code"))
.is_issued(IOSEnum.IS_NOTANDYES.code(""))
.qty_unit_id(jsonUnit.getLongValue("measure_unit_id"))
.qty_unit_name(jsonUnit.getString("unit_name"))
.plan_qty(jsonIvt.getBigDecimal("canuse_qty"))
.real_qty(jsonIvt.getBigDecimal("real_qty"))
.work_status(work_status)
.box_no(jsonSub.getString("package_box_sn"))
.build();
resultDisList.add(disDao);
}
return resultDisList;
}
@Override
public void upateIvt(List<JSONObject> list, StIvtIostorinv mstDao, String ivt_change) {
for (int i = 0; i < list.size(); i++) {
JSONObject json = list.get(i);
JSONObject jsonParam = new JSONObject();
jsonParam.put("struct_id", json.getString("struct_id"));
jsonParam.put("material_id", json.getString("material_id"));
jsonParam.put("pcsn", json.getString("pcsn"));
jsonParam.put("change_qty", json.getString("canuse_qty"));
jsonParam.put("bill_type_scode", mstDao.getBill_type());
jsonParam.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品"));
jsonParam.put("inv_id", mstDao.getIostorinv_id());
jsonParam.put("bill_code", mstDao.getBill_code());
jsonParam.put("bill_table", "ST_IVT_IOStorInv");
storPublicService.IOStor(jsonParam, ivt_change);
}
}
@Override
public void createMove(List<JSONObject> list) {
//子卷包装关系表
WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation");
//物料表
WQLObject materTab = WQLObject.getWQLObject("md_me_materialbase");
// 获取子卷包装集合
String vehilcle_in = list.stream()
.map(row -> row.getString("storagevehicle_code"))
.collect(Collectors.joining("','"));
List<JSONObject> subList = subTab.query("package_box_sn IN ('" + vehilcle_in + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
// 查询物料集合
String materialCode_in = subList.stream()
.map(row -> row.getString("product_name"))
.collect(Collectors.joining("','"));
List<JSONObject> materList = materTab.query("material_code IN ('" + materialCode_in + "')")
.getResultJSONArray(0).toJavaList(JSONObject.class);
for (int i = 0; i < list.size(); i++) {
JSONObject json = list.get(i);
// 生成移库单传入参数
JSONObject mapParam = new JSONObject();
// 明细参数
JSONArray table = new JSONArray();
mapParam.put("bill_type", IOSEnum.MOVE_TYPE.code("出库移库"));
mapParam.put("buss_type", IOSEnum.MOVE_TYPE.code("出库移库"));
mapParam.put("bill_status", IOSEnum.MOVE_STATUS.code("提交"));
mapParam.put("biz_date", DateUtil.today());
mapParam.put("stor_code", json.getString("stor_code"));
mapParam.put("stor_id", json.getString("stor_id"));
mapParam.put("stor_name", json.getString("stor_name"));
mapParam.put("is_task", IOSEnum.IS_NOTANDYES.code(""));
// 过滤对应物料
JSONObject jsonSub = subList.stream()
.filter(row -> row.getString("package_box_sn").equals(json.getString("storagevehicle_code")))
.collect(Collectors.toList()).get(0);
JSONObject jsonMater = materList.stream()
.filter(row -> row.getString("material_code").equals(jsonSub.getString("product_name")))
.collect(Collectors.toList()).get(0);
// 查询移入货位
JSONObject moveParam = new JSONObject();
moveParam.put("stor_id", json.getString("stor_id"));
moveParam.put("sect_id", RegionTypeEnum.TWO_ZZ01.getId());
moveParam.put("box_no", json.getString("storagevehicle_code"));
moveParam.put("material_id", jsonMater.getString("material_id"));
JSONObject jsonMove = inBussManageService.getOneStruct(moveParam);
// 查询移出货位的库存物料
JSONObject jsonMoveIvt = WQL.getWO("ST_OUTIVT03")
.addParam("flag", "6")
.addParam("struct_id", json.getString("struct_id"))
.process().uniqueResult(0);
// 移库单明细
JSONObject jsonMoveDtl = new JSONObject();
jsonMoveDtl.put("is_task", "2");
jsonMoveDtl.put("turnout_sect_id", json.getLongValue("sect_id"));
jsonMoveDtl.put("turnout_sect_code", json.getString("sect_code"));
jsonMoveDtl.put("turnout_sect_name", json.getString("sect_name"));
jsonMoveDtl.put("turnout_struct_id", json.getLongValue("struct_id"));
jsonMoveDtl.put("turnout_struct_code", json.getString("struct_code"));
jsonMoveDtl.put("turnout_struct_name", json.getString("struct_name"));
jsonMoveDtl.put("material_id", jsonMoveIvt.getLongValue("material_id"));
jsonMoveDtl.put("pcsn", jsonMoveIvt.getString("pcsn"));
jsonMoveDtl.put("quality_scode", IOSEnum.QUALITY_SCODE.code("合格品"));
jsonMoveDtl.put("qty_unit_id", jsonMoveIvt.getLongValue("qty_unit_id"));
jsonMoveDtl.put("qty_unit_name", jsonMoveIvt.getString("unit_name"));
jsonMoveDtl.put("qty", jsonMoveIvt.getDoubleValue("canuse_qty"));
jsonMoveDtl.put("storagevehicle_code", json.getString("storagevehicle_code"));
jsonMoveDtl.put("turnin_sect_id", jsonMove.getLongValue("sect_id"));
jsonMoveDtl.put("turnin_sect_code", jsonMove.getString("sect_code"));
jsonMoveDtl.put("turnin_sect_name", jsonMove.getString("sect_name"));
jsonMoveDtl.put("turnin_struct_id", jsonMove.getLongValue("struct_id"));
jsonMoveDtl.put("turnin_struct_code", jsonMove.getString("struct_code"));
jsonMoveDtl.put("turnin_struct_name", jsonMove.getString("struct_name"));
// 生成任务
JSONObject param2 = new JSONObject();
param2.put("task_type", "010505");
param2.put("vehicle_code", json.getString("storagevehicle_code"));
param2.put("point_code1", json.getString("struct_code"));
param2.put("point_code2", jsonMove.getString("struct_code"));
HandMoveStorAcsTask handMoveStorAcsTask = new HandMoveStorAcsTask();
String move_task_id = handMoveStorAcsTask.createTask(param2);
// 回显移库明细任务id
jsonMoveDtl.put("task_id", move_task_id);
table.add(jsonMoveDtl);
mapParam.put("tableData", table);
// 调用移库单新增方法
handMoveStorService.insertDtl2(mapParam);
// 下发任务
handMoveStorAcsTask.immediateNotifyAcs(null);
}
}
}

View File

@@ -0,0 +1,68 @@
package org.nl.b_lms.storage_manage.ios.service.iostorInv.util.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinv;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdis;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.dao.StIvtIostorinvdtl;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 出库业务处理 服务类
* </p>
*
* @author generator
* @since 2023-11-16
*/
public interface OutBussManageService {
/**
* 上锁、解锁仓位处理
* @param param[
* {
* struct_code: 仓位编码
* }
* ]
* @param json {
* inv_type单据类型
* inv_id单据标识
* inv_code单据编码
* lock_type: 锁定类型
* operate:单据类型
* }
*/
void lockStruct(List<String> param, JSONObject json);
/**
* 分配库存方法
* @param dtlDao: 明细对象
* @param ivtList: 库存集合
* @return List<StIvtIostorinvdis>: 分配明细集合
*/
List<StIvtIostorinvdis> divIvt(StIvtIostorinvdtl dtlDao, List<JSONObject> ivtList);
/**
* 手工分配库存方法
* @param dtlDao: 明细对象
* @param ivtList: 需要配粉的库存集合
* @return List<StIvtIostorinvdis>: 分配明细集合
*/
List<StIvtIostorinvdis> manualDivIvt(StIvtIostorinvdtl dtlDao, List<JSONObject> ivtList);
/**
* 更新库存
* @param list 需要更新的库存明细
* @param mstDao 主表对象
* @param ivt_change 更新类型
*/
void upateIvt(List<JSONObject> list, StIvtIostorinv mstDao, String ivt_change);
/**
* 创建移库单
* @param list 需要创建移库单的仓位
*/
void createMove(List<JSONObject> list);
}

View File

@@ -0,0 +1,85 @@
[交易说明]
交易名: 出库分配
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.stor_id TYPEAS s_string
输入.sect_id TYPEAS s_string
输入.iostorinvdtl_id TYPEAS s_string
输入.iostorinvdis_id TYPEAS s_string
输入.iostorinv_id TYPEAS s_string
输入.task_id TYPEAS s_string
输入.bill_status TYPEAS s_string
输入.is_issued TYPEAS s_string
输入.dtl_id_in TYPEAS f_string
输入.box_in TYPEAS f_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
ivt.*,
attr.row_num,
attr.block_num,
attr.storagevehicle_code,
attr.storagevehicle_id,
attr.sect_id,
attr.sect_code,
attr.sect_name,
sub.sale_order_name
FROM
ST_IVT_StructIvt ivt
LEFT JOIN ST_IVT_StructAttr attr ON attr.struct_id = ivt.struct_id
LEFT JOIN PDM_BI_SubPackageRelation sub ON attr.storagevehicle_code = sub.package_box_SN AND sub.container_name = ivt.pcsn
WHERE
ivt.quality_scode = '01'
AND attr.lock_type = '1'
AND ivt.canuse_qty <> '0'
OPTION 输入.sect_id <> ""
attr.sect_id = 输入.sect_id
ENDOPTION
OPTION 输入.stor_id <> ""
attr.stor_id = 输入.stor_id
ENDOPTION
OPTION 输入.box_in <> ""
attr.storagevehicle_code in 输入.box_in
ENDOPTION
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -19,7 +19,8 @@ public enum RegionTypeEnum {
LKRK("16", "密集库入库输送线", "1585164789083148288"),
LKCK("17", "密集库出库输送线", "1585167595403874304"),
XN01("18", "虚拟区", "1586913215886004224"),
PD01("19", "盘点区", "1645705331612979200");
PD01("19", "盘点区", "1645705331612979200"),
TWO_ZZ01("20", "暂存区", "");
private String name;
private String code;

View File

@@ -1,6 +1,7 @@
package org.nl.wms.st.instor.task;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -120,7 +121,31 @@ public class HandMoveStorAcsTask extends AbstractAcsTask {
*/
@Override
public String createTask(JSONObject form) {
return null;
String currentUserId = SecurityUtils.getCurrentUserId();
String currentUsername = SecurityUtils.getCurrentUsername();
JSONObject json = new JSONObject();
json.put("task_id", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_code", IdUtil.getSnowflake(1, 1).nextId());
json.put("task_type", form.getString("task_type"));
json.put("vehicle_code", form.getString("vehicle_code"));
json.put("task_name", form.getString("task_name"));
json.put("point_code1", form.getString("point_code1"));
json.put("point_code2", form.getString("point_code2"));
json.put("material_id", form.getString("material_id"));
json.put("task_group_id", form.getString("task_group_id"));
json.put("sort_seq", form.getString("sort_seq"));
json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
json.put("handle_class", THIS_CLASS);
json.put("create_id", currentUserId);
json.put("create_name", currentUsername);
json.put("create_time", DateUtil.now());
json.put("acs_task_type", "7");
WQLObject.getWQLObject("SCH_BASE_Task").insert(json);
return json.getString("task_id");
}
/**

View File

@@ -3,8 +3,11 @@ package org.nl.wms.st.outbill.rest;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.b_lms.storage_manage.ios.enums.IOSEnum;
import org.nl.b_lms.storage_manage.ios.service.iostorInv.IStIvtIostorinvOutService;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.st.inbill.service.CheckOutBillService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -20,8 +23,17 @@ import java.util.Map;
@RequestMapping("/api/checkoutbill")
@Slf4j
public class CheckOutBillController {
/**
* 一期出库服务
*/
private final CheckOutBillService checkOutBillService;
/**
* 二期出出库服务
*/
@Autowired
private IStIvtIostorinvOutService iStIvtIostorinvOutService;
@GetMapping
@Log("查询出库单")
@@ -58,7 +70,8 @@ public class CheckOutBillController {
//@PreAuthorize("@el.check('checkoutbill:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody Long[] ids) {
checkOutBillService.deleteAll(ids);
iStIvtIostorinvOutService.deleteAll(ids);
// checkOutBillService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@@ -66,7 +79,8 @@ public class CheckOutBillController {
@Log("修改出库单")
public ResponseEntity<Object> update(@RequestBody JSONObject whereJson) {
checkOutBillService.update(whereJson);
iStIvtIostorinvOutService.update(whereJson);
// checkOutBillService.update(whereJson);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -74,7 +88,8 @@ public class CheckOutBillController {
@Log("新增出库单")
public ResponseEntity<Object> insertDtl(@RequestBody JSONObject whereJson) {
checkOutBillService.insertDtl(whereJson);
iStIvtIostorinvOutService.insertMst(whereJson);
// checkOutBillService.insertDtl(whereJson);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@@ -82,7 +97,11 @@ public class CheckOutBillController {
@Log("出库单全部分配")
public ResponseEntity<Object> allDiv(@RequestBody JSONObject whereJson) {
checkOutBillService.allDiv(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.allDiv(whereJson);
} else {
checkOutBillService.allDiv(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -90,7 +109,12 @@ public class CheckOutBillController {
@Log("出库单全部分2配")
public ResponseEntity<Object> allDivOne(@RequestBody JSONObject whereJson) {
checkOutBillService.allDivOne(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.allDiv(whereJson);
} else {
checkOutBillService.allDivOne(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -98,7 +122,11 @@ public class CheckOutBillController {
@Log("出库单全部取消")
public ResponseEntity<Object> allCancel(@RequestBody JSONObject whereJson) {
checkOutBillService.allCancel(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.cancelDiv(whereJson);
} else {
checkOutBillService.allCancel(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -114,7 +142,12 @@ public class CheckOutBillController {
@Log("出库单全部取消")
public ResponseEntity<Object> oneCancel(@RequestBody JSONObject whereJson) {
checkOutBillService.oneCancel(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.cancelDiv(whereJson);
} else {
checkOutBillService.oneCancel(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -167,7 +200,12 @@ public class CheckOutBillController {
@Log("一键设置")
public ResponseEntity<Object> allSetPoint(@RequestBody JSONObject whereJson) {
checkOutBillService.allSetPoint(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.allSetPoint(whereJson);
} else {
checkOutBillService.allSetPoint(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -196,7 +234,12 @@ public class CheckOutBillController {
@Log("出库单手动分配")
public ResponseEntity<Object> manualDiv(@RequestBody JSONObject whereJson) {
checkOutBillService.manualDiv(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.manualDiv(whereJson);
} else {
checkOutBillService.manualDiv(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@@ -204,7 +247,11 @@ public class CheckOutBillController {
@Log("出库单强制确认")
public ResponseEntity<Object> confirm(@RequestBody JSONObject whereJson) {
checkOutBillService.confirm(whereJson);
if (whereJson.getString("stor_id").equals(IOSEnum.STOR_ID.code("二期"))) {
iStIvtIostorinvOutService.confirm(whereJson);
} else {
checkOutBillService.confirm(whereJson);
}
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

View File

@@ -425,6 +425,7 @@ export default {
this.openParam = res
this.structshow = true
this.openRow = this.currentRow
this.openRow.stor_id = this.rowmst.stor_id
this.loadingAlldiv = false
}).catch(() => {
this.loadingAlldiv = false
@@ -452,6 +453,8 @@ export default {
}
},
deleteRow(row) {
row.stor_id = this.mstrow.stor_id
row.cancel_type = '3'
checkoutbill.oneCancel(row).then(res => {
this.queryTableDtl()
})
@@ -509,6 +512,7 @@ export default {
// return
// }
this.loadingAlldiv = true
this.mstrow.div_type = '1'
checkoutbill.allDiv(this.mstrow).then(res => {
this.crud.notify('分配成功!', CRUD.NOTIFICATION_TYPE.INFO)
this.queryTableDtl()
@@ -522,19 +526,21 @@ export default {
// this.crud.notify('请先选择库区!', CRUD.NOTIFICATION_TYPE.INFO)
// return
// }
this.loadingAutodiv = true
this.loadingAlldiv = true
if (this.currentRow.iostorinvdtl_id !== null) {
this.mstrow.iostorinvdtl_id = this.currentRow.iostorinvdtl_id
checkoutbill.allDivOne(this.mstrow).then(res => {
this.currentRow.div_type = '2'
this.currentRow.stor_id = this.rowmst.stor_id
checkoutbill.allDivOne(this.currentRow).then(res => {
this.queryTableDtl()
this.loadingAutodiv = false
this.loadingAlldiv = false
}).catch(() => {
this.loadingAutodiv = false
this.loadingAlldiv = false
})
}
},
allCancel() {
this.loadingAlldiv = true
this.mstrow.cancel_type = '1'
checkoutbill.allCancel(this.mstrow).then(res => {
this.queryTableDtl()
this.loadingAlldiv = false
@@ -544,6 +550,8 @@ export default {
},
oneCancel() {
this.loadingAlldiv = true
this.currentRow.stor_id = this.mstrow.stor_id
this.currentRow.cancel_type = '2'
if (this.currentRow.iostorinvdtl_id !== null) {
checkoutbill.allCancel(this.currentRow).then(res => {
this.queryTableDtl()
@@ -653,7 +661,8 @@ export default {
'point_code': this.form2.point_code,
'iostorinv_id': this.mstrow.iostorinv_id,
'bill_code': this.mstrow.bill_code,
'checked': this.checked
'checked': this.checked,
'stor_id': this.mstrow.stor_id
}
checkoutbill.allSetPoint(data).then(res => {
this.queryTableDdis(this.currentRow.iostorinvdtl_id)

View File

@@ -266,7 +266,9 @@ export default {
}
})
this.fullscreenLoading = true
checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows }).then(res => {
this.queryrow.stor_id = this.rowmst.stor_id
debugger
checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows, 'stor_id': this.rowmst.stor_id }).then(res => {
this.$emit('update:dialogShow', false)
this.$emit('StructIvtClosed')
this.fullscreenLoading = false
@@ -283,7 +285,7 @@ export default {
}
})
this.fullscreenLoading = true
checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows }).then(res => {
checkoutbill.manualDiv({ 'row': this.queryrow, 'rows': rows, 'stor_id': this.rowmst.stor_id }).then(res => {
this.$emit('update:dialogShow', false)
this.$emit('StructIvtClosed')
this.fullscreenLoading = false

View File

@@ -531,7 +531,7 @@ export default {
},
confirm() {
this.loadingConfirm = true
checkoutbill.confirm({ 'iostorinv_id': this.currentRow.iostorinv_id }).then(res => {
checkoutbill.confirm({ 'iostorinv_id': this.currentRow.iostorinv_id, 'stor_id': this.currentRow.stor_id }).then(res => {
this.querytable()
this.crud.notify('出库成功!', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.loadingConfirm = false