Commit b6cfa5f8 zshaohui

1.增加过期时间

2.看板和报表修改
1 个父辈 2d97e6be
正在显示 28 个修改的文件 包含 342 行增加48 行删除
......@@ -28,4 +28,6 @@ public interface IBarcodeManager extends IBaseManager<Barcode> {
List<Barcode> findByPosName(String barcodeStr);
List<Barcode> findByQuery(Query query, Pageable pageable);
int countByQuery(Query query);
}
......@@ -195,6 +195,11 @@ public class BarcodeManagerImpl implements IBarcodeManager {
return barcodeDao.findByQuery(query,pageable);
}
@Override
public int countByQuery(Query query) {
return barcodeDao.countByQuery(query);
}
protected boolean validateComponent(Barcode barcode) {
return componentManager.findOneByPN(barcode.getPartNumber()) != null;
}
......
......@@ -180,12 +180,13 @@ public class CodeResolve {
}
//判断是否为空
if (barcodeFromRule.getProduceDate() != null) {
barcode.setProduceDate(barcodeFromRule.getProduceDate());
/*barcode.setProduceDate(barcodeFromRule.getProduceDate());
ExpiredSetting expiredSetting = expiredSettingManager.getExpiredSettingByProvider(barcodeFromRule.getProvider());
if (expiredSetting != null) {
barcode.setExpireDate(cn.hutool.core.date.DateUtil.offsetMonth(barcodeFromRule.getProduceDate(),expiredSetting.getMonth()));
needUpdate = true;
}
}*/
barcode.setExpireDate(cn.hutool.core.date.DateUtil.offsetMonth(barcodeFromRule.getProduceDate(),12));
}
if(needUpdate){
......@@ -271,7 +272,7 @@ public class CodeResolve {
codeBeanFromRule.setShowImg(component.getShowImg());
Date produceDate = barcodeFromRule.getProduceDate();
if(produceDate != null && barcodeFromRule.getExpireDate() == null){
if(produceDate != null /*&& barcodeFromRule.getExpireDate() == null*/){
/*int validDay = component.getValidDay();
if( validDay > 0){
log.info("设置"+barcodeFromRule.getBarcode()+"的过期时间");
......@@ -279,10 +280,11 @@ public class CodeResolve {
barcodeFromRule.setExpireDate(expireDate);
barcodeManager.save(barcodeFromRule);
}*/
ExpiredSetting expiredSetting = expiredSettingManager.getExpiredSettingByProvider(barcodeFromRule.getProvider());
/*ExpiredSetting expiredSetting = expiredSettingManager.getExpiredSettingByProvider(barcodeFromRule.getProvider());
if (expiredSetting != null){
barcodeFromRule.setExpireDate(cn.hutool.core.date.DateUtil.offsetMonth(barcodeFromRule.getProduceDate(),expiredSetting.getMonth()));
}
}*/
barcodeFromRule.setExpireDate(cn.hutool.core.date.DateUtil.offsetMonth(barcodeFromRule.getProduceDate(),12));
}
......
......@@ -425,6 +425,12 @@ public class NLShelfHandler extends BaseDeviceHandler {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码",new String[]{code});
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
throw new ValidateException("smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
Barcode barcodeApi = lizhenApi.barcodeInfo(barcode);
if (barcodeApi != null){
barcode = barcodeApi;
......
......@@ -203,7 +203,11 @@ public class DeviceController {
dataCache.updateInventory(storagePos, barcode);
}
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
throw new ValidateException("smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
Barcode barcodeCanPutIn = smfApi.canPutInAfterResolve(barcode);
if (barcodeCanPutIn != null){
barcode = barcodeCanPutIn;
......
......@@ -376,7 +376,7 @@ public class DataCache {
/**
* 出库时清除使用库位列表
*/
private void removeUsedPosNameList(String cid, String posName){
public void removeUsedPosNameList(String cid, String posName){
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.remove(posName);
usedPosNameMap.put(cid, usedPosNameList);
......@@ -385,7 +385,7 @@ public class DataCache {
/**
* 入库时增加使用库位列表
*/
private void addUsedPosNameList(String cid, String posName){
public void addUsedPosNameList(String cid, String posName){
List<String> usedPosNameList = getUsedPosNameList(cid);
usedPosNameList.add(posName);
usedPosNameMap.put(cid, usedPosNameList);
......
......@@ -33,6 +33,7 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.sun.org.apache.regexp.internal.RE;
import lombok.extern.slf4j.Slf4j;
......@@ -75,6 +76,9 @@ public class LiteOrderCache {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private LizhenApi lizhenApi;
/**
* 正在执行的liteOrderMap, key 为orderNo,value 为order
*/
......@@ -382,6 +386,7 @@ public class LiteOrderCache {
if (order.getFinishedReelCount() >= order.getTaskReelCount()) {
log.info("工单[" + orderNo + "]的出库任务已完成,共出库:" + order.getFinishedReelCount() + " 盘");
order.setFinishDate(new Date());
finishedOrderTasks(order);
}
liteOrderManager.save(order);
......@@ -815,6 +820,11 @@ public class LiteOrderCache {
}
}
//设置工单点击时间
cacheOrder.setStartDate(new Date());
liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
//料仓信息
List<String> availableStorageIds = new ArrayList<>();
//String virtualId = "";
......@@ -836,6 +846,10 @@ public class LiteOrderCache {
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
//提取所有的partNumber,获取所有的库位
List<String> partNumberList = cacheOrder.getOrderItems().stream().map(item -> item.getPn()).collect(Collectors.toList());
List<StoragePos> allStoragePosList = storagePosManager.findStoragePosByPartNumber(partNumberList);
List<StoragePos> needOutPoss = new ArrayList<>();
int orderTaskReelCount = 0;
//开始循环处理工单详情
......@@ -884,10 +898,11 @@ public class LiteOrderCache {
if (pos == null){
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,true);
}*/
StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,true);
/*StoragePos pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,true);
if (pos == null){
pos = storagePosManager.findPartNumberInStorages(availableStorageIds, pn, excludeIds, checkoutType, warehouseCode, brand,false);
}
}*/
StoragePos pos = getStoragePosByPartNumberAndBrand(allStoragePosList,pn,excludeIds);
log.info("查询库位时间结束");
if (pos == null) {
log.info(orderItem.getOrderId() + "厂商:" + warehouseCode + ",供应商:" + brand + ",料号:" + pn + "未找到存在库位,跳过");
......@@ -899,6 +914,15 @@ public class LiteOrderCache {
//进行排序
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).collect(Collectors.toList());
subCodeList = subCodeList.stream().sorted(Comparator.comparing(Barcode::getAmount)).collect(Collectors.toList());
//调用批量禁用料接口
List<String> batchCheckList = new ArrayList<>();
try {
batchCheckList = lizhenApi.batchCheck(subCodeList);
}catch (Exception e){
e.printStackTrace();
}
List<String> subCodeIds = new ArrayList<>();
for (Barcode subCode : subCodeList) {
if (outReelCount >= orderItem.getNeedReelCount() && outNumCount >= orderItem.getNeedNum()) {
......@@ -907,6 +931,11 @@ public class LiteOrderCache {
if (subCode.isOut()) {
continue;
}
if (batchCheckList != null && !batchCheckList.isEmpty()) {
if (batchCheckList.contains(subCode.getBarcode())) {
log.info("禁用料:" + subCode.getBarcode() + "跳过");
}
}
//判断厂别
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(subCode.getWarehouseCode())) {
......@@ -926,13 +955,13 @@ public class LiteOrderCache {
}
}
//校验是否为禁用料
try {
/*try {
smfApi.canPutInAfterResolve(subCode);
} catch (ValidateException e) {
e.printStackTrace();
log.info(subCode.getBarcode() + "为禁用料,校验失败:" + e.getMessage());
continue;
}
}*/
subCode.setOut(true);
subCode.setOrderItemId(orderItem.getId());
barcode.UpdateSubCode(subCode);
......@@ -1001,6 +1030,7 @@ public class LiteOrderCache {
//cacheOrder.setIsExcess(isExcess);
cacheOrder.setTaskReelCount(orderTaskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount() + orderTaskReelCount);
cacheOrder.setEndDate(new Date());
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + orderTaskReelCount + "]");
smfApi.onOrderStatusChange(cacheOrder);
//有需要出库的
......@@ -1093,4 +1123,50 @@ public class LiteOrderCache {
public synchronized Collection<LiteOrder> getAllLiteOrder() {
return liteOrderMap.values();
}
public StoragePos getStoragePosByPartNumberAndBrand(List<StoragePos> allStoragePosList, String partNumber, List<String> excludeIdList) {
StoragePos storagePos = null;
//先找到符合partNumber数据
List<StoragePos> storagePosList = allStoragePosList.stream().filter(item -> {
if (excludeIdList != null && !excludeIdList.isEmpty()) {
if (excludeIdList.contains(item.getId())) {
return false;
}
}
List<Barcode> subCodeList = item.getBarcode().getSubCodeList();
for (Barcode barcode : subCodeList) {
if (barcode.getPartNumber().equals(partNumber)) {
return true;
}
}
return false;
}).collect(Collectors.toList());
//找到符合条件的partNumber
List<Barcode> barcodeList = new ArrayList<>();
for (StoragePos pos : storagePosList) {
for (Barcode barcode : pos.getBarcode().getSubCodeList()) {
if (barcode.getPartNumber().equals(partNumber)) {
barcodeList.add(barcode);
}
}
}
//按排序找到最早入库的partNumber
if (barcodeList != null && !barcodeList.isEmpty()) {
List<String> posNameList = barcodeList.stream().sorted(Comparator.comparing(Barcode::getCreateDate)).map(item -> item.getPosName()).distinct().collect(Collectors.toList());
for (String posName : posNameList) {
for (StoragePos pos : storagePosList) {
if (StringUtils.isNotBlank(posName)) {
if (posName.startsWith(pos.getBarcode().getBarcode())) {
return pos;
}
}
}
}
}
return storagePos;
}
}
......@@ -98,4 +98,16 @@ public class OrderDto implements Serializable {
@ApiModelProperty("是否超发")
private boolean isExcess = false;
@ApiModelProperty("工单开始时间")
private Date startDate;
@ApiModelProperty("工单结束时间")
private Date endDate;
@ApiModelProperty("工单完成时间")
private Date finishDate;
}
......@@ -135,6 +135,23 @@ public class LiteOrder extends BasePo implements Serializable {
private boolean confirmExcess = false;
/**
* 工单开始时间
*/
private Date startDate;
/**
* 工单结束时间
*/
private Date endDate;
/**
* 工单完成时间
*/
private Date finishDate;
public void setClosed(boolean value){
this.closed=value;
if(value){
......
......@@ -117,6 +117,9 @@ public class StoragePosController {
if (!storage.isVirtual()){
StoragePosDtos.get(i).setNeedPermissionPassword(true);
}
if (StoragePosDtos.get(i).isEnabled()){
StoragePosDtos.get(i).setMsg("");
}
}
}
return new PageData(StoragePosDtos, pages.getTotalElements());
......@@ -252,6 +255,7 @@ public class StoragePosController {
// throw new ValidateException("未找到库位 ");
}
pos.setEnabled(enabledDto.isEnabled());
pos.setMsg("");
storagePosManager.save(pos);
log.info("启用禁用库位:库位号[" + pos.getId() + "][" + pos.getPosName() + "]=" + enabledDto.isEnabled());
DeviceMessageUtil.addEnabledPosMessage(pos,SecurityUtils.getCurrentUsername());
......@@ -286,6 +290,8 @@ public class StoragePosController {
DeviceMessageUtil.addEnabledPosMessage(pos,SecurityUtils.getCurrentUsername());
}
storagePosManager.save(pos);
Storage storage = dataCache.getStorageById(pos.getStorageId());
dataCache.reloadStorage(storage, storage.getCid());
log.info("修改库位:库位号[" + pos.getId() + "]=[" + saveDto.toString() + "]"+enabledStr);
return new ResponseEntity<>(HttpStatus.OK);
}
......
......@@ -87,4 +87,7 @@ public class StoragePosDto implements Serializable {
@ApiModelProperty("来源")
public String source;
@ApiModelProperty("禁用信息")
private String msg;
}
......@@ -86,4 +86,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos getPosNameByPnAndStrId(String partNumber,String storageId);
int countByQuery(Query query);
List<StoragePos> findStoragePosByPartNumber(List<String> partNumberList);
}
......@@ -813,4 +813,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public int countByQuery(Query query) {
return storagePosDao.countByQuery(query);
}
@Override
public List<StoragePos> findStoragePosByPartNumber(List<String> partNumberList) {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true).and("barcode.subCodeList.partNumber").in(partNumberList);//可用;
return storagePosDao.findByQuery(new Query(c));
}
}
......@@ -338,6 +338,11 @@ public class DataLog extends BasePo implements Serializable {
*/
private String box = "";
/**
* 盘点批次
*/
private String inventoryBatch;
public String getBarcode() {
if(barcode == null){
return "";
......
package com.neotel.smfcore.custom.lizhen;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
......@@ -60,6 +61,9 @@ public class LizhenApi extends DefaultSmfApiListener {
@Value("${api.outNotifyUrlPK}")
private String outNotifyUrlPK = "";
@Value("${api.batchCheckUrl}")
private String batchCheckUrl = "";
@PostConstruct
public void init(){
......@@ -69,6 +73,7 @@ public class LizhenApi extends DefaultSmfApiListener {
barcodeInfoUrl = dataCache.getConfigCache("barcodeInfoUrl",barcodeInfoUrl);
werks = dataCache.getConfigCache("werks",werks);
outNotifyUrlPK = dataCache.getConfigCache("api.outNotifyUrlPK",outNotifyUrlPK);
batchCheckUrl = dataCache.getConfigCache("api.batchCheckUrl",batchCheckUrl);
}
/**
......@@ -500,6 +505,47 @@ public class LizhenApi extends DefaultSmfApiListener {
return null;
}
/**
* 批量禁用
*
* @param barcodeList
* @return
*/
public List<String> batchCheck(List<Barcode> barcodeList) {
List<String> resultList = new ArrayList<>();
List<Map<String, Object>> paramList = new ArrayList<>();
for (Barcode barcode : barcodeList) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ipn", barcode.getPartNumber());
paramMap.put("reelId", barcode.getBarcode());
paramMap.put("wo", "");
paramMap.put("datecode", barcode.getDateCode());
paramMap.put("lot", barcode.getBatch());
paramMap.put("vendor", barcode.getProvider());
paramMap.put("remark", "");
paramList.add(paramMap);
}
String paramStr = JSON.toJSONString(paramList);
log.info("批量禁用料,入参为:" + paramStr);
try {
String result = HttpHelper.postJson(batchCheckUrl, paramStr);
log.info("批量禁用料,出参为:" + result);
JSONObject jsonObject = JSON.parseObject(result);
if (jsonObject.getInteger("status") == 200) {
JSONArray data = jsonObject.getJSONArray("data");
if (data != null && !data.isEmpty()) {
for (int i = 0; i < data.size(); i++) {
JSONObject item = data.getJSONObject(i);
resultList.add(item.getString("reelNo"));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return resultList;
}
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("Lizhen");
......
......@@ -20,6 +20,7 @@ import com.neotel.smfcore.core.system.websocket.SocketMsg;
import com.neotel.smfcore.core.system.websocket.WebSocketServer;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.Station;
import com.neotel.smfcore.custom.lizhen.agvBox.util.StationCacheUtil;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -426,8 +427,8 @@ public class AgvBoxDeviceClientController {
Collection<DataLog> queueTasks = taskService.getAllTasks();
if (queueTasks != null && !queueTasks.isEmpty()) {
for (DataLog queueTask : queueTasks) {
if (results != null && !results.isEmpty()){
if (results.size() >= 8){
if (results != null && !results.isEmpty()) {
if (results.size() >= 8) {
break;
}
}
......@@ -435,11 +436,15 @@ public class AgvBoxDeviceClientController {
if (StringUtils.isNotBlank(queueTask.getLoc())) {
results.add(queueTask.getBarcode() + "需要出库到工位:" + queueTask.getLoc());
} else {
if (queueTask.getExtendType() == ExtendType.INVENTORY_CHECKOUT) {
results.add(queueTask.getBarcode() + "需要盘点");
} else {
results.add(queueTask.getBarcode() + "需要出库");
}
}
}
}
}
return ResultBean.newOkResult(results);
}
......@@ -457,6 +462,7 @@ public class AgvBoxDeviceClientController {
barcode.setInOpor("");
barcode.setCheckOutDate(null, "");
barcode.setPosName(opTask.getPosName());
storagePos.setBarcode(barcode);
dataCache.updateInventory(storagePos, barcode);
//需要更新料箱中物料的库存
List<Barcode> subCodes = barcode.getSubCodeList();
......
......@@ -309,6 +309,7 @@ public class InventoryController {
dataLog.setType(OP.CHECKOUT);
dataLog.setCreator(SecurityUtils.getCurrentUsername());
dataLog.setExtendType(ExtendType.INVENTORY_CHECKOUT); //盘点出库
dataLog.setInventoryBatch(dataCache.getCache(INVENTORY_DATA));
try {
taskService.addTaskToExecute(dataLog);
} catch (Exception e) {
......@@ -590,6 +591,7 @@ public class InventoryController {
task.setOperator(SecurityUtils.getCurrentUsername());
task.setExtendType(extendType);
task.setBoxPosName(pos.getPosName());
task.setInventoryBatch(dataCache.getCache(INVENTORY_DATA));
taskService.addTaskToExecute(task);
}
......
......@@ -226,6 +226,22 @@ public class OutLineController {
return ResultBean.newErrorResult(-2, "", e.getMessage());
}
}
//判断物料是否过期
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
return ResultBean.newErrorResult(-1,"smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
//获取mes数量
Barcode barcodeInfo = lizhenApi.barcodeInfo(barcode);
if (barcodeInfo != null){
......@@ -814,6 +830,9 @@ public class OutLineController {
taskService.addBoxPosName(task);
log.info("虚拟仓出库,已有出库任务,直接完成:" + task.getBarcode());
task.setStatus(OP_STATUS.FINISHED.name());
if (task.getExtendType() == -1){
task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
}
//task.setExtendType(ExtendType.VIRTUAL_CHECKOUT);
taskService.moveTaskToFinished(task);
taskService.updateFinishedTask(task);
......@@ -1153,6 +1172,7 @@ public class OutLineController {
task.setKeeperCode(barcode.getKeeperCode());
task.setReelPosName(barcode.getPosName());
task.setExtendType(extendType);
task.setWarehouseCode(barcode.getWarehouseCode());
taskService.updateFinishedTask(task);
return "";
}
......@@ -1166,6 +1186,7 @@ public class OutLineController {
task.setOperator(SecurityUtils.getCurrentUsername());
task.setBoxPosName(pos.getPosName());
task.setExtendType(extendType);
task.setWarehouseCode(barcode.getWarehouseCode());
taskService.addTaskToExecute(task);
return task;
}
......
......@@ -180,6 +180,16 @@ public class TaskRestController {
return ResultBean.newOkResult("");
}
/**
* 初始化,刷新过期时间
*/
/* @PostConstruct
public void flushExpireData() {
List<StoragePos> storagePosList = storagePosManager.findNotEmpty();
if (storagePosList != null && !storagePosList.isEmpty()) {
}
}*/
}
......@@ -397,6 +397,21 @@ public class WarehouseController {
label.setRemainingAmount(remainingAmount - barcode.getAmount());
grLabelManager.save(label);
}
//判断物料是否过期
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.expired", "物料已过期,无法入库.");
}
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
return ResultBean.newErrorResult(-1,"smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
//获取mes数量
Barcode barcodeInfo = lizhenApi.barcodeInfo(barcode);
if (barcodeInfo != null){
......@@ -406,7 +421,7 @@ public class WarehouseController {
int reelCurrentNum = station.getReelCurrentNum();
station.setReelCurrentNum(reelCurrentNum + 1);
Date date = new Date();
barcode.setPutInDate(new Date());
//barcode.setPutInDate(new Date());
barcode.setPutInTime(date.getTime());
resultBean = finishTask(boxStr, OP.PUT_IN, barcode, OP_STATUS.FINISHED.name(), INOUT_TYPE.IN_ONE.name(), lastScanBoxCode, grLabelStr,name);
}
......
......@@ -122,6 +122,13 @@ public class VirtualRestController {
if (StringUtils.isBlank(posName)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"库位"});
}
//校验是否可以入库
Map<String, Object> brandQty = lizhenApi.brandQty(barcode.getPartNumber(), barcode.getProvider());
if (brandQty == null || brandQty.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.partNumber.invalid", "{0}不是有效的料号", new String[]{barcode.getPartNumber()});
}
Barcode barcodeInfo = lizhenApi.barcodeInfo(barcode);
if (barcodeInfo != null){
barcode = barcodeInfo;
......
......@@ -13,7 +13,9 @@ import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.kanban.common.KanbanUtils;
import com.neotel.smfcore.custom.lizhen.kanban.common.bean.dto.InOutDataDto;
import com.neotel.smfcore.custom.lizhen.kanban.inner.bean.dto.DevicesStatusDto;
......@@ -46,6 +48,9 @@ public class InnerKanbanController {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private TaskService taskService;
public static final Map<String,Long> expireMap = Maps.newConcurrentMap();
/**
......@@ -89,6 +94,8 @@ public class InnerKanbanController {
dto.setTotalNeedCount(getLackPickingCount(0, line));
//统计已发数量
dto.setTotalOutCount(getLackPickingCount(-1, line));
//待出数量
dto.setReadyOutCount(dto.getTotalNeedCount() - dto.getTotalOutCount());
resultList.add(dto);
}
return ResultBean.newOkResult(resultList);
......@@ -185,13 +192,17 @@ public class InnerKanbanController {
*/
@RequestMapping("/getExpireInfo")
@AnonymousAccess
public ResultBean getExpireInfo() {
public ResultBean getExpireInfo() throws ParseException {
Long lastSaveTime = expireMap.get("lastSaveTime");
if (lastSaveTime == null || System.currentTimeMillis() - lastSaveTime >= 1000 * 60 * 60) {
expireMap.put("zeroToServen", 0l);
expireMap.put("servenToThirty", 0l);
expireMap.put("expire", 0l);
Query query = new Query().addCriteria(Criteria.where("barcode").exists(true).and("barcode.expireDate").lte(new Date()));
//当前时间减30天
Date startDate = DateUtil.addDays(new Date(), -30);
String startDateStr = DateUtil.toDateString(startDate, "yyyy-MM-dd");
startDate = DateUtil.toDate(startDateStr, "yyyy-MM-dd");
Query query = new Query().addCriteria(Criteria.where("barcode").exists(true).and("barcode.expireDate").lte(startDate));
List<StoragePos> storagePosList = storagePosManager.findByQuery(query);
long zeroToServen = storagePosList.stream().filter(item -> {
Barcode barcode = item.getBarcode();
......@@ -211,9 +222,15 @@ public class InnerKanbanController {
}
return false;
}).count();
List<Criteria> orCriList = new ArrayList<>();
orCriList.add(Criteria.where("barcode").exists(true).and("barcode.expireDate").gt(new Date()));
orCriList.add(Criteria.where("barcode").exists(true).and("barcode.expireDate").exists(false));
int noExpire = storagePosManager.countByQuery(new Query(new Criteria().orOperator(orCriList)));
expireMap.put("noExpire", (long) noExpire);
expireMap.put("zeroToServen", zeroToServen);
expireMap.put("servenToThirty", servenToThirty);
expireMap.put("expire", storagePosList == null ? 0l : (long)storagePosList.size() );
expireMap.put("expire", storagePosList == null ? 0l : storagePosList.size());
expireMap.put("lastSaveTime", System.currentTimeMillis());
}
return ResultBean.newOkResult(expireMap);
......@@ -239,5 +256,16 @@ public class InnerKanbanController {
c.andOperator(Criteria.where("updateDate").gte(currentDate), Criteria.where("updateDate").lt(DateUtil.addDays(currentDate, 1)));
return liteOrderItemManager.countByQuery(q.addCriteria(c));
}
private int getReadyOutCount(String line) {
int count = 0;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (line.equals(task.getLine())){
count ++;
}
}
return count;
}
}
......@@ -21,4 +21,9 @@ public class LackPickingDto {
* 已经出库的数量
*/
private int totalOutCount;
/**
* 待出数量
*/
private int readyOutCount;
}
......@@ -90,7 +90,7 @@ public class OuterKanbanController {
for (int i = 1; i < 6; i++) {
StationInOutDto dto = new StationInOutDto();
String stationName = "s" + i;
dto.setName(stationName);
dto.setName(stationName.toUpperCase(Locale.ROOT));
int inCount = dataLogManager.getInOutData(currentDate, endDate, OP.PUT_IN, stationName);
dto.setInCount(inCount);
int outCount = dataLogManager.getInOutData(currentDate, endDate, OP.CHECKOUT, stationName);
......@@ -179,6 +179,7 @@ public class OuterKanbanController {
expireMap.put("zeroToServen", 0l);
expireMap.put("servenToThirty", 0l);
expireMap.put("expire", 0l);
expireMap.put("noExpire", 0l);
Query query = new Query().addCriteria(Criteria.where("posName").exists(true).ne("").and("expireDate").lt(new Date()));
List<Barcode> barcodeList = barcodeManager.findByQuery(query);
long zeroToServen = barcodeList.stream().filter(item -> {
......@@ -197,6 +198,11 @@ public class OuterKanbanController {
}
return false;
}).count();
List<Criteria> orCriList = new ArrayList<>();
orCriList.add(Criteria.where("expireDate").gt(new Date()).and("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("CS", "CM", "CB")));
orCriList.add(Criteria.where("expireDate").exists(false).and("posName").exists(true).ne("").and("partNumber").nin(Arrays.asList("CS", "CM", "CB")));
int noExpire = barcodeManager.countByQuery(new Query(new Criteria().orOperator(orCriList)));
expireMap.put("noExpire", (long) noExpire);
expireMap.put("zeroToServen", zeroToServen);
expireMap.put("servenToThirty", servenToThirty);
expireMap.put("expire", barcodeList == null ? 0l : (long) barcodeList.size());
......
......@@ -82,7 +82,6 @@ public class AgvStatusCache {
locList.addAll(getLocByType(2));
locCnList.addAll(getLocCnByType(2));
}
int type = 1;
for (AgvInfo agvInfo : agvInfoCacheList) {
String loc = agvInfo.getLoc();
if (StringUtils.isNotBlank(Location.getLoc(loc))) {
......@@ -92,8 +91,6 @@ public class AgvStatusCache {
}
agvInfo.setLocList(locList);
agvInfo.setLocCnList(locCnList);
agvInfo.setType(type);
type ++;
}
return ResultBean.newOkResult(agvInfoCacheList);
}
......
......@@ -7,12 +7,12 @@ public enum Location {
//外仓点位
WAREHOUSE("仓库", 2),
TAKE("取料点", 2),
PUT("放料点", 2),
//内外仓,通用点位
STANDBY("待机点", 0),
CHARGE("充电点", 0);
CHARGE("充电点", 0),
TAKE("取料点", 0);
private String loc;
private int type;
......
......@@ -441,6 +441,8 @@ public class OuterReportController {
resultMap.put("异动数量", getData(dataLog.getNum()));
resultMap.put("储位", getData(dataLog.getStoragePosName()));
resultMap.put("异动类型", getData(dataLog.getChangeType()));
resultMap.put("PK ID", getData(dataLog.getOrderNo()));
resultMap.put("盘点批次", getData(dataLog.getInventoryBatch()));
resultMap.put("箱号", getData(dataLog.getBox()));
resultMap.put("ID NO", getData(dataLog.getBarcode()));
resultMap.put("LOT", getData(dataLog.getBatchInfo()));
......
......@@ -6,20 +6,22 @@ import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.Locale;
@Slf4j
public class ExpireDateUtil {
public static Date getExpireDate(String dateStr, String vendor) {
try {
vendor = vendor.toUpperCase(Locale.ROOT);
switch (vendor) {
case "UMT":
return getWWYYDate(dateStr);
case "AT&S":
return getWWYYDate(dateStr);
case "Compeq":
case "COMPEQ":
return getWWYYDate(dateStr);
case "Avary":
case "AVARY":
return getWWYYDate(dateStr);
case "AKMMV":
return getWWYYDate(dateStr);
......@@ -27,15 +29,15 @@ public class ExpireDateUtil {
return getYYYYMMDDDate(dateStr);
case "SUNWAY":
return getYYMMDDDate(dateStr);
case "Fujikura":
case "FUJIKURA":
return getYYWWDate(dateStr);
case "CCTC":
return getWWYYDate(dateStr);
case "Jones":
case "JONES":
return getYYMMDDDate(dateStr);
case "Marian":
case "MARIAN":
return getYYMMDDDate(dateStr);
case "Murata":
case "MURATA":
return getYYWWDate(dateStr);
case "JAE":
return getYYMMDate(dateStr);
......@@ -47,7 +49,7 @@ public class ExpireDateUtil {
return getYYMMDDDate(dateStr);
case "TRIUMPH/LY":
return getYYYYMMDDDate(dateStr);
case "Everwin":
case "EVERWIN":
return getYYMMDDDate(dateStr);
case "INTERPLEX":
return getYYMMDDDate(dateStr);
......@@ -55,21 +57,21 @@ public class ExpireDateUtil {
return getYYYYMMDDDate(dateStr);
case "YAGEO":
return getYYYYMMDDDate(dateStr);
case "Sony":
case "SONY":
return getYYYYMMDDDate(dateStr);
case "Kioxia":
case "KIOXIA":
return getYYYYMMDDDate(dateStr);
case "Taiyo":
case "TAIYO":
return getYYMMDate(dateStr);
case "Hynix":
case "HYNIX":
return getYWWDate(dateStr);
case "Amkor":
case "AMKOR":
return getYWWDDate(dateStr);
case "Qualcomm":
case "QUALCOMM":
return getYYWWDate(dateStr);
case "Skyworks ":
case "SKYWORKS ":
return getYYWWDate(dateStr);
case "Qorvo":
case "QORVO":
return getYYWWDate(dateStr);
case "LG":
return getYYWWDate(dateStr);
......@@ -79,13 +81,13 @@ public class ExpireDateUtil {
return getYYWWDate(dateStr);
case "JSCK":
return getYYWWDate(dateStr);
case "Kyocera":
case "KYOCERA":
return getYYWWDate(dateStr);
case "TDK":
return getYYWWDate(dateStr);
case "INFINEON":
return getYYWWDate(dateStr);
case "Epson":
case "EPSON":
return getYYWWDate(dateStr);
case "TXC":
return getYYWWDate(dateStr);
......@@ -99,29 +101,29 @@ public class ExpireDateUtil {
return getYYWWDate(dateStr);
case "NXP":
return getYYWWDate(dateStr);
case "Cirrus":
case "CIRRUS":
return getYYWWDate(dateStr);
case "ADI":
return getYYWWDate(dateStr);
case "Broadcom ":
case "BROADCOM ":
return getYYWWDate(dateStr);
case "ST":
return getYYWWDate(dateStr);
case "Bosch":
case "BOSCH":
return getYYWWDate(dateStr);
case "SAMSUNG":
return getYYWWDate(dateStr);
case "WD":
return getYYWWDate(dateStr);
case "Richtek":
case "RICHTEK":
return getYYWWDate(dateStr);
case "Nexperia":
case "NEXPERIA":
return getYYWWDate(dateStr);
case "GIGADEVICE":
return getYYWWDate(dateStr);
case "Winbond":
case "WINBOND":
return getYYWWDate(dateStr);
case "Dialog/Renesas ":
case "DIALOG/RENESAS":
return getYYWWDate(dateStr);
case "SITIME":
return getYYWWDate(dateStr);
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!