Browse Source

[fix]

仓库管理 入库单
修改生产入库单入库页面,修改表格结构,添加入库数、仓库信息校验;
修改生产订单入库service方法,更新相关订单数量及状态,新增更新库存查询;
修改更新库存查询service方法,修改委内入库相关方法为生产入库;
dev
王晓迪 3 months ago
parent
commit
5ed62f0699
  1. 101
      ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseStorageOrderServiceImpl.java
  2. 145
      ruoyi-admin/src/main/resources/templates/warehouse/storageOrder/storageMake.html

101
ruoyi-admin/src/main/java/com/ruoyi/warehouse/service/impl/WarehouseStorageOrderServiceImpl.java

@ -3,6 +3,7 @@ package com.ruoyi.warehouse.service.impl;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.BusinessException;
@ -720,7 +721,7 @@ public class WarehouseStorageOrderServiceImpl implements IWarehouseStorageOrderS
inventoryInquiryDetailMapper.insertWarehouseInventoryInquiryDetail(inquiryDetail);
}
}
}else if(warehouseStorageType.equals("2")){//新增委内入库库存历史记录
}else if(warehouseStorageType.equals("5")){//新增生产入库库存历史记录
WarehouseInventoryInquiryDetail inquiryDetail = new WarehouseInventoryInquiryDetail();
inquiryDetail = createMakeInOrderInquiryDetail(warehouseStorageOrderDetail);
inquiryDetail.setInventoryHistoricalType("1");
@ -824,7 +825,7 @@ public class WarehouseStorageOrderServiceImpl implements IWarehouseStorageOrderS
return inquiryDetail;
}
//生成委内(委外)入库库存历史记录
//生成生产(委外)入库库存历史记录
public WarehouseInventoryInquiryDetail createMakeInOrderInquiryDetail(WarehouseStorageOrderDetail warehouseStorageOrderDetail){
WarehouseInventoryInquiryDetail inquiryDetail = new WarehouseInventoryInquiryDetail();
inquiryDetail.setMaterialNo(warehouseStorageOrderDetail.getMaterialNo());
@ -1351,20 +1352,18 @@ public class WarehouseStorageOrderServiceImpl implements IWarehouseStorageOrderS
@Override
public int updateStorageMake(WarehouseStorageOrder warehouseStorageOrder) {
String loginName = ShiroUtils.getLoginName();
String storageCode = warehouseStorageOrder.getWarehouseStorageCode();
WarehouseStorageOrder oldStorageOrder = warehouseStorageOrderMapper.selectStorageOrderByCode(storageCode);
//假设全部入库
warehouseStorageOrder.setWarehouseStorageStatus("4");
warehouseStorageOrder.setUpdateBy(loginName);
warehouseStorageOrder.setUpdateTime(DateUtils.getNowDate());
//记录一下入库时间
warehouseStorageOrder.setStorageTime(DateUtils.getNowDate());
oldStorageOrder.setStorageTime(DateUtils.getNowDate());
String warehouseCode = warehouseStorageOrder.getWarehouseCode();
String warehouseName = warehouseStorageOrder.getWarehouseName();
if (StringUtils.isNotEmpty(warehouseCode)){
warehouseStorageOrder.setWarehouseCode(warehouseCode);
oldStorageOrder.setWarehouseCode(warehouseCode);
}
if (StringUtils.isNotEmpty(warehouseName)){
warehouseStorageOrder.setWarehouseName(warehouseName);
oldStorageOrder.setWarehouseName(warehouseName);
}
List<WarehouseStorageOrderDetail> warehouseStorageOrderDetailList = warehouseStorageOrder.getWarehouseStorageOrderDetailList();
@ -1373,53 +1372,66 @@ public class WarehouseStorageOrderServiceImpl implements IWarehouseStorageOrderS
throw new BusinessException("入库单详情数据为空");
}
//入库数
Integer storageNum = 0;
// 检查storageNum是否含有null值
boolean hasThisStorageNumNull = warehouseStorageOrderDetailList.stream()
.anyMatch(item -> item.getStorageNum() == null);
if (hasThisStorageNumNull) {
throw new BusinessException("存在入库数为空,请检查!");
}
// 计算各个字段的总和
storageNum = warehouseStorageOrderDetailList.stream()
//插入主表入库数量
int orderStorageNum = Optional.ofNullable(oldStorageOrder.getStorageNum())
.orElse(0);
int storageSum = warehouseStorageOrderDetailList.stream()
.mapToInt(WarehouseStorageOrderDetail::getStorageNum)
.sum();
//插入主表入库数量
warehouseStorageOrder.setStorageNum(storageNum);
storageSum = storageSum + orderStorageNum;
warehouseStorageOrder.setStorageNum(storageSum);
warehouseStorageOrder.setWarehouseStorageStatus("3");//部分入库
//品质合格数和总入库数相等,全部入库
int qualifiedNum = oldStorageOrder.getQualityQualifiedNum();
if(storageSum == qualifiedNum){
warehouseStorageOrder.setWarehouseStorageStatus("4");//全部入库
}
//更新生产订单的数据
SysMakeOrder tempSysMakeOrder = sysMakeOrderMapper.selectMakeOrderByMakeNo(warehouseStorageOrder.getRelatedOrderCode());
tempSysMakeOrder.setEceiptNum(storageNum);
tempSysMakeOrder.setEceiptNum(storageSum);
//设置生产状态为全部完成
tempSysMakeOrder.setMakeStatus("6");
int updateMakeOrderResult = sysMakeOrderService.updateByMakeNo(tempSysMakeOrder);
if (updateMakeOrderResult <= 0){
throw new BusinessException("更新生产订单数据失败");
}
//更新销售订单数据
SysSalesOrder sysSalesOrder = salesOrderMapper.selectSysSalesOrderBySalesOrderCode(tempSysMakeOrder.getSaleNo());
//设置为全部完成
sysSalesOrder.setMakeStatus("6");
//设置为待出货
sysSalesOrder.setDeliveryStatus("2");
//设置为生产订单的完成状态
sysSalesOrder.setMakeStatus(tempSysMakeOrder.getMakeStatus());
int updateSalesOrderResult = salesOrderService.updateSysSalesOrderBySalesOrderCode(sysSalesOrder);
if (updateSalesOrderResult <= 0){
throw new BusinessException("更新销售订单数据失败");
}
for (WarehouseStorageOrderDetail storageOrderDetail : warehouseStorageOrderDetailList) {
//更新入库单详情的数据
storageOrderDetail.setUpdateBy(loginName);
storageOrderDetail.setUpdateTime(DateUtils.getNowDate());
//更新已入库数
int hasStorageNum = Optional.ofNullable(storageOrderDetail.getHasStorageNum())
.orElse(0);
hasStorageNum = hasStorageNum + storageOrderDetail.getStorageNum();
storageOrderDetail.setHasStorageNum(hasStorageNum);
int updateWarehouseStorageOrderDetailResult = storageOrderDetailMapper.updateWarehouseStorageOrderDetail(storageOrderDetail);
if (updateWarehouseStorageOrderDetailResult <= 0){
throw new BusinessException("更新仓库入库单详情失败,未影响任何行");
}
//更新库存查询
WarehouseStorageOrderDetail storageOrderInquiryDetail = storageOrderDetailMapper.selectWarehouseStorageOrderDetailById(storageOrderDetail.getWarehouseStorageDetailId());
int inquiryResult = createWarehouseInventoryInquiry(storageOrderInquiryDetail);
if (inquiryResult <= 0){
throw new BusinessException("更新仓库库存查询失败,未影响任何行");
}
}
//更新销售订单子表的数据
for (WarehouseStorageOrderDetail warehouseStorageOrderDetail : warehouseStorageOrderDetailList) {
SysSalesOrderChild sysSalesOrderChild = new SysSalesOrderChild();
sysSalesOrderChild.setQuoteId(tempSysMakeOrder.getSaleNo());
sysSalesOrderChild.setMaterialCode(warehouseStorageOrderDetail.getMaterialNo());
sysSalesOrderChild.setFinishNum(warehouseStorageOrderDetail.getStorageNum());
sysSalesOrderChild.setFinishNum(warehouseStorageOrderDetail.getHasStorageNum());
sysSalesOrderChild.setUpdateBy(loginName);
sysSalesOrderChild.setUpdateTime(DateUtils.getNowDate());
int updateSalesOrderChildResult = salesOrderChildMapper.updateSysSalesOrderChildByCodeAndQuoteId(sysSalesOrderChild);
@ -1427,33 +1439,12 @@ public class WarehouseStorageOrderServiceImpl implements IWarehouseStorageOrderS
throw new BusinessException("更新销售订单子表数据失败");
}
}
// //更新生产单数据
// int updateMakeOrderResult = sysMakeOrderService.updateSysMakeOrderByWarehouseStorageOrder(warehouseStorageOrder, warehouseStorageOrderDetailList);
// if (updateMakeOrderResult <= 0){
// throw new BusinessException("更新生产订单失败,未影响任何行");
// }
for (WarehouseStorageOrderDetail warehouseStorageOrderDetail : warehouseStorageOrderDetailList) {
//更新入库单详情的数据
warehouseStorageOrderDetail.setUpdateBy(loginName);
warehouseStorageOrderDetail.setUpdateTime(DateUtils.getNowDate());
//更新已入库数
warehouseStorageOrderDetail.setHasStorageNum(warehouseStorageOrderDetail.getStorageNum());
int updateWarehouseStorageOrderDetailResult = storageOrderDetailMapper.updateWarehouseStorageOrderDetail(warehouseStorageOrderDetail);
if (updateWarehouseStorageOrderDetailResult <= 0){
throw new BusinessException("更新仓库入库单详情失败,未影响任何行");
}
}
//更新入库单的数据
int updateResult = warehouseStorageOrderMapper.updateWarehouseStorageOrder(warehouseStorageOrder);
if (updateResult <= 0){
log.warn("更新入库单失败,未影响任何行");
throw new BusinessException("更新入库单数据失败,未影响任何行");
}
return updateResult;
}
/*

145
ruoyi-admin/src/main/resources/templates/warehouse/storageOrder/storageMake.html

@ -3,12 +3,11 @@
<head>
<th:block th:include="include :: header('入库-生产订单(生产入库)')" />
<th:block th:include="include :: datetimepicker-css" />
<th:block th:include="include :: bootstrap-editable-css" />
<style>
.supplier-value span {
margin-right: 10px;
}
</style>
</head>
<body class="white-bg">
@ -39,7 +38,7 @@
<label class="col-sm-4 control-label">到货时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="arrivedTime" th:value="${#dates.format(warehouseStorageOrder.arrivedTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text" readonly>
<input disabled name="arrivedTime" th:value="${#dates.format(warehouseStorageOrder.arrivedTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text" readonly>
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
@ -48,7 +47,7 @@
<label class="col-sm-4 control-label">交检时间:</label>
<div class="col-sm-8">
<div class="input-group date">
<input name="deliveryInspectionTime" th:value="${#dates.format(warehouseStorageOrder.deliveryInspectionTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
<input disabled name="deliveryInspectionTime" th:value="${#dates.format(warehouseStorageOrder.deliveryInspectionTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
<span class="input-group-addon"><i class="fa fa-calendar"></i></span>
</div>
</div>
@ -62,9 +61,9 @@
</div>
</div>
<div class="form-group">
<label class="col-sm-4 control-label">仓库名称:</label>
<label class="col-sm-4 control-label is-required">仓库名称:</label>
<div class="col-sm-8">
<input name="warehouseName" th:field="*{warehouseName}" class="form-control" type="text">
<input required name="warehouseName" th:field="*{warehouseName}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
@ -89,8 +88,10 @@
<th:block th:include="include :: bootstrap-table-editable-js" />
<script th:inline="javascript">
var warehouseStorageCode = [[${warehouseStorageOrder.warehouseStorageCode}]]
var warehouseCode = [[${warehouseStorageOrder.warehouseCode}]]
var warehouseStorageCode = [[${warehouseStorageOrder.warehouseStorageCode}]];
var warehouseCode = [[${warehouseStorageOrder.warehouseCode}]];
var processMethodDatas = [[${@dict.getType('processMethod')}]];
var materialTypeDatas = [[${@category.getChildByCode('materialType')}]];
var prefix = ctx + "warehouse/storageOrder";
$("#form-storageMakeIn-edit").validate({
focusCleanup: true
@ -104,6 +105,10 @@
obj[item.name] = item.value;
return obj;
}, {});
if(storageMakeInData.warehouseCode == null||storageMakeInData.warehouseCode == ''){
$.modal.msgError("仓库信息为空,请检查");
return;
}
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
var table = $('#bootstrap-table').bootstrapTable('getData');
@ -123,13 +128,22 @@
"makeTotal": item.makeTotal,
"qualityHasQualifiedNum": item.qualityHasQualifiedNum,
"hasStorageNum": item.hasStorageNum,
"makeStorageNum": item.makeStorageNum,
// "makeStorageNum": item.makeStorageNum,
"storageNum": item.storageNum,
"storageLocation": item.storageLocation,
// ...其他字段
};
});
if(materialDataList[0].storageNum == null||materialDataList[0].storageNum == ''||materialDataList[0].storageNum == 0){
$.modal.msgError("入库数为空,请检查");
return;
}
var storageNum = Number(materialDataList[0].storageNum) + Number(materialDataList[0].hasStorageNum);
if(storageNum > materialDataList[0].qualityHasQualifiedNum){
$.modal.msgError("总入库数超出品质合格数,请检查");
return;
}
const combinedData = Object.assign({}, storageMakeInData, {
warehouseStorageOrderDetailList: materialDataList,
});
@ -168,80 +182,143 @@
showToggle: false,
showColumns: false,
pagination: false, // 设置不分页
columns: [{
checkbox: true
},
columns: [
{
title: '入库单详情Id',
field: 'warehouseStorageDetailId',
visible: false
visible: false,
},
{
title: '料号',
field: 'materialNo'
}, {
field: 'materialNo',
align: 'center',
},
{
title: '物料名称',
align: 'center',
field: 'materialName'
},
{
title: '物料类型',
title: '类型',
align: 'center',
field: 'materialType',
formatter: function(value, row, index) {
return $.table.selectCategoryLabel(materialTypeDatas, value);
}
},
{
title: '物料图片地址',
title: '图片',
align: 'center',
field: 'materialPhotourl',
},
{
title: '物料描述',
title: '物料型号',
align: 'center',
field: 'materialModel',
},
{
title: '描述',
align: 'center',
field: 'materialDescribe',
},
{
title: '物料品牌',
title: '品牌',
align: 'center',
field: 'materialBrand',
},
{
title: '物料单位',
title: '单位',
align: 'center',
field: 'materialUnit',
},
{
title: '物料加工方式',
title: '加工方式',
align: 'center',
field: 'materialProcessMethod',
formatter: function(value, row, index) {
return $.table.selectDictLabel(processMethodDatas, value);
}
},
{
title: '生产订单数',
align: 'center',
field: 'makeTotal',
},
{
title: '品质已合格数',
align: 'center',
field: 'qualityHasQualifiedNum',
},
{
title: '已入库数',
align: 'center',
field: 'hasStorageNum',
},
{
title: '生产入库数',
field: 'makeStorageNum',
},
{
title: '入库数',
align: 'center',
field: 'storageNum',
editable: {
type: 'text',
mode:'inline',
validate: function (v) {
if (!v) return '数量不能为空';
if (isNaN(v)) return '数量必须是数字';
var processBadNum = parseInt(v);
if (processBadNum <= 0) return '数量必须是正整数';
validate: function(value) {
if ($.trim(value) === '') {
return '入库数不能为空';
}
if (isNaN(value)) {
return '请输入有效的数字';
}
if (value < 0) {
return '入库数不能小于0';
}
//不能为小数
if (value % 1 !== 0) {
return '入库数不能为小数';
}
},
},
formatter: function (value, row) {
// 检查 row 是否存在
if (!row) {
return "";
}
// 检查 storageNum 是否存在
if (row.storageNum === undefined || row.storageNum === null) {
return "";
}
// 根据 storageNum 的值决定返回值
if (row.storageNum) {
return row.storageNum;
} else {
return value;
}
}
},
{
title: '存放位置',
align: 'center',
field: 'storageLocation',
editable: true
editable: {
type: 'text',
mode:'inline',
},
formatter: function (value, row) {
// 检查 row 是否存在
if (!row) {
return "";
}
// 检查 storageLocation 是否存在
if (row.storageLocation === undefined || row.storageLocation === null) {
return "";
}
// 根据 storageLocation 的值决定返回值
if (row.storageLocation) {
return row.storageLocation;
} else {
return value;
}
}
}]
};
$.table.init(options);

Loading…
Cancel
Save