fix(inventory): 优化库存管理和出库流程
- 修复 SN 码解析逻辑,增加数字校验 - 更新出库管理界面,优化排序和状态显示 - 优化订单执行跟踪界面,调整排序方式 - 优化项目订单审批流程,重构审批回调逻辑dev_1.0.0
parent
53ccb630d5
commit
0656894960
|
|
@ -593,7 +593,6 @@ function initWarehouseTable(data) {
|
||||||
|
|
||||||
|
|
||||||
function onEditableSave(field, row, rowIndex, oldValue, $el) {
|
function onEditableSave(field, row, rowIndex, oldValue, $el) {
|
||||||
|
|
||||||
if (!row['defaultWarehouse'] && row[field] > row['availableCount']) {
|
if (!row['defaultWarehouse'] && row[field] > row['availableCount']) {
|
||||||
$.modal.msgError("库存不足")
|
$.modal.msgError("库存不足")
|
||||||
row[field] = oldValue
|
row[field] = oldValue
|
||||||
|
|
@ -605,8 +604,8 @@ function initWarehouseTable(data) {
|
||||||
totalConfirmQuantity += Number(item.confirmQuantity || 0)
|
totalConfirmQuantity += Number(item.confirmQuantity || 0)
|
||||||
});
|
});
|
||||||
let generateNumber = $('#out-generatedQuantity').text();
|
let generateNumber = $('#out-generatedQuantity').text();
|
||||||
totalConfirmQuantity += Number(generateNumber)
|
let allTotal=totalConfirmQuantity + Number(generateNumber)
|
||||||
if (totalConfirmQuantity > Number($('#out-quantity').text())) {
|
if (allTotal > Number($('#out-quantity').text())) {
|
||||||
$.modal.msgError("本次提交出库数量不能大于应出库数量")
|
$.modal.msgError("本次提交出库数量不能大于应出库数量")
|
||||||
row[field] = oldValue
|
row[field] = oldValue
|
||||||
return;
|
return;
|
||||||
|
|
@ -626,7 +625,7 @@ function initWarehouseTable(data) {
|
||||||
$('#outer-model').val(model)
|
$('#outer-model').val(model)
|
||||||
$('#outer-vendorName').val(vendorName)
|
$('#outer-vendorName').val(vendorName)
|
||||||
$('#out-quantity').text(quantity)
|
$('#out-quantity').text(quantity)
|
||||||
$('#out-generatedQuantity').text(generatedQuantity)
|
$('#out-generatedQuantity').text(Number(generatedQuantity)+Number(confirmQuantity))
|
||||||
$('#deliveryTime').val(getNowDate());
|
$('#deliveryTime').val(getNowDate());
|
||||||
$('#deliveryTime').attr('disabled', true);
|
$('#deliveryTime').attr('disabled', true);
|
||||||
parent.$('.layui-layer-btn').css('display', 'none')
|
parent.$('.layui-layer-btn').css('display', 'none')
|
||||||
|
|
@ -702,6 +701,7 @@ function initWarehouseTable(data) {
|
||||||
var options = {
|
var options = {
|
||||||
id: "outer-table",
|
id: "outer-table",
|
||||||
data: data ?? [[${inventoryOuterList}]],
|
data: data ?? [[${inventoryOuterList}]],
|
||||||
|
sidePagination: "client",
|
||||||
showSearch: false,
|
showSearch: false,
|
||||||
showRefresh: false,
|
showRefresh: false,
|
||||||
showToggle: false,
|
showToggle: false,
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input id="uploadInput" type="file" accept=".xls,.xlsx,.zip,.rar" style="display: none">
|
<input id="uploadInput" type="file" accept=".zip,.rar" style="display: none">
|
||||||
<input type="hidden" id="orderId">
|
<input type="hidden" id="orderId">
|
||||||
<input type="hidden" id="versionCode">
|
<input type="hidden" id="versionCode">
|
||||||
<div class="col-sm-12 select-table table-striped">
|
<div class="col-sm-12 select-table table-striped">
|
||||||
|
|
@ -229,8 +229,8 @@
|
||||||
removeUrl: prefix + "/remove",
|
removeUrl: prefix + "/remove",
|
||||||
exportUrl: prefix + "/export",
|
exportUrl: prefix + "/export",
|
||||||
modalName: "订单执行跟踪",
|
modalName: "订单执行跟踪",
|
||||||
sortName:'outerStatus',
|
sortName:'approveTime',
|
||||||
sortOrder: 'asc',
|
sortOrder: 'desc',
|
||||||
fixedColumns: true,
|
fixedColumns: true,
|
||||||
fixedRightNumber: 1,
|
fixedRightNumber: 1,
|
||||||
columns: [{
|
columns: [{
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,16 @@
|
||||||
field: 'availableCount',
|
field: 'availableCount',
|
||||||
title: '实时库存',
|
title: '实时库存',
|
||||||
formatter: function (value, row, index) {
|
formatter: function (value, row, index) {
|
||||||
return value ??0;
|
let showValue= value ??0;
|
||||||
|
let showHtml=''
|
||||||
|
if (value>200){
|
||||||
|
showHtml= `<span style="color: #1ab394">${showValue}</span>`
|
||||||
|
}else if (value<=0){
|
||||||
|
showHtml= `<span style="color: red">${showValue}</span>`
|
||||||
|
}else{
|
||||||
|
showHtml= `<span style="color: #f59a4d">${showValue}</span>`
|
||||||
|
}
|
||||||
|
return showHtml;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -71,10 +71,6 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
field: 'warehouseName',
|
|
||||||
title: '出库仓'
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
field: 'createByName',
|
field: 'createByName',
|
||||||
title: '经办人'
|
title: '经办人'
|
||||||
|
|
|
||||||
|
|
@ -203,7 +203,6 @@
|
||||||
// 解析SN码,分离前缀和数字部分
|
// 解析SN码,分离前缀和数字部分
|
||||||
let snPrefix = "";
|
let snPrefix = "";
|
||||||
let snNumber = "";
|
let snNumber = "";
|
||||||
debugger
|
|
||||||
// 从字符串末尾开始查找数字部分
|
// 从字符串末尾开始查找数字部分
|
||||||
for (let i = productSn.length - 1; i >= 0; i--) {
|
for (let i = productSn.length - 1; i >= 0; i--) {
|
||||||
if (!isNaN(productSn[i]) && productSn[i] !== ' ') {
|
if (!isNaN(productSn[i]) && productSn[i] !== ' ') {
|
||||||
|
|
@ -214,6 +213,10 @@ debugger
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let snNumberLength = snNumber.length;
|
let snNumberLength = snNumber.length;
|
||||||
|
if (snNumberLength === 0) {
|
||||||
|
$.modal.msgError("SN码最后一位必须为数字,否则无法按顺序计算对应SN码");
|
||||||
|
return;
|
||||||
|
}
|
||||||
let startNumber = parseInt(snNumber);
|
let startNumber = parseInt(snNumber);
|
||||||
|
|
||||||
// 计算当前SN码的数字部分
|
// 计算当前SN码的数字部分
|
||||||
|
|
@ -275,6 +278,10 @@ debugger
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let snNumberLength = snNumber.length;
|
let snNumberLength = snNumber.length;
|
||||||
|
if (snNumberLength === 0) {
|
||||||
|
$.modal.msgError("SN码最后一位必须为数字,否则无法按顺序计算对应SN码");
|
||||||
|
return;
|
||||||
|
}
|
||||||
let startNumber = parseInt(snNumber);
|
let startNumber = parseInt(snNumber);
|
||||||
for (let i = 0; i <quantity; i++) {
|
for (let i = 0; i <quantity; i++) {
|
||||||
// 计算当前SN码的数字部分
|
// 计算当前SN码的数字部分
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,8 @@
|
||||||
removeUrl: prefix + "/remove",
|
removeUrl: prefix + "/remove",
|
||||||
exportUrl: prefix + "/export",
|
exportUrl: prefix + "/export",
|
||||||
modalName: "发货管理",
|
modalName: "发货管理",
|
||||||
|
sortName:'t1.createTime',
|
||||||
|
sortOrder:'desc',
|
||||||
columns: [{
|
columns: [{
|
||||||
title: '序号',
|
title: '序号',
|
||||||
formatter: function (value, row, index) {
|
formatter: function (value, row, index) {
|
||||||
|
|
@ -140,7 +142,7 @@
|
||||||
function received(id) {
|
function received(id) {
|
||||||
$.modal.confirm("确认要确认接收吗?", function () {
|
$.modal.confirm("确认要确认接收吗?", function () {
|
||||||
$.operate.post(prefix + "/status", {"id": id, "outerStatus": '3'},()=>{
|
$.operate.post(prefix + "/status", {"id": id, "outerStatus": '3'},()=>{
|
||||||
// $.table.search()
|
// $.table.refresh()
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -148,7 +150,7 @@
|
||||||
function refundable(id) {
|
function refundable(id) {
|
||||||
$.modal.confirm("确认要确认退回吗?", function () {
|
$.modal.confirm("确认要确认退回吗?", function () {
|
||||||
$.operate.post(prefix + "/status", {"id": id, "outerStatus": '4'},()=>{
|
$.operate.post(prefix + "/status", {"id": id, "outerStatus": '4'},()=>{
|
||||||
// $.table.search()
|
// $.table.refresh()
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@ public class ExecutionTrackServiceImpl implements IExecutionTrackService {
|
||||||
inventoryOuter.setProductCodeList(productCodeList);
|
inventoryOuter.setProductCodeList(productCodeList);
|
||||||
|
|
||||||
List<InventoryOuter> inventoryOuters = outerService.selectInventoryOuterList(inventoryOuter);
|
List<InventoryOuter> inventoryOuters = outerService.selectInventoryOuterList(inventoryOuter);
|
||||||
vo.setInventoryOuterList(inventoryOuters);
|
vo.setInventoryOuterList(inventoryOuters.stream().sorted(Comparator.comparing(InventoryOuter::getCreateTime).reversed()).collect(Collectors.toList()));
|
||||||
// 根据出库单状态设置generatedQuantity和confirmQuantity
|
// 根据出库单状态设置generatedQuantity和confirmQuantity
|
||||||
if (inventoryOuters != null && !inventoryOuters.isEmpty()) {
|
if (inventoryOuters != null && !inventoryOuters.isEmpty()) {
|
||||||
Map<String, List<InventoryOuter>> outersByProductCode = inventoryOuters.stream()
|
Map<String, List<InventoryOuter>> outersByProductCode = inventoryOuters.stream()
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
|
||||||
item.setInnerCode(omsInventoryInner.getInnerCode());
|
item.setInnerCode(omsInventoryInner.getInnerCode());
|
||||||
item.setCreateBy(currentUserId);
|
item.setCreateBy(currentUserId);
|
||||||
item.setCreateTime(nowDate);
|
item.setCreateTime(nowDate);
|
||||||
|
item.setInventoryStatus(InventoryInfo.InventoryStatusEnum.INNER.getCode());
|
||||||
});
|
});
|
||||||
//校验sn是否重复
|
//校验sn是否重复
|
||||||
List<String> repeatSnList = inventoryInfoService.checkUnq(inventoryInfoList.stream().map(InventoryInfo::getProductSn).collect(Collectors.toList()));
|
List<String> repeatSnList = inventoryInfoService.checkUnq(inventoryInfoList.stream().map(InventoryInfo::getProductSn).collect(Collectors.toList()));
|
||||||
|
|
@ -199,9 +200,9 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
List<ProductInfo> productInfos = productInfoService.selectProductInfoByCodeList(Collections.singletonList(productCode));
|
||||||
OmsInventoryInner omsInventoryInner = new OmsInventoryInner();
|
OmsInventoryInner omsInventoryInner = new OmsInventoryInner();
|
||||||
omsInventoryInner.setVendorCode(inventoryAuthService.currentVendor().get(0).getVendorCode());
|
omsInventoryInner.setVendorCode(productInfos.get(0).getVendorCode());
|
||||||
omsInventoryInner.setProductCode(productCode);
|
omsInventoryInner.setProductCode(productCode);
|
||||||
omsInventoryInner.setWarehouseId(warehouseInfoList.get(0).getId());
|
omsInventoryInner.setWarehouseId(warehouseInfoList.get(0).getId());
|
||||||
omsInventoryInner.setInventoryInfoList(inventoryInfoList);
|
omsInventoryInner.setInventoryInfoList(inventoryInfoList);
|
||||||
|
|
|
||||||
|
|
@ -1008,46 +1008,101 @@ public class ProjectOrderInfoServiceImpl implements IProjectOrderInfoService, To
|
||||||
@Override
|
@Override
|
||||||
|
|
||||||
public boolean todoApproveCallback(Todo todo) {
|
public boolean todoApproveCallback(Todo todo) {
|
||||||
if (CollUtil.isNotEmpty(todo.getVariables())) {
|
if (CollUtil.isEmpty(todo.getVariables())) {
|
||||||
|
return TodoCommonTemplate.super.todoApproveCallback(todo);
|
||||||
|
}
|
||||||
|
|
||||||
Integer approveBtn = (Integer) todo.getVariables().get("approveBtn");
|
Integer approveBtn = (Integer) todo.getVariables().get("approveBtn");
|
||||||
if (approveBtn != null && approveBtn.equals(0)) {
|
if (approveBtn == null) {
|
||||||
//审批驳回 修改状态
|
return TodoCommonTemplate.super.todoApproveCallback(todo);
|
||||||
|
}
|
||||||
|
|
||||||
|
String taskName = todo.getTaskName();
|
||||||
|
String businessKey = todo.getBusinessKey();
|
||||||
|
|
||||||
|
// 审批驳回处理
|
||||||
|
if (approveBtn.equals(0)) {
|
||||||
|
handleRejectOrder(taskName, businessKey);
|
||||||
|
} else if (approveBtn.equals(1)) {
|
||||||
|
// 审批通过处理
|
||||||
|
if ("产品经理".equals(taskName)) {
|
||||||
|
handleProductManagerApproval(businessKey);
|
||||||
|
} else if ("公司领导".equals(taskName)) {
|
||||||
|
handleCompanyLeaderApproval(businessKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TodoCommonTemplate.super.todoApproveCallback(todo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理订单驳回
|
||||||
|
*/
|
||||||
|
private void handleRejectOrder(String taskName, String businessKey) {
|
||||||
ProjectOrderInfo projectOrderInfo = new ProjectOrderInfo();
|
ProjectOrderInfo projectOrderInfo = new ProjectOrderInfo();
|
||||||
projectOrderInfo.setOrderStatus(ProjectOrderInfo.OrderStatus.APPROVE_REJECT.getCode());
|
projectOrderInfo.setOrderStatus(ProjectOrderInfo.OrderStatus.APPROVE_REJECT.getCode());
|
||||||
projectOrderInfo.setOrderCode(todo.getBusinessKey());
|
projectOrderInfo.setOrderCode(businessKey);
|
||||||
if ("公司领导".equals(todo.getTaskName())) {
|
|
||||||
|
if ("公司领导".equals(taskName)) {
|
||||||
projectOrderInfo.setVersionCode("add");
|
projectOrderInfo.setVersionCode("add");
|
||||||
}
|
}
|
||||||
|
|
||||||
projectOrderInfoMapper.updateProjectOrderInfoByCode(projectOrderInfo);
|
projectOrderInfoMapper.updateProjectOrderInfoByCode(projectOrderInfo);
|
||||||
}
|
}
|
||||||
if ("公司领导".equals(todo.getTaskName()) && approveBtn.equals(1)) {
|
|
||||||
ProjectOrderInfo dbProjectOrderInfo = projectOrderInfoMapper.selectProjectOrderInfoByCode(todo.getBusinessKey());
|
/**
|
||||||
|
* 处理产品经理审批通过
|
||||||
|
*/
|
||||||
|
private void handleProductManagerApproval(String businessKey) {
|
||||||
|
ProjectOrderInfo dbProjectOrderInfo = projectOrderInfoMapper.selectProjectOrderInfoByCode(businessKey);
|
||||||
|
|
||||||
|
// 查询商务和代理商邮箱
|
||||||
|
List<String> emailList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 查询商务邮箱
|
||||||
|
List<SysUser> sysUsers = userService.listByRoleId(businessRoleId);
|
||||||
|
emailList.addAll(sysUsers.stream()
|
||||||
|
.map(SysUser::getEmail)
|
||||||
|
.filter(StringUtils::isNotEmpty)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
|
||||||
|
// 查询代理商邮箱
|
||||||
|
List<PartnerInfo> partnerInfos = partnerInfoService.listByOrderCode(Collections.singletonList(dbProjectOrderInfo.getOrderCode()));
|
||||||
|
emailList.addAll(partnerInfos.stream()
|
||||||
|
.map(PartnerInfo::getContactEmail)
|
||||||
|
.filter(StringUtils::isNotEmpty)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
|
|
||||||
|
// 发送邮件
|
||||||
|
this.sendPartnerMail(emailList.stream().distinct().collect(Collectors.toList()), dbProjectOrderInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理公司领导审批通过
|
||||||
|
*/
|
||||||
|
private void handleCompanyLeaderApproval(String businessKey) {
|
||||||
|
ProjectOrderInfo dbProjectOrderInfo = projectOrderInfoMapper.selectProjectOrderInfoByCode(businessKey);
|
||||||
|
|
||||||
ProjectOrderInfo projectOrderInfo = new ProjectOrderInfo();
|
ProjectOrderInfo projectOrderInfo = new ProjectOrderInfo();
|
||||||
projectOrderInfo.setOrderStatus(ProjectOrderInfo.OrderStatus.APPROVE_COMPLETE.getCode());
|
projectOrderInfo.setOrderStatus(ProjectOrderInfo.OrderStatus.APPROVE_COMPLETE.getCode());
|
||||||
projectOrderInfo.setApproveTime(DateUtils.getNowDate());
|
projectOrderInfo.setApproveTime(DateUtils.getNowDate());
|
||||||
//修改执行单时间 只有直签且有现金折扣的时间才是配置时间 否则默认30天
|
|
||||||
|
// 修改执行单时间 只有直签且有现金折扣的时间才是配置时间 否则默认30天
|
||||||
int addHour = ProjectOrderInfo.ProcessTemplateEnum.DIRECT_SIGNING.getCode().equals(dbProjectOrderInfo.getProcessTemplate())
|
int addHour = ProjectOrderInfo.ProcessTemplateEnum.DIRECT_SIGNING.getCode().equals(dbProjectOrderInfo.getProcessTemplate())
|
||||||
&& dbProjectOrderInfo.getDiscountFold() != null && dbProjectOrderInfo.getDiscountFold().compareTo(BigDecimal.ONE) < 0 ? endHour : 30;
|
&& dbProjectOrderInfo.getDiscountFold() != null
|
||||||
|
&& dbProjectOrderInfo.getDiscountFold().compareTo(BigDecimal.ONE) < 0 ? endHour : 30;
|
||||||
|
|
||||||
projectOrderInfo.setOrderEndTime(DateUtils.addHours(DateUtils.getNowDate(), addHour));
|
projectOrderInfo.setOrderEndTime(DateUtils.addHours(DateUtils.getNowDate(), addHour));
|
||||||
projectOrderInfo.setOrderCode(todo.getBusinessKey());
|
projectOrderInfo.setOrderCode(businessKey);
|
||||||
|
|
||||||
projectOrderInfoMapper.updateProjectOrderInfoByCode(projectOrderInfo);
|
projectOrderInfoMapper.updateProjectOrderInfoByCode(projectOrderInfo);
|
||||||
projectOrderInfoMapper.bakData(projectOrderInfo);
|
projectOrderInfoMapper.bakData(projectOrderInfo);
|
||||||
//修改产品数据
|
|
||||||
// projectInfo
|
|
||||||
if (dbProjectOrderInfo.getDiscountFold().compareTo(BigDecimal.ONE) != 0) {
|
|
||||||
|
|
||||||
|
// 修改产品数据
|
||||||
|
if (dbProjectOrderInfo.getDiscountFold().compareTo(BigDecimal.ONE) != 0) {
|
||||||
productInfoService.calcByDiscountFold(dbProjectOrderInfo.getDiscountFold(), dbProjectOrderInfo.getProjectId());
|
productInfoService.calcByDiscountFold(dbProjectOrderInfo.getDiscountFold(), dbProjectOrderInfo.getProjectId());
|
||||||
}
|
}
|
||||||
//查询商务
|
|
||||||
List<SysUser> sysUsers = userService.listByRoleId(businessRoleId);
|
|
||||||
List<String> emailList = sysUsers.stream().map(SysUser::getEmail).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
|
|
||||||
//查询代理商
|
|
||||||
List<PartnerInfo> partnerInfos = partnerInfoService.listByOrderCode(Collections.singletonList(dbProjectOrderInfo.getOrderCode()));
|
|
||||||
emailList.addAll(partnerInfos.stream().map(PartnerInfo::getContactEmail).filter(StringUtils::isNotEmpty).collect(Collectors.toList()));
|
|
||||||
this.sendPartnerMail(emailList.stream().distinct().collect(Collectors.toList()), dbProjectOrderInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TodoCommonTemplate.super.todoApproveCallback(todo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue