Commit d035a6f3 LN

新呆滞物料功能

1 个父辈 7bc06f7e
......@@ -78,6 +78,7 @@ public class ComponentController {
headerList.add(Lists.newArrayList("截料设置盘数"));
headerList.add(Lists.newArrayList("安全库存盘数"));
headerList.add(Lists.newArrayList("呆滞天数"));
headerList.add(Lists.newArrayList("最大存储天数"));
headerList.add(Lists.newArrayList("物料间距"));
headerList.add(Lists.newArrayList("尺寸是否已确认"));
headerList.add(Lists.newArrayList("描述"));
......@@ -100,6 +101,7 @@ public class ComponentController {
data.add(component.getMinStoreNum());
data.add(component.getSafetyStoreNum());
data.add(component.getSluggishDay());
data.add(component.getMaxSluggishDay());
data.add(component.getDistance());
String confirmed = "否";
if(component.isSizeConfirmed()){
......@@ -143,6 +145,9 @@ public class ComponentController {
if (component.getId() == null) {
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
if( component.getSluggishDay()>0&& component.getSluggishDay()>component.getMaxSluggishDay()){
throw new ValidateException("smfcore.sluggishDay.error","最大呆滞天数必须大于呆滞天数" );
}
componentManager.saveComponent(component);
// //修改元器件时更新storagePos中的数据
// if(!ObjectUtil.isEmpty(component.getPartNumber()))
......@@ -262,7 +267,7 @@ public class ComponentController {
// String[] titleArray = new String[]{"料件编号" , "数量", "尺寸", "高度", "物料间距", "截料设置盘数", "安全库存盘数","补充盘数上限"
// , "呆滞天数", "整盘比", "散盘比", "描述"};
String[] titleArray = new String[]{"materialNo" , "amount", "plateSize", "height", "distance", "minStoreNum", "safetyStoreNum","maxStoreNum"
, "sluggishDay", "wholeReel", "halfReel", "description"};
, "sluggishDay","maxSluggishDay", "wholeReel", "halfReel", "description"};
for (String title :
titleArray) {
......@@ -282,6 +287,7 @@ public class ComponentController {
map.put("safetyStoreNum", "");
map.put("maxStoreNum","");
map.put("sluggishDay", "");
map.put("maxSluggishDay","");
map.put("wholeReel", "");
map.put("halfReel", "");
map.put("description", "");
......@@ -321,6 +327,7 @@ public class ComponentController {
int safetyStoreNumIndex = csvRead.getIndex("安全库存盘数", "safetyStoreNum");
int maxStoreNumIndex=csvRead.getIndex("补充最大盘数","maxStoreNum");
int sluggishDayIndex = csvRead.getIndex("呆滞天数", "sluggishDay");
int maxSluggishDayIndex=csvRead.getIndex("最大存储天数","maxSluggishDay");
int wholeReelIndex = csvRead.getIndex("整盘", "wholeReel");
int halfReelIndex = csvRead.getIndex("散盘", "halfReel");
int descriptionIndex = csvRead.getIndex("描述", "description");
......@@ -354,6 +361,7 @@ public class ComponentController {
item.setSafetyStoreNum(getIntValue(lineValues, safetyStoreNumIndex, item.getSafetyStoreNum()));
item.setMaxStoreNum(getIntValue(lineValues,maxStoreNumIndex,item.getMaxStoreNum()));
item.setSluggishDay(getIntValue(lineValues, sluggishDayIndex, item.getSluggishDay()));
item.setMaxSluggishDay(getIntValue(lineValues,maxSluggishDayIndex,item.getMaxSluggishDay()));
item.setWholeReel(getIntValue(lineValues, wholeReelIndex, item.getWholeReel()));
item.setHalfReel(getIntValue(lineValues, halfReelIndex, item.getHalfReel()));
item.setDescription(lineValues[descriptionIndex].trim());
......
......@@ -247,5 +247,11 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("物料间距")
private int distance=0;
@ApiModelProperty("呆滞到期时间(生成日期+呆滞日期)")
private Date sluggishDate;
@ApiModelProperty("最大存储期(生成日期+最大呆滞日期)")
private Date maxSluggishDate;
}
......@@ -162,6 +162,8 @@ public class ComponentDto implements Serializable {
@ApiModelProperty("呆滞天数,默认0无需处理")
private int sluggishDay = 0;
@ApiModelProperty("最大呆滞天数,默认0无需处理")
private int maxSluggishDay = 0;
@ApiModelProperty("整盘比")
private int wholeReel=0;
......
......@@ -240,9 +240,21 @@ public class Barcode extends BasePo implements Serializable {
*/
private String thickness="";
/**
* 呆滞到期时间(入库时间+呆滞日期)
* 呆滞到期时间(入库时间+呆滞日期) 旧数据,暂不使用
*/
private Date sluggishTime;
/**
* 呆滞到期时间(生成日期+呆滞日期)
*/
private Date sluggishDate;
/**
* 最大存储期(生成日期+最大呆滞日期)
*/
private Date maxSluggishDate;
/**
* 是否是冻结的湿敏物料
......@@ -314,13 +326,42 @@ public class Barcode extends BasePo implements Serializable {
}
}
}
public void updateSluggishTime(int sluggishDay ){
if(sluggishDay>0){
private void updateSluggishTime(int sluggishDay ) {
if (sluggishDay > 0) {
long maxTime = sluggishDay * 60 * 60 * 1000;
setSluggishTime( new Date(putInTime + maxTime));
}else{
setSluggishTime(new Date(putInTime + maxTime));
} else {
setSluggishTime(null);
}
}
public void updateSluggishDate(List<Integer> params ) {
if (produceDate == null) {
return;
}
if (params.size() == 2) {
int sluggishDay = params.get(0);
int maxsluggishDay = params.get(1);
if (sluggishDay > 0) {
Date nTime = DateUtil.addDays(produceDate, sluggishDay);
if (getSluggishDate() == null || getSluggishDate().before(nTime)) {
setSluggishDate(nTime);
setMaxSluggishDate(nTime);
}
if (maxsluggishDay > 0) {
Date newMaxTime = DateUtil.addDays(produceDate, maxsluggishDay);
if (getMaxSluggishDate() == null || getMaxSluggishDate().before(newMaxTime)) {
setMaxSluggishDate(newMaxTime);
}
}
} else {
setSluggishTime(null);
setMaxSluggishDate(null);
}
updateSluggishTime(sluggishDay);
} else {
setSluggishTime(null);
setMaxSluggishDate(null);
}
}
......
......@@ -139,6 +139,10 @@ public class Component extends BasePo implements Serializable {
*/
private int sluggishDay = 0;
/**
* 最大呆滞天数,默认0无需处理
*/
private int maxSluggishDay = 0;
/**
* 出库时是否需要授权
......
......@@ -136,7 +136,12 @@ public class CodeResolve {
Date produceDate = barcodeFromRule.getProduceDate();
if(produceDate != null){
//抓取到了生产日期,未抓取到过期日期,重新设置过期日期
if(barcode.getExpireDate() == null){
if(barcode.getProduceDate()==null){
log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期 ");
barcode.setProduceDate(produceDate);
needUpdate = true;
}
if(barcode.getExpireDate() == null ){
if(validDay > 0){
log.info("重新设置"+codeBeanFromRule.getCodeStr()+"生产日期和过期日期");
Date expireDate = DateUtil.addDays(produceDate, validDay);
......
......@@ -628,7 +628,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setPutInTime(System.currentTimeMillis());
barcode.setPutInType(task.getInType());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.updateSluggishDate(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.setInOpor(task.getOperator());
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
......
......@@ -114,8 +114,15 @@ public class NLPShelfHandler extends BaseDeviceHandler{
color = ORDER_COLOR.fromRgb(rgb);
}
} else {
//普通出库蓝色 DARKGREEN
color = ORDER_COLOR.DARKGREEN;
if(ObjectUtil.isNotEmpty(queueTask.getLightColor())){
String rgb = queueTask.getLightColor();
color = ORDER_COLOR.fromRgb(rgb);
}
else {
//普通出库蓝色 DARKGREEN
color = ORDER_COLOR.DARKGREEN;
}
}
}
if (color != null) {
......
......@@ -726,11 +726,17 @@ public class DataCache {
return storage;
}
public int getPNsluggishDay(String pn) {
public List<Integer> getPNsluggishDay(String pn) {
List<Integer> result=new ArrayList<>();
Component component = componentManager.findOneByPN(pn);
if (component != null) {
return component.getSluggishDay();
result.add(component.getSluggishDay()) ;
result.add(component.getMaxSluggishDay());
}else{
result.add(0);
result.add(0);
}
return 0;
return result;
}
}
......@@ -303,7 +303,7 @@ public class SingleInController {
barcode.setPutInType(inType);
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.updateSluggishDate(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
dataLog.setNum(barcode.getAmount());
......
......@@ -530,7 +530,7 @@ public class MaterialBoxController {
subBarcode.setAmount(opQty);
subBarcode.setUsedDate(new Date());
subBarcode.setPutInTime(System.currentTimeMillis());
subBarcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
subBarcode.updateSluggishDate(dataCache.getPNsluggishDay(barcode.getPartNumber()));
subBarcode.setCheckOutDate(null, "");
subBarcode.setHostBarcodeId(barcode.getId());
subBarcode = barcodeManager.save(subBarcode);
......
package com.neotel.smfcore.core.storage.rest;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.hik.enums.IN_OUT_TYPE;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.dto.SafetyInventoryDto;
import com.neotel.smfcore.core.storage.rest.dto.StoragePosDto;
......@@ -15,7 +22,9 @@ import com.neotel.smfcore.core.storage.rest.mapstruct.StoragePosMapper;
import com.neotel.smfcore.core.storage.rest.query.SafetyInventoryQueryCriteria;
import com.neotel.smfcore.core.storage.rest.query.StoragePosFindCriteria;
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.util.TaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
......@@ -27,9 +36,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
......@@ -56,6 +63,10 @@ public class MaterialStockController {
@Autowired
private final SafetyInventoryMapper safetyInventoryMapper;
@Autowired
private TaskService taskService;
@Autowired
private IBarcodeManager barcodeManager;
// @ApiOperation("导出呆滞物料")
// @GetMapping(value = "/sluggishMaterials/download")
......@@ -97,7 +108,7 @@ public class MaterialStockController {
Criteria baseCriteria = Criteria.where("used").is(true);
//需要查询已经过呆滞日期的物料
baseCriteria.and("barcode.sluggishTime").exists(true).gte(new Date());
baseCriteria.and("barcode.sluggishDate").exists(true).lte(new Date());
// baseCriteria.and("barcode.sluggishTime").gte(new Date());
query.addCriteria(baseCriteria);
......@@ -105,8 +116,73 @@ public class MaterialStockController {
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos, pages.getTotalElements());
}
@ApiOperation("延期呆滞物料")
@PutMapping(value = "/delayMaterials")
public ResultBean delayMaterials(@RequestBody Map<String,Object> params) {
List<String> pids= (List<String>) params.get("pids");
int okCount=0;
for (String pid : pids) {
StoragePos pos = storagePosManager.get(pid);
Barcode barcode = pos.getBarcode();
if (barcode == null) {
continue;
}
int delayDay = 90;
//物料存储期自动延长为min(原呆滞存储期+90天,最大呆滞存储期
Date slTime = DateUtil.addDays(barcode.getSluggishDate(),delayDay);
//最大呆滞时间
if (barcode.getMaxSluggishDate() != null && barcode.getMaxSluggishDate().before(slTime)) {
slTime = barcode.getMaxSluggishDate();
}
//判断是否是同一天,同一天不需要重置
String pStr = DateUtil.toDateString(barcode.getSluggishDate(), "yyyy-MM-dd");
String currStr = DateUtil.toDateString(slTime, "yyyy-MM-dd");
if (!pStr.equals(currStr)) {
barcode.setSluggishDate(slTime);
barcodeManager.saveBarcode(barcode);
pos.setBarcode(barcode);
storagePosManager.save(pos);
okCount++;
log.info("库位【" + pos.getPosName() + "】条码【" + barcode.getBarcode() + "】呆滞物料延期成功:从【" + pStr + "】到【" + currStr + "】,okCout="+okCount);
}
}
return ResultBean.newOkResult(okCount);
}
@ApiOperation("下架呆滞物料")
@PutMapping(value = "/checkOutMaterials")
public ResultBean checkOutMaterials(@RequestBody Map<String,Object> params) {
List<String> pids= (List<String>) params.get("pids");
int okCount=0;
for (String pid : pids) {
StoragePos pos = storagePosManager.get(pid);
if (pos == null) {
log.info("下架呆滞物料时,库位号["+pid+"]不存在,忽略");
continue;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if (storage == null) {
log.info("下架呆滞物料时,设备["+pos.getStorageId()+"]不存在,忽略");
continue;
}
try{
log.info("下架呆滞物料时【" + storage.getName() + "_" + storage.getCid() + "】位置仓位【" + pos.getPosName() + "】");
taskService.checkout(storage, pos, false, SecurityUtils.getCurrentUsername(), ORDER_COLOR.LIGHTBLUE.name());
okCount++;
}catch (Exception ex){
log.info("下架呆滞物料时【" + storage.getName() + "】位置仓位【" + pos.getPosName() + "】失败:" + ex.getMessage());
}
}
return ResultBean.newOkResult(okCount);
}
@ApiOperation("导出安全库存列表")
@GetMapping(value = "/safetyInventory/download")
......
......@@ -634,6 +634,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
//未到呆滞期
c.orOperator(Criteria.where("barcode.sluggishDate").exists(false),
Criteria.where("barcode.sluggishDate").gt(new Date()));
Query q = new Query(c);
//数量从大到小,出库先进先出
Sort amountSort = Sort.by(Sort.Direction.DESC, "barcode.amount");
......
......@@ -38,6 +38,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.List;
/**
* Created by sunke on 2021/7/13.
......@@ -86,7 +87,7 @@ public class TaskService {
if(barcode!=null){
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.updateSluggishDate(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
}
String loginUser = SecurityUtils.getLoginUsername();
......@@ -106,6 +107,9 @@ public class TaskService {
* @throws ValidateException
*/
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName) throws ValidateException {
return checkout(storage,pos,isSingleOut,opUserName,"");
}
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String color) throws ValidateException {
if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg);
......@@ -114,8 +118,15 @@ public class TaskService {
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT);
if(pos.getBarcode().isLockMsl()){
task.setOutType(IN_OUT_TYPE.OUT_MSL);//湿敏物料出库
task.setOutType(IN_OUT_TYPE.OUT_NORMAL);
if(ObjectUtil.isEmpty(color)) {
if (pos.getBarcode().isLockMsl()) {
task.setOutType(IN_OUT_TYPE.OUT_MSL);//湿敏物料出库
}
}else{
// task.setOutType(outType);
//类型设置为普通出库,颜色设置为指定颜色
task.setLightColor(color);
}
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
......@@ -124,7 +135,6 @@ public class TaskService {
addTaskToExecute(task);
return "";
}
/**
* 并盘出库方法,需提前验证是否可出库
* @param storage
......@@ -806,7 +816,7 @@ public class TaskService {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setUsedDate(new Date());
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.updateSluggishDate(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.setInOpor(opUser);
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
......
......@@ -68,4 +68,13 @@ hik:
1.元器件字段修改:截料设置盘数,安全库存盘数,补充盘数限制。
2.入库单增加凭证号,物料日志页面分来源一,来源二。
3.UID出库,增加物料编号,批次,供应商 查询。
4.齐套缺料改为:分开计算每个工单缺少多少盘, 然后最后把总盘数加起来
\ No newline at end of file
4.齐套缺料改为:分开计算每个工单缺少多少盘, 然后最后把总盘数加起来
20230217
增加普通入库,退料入库,截料入库 菜单。
20230530
新呆滞物料功能:barcode 增加 sluggishDate,maxSluggishDate
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!