rev:1.海柔半成品acs与mes接口 2.半成品、成品库存增加单据类型字段

This commit is contained in:
2023-08-11 18:56:01 +08:00
parent ac23052354
commit 60058e963f
25 changed files with 745 additions and 7 deletions

View File

@@ -43,7 +43,9 @@ public enum AcsTaskEnum {
TASK_STRUCT_HR_IN("26","入库-海柔半成品-生产入库"),
TASK_STRUCT_HR_OUT("27","出库-海柔半成品-生产出库"),
TASK_STRUCT_HR_CHECK("28","海柔半成品-盘点"),
TASK_STRUCT_CP_CHECK("13","-盘点"),
TASK_STRUCT_HR_EMP_IN("29","入库-海柔半成品-空托盘"),
TASK_STRUCT_HR_EMP_OUT("30","出库-海柔半成品-空托盘"),
TASK_STRUCT_CP_CHECK("13","成品-盘点"),
TASK_WASH_LACK("20","清洗机-缺料请求"),
TASK_WASH_EMP("21","清洗机-空框请求"),
TASK_WASH_FULL_AUTO("22","清洗机-满料请求自动"),//去半成品入库:参数不全也去异常处理位

View File

@@ -120,6 +120,14 @@ public class AcsToWmsController {
return new ResponseEntity<>( HttpStatus.OK);
}
@PostMapping("/deviceApply")
@Log("海柔半成品任务申请")
//("海柔半成品任务申请")
@SaIgnore
public ResponseEntity<Object> deviceApply(@RequestBody JSONObject string) {
return new ResponseEntity<>(acsToWmsService.deviceApply(string),HttpStatus.OK);
}
@GetMapping("/taskPublish")
@Log("taskPublish")

View File

@@ -82,4 +82,17 @@ public interface AcsToWmsService {
* @return
*/
void feedOrderRealQty(JSONObject string);
/**
*
* @param json {
* type: 类型
* device_code1: 设备1
* barcode1: 条码1
* device_code2: 设备2
* barcode2: 条码2
* }
* @return /
*/
Map<String, Object> deviceApply(JSONObject json);
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.ext_manage.acs.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -32,6 +33,8 @@ import org.nl.wms.product_manage.service.workorder.IPdmProduceWorkorderService;
import org.nl.wms.product_manage.service.workorder.dao.PdmProduceWorkorder;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpStatus;
@@ -61,9 +64,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{
private IPdmBiDeviceService deviceService;
@Autowired
private ISchBaseTaskService itaskService;
@Autowired
private IStIvtIostorinvHrBcpInService iStIvtIostorinvHrBcpInService;
@Autowired
private IStIvtIostorinvEmpBcpService iStIvtIostorinvEmpBcpService;
@Override
public Map<String, Object> apply(JSONObject param) {
@@ -342,4 +346,88 @@ public class AcsToWmsServiceImpl implements AcsToWmsService{
.set("dq_real_qty",dq_real_qty).eq("workorder_code",workorderCode));
}
}
@Override
public Map<String, Object> deviceApply(JSONObject json) {
/*
* 1.申请入满箱任务
* 2.申请入空箱任务
* 3.申请出满箱任务
* 4.申请出空箱任务
*/
HashMap<String, Object> result = new HashMap<>();
String type = json.getString("type");
try {
String device_code1 = json.getString("device_code1");
String barcode1 = json.getString("barcode1");
if (ObjectUtil.isEmpty(device_code1)) throw new BadRequestException("设备不能为空!");
if (StrUtil.equals(type, "1")) {
/* 1.申请入满箱任务 */
if (ObjectUtil.isEmpty(barcode1)) throw new BadRequestException("条码不能为空!");
JSONObject param = new JSONObject();
param.put("device_code",device_code1);
param.put("barcode",barcode1);
// 1.调用入库服务
iStIvtIostorinvHrBcpInService.fullIn(param);
// 2.判断device_code2、barcode2 是否为空
if (ObjectUtil.isNotEmpty(json.getString("device_code2")) && ObjectUtil.isNotEmpty(json.getString("barcode2"))) {
param.put("device_code",json.getString("device_code2"));
param.put("barcode",json.getString("barcode2"));
iStIvtIostorinvHrBcpInService.fullIn(param);
}
} else if (StrUtil.equals(type, "2")) {
/* 2.申请入空箱任务 */
if (ObjectUtil.isEmpty(barcode1)) throw new BadRequestException("条码不能为空!");
JSONObject param = new JSONObject();
param.put("device_code",device_code1);
param.put("barcode",barcode1);
// 1.调用空托盘入库服务
iStIvtIostorinvEmpBcpService.InEmp(param);
// 2.判断device_code2、barcode2 是否为空
if (ObjectUtil.isNotEmpty(json.getString("device_code2")) && ObjectUtil.isNotEmpty(json.getString("barcode2"))) {
param.put("device_code",json.getString("device_code2"));
param.put("barcode",json.getString("barcode2"));
iStIvtIostorinvEmpBcpService.InEmp(param);
}
} else if (StrUtil.equals(type, "3")) {
/* 3.申请出满箱任务 */
} else if (StrUtil.equals(type, "4")) {
/* 4.申请出空箱任务 */
JSONObject param = new JSONObject();
param.put("device_code",device_code1);
param.put("barcode",barcode1);
// 1.调用空托盘出库库服务
iStIvtIostorinvEmpBcpService.OutEmp(param);
// 2.判断device_code2、barcode2 是否为空
if (ObjectUtil.isNotEmpty(json.getString("device_code2"))) {
param.put("device_code",json.getString("device_code2"));
iStIvtIostorinvEmpBcpService.OutEmp(param);
}
}
} catch (Exception e) {
result.put("status", HttpStatus.BAD_REQUEST.value());
result.put("message", e.getMessage());
}
result.put("status", HttpStatus.OK.value());
result.put("message", "");
return result;
}
}

View File

@@ -20,7 +20,7 @@ public enum IOSEnum {
//是否
IS_USED(MapOf.of("", "1", "", "0")),
//仓库编码
STOR_CODE(MapOf.of("原材料仓", "1528627964823080960", "半成品仓库", "15286279952695336962","成品库", "1528627995269533696")),
STOR_CODE(MapOf.of("原材料仓", "1528627964823080960", "半成品仓库", "15286279952695336962","成品库", "1528627995269533696","海柔半成品","15286279952695336963")),
//库区编码
SECT_CODE(MapOf.of("成品库区", "1528631043496742912", "半成品库区", "1528631044482404352")),
//托盘超限类型
@@ -36,8 +36,8 @@ public enum IOSEnum {
ORDER_STATUS(MapOf.of("生成", "10", "提交", "20", "发货中", "30", "确认", "99")),
//锁定类型
LOCK_TYPE(MapOf.of("未锁定", "0", "入库锁", "1", "出库锁", "2","盘点锁", "3","损溢锁", "4","拼盘锁","5","其他锁","99")),
// 海柔半成品出库类型
BILL_TYPE_HR(MapOf.of("生产出库", "1001", "盘点出库", "1002", "手工出库", "1009")),
// 海柔半成品出库类型
BILL_TYPE_HR(MapOf.of("生产出库", "1001", "盘点出库", "1002", "手工出库", "1009","生产入库","0001")),
;
private Map<String, String> code;

View File

@@ -121,5 +121,10 @@ public class StIvtStructivtCp implements Serializable {
*/
private BigDecimal unit_weight;
/**
* 单据类型
*/
private String bill_type;
}

View File

@@ -152,6 +152,7 @@
mater.material_spec,
attr.storagevehicle_code,
ivt.canuse_qty,
ivt.bill_type,
ivt.frozen_qty,
ivt.ivt_qty,
ivt.warehousing_qty,

View File

@@ -187,6 +187,7 @@ public class StIvtStructivtCpServiceImpl extends ServiceImpl<StIvtStructivtCpMap
dao.setProduct_area(json.getString("product_area"));
dao.setStor_id(json.getString("stor_id"));
dao.setUnit_weight(materDao.getNet_weight());
dao.setBill_type(json.getString("bill_type_scode"));
this.save(dao);
// 插入库存变动记录

View File

@@ -26,5 +26,11 @@ public class RuleUtil {
*/
public static final String PRODUCTION_OUT_2 = "out_2";
/*
* 空托盘出库分配:
* 根据 仓库、库区、找仓位上的空载具
*/
public static final String PRODUCTION_EMP_OUT_1 = "emp_out_1";
}

View File

@@ -81,6 +81,21 @@ public class DivRuleCpServiceImpl implements DivRuleCpService {
.eq(StIvtStructattr::getStruct_id, attrDao.getControl_code())
);
break;
case RuleUtil.PRODUCTION_EMP_OUT_1 :
attrDao = iStIvtStructattrService.getOne(
new QueryWrapper<StIvtStructattr>().lambda()
.eq(StIvtStructattr::getStor_id, stor_id)
.eq(StIvtStructattr::getSect_id, sect_id)
.eq(StIvtStructattr::getIs_used, IOSEnum.IS_USED.code(""))
.eq(StIvtStructattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.and(qr -> qr.ne(StIvtStructattr::getStoragevehicle_code,"")
.or().isNull(StIvtStructattr::getStoragevehicle_code)
)
.eq(StIvtStructattr::getIs_emptyvehicle, true)
.orderByDesc(StIvtStructattr::getXqty)
.orderByAsc(StIvtStructattr::getYqty)
, false);
break;
default:
return null;
}

View File

@@ -16,6 +16,7 @@ import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcp
import org.nl.wms.storage_manage.semimanage.service.iostorInv.IStIvtIostorinvBcpService;
import org.nl.wms.storage_manage.semimanage.service.shutFrame.IStIvtShutframeinvBcpService;
import org.nl.wms.storage_manage.semimanagehr.service.check.IStIvtCheckmstHrBcpService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpOutService;
@@ -81,6 +82,14 @@ public enum TASKEnum implements FunctionStrategy<String, JSONObject> {
IStIvtCheckmstHrBcpService bean = SpringContextHolder.getBean(IStIvtCheckmstHrBcpService.class);
bean.taskOperate(form);
}),
HR_BCP_EMP_IN_TASK(type -> AcsTaskEnum.TASK_STRUCT_HR_EMP_IN.getCode().equals(type), form -> {
IStIvtIostorinvEmpBcpService bean = SpringContextHolder.getBean(IStIvtIostorinvEmpBcpService.class);
bean.taskOperateIn(form);
}),
HR_BCP_EMP_OUT_TASK(type -> AcsTaskEnum.TASK_STRUCT_HR_EMP_OUT.getCode().equals(type), form -> {
IStIvtIostorinvEmpBcpService bean = SpringContextHolder.getBean(IStIvtIostorinvEmpBcpService.class);
bean.taskOperateOut(form);
}),
;

View File

@@ -264,6 +264,7 @@ public class StIvtIostorinvBcpServiceImpl extends ServiceImpl<StIvtIostorinvBcpM
.canuse_qty(mst.getPlan_qty())
.workshop_id(mst.getWorkshop_id())
.unit_weight(mst.getUnit_weight())
.bill_type(mst.getBill_type())
.build();
structivtBcpService.save(ivtDao);

View File

@@ -103,5 +103,10 @@ public class StIvtStructivtBcp implements Serializable {
*/
private BigDecimal unit_weight;
/**
* 入库类型
*/
private String bill_type;
}

View File

@@ -0,0 +1,47 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder;
/**
* <p>
* 半成品空载具服务 服务类
* </p>
*
* @author generator
* @since 2023-08-01
*/
public interface IStIvtIostorinvEmpBcpService {
/**
* acs申请入空箱
* @param json {
* device_code: 设备
* barcode: 条码
* }
*/
void InEmp(JSONObject json);
/**
* 入空托盘任务反馈
* @param form /
*/
void taskOperateIn(JSONObject form);
/**
* acs申请出空箱
* @param json {
* device_code: 设备
* }
*/
void OutEmp(JSONObject json);
/**
* 出空托盘任务反馈
* @param form /
*/
void taskOperateOut(JSONObject form);
}

View File

@@ -59,4 +59,14 @@ public interface IStIvtIostorinvHrBcpInService extends IService<StIvtIostorinvHr
List<Map> getPdaAll(JSONObject form);
/**
* acs 申请入满箱任务
* @param /
* {
* device_code : 设备
* barcode : 条码
* }
*/
void fullIn(JSONObject json);
}

View File

@@ -0,0 +1,16 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv;
import com.baomidou.mybatisplus.extension.service.IService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder;
/**
* <p>
* 出入库顺序表 服务类
* </p>
*
* @author generator
* @since 2023-08-01
*/
public interface IStIvtIostorinvOrderService extends IService<StIvtIostorinvOrder> {
}

View File

@@ -0,0 +1,102 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* <p>
* 出入库顺序表
* </p>
*
* @author generator
* @since 2023-08-01
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("st_ivt_iostorinv_order_bcp")
public class StIvtIostorinvOrder implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 顺序标识
*/
@TableId(value = "order_id")
private String order_id;
/**
* 车间
*/
private String workshop_id;
/**
* 仓库标识
*/
private String stor_id;
/**
* 输送设备
*/
private String out_device;
/**
* 来源设备
*/
private String in_device;
/**
* 条码
*/
private String bar_code;
/**
* 业务日期
*/
private String biz_date;
/**
* 物料标识
*/
private String material_id;
/**
* 订单
*/
private String sale_id;
/**
* 工单
*/
private String workorder_id;
/**
* 重量
*/
private BigDecimal weight;
/**
* 数量
*/
private BigDecimal qty;
/**
* 出入类型
*/
private String type;
/**
* 是否删除
*/
private boolean is_delete;
/**
* 创建时间
*/
private String create_time;
}

View File

@@ -0,0 +1,17 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.nl.common.anno.Datazhuazhua;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder;
/**
* <p>
* 出入库顺序表 Mapper 接口
* </p>
*
* @author generator
* @since 2023-05-10
*/
@Datazhuazhua
public interface StIvtIostorinvOrderMapper extends BaseMapper<StIvtIostorinvOrder> {
}

View File

@@ -0,0 +1,4 @@
<?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.storage_manage.semimanagehr.service.iostorInv.dao.mapper.StIvtIostorinvOrderMapper">
</mapper>

View File

@@ -0,0 +1,286 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.publish.BussEventMulticaster;
import org.nl.common.publish.event.PointEvent;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext_manage.acs.service.WmsToAcsService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtSectattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.IStIvtStructattrService;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtSectattr;
import org.nl.wms.masterdata_manage.storage.service.storage.dao.StIvtStructattr;
import org.nl.wms.scheduler_manage.service.extendtask.manage.TaskStatusEnum;
import org.nl.wms.scheduler_manage.service.task.ISchBaseTaskService;
import org.nl.wms.scheduler_manage.service.task.dao.SchBaseTask;
import org.nl.wms.storage_manage.IOSEnum;
import org.nl.wms.storage_manage.productmanage.util.DivRuleCpService;
import org.nl.wms.storage_manage.productmanage.util.RuleUtil;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvEmpBcpService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
import java.util.function.Consumer;
/**
* <p>
* 半成品空载具 服务实现类
* </p>
*
* @author generator
* @since 2023-05-10
*/
@Service
public class StIvtIostorinvEmpBcpServiceImpl implements IStIvtIostorinvEmpBcpService {
@Autowired
private IStIvtSectattrService sectattrService; // 库区服务
@Autowired
protected IStIvtStructattrService iStIvtStructattrService; // 仓位属性服务
@Autowired
private DivRuleCpService divRuleCpService; // 分配规则服务
@Autowired
private ISchBaseTaskService iSchBaseTaskService; // 任务表服务
@Override
@Transactional
public void InEmp(JSONObject json) {
/*
* 1.找一个空货位
* 2.生成任务
* 3.下发任务
* 4.锁住货位
*/
String device_code = json.getString("device_code"); // 设备
String barcode = json.getString("barcode"); // 条码
if (ObjectUtil.isEmpty(device_code)) throw new BadRequestException("设备不能为空!");
if (ObjectUtil.isEmpty(barcode)) throw new BadRequestException("条码不能为空!");
// 1.找一个空货位
StIvtSectattr sect = sectattrService.getOne(
new QueryWrapper<StIvtSectattr>().lambda()
.eq(StIvtSectattr::getSect_name, "海柔半成品库区")
);
JSONObject jo = new JSONObject();
jo.put("sect_id", sect.getSect_id());
jo.put("stor_id", sect.getStor_id());
jo.put("rule_type", RuleUtil.PRODUCTION_IN_1);
// 调用服务
StIvtStructattr arrtDao = divRuleCpService.divRuleIn(jo);
if (ObjectUtil.isEmpty(arrtDao)) {
throw new BadRequestException("无可分配货位");
}
// 2.生成任务
SchBaseTask taskDao = new SchBaseTask();
PointEvent event = PointEvent.builder()
.type(AcsTaskEnum.TASK_STRUCT_HR_EMP_IN)
.acs_task_type("7")
.task_group_id(IdUtil.getStringId())
.point_code1(device_code)
.point_code3(barcode)
.vehicle_code(barcode)
.product_area("A3")
.callback((Consumer<String>) taskDao::setTask_id)
.build();
BussEventMulticaster.Publish(event);
// 3.下发任务
sendTask(taskDao.getTask_id());
// 4.锁定货位
arrtDao.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStIvtStructattrService.updateById(arrtDao);
}
@Override
@Transactional
public void taskOperateIn(JSONObject form) {
String task_id = form.getString("task_id");
String status = form.getString("status");
SchBaseTask taskDao = iSchBaseTaskService.getById(task_id);
if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) {
/* 完成 */
// 1.更新任务为完成
taskDao.setTask_status(TaskStatusEnum.FINISHED.getCode());
iSchBaseTaskService.updateById(taskDao);
// 2.更新仓位:解锁仓位、更新载具、更新是否是空载具
iStIvtStructattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.set(StIvtStructattr::getStoragevehicle_code, taskDao.getVehicle_code())
.set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定"))
.set(StIvtStructattr::getIs_emptyvehicle, true)
.eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3())
);
} else if (status.equals(AcsTaskEnum.STATUS_START.getCode())){
/* 执行中 */
// 1.更新任务为执行中
taskDao.setTask_status(TaskStatusEnum.EXECUTING.getCode());
iSchBaseTaskService.updateById(taskDao);
}else if (status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())){
/* 取消 */
// 1.更新任务为取消
taskDao.setTask_status(TaskStatusEnum.CANCEL.getCode());
iSchBaseTaskService.updateById(taskDao);
// 2.更新仓位:解锁仓位
iStIvtStructattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3())
);
}
}
@Override
@Transactional
public void OutEmp(JSONObject json) {
/*
* 1.找一个空载具的货位
* 2.生成任务
* 3.下发任务
*/
String device_code = json.getString("device_code");
// 1.找一个空载具的货位
StIvtSectattr sect = sectattrService.getOne(
new QueryWrapper<StIvtSectattr>().lambda()
.eq(StIvtSectattr::getSect_name, "海柔半成品库区")
);
JSONObject jo = new JSONObject();
jo.put("sect_id", sect.getSect_id());
jo.put("stor_id", sect.getStor_id());
jo.put("rule_type", RuleUtil.PRODUCTION_EMP_OUT_1);
// 调用服务
StIvtStructattr arrtDao = divRuleCpService.divRuleIn(jo);
if (ObjectUtil.isEmpty(arrtDao)) {
throw new BadRequestException("没有可用的空托盘!");
}
// 2.生成任务
SchBaseTask taskDao = new SchBaseTask();
PointEvent event = PointEvent.builder()
.type(AcsTaskEnum.TASK_STRUCT_HR_EMP_OUT)
.acs_task_type("7")
.task_group_id(IdUtil.getStringId())
.point_code1(arrtDao.getStruct_code())
.point_code3(device_code)
.vehicle_code(arrtDao.getStoragevehicle_code())
.product_area("A3")
.callback((Consumer<String>) taskDao::setTask_id)
.build();
BussEventMulticaster.Publish(event);
// 3.下发任务
sendTask(taskDao.getTask_id());
// 4.锁定货位
arrtDao.setLock_type(IOSEnum.LOCK_TYPE.code("其他锁"));
iStIvtStructattrService.updateById(arrtDao);
}
@Override
@Transactional
public void taskOperateOut(JSONObject form) {
String task_id = form.getString("task_id");
String status = form.getString("status");
SchBaseTask taskDao = iSchBaseTaskService.getById(task_id);
if (status.equals(AcsTaskEnum.STATUS_FINISH.getCode())) {
/* 完成 */
// 1.更新任务为完成
taskDao.setTask_status(TaskStatusEnum.FINISHED.getCode());
iSchBaseTaskService.updateById(taskDao);
// 2.更新仓位:解锁仓位、更新载具、更新是否是空载具
iStIvtStructattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.set(StIvtStructattr::getStoragevehicle_code, "")
.set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定"))
.set(StIvtStructattr::getIs_emptyvehicle, false)
.eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code1())
);
} else if (status.equals(AcsTaskEnum.STATUS_START.getCode())){
/* 执行中 */
// 1.更新任务为执行中
taskDao.setTask_status(TaskStatusEnum.EXECUTING.getCode());
iSchBaseTaskService.updateById(taskDao);
}else if (status.equals(AcsTaskEnum.STATUS_CANNEL.getCode())){
/* 取消 */
// 1.更新任务为取消
taskDao.setTask_status(TaskStatusEnum.CANCEL.getCode());
iSchBaseTaskService.updateById(taskDao);
// 2.更新仓位:解锁仓位
iStIvtStructattrService.update(
new UpdateWrapper<StIvtStructattr>().lambda()
.set(StIvtStructattr::getLock_type,IOSEnum.LOCK_TYPE.code("未锁定"))
.eq(StIvtStructattr::getStruct_code, taskDao.getPoint_code3())
);
}
}
/**
* 下发任务
* @param task_id /
*/
private void sendTask(String task_id) {
SchBaseTask taskDao = iSchBaseTaskService.getById(task_id);
JSONArray param = new JSONArray();
param.add(JSON.parseObject(JSONUtil.toJsonStr(taskDao)));
// 1.下发任务
WmsToAcsService bean = SpringContextHolder.getBean(WmsToAcsService.class);
Map<String, Object> result = bean.issueTaskToAcs3(param);
// 反馈失败报错
if (!ObjectUtil.equal(MapUtil.getStr(result, "status"),"200")) {
throw new BadRequestException("下发失败:"+MapUtil.getStr(result, "message"));
}
// 2.更新任务状态
taskDao.setTask_status(TaskStatusEnum.ISSUE.getCode());
iSchBaseTaskService.updateById(taskDao);
}
}

View File

@@ -27,6 +27,8 @@ import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext_manage.acs.service.WmsToAcsService;
import org.nl.wms.masterdata_manage.service.master.IMdPbMeasureunitService;
import org.nl.wms.masterdata_manage.service.master.dao.MdPbMeasureunit;
import org.nl.wms.masterdata_manage.service.material.IMdMeMaterialbaseService;
import org.nl.wms.masterdata_manage.service.material.dao.MdMeMaterialbase;
import org.nl.wms.masterdata_manage.service.vehicle.IMdPbStoragevehicleextService;
@@ -49,7 +51,9 @@ import org.nl.wms.storage_manage.productmanage.util.ChangeIvtUtil;
import org.nl.wms.storage_manage.productmanage.util.DivRuleCpService;
import org.nl.wms.storage_manage.productmanage.util.RuleUtil;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvHrBcpInService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvHrBcp;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper.StIvtIostorinvHrBcpMapper;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dto.HrBcpIostorInvQuery;
import org.nl.wms.storage_manage.semimanagehr.service.structIvt.IStIvtStructivtHrBcpService;
@@ -104,6 +108,15 @@ public class StIvtIostorinvHrBcpInServiceImpl extends ServiceImpl<StIvtIostorinv
@Autowired
protected IMdPbStoragevehicleextService iMdPbStoragevehicleextService; // 载具扩展属性信息表服务
@Autowired
protected IStIvtIostorinvOrderService iStIvtIostorinvOrderService; // 出入顺序服务
@Autowired
protected IMdMeMaterialbaseService iMdMeMaterialbaseService; // 物料服务
@Autowired
protected IMdPbMeasureunitService iMdPbMeasureunitService; // 计量单位服务
@Override
public Object queryDtl(HrBcpIostorInvQuery query, PageQuery pageQuery) {
Page<Object> page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize());
@@ -420,6 +433,66 @@ public class StIvtIostorinvHrBcpInServiceImpl extends ServiceImpl<StIvtIostorinv
return this.baseMapper.getPdaAll(form);
}
@Override
@Transactional
public void fullIn(JSONObject json) {
/*
* 1.从出入顺序表中找到对应数据
* 2.创建入库单
* 3.生成任务
* 4.下发任务
*/
String device_code = json.getString("device_code"); // 设备
String barcode = json.getString("barcode"); // 载具号
// 1.从出入顺序表中找到对应数据: 根据来源设备和条码找到最近的一条
StIvtIostorinvOrder orderDao = iStIvtIostorinvOrderService.getOne(
new QueryWrapper<StIvtIostorinvOrder>().lambda()
.eq(StIvtIostorinvOrder::getIn_device, device_code)
.eq(StIvtIostorinvOrder::getBar_code, barcode)
.eq(StIvtIostorinvOrder::getType, IOSEnum.IO_TYPE.code("入库"))
.orderByDesc(StIvtIostorinvOrder::getCreate_time)
, false
);
if (ObjectUtil.isEmpty(orderDao)) throw new BadRequestException("此条码在系统中不存在记录");
// 2.创建入库单
JSONObject jsonMst = new JSONObject();
jsonMst.put("biz_date", DateUtil.today());
jsonMst.put("bill_type", IOSEnum.BILL_TYPE_HR.code("生产入库"));
jsonMst.put("remark", "" );
jsonMst.put("product_code", "A3" );
jsonMst.put("point_code", device_code );
jsonMst.put("stor_id", IOSEnum.STOR_CODE.code("海柔半成品"));
jsonMst.put("auto_send", "1"); // 是否自动创建任务并下发
JSONArray tableData = new JSONArray();
JSONObject jsonDtl = new JSONObject();
jsonDtl.put("material_id", orderDao.getMaterial_id());
jsonDtl.put("pcsn", "");
jsonDtl.put("plan_qty", orderDao.getWeight());
jsonDtl.put("quality_scode", IVTEnum.QUALITY_SCODE.code("合格品"));
物料信息:
{
MdMeMaterialbase materDao = iMdMeMaterialbaseService.getById(orderDao.getMaterial_id());
MdPbMeasureunit untiDao = iMdPbMeasureunitService.getById(materDao.getBase_unit_id());
jsonDtl.put("base_unit_id", untiDao.getMeasure_unit_id());
jsonDtl.put("base_unit_name", untiDao.getUnit_name());
jsonDtl.put("unit_weight", materDao.getNet_weight());
jsonDtl.put("storagevehicle_code", barcode);
}
tableData.add(jsonDtl);
jsonMst.put("tableData",tableData);
// 调用创建方法并自动创建任务下发
create(jsonMst);
}
private void delTask(String task_id) {
StIvtIostorinvHrBcp mstDao = this.getOne(

View File

@@ -0,0 +1,19 @@
package org.nl.wms.storage_manage.semimanagehr.service.iostorInv.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.IStIvtIostorinvOrderService;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.StIvtIostorinvOrder;
import org.nl.wms.storage_manage.semimanagehr.service.iostorInv.dao.mapper.StIvtIostorinvOrderMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 出入库顺序表 服务实现类
* </p>
*
* @author generator
* @since 2023-05-10
*/
@Service
public class StIvtIostorinvOrderServiceImpl extends ServiceImpl<StIvtIostorinvOrderMapper, StIvtIostorinvOrder> implements IStIvtIostorinvOrderService {
}

View File

@@ -103,6 +103,7 @@
<el-table-column show-overflow-tooltip prop="storagevehicle_code" label="载具号" />
<el-table-column show-overflow-tooltip prop="sale_code" label="销售单号" />
<el-table-column show-overflow-tooltip min-width="110" prop="seq_no" label="销售单行号" />
<el-table-column show-overflow-tooltip prop="bill_type" label="单据类型" :formatter="formatBillType" />
<el-table-column show-overflow-tooltip prop="canuse_qty" label="可用数量" :formatter="crud.formatNum3" />
<el-table-column show-overflow-tooltip prop="frozen_qty" label="冻结数量" :formatter="crud.formatNum3" />
<el-table-column show-overflow-tooltip prop="ivt_qty" label="库存数量" :formatter="crud.formatNum3" />
@@ -140,6 +141,7 @@ export default {
},
mixins: [presenter(), header(), crud()],
// 数据字典
dicts: ['ST_INV_CP_IN_TYPE'],
data() {
return {
height: document.documentElement.clientHeight - 180 + 'px;',
@@ -160,6 +162,9 @@ export default {
})
},
methods: {
formatBillType(row, column) {
return this.dict.label.ST_INV_CP_IN_TYPE[row.bill_type]
}
}
}
</script>

View File

@@ -88,6 +88,7 @@
<el-table-column show-overflow-tooltip prop="sect_name" label="库区名称" />
<el-table-column show-overflow-tooltip prop="struct_code" label="仓位编码" />
<el-table-column show-overflow-tooltip prop="struct_name" label="仓位名称" />
<el-table-column show-overflow-tooltip prop="bill_type" label="单据类型" :formatter="formatBillType" />
<el-table-column show-overflow-tooltip min-width="120" prop="material_code" label="物料编码" />
<el-table-column show-overflow-tooltip min-width="120" prop="material_name" label="物料名称" />
<el-table-column show-overflow-tooltip min-width="120" prop="material_spec" label="物料规格" />
@@ -126,6 +127,7 @@ export default {
},
mixins: [presenter(), header(), crud()],
// 数据字典
dicts: ['ST_INV_BCP_IN_TYPE'],
data() {
return {
height: document.documentElement.clientHeight - 180 + 'px;',
@@ -151,6 +153,9 @@ export default {
this.crud.notify('导出成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
})
},
formatBillType(row, column) {
return this.dict.label.ST_INV_BCP_IN_TYPE[row.bill_type]
}
}
}
</script>