This commit is contained in:
zhengxuming
2025-07-28 17:30:05 +08:00
9 changed files with 277 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
package org.nl.common.utils;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
@@ -23,12 +24,12 @@ public class SecurityUtils {
* @return 系统用户
*/
public static CurrentUser getCurrentUser() {
Object loginInfo = StpUtil.getExtra("loginInfo");
if (loginInfo==null){
throw new BadRequestException("用户信息获取失败");
try {
Object loginInfo = StpUtil.getExtra("loginInfo");
return JSONObject.parseObject(String.valueOf(loginInfo),CurrentUser.class);
} catch (Exception e) {
return null;
}
return JSONObject.parseObject(String.valueOf(loginInfo),CurrentUser.class);
}
/**
@@ -37,7 +38,11 @@ public class SecurityUtils {
* @return 系统用户名称
*/
public static String getCurrentUsername() {
return getCurrentUser().getUsername();
CurrentUser user = getCurrentUser();
if (user!=null){
return user.getUsername();
}
return "系统用户";
}
/**
@@ -46,13 +51,11 @@ public class SecurityUtils {
* @return 系统用户名称
*/
public static String getCurrentNickName() {
// CurrentUser user = getCurrentUser();
// if (user!=null){
// return user.getPresonName();
// }
// return null;
//tofix postMan测试完成后改回
return "admin";
CurrentUser user = getCurrentUser();
if (user!=null){
return user.getPresonName();
}
return "default";
}
/**
@@ -61,8 +64,9 @@ public class SecurityUtils {
* @return 系统用户Id
*/
public static String getCurrentUserId() {
//return getCurrentUser().getId();
//tofix postMan测试完成后改回
if (ObjectUtil.isNotEmpty(getCurrentUser())) {
return getCurrentUser().getId();
}
return "1";
}

View File

@@ -19,6 +19,8 @@ import java.util.List;
/**
* 解包入库策略
* 1、正常入库料桶入到缓存库
* 2、退料入库0012入库到原料库
* @Author: lyd
* @Date: 2025/7/23
*/

View File

@@ -66,6 +66,6 @@ public class PdaJBController {
@Log("解包退料")
@SaIgnore
public ResponseEntity<Object> jbReturnMaterial(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(null, HttpStatus.OK);
return new ResponseEntity<>(pdaJBService.jbReturnMaterial(whereJson), HttpStatus.OK);
}
}

View File

@@ -29,4 +29,11 @@ public interface PdaJBService {
* @return
*/
PdaResponse confirmSet(JSONObject param);
/**
* 原料退料
* @param param
* @return
*/
PdaResponse jbReturnMaterial(JSONObject param);
}

View File

@@ -196,7 +196,12 @@ public class PdaJBServiceImpl implements PdaJBService {
// 3、工单状态修改设置实际开始时间
workorder.setWorkorder_status("3");
workorder.setOperator(SecurityUtils.getCurrentNickName());
workorder.setReal_weight(workorder.getPlan_weight());
workorder.setRealproducestart_date(DateUtil.now());
workorder.setUpdate_time(DateUtil.now());
workorder.setUpdate_id(SecurityUtils.getCurrentUserId());
workorder.setUpdate_name(SecurityUtils.getCurrentNickName());
workorderService.updateById(workorder);
return PdaResponse.requestOk();
}
@@ -408,6 +413,100 @@ public class PdaJBServiceImpl implements PdaJBService {
return PdaResponse.requestOk();
}
@Override
@Transactional(rollbackFor = Exception.class)
public PdaResponse jbReturnMaterial(JSONObject param) {
// param: area, point_code, workorder_id
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
String area = param.getString("area");
String tpCode = param.getString("tp_code");
String pointCode = param.getString("point_code");
String workorderId = param.getString("workorder_id");
PdmBdWorkorder workOrder = workorderService.getById(workorderId);
if (ObjectUtil.isEmpty(workOrder)) {
throw new BadRequestException("工单[" + workorderId + "]不存在!");
}
SchBasePoint device = pointService.getById(pointCode);
if (ObjectUtil.isEmpty(device)) {
throw new BadRequestException("设备:" + pointCode + " 不存在!");
}
MdPbStoragevehicleinfo vehicleInfo = storagevehicleinfoService.getByCode(tpCode);
MdMeMaterialbase materialbase = materialbaseService.getById(workOrder.getMaterial_id());
if (ObjectUtil.isEmpty(materialbase)) {
throw new BadRequestException("物料【" + workOrder.getMaterial_id() + "】不存在!");
}
Structattr structattr = structattrService.findByCode(workOrder.getStruct_code());
// 0 组盘(涉及什么库区,通过工单对应的仓位的属性。)
GroupPlate groupPlate = new GroupPlate();
groupPlate.setGroup_id(IdUtil.getStringId());
groupPlate.setStoragevehicle_code(tpCode);
// 料桶类型根据工单,工单是根据点位
groupPlate.setStoragevehicle_type(vehicleInfo.getStoragevehicle_type());
groupPlate.setMaterial_id(workOrder.getMaterial_id());
groupPlate.setPcsn(DateUtil.format(new Date(), "yyyy-MM-dd"));
groupPlate.setQty(workOrder.getPlan_weight());
groupPlate.setQty_unit_id("11");
groupPlate.setQty_unit_name("kg");
groupPlate.setFrozen_qty(BigDecimal.ZERO);
groupPlate.setStatus(IOSEnum.GROUP_PLATE_STATUS.code("组盘"));
groupPlate.setCreate_id(currentUserId);
groupPlate.setCreate_name(nickName);
groupPlate.setCreate_time(now);
groupplateService.save(groupPlate);
// 1 创建退料入库单、明细单、分配单
Map<String, Object> insertInvObj = new HashMap();
ArrayList<HashMap> tableData = new ArrayList<>();
HashMap<String, Object> table = new HashMap<>();
tableData.add(table);
insertInvObj.put("stor_id", structattr.getStor_id());
insertInvObj.put("bill_status", "10");
insertInvObj.put("total_qty", workOrder.getPlan_weight());
insertInvObj.put("detail_count", 1);
insertInvObj.put("bill_type", "0012");
insertInvObj.put("biz_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
insertInvObj.put("tableData", tableData);
table.put("group_id", groupPlate.getGroup_id());
table.put("storagevehicle_code", tpCode);
table.put("storagevehicle_type", vehicleInfo.getStoragevehicle_type());
table.put("material_id", materialbase.getMaterial_id());
table.put("pcsn", groupPlate.getPcsn());
table.put("qty", groupPlate.getQty());
table.put("qty_unit_id", groupPlate.getQty_unit_id());
table.put("qty_unit_name", groupPlate.getQty_unit_name());
table.put("fronzen_qty", groupPlate.getFrozen_qty());
table.put("status", "01");
table.put("material_code", materialbase.getMaterial_code());
table.put("material_name", materialbase.getMaterial_name());
table.put("material_spec", materialbase.getMaterial_spec());
String invId = inBillService.insertDtl(insertInvObj);
// 2 分配货位(获取一个空托盘的仓位)
JSONObject divObj = new JSONObject();
divObj.put("sect_code", structattr.getSect_code());
divObj.put("stor_code", structattr.getStor_id());
divObj.put("checked", true);
List<IOStorInvDis> ioStorInvDis = ioStorInvDisMapper.selectList(new LambdaQueryWrapper<IOStorInvDis>()
.eq(IOStorInvDis::getIostorinv_id, invId));
if (ioStorInvDis.size() == 0) {
throw new BadRequestException("分配明细不存在!");
}
// 类型转换
ArrayList<LinkedHashMap> tables = new ArrayList<>();
ioStorInvDis.forEach(item -> tables.add(JSONObject.parseObject(JSONObject.toJSONString(item), LinkedHashMap.class)));
divObj.put("tableMater", tables);
inBillService.divStruct(divObj);
// 3 一键设置、创建任务4点任务点位是设备对应的上料位01和上料位02仓位是分配的货位其中一个
Map<String, Object> jsonMst = buildTaskData(pointCode, workorderId, invId);
inBillService.divPoint(jsonMst);
// 4 工单结束(方便下一个工单可以继续)
// 工单完成
workOrder.setWorkorder_status("5");
workOrder.setRealproduceend_date(DateUtil.now());
workorderService.updateById(workOrder);
return PdaResponse.requestOk();
}
private Map<String, Object> buildTaskData(String pointCode, String workorderId, String invId) {
Map<String, Object> jsonMst = new HashMap<>();
// ru库点

View File

@@ -0,0 +1,114 @@
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.JSONObject;
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.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;
import org.nl.wms.sch_manage.service.dao.SchBaseTask;
import org.nl.wms.sch_manage.service.util.AbstractTask;
import org.nl.wms.sch_manage.service.util.AcsTaskDto;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 解包退料AGV任务
* @Author: lyd
* @Date: 2025/7/28
*/
@Slf4j
@Component("JbBackAgvTask")
public class JbBackAgvTask extends AbstractTask {
@Resource
private ISchBaseTaskService taskService;
@Override
public String create(JSONObject json) {
SchBaseTask task = new SchBaseTask();
task.setTask_id(IdUtil.getStringId());
task.setTask_code(json.getString("TaskCode"));
task.setTask_status(TaskStatus.CREATE.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.setGroup_id(json.getString("group_id"));
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());
taskService.save(task);
return task.getTask_id();
}
@Override
public AcsTaskDto sendAcsParam(String taskId) {
return null;
}
@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("执行中");
taskService.updateById(taskObj);
}
if (status.equals(TaskStatus.FINISHED)) {
this.finishTask(taskObj);
}
if (status.equals(TaskStatus.CANCELED)) {
this.cancelTask(taskObj);
}
}
@Override
public void forceFinish(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
this.finishTask(taskObj);
}
private void finishTask(SchBaseTask taskObj) {
}
@Override
public void cancel(String task_code) {
SchBaseTask taskObj = taskService.getByCode(task_code);
if (ObjectUtil.isEmpty(taskObj)) {
throw new BadRequestException("该任务不存在");
}
if (!TaskStatus.CREATE.getCode().equals(taskObj.getTask_status())) {
throw new BadRequestException("任务状态必须为生成才能取消任务");
}
this.cancelTask(taskObj);
}
private void cancelTask(SchBaseTask taskObj) {
}
@Override
public void backMes(String task_code) {
}
}

View File

@@ -33,6 +33,7 @@ import org.nl.wms.sch_manage.service.ISchBasePointService;
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.util.tasks.StInTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbBackAgvTask;
import org.nl.wms.sch_manage.service.util.tasks.jb.JbDownAgvTask;
import org.nl.wms.warehouse_manage.enums.IOSConstant;
import org.nl.wms.warehouse_manage.enums.IOSEnum;
@@ -92,6 +93,8 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
private ISchBasePointService pointService;
@Resource
private JbDownAgvTask jbDownAgvTask;
@Resource
private JbBackAgvTask jbBackAgvTask;
@Override
public IPage<IOStorInv> pageQuery(Map whereJson, PageQuery page) {
@@ -620,6 +623,32 @@ public class InBillServiceImpl extends ServiceImpl<IOStorInvMapper, IOStorInv> i
JSONObject requestTaskParam = new JSONObject();
requestTaskParam.put("tasks", jsonObjects);
task_id = jbDownAgvTask.create(requestTaskParam);
} else if ("0012".equals(invObj.getBill_type())) {
// 解包退料入库
String structCode = map.get("struct_code");
if (ObjectUtil.isEmpty(structCode)) {
throw new BadRequestException("仓位未分配!");
}
// 获取组盘信息
GroupPlate groupPlate = mdPbGroupplateService.getOne(new LambdaQueryWrapper<GroupPlate>()
.eq(GroupPlate::getStoragevehicle_code, ioStorInvDis.getStoragevehicle_code())
.eq(GroupPlate::getStatus, IOSEnum.GROUP_PLATE_STATUS.code("入库")));
// 解包入库
SchBasePoint rkPoint = pointService.getById(point_code);
// 父点位
SchBasePoint parentPoint = pointService.getById(rkPoint.getParent_point_code());
SchBasePoint fullPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "3");
SchBasePoint emptyPoint = pointService.getNotTaskByRegionAndType(parentPoint.getRegion_code(), "4");
JSONObject task = new JSONObject();
task.put("task_type", "JbDownAgvTask");
task.put("group_id", groupPlate.getGroup_id());
task.put("workorder_id", whereJson.get("workorder_id"));
task.put("TaskCode", CodeUtil.getNewCode("TASK_CODE"));
task.put("point_code1", structCode);
task.put("point_code2", emptyPoint.getPoint_code());
task.put("point_code3", fullPoint.getPoint_code());
task.put("point_code4", structCode);
jbBackAgvTask.create(task);
} else {
//创建任务
JSONObject task_form = new JSONObject();

View File

@@ -332,8 +332,8 @@
{{ dict.label.pdm_workorder_status[scope.row.workorder_status] }}
</template>
</el-table-column>
<el-table-column prop="plan_qty" label="计划" :min-width="flexWidth('plan_qty',crud.data,'计划数量')" />
<el-table-column prop="real_qty" label="实际" :min-width="flexWidth('real_qty',crud.data,'实际数量')" />
<el-table-column prop="plan_weight" label="计划" :min-width="flexWidth('plan_weight',crud.data,'计划数量')" />
<el-table-column prop="real_weight" label="实际" :min-width="flexWidth('real_weight',crud.data,'实际数量')" />
<!-- <el-table-column prop="region_code" label="区域编码" :min-width="flexWidth('region_code',crud.data,'区域编码')" />-->
<el-table-column
prop="region_name"
@@ -616,13 +616,15 @@ export default {
this.materialCode = code
},
tableChanged(row, flag) {
console.log(row)
if (flag === 1) {
this.form.material_name = row.material_name
this.form.material_id = row.material_id
this.form.material_spec = '不存在'
this.form.material_spec = row.material_spec
this.form.material_code = row.material_code
this.form.struct_code = row.struct_code
this.form.raw_material_code = row.storagevehicle_code
this.form.plan_weight = row.qty
}
},
clearRecordMesOrder() {

View File

@@ -95,7 +95,7 @@
<el-table-column prop="frozen_qty" label="冻结数" :formatter="crud.formatNum3" :min-width="100" />
<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="insert_time" label="入库时间" :min-width="flexWidth('insert_time',crud.data,'入库时间')" />
<el-table-column prop="create_time" label="入库时间" :min-width="flexWidth('insert_time',crud.data,'入库时间')" />
</el-table>
<!--分页组件-->
<pagination />