6 changed files with 685 additions and 381 deletions
@ -0,0 +1,11 @@ |
|||
package org.nl.wms.bigscreen_manage.service.dto; |
|||
|
|||
import lombok.Data; |
|||
|
|||
@Data |
|||
public class IvtAnalyse { |
|||
private String stor_code; |
|||
private String material_id; |
|||
private String material_name; |
|||
private Integer sum_qty; |
|||
} |
@ -1,383 +1,365 @@ |
|||
//package org.nl.wms.bigscreen_manage.service.impl;
|
|||
package org.nl.wms.bigscreen_manage.service.impl; |
|||
|
|||
import cn.hutool.core.date.DateField; |
|||
import cn.hutool.core.date.DateTime; |
|||
import cn.hutool.core.date.DateUtil; |
|||
import cn.hutool.core.util.NumberUtil; |
|||
import cn.hutool.core.util.ObjectUtil; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|||
|
|||
import org.nl.wms.basedata_manage.service.IStructattrService; |
|||
import org.nl.wms.basedata_manage.service.dao.Structattr; |
|||
import org.nl.wms.basedata_manage.service.dao.mapper.BsrealStorattrMapper; |
|||
import org.nl.wms.bigscreen_manage.service.BigScreenService; |
|||
import org.nl.wms.bigscreen_manage.service.dto.IvtAnalyse; |
|||
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.warehouse_manage.enums.IOSConstant; |
|||
import org.nl.wms.warehouse_manage.enums.IOSEnum; |
|||
import org.nl.wms.warehouse_manage.service.IOutBillService; |
|||
import org.nl.wms.warehouse_manage.service.dao.IOStorInv; |
|||
import org.nl.wms.warehouse_manage.service.dao.IOStorInvDis; |
|||
import org.nl.wms.warehouse_manage.service.dao.mapper.IOStorInvDisMapper; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.CollectionUtils; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* <p> |
|||
* 大屏显示 实现类 |
|||
* </p> |
|||
* |
|||
* @author Liuxy |
|||
* @since 2025-06-24 |
|||
*/ |
|||
@Service |
|||
public class BigScreenServiceImpl implements BigScreenService { |
|||
|
|||
@Autowired |
|||
private IStructattrService iStructattrService; |
|||
|
|||
@Resource |
|||
private IOutBillService iOutBillService; |
|||
|
|||
@Resource |
|||
private BsrealStorattrMapper screenMapper; |
|||
|
|||
@Resource |
|||
private IOStorInvDisMapper ioStorInvDisMapper; |
|||
|
|||
@Autowired |
|||
private ISchBaseTaskService iSchBaseTaskService; |
|||
|
|||
@Override |
|||
public List<JSONObject> getData(List<String> stors) { |
|||
// String storCode = "GW";
|
|||
List result = new ArrayList<>(); |
|||
if (CollectionUtils.isEmpty(stors)){ |
|||
return result; |
|||
} |
|||
for (String storCode : stors) { |
|||
JSONObject item = new JSONObject(); |
|||
//1.【货位使用】数据
|
|||
item.put("pointUse", pointUse(storCode)); |
|||
// //2.【实时库存分析】数据
|
|||
item.put("ivtAnalyse", ivtAnalyse(storCode)); |
|||
//3.【出入库趋势】数据
|
|||
item.put("inAndOutTrend", inAndOutTrend(storCode)); |
|||
// //4.【今日出入库】数据
|
|||
item.put("toDayInAndOut", toDayInAndOut(storCode)); |
|||
// //5.【今日出入库】数据
|
|||
item.put("realTask", realTask(storCode)); |
|||
//6.【未完成单据】数据
|
|||
item.put("unIos", unIos(storCode)); |
|||
result.add(item); |
|||
} |
|||
return result; |
|||
} |
|||
/** |
|||
//
|
|||
//import cn.hutool.core.date.DateField;
|
|||
//import cn.hutool.core.date.DateTime;
|
|||
//import cn.hutool.core.date.DateUtil;
|
|||
//import cn.hutool.core.util.NumberUtil;
|
|||
//import cn.hutool.core.util.ObjectUtil;
|
|||
//import com.alibaba.fastjson.JSONObject;
|
|||
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|||
//import org.nl.common.utils.MapOf;
|
|||
//import org.nl.wms.basedata_manage.service.IStructattrService;
|
|||
//import org.nl.wms.basedata_manage.service.dao.Structattr;
|
|||
//import org.nl.wms.basedata_manage.service.dao.StructattrVechielDto;
|
|||
//import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper;
|
|||
//import org.nl.wms.bigscreen_manage.service.BigScreenService;
|
|||
//import org.nl.wms.pda_manage.util.PdaResponse;
|
|||
//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.system_manage.service.dict.dao.mapper.SysDictMapper;
|
|||
//import org.springframework.beans.factory.annotation.Autowired;
|
|||
//import org.springframework.stereotype.Service;
|
|||
//import org.springframework.util.CollectionUtils;
|
|||
//
|
|||
//import java.util.ArrayList;
|
|||
//import java.util.List;
|
|||
//import java.util.stream.Collectors;
|
|||
//
|
|||
///**
|
|||
// * <p>
|
|||
// * 大屏显示 实现类
|
|||
// * </p>
|
|||
// *
|
|||
// * @author Liuxy
|
|||
// * @since 2025-06-24
|
|||
// */
|
|||
//@Service
|
|||
//public class BigScreenServiceImpl implements BigScreenService {
|
|||
//
|
|||
// /**
|
|||
// * 仓位服务
|
|||
// */
|
|||
// @Autowired
|
|||
// private IStructattrService iStructattrService;
|
|||
//
|
|||
// /**
|
|||
// * 载具扩展属性mapper服务
|
|||
// */
|
|||
// @Autowired
|
|||
// private MdPbStoragevehicleextMapper mdPbStoragevehicleextMapper;
|
|||
//
|
|||
// /**
|
|||
// * 任务服务
|
|||
// */
|
|||
// @Autowired
|
|||
// private ISchBaseTaskService iSchBaseTaskService;
|
|||
//
|
|||
// @Override
|
|||
// public List<JSONObject> getData(List<String> stors) {
|
|||
//// String storCode = "GW";
|
|||
// List result = new ArrayList<>();
|
|||
// if (CollectionUtils.isEmpty(stors)){
|
|||
// return result;
|
|||
// }
|
|||
// for (String storCode : stors) {
|
|||
// JSONObject item = new JSONObject();
|
|||
// //1.【货位使用】数据
|
|||
// item.put("pointUse", pointUse(storCode));
|
|||
//// //2.【实时库存分析】数据
|
|||
// item.put("ivtAnalyse", ivtAnalyse(storCode));
|
|||
// //3.【出入库趋势】数据
|
|||
// item.put("inAndOutTrend", inAndOutTrend(storCode));
|
|||
//// //4.【今日出入库】数据
|
|||
// item.put("toDayInAndOut", toDayInAndOut(storCode));
|
|||
//// //5.【今日出入库】数据
|
|||
// item.put("realTask", realTask(storCode));
|
|||
// //6.【未完成单据】数据
|
|||
// item.put("unIos", unIos(storCode));
|
|||
// }
|
|||
// return result;
|
|||
// }
|
|||
// /**
|
|||
////
|
|||
//// * 货位使用
|
|||
//// *
|
|||
//// * @return JSONObject {
|
|||
//// * total_qty: 总货位数
|
|||
//// * use_qty: 已用货位
|
|||
//// * emp_qty: 空余货位
|
|||
//// * use_percentage: 百分比(使用货位百分比)
|
|||
//// * }
|
|||
//// */
|
|||
// private JSONObject pointUse(String storCode) {
|
|||
// // 返回数据
|
|||
// JSONObject result = new JSONObject();
|
|||
// // 查询所有未删除且启用仓位
|
|||
// int emp_qty = iStructattrService.count(
|
|||
// new QueryWrapper<Structattr>().lambda()
|
|||
// .eq(Structattr::getIs_used, Boolean.TRUE)
|
|||
// .eq(Structattr::getStor_code, storCode)
|
|||
// .isNull(Structattr::getStoragevehicle_code));
|
|||
// int use_qty = iStructattrService.count(
|
|||
// new QueryWrapper<Structattr>().lambda()
|
|||
// .eq(Structattr::getIs_used, Boolean.TRUE)
|
|||
// .eq(Structattr::getStor_code, storCode)
|
|||
// .isNotNull(Structattr::getStoragevehicle_code));
|
|||
// int total_qty = iStructattrService.count(
|
|||
// new QueryWrapper<Structattr>().lambda()
|
|||
// .eq(Structattr::getIs_used, Boolean.TRUE)
|
|||
// .eq(Structattr::getStor_code, storCode));
|
|||
// // 总货位数
|
|||
// result.put("total_qty", total_qty);
|
|||
// // 已用货位数
|
|||
// result.put("use_qty", use_qty);
|
|||
// // 空余货位
|
|||
// result.put("emp_qty", emp_qty);
|
|||
// // 使用货位百分比
|
|||
// double use_percentage = NumberUtil.mul(NumberUtil.div(use_qty, total_qty), 100);
|
|||
// result.put("use_percentage", NumberUtil.round(use_percentage, 2));
|
|||
// return result;
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 实时库存分析
|
|||
// *
|
|||
// * @return JSONObject {
|
|||
// * total_qty: 总数
|
|||
// * data: [
|
|||
// * material_name: 物料名称
|
|||
// * ivt_qty: 库存数量
|
|||
// * percentage: 百分比
|
|||
// * ]
|
|||
// * }
|
|||
// */
|
|||
// private JSONObject ivtAnalyse(String storCode) {
|
|||
// // 返回数据
|
|||
// JSONObject result = new JSONObject();
|
|||
// // 查询所有库存
|
|||
// List<StructattrVechielDto> vechielDtos = iStructattrService.collectVechicle(MapOf.of("stor_code", storCode));
|
|||
// // 总数
|
|||
// double total_qty = ivtList.stream()
|
|||
// .map(row -> row.getDoubleValue("canuse_qty"))
|
|||
// .reduce(Double::sum).orElse(0.0);
|
|||
// result.put("total_qty", NumberUtil.round(total_qty, 2));
|
|||
//
|
|||
// // 查询排名前五的物料库存
|
|||
// List<JSONObject> topFiveList;
|
|||
// List<JSONObject> otherList = null;
|
|||
// if (ivtList.size() < 5) {
|
|||
// topFiveList = ivtList;
|
|||
// } else {
|
|||
// topFiveList = ivtList.subList(0, 5);
|
|||
// otherList = ivtList.subList(5, ivtList.size());
|
|||
// }
|
|||
// // 组织数据(物料前五)
|
|||
// for (JSONObject json : topFiveList) {
|
|||
// // 库存数量
|
|||
// json.put("ivt_qty", NumberUtil.round(json.getDoubleValue("canuse_qty"), 2));
|
|||
// // 百分比
|
|||
// double percentage = NumberUtil.mul(NumberUtil.div(json.getDoubleValue("canuse_qty"), total_qty), 100);
|
|||
// json.put("percentage", NumberUtil.round(percentage, 2));
|
|||
// }
|
|||
//
|
|||
// // 计算其他物料
|
|||
// if (ObjectUtil.isNotEmpty(otherList)) {
|
|||
// JSONObject jsonOther = new JSONObject();
|
|||
// jsonOther.put("material_name", "其他");
|
|||
// double ivt_qty = otherList.stream()
|
|||
// .map(row -> row.getDoubleValue("canuse_qty"))
|
|||
// .reduce(Double::sum).orElse(0.0);
|
|||
// jsonOther.put("ivt_qty", NumberUtil.round(ivt_qty, 2));
|
|||
// // 百分比
|
|||
// double percentage = NumberUtil.mul(NumberUtil.div(ivt_qty, total_qty), 100);
|
|||
// jsonOther.put("percentage", NumberUtil.round(percentage, 2));
|
|||
// topFiveList.add(jsonOther);
|
|||
// }
|
|||
//
|
|||
// result.put("data", topFiveList);
|
|||
// return result;
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 出入库趋势
|
|||
// *
|
|||
// * @return JSONObject {
|
|||
// * in: [{date:日期,qty:数量}]
|
|||
// * out: [{date:日期,qty:数量}]
|
|||
// * }
|
|||
// */
|
|||
// private JSONObject inAndOutTrend() {
|
|||
// // 获取七天天数集合
|
|||
// DateTime dateTime = DateUtil.offsetDay(DateUtil.parseDate(DateUtil.today()), -6);
|
|||
// List<String> dateList = DateUtil.rangeToList(dateTime, DateUtil.parse(DateUtil.today()), DateField.DAY_OF_YEAR).stream()
|
|||
// .map(DateTime::toString)
|
|||
// .map(row -> row.substring(0, 10))
|
|||
// .collect(Collectors.toList());
|
|||
// // 查询七天内的出入库数据
|
|||
// List<IOStorInv> allIosList = iOutBillService.list(
|
|||
// new QueryWrapper<IOStorInv>().lambda()
|
|||
// .in(IOStorInv::getBiz_date, dateList)
|
|||
// .eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO)
|
|||
// .eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
|
|||
// );
|
|||
//
|
|||
// // 查询入库单据
|
|||
// List<IOStorInv> inIosList = allIosList.stream()
|
|||
// .filter(row -> row.getIo_type().equals(IOSEnum.IO_TYPE.code("入库")))
|
|||
// .collect(Collectors.toList());
|
|||
// // 查询出库单据
|
|||
// List<IOStorInv> outIosList = allIosList.stream()
|
|||
// .filter(row -> row.getIo_type().equals(IOSEnum.IO_TYPE.code("出库")))
|
|||
// .collect(Collectors.toList());
|
|||
// // 组织数据
|
|||
// List<JSONObject> inList = new ArrayList<>();
|
|||
// List<JSONObject> outList = new ArrayList<>();
|
|||
// for (String date : dateList) {
|
|||
// // 处理入库数量
|
|||
// JSONObject jsonIn = new JSONObject();
|
|||
// jsonIn.put("date", date);
|
|||
// double in_qty = inIosList.stream()
|
|||
// .filter(row -> row.getBiz_date().equals(date))
|
|||
// .map(row -> row.getTotal_qty().doubleValue())
|
|||
// .reduce(Double::sum).orElse(0.00);
|
|||
// jsonIn.put("qty", NumberUtil.round(in_qty, 2));
|
|||
// inList.add(jsonIn);
|
|||
//
|
|||
// // 处理出库数据
|
|||
// JSONObject jsonOut = new JSONObject();
|
|||
// jsonOut.put("date", date);
|
|||
// double out_qty = outIosList.stream()
|
|||
// .filter(row -> row.getBiz_date().equals(date))
|
|||
// .map(row -> row.getTotal_qty().doubleValue())
|
|||
// .reduce(Double::sum).orElse(0.00);
|
|||
// jsonOut.put("qty", NumberUtil.round(out_qty, 2));
|
|||
// outList.add(jsonOut);
|
|||
// }
|
|||
//
|
|||
// JSONObject result = new JSONObject();
|
|||
// result.put("in", inList);
|
|||
// result.put("out", outList);
|
|||
// return result;
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 今日出入库
|
|||
// * 货位使用
|
|||
// *
|
|||
// * @return JSONObject {
|
|||
// * in: {total_qty:总数量,vehicle_qty:托盘数量}
|
|||
// * out: {total_qty:总数量,vehicle_qty:托盘数量}
|
|||
// * }
|
|||
// */
|
|||
// private JSONObject toDayInAndOut() {
|
|||
// // 查询今天出入库单据
|
|||
// List<IOStorInv> inList = iOutBillService.list(
|
|||
// new QueryWrapper<IOStorInv>().lambda()
|
|||
// .eq(IOStorInv::getBiz_date, DateUtil.today())
|
|||
// .eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO)
|
|||
// .eq(IOStorInv::getIo_type, IOSEnum.IO_TYPE.code("入库"))
|
|||
// .eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
|
|||
// );
|
|||
// // 查询今天出库单据
|
|||
// List<IOStorInv> outList = iOutBillService.list(
|
|||
// new QueryWrapper<IOStorInv>().lambda()
|
|||
// .eq(IOStorInv::getBiz_date, DateUtil.today())
|
|||
// .eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO)
|
|||
// .eq(IOStorInv::getIo_type, IOSEnum.IO_TYPE.code("出库"))
|
|||
// .eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
|
|||
// );
|
|||
//
|
|||
// // 入库
|
|||
// JSONObject jsonIn = new JSONObject();
|
|||
// // 总数量
|
|||
// double total_qty_in = inList.stream()
|
|||
// .map(row -> row.getTotal_qty().doubleValue())
|
|||
// .reduce(Double::sum).orElse(0.0);
|
|||
// jsonIn.put("total_qty", NumberUtil.round(total_qty_in, 2));
|
|||
//
|
|||
// // 托盘数
|
|||
// List<IOStorInvDis> inDisList = new ArrayList<>();
|
|||
// if (ObjectUtil.isNotEmpty(inList)) {
|
|||
// inDisList = ioStorInvDisMapper.selectList(
|
|||
// new QueryWrapper<IOStorInvDis>().lambda()
|
|||
// .in(IOStorInvDis::getIostorinv_id, inList.stream()
|
|||
// .map(IOStorInv::getIostorinv_id)
|
|||
// .collect(Collectors.toList())
|
|||
// )
|
|||
// );
|
|||
// }
|
|||
// jsonIn.put("vehicle_qty", inDisList.size());
|
|||
//
|
|||
// // 出库
|
|||
// JSONObject jsonOut = new JSONObject();
|
|||
// // 总数量
|
|||
// double total_qty_out = outList.stream()
|
|||
// .map(row -> row.getTotal_qty().doubleValue())
|
|||
// .reduce(Double::sum).orElse(0.0);
|
|||
// jsonOut.put("total_qty", NumberUtil.round(total_qty_out, 2));
|
|||
// // 托盘数
|
|||
// List<IOStorInvDis> outDisList = new ArrayList<>();
|
|||
// if (ObjectUtil.isNotEmpty(outList)) {
|
|||
// outDisList = ioStorInvDisMapper.selectList(
|
|||
// new QueryWrapper<IOStorInvDis>().lambda()
|
|||
// .in(IOStorInvDis::getIostorinv_id, outList.stream()
|
|||
// .map(IOStorInv::getIostorinv_id)
|
|||
// .collect(Collectors.toList())
|
|||
// )
|
|||
// );
|
|||
// }
|
|||
// jsonOut.put("vehicle_qty", outDisList.size());
|
|||
//
|
|||
// JSONObject result = new JSONObject();
|
|||
// result.put("in", jsonIn);
|
|||
// result.put("out", jsonOut);
|
|||
// return result;
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 实时任务
|
|||
// *
|
|||
// * @return List<SchBaseTask> {
|
|||
// * 任务实体列
|
|||
// * }
|
|||
// */
|
|||
// private List<SchBaseTask> realTask() {
|
|||
// List<SchBaseTask> list = iSchBaseTaskService.list(
|
|||
// new QueryWrapper<SchBaseTask>().lambda()
|
|||
// .in(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode()
|
|||
// , TaskStatus.ISSUED.getCode(), TaskStatus.EXECUTING.getCode()
|
|||
// )
|
|||
// .eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO)
|
|||
// );
|
|||
// list.stream().forEach(item -> {
|
|||
// if (item.getTask_status().equals(TaskStatus.CREATE.getCode())) {
|
|||
// item.setTask_status(TaskStatus.CREATE.getName());
|
|||
// }
|
|||
// if (item.getTask_status().equals(TaskStatus.ISSUED.getCode())) {
|
|||
// item.setTask_status(TaskStatus.ISSUED.getName());
|
|||
// }
|
|||
// if (item.getTask_status().equals(TaskStatus.EXECUTING.getCode())) {
|
|||
// item.setTask_status(TaskStatus.EXECUTING.getName());
|
|||
// }
|
|||
// });
|
|||
//
|
|||
// return list;
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 未完成单据
|
|||
// *
|
|||
// * @return List<IOStorInv>{
|
|||
// * 出入库实体类
|
|||
// * total_qty: 总货位数
|
|||
// * use_qty: 已用货位
|
|||
// * emp_qty: 空余货位
|
|||
// * use_percentage: 百分比(使用货位百分比)
|
|||
// * }
|
|||
// */
|
|||
// private List<IOStorInv> unIos() {
|
|||
// List<Dict> dicts = sysDictMapper.selectList(
|
|||
// new QueryWrapper<Dict>().lambda()
|
|||
// .in(Dict::getCode, "ST_INV_IN_TYPE", "ST_INV_OUT_TYPE")
|
|||
// );
|
|||
//
|
|||
// List<IOStorInv> list = iOutBillService.list(
|
|||
// new QueryWrapper<IOStorInv>().lambda()
|
|||
// .eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO)
|
|||
// .ne(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成"))
|
|||
// );
|
|||
// list.stream().forEach(item -> {
|
|||
// item.setIo_type(item.getIo_type().equals(IOSEnum.IO_TYPE.code("入库")) ? IOSConstant.IOS_IO_TYPE_IN : IOSConstant.IOS_IO_TYPE_OUT);
|
|||
// if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("生成"))) {
|
|||
// item.setBill_status("生成");
|
|||
// }
|
|||
// if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配中"))) {
|
|||
// item.setBill_status("分配中");
|
|||
// }
|
|||
// if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完"))) {
|
|||
// item.setBill_status("分配完");
|
|||
// }
|
|||
// Dict dict = dicts.stream()
|
|||
// .filter(row -> row.getValue().equals(item.getBill_type()))
|
|||
// .findFirst().orElse(null);
|
|||
// item.setBill_type(dict.getLabel());
|
|||
// });
|
|||
// return list;
|
|||
// }
|
|||
//}
|
|||
private JSONObject pointUse(String storCode) { |
|||
// 返回数据
|
|||
JSONObject result = new JSONObject(); |
|||
// 查询所有未删除且启用仓位
|
|||
int emp_qty = iStructattrService.count( |
|||
new QueryWrapper<Structattr>().lambda() |
|||
.eq(Structattr::getIs_used, Boolean.TRUE) |
|||
.eq(Structattr::getStor_code, storCode) |
|||
.isNull(Structattr::getStoragevehicle_code)); |
|||
int use_qty = iStructattrService.count( |
|||
new QueryWrapper<Structattr>().lambda() |
|||
.eq(Structattr::getIs_used, Boolean.TRUE) |
|||
.eq(Structattr::getStor_code, storCode) |
|||
.isNotNull(Structattr::getStoragevehicle_code)); |
|||
int total_qty = iStructattrService.count( |
|||
new QueryWrapper<Structattr>().lambda() |
|||
.eq(Structattr::getIs_used, Boolean.TRUE) |
|||
.eq(Structattr::getStor_code, storCode)); |
|||
// 总货位数
|
|||
result.put("total_qty", total_qty); |
|||
// 已用货位数
|
|||
result.put("use_qty", use_qty); |
|||
// 空余货位
|
|||
result.put("emp_qty", emp_qty); |
|||
// 使用货位百分比
|
|||
double use_percentage = NumberUtil.mul(NumberUtil.div(use_qty, total_qty), 100); |
|||
result.put("use_percentage", NumberUtil.round(use_percentage, 2)); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 实时库存分析 |
|||
* |
|||
* @return JSONObject { |
|||
* total_qty: 总数 |
|||
* data: [ |
|||
* material_name: 物料名称 |
|||
* ivt_qty: 库存数量 |
|||
* percentage: 百分比 |
|||
* ] |
|||
* } |
|||
*/ |
|||
private JSONObject ivtAnalyse(String storCode) { |
|||
JSONObject result = new JSONObject(); |
|||
List<IvtAnalyse> list = screenMapper.sumMaterQty(storCode); |
|||
int sum = list.stream().mapToInt(IvtAnalyse::getSum_qty).sum(); |
|||
result.put("total_qty", sum); |
|||
List<JSONObject> topFiveList = new ArrayList<>(); |
|||
int i = 0; |
|||
int top5 = 0; |
|||
for (IvtAnalyse json : list) { |
|||
if (i==5){break;} |
|||
JSONObject item = new JSONObject(); |
|||
item.put("ivt_qty", json.getSum_qty()); |
|||
item.put("material_name", json.getMaterial_name()); |
|||
double percentage = NumberUtil.mul(json.getSum_qty()/sum, 100); |
|||
item.put("percentage", NumberUtil.round(percentage, 2)); |
|||
topFiveList.add(item); |
|||
i++; |
|||
top5 = top5+json.getSum_qty(); |
|||
} |
|||
if (sum>top5){ |
|||
JSONObject other = new JSONObject(); |
|||
other.put("ivt_qty", sum-top5); |
|||
other.put("material_name", "其他物料"); |
|||
other.put("percentage", NumberUtil.round(1-top5/sum, 2)); |
|||
topFiveList.add(other); |
|||
} |
|||
result.put("data", topFiveList); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 出入库趋势 |
|||
* |
|||
* @return JSONObject { |
|||
* in: [{date:日期,qty:数量}] |
|||
* out: [{date:日期,qty:数量}] |
|||
* } |
|||
*/ |
|||
private JSONObject inAndOutTrend(String storCode) { |
|||
// 获取七天天数集合
|
|||
DateTime dateTime = DateUtil.offsetDay(DateUtil.parseDate(DateUtil.today()), -6); |
|||
List<String> dateList = DateUtil.rangeToList(dateTime, DateUtil.parse(DateUtil.today()), DateField.DAY_OF_YEAR).stream() |
|||
.map(DateTime::toString) |
|||
.map(row -> row.substring(0, 10)) |
|||
.collect(Collectors.toList()); |
|||
// 查询七天内的出入库数据
|
|||
List<IOStorInv> allIosList = iOutBillService.list( |
|||
new QueryWrapper<IOStorInv>().lambda() |
|||
.in(IOStorInv::getBiz_date, dateList) |
|||
.eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO) |
|||
.eq(IOStorInv::getStor_code, storCode) |
|||
.eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成")) |
|||
); |
|||
// 查询入库单据
|
|||
List<IOStorInv> inIosList = allIosList.stream() |
|||
.filter(row -> row.getIo_type().equals(IOSEnum.IO_TYPE.code("入库"))) |
|||
.collect(Collectors.toList()); |
|||
// 查询出库单据
|
|||
List<IOStorInv> outIosList = allIosList.stream() |
|||
.filter(row -> row.getIo_type().equals(IOSEnum.IO_TYPE.code("出库"))) |
|||
.collect(Collectors.toList()); |
|||
// 组织数据
|
|||
List<JSONObject> inList = new ArrayList<>(); |
|||
List<JSONObject> outList = new ArrayList<>(); |
|||
for (String date : dateList) { |
|||
// 处理入库数量
|
|||
JSONObject jsonIn = new JSONObject(); |
|||
jsonIn.put("date", date); |
|||
double in_qty = inIosList.stream() |
|||
.filter(row -> row.getBiz_date().equals(date)) |
|||
.map(row -> row.getTotal_qty().doubleValue()) |
|||
.reduce(Double::sum).orElse(0.00); |
|||
jsonIn.put("qty", NumberUtil.round(in_qty, 2)); |
|||
inList.add(jsonIn); |
|||
|
|||
// 处理出库数据
|
|||
JSONObject jsonOut = new JSONObject(); |
|||
jsonOut.put("date", date); |
|||
double out_qty = outIosList.stream() |
|||
.filter(row -> row.getBiz_date().equals(date)) |
|||
.map(row -> row.getTotal_qty().doubleValue()) |
|||
.reduce(Double::sum).orElse(0.00); |
|||
jsonOut.put("qty", NumberUtil.round(out_qty, 2)); |
|||
outList.add(jsonOut); |
|||
} |
|||
|
|||
JSONObject result = new JSONObject(); |
|||
result.put("in", inList); |
|||
result.put("out", outList); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 今日出入库 |
|||
* |
|||
* @return JSONObject { |
|||
* in: {total_qty:总数量,vehicle_qty:托盘数量} |
|||
* out: {total_qty:总数量,vehicle_qty:托盘数量} |
|||
* } |
|||
*/ |
|||
private JSONObject toDayInAndOut(String storCode) { |
|||
// 查询今天出入库单据
|
|||
List<IOStorInv> inList = iOutBillService.list( |
|||
new QueryWrapper<IOStorInv>().lambda() |
|||
.eq(IOStorInv::getBiz_date, DateUtil.today()) |
|||
.eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO) |
|||
.eq(IOStorInv::getStor_code, storCode) |
|||
.eq(IOStorInv::getIo_type, IOSEnum.IO_TYPE.code("入库")) |
|||
.eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成")) |
|||
); |
|||
// 查询今天出库单据
|
|||
List<IOStorInv> outList = iOutBillService.list( |
|||
new QueryWrapper<IOStorInv>().lambda() |
|||
.eq(IOStorInv::getBiz_date, DateUtil.today()) |
|||
.eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO) |
|||
.eq(IOStorInv::getStor_code, storCode) |
|||
.eq(IOStorInv::getIo_type, IOSEnum.IO_TYPE.code("出库")) |
|||
.eq(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成")) |
|||
); |
|||
|
|||
// 入库
|
|||
JSONObject jsonIn = new JSONObject(); |
|||
// 总数量
|
|||
double total_qty_in = inList.stream() |
|||
.map(row -> row.getTotal_qty().doubleValue()) |
|||
.reduce(Double::sum).orElse(0.0); |
|||
jsonIn.put("total_qty", NumberUtil.round(total_qty_in, 2)); |
|||
|
|||
// 托盘数
|
|||
List<IOStorInvDis> inDisList = new ArrayList<>(); |
|||
if (ObjectUtil.isNotEmpty(inList)) { |
|||
inDisList = ioStorInvDisMapper.selectList( |
|||
new QueryWrapper<IOStorInvDis>().lambda() |
|||
.in(IOStorInvDis::getIostorinv_id, inList.stream() |
|||
.map(IOStorInv::getIostorinv_id) |
|||
.collect(Collectors.toList()) |
|||
) |
|||
); |
|||
} |
|||
jsonIn.put("vehicle_qty", inDisList.size()); |
|||
|
|||
// 出库
|
|||
JSONObject jsonOut = new JSONObject(); |
|||
// 总数量
|
|||
double total_qty_out = outList.stream() |
|||
.map(row -> row.getTotal_qty().doubleValue()) |
|||
.reduce(Double::sum).orElse(0.0); |
|||
jsonOut.put("total_qty", NumberUtil.round(total_qty_out, 2)); |
|||
// 托盘数
|
|||
List<IOStorInvDis> outDisList = new ArrayList<>(); |
|||
if (ObjectUtil.isNotEmpty(outList)) { |
|||
outDisList = ioStorInvDisMapper.selectList( |
|||
new QueryWrapper<IOStorInvDis>().lambda() |
|||
.in(IOStorInvDis::getIostorinv_id, outList.stream() |
|||
.map(IOStorInv::getIostorinv_id) |
|||
.collect(Collectors.toList()) |
|||
) |
|||
); |
|||
} |
|||
jsonOut.put("vehicle_qty", outDisList.size()); |
|||
|
|||
JSONObject result = new JSONObject(); |
|||
result.put("in", jsonIn); |
|||
result.put("out", jsonOut); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 实时任务 |
|||
* |
|||
* @return List<SchBaseTask> { |
|||
* 任务实体列 |
|||
* } |
|||
*/ |
|||
private List<SchBaseTask> realTask(String storCode) { |
|||
List<SchBaseTask> list = iSchBaseTaskService.list( |
|||
new QueryWrapper<SchBaseTask>().lambda() |
|||
.in(SchBaseTask::getTask_status, TaskStatus.CREATE.getCode() |
|||
, TaskStatus.ISSUED.getCode(), TaskStatus.EXECUTING.getCode() |
|||
) |
|||
.eq(SchBaseTask::getIs_delete, IOSConstant.IS_DELETE_NO) |
|||
); |
|||
list.stream().forEach(item -> { |
|||
if (item.getTask_status().equals(TaskStatus.CREATE.getCode())) { |
|||
item.setTask_status(TaskStatus.CREATE.getName()); |
|||
} |
|||
if (item.getTask_status().equals(TaskStatus.ISSUED.getCode())) { |
|||
item.setTask_status(TaskStatus.ISSUED.getName()); |
|||
} |
|||
if (item.getTask_status().equals(TaskStatus.EXECUTING.getCode())) { |
|||
item.setTask_status(TaskStatus.EXECUTING.getName()); |
|||
} |
|||
}); |
|||
|
|||
return list; |
|||
} |
|||
|
|||
/** |
|||
* 未完成单据 |
|||
* |
|||
* @return List<IOStorInv>{ |
|||
* 出入库实体类 |
|||
* } |
|||
*/ |
|||
private List<IOStorInv> unIos(String storCode) { |
|||
|
|||
List<IOStorInv> list = iOutBillService.list( |
|||
new QueryWrapper<IOStorInv>().lambda() |
|||
.eq(IOStorInv::getIs_delete, IOSConstant.IS_DELETE_NO) |
|||
.eq(IOStorInv::getStor_code, storCode) |
|||
.ne(IOStorInv::getBill_status, IOSEnum.BILL_STATUS.code("完成")) |
|||
); |
|||
list.stream().forEach(item -> { |
|||
item.setIo_type(item.getIo_type().equals(IOSEnum.IO_TYPE.code("入库"))?"入库":"出库"); |
|||
if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("生成"))) { |
|||
item.setBill_status("生成"); |
|||
} |
|||
if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配中"))) { |
|||
item.setBill_status("分配中"); |
|||
} |
|||
if (item.getBill_status().equals(IOSEnum.BILL_STATUS.code("分配完"))) { |
|||
item.setBill_status("分配完"); |
|||
} |
|||
item.setBill_type("dict.getLabel()"); |
|||
}); |
|||
return list; |
|||
} |
|||
} |
|||
|
@ -0,0 +1,280 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
<!--工具栏--> |
|||
<div class="head-container"> |
|||
<div v-if="crud.props.searchToggle"> |
|||
<!-- 搜索 --> |
|||
<el-form |
|||
:inline="true" |
|||
class="demo-form-inline" |
|||
label-position="right" |
|||
label-width="80px" |
|||
label-suffix=":" |
|||
> |
|||
<el-form-item label="载具类型"> |
|||
<el-select |
|||
v-model="query.storagevehicle_type" |
|||
clearable |
|||
class="filter-item" |
|||
placeholder="请选择" |
|||
@change="crud.toQuery" |
|||
> |
|||
<el-option |
|||
v-for="item in dict.storagevehicle_type" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="模糊搜索"> |
|||
<el-input |
|||
v-model="query.storagevehicle_code" |
|||
clearable |
|||
size="mini" |
|||
placeholder="载具号、载具名称" |
|||
style="width: 200px;" |
|||
class="filter-item" |
|||
@keyup.enter.native="crud.toQuery" |
|||
/> |
|||
</el-form-item> |
|||
<rrOperation /> |
|||
</el-form> |
|||
|
|||
</div> |
|||
<!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'--> |
|||
<crudOperation :permission="permission" /> |
|||
<!--表单组件--> |
|||
<el-dialog |
|||
:before-close="crud.cancelCU" |
|||
:close-on-click-modal="false" |
|||
:title="crud.status.title" |
|||
:visible.sync="crud.status.cu > 0" |
|||
width="450px" |
|||
> |
|||
<el-form ref="form" :model="form" :rules="rules" size="mini" label-width="100px"> |
|||
<el-form-item label="载具类型" prop="storagevehicle_type"> |
|||
<el-select |
|||
v-model="form.storagevehicle_type" |
|||
class="filter-item" |
|||
placeholder="请选择" |
|||
:disabled="crud.status.edit > 0" |
|||
style="width: 200px;" |
|||
> |
|||
<el-option |
|||
v-for="item in dict.storagevehicle_type" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="载具编码" prop="storagevehicle_code"> |
|||
<el-input v-model="form.storagevehicle_code" style="width: 200px;" :disabled="crud.status.edit > 0" /> |
|||
</el-form-item> |
|||
<el-form-item label="载具名称" prop="storagevehicle_name"> |
|||
<el-input v-model="form.storagevehicle_name" style="width: 200px;" /> |
|||
</el-form-item> |
|||
<el-form-item label="载具重量" prop="weigth"> |
|||
<el-input-number v-model="form.weigth" :precision="1" style="width: 200px;" /> |
|||
</el-form-item> |
|||
<el-form-item label="是否启用"> |
|||
<el-radio v-model="form.is_used" label="0">否</el-radio> |
|||
<el-radio v-model="form.is_used" label="1">是</el-radio> |
|||
</el-form-item> |
|||
</el-form> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="info" @click="crud.cancelCU">取消</el-button> |
|||
<el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">保存</el-button> |
|||
</div> |
|||
</el-dialog> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
:data="crud.data" |
|||
size="mini" |
|||
style="width: 100%;" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
> |
|||
<el-table-column type="selection" width="55" /> |
|||
<el-table-column v-if="false" prop="storagevehicle_id" label="载具标识" /> |
|||
<el-table-column prop="storagevehicle_type_name" label="载具类型" :formatter="formattType" /> |
|||
<el-table-column prop="storagevehicle_code" label="载具编码" /> |
|||
<el-table-column prop="storagevehicle_name" label="载具名称" /> |
|||
<el-table-column prop="pcsn" label="绑定物料" /> |
|||
<el-table-column prop="weigth" label="托盘重量" /> |
|||
<el-table-column label="是否启用" align="center" prop="is_used"> |
|||
<template slot-scope="scope"> |
|||
<el-switch |
|||
v-model="scope.row.is_used" |
|||
active-color="#409EFF" |
|||
inactive-color="#F56C6C" |
|||
active-value="1" |
|||
inactive-value="0" |
|||
@change="changeEnabled(scope.row, scope.row.is_used)" |
|||
/> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="create_name" label="创建人" /> |
|||
<el-table-column prop="create_time" label="创建时间" width="150px" /> |
|||
<el-table-column |
|||
v-permission="['admin','storagevehicleinfo:edit','storagevehicleinfo:del']" |
|||
label="操作" |
|||
width="150px" |
|||
align="center" |
|||
fixed="right" |
|||
> |
|||
<template slot-scope="scope"> |
|||
<udOperation |
|||
:data="scope.row" |
|||
:permission="permission" |
|||
/> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--分页组件--> |
|||
<pagination /> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import crudStoragevehicleinfo from '@/views/wms/basedata/storagevehicleinfo/storagevehicleinfo' |
|||
import CRUD, { crud, form, header, presenter } from '@crud/crud' |
|||
import rrOperation from '@crud/RR.operation' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
import udOperation from '@crud/UD.operation' |
|||
import pagination from '@crud/Pagination' |
|||
|
|||
const defaultForm = { |
|||
storagevehicle_id: null, |
|||
storagevehicle_code: null, |
|||
storagevehicle_name: null, |
|||
one_code: null, |
|||
two_code: null, |
|||
rfid_code: null, |
|||
create_id: null, |
|||
create_name: null, |
|||
create_time: null, |
|||
update_optid: null, |
|||
update_optname: null, |
|||
update_time: null, |
|||
is_delete: null, |
|||
is_used: '1', |
|||
storagevehicle_type: null, |
|||
weigth: null, |
|||
vehicle_width: null, |
|||
vehicle_long: null, |
|||
vehicle_height: null, |
|||
overstruct_type: null, |
|||
occupystruct_qty: null, |
|||
ext_id: null, |
|||
qty: null, |
|||
pcsn: null |
|||
} |
|||
export default { |
|||
name: 'Storagevehicleinfo', |
|||
dicts: ['storagevehicle_type', 'is_used'], |
|||
components: { pagination, crudOperation, rrOperation, udOperation }, |
|||
mixins: [presenter(), header(), form(defaultForm), crud()], |
|||
cruds() { |
|||
return CRUD({ |
|||
title: '载具', |
|||
url: 'api/storagevehicleinfo', |
|||
idField: 'storagevehicle_id', |
|||
sort: 'storagevehicle_id,desc', |
|||
crudMethod: { ...crudStoragevehicleinfo }, |
|||
optShow: { |
|||
add: true, |
|||
edit: false, |
|||
del: false, |
|||
download: false, |
|||
reset: true |
|||
} |
|||
}) |
|||
}, |
|||
data() { |
|||
var numberOne = (rule, value, callback) => { |
|||
const numReg = /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/ |
|||
const numRe = new RegExp(numReg) |
|||
if (!numRe.test(value)) { |
|||
callback(new Error('只能输入数字')) |
|||
} else { |
|||
callback() |
|||
} |
|||
} |
|||
return { |
|||
resultCodeArr: [], |
|||
permission: {}, |
|||
classes1: [], |
|||
rules: { |
|||
is_delete: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
is_used: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
storagevehicle_type: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
storagevehicle_code: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
storagevehicle_name: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
overstruct_type: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' } |
|||
], |
|||
num: [ |
|||
{ required: true, message: '不能为空', trigger: 'blur' }, |
|||
{ validator: numberOne } |
|||
] |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
// 钩子:在获取表格数据之前执行,false 则代表不获取数据 |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
return true |
|||
}, |
|||
hand(value) { |
|||
this.crud.toQuery() |
|||
}, |
|||
// 改变状态 |
|||
changeEnabled(data, val) { |
|||
this.$confirm('此操作将 "' + this.dict.label.is_used[val] + '" ' + data.storagevehicle_code + ', 是否继续?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}).then(() => { |
|||
crudStoragevehicleinfo.edit(data).then(res => { |
|||
this.crud.notify(this.dict.label.is_used[val] + '成功', CRUD.NOTIFICATION_TYPE.SUCCESS) |
|||
}).catch(() => { |
|||
if (data.is_used === '0') { |
|||
data.is_used = '1' |
|||
return |
|||
} |
|||
if (data.is_used === '1') { |
|||
data.is_used = '0' |
|||
} |
|||
}) |
|||
}).catch(() => { |
|||
if (data.is_used === '0') { |
|||
data.is_used = '1' |
|||
return |
|||
} |
|||
if (data.is_used === '1') { |
|||
data.is_used = '0' |
|||
} |
|||
}) |
|||
}, |
|||
formattType(row) { |
|||
return this.dict.label.storagevehicle_type[row.storagevehicle_type] |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
|
|||
</style> |
Loading…
Reference in new issue