fix: 库存预警修改

workplace
chenhc 10 months ago
parent ddb549c621
commit 204f95f610

@ -210,7 +210,7 @@ public class IoCollectOrder implements Serializable {
/** /**
* 1:; 2: * 1:; 2:3:
*/ */
@TableField(value = "invAlert") @TableField(value = "invAlert")
private Integer invAlert; private Integer invAlert;

@ -186,7 +186,7 @@ public class IoCollectOrderBiz implements Serializable {
/** /**
* *
*/ */
@TableField(value = "autoResCount") @TableField(value = "autoResCount")
@ApiModelProperty(value = "自动扫描分配的工位存量") @ApiModelProperty(value = "自动扫描分配的工位存量")

@ -148,6 +148,12 @@ public class IoCollectOrderResponse {
*/ */
private Integer orderSequence; private Integer orderSequence;
/**
* 1:; 2:3:
*/
@TableField(value = "invAlert")
private Integer invAlert;
public String getFromName() { public String getFromName() {
if (StrUtil.isNotEmpty(fromCorpName)) if (StrUtil.isNotEmpty(fromCorpName))

@ -297,13 +297,13 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC
saveBatch(collectOrderList); saveBatch(collectOrderList);
} }
Map<Long, SysWorkplaceResponse> sysWorkplaceMap = new HashMap<>(); // Map<Long, SysWorkplaceResponse> sysWorkplaceMap = new HashMap<>();
for (SysWorkplaceResponse sysWorkplace : allWorksList) { // for (SysWorkplaceResponse sysWorkplace : allWorksList) {
sysWorkplaceMap.put(sysWorkplace.getId(), sysWorkplace); // sysWorkplaceMap.put(sysWorkplace.getId(), sysWorkplace);
} // }
for (SysWorkplaceResponse value : sysWorkplaceMap.values()) { // for (SysWorkplaceResponse value : sysWorkplaceMap.values()) {
splitFifoCodeService.preAllotInv(value.getWorkplaceId()); // splitFifoCodeService.preAllotInv(value.getWorkplaceId());
} // }
} }
@ -401,13 +401,13 @@ public class IoCollectOrderService extends ServiceImpl<IoCollectOrderMapper, IoC
if (CollUtil.isNotEmpty(collectOrderList)) { if (CollUtil.isNotEmpty(collectOrderList)) {
saveBatch(collectOrderList); saveBatch(collectOrderList);
} }
Map<Long, SysWorkplaceResponse> sysWorkplaceMap = new HashMap<>(); // Map<Long, SysWorkplaceResponse> sysWorkplaceMap = new HashMap<>();
for (SysWorkplaceResponse sysWorkplace : allWorksList) { // for (SysWorkplaceResponse sysWorkplace : allWorksList) {
sysWorkplaceMap.put(sysWorkplace.getId(), sysWorkplace); // sysWorkplaceMap.put(sysWorkplace.getId(), sysWorkplace);
} // }
for (SysWorkplaceResponse value : sysWorkplaceMap.values()) { // for (SysWorkplaceResponse value : sysWorkplaceMap.values()) {
splitFifoCodeService.preAllotInv(value.getWorkplaceId()); // splitFifoCodeService.preAllotInv(value.getWorkplaceId());
} // }
} }

@ -9,19 +9,24 @@ import com.glxp.api.dao.auth.SysWorkplaceDao;
import com.glxp.api.dao.collect.IoCollectOrderBizMapper; import com.glxp.api.dao.collect.IoCollectOrderBizMapper;
import com.glxp.api.dao.collect.IoCollectOrderMapper; import com.glxp.api.dao.collect.IoCollectOrderMapper;
import com.glxp.api.dao.inout.IoSplitFifoCodeMapper; import com.glxp.api.dao.inout.IoSplitFifoCodeMapper;
import com.glxp.api.dao.inout.IoSplitFifoInvMapper;
import com.glxp.api.entity.auth.SysWorkplace; import com.glxp.api.entity.auth.SysWorkplace;
import com.glxp.api.entity.basic.UdiRelevanceEntity; import com.glxp.api.entity.basic.UdiRelevanceEntity;
import com.glxp.api.entity.inout.IoSplitFifoCodeEntity; import com.glxp.api.entity.inout.IoSplitFifoCodeEntity;
import com.glxp.api.entity.inout.IoSplitFifoInv;
import com.glxp.api.exception.JsonException; import com.glxp.api.exception.JsonException;
import com.glxp.api.req.collect.CollectOrderBizRequest; import com.glxp.api.req.collect.CollectOrderBizRequest;
import com.glxp.api.req.collect.CollectOrderRequest; import com.glxp.api.req.collect.CollectOrderRequest;
import com.glxp.api.req.dev.DeviceChangeOrderParam; import com.glxp.api.req.dev.DeviceChangeOrderParam;
import com.glxp.api.req.inout.IoSplitFifoCodeRequest; import com.glxp.api.req.inout.IoSplitFifoCodeRequest;
import com.glxp.api.req.inout.IoSplitFifoInvRequest;
import com.glxp.api.res.collect.CollectOrderBizResponse; import com.glxp.api.res.collect.CollectOrderBizResponse;
import com.glxp.api.res.collect.IoCollectOrderResponse; import com.glxp.api.res.collect.IoCollectOrderResponse;
import com.glxp.api.res.inout.IoSplitCodeResponse; import com.glxp.api.res.inout.IoSplitCodeResponse;
import com.glxp.api.res.inout.IoSplitInvResponse;
import com.glxp.api.service.auth.SysWorkplaceService; import com.glxp.api.service.auth.SysWorkplaceService;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -38,6 +43,8 @@ public class IoSplitFifoCodeService extends ServiceImpl<IoSplitFifoCodeMapper, I
@Resource @Resource
IoSplitFifoCodeMapper splitFifoCodeMapper; IoSplitFifoCodeMapper splitFifoCodeMapper;
@Resource @Resource
IoSplitFifoInvService splitFifoInvService;
@Resource
SysWorkplaceService sysWorkplaceService; SysWorkplaceService sysWorkplaceService;
@Resource @Resource
IoCollectOrderMapper collectOrderMapper; IoCollectOrderMapper collectOrderMapper;
@ -96,21 +103,28 @@ public class IoSplitFifoCodeService extends ServiceImpl<IoSplitFifoCodeMapper, I
final String[] msg = {"当前工位存量提醒:"}; final String[] msg = {"当前工位存量提醒:"};
SysWorkplace workplace = sysWorkplaceService.getWorkplace(workPlaceCode); SysWorkplace workplace = sysWorkplaceService.getWorkplace(workPlaceCode);
if (workplace == null) throw new JsonException("未找到匹配工位"); if (workplace == null) throw new JsonException("未找到匹配工位");
Integer invRemindNumber = workplace.getInvRemindNumber();
List<IoSplitCodeResponse> invReminds = splitFifoCodeMapper.findInvRemind(workPlaceCode); //获取工位下的库存
if (CollUtil.isEmpty(invReminds)) { IoSplitFifoInvRequest ioSplitFifoInvRequest = new IoSplitFifoInvRequest();
ioSplitFifoInvRequest.setWorkPlaceCode(workPlaceCode);
List<IoSplitInvResponse> ioSplitInvResponses = splitFifoInvService.filterList(ioSplitFifoInvRequest);
if (CollUtil.isEmpty(ioSplitInvResponses)) {
return "当前工位存量提醒:" + "0"; return "当前工位存量提醒:" + "0";
} }
invReminds.forEach(item -> { ioSplitInvResponses.forEach(item -> {
Integer groupCount = item.getGroupCount(); Boolean enableRemind = item.getEnableRemind();
if (groupCount < invRemindNumber) { if (enableRemind){
String cpmctymc = item.getCpmctymc(); Integer reCount = item.getReCount();
String batchNo = item.getBatchNo(); Integer invRemindCount = item.getInvRemindCount();
if (StrUtil.isBlank(batchNo)) { if (reCount < invRemindCount) {
msg[0] = msg[0] + cpmctymc + "存量为:" + groupCount; String cpmctymc = item.getCpmctymc();
} else { String batchNo = item.getBatchNo();
msg[0] = msg[0] + cpmctymc + "[" + batchNo + "]存量为:" + groupCount; if (StrUtil.isBlank(batchNo)) {
msg[0] = msg[0] + cpmctymc + "存量为:" + reCount;
} else {
msg[0] = msg[0] + cpmctymc + "[" + batchNo + "]存量为:" + reCount;
}
} }
} }
}); });
@ -120,50 +134,156 @@ public class IoSplitFifoCodeService extends ServiceImpl<IoSplitFifoCodeMapper, I
/** /**
* *
* lockType 1 2
* 1 true
* 2 false
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void preAllotInv(Long workPaceCode) { public boolean lockInventoryByOrder(String billNo,Integer lockType){
if (workPaceCode == null || workPaceCode == 0l) return;
//1. 查询出当前工位的未分配的库存 if (StrUtil.isEmpty(billNo)) throw new JsonException("单据号不可以为空!");
IoSplitFifoCodeRequest splitFifoCodeRequest = new IoSplitFifoCodeRequest();
splitFifoCodeRequest.setWorkPlaceCode(workPaceCode);
List<IoSplitCodeResponse> ioSplitCodeResponses = this.baseMapper.filterGroupList(splitFifoCodeRequest);
if (CollUtil.isEmpty(ioSplitCodeResponses)) return;
Map<Long, List<IoSplitCodeResponse>> splitMap = ioSplitCodeResponses.stream().collect(Collectors.groupingBy(IoSplitCodeResponse::getRelId));
//2.遍历当前工位待处理的单据根据orderTime排序 //1、获取该单据信息
CollectOrderRequest collectOrderRequest = new CollectOrderRequest(); CollectOrderRequest collectOrderRequest = new CollectOrderRequest();
collectOrderRequest.setWorkPlaceCode(workPaceCode); collectOrderRequest.setBillNo(billNo);
collectOrderRequest.setTagStatus(1);
List<IoCollectOrderResponse> orderList = collectOrderMapper.filterList(collectOrderRequest); List<IoCollectOrderResponse> orderList = collectOrderMapper.filterList(collectOrderRequest);
if (CollUtil.isEmpty(orderList)) return; if (CollUtil.isEmpty(orderList)) throw new JsonException("未找到对应的单据!");
IoCollectOrderResponse order = orderList.get(0);
//3.为每个单据底下的单据详情分配数量 Integer invAlert1 = order.getInvAlert();
for (int i = 0; i < orderList.size(); i++) {
IoCollectOrderResponse order = orderList.get(i); if (lockType == 1){
CollectOrderBizRequest bizRequest = new CollectOrderBizRequest(); if (invAlert1 == 1) throw new JsonException("该单据已锁定库存过请勿重复锁定!");
bizRequest.setOrderIdFk(String.valueOf(order.getBillNo())); }else if (lockType == 2){
List<CollectOrderBizResponse> bizList = collectOrderBizMapper.filterList(bizRequest); if (invAlert1 != 1) throw new JsonException("该单据未正常锁定库存过不可进行解锁库存操作!");
if (CollUtil.isNotEmpty(bizList)) { }
//2、获取该单据下的biz明细
CollectOrderBizRequest bizRequest = new CollectOrderBizRequest();
bizRequest.setOrderIdFk(String.valueOf(order.getBillNo()));
List<CollectOrderBizResponse> bizList = collectOrderBizMapper.filterList(bizRequest);
if (CollUtil.isEmpty(bizList)) throw new JsonException("未找到对应的单据明细!");
//3、获取当前工位的下库存数
Long workPlaceCode = order.getWorkPlaceCode();
IoSplitFifoInvRequest ioSplitFifoInvRequest = new IoSplitFifoInvRequest();
ioSplitFifoInvRequest.setWorkPlaceCode(workPlaceCode);
List<IoSplitInvResponse> ioSplitInvResponses = splitFifoInvService.filterList(ioSplitFifoInvRequest);
if (CollUtil.isEmpty(ioSplitInvResponses)) return false;
Map<Long, List<IoSplitInvResponse>> splitInvMap = ioSplitInvResponses.stream().collect(Collectors.groupingBy(IoSplitInvResponse::getRelId));
if (CollUtil.isNotEmpty(bizList)) {
if (lockType == 1){
//自动分配 工位存量、更新splitMap、更新 bizList上的 缺少存量数 //自动分配 工位存量、更新splitMap、更新 bizList上的 缺少存量数
Integer invAlert = autoAllocationWorkPace(splitMap, bizList); Integer invAlert = autoAllocationBillNoInv(splitInvMap, bizList);
collectOrderMapper.updateInvAlert(order.getId(), invAlert); collectOrderMapper.updateInvAlert(order.getId(), invAlert);
if (invAlert == 2){
return false;
}else {
return true;
}
}else if (lockType == 2){
unAutoAllocationBillNoInv(splitInvMap, bizList);
collectOrderMapper.updateInvAlert(order.getId(), 3);
} }
} }
return true;
} }
/**
* splitMap bizList // /**
* // * 预分配库存
* @param splitMap // */
* @param bizList // @Transactional(rollbackFor = Exception.class)
*/ // public void preAllotInv(Long workPaceCode) {
// if (workPaceCode == null || workPaceCode == 0l) return;
//
// //1. 查询出当前工位的未分配的库存
// IoSplitFifoCodeRequest splitFifoCodeRequest = new IoSplitFifoCodeRequest();
// splitFifoCodeRequest.setWorkPlaceCode(workPaceCode);
// List<IoSplitCodeResponse> ioSplitCodeResponses = this.baseMapper.filterGroupList(splitFifoCodeRequest);
// if (CollUtil.isEmpty(ioSplitCodeResponses)) return;
// Map<Long, List<IoSplitCodeResponse>> splitMap = ioSplitCodeResponses.stream().collect(Collectors.groupingBy(IoSplitCodeResponse::getRelId));
//
// //2.遍历当前工位待处理的单据根据orderTime排序
// CollectOrderRequest collectOrderRequest = new CollectOrderRequest();
// collectOrderRequest.setWorkPlaceCode(workPaceCode);
// collectOrderRequest.setTagStatus(1);
// List<IoCollectOrderResponse> orderList = collectOrderMapper.filterList(collectOrderRequest);
// if (CollUtil.isEmpty(orderList)) return;
//
// //3.为每个单据底下的单据详情分配数量
// for (int i = 0; i < orderList.size(); i++) {
// IoCollectOrderResponse order = orderList.get(i);
// CollectOrderBizRequest bizRequest = new CollectOrderBizRequest();
// bizRequest.setOrderIdFk(String.valueOf(order.getBillNo()));
// List<CollectOrderBizResponse> bizList = collectOrderBizMapper.filterList(bizRequest);
// if (CollUtil.isNotEmpty(bizList)) {
// //自动分配 工位存量、更新splitMap、更新 bizList上的 缺少存量数
// Integer invAlert = autoAllocationWorkPace(splitMap, bizList);
// collectOrderMapper.updateInvAlert(order.getId(), invAlert);
// }
// }
//
// }
// /**
// * 自动分配 工位存量、更新splitMap、更新 bizList上的 缺少存量数
// *
// * @param splitMap
// * @param bizList
// */
// @Transactional(rollbackFor = Exception.class)
// Integer autoAllocationWorkPace(Map<Long, List<IoSplitCodeResponse>> splitMap, List<CollectOrderBizResponse> bizList) {
// Integer invAlert = 1;
// for (int i = 0; i < bizList.size(); i++) {
// CollectOrderBizResponse collectOrderBizResponse = bizList.get(i);
// Long relId = collectOrderBizResponse.getRelId();
// String batchNo = collectOrderBizResponse.getBatchNo();
// Integer count = collectOrderBizResponse.getCount(); //当前明细 需要的数量
// Long bizId = collectOrderBizResponse.getId();
//
// List<IoSplitCodeResponse> ioSplitCodeResponses = splitMap.get(relId);
// List<IoSplitCodeResponse> newioSplitCodeResponses = new ArrayList<>(ioSplitCodeResponses.size());
//
// if (CollUtil.isNotEmpty(ioSplitCodeResponses)) {
// for (int j = 0; j < ioSplitCodeResponses.size(); j++) {
// IoSplitCodeResponse ioSplit = ioSplitCodeResponses.get(j);
// Integer totalCount = ioSplit.getTotalCount();
// if ((StrUtil.isBlank(batchNo) || batchNo.equals(ioSplit.getBatchNo())) && count > 0 && totalCount > 0) {
// Integer resCount = totalCount - count;//预分配后剩余 工位存量
// if (resCount >= 0) {//足够分配
// count = 0;
// ioSplit.setTotalCount(resCount);
// } else {//不够分配
// count = -resCount;
// ioSplit.setTotalCount(0);
// }
// }
// newioSplitCodeResponses.add(ioSplit);
// }
//
// splitMap.put(relId, newioSplitCodeResponses);
// }
//
// if (count > 0) {//不够分配
// collectOrderBizMapper.updateAutoResCount(bizId, -count);
// invAlert = 2;
// } else {
// collectOrderBizMapper.updateAutoResCount(bizId, collectOrderBizResponse.getCount());
// }
// }
//
// return invAlert;
// }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
Integer autoAllocationWorkPace(Map<Long, List<IoSplitCodeResponse>> splitMap, List<CollectOrderBizResponse> bizList) { Integer autoAllocationBillNoInv(Map<Long, List<IoSplitInvResponse>> splitMap, List<CollectOrderBizResponse> bizList) {
Integer invAlert = 1; Integer invAlert = 1;
List<IoSplitFifoInv> updateIoSplitFifoInv = new ArrayList<>();
for (int i = 0; i < bizList.size(); i++) { for (int i = 0; i < bizList.size(); i++) {
CollectOrderBizResponse collectOrderBizResponse = bizList.get(i); CollectOrderBizResponse collectOrderBizResponse = bizList.get(i);
Long relId = collectOrderBizResponse.getRelId(); Long relId = collectOrderBizResponse.getRelId();
@ -171,26 +291,30 @@ public class IoSplitFifoCodeService extends ServiceImpl<IoSplitFifoCodeMapper, I
Integer count = collectOrderBizResponse.getCount(); //当前明细 需要的数量 Integer count = collectOrderBizResponse.getCount(); //当前明细 需要的数量
Long bizId = collectOrderBizResponse.getId(); Long bizId = collectOrderBizResponse.getId();
List<IoSplitCodeResponse> ioSplitCodeResponses = splitMap.get(relId); List<IoSplitInvResponse> ioSplitInvResponses = splitMap.get(relId);
List<IoSplitCodeResponse> newioSplitCodeResponses = new ArrayList<>(ioSplitCodeResponses.size()); List<IoSplitInvResponse> newioSplitCodeResponses = new ArrayList<>(ioSplitInvResponses.size());
if (CollUtil.isNotEmpty(newioSplitCodeResponses)) {
for (int j = 0; j < newioSplitCodeResponses.size(); j++) {
IoSplitInvResponse ioSplit = newioSplitCodeResponses.get(j);
Integer reCount = ioSplit.getReCount();
Integer lockCount = ioSplit.getLockCount();
Integer totalCount = reCount-lockCount;//剩余可分配数量
if (CollUtil.isNotEmpty(ioSplitCodeResponses)) {
for (int j = 0; j < ioSplitCodeResponses.size(); j++) {
IoSplitCodeResponse ioSplit = ioSplitCodeResponses.get(j);
Integer totalCount = ioSplit.getTotalCount();
if ((StrUtil.isBlank(batchNo) || batchNo.equals(ioSplit.getBatchNo())) && count > 0 && totalCount > 0) { if ((StrUtil.isBlank(batchNo) || batchNo.equals(ioSplit.getBatchNo())) && count > 0 && totalCount > 0) {
Integer resCount = totalCount - count;//预分配后剩余 工位存量 Integer resCount = totalCount - count;//预分配后剩余 工位存量
if (resCount >= 0) {//足够分配 if (resCount >= 0) {//足够分配
count = 0; count = 0;
ioSplit.setTotalCount(resCount); ioSplit.setLockCount( lockCount + count );
IoSplitFifoInv bean = new IoSplitFifoInv();
BeanUtils.copyProperties(ioSplit,bean);
updateIoSplitFifoInv.add(bean);
} else {//不够分配 } else {//不够分配
count = -resCount; count = -resCount;
ioSplit.setTotalCount(0);
} }
} }
newioSplitCodeResponses.add(ioSplit); newioSplitCodeResponses.add(ioSplit);
} }
splitMap.put(relId, newioSplitCodeResponses); splitMap.put(relId, newioSplitCodeResponses);
} }
@ -202,7 +326,49 @@ public class IoSplitFifoCodeService extends ServiceImpl<IoSplitFifoCodeMapper, I
} }
} }
if (CollUtil.isNotEmpty(updateIoSplitFifoInv)){
splitFifoInvService.updateBatchById(updateIoSplitFifoInv);
}
return invAlert; return invAlert;
} }
@Transactional(rollbackFor = Exception.class)
void unAutoAllocationBillNoInv(Map<Long, List<IoSplitInvResponse>> splitMap, List<CollectOrderBizResponse> bizList) {
List<IoSplitFifoInv> updateIoSplitFifoInv = new ArrayList<>();
for (int i = 0; i < bizList.size(); i++) {
CollectOrderBizResponse collectOrderBizResponse = bizList.get(i);
Long relId = collectOrderBizResponse.getRelId();
String batchNo = collectOrderBizResponse.getBatchNo();
Integer count = collectOrderBizResponse.getCount(); //当前明细 需要的数量
Long bizId = collectOrderBizResponse.getId();
List<IoSplitInvResponse> ioSplitInvResponses = splitMap.get(relId);
List<IoSplitInvResponse> newioSplitCodeResponses = new ArrayList<>(ioSplitInvResponses.size());
if (CollUtil.isNotEmpty(newioSplitCodeResponses)) {
for (int j = 0; j < newioSplitCodeResponses.size(); j++) {
IoSplitInvResponse ioSplit = newioSplitCodeResponses.get(j);
Integer lockCount = ioSplit.getLockCount();
if ((StrUtil.isBlank(batchNo) || batchNo.equals(ioSplit.getBatchNo())) && count > 0 ) {
ioSplit.setLockCount( lockCount - count );
IoSplitFifoInv bean = new IoSplitFifoInv();
BeanUtils.copyProperties(ioSplit,bean);
updateIoSplitFifoInv.add(bean);
}
newioSplitCodeResponses.add(ioSplit);
}
splitMap.put(relId, newioSplitCodeResponses);
}
collectOrderBizMapper.updateAutoResCount(bizId, 0);
}
if (CollUtil.isNotEmpty(updateIoSplitFifoInv)){
splitFifoInvService.updateBatchById(updateIoSplitFifoInv);
}
}
} }

@ -18,6 +18,7 @@
ico.updateUser, ico.updateUser,
ico.tagStatus, ico.tagStatus,
ico.splitStatus, ico.splitStatus,
ico.invAlert,
ico.splitMsg ico.splitMsg
, ,
ico.tagMsg, ico.tagMsg,

Loading…
Cancel
Save