Commit b924137f LN

安全库存和呆滞物料功能

1 个父辈 eeff6c50
正在显示 23 个修改的文件 包含 474 行增加58 行删除
......@@ -210,6 +210,8 @@ public class DataInitManager {
Menu zhuanruMenu= new Menu(new ArrayList<Menu>(), 1, "dumpWarehousing", "转储入库", 1, "dumpWarehousing", "system/dumpWarehousing/index", "", 0, "headIcon");
Menu singleMenu= new Menu(new ArrayList<Menu>(), 1, "singleDiskWarehousing", "单盘入库", 1, "singleDiskWarehousing", "system/singleDiskWarehousing/index", "", 0, "headIcon");
Menu sluggishMaterials= new Menu(new ArrayList<Menu>(), 1, "sluggishMaterials", "呆滞物料", 1, "sluggishMaterials", "system/sluggishMaterials/index", "", 0, "sMaterial");
Menu safetyInventory= new Menu(new ArrayList<Menu>(), 1, "safetyInventory", "安全库存", 1, "safetyInventory", "system/safetyInventory/index", "", 0, "safeInventory");
celueOut.setHidden(true);
......@@ -220,7 +222,7 @@ public class DataInitManager {
zhuanruMenu.setHidden(true);
singleMenu.setHidden(true);
// orderSet.setHidden(true);
menus.addAll(createMenus(poutOut, menuOrder, out,posOut,groupOut,materialBox,outSet,inOrderMenu,putinMenu,zhuanruMenu,singleMenu));
menus.addAll(createMenus(poutOut, menuOrder, out,posOut,groupOut,materialBox,outSet,inOrderMenu,putinMenu,zhuanruMenu,singleMenu,sluggishMaterials,safetyInventory));
//MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 20, "msd", 2, "MSD");
......
......@@ -87,6 +87,17 @@ public class ComponentController {
if (component.getId() == null) {
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
//判断最大库存和最小库存
if(component.getMinStoreNum()>0 )
{
if(component.getMinStoreNum()<=component.getSafetyStoreNum()&& component.getSafetyStoreNum()<=component.getMaxStoreNum()){
}else{
throw new ValidateException("smfcore.component.storeError","请输入正确的库存,最小库存<=安全库存<=最大库存" );
}
}
componentManager.saveComponent(component);
// //修改元器件时更新storagePos中的数据
// if(!ObjectUtil.isEmpty(component.getPartNumber()))
......
......@@ -104,11 +104,11 @@ public class ComponentDto implements Serializable {
@ApiModelProperty("高度")
private int height;
@ApiModelProperty("单台料仓可存储此种物料的最大数量")
private int maxStoreNum = 999999999;
@ApiModelProperty("单台料仓存储此种物料的最小数量")
private int minStoreNum = 0;
// @ApiModelProperty("单台料仓可存储此种物料的最大数量")
// private int maxStoreNum = 999999999;
//
// @ApiModelProperty("单台料仓存储此种物料的最小数量")
// private int minStoreNum = 0;
@ApiModelProperty("出库时是否需要授权")
private boolean needAuth = false;
......@@ -149,4 +149,16 @@ public class ComponentDto implements Serializable {
@ApiModelProperty("尺寸是否已经确认")
private boolean sizeConfirmed = false;
@ApiModelProperty("最大库存")
private int maxStoreNum = 999999999;
@ApiModelProperty("最小库存")
private int minStoreNum = 0;
@ApiModelProperty("安全库存")
private int safetyStoreNum=0;
@ApiModelProperty("呆滞天数,默认0无需处理")
private int sluggishDay = 0;
}
......@@ -232,6 +232,10 @@ public class Barcode extends BasePo implements Serializable {
*/
private String thickness="";
/**
* 呆滞到期时间(入库时间+呆滞日期)
*/
private Date sluggishTime;
/**
* 添加相关联条码
*
* @param relationCode
......@@ -251,7 +255,7 @@ public class Barcode extends BasePo implements Serializable {
return new Date(putInTime);
}
public void setPutInTime(long putInTime) {
public void setPutInTime(long putInTime ) {
if (this.putInTime == -1) {
this.putInTime = putInTime;
}
......@@ -292,6 +296,15 @@ public class Barcode extends BasePo implements Serializable {
}
}
public void updateSluggishTime(int sluggishDay ){
if(sluggishDay>0){
long maxTime = sluggishDay * 60 * 60 * 1000;
setSluggishTime( new Date(putInTime + maxTime));
}else{
setSluggishTime(null);
}
}
/**
* 到达回温的时间
*/
......
......@@ -125,13 +125,22 @@ public class Component extends BasePo implements Serializable {
private boolean sizeConfirmed = false;
/**
* 单台料仓可存储此种物料的最大数量
* 最大库存
*/
private int maxStoreNum = 999999999;
/**
* 单台料仓存储此种物料的最小数量
* 最小库存
*/
private int minStoreNum = 0;
/**
*安全库存
*/
private int safetyStoreNum=0;
/**
* 呆滞天数,默认0无需处理
*/
private int sluggishDay = 0;
/**
* 出库时是否需要授权
......
......@@ -615,6 +615,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
if (barcode != null) {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.setInOpor(task.getOperator());
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
......
......@@ -137,6 +137,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
dataLog.setType(OP.PUT_IN);
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
dataLog.setNum(barcode.getAmount());
......
......@@ -9,7 +9,9 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.common.utils.YmlUpdateUtil;
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.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.language.service.bean.LanguageInfo;
......@@ -67,6 +69,9 @@ public class DataCache {
@Autowired
private InListCache inListCache;
@Autowired
private IComponentManager componentManager;
/**
* 是否需要推送温湿度报警值
*/
......@@ -683,4 +688,11 @@ public class DataCache {
log.info("AutoCreateStorage :自动创建料仓完成:cid["+storage.getCid()+"]name["+storage.getName()+"]type["+storage.getCompatibleType().name()+"]");
return storage;
}
public int getPNsluggishDay(String pn){
Component component = componentManager.findOneByPN(pn);
if(component!=null){
return component.getSluggishDay();
}
return 0;
}
}
......@@ -55,6 +55,9 @@ public class MaterialBoxController {
@Autowired
private BarcodeMapper barcodeMapper;
@Autowired
private DataCache dataCache;
@ApiOperation("查询料盒信息")
@PostMapping
@PreAuthorize("@el.check('materialBox')")
......@@ -527,6 +530,7 @@ public class MaterialBoxController {
subBarcode.setAmount(opQty);
subBarcode.setUsedDate(new Date());
subBarcode.setPutInTime(System.currentTimeMillis());
subBarcode.updateSluggishTime(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.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
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;
import com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper;
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.StoragePos;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "物料管理:呆滞物料/安全库存")
@RequestMapping("api/material")
public class MaterialStockController {
@Autowired
private final IStoragePosManager storagePosManager;
@Autowired
private final StoragePosMapper storagePosMapper;
@Autowired
private final DataCache dataCache;
@Autowired
private final IComponentManager componentManager;
@Autowired
private final SafetyInventoryMapper safetyInventoryMapper;
// @ApiOperation("导出呆滞物料")
// @GetMapping(value = "/sluggishMaterials/download")
// @PreAuthorize("@el.check('sluggishMaterials')")
// public void sluggishMaterialsDownload(HttpServletResponse response, StoragePosFindCriteria criteria, Locale locale)throws IOException {
////
//// Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(criteria.getStorageIdList(),criteria.getBlurry());
//// List<InventoryItem> list = Lists.newArrayList(inventoryItemMap.values());
////
//// String partNumberStr= MessageUtils.getText("smfcore.inventory.partNumber",locale,"物料编号");
//// String countStr= MessageUtils.getText("smfcore.inventory.count",locale,"数量");
//// String lockReelStr= MessageUtils.getText("smfcore.inventory.lockReel",locale,"锁定");
//// String stockReelStr= MessageUtils.getText("smfcore.inventory.stockReel",locale,"库存");
//// String storageNameStr= MessageUtils.getText("smfcore.inventory.storageName",locale,"设备");
////
//// List<Map<String, Object>> maps = new ArrayList<>();
//// for (InventoryItem item : list) {
//// Map<String, Object> map = new LinkedHashMap<>();
//// map.put(partNumberStr, item.getPartNumber());
//// map.put(countStr, item.getStockCount());
//// map.put(lockReelStr, item.getLockReel());
//// map.put(stockReelStr, item.getStockReel());
//// map.put(storageNameStr, item.getStorageName());
//// maps.add(map);
//// }
//// FileUtil.downloadExcel(maps, response);
// }
@ApiOperation("获取呆滞物料列表")
@GetMapping(value = "/sluggishMaterials")
@PreAuthorize("@el.check('sluggishMaterials')")
public PageData<StoragePosDto> sluggishMaterials(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request) {
if (criteria.getStorageId() != null && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null);
}
Query query = QueryHelp.getQuery(criteria);
Criteria baseCriteria = Criteria.where("used").is(true);
//需要查询已经过呆滞日期的物料
baseCriteria.and("barcode.sluggishTime").exists(true).gte(new Date());
// baseCriteria.and("barcode.sluggishTime").gte(new Date());
query.addCriteria(baseCriteria);
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos, pages.getTotalElements());
}
@ApiOperation("导出安全库存列表")
@GetMapping(value = "/safetyInventory/download")
@PreAuthorize("@el.check('safetyInventory')")
public void safetyInventoryDownload(HttpServletResponse response, SafetyInventoryQueryCriteria criteria,Locale locale)throws IOException {
List<SafetyInventoryDto> results=getSafetyInventoryList(criteria);
String partNumberStr= MessageUtils.getText("smfcore.safetyInventory.partNumber",locale,"物料编号");
String countStr= MessageUtils.getText("smfcore.safetyInventory.count",locale,"库存数量");
String stockReelStr= MessageUtils.getText("smfcore.safetyInventory.stockReel",locale,"库存盘数");
String lockReelStr= MessageUtils.getText("smfcore.safetyInventory.supplementReel",locale,"补充盘数");
String storageNameStr= MessageUtils.getText("smfcore.safetyInventory.amount",locale,"最小包装");
List<Map<String, Object>> maps = new ArrayList<>();
for (SafetyInventoryDto item : results) {
Map<String, Object> map = new LinkedHashMap<>();
map.put(partNumberStr, item.getPartNumber());
map.put(countStr, item.getStockCount());
map.put(lockReelStr, item.getLockReel());
map.put(stockReelStr, item.getSupplementReel());
map.put(storageNameStr, item.getAmount());
maps.add(map);
}
FileUtil.downloadExcel(maps, response);
}
@ApiOperation("安全库存列表")
@GetMapping(value = "/safetyInventory")
@PreAuthorize("@el.check('safetyInventory')")
public ResponseEntity<List<SafetyInventoryDto>> safetyInventory(SafetyInventoryQueryCriteria criteria) {
List<SafetyInventoryDto> results=getSafetyInventoryList(criteria);
return new ResponseEntity<>(results, HttpStatus.OK);
}
private List<SafetyInventoryDto> getSafetyInventoryList(SafetyInventoryQueryCriteria criteria) {
boolean needSupplement = criteria.isNeedSupplement();
Query query = QueryHelp.getQuery(criteria);
List<Component> componentList = componentManager.findByQuery(query);
Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(criteria.getStorageIdList(), criteria.getBlurry());
List<SafetyInventoryDto> results = new ArrayList<>();
//循环PN
for (Component com :
componentList) {
InventoryItem item = inventoryItemMap.get(com.getPartNumber());
SafetyInventoryDto dto = new SafetyInventoryDto();
if (item == null) {
} else {
dto = safetyInventoryMapper.toDto(item);
}
dto.setPartNumber(com.getPartNumber());
dto.setAmount(com.getAmount());
dto.setSupplementReel(0);
//判断是否需要补充
if (dto.getStockCount() < com.getMinStoreNum()) {
if (dto.getStockReel() > 0 && dto.getStockCount() > 0) {
int reelCount = dto.getStockCount() / dto.getStockReel();
//补充盘数
int needReel = (com.getMinStoreNum() - dto.getStockCount()) / reelCount;
dto.setSupplementReel(needReel);
} else {
int needReel = com.getMinStoreNum() / dto.getAmount();
dto.setSupplementReel(needReel);
}
}
if (needSupplement ) {
if(dto.getSupplementReel() > 0){
results.add(dto);
}
} else {
results.add(dto);
}
}
return results;
}
}
......@@ -273,28 +273,17 @@ public class StoragePosController {
storagePosManager.deletePoss(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("导出查找出库列表")
@GetMapping(value = "/find/download")
@PreAuthorize("@el.check('checkOut')")
public void download(HttpServletResponse response, StoragePosFindCriteria criteria,HttpServletRequest request) throws IOException {
if (criteria.getStorageId() != null && criteria.getStorageId().equals("0")) {
private Query getPosFindCriteria(StoragePosFindCriteria criteria){
if (ObjectUtil.isNotEmpty(criteria.getStorageId()) && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null);
}
Query query = QueryHelp.getQuery(criteria);
Criteria baseCriteria = Criteria.where("used").is(true);
int componentType = criteria.getType();
String name = "";
int componentType = criteria.getComponentType();
if (componentType != -1) {
int type = componentType;
if (componentType == 41) {//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.SOLDER_FIXTURE.getCode();
} else if (componentType == 42) {//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.PCB_FIXTURE.getCode();
}
baseCriteria.and("barcode.type").is(type);
baseCriteria.and("barcode.type").is(componentType);
}
......@@ -308,6 +297,15 @@ public class StoragePosController {
}
query.addCriteria(baseCriteria);
return query;
}
@ApiOperation("导出查找出库列表")
@GetMapping(value = "/find/download")
@PreAuthorize("@el.check('checkOut')")
public void download(HttpServletResponse response, StoragePosFindCriteria criteria,HttpServletRequest request) throws IOException {
Query query=getPosFindCriteria(criteria);
List<StoragePos> storagePos = storagePosManager.findByQuery(query );
storagePosManager.download(storagePos, response,request.getLocale());
}
......@@ -315,40 +313,8 @@ public class StoragePosController {
@GetMapping("/find")
@PreAuthorize("@el.check('checkOut')")
public PageData<StoragePosDto> storagePosFind(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request) {
if (criteria.getStorageId() != null && criteria.getStorageId().equals("0")) {
criteria.setStorageId(null);
}
Query query = QueryHelp.getQuery(criteria);
Criteria baseCriteria = Criteria.where("used").is(true);
int componentType = criteria.getType();
String name = "";
if (componentType != -1) {
int type = componentType;
request.setAttribute("type", componentType);
if (componentType == 41) {//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.SOLDER_FIXTURE.getCode();
} else if (componentType == 42) {//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
name = StorageConstants.PACKAGE_TYPE.PCB_FIXTURE.getCode();
}
baseCriteria.and("barcode.type").is(type);
}
String expire = criteria.getExpire();
if (!Strings.isNullOrEmpty(expire)) {
if ("solder".equalsIgnoreCase(expire)) {
baseCriteria.and("barcode.expTime").lte(new Date());
} else if ("pcb".equalsIgnoreCase(expire)) {
baseCriteria.and("barcode.expireDate").lte(new Date());
}
request.setAttribute("expire", expire);
}
query.addCriteria(baseCriteria);
Query query=getPosFindCriteria(criteria);
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
return new PageData(StoragePosDtos, pages.getTotalElements());
......
package com.neotel.smfcore.core.storage.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 安全库存详情(参照InventoryItemDto)
*/
@Data
public class SafetyInventoryDto implements Serializable {
@ApiModelProperty("物编")
private String partNumber;
@ApiModelProperty("库存数量")
private int stockCount = 0;
@ApiModelProperty("锁定的数量")
private int lockCount = 0;
@ApiModelProperty("库存盘数")
private int stockReel = 0;
@ApiModelProperty("锁定的盘数")
private int lockReel = 0;
@ApiModelProperty("过期的盘数")
private int expireReel = 0;
@ApiModelProperty("即将过期的盘数(2个小时内)")
private int willExireReel = 0;
@ApiModelProperty("设备ID")
private String storageId;
@ApiModelProperty("设备名称")
private String storageName;
private int plateNumber=1;
@ApiModelProperty("最小包装数")
private int amount;
@ApiModelProperty("需要补充盘数")
private int supplementReel=0;
}
package com.neotel.smfcore.core.storage.rest.dto;
import com.neotel.smfcore.core.barcode.rest.bean.dto.BarcodeDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 呆滞物料信息(参照查找出库StoragePosDto)
*/
@Data
public class SluggishMaterialsDto implements Serializable {
@ApiModelProperty("库位ID")
private String id;
@ApiModelProperty("料仓ID")
private String storageId;
@ApiModelProperty("条码")
private BarcodeDto barcode;
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("扩展库位的主库位")
private String hostPosId;
@ApiModelProperty("该仓位是否限制物编,虚拟仓使用")
private List<String> limitPnList;
@ApiModelProperty("进料优先级,数字越大优先级越高,例:1-1的优先级为100 仓1-2的优先级200,那么入仓时就会优先进入1-2仓")
private double priority = 0f;
@ApiModelProperty("是否可用了")
private boolean enabled = true;
@ApiModelProperty("是否使用了")
private boolean used = false;
@ApiModelProperty("是否是回温库位,条码第一次入库是入库到冷藏库位,回温或二次入库时才入到回温库位")
private boolean warmPos = false;
@ApiModelProperty("高度")
private int h;
@ApiModelProperty("宽度")
private int w;
@ApiModelProperty("可出库时间,类型的锡膏时,可出库时间为最新放入的锡膏的可出库时间")
private long canCheckOutTime = 0;
@ApiModelProperty("并联的其他库位,合并入主库位的库位")
private List<String> mergePosList;
@ApiModelProperty("标签ID")
private String labelId="";
@ApiModelProperty("标签名称")
private String labelName;
@ApiModelProperty("湿度")
private String humidity="";
@ApiModelProperty("温度")
private String temperature="";
@ApiModelProperty("设备名称")
private String storageName;
@ApiModelProperty("分组")
private String groupId = "";
@ApiModelProperty("组名称")
private String groupName = "";
}
package com.neotel.smfcore.core.storage.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.rest.dto.SafetyInventoryDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SafetyInventoryMapper extends BaseMapper<SafetyInventoryDto, InventoryItem> {
}
package com.neotel.smfcore.core.storage.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import lombok.Data;
import java.util.List;
@Data
public class SafetyInventoryQueryCriteria {
private String blurry;
//
// @QueryCondition(isDBId =true)
// private String storageId;
//
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList;
/**
* 物料编号
*/
@QueryCondition
private String partNumber;
/***
* 需要补充物料
*/
private boolean needSupplement;
}
......@@ -2,6 +2,8 @@ package com.neotel.smfcore.core.storage.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.common.utils.StorageConstants;
import com.neotel.smfcore.core.barcode.enums.COMPONENT_TYPE;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -79,4 +81,18 @@ public class StoragePosFindCriteria {
@QueryCondition(propName = "barcode.msl")
@ApiModelProperty("等级")
private String msl;
public int getComponentType(){
int componentType = getType();
if (componentType != -1) {
int type = componentType;
if (componentType == 41) {//锡膏夹具
type = COMPONENT_TYPE.FIXTURE;
} else if (componentType == 42) {//PCB夹具
type = COMPONENT_TYPE.FIXTURE;
}
return type;
}
return -1;
}
}
......@@ -85,6 +85,7 @@ public class TaskService {
if(barcode!=null){
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
}
String loginUser = SecurityUtils.getLoginUsername();
......@@ -777,6 +778,7 @@ public class TaskService {
barcode.setUsedCount(barcode.getUsedCount() + 1);
barcode.setUsedDate(new Date());
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcode.setInOpor(opUser);
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
......
......@@ -250,6 +250,7 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
smfcore.safetyInventory.stockReel=\u5E93\u5B58\u76D8\u6570
smfcore.safetyInventory.supplementReel=\u8865\u5145\u76D8\u6570
smfcore.safetyInventory.amount=\u6700\u5C0F\u5305\u88C5
smfcore.component.storeError=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u5E93\u5B58\uFF0C\u6700\u5C0F\u5E93\u5B58<=\u5B89\u5168\u5E93\u5B58<=\u6700\u5927\u5E93\u5B58
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
......@@ -251,4 +251,5 @@ smfcore.safetyInventory.count=Stock Quantity
smfcore.safetyInventory.stockReel=Reel QTY
smfcore.safetyInventory.supplementReel=Number of additional plates
smfcore.safetyInventory.amount=Amount
smfcore.component.storeError=Please enter the correct stock, minimum stock <= safety stock <= maximum stock
......@@ -250,4 +250,5 @@ smfcore.safetyInventory.count=\u5728\u5EAB\u6570
smfcore.safetyInventory.stockReel=\u76E4\u6578
smfcore.safetyInventory.supplementReel=\u8FFD\u52A0\u30D7\u30EC\u30FC\u30C8\u679A\u6570
smfcore.safetyInventory.amount=\u6578\u91CF
smfcore.component.storeError=\u6B63\u3057\u3044\u5728\u5EAB\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3001\u6700\u5C0F\u5728\u5EAB\u2266\u5B89\u5168\u5728\u5EAB\u2266\u6700\u5927\u5728\u5EAB
......@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5E93\u5B58\u6570\u91CF
smfcore.safetyInventory.stockReel=\u5E93\u5B58\u76D8\u6570
smfcore.safetyInventory.supplementReel=\u8865\u5145\u76D8\u6570
smfcore.safetyInventory.amount=\u6700\u5C0F\u5305\u88C5
smfcore.component.storeError=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u5E93\u5B58\uFF0C\u6700\u5C0F\u5E93\u5B58<=\u5B89\u5168\u5E93\u5B58<=\u6700\u5927\u5E93\u5B58
......@@ -250,3 +250,4 @@ smfcore.safetyInventory.count=\u5EAB\u5B58\u6578\u91CF
smfcore.safetyInventory.stockReel=\u5EAB\u5B58\u76E4\u6578
smfcore.safetyInventory.supplementReel=\u88DC\u5145\u76E4\u6578
smfcore.safetyInventory.amount=\u6700\u5C0F\u5305\u88DD
smfcore.component.storeError=\u8ACB\u8F38\u5165\u6B63\u78BA\u7684\u5EAB\u5B58\uFF0C\u6700\u5C0F\u5EAB\u5B58<=\u5B89\u5168\u5EAB\u5B58<=\u6700\u5927\u5EAB\u5B58
......@@ -27,3 +27,6 @@
20220314:
增加移动料架:NLM,入库时自动推荐库位,无合适库位时自动合并库位。
20220318:
安全库存和 呆滞物料功能
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!