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

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

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

Loading…
Cancel
Save