Commit 21bb19f4 zshaohui

立臻项目提交

1 个父辈 3e8bc470
正在显示 78 个修改的文件 包含 2238 行增加134 行删除
......@@ -233,5 +233,4 @@ public abstract class AbstractBaseDao implements IBaseDao {
public void setMongoTemplate(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
}
......@@ -58,6 +58,4 @@ public interface IBaseDao {
void updateFirst(Query query, Update update);
MongoTemplate getMongoTemplate();
}
package com.neotel.smfcore.common.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
import java.util.Date;
@Data
public class ReelLockPosInfo {
public class ReelLockPosInfo extends BasePo{
/**
* 条码信息
*/
......
......@@ -60,6 +60,7 @@ public class DataInitManager {
private InListCache inListCache;
@Autowired
private IMessageManager messageManager;
/**
* 当前版本
*/
......@@ -211,6 +212,7 @@ public class DataInitManager {
//报表:出入库、库存
Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null);
addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",functionMenuMap);
addNewFunctionMenu(72, pMenuReport, "innerOutData", "内仓出入库", "innerOutData", "neolight/innerOutData/index", "outPut",functionMenuMap);
addNewFunctionMenu(72, pMenuReport,"inventory", "库存", "inventory", "neolight/inventory/index", "inventory",functionMenuMap);
addNewFunctionMenu(73, pMenuReport,"materialIssueDetailsList", "发料", "materialIssueDetailsList", "neolight/materialIssueDetailsList/index", "mIDList",functionMenuMap);
addNewFunctionMenu(74, pMenuReport,"overdueDelayReport", "过期延期", "overdueDelayReport", "neolight/overdueDelayReport/index", "oDReport",functionMenuMap);
......@@ -222,8 +224,17 @@ public class DataInitManager {
addNewFunctionMenu(80, pMenuReport,"inventoryReport", "库存", "inventoryReport", "neolight/inventoryReport/index", "BOM",functionMenuMap);
addNewFunctionMenu(81, pMenuReport,"materialShortageReport", "缺料", "materialShortageReport", "neolight/materialShortageReport/index", "mShortageReport",functionMenuMap);
addNewFunctionMenu(82,pMenuReport,"pkSearch","PK查询","pkSearch","neolight/pkSearch/index","findOut",functionMenuMap);
//addNewFunctionMenu(83,pMenuReport,"lackPicking","内仓缺料","lackPicking","neolight/lackPicking/index","mShortageReport",functionMenuMap);
addNewFunctionMenu(83,pMenuReport,"feeding","喂料","feeding","neolight/feeding/index","mShortageReport",functionMenuMap);
//内仓
addNewFunctionMenu(84,pMenuReport,"feeding","喂料","feeding","neolight/feeding/index","feeding",functionMenuMap);
addNewFunctionMenu(85,pMenuReport,"innerInventory","库存","innerInventory","innerWarehouse/inventory/index","inventory",functionMenuMap);
addNewFunctionMenu(86,pMenuReport,"innerMaterial","备料清单","innerMaterial","innerWarehouse/materialPreList/index","mPreListReport",functionMenuMap);
addNewFunctionMenu(87,pMenuReport,"innerChangeReport","异动","innerChangeReport","innerWarehouse/changeReport/index","chageReport",functionMenuMap);
addNewFunctionMenu(88,pMenuReport,"innerIssueReport","发料","innerIssueReport","innerWarehouse/issueReport/index","IssueRe",functionMenuMap);
addNewFunctionMenu(89,pMenuReport,"innerMaShortReport","缺料","innerMaShortReport","innerWarehouse/maShortReport/index","maShort",functionMenuMap);
addNewFunctionMenu(90,pMenuReport,"innerProLimitReport","禁限用","innerProLimitReport","innerWarehouse/proLimitReport/index","proLimit",functionMenuMap);
//可观测性:物料追踪
Menu guanceMenu = Menu.CreatePMenu("可观测性", 8, "observability", 2, "scanKey",null);
......@@ -276,6 +287,14 @@ public class DataInitManager {
addNewFunctionMenu(130, s5, "outerWarehouse/s5", "入库扫码装箱","outerWarehouse/s5", "outers/outerWarehouse/index","index",functionMenuMap);
addNewFunctionMenu(131, s5, "outOperation/s5", "出库作业","outOperation/s5", "outers/outOperation/index","index",functionMenuMap);
//线外入库
//Menu outPage = Menu.CreatePMenu("线外入库", 17, "", 1, "index", null);
addNewFunctionMenu(132,null,"outPage","线外入库","outPage","outers/outPage/index","index",functionMenuMap);
addNewFunctionMenu(133,null,"outVir","虚拟仓出库","outVir","outers/outVir/index","index",functionMenuMap);
//内仓线外入库
addNewFunctionMenu(134,null,"virWarehous","虚拟仓","virWarehous","virWarehous/virWarehous/index","feeding",functionMenuMap);
return functionMenuMap;
}
......
......@@ -183,7 +183,16 @@ public class DateUtil {
return date0.after(date1)? date0 : date1;
}
public static Date initDate(Date date, String aMask) {
SimpleDateFormat sf = new SimpleDateFormat(aMask);
String dateStr = sf.format(date);
try {
date = toDate(dateStr,aMask);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static class Req{
private String seq;
......
......@@ -238,12 +238,16 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
// 这里注意 如果同一个sheet只要创建一次
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();
// 去调用写入,这里我调用了五次,实际使用时根据数据库分页的总的页数来
PageRequest page = PageRequest.ofSize(10000);
PageRequest page = PageRequest.ofSize(20000);
if(pageable != null){
page.withSort(pageable.getSort());
}
int count = 0;
while (true){
count ++;
log.info("查询次数:"+count);
List<List<Object>> data = excelDownLoad.getPageData(query,page);
log.info("查找完成");
if(data == null || data.isEmpty()){
break;
}
......
......@@ -58,6 +58,9 @@ public class SmfApi {
@Value("${api.barcodeInfoUrl:}")
protected String barcodeInfoUrl = "";
@Value("${api.importUrl}")
protected String importUrl;
@PostConstruct
public void init(){
apiName = dataCache.getConfigCache("api.name",apiName);
......@@ -69,6 +72,7 @@ public class SmfApi {
fetchInListUrl = dataCache.getConfigCache("api.fetchInListUrl",fetchInListUrl);
fetchOrderUrl = dataCache.getConfigCache("api.fetchOrderUrl",fetchOrderUrl);
barcodeInfoUrl = dataCache.getConfigCache("api.barcodeInfoUrl",barcodeInfoUrl);
importUrl = dataCache.getConfigCache("api.importUrl",importUrl);
}
/**
......
......@@ -858,6 +858,9 @@ public class BarcodeRule {
codeStr = "=1x1=806-33328-1000015|220812A-220812|6000|M8010000153322U50F|EVERWIN";
rule = "RI[0:6:2]PN[-1:2:-1]";
codeStr = "CS0001-1";
rule = "RI[-1:6:-1]PN[-1:2:-1]";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
if(b != null){
......
......@@ -103,6 +103,9 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("库位信息")
private String posName;
@ApiModelProperty("隔扣码数量")
private String posNameCount;
/**
* 只能单盘出库
*/
......@@ -265,4 +268,16 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("创建人")
private String creator;
@ApiModelProperty("厂别")
private String plant;
@ApiModelProperty("厂区")
private String factory;
@ApiModelProperty("储位")
private String storagePosName;
@ApiModelProperty("Keeper")
private String keeperCode;
}
......@@ -2,6 +2,8 @@ package com.neotel.smfcore.core.barcode.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
......@@ -17,4 +19,10 @@ public interface IBarcodeManager extends IBaseManager<Barcode> {
void download(List<Barcode> list, HttpServletResponse response) throws IOException;
void deleteBarcodes(Set<String> ids);
Barcode findOne(Query query);
void updateBarcode(Query query, Update update);
List<Barcode> findByPosName(String barcodeStr);
}
......@@ -5,6 +5,7 @@ import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
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.core.barcode.service.dao.IBarcodeDao;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
......@@ -15,12 +16,14 @@ 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.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.regex.Pattern;
@Slf4j
@Service
......@@ -96,6 +99,11 @@ public class BarcodeManagerImpl implements IBarcodeManager {
}
@Override
public Barcode findOne(Query query) {
return barcodeDao.findOne(query);
}
@Override
public Barcode saveBarcode(Barcode resources) {
validateSave(resources);
......@@ -169,6 +177,19 @@ public class BarcodeManagerImpl implements IBarcodeManager {
return barcodeDao.save(resources);
}
public void updateBarcode(Query query, Update update){
barcodeDao.updateMulti(query,update);
}
@Override
public List<Barcode> findByPosName(String posName) {
Query q = new Query();
Pattern p = Pattern.compile(QueryHelp.escapeExprSpecialWord(posName), Pattern.CASE_INSENSITIVE);
q.addCriteria(Criteria.where("posName").regex(p));
return barcodeDao.findByQuery(q);
}
protected boolean validateComponent(Barcode barcode) {
return componentManager.findOneByPN(barcode.getPartNumber()) != null;
}
......
......@@ -108,6 +108,11 @@ public class Barcode extends BasePo implements Serializable {
private String posName;
/**
* 库位信息(料箱的库位)
*/
private String storagePosName;
/**
* 只能单盘出库
*/
private boolean onlySingleOut = false;
......@@ -528,4 +533,19 @@ public class Barcode extends BasePo implements Serializable {
}
}
}
public void updateSubCodes(Barcode subCode) {
if (subCodeList == null) {
subCodeList = new ArrayList<>();
}
if (subCodeList == null || subCodeList.isEmpty()) {
subCodeList.add(subCode);
} else {
//移除
subCodeList.removeIf(t -> t.getBarcode().equals(subCode.getBarcode()));
if (subCode.getAmount() > 0){
subCodeList.add(subCode);
}
}
}
}
......@@ -490,8 +490,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
task.setExecuteTime(executeTime);
updatePosExecuteTime(posName,executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
DataLog cancelTask = taskService.findFinishedTask(cid, posName);
if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除
......@@ -499,6 +498,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
updatePutInData(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else {
//从已完成列表中找,如果还找不到就忽略
task = taskService.findFinishedTask(cid, posName);
......
......@@ -23,6 +23,8 @@ import com.neotel.smfcore.core.system.bean.OrderSetting;
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.neotel.smfcore.custom.lizhen.innerBox.rest.InnerBoxRestController;
import com.neotel.smfcore.security.TokenProvider;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -52,12 +54,15 @@ public class NLShelfHandler extends BaseDeviceHandler {
@Autowired
private TokenProvider tokenProvider;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private InListCache inListCache;
@Autowired
private LizhenApi lizhenApi;
String putInColor = "green";
int delayCloseTime = 30000;
......@@ -137,7 +142,6 @@ public class NLShelfHandler extends BaseDeviceHandler {
}
log.info("料架亮灯:" + task.getPosName() + "=" + color.name());
statusBean.addData("open", task.getPosName() + "=" + color.name());
log.info(JsonUtil.toJsonStr(statusBean.getData()));
}
return statusBean;
}
......@@ -306,6 +310,7 @@ public class NLShelfHandler extends BaseDeviceHandler {
pos=storagePosManager.getByPosName(posNameStr);
}
}
if (pos != null) {
//扫描的为库位条码,先关掉上一个库位灯, 当前库位中没有物料的话点亮库位灯
closeLastPos(token);
......@@ -382,7 +387,25 @@ public class NLShelfHandler extends BaseDeviceHandler {
return ResultBean.newOkResult( "smfcore.shelf.msg.outConfirm", "出库完成, 库位[{0}]灭灯", new String[]{inPos.getPosName()} );
}
}
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.noTask", "操作失败,已在库位[{0}]中,未找到对应的出库任务", new String[]{inPos.getPosName()});
//判断是不是虚拟仓的,如果是则直接完成
Storage storage = dataCache.getStorageById(inPos.getStorageId());
if (storage.isVirtual()) {
DataLog dataLog = new DataLog(storage, barcode, inPos);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setExtendType(ExtendType.VIRTUAL_CHECKOUT); //虚拟出库
taskService.updateFinishedTask(dataLog);
taskService.removeFinishedTask(dataLog);
log.info("料架入库,虚拟仓出库:" + barcode.getBarcode() + ",库位名称为:" + inPos.getPosName());
inPos.setBarcode(null);
//dataCache.updateInventory(storagePos, barcode);
barcode.setPosName(null);
barcode = barcodeManager.save(barcode);
//进行库位更改
inPos.setUsed(false);
storagePosManager.save(inPos);
} else {
return ResultBean.newErrorResult(1, "smfcore.shelf.msg.noTask", "操作失败,已在库位[{0}]中,未找到对应的出库任务", new String[]{inPos.getPosName()});
}
}
return null;
}
......@@ -401,6 +424,12 @@ public class NLShelfHandler extends BaseDeviceHandler {
if(barcode == null){
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码",new String[]{code});
}
Barcode barcodeApi = lizhenApi.barcodeInfo(barcode);
if (barcodeApi != null){
barcode = barcodeApi;
}
Date expireDate = barcode.getExpireDate();
if (expireDate != null) {
if (System.currentTimeMillis() > expireDate.getTime()) {
......@@ -467,6 +496,52 @@ public class NLShelfHandler extends BaseDeviceHandler {
return ResultBean.newOkResult(posList);
}
/**
* 库位亮灯(1:使用库位亮灯,2:空库位亮灯,3:一键灭灯)
*
* @param request
* @return
*/
@RequestMapping("/service/store/nlShelf/posOnOrOffLights")
@AnonymousAccess
public ResultBean posOnOrOffLights(HttpServletRequest request) {
String cid = request.getParameter("cid");
String type = request.getParameter("type");
//获取设备信息
Storage storage = null;
for (Storage stor : dataCache.getAllStorage().values()) {
if (stor.getCid().equals(cid)) {
storage = stor;
break;
}
}
//查询符合条件的料仓
List<StoragePos> storagePosList = new ArrayList<>();
if ("1".equals(type)) {
storagePosList = storagePosManager.findNotEmptyByStorageId(storage.getId());
} else if ("2".equals(type)) {
storagePosList = storagePosManager.findEmptyByStorageId(storage.getId());
} else if ("3".equals(type)) {
storagePosList = storagePosManager.findByStorage(storage.getId());
}
if (storagePosList == null || storagePosList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.shelf.msg.noPos", "未找到符合条件的库位");
}
if ("1".equals(type) || "2".equals(type)) {
for (StoragePos pos : storagePosList) {
opPosLight("open", pos, ORDER_COLOR.INDIANRED.name());
}
} else if ("3".equals(type)) {
for (StoragePos pos : storagePosList) {
opPosLight("close", pos, "");
}
}
return ResultBean.newOkResult(null);
}
@Override
public DeviceType getDeviceType() {
return DeviceType.NL;
......
......@@ -12,9 +12,11 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.api.listener.ISmfApiListener;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.PosInfo;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
......@@ -24,6 +26,7 @@ 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.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
......@@ -66,6 +69,9 @@ public class DeviceController {
@Autowired
private LizhenApi lizhenApi;
@Autowired
private IBarcodeManager barcodeManager;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList) {
......@@ -164,11 +170,29 @@ public class DeviceController {
try {
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
if(barcode==null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{code});
}
//判断虚拟仓有没有存在,如果有,把虚拟仓库位置空
StoragePos storagePos = storagePosManager.getByBarcode(barcode.getBarcode());
if (storagePos != null) {
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
DataLog dataLog = new DataLog(storage, barcode, storagePos);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setExtendType(ExtendType.VIRTUAL_CHECKOUT); //虚拟出库
taskService.updateFinishedTask(dataLog);
taskService.removeFinishedTask(dataLog);
log.info("智能仓储入库,虚拟仓出库:" + barcode.getBarcode() + ",库位名称为:" + storagePos.getPosName());
storagePos.setBarcode(null);
//dataCache.updateInventory(storagePos, barcode);
barcode.setPosName(null);
barcode = barcodeManager.save(barcode);
//进行库位更改
storagePos.setUsed(false);
storagePosManager.save(storagePos);
}
Barcode barcodeCanPutIn = smfApi.canPutInAfterResolve(barcode);
if (barcodeCanPutIn != null){
barcode = barcodeCanPutIn;
......
......@@ -16,6 +16,7 @@ import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.enums.COMPATIBLE_TYPE;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.OrderSetting;
import com.neotel.smfcore.core.system.service.dao.ICacheItemDao;
......@@ -401,7 +402,7 @@ public class DataCache {
posNameList = new ArrayList<>();
if(storage != null){
log.info("加载["+cid+"]所有已使用库位到缓存");
List<StoragePos> allPos = storagePosManager.findNotEmptyByStorageId(storage.getId());
List<StoragePos> allPos = storagePosManager.findNotEmptyPosNameByStorageId(storage.getId());
for (StoragePos pos : allPos) {
posNameList.add(pos.getPosName());
}
......@@ -452,14 +453,16 @@ public class DataCache {
List<Storage> storages = Lists.newArrayList();
for (Storage storage : allStorages.values()) {
if (storageIds == null || storageIds.contains(storage.getId())) {
storages.add(storage);
if (!storage.isVirtual()) {
storages.add(storage);
}
}
}
Map<String, InventoryItem> map = getInventory(storages);
Map<String, InventoryItem> resultMap = new HashMap<>();
for (InventoryItem item : map.values()) {
if (ObjectUtil.isNotEmpty(blurry)) {
if(item.getPartNumber().contains(blurry)){
if (item.getPartNumber().contains(blurry)) {
resultMap.put(item.getPartNumber(), item);
}
} else {
......@@ -469,6 +472,7 @@ public class DataCache {
return resultMap;
}
/**
* 获取某些料仓的库存信息
*/
......
......@@ -23,6 +23,11 @@ public class LITEORDER_STATUS {
/**工单已关闭*/
public static int CLOSED=7;
/**
* 工单暂停
*/
public static int PAUSE = 8;
/**
* 工单状态
* 0=新建的工单
......@@ -33,5 +38,6 @@ public class LITEORDER_STATUS {
* 5=正在补料
* 6=补料已完成
* 7=工单已关闭
* 8=工单暂停
*/
}
......@@ -171,7 +171,7 @@ public class OrderController {
@ApiOperation("工单出库")
@PostMapping(value = "/out")
@PreAuthorize("@el.check('workOrder')")
public ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
public synchronized ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
......@@ -182,9 +182,8 @@ public class OrderController {
}
String result = "";
String isExcess = mapValues.get("isExcess");
if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,null,isExcess);
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,null);
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
}
......@@ -210,8 +209,8 @@ public class OrderController {
}
String result = "";
if ("out".equals(""/*liteO"rder.getLogo()*/)) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),true,null,"");
if (LITEORDER_SOURCE.OUTTER.equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),true,null);
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), true);
}
......@@ -226,7 +225,7 @@ public class OrderController {
@ApiOperation("尾料出库")
@PostMapping(value = "/outTails")
@PreAuthorize("@el.check('workOrder')")
public ResultBean outTails(@RequestBody Map<String, String> mapValues) {
public synchronized ResultBean outTails(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
String orderItemId = mapValues.get("orderItemId");
List<String> orderItemIds = new ArrayList<>();
......@@ -243,7 +242,7 @@ public class OrderController {
}
String result = "";
if (LITEORDER_SOURCE.OUTTER.name().equals(liteOrder.getSource())) {
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,orderItemIds,"");
result = liteOrderCache.checkOutLiteOrderOut(liteOrder.getOrderNo(),false,orderItemIds);
} else {
result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
}
......@@ -527,6 +526,65 @@ public class OrderController {
return ResultBean.newOkResult("");
}
@ApiOperation("暂停工单")
@RequestMapping("/pauseOrder")
public ResultBean pauseOrder(@RequestBody Map<String, String> paramMap) {
String orderNo = paramMap.get("orderNo");
//根据orderNo得到正在执行的任务
Collection<DataLog> queueTasks = taskService.getQueueTasks();
if (queueTasks != null && !queueTasks.isEmpty()) {
for (DataLog queueTask : queueTasks) {
if (queueTask.isWait()) {
if (orderNo.equals(queueTask.getSourceName())) {
queueTask.setStatus(OP_STATUS.PAUSE.name());
taskService.updateQueueTask(queueTask);
}
}
}
}
//同时更改工单状态为暂停
liteOrderCache.pauseOrder(orderNo);
return ResultBean.newOkResult("");
}
@ApiOperation("工单恢复")
@RequestMapping("/restoreOrder")
public ResultBean restoreOrder(@RequestBody Map<String,String> paramMap) {
String orderNo = paramMap.get("orderNo");
//根据orderNo得到正在执行的任务
Collection<DataLog> queueTasks = taskService.getQueueTasks();
if (queueTasks != null && !queueTasks.isEmpty()) {
for (DataLog queueTask : queueTasks) {
if (queueTask.isPause()) {
if (orderNo.equals(queueTask.getSourceName())) {
queueTask.setStatus(OP_STATUS.WAIT.name());
taskService.updateQueueTask(queueTask);
}
}
}
}
liteOrderCache.restoreOrder(orderNo);
return ResultBean.newOkResult("");
}
@ApiOperation("工单超发")
@RequestMapping("/excessOrder")
public ResultBean excessOrder(@RequestBody Map<String, String> paramMap) {
boolean excess = false;
String orderNo = paramMap.get("orderNo");
String isExcess = paramMap.get("isExcess");
if (StringUtils.isNotBlank(isExcess)) {
excess = Boolean.valueOf(isExcess);
}
String result = liteOrderCache.excessOrder(orderNo, excess);
if (StringUtils.isNotBlank(result)) {
return ResultBean.newErrorResult(-1, result, null);
}
return ResultBean.newOkResult("");
}
public void addVirtualOutToFinished( LiteOrder liteOrder, Barcode barcode,Integer num, String opUser) {
try {
DataLog dataLog = new DataLog();
......
......@@ -92,4 +92,10 @@ public class OrderDto implements Serializable {
@ApiModelProperty("工单优先级")
private int priority = 0;
@ApiModelProperty("是否确认超发")
private boolean confirmExcess = false;
@ApiModelProperty("是否超发")
private boolean isExcess = false;
}
......@@ -70,7 +70,7 @@ public class OrderItemDto {
private String batchCode;
@ApiModelProperty("全部已出盘数")
private String totalOutReelCount;
private int totalOutReelCount;
@ApiModelProperty("厂商")
private String brand;
......@@ -110,4 +110,10 @@ public class OrderItemDto {
@ApiModelProperty("是否缺料")
private boolean isLack = false;
@ApiModelProperty("是否超发")
private boolean isExcess = false;
@ApiModelProperty("厂区")
private String factory;
}
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.order.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
......@@ -9,4 +10,6 @@ public interface ILiteOrderItemManager extends IBaseManager<LiteOrderItem> {
List<LiteOrderItem> findOrderItems(String orderId);
LiteOrderItem getOrderItemByBarcode(String barcode);
int countByQuery(Query q);
}
......@@ -4,6 +4,7 @@ import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
......@@ -14,4 +15,6 @@ public interface ILiteOrderManager extends IBaseManager<LiteOrder> {
List<LiteOrder> findUnEndOrdersList();
LiteOrder findBySource(String source);
List<LiteOrder> findByQueryAndPartNumber(Query q, String partNumber);
}
......@@ -32,6 +32,11 @@ public class LiteOrderItemManagerImpl implements ILiteOrderItemManager {
}
@Override
public int countByQuery(Query q) {
return liteOrderItemDao.countByQuery(q);
}
@Override
public LiteOrderItem get(String id) {
return liteOrderItemDao.findOneById(id);
}
......
......@@ -20,6 +20,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -108,6 +109,34 @@ public class LiteOrderManagerImpl implements ILiteOrderManager {
}
@Override
public List<LiteOrder> findByQueryAndPartNumber(Query q, String partNumber) {
List<LiteOrder> resultOrders = new ArrayList<>();
List<LiteOrder> orders = findByQuery(q);
if (orders != null && !orders.isEmpty()) {
for (LiteOrder order : orders) {
List<LiteOrderItem> resultItems = new ArrayList<>();
List<LiteOrderItem> items = liteOrderItemManager.findOrderItems(order.getId());
if (StringUtils.isNotBlank(partNumber)) {
if (items != null && !items.isEmpty()) {
for (LiteOrderItem item : items) {
if (partNumber.equals(item.getPn())) {
resultItems.add(item);
}
}
}
} else {
resultItems = items;
}
if (resultItems != null && !resultItems.isEmpty()) {
order.setOrderItems(resultItems);
resultOrders.add(order);
}
}
}
return resultOrders;
}
@Override
public PageData<LiteOrder> findByPage(Query query, Pageable pageable) {
int totalCount = liteOrderDao.countByQuery(query);
List<LiteOrder> list = liteOrderDao.findByQuery(query, pageable);
......
......@@ -67,6 +67,12 @@ public class LiteOrder extends BasePo implements Serializable {
*/
private int status = LITEORDER_STATUS.NEW;
/**
* 上一次工单状态
*/
private int lastStatus = LITEORDER_STATUS.NEW;
private boolean closed = false;
......@@ -121,7 +127,12 @@ public class LiteOrder extends BasePo implements Serializable {
/**
* 是否超发
*/
private String isExcess;
private boolean isExcess = false;
/**
* 是否已经确认超发
*/
private boolean confirmExcess = false;
public void setClosed(boolean value){
this.closed=value;
......
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.order.service.po;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -169,6 +170,27 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private boolean isLack = false;
/**
* 缺失数量
*/
private int lackNum = 0;
/**
* 缺失盘数
*/
private int lackReel = 0;
/**
* 是否超发
*/
private boolean isExcess = false;
/**
* 厂区
*/
private String factory;
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
......
......@@ -93,7 +93,6 @@ public class ReportController {
@GetMapping(value = "/inventory")
@PreAuthorize("@el.check('inventory')")
public List<InventoryGroupDto> inventory() {
String userId = SecurityUtils.getCurrentUserId();
User user = userManager.get(userId);
Set<String> mygroups = user.getGroups();
......@@ -145,20 +144,20 @@ public class ReportController {
date = initDate(date, initFormat, format, dayStartTime);
//得到白班的开始与结束时间
Date dayStartDate = DateUtil.addHours(date, -8);
Date dayStartDate = DateUtil.addHours(date, 0);
Date dayEndDate = DateUtil.addHours(dayStartDate, 12);
//得到白班的入库数据
int dayInCount = dataLogManager.getInOutDate(dayStartDate,dayEndDate, OP.PUT_IN,query.getPn());
int dayInCount = dataLogManager.getInOutData(dayStartDate,dayEndDate, OP.PUT_IN,query.getPn(),-1,"");
//得到白班的出库库数据
int dayOutCount = dataLogManager.getInOutDate(dayStartDate,dayEndDate, OP.CHECKOUT,query.getPn());
int dayOutCount = dataLogManager.getInOutData(dayStartDate,dayEndDate, OP.CHECKOUT,query.getPn(),-1,"");
//得到夜班的开始与结束时间
Date nightStartDate = dayEndDate;
Date nightEndDate = DateUtil.addHours(nightStartDate, 12);
//得到夜班班的入库数据
int nightInCount = dataLogManager.getInOutDate(nightStartDate,nightEndDate, OP.PUT_IN,query.getPn());
int nightInCount = dataLogManager.getInOutData(nightStartDate,nightEndDate, OP.PUT_IN,query.getPn(),-1,"");
//得到白班的出库库数据
int nightOutCount = dataLogManager.getInOutDate(nightStartDate,nightEndDate, OP.CHECKOUT,query.getPn());
int nightOutCount = dataLogManager.getInOutData(nightStartDate,nightEndDate, OP.CHECKOUT,query.getPn(),-1,"");
//构造返回数据
List<String> labelList = new ArrayList<>();
......
......@@ -10,7 +10,7 @@ import java.util.Date;
@Data
public class ReportQuery implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
private String pn;
}
......@@ -54,6 +54,12 @@ public class InventoryItem {
*/
private String storageName ;
/**
* 绑定数量
*/
private int bindReel = 0;
public String getPartNumber() {
return partNumber;
}
......
......@@ -324,15 +324,105 @@ public class StorageController {
// 验证文件上传的格式
String image = "csv";
String fileType = FileUtil.getExtensionName(uploadFile.getOriginalFilename());
if(fileType != null && !image.contains(fileType)){
throw new ValidateException("smfcore.feleFormatError","文件格式错误!, 仅支持{0}格式",new String[]{image});
if (fileType != null && !image.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{image});
}
File folder = new File(properties.getPath(),"pos");
File folder = new File(properties.getPath(), "pos");
File file = FileUtil.upload(uploadFile, folder.getAbsolutePath());
String resultMsg = handleStoragePos(file.getAbsolutePath(),storageId);
String resultMsg = "";
Storage storage = dataCache.getStorageById(storageId);
if (!storage.isVirtual()) {
resultMsg = handleStoragePos(file.getAbsolutePath(), storageId);
} else {
//单独处理虚拟仓的
resultMsg = handleVirtualStoragePos(file.getAbsolutePath(),storageId);
}
return ResultBean.newOkResult(resultMsg);
}
private String handleVirtualStoragePos(String fileURL, String storageId) throws IOException {
log.info("开始更新料仓【" + storageId + "】的位置信息");
if (Strings.isNullOrEmpty(storageId)) {
log.error("Storage id is null");
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"storageId"});
}
Storage storage = storageManager.get(storageId);
if (storage == null) {
log.error("Storage id is not exist");
throw new ValidateException("smfcore.storage.error.notExist", "未找到料仓{0}", new String[]{storageId});
}
CsvReader csvRead = CsvReader.newReader(fileURL, "位置", "pos");
int posIndex = csvRead.getCsvIndex("位置", "pos");
//int priIndex = csvRead.getCsvIndex("优先级", "pri");
//int hIndex = csvRead.getCsvIndex("高度", "h");
//int wIndex = csvRead.getCsvIndex("宽度", "w");
int pnIndex = csvRead.getCsvIndex("料号", "pn");
int row = 1;
int newRowCount = 0;
int existRowCount = 0;
int updateRowCount = 0;
List<StoragePos> storagePosList = storagePosManager.findByStorage(storage.getId());
List<StoragePos> newList = new ArrayList<>();
while (csvRead.readRecord()) {
row++;
String[] lineValues = csvRead.getValues();
String posName = lineValues[posIndex];
Integer priority = 0;
Integer height = 0;
Integer width = 0;
String partNumber = "";
try {
//priority = Integer.parseInt(lineValues[priIndex]);
//height = Integer.parseInt(lineValues[hIndex]);
//width = Integer.parseInt(lineValues[wIndex]);
partNumber = String.valueOf(lineValues[pnIndex]);
} catch (Exception ex) {
log.warn("第" + row + "行中有空白内容,此行忽略");
continue;
}
if (posName.isEmpty()) {
log.warn("第" + row + "行中有空白内容,此行忽略");
continue;
}
// StoragePos posInfo = storagePosManager.getByPosName(posName);
StoragePos posInfo = findFormList(storagePosList, posName);
if (posInfo == null) {
posInfo = new StoragePos(storageId, posName, height, width, priority);
posInfo.setPartNumber(partNumber);
posInfo.setShowStatus(0 + "");
newRowCount++;
newList.add(posInfo);
} else {
//boolean needUpdate = posInfo.updatePosInfo(storageId, posName, height, width, priority);
boolean needUpdate = false;
if (!partNumber.equals(posInfo.getPartNumber())) {
posInfo.setPartNumber(partNumber);
needUpdate = true;
}
if (needUpdate) {
updateRowCount++;
posInfo.setShowStatus(0 + "");
storagePosManager.save(posInfo);
} else {
existRowCount++;
}
}
}
if (newList.size() > 0) {
storagePosManager.insertAll(newList);
}
dataCache.reloadStorage(storage, "");
String msg = "读取到[" + row + "]行数据:新增【" + newRowCount + "】,已存在【" + existRowCount + "】,更新【" + updateRowCount + "】";
log.info(msg);
return msg;
}
@ApiOperation("下载库位模板")
@GetMapping(value = "/downloadPosModel")
......@@ -354,6 +444,7 @@ public class StorageController {
titles.add("pri");
titles.add(("h"));
titles.add("w");
titles.add("pn");
for(int i=1;i<=10;i++) {
Map<String, Object> map = new LinkedHashMap<>();
......@@ -362,6 +453,7 @@ public class StorageController {
map.put("pri", i);
map.put("h", 8);
map.put("w", 7);
map.put("pn","虚拟仓填写料号");
maps.add(map);
}
......
......@@ -107,8 +107,8 @@ public class StoragePosController {
blurry = blurry.substring(blurry.indexOf("-")+1);
criteria.setBlurry(blurry);
}
Query query = QueryHelp.getQuery(criteria);
//query.addCriteria(Criteria.where("showStatus").ne("0").exists(false));
PageData<StoragePos> pages = storagePosManager.findByPage(query, pageable);
List<StoragePosDto> StoragePosDtos = storagePosMapper.toDto(pages.getContent());
......@@ -359,7 +359,7 @@ public class StoragePosController {
@ApiOperation("根据条件查找出库")
@GetMapping("/out")
@AnonymousAccess
public ResultBean storagePosFind(StoragePosFindCriteria criteria) {
public synchronized ResultBean storagePosFind(StoragePosFindCriteria criteria) {
//判断查询条件是否为空
String provider = criteria.getProvider();
String batch = criteria.getBatch();
......@@ -382,6 +382,8 @@ public class StoragePosController {
Query query = getPosFindCriteria(criteria);
List<StoragePos> storagePoss = storagePosManager.findByQuery(query);
//判断是否有出库任务
boolean hasOutReel = false;
if (storagePoss != null && !storagePoss.isEmpty()) {
String selectMsg = getSelectMsg(partNumber, provider, batch, dateCode);
for (StoragePos pos : storagePoss) {
......@@ -398,48 +400,55 @@ public class StoragePosController {
log.info("库位:" + pos.getPosName() + "正在执行,跳过");
continue;
}
//判断是否有出库任务
boolean hasOutReel = false;
hasOutReel = true;
List<Barcode> subCodeList = pidBarcode.getSubCodeList();
for (Barcode barcode : subCodeList) {
if (barcode.isOut()){
continue;
}
List<String> partNumberList = criteria.getPartNumberList();
if (partNumberList != null && !partNumberList.isEmpty()) {
if (!partNumberList.contains(barcode.getPartNumber())) {
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode barcode : subCodeList) {
if (barcode.isOut()) {
continue;
}
}
if (StringUtils.isNotBlank(provider)) {
if (!barcode.getProvider().equals(provider)) {
continue;
List<String> partNumberList = criteria.getPartNumberList();
if (partNumberList != null && !partNumberList.isEmpty()) {
boolean hasCont = false;
for (String pn : partNumberList) {
if (barcode.getPartNumber().startsWith(pn)){
hasCont = true;
break;
}
}
if (!hasCont){
continue;
}
}
}
List<String> batchList = criteria.getBatchList();
if (batchList != null && !batchList.isEmpty()) {
if (!batchList.contains(barcode.getBatch())) {
continue;
if (StringUtils.isNotBlank(provider)) {
if (!barcode.getProvider().equals(provider)) {
continue;
}
}
}
List<String> dateCodeList = criteria.getDateCodeList();
if (dateCodeList != null && !dateCodeList.isEmpty()) {
if (!dateCodeList.contains(barcode.getDateCode())) {
continue;
List<String> batchList = criteria.getBatchList();
if (batchList != null && !batchList.isEmpty()) {
if (!batchList.contains(barcode.getBatch())) {
continue;
}
}
}
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(barcode.getWarehouseCode())) {
continue;
List<String> dateCodeList = criteria.getDateCodeList();
if (dateCodeList != null && !dateCodeList.isEmpty()) {
if (!dateCodeList.contains(barcode.getDateCode())) {
continue;
}
}
if (StringUtils.isNotBlank(warehouseCode)) {
if (!warehouseCode.equals(barcode.getWarehouseCode())) {
continue;
}
}
barcode.setOut(true);
barcode.setSelectMsg(selectMsg);
//保存信息
barcode = barcodeManager.save(barcode);
pidBarcode.UpdateSubCode(barcode);
barcodeManager.saveBarcode(pidBarcode);
}
barcode.setOut(true);
barcode.setSelectMsg(selectMsg);
//保存信息
barcode = barcodeManager.save(barcode);
pidBarcode.UpdateSubCode(barcode);
barcodeManager.saveBarcode(pidBarcode);
hasOutReel = true;
}
if (hasOutReel) {
......@@ -454,10 +463,13 @@ public class StoragePosController {
task.setLoc(stationName);
}
task.setBoxPosName(pos.getPosName());
taskService.addTaskToExecute(task);
//task.setPosId(pos.getId());
taskService.updateQueueTask(task);
}
}
return ResultBean.newOkResult("");
if (hasOutReel) {
return ResultBean.newOkResult("");
}
}
return ResultBean.newErrorResult(-1, "", "未找到可以出库的物料");
}
......
......@@ -69,5 +69,17 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
StoragePos getEmptyPosByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String lastPosId,String logo) throws ValidateException;
StoragePos findPartNumberInStorages(List<String> availableStorageIds, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType, String warehouseCode, String brand);
StoragePos findPartNumberInStorages(List<String> availableStorageIds, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType, String warehouseCode, String brand,boolean isOut);
StoragePos findOne(Query query);
List<StoragePos> findNotEmptyPosNameByStorageId(String storageId);
StoragePos findOneEmptyPosNameByStorageId(String storageId,String posName);
List<StoragePos> findEmptyByStorageId(String storageId);
List<StoragePos> findNotEmptyPosName();
StoragePos getPosNameByPnAndStrId(String partNumber,String storageId);
}
......@@ -81,16 +81,16 @@ public class StorageManagerImpl implements IStorageManager {
*/
@Override
public List<ChartItem> getRunStatusData(Date fromDate, Date toDate, String partNumber){
if(fromDate == null || toDate == null){
/*if(fromDate == null || toDate == null){
return new ArrayList<>();
}
LinkedHashMap<String,ChartItem> inOutDataMap = new LinkedHashMap<>();
Date startDay = DateUtil.getMinDate(fromDate, toDate);
Date endDay = DateUtil.getMaxDate(fromDate,toDate);
/**
*//**
* 结束时间+1天,包含结束那一天
*/
*//*
long endTime = endDay.getTime();
Calendar c = Calendar.getInstance();
c.setTime(startDay);
......@@ -121,7 +121,7 @@ public class StorageManagerImpl implements IStorageManager {
if(item != null){
item.setCheckOutValue(checkOutItem.getValue());
}
}
}*/
// List<ChartItem> alarmData = alarmInfoDao.alarmChart(startDay, endDay);
// for (ChartItem alarmItem : alarmData){
......@@ -143,6 +143,6 @@ public class StorageManagerImpl implements IStorageManager {
// }
//alarmInfoDao.alarmChartByType(startDay,endDay);
//alarmInfoDao.alarmChartByBox(startDay,endDay);
return new ArrayList<>(inOutDataMap.values());
return new ArrayList<>(/*inOutDataMap.values()*/);
}
}
......@@ -41,6 +41,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Autowired
private IStoragePosDao storagePosDao;
/*@Autowired
private DataCache dataCache;
*/
@Override
public List<PlateSizeBean> getStoragePosUsage(String storageId){
Aggregation agg = Aggregation.newAggregation(
......@@ -128,10 +131,60 @@ public class StoragePosManagerImpl implements IStoragePosManager {
inventoryMap.put(partNumber,inventoryItem);
}
//获取agv类型的库存
Map<String,InventoryItem> agvInventory = getAgvBoxInventory(storageIds);
if (agvInventory != null && agvInventory.size() >0){
inventoryMap.putAll(agvInventory);
}
return inventoryMap;
}
/**
* 得到agvBox存储信息
* @param storageIds
* @return
*/
private Map<String, InventoryItem> getAgvBoxInventory(String...storageIds) {
Map<String, InventoryItem> resultMap = new HashMap<>();
for (String storageId : storageIds) {
/*Storage storage = dataCache.getStorageById(storageId);
if (!storage.isType(new DeviceType[]{DeviceType.AGV_BOX})) {
continue;
}*/
List<StoragePos> storagePoss = findNotEmptyByStorageId(storageId);
//开始循环处理
if (storagePoss != null && !storagePoss.isEmpty()) {
for (StoragePos pos : storagePoss) {
List<Barcode> subCodeList = pos.getBarcode().getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode barcode : subCodeList) {
InventoryItem item = resultMap.get(barcode.getPartNumber());
if (item != null) {
item.setStockReel(item.getStockReel() + 1);
item.setStockCount(item.getStockCount() + barcode.getAmount());
} else {
item = new InventoryItem();
item.setPartNumber(barcode.getPartNumber());
item.setStockCount(barcode.getAmount());
item.setStockReel(1);
}
resultMap.put(barcode.getPartNumber(), item);
}
}
}
}
}
return resultMap;
}
/**
* 统计多少个小时内即将过期的物料(inHours 为0表示截止到目前已经过期的,为1表示1个小时后过期,但现在还没过期的)
* @param storageIds
......@@ -240,10 +293,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
query.with(Sort.by(Sort.Direction.ASC, "updateDate"));
//query.with(Sort.by(Sort.Direction.ASC, "updateDate"));
return storagePosDao.findByQuery(query);
}
@Override
public List<StoragePos> findLockPos(String lockId) {
Criteria c = Criteria.where("barcode.lockId").is(lockId);
......@@ -280,10 +334,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
@Override
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand) {
Criteria c = Criteria.where("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
public StoragePos findPartNumberInStorages(List<String> storageIdList, String pn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType, String warehouseCode, String brand, boolean isOut) {
Criteria c = Criteria.where("id").nin(excludePosIds);
// .and("enabled").is(true)//可用//.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
......@@ -296,6 +349,9 @@ public class StoragePosManagerImpl implements IStoragePosManager {
if (ObjectUtil.isNotEmpty(pn)) {
c.and("barcode.subCodeList.partNumber").is(pn);
}
if (isOut){
c.and("barcode.subCodeList.isOut").is(isOut);
}
Sort sort = getSortByCheckOutType(checkOutType);
Query q = new Query(c);
q.with(sort);
......@@ -308,6 +364,52 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return pos;
}
@Override
public StoragePos findOne(Query query) {
return storagePosDao.findOne(query);
}
@Override
public List<StoragePos> findNotEmptyPosNameByStorageId(String storageId) {
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
if(!Strings.isNullOrEmpty(storageId)){
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
query.fields().include("posName").exclude("id");
return storagePosDao.findByQuery(query);
}
@Override
public StoragePos findOneEmptyPosNameByStorageId(String storageId,String posName) {
Criteria c = Criteria.where("barcode").exists(false)
.and("enabled").is(true);//可用;
if (!Strings.isNullOrEmpty(storageId)) {
c = c.and("storageId").is(storageId);
}
if (!Strings.isNullOrEmpty(posName)) {
Pattern pattern = Pattern.compile(QueryHelp.escapeExprSpecialWord(posName), Pattern.CASE_INSENSITIVE);
c = c.and("posName").regex(pattern);
}
c.and("partNumber").exists(false);
Query query = new Query(c);
return storagePosDao.findOne(query);
}
@Override
public List<StoragePos> findEmptyByStorageId(String storageId){
Criteria c = Criteria.where("barcode").exists(false)
.and("enabled").is(true);//可用;
if(!Strings.isNullOrEmpty(storageId)){
c = c.and("storageId").is(storageId);
}
Query query = new Query(c);
//query.with(Sort.by(Sort.Direction.ASC, "updateDate"));
return storagePosDao.findByQuery(query);
}
/**
* 根据出库方式获取不同的 Sort
*/
......@@ -666,5 +768,16 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return prefixStr +String.format("%0"+posIndexStr.length()+"d",nextPosIndex);
}
public List<StoragePos> findNotEmptyPosName(){
Criteria c = Criteria.where("barcode").exists(true)
.and("enabled").is(true);//可用;
Query query = new Query(c);
query.fields().include("posName").include("storageId").include("barcode.barcode").include("barcode.subCodeList.posName");
return storagePosDao.findByQuery(query);
}
@Override
public StoragePos getPosNameByPnAndStrId(String partNumber,String storageId) {
return storagePosDao.findOne(new Query(Criteria.where("partNumber").is(partNumber).and("storageId").is(storageId)));
}
}
......@@ -117,6 +117,17 @@ public class StoragePos extends BasePo implements Serializable {
private List<String> mergePosList;
/**
* 1:展示 0:不展示
*/
private String showStatus;
/**
* 虚拟仓对应料号
*/
private String partNumber;
public String getLabelStr(){
String posNameLabel = posName;
int index = posNameLabel.lastIndexOf(":");
......
......@@ -15,6 +15,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
......@@ -36,7 +37,7 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
}
private List<ChartItem> chart(Date fromTime, Date toTime, int type, String partNumber){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
/* Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type);
c.and("status").in(OP_STATUS.END.name(),OP_STATUS.FINISHED.name());
......@@ -50,7 +51,8 @@ public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
Aggregation.project("value").and("label").previousOperation()
);
AggregationResults<ChartItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), ChartItem.class);
return results.getMappedResults();
return results.getMappedResults();*/
return new ArrayList<>();
}
@Override
......
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.system.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import org.springframework.data.domain.Pageable;
import java.util.Date;
import java.util.List;
......@@ -9,5 +10,9 @@ import java.util.List;
public interface IDataLogManager extends IBaseManager<DataLog> {
List<DataLog> findUnFinishedTasks();
int getInOutDate(Date startDate, Date endDate, int type, String partNumber);
int getInOutData(Date startDate, Date endDate, int type, String partNumber,int extendType,String storageId);
List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable);
int getInOutData(Date startDate, Date endDate, int type,String stationName);
}
......@@ -2,10 +2,14 @@ package com.neotel.smfcore.core.system.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
......@@ -17,7 +21,9 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
@Slf4j
@Service
public class DataLogManagerImpl implements IDataLogManager {
......@@ -54,7 +60,7 @@ public class DataLogManagerImpl implements IDataLogManager {
@Override
public List<DataLog> findUnFinishedTasks( ) {
Criteria c = Criteria.where("status").nin(OP_STATUS.FINISHED.name(),OP_STATUS.CANCEL.name());
//只查找近12个小时未完成的任务
//只查找近48个小时未完成的任务
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY,-48);
c.and("updateDate").gte(calendar.getTime());
......@@ -67,7 +73,7 @@ public class DataLogManagerImpl implements IDataLogManager {
}
@Override
public int getInOutDate(Date startDate, Date endDate, int type, String partNumber) {
public int getInOutData(Date startDate, Date endDate, int type, String partNumber,int extendType,String storageId) {
Query query = new Query();
Criteria criteria = new Criteria().andOperator(Criteria.where("updateDate").gte(startDate),
Criteria.where("updateDate").lt(endDate)).and("type").is(type);
......@@ -75,6 +81,39 @@ public class DataLogManagerImpl implements IDataLogManager {
if (Strings.isNotBlank(partNumber)) {
criteria.and("partNumber").is(partNumber);
}
if (-1 != extendType){
criteria.and("extendType").is(extendType);
}
if (Strings.isNotBlank(storageId)){
criteria.and("storageId").is(storageId);
}
return dataLogDao.countByQuery(query.addCriteria(criteria));
}
@Override
public List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable) {
Criteria c = new Criteria();
if (StringUtils.isNotBlank(orderNo)) {
c.and("orderNo").is(orderNo);
}
if (StringUtils.isNotBlank(line)) {
Pattern p = Pattern.compile(QueryHelp.escapeExprSpecialWord(line), Pattern.CASE_INSENSITIVE);
c.and("line").regex(p);
}
PageData<DataLog> data = findByPage(new Query(c), pageable);
//log.info("orderNo:"+orderNo+",line:"+line+",数量为:"+data.getTotalElements());
return data.getContent();
}
@Override
public int getInOutData(Date startDate, Date endDate, int type, String stationName) {
Query query = new Query();
Criteria criteria = new Criteria().andOperator(Criteria.where("updateDate").gte(startDate),
Criteria.where("updateDate").lt(endDate)).and("type").is(type);
criteria.and("status").in(OP_STATUS.END.name(), OP_STATUS.FINISHED.name());
if (Strings.isNotBlank(stationName)) {
criteria.and("stationName").is(stationName);
}
return dataLogDao.countByQuery(query.addCriteria(criteria));
}
}
......@@ -235,6 +235,7 @@ public class DataLog extends BasePo implements Serializable {
*/
private String warehouseCode;
/**
* 厂别
*/
......@@ -270,16 +271,57 @@ public class DataLog extends BasePo implements Serializable {
*/
private String boxPosName;
/**
* 机器名称
*/
private String machineName;
/**
* 段别
*/
private String slot;
/**
* 站别
*/
private String subSlot;
/**
* 台车号
*/
private String tableNo = "";
/**
* 隔口数量
* 异动类型
*/
private int partitionCount = 0;
private String changeType;
/**
* 厂区
*/
private String factory;
/**
* 储位
*/
private String storagePosName;
/**
* 工位名称
*/
private String stationName;
/**
* MSD附加信息
*/
private MSDAppendInfo msdAppendInfo;
/**
* 出库类型(手动喂料,清空库位,智能仓储出库,手动出库,虚拟仓入库,虚拟仓出库,智能仓储入库)
*/
private int extendType;
public String getBarcode() {
if(barcode == null){
return "";
......@@ -325,6 +367,10 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.END.name().equals(status);
}
public boolean isPause(){
return OP_STATUS.PAUSE.name().equals(status);
}
public boolean isTaskInStatus(OP_STATUS taskStatus){
return taskStatus.name().equals(status);
}
......
......@@ -29,6 +29,7 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -67,7 +68,10 @@ public class TaskService {
*/
private static Map<String, DataLog> theFinishedTaskMap = Maps.newConcurrentMap();
private static String posLogo = "";
/**
* key为料仓cid,value为A/B面
*/
private static Map<String,String> posSideMap = Maps.newConcurrentMap();
// public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) {
......@@ -83,7 +87,7 @@ public class TaskService {
DataLog task = new DataLog(storage, barcode, storagePos);
task.setType(OP.PUT_IN);
task.setStatus(OP_STATUS.EXECUTING.name());
task.setExtendType(ExtendType.STORAGE_PUTIN); //智能仓储入库
if(barcode!=null){
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
......@@ -133,10 +137,10 @@ public class TaskService {
// return "";
}
Barcode barcode = pos.getBarcode();
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
task.setPutInDate(barcode.getPutInDate());
task.setSingleOut(isSingleOut);
task.setOperator(opUserName);
task.setStorageId(storage.getId());
......@@ -144,7 +148,13 @@ public class TaskService {
task.setLoc(stationName);
}
task.setBoxPosName(pos.getPosName());
addTaskToExecute(task);
/*if (barcode.getBarcode().startsWith("CS") || barcode.getBarcode().startsWith("CM") || barcode.getBarcode().startsWith("CB")){
task.setStatus(OP_STATUS.FINISHED.name());
addTaskToFinished(pos,barcode,SecurityUtils.getCurrentUsername());
} else {*/
task.setStatus(OP_STATUS.WAIT.name());
addTaskToExecute(task);
//}
return "";
}
......@@ -688,27 +698,33 @@ public class TaskService {
for (Storage storage : availbleStorageList) {
try {
String posSide = "";
Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
StoragePos pos = null;
if (storage.isType(new DeviceType[]{DeviceType.SMD_XLR})) {
if (StringUtils.isNotBlank(posLogo)) {
if ("AA".equals(posLogo)) {
posLogo = "BB";
//根据cid获取下一个放入的面别
String side = posSideMap.get(storage.getCid());
if (side != null) {
if ("AA".equals(side)) {
posSide = "BB";
} else {
posLogo = "AA";
posSide = "AA";
}
posSideMap.put(storage.getCid(),posSide);
} else {
posLogo = "AA";
posSide = "AA";
posSideMap.put(storage.getCid(),posSide);
}
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posLogo);
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posSide);
if (pos == null) {
if ("AA".equals(posLogo)) {
posLogo = "BB";
if ("AA".equals(posSide)) {
posSide = "BB";
} else {
posLogo = "AA";
posSide = "AA";
}
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posLogo);
posSideMap.put(storage.getCid(),posSide);
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId, posSide);
}
} else {
pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId);
......@@ -801,6 +817,9 @@ public class TaskService {
if (pos.getBarcode() != null) {
//barcode = pos.getBarcode();
barcode = barcodeManager.findByBarcode(pos.getBarcode().getBarcode());
if (barcode == null){
barcode = pos.getBarcode();
}
for (DataLog task : allTasks) {
if (task.isCheckOutTask()) {
String executeBarcode = task.getBarcode();
......@@ -858,6 +877,9 @@ public class TaskService {
} else {
//barcode = pos.getBarcode();
barcode = barcodeManager.findByBarcode(pos.getBarcode().getBarcode());
if (barcode == null){
barcode = pos.getBarcode();
}
log.info(opUser + "将【" + barcode.getBarcode() + "】从【" + pos.getPosName() + "】出库");
task.setType(OP.CHECKOUT);
barcode.setUsed(true);
......@@ -877,7 +899,7 @@ public class TaskService {
task.setOperator(opUser);
task.setStatus(OP_STATUS.FINISHED.name());
task.setExtendType(ExtendType.CLEAR_POS); //手动清空库位
updateFinishedTask(task);
} catch (Exception e) {
......@@ -968,7 +990,13 @@ public class TaskService {
public synchronized void tacticsCheckOut(Set<TacticsOutDto> tacticsOutDtos) {
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
//List<String> availableStorageIds = dataCache.getAvailableStorageIds();
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
if (!storage.isVirtual()) {
availableStorageIds.add(storage.getId());
}
}
//其他出库模式一次性全部生成任务
......@@ -993,6 +1021,7 @@ public class TaskService {
log.info("策略出库,PN[" + item.getPartNumber() + "]第[" + i + "]盘, 出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos);
task.setType(OP.CHECKOUT);
task.setExtendType(ExtendType.MANUAL_CHECKOUT); //手动出库
task.setOperator(SecurityUtils.getCurrentUsername());
task.setSingleOut(true);
task.setSourceId(null);
......
......@@ -15,6 +15,8 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
......@@ -53,6 +55,9 @@ public class LizhenApi extends DefaultSmfApiListener {
@Value("${api.werks}")
private String werks;
@Value("${api.outNotifyUrlPK}")
private String outNotifyUrlPK = "";
@PostConstruct
public void init(){
......@@ -61,6 +66,7 @@ public class LizhenApi extends DefaultSmfApiListener {
plant = dataCache.getConfigCache("plant",plant);
barcodeInfoUrl = dataCache.getConfigCache("barcodeInfoUrl",barcodeInfoUrl);
werks = dataCache.getConfigCache("werks",werks);
outNotifyUrlPK = dataCache.getConfigCache("api.outNotifyUrlPK",outNotifyUrlPK);
}
/**
......@@ -145,6 +151,9 @@ public class LizhenApi extends DefaultSmfApiListener {
* @return
*/
public Barcode barcodeInfo(Barcode barcode) {
if (barcodeInfoUrl == null){
return null;
}
log.info("获取MES物料数量入参为:" + barcode.getBarcode());
try {
String result = HttpHelper.postJson(barcodeInfoUrl, barcode.getBarcode());
......@@ -231,7 +240,7 @@ public class LizhenApi extends DefaultSmfApiListener {
}
if (StringUtils.isNotBlank(resultStr)) {
throw new ValidateException("smfcore.mesApi.inCheck.ng", "MES验证失败:" + barcode.getBarcode() + "验证失败:" + resultStr);
throw new ValidateException("smfcore.mesApi.inCheck.ng", /*"MES验证失败:" + */barcode.getBarcode() + "验证失败:" + resultStr);
}
return barcode;
}
......@@ -245,6 +254,9 @@ public class LizhenApi extends DefaultSmfApiListener {
*/
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if (!task.isFinished()){
return;
}
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", "");
dataMap.put("wo", "");
......@@ -258,6 +270,7 @@ public class LizhenApi extends DefaultSmfApiListener {
dataMap.put("lot", barcode.getBatch());
dataMap.put("vendor", barcode.getProvider());
dataMap.put("batch", "");
dataMap.put("vendorcode",barcode.getProviderNumber());
}
dataMap.put("werks",werks);
dataMap.put("reelid","");
......@@ -287,30 +300,57 @@ public class LizhenApi extends DefaultSmfApiListener {
return;
}
if (!task.isFinished()) {
return;
}
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", "");
if (StringUtils.isNotBlank(task.getSourceName())) {
dataMap.put("pickingid", task.getSourceName());
outNotifyUrl = outNotifyUrlPK;
log.info("出库pk不为空:"+outNotifyUrl);
}
dataMap.put("wo", "");
dataMap.put("reelno", task.getBarcode());
dataMap.put("ipn", task.getPartNumber());
dataMap.put("qty", task.getNum());
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
if (barcode != null) {
dataMap.put("qty", barcode.getAmount());
dataMap.put("datecode", barcode.getDateCode());
dataMap.put("lot", barcode.getBatch());
dataMap.put("vendor", barcode.getProvider());
dataMap.put("batch", "");
dataMap.put("vendorcode",barcode.getProviderNumber());
}
dataMap.put("werks",werks);
dataMap.put("reelid","");
String param = JsonUtil.toJsonStr(Arrays.asList(dataMap));
log.info("保存物料入参为:" + param);
try {
String result = HttpHelper.postJson(outNotifyUrl, Arrays.asList(dataMap));
log.info("保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(barcode.getBarcode()+"保存物料异常:"+e.getMessage());
dataMap.put("werks", werks);
dataMap.put("reelid", "");
if (outNotifyUrl == outNotifyUrlPK) {
List<Map<String, Object>> paramList = new ArrayList();
paramList.add(dataMap);
JSONObject jsonObject = new JSONObject();
jsonObject.put("data",paramList);
String param = JsonUtil.toJsonStr(jsonObject);
log.info("保存物料入参为:" + param + "地址为:" + outNotifyUrl);
try {
String result = HttpHelper.postJson(outNotifyUrl, jsonObject);
log.info("保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(barcode.getBarcode() + "保存物料异常:" + e.getMessage());
}
} else {
String param = JsonUtil.toJsonStr(Arrays.asList(dataMap));
log.info("保存物料入参为:" + param + "地址为:" + outNotifyUrl);
try {
String result = HttpHelper.postJson(outNotifyUrl, Arrays.asList(dataMap));
log.info("保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(barcode.getBarcode() + "保存物料异常:" + e.getMessage());
}
}
}
......
......@@ -205,7 +205,7 @@ public class LizhenController {
item.setSubslot(data.get("SUBSLOT"));
item.setPartnumber(data.get("PARTNUMBER"));
item.setLine(data.get("LINE"));
item.setId(data.get("ID"));
item.setItemId(data.get("ID"));
item.setPriority(Integer.valueOf(data.get("PRIORITY")));
PreWarningItemCache.addItems(Arrays.asList(item));
return ResultBean.newOkResult("");
......
package com.neotel.smfcore.custom.lizhen;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequestMapping("/exp")
@RestController
public class OrderExpRestController {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private ILiteOrderManager orderManager;
@Autowired
private IStoragePosManager storagePosManager;
@RequestMapping("/orderExp")
@AnonymousAccess
public ResultBean order(String orderNo) {
LiteOrder liteOrder = orderManager.findByOrderNo(orderNo);
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
//开始处理数据
for (LiteOrderItem orderItem : orderItems) {
//根据工单查找item
Query query = new Query(Criteria.where("orderItemId").is(orderItem.getId()));
List<Barcode> barcodes = barcodeManager.findByQuery(query);
int count = 0;
if (barcodes != null && !barcodes.isEmpty()) {
for (Barcode barcode : barcodes) {
barcode.setOut(false);
barcode.setOrderItemId(null);
barcode.setSelectMsg(null);
barcodeManager.save(barcode);
count++;
System.out.println("修改barcode数量为:" + count);
}
}
}
//开始处理料箱数据
for (LiteOrderItem orderItem : orderItems) {
Query query = new Query(Criteria.where("subCodeList.orderItemId").is(orderItem.getId()));
List<Barcode> barcodes = barcodeManager.findByQuery(query);
int count = 0;
for (Barcode barcode : barcodes) {
List<Barcode> subCodeList = barcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
subCode.setOut(false);
subCode.setOrderItemId(null);
subCode.setSelectMsg(null);
}
barcode.setSubCodeList(subCodeList);
barcodeManager.save(barcode);
count++;
System.out.println("修改barcode数量为:" + count);
}
}
//开始处理料cang
for (LiteOrderItem orderItem : orderItems) {
Query query = new Query(Criteria.where("barcode.subCodeList.orderItemId").is(orderItem.getId()));
List<StoragePos> storagePosList = storagePosManager.findByQuery(query);
int count = 0;
for (StoragePos storagePos : storagePosList) {
Barcode barcode = storagePos.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
subCode.setOut(false);
subCode.setOrderItemId(null);
subCode.setSelectMsg(null);
}
barcode.setSubCodeList(subCodeList);
storagePos.setBarcode(barcode);
storagePosManager.save(storagePos);
count++;
System.out.println("修改库位数量为:" + count);
}
}
//再补一刀
List<Barcode> barcodeList = barcodeManager.findByQuery(new Query(Criteria.where("isOut").is(true)));
if (barcodeList != null && !barcodeList.isEmpty()){
for (Barcode barcode : barcodeList) {
barcode.setOut(false);
barcode.setOrderItemId(null);
barcode.setSelectMsg(null);
barcodeManager.save(barcode);
}
}
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.enums;
/**
* 异动类型
*/
public enum CHANGE_TYPE {
PICKING_DETAIL("PK发料"),
GR_PUTIN("GR入库"),
MANUAL_PUTIN("手动入库"),
MANUAL_CHECKOUT("手动出库"),
TASK_CANNEL("任务取消"),
VIRTUAL_PICKING_DETAIL("虚拟仓PK发料"),
VIRTUAL_CHECKOUT("虚拟仓出库");
private final String name;
CHANGE_TYPE(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.enums;
/*
出入库类型
*/
public enum INOUT_TYPE {
/**
* 单盘入库
*/
IN_ONE,
/**
* 整箱入库
*/
IN_BOX,
/**
* 单盘出库
*/
OUT_ONE,
/**
* 隔口出库
*/
OUT_PARTITION,
/**
* 整箱出库
*/
OUT_BOX,
/**
* 单盘取消
*/
CANCEL_ONE
}
package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 外仓外部接口控制类
*/
@RestController
@RequestMapping("/ext")
public class OutWarehouseExtController {
@Autowired
private IDataLogManager dataLogManager;
@RequestMapping("/getDatalogs")
@AnonymousAccess
public List<DataLog> getDatalogs(String orderNo, String line, Pageable pageable) {
List<DataLog> dataLogs = dataLogManager.getDatalogs(orderNo, line, pageable);
return dataLogs;
}
}
package com.neotel.smfcore.custom.lizhen.agvBox.rest;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
......@@ -11,14 +15,18 @@ import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import javax.annotation.PostConstruct;
import java.util.*;
@RestController
@Slf4j
@RequestMapping("/task")
public class TaskRestController {
@Autowired
......@@ -33,6 +41,65 @@ public class TaskRestController {
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private IBarcodeManager barcodeManager;
/**
* 初始化putInDate
*/
@PostConstruct
public void initPutInDate() {
Criteria c = Criteria.where("putInTime").is(-1);
List<Barcode> barcodeList = barcodeManager.findByQuery(new Query(c));
for (Barcode barcode : barcodeList) {
Date date = new Date();
barcode.setPutInTime(date.getTime());
barcode.setPutInDate(date);
barcodeManager.save(barcode);
}
}
@AnonymousAccess
@RequestMapping("/getOutBarcodeByPkId")
public ResultBean getOutBarcodeByPkId(String pkId) {
List<Map<String,String>> results = new ArrayList<>();
List<LiteOrderItem> orderItems = liteOrderItemManager.findByQuery(new Query(Criteria.where("orderNo").is(pkId)));
if (orderItems != null && !orderItems.isEmpty()) {
List<String> itemIds = new ArrayList<>();
for (LiteOrderItem orderItem : orderItems) {
itemIds.add(orderItem.getId());
}
Query query = new Query(Criteria.where("isOut").is(true).and("orderItemId").in(itemIds));
List<Barcode> barcodes = barcodeManager.findByQuery(query);
for (Barcode barcode : barcodes) {
Map<String,String> resultMap = new HashMap<>();
resultMap.put("唯一码",barcode.getBarcode());
resultMap.put("隔口码",barcode.getPosName());
results.add(resultMap);
}
}
return ResultBean.newOkResult(results);
}
/*@RequestMapping("/test")
@AnonymousAccess
public List<DataLog> getDataLogs(@RequestBody Map<String,String> paramMap){
String barcodeStr = paramMap.get("barcodeStr");
dataLogManager.findByQuery(new Query(Criteria.where("").is()))
}
*/
@RequestMapping("/putIn")
@AnonymousAccess
......
package com.neotel.smfcore.custom.lizhen.innerBox.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
import java.util.Date;
......@@ -10,7 +11,7 @@ import java.util.Date;
* @date 2022/10/9 3:21 PM
*/
@Data
public class PreWarningItem {
public class PreWarningItem extends BasePo {
//{"id":"7527248","workorderno":"030000113197","line":"A05-5FARF-06","machinename":"NPM1",
// "station":"3_2","side":"B","slot":"5","subslot":"L","partnumber":"128S00105",
......@@ -26,7 +27,7 @@ public class PreWarningItem {
private String slot;
private String subslot;
private String partnumber;
private String id;
private String itemId;
/**
* 优先级,1:人工 0:机器
......
package com.neotel.smfcore.custom.lizhen.innerBox.enums;
/**
* 出库类型
*/
public class ExtendType {
/**
* 智能仓储入库
*/
public final static int STORAGE_PUTIN = 0;
/**
* 智能仓储出库
*/
public final static int STORAGE_CHECKOUT = 1;
/**
* 虚拟仓入库
*/
public final static int VIRTUAL_PUTIN = 2;
/**
* 虚拟仓出库
*/
public final static int VIRTUAL_CHECKOUT = 3;
/**
* 手动出库
*/
public final static int MANUAL_CHECKOUT = 4;
/**
* 手动喂料
*/
public final static int MANUAL_FEEDING = 5;
/**
* 清空库位
*/
public final static int CLEAR_POS = 6;
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
public interface IPreWarningItemDao extends IBaseDao {
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import com.neotel.smfcore.custom.lizhen.innerBox.service.dao.IPreWarningItemDao;
import org.springframework.stereotype.Service;
@Service
public class PreWarningItemDaoImpl extends AbstractBaseDao implements IPreWarningItemDao {
@Override
public Class getEntityClass() {
return PreWarningItem.class;
}
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import java.util.List;
public interface IPreWarningItemManager extends IBaseManager<PreWarningItem> {
List<PreWarningItem> findAll();
}
package com.neotel.smfcore.custom.lizhen.innerBox.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import com.neotel.smfcore.custom.lizhen.innerBox.service.dao.IPreWarningItemDao;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IPreWarningItemManager;
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.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class PreWarningItemManagerImpl implements IPreWarningItemManager {
@Autowired
private IPreWarningItemDao preWarningItemDao;
@Override
public PreWarningItem get(String id) {
return null;
}
@Override
public PreWarningItem save(PreWarningItem item) throws ValidateException {
return preWarningItemDao.save(item);
}
@Override
public void delete(PreWarningItem item) throws ValidateException {
preWarningItemDao.removeOneById(item.getId());
}
@Override
public PageData<PreWarningItem> findByPage(Query query, Pageable pageable) {
return null;
}
@Override
public List<PreWarningItem> findByQuery(Query query) {
return null;
}
@Override
public List<PreWarningItem> findAll() {
return preWarningItemDao.findAll();
}
}
......@@ -5,7 +5,7 @@ import com.neotel.smfcore.custom.lizhen.innerBox.util.PreWarningItemCache;
import org.springframework.stereotype.Service;
@Service
public class PreWarningItemManager extends AbstractBaseDao {
public class PreWarningItemCacheManager extends AbstractBaseDao {
@Override
public Class getEntityClass() {
return PreWarningItemCache.class;
......
package com.neotel.smfcore.custom.lizhen.kanban.common;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.custom.lizhen.kanban.common.bean.dto.InOutDataDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
public class KanbanUtils {
private static String F2;
private static String F3;
private static String F5;
private static IDataLogManager dataLogManager;
private static IStoragePosManager storagePosManager;
private static DataCache dataCache;
/**
* 得到当日的出入库完成统计
*
* @return
*/
public static Map<String, Integer> getTodayInAndOutAmount() {
Map<String, Integer> resultMap = new HashMap<>();
resultMap.put("in", 0);
resultMap.put("out", 0);
//得到当前日期与结束日期
Date startDate = getCurrentDate();
Date endDate = DateUtil.addDays(startDate, 1);
//得到出入库数据
int inCount = dataLogManager.getInOutData(startDate, endDate, OP.PUT_IN, "",-1,"");
int outCount = dataLogManager.getInOutData(startDate, endDate, OP.CHECKOUT, "",-1,"");
resultMap.put("in", inCount);
resultMap.put("out", outCount);
return resultMap;
}
/**
* 得到近7天的出入库数量
*
* @return
*/
public static InOutDataDto getSevenDaysInAndOutAmount() {
InOutDataDto dataDto = new InOutDataDto();
List<String> labelList = new ArrayList<>();
List<Integer> putInValueList = new ArrayList<>();
List<Integer> checkOutValueList = new ArrayList<>();
Date currentDate = getCurrentDate(); //当前时间
Date startDate = DateUtil.addDays(currentDate, -6); //开始时间(与当前时间相差7天)
for (int day = 1; day < 8; day++) {
Date endDate = DateUtil.addDays(startDate, 1);
int inData = dataLogManager.getInOutData(startDate, endDate, OP.PUT_IN, "",-1,"");
int outData = dataLogManager.getInOutData(startDate, endDate, OP.CHECKOUT, "",-1,"");
labelList.add(DateUtil.toDateString(startDate, "MM/dd"));
putInValueList.add(inData);
checkOutValueList.add(outData);
startDate = endDate;
}
dataDto.setLabelList(labelList);
dataDto.setPutInValueList(putInValueList);
dataDto.setCheckOutValueList(checkOutValueList);
return dataDto;
}
/**
* 得到当前日期
*
* @return
*/
public static Date getCurrentDate() {
Date date = new Date();
return DateUtil.initDate(date, "yyyy-MM-dd");
}
/**
* 根据楼层得到线体
*
* @param floor
* @return
*/
public static List<String> getLineByFloor(String floor) {
List<String> lineList = new ArrayList<>();
//得到每一个楼层的线体
String f2Line = dataCache.getCache("F2Line").toString();
String f3Line = dataCache.getCache("F3Line").toString();
String f5Line = dataCache.getCache("F5Line").toString();
if (F2.equals(floor)) {
lineList = new ArrayList<>(Arrays.asList(f2Line.split(",")));
} else if (F3.equals(floor)) {
lineList = new ArrayList<>(Arrays.asList(f3Line.split(",")));
} else if (F5.equals(floor)) {
lineList = new ArrayList<>(Arrays.asList(f5Line.split(",")));
}
return lineList;
}
@Autowired
private void setDataLogManager(IDataLogManager dataLogManager) {
this.dataLogManager = dataLogManager;
}
@Autowired
private void setStoragePosManager(IStoragePosManager storagePosManager) {
this.storagePosManager = storagePosManager;
}
@Autowired
private void setDataCache(DataCache dataCache) {
this.dataCache = dataCache;
}
@Value("${lizhen.F2.name}")
private void setF2Floor(String floor){
F2 = floor;
}
@Value("${lizhen.F3.name}")
private void setF3Floor(String floor){
F3 = floor;
}
@Value("${lizhen.F5.name}")
private void setF5Floor(String floor){
F5 = floor;
}
}
package com.neotel.smfcore.custom.lizhen.kanban.common.bean.dto;
import lombok.Data;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Data
public class InOutDataDto {
public InOutDataDto() {
this.labelList = new ArrayList<>();
this.putInValueList = new ArrayList<>();
this.checkOutValueList = new ArrayList<>();
}
/**
* 日期
*/
private List<String> labelList;
/**
* 入库量
*/
private List<Integer> putInValueList;
/**
* 出库量
*/
private List<Integer> checkOutValueList;
}
package com.neotel.smfcore.custom.lizhen.kanban.inner;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
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;
import com.neotel.smfcore.custom.lizhen.kanban.inner.bean.dto.LackPickingDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequestMapping("/innerKanban")
public class InnerKanbanController {
@Autowired
private DataCache dataCache;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private IDataLogManager dataLogManager;
/**
* 获取近7天出入库统计
* @return
*/
@RequestMapping("/getSevenDaysInAndOutAmount")
@AnonymousAccess
public ResultBean getSevenDaysInAndOutAmount(){
InOutDataDto dto = KanbanUtils.getSevenDaysInAndOutAmount();
return ResultBean.newOkResult(dto);
}
/**
* 获取当天出入库统计
* @return
*/
@RequestMapping("/getTodayInAndOutAmount")
@AnonymousAccess
public ResultBean getTodayInAndOutAmount(){
Map<String, Integer> map = KanbanUtils.getTodayInAndOutAmount();
return ResultBean.newOkResult(map);
}
/**
* 获取线体缺料预警信息
*
* @param floor 楼层
* @return
*/
@RequestMapping("/getLineInfo")
@AnonymousAccess
public ResultBean getLineLackPickingInfo(String floor) {
List<String> lineList = KanbanUtils.getLineByFloor(floor);
List<LackPickingDto> resultList = new ArrayList<>();
for (String line : lineList) {
LackPickingDto dto = new LackPickingDto();
dto.setLine(line);
//统计缺料数量
dto.setTotalNeedCount(getLackPickingCount(0, line));
//统计已发数量
dto.setTotalOutCount(getLackPickingCount(-1, line));
resultList.add(dto);
}
return ResultBean.newOkResult(resultList);
}
/**
* 获取设备状态信息
*
* @return
*/
@RequestMapping("/getDevicesStatus")
@AnonymousAccess
public ResultBean getDevicesStatus() {
List<DevicesStatusDto> resultList = new ArrayList<>();
//开始时间与结束时间
Date currentDate = KanbanUtils.getCurrentDate();
currentDate = DateUtil.addDays(currentDate, -2);
Date endDate = DateUtil.addDays(currentDate, 1);
for (Storage storage : dataCache.getAllStorage().values()) {
//排除虚拟仓的
if (!storage.isVirtual()) {
int emptySlots = storage.getEmptySlots(); //空库位
int totalSlots = storage.getTotalSlots(); //所有库位
int useSlots = totalSlots - emptySlots; //使用库位
String name = storage.getName(); //库位名称
int usage = (int) (((double) useSlots / totalSlots) * 100); //库位使用率
//获取设备状态
int status = 0;
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean != null){
status = bean.getStatus();
}
//出入库数据
int inCount = dataLogManager.getInOutData(currentDate, endDate, OP.PUT_IN, "", -1, storage.getId());
int outCount = dataLogManager.getInOutData(currentDate, endDate, OP.CHECKOUT, "", -1, storage.getId());
DevicesStatusDto dto = new DevicesStatusDto();
dto.setName(name);
dto.setPosUseCount(useSlots);
dto.setPosAllCount(totalSlots);
dto.setInCount(inCount);
dto.setOutCount(outCount);
dto.setUsage(usage);
dto.setStauts(status);
if (storage.isNLShelf()){
dto.setType(0);
} else {
dto.setType(1);
}
resultList.add(dto);
}
}
return ResultBean.newOkResult(resultList);
}
public static void main(String[] args) {
int i = (int) (((double) (99 - 88) / 99) * 100);
System.out.println(i);
}
private int getLackPickingCount(int num, String line) {
Query q = new Query();
Criteria c = Criteria.where("line").is(line);
if (num == 0) {
c.and("needReelCount").gt(0);
} else if (num == -1) {
c.and("outReelCount").gt(0);
}
//默认是当天时间
Date currentDate = KanbanUtils.getCurrentDate();
//currentDate = DateUtil.addDays(currentDate,-2);
c.andOperator(Criteria.where("updateDate").gte(currentDate), Criteria.where("updateDate").lt(DateUtil.addDays(currentDate, 1)));
return liteOrderItemManager.countByQuery(q.addCriteria(c));
}
}
package com.neotel.smfcore.custom.lizhen.kanban.inner.bean.dto;
import lombok.Data;
/**
* 设备状态信息
*/
@Data
public class DevicesStatusDto {
/**
* 设备名称
*/
private String name;
/**
* 库位使用率
*/
private int usage;
/**
* 入库数据
*/
private int inCount;
/**
* 出库数据
*/
private int outCount;
/**
* 设备状态
*/
private int stauts;
/**
* 所有库位
*/
private int posAllCount;
/**
* 已使用库位
*/
private int posUseCount;
/**
* 0是料仓 1是料架
*/
private int type;
}
package com.neotel.smfcore.custom.lizhen.kanban.inner.bean.dto;
import lombok.Data;
/**
* 缺料信息(内仓)
*/
@Data
public class LackPickingDto {
/**
* 线体信息
*/
private String line;
/**
* 需要出库的数量
*/
private int totalNeedCount;
/**
* 已经出库的数量
*/
private int totalOutCount;
}
package com.neotel.smfcore.custom.lizhen.kanban.outer;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.storage.service.po.Storage;
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.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.outer.bean.dto.PickingProgressDto;
import com.neotel.smfcore.custom.lizhen.kanban.outer.bean.dto.StationInOutDto;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
@RequestMapping("/outer")
public class OuterKanbanController {
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private DataCache dataCache;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private TaskService taskService;
/**
* 获取近7天出入库统计
*
* @return
*/
@RequestMapping("/getSevenDaysInAndOutAmount")
@AnonymousAccess
public ResultBean getSevenDaysInAndOutAmount() {
InOutDataDto dto = KanbanUtils.getSevenDaysInAndOutAmount();
return ResultBean.newOkResult(dto);
}
/**
* 获取当天出入库统计
*
* @return
*/
@RequestMapping("/getTodayInAndOutAmount")
@AnonymousAccess
public ResultBean getTodayInAndOutAmount() {
Map<String, Integer> map = KanbanUtils.getTodayInAndOutAmount();
return ResultBean.newOkResult(map);
}
/**
* 获取工位的出入库统计数据
*
* @return
*/
@RequestMapping("/getStationInAndOutAmout")
@AnonymousAccess
public ResultBean getStationInAndOutAmout() {
List<StationInOutDto> resultList = new ArrayList<>();
Date currentDate = KanbanUtils.getCurrentDate();
//currentDate = DateUtil.addDays(currentDate,-1);
Date endDate = DateUtil.addDays(currentDate, 1);
for (int i = 1; i < 6; i++) {
StationInOutDto dto = new StationInOutDto();
String stationName = "s" + i;
dto.setName(stationName);
int inCount = dataLogManager.getInOutData(currentDate, endDate, OP.PUT_IN, stationName);
dto.setInCount(inCount);
int outCount = dataLogManager.getInOutData(currentDate, endDate, OP.CHECKOUT, stationName);
dto.setOutCount(outCount);
resultList.add(dto);
}
return ResultBean.newOkResult(resultList);
}
/**
* 获取库位使用率
*/
@RequestMapping("/getPosUsage")
@AnonymousAccess
public ResultBean getPosUsage() {
Storage storage = null;
for (Storage stor : dataCache.getAllStorage().values()) {
if (!stor.isVirtual()) {
storage = stor;
break;
}
}
int totalSlots = storage.getTotalSlots(); //全部库位
int emptySlots = storage.getEmptySlots(); //空库位
int usage = (int) (((double) (totalSlots - emptySlots) / totalSlots) * 100); //库位使用率
return ResultBean.newOkResult(usage);
}
/**
* 获取picking进度信息
*/
@RequestMapping("/getPickingProgress")
@AnonymousAccess
public ResultBean getPickingProgress() {
LiteOrder liteOrder = new LiteOrder();
for (LiteOrder order : liteOrderCache.getAllLiteOrder()) {
if (order.isOutTails()) {
liteOrder = order;
break;
}
}
PickingProgressDto dto = new PickingProgressDto();
if (liteOrder != null) {
dto.setPickingId(liteOrder.getOrderNo());
int progress = (int) (((double) (liteOrder.getTaskReelCount() - liteOrder.getFinishedReelCount()) / liteOrder.getTaskReelCount()) * 100); //库位使用率
dto.setProgress(progress);
}
return ResultBean.newOkResult(dto);
}
/**
* 获取出入库记录
*/
@RequestMapping("/getQueueTask")
@AnonymousAccess
public ResultBean getQueueTask() {
Collection<DataLog> queueTasks = taskService.getQueueTasks();
return ResultBean.newOkResult(queueTasks);
}
}
package com.neotel.smfcore.custom.lizhen.kanban.outer.bean.dto;
import lombok.Data;
@Data
public class PickingProgressDto {
/**
* pickingId
*/
private String pickingId = "";
/**
* 进度
*/
private int progress;
}
package com.neotel.smfcore.custom.lizhen.kanban.outer.bean.dto;
import lombok.Data;
/**
* 工位出入库数据
*/
@Data
public class StationInOutDto {
/**
* 工位名称
*/
private String name;
/**
* 入库数量
*/
private int inCount;
/**
* 出库数量
*/
private int outCount;
/**
* 状态
*/
private String status = "正常";
}
package com.neotel.smfcore.custom.lizhen.kanban.utils;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.custom.lizhen.kanban.common.KanbanUtils;
import com.neotel.smfcore.custom.lizhen.kanban.utils.bean.AgvInfo;
import com.neotel.smfcore.custom.lizhen.kanban.utils.enums.Location;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* agv小车状态信息缓存
*/
@RestController
public class AgvStatusCache {
@Value("${lizhen.F2.name}")
private String F2;
@Value("${lizhen.F3.name}")
private String F3;
@Value("${lizhen.F5.name}")
private String F5;
private static List<AgvInfo> agvInfoCacheList = new CopyOnWriteArrayList<>();
/**
* agv状态信息上报
*
* @param infoList
* @return
*/
@RequestMapping("/service/store/agvStatus/agvInfo")
@AnonymousAccess
public ResultBean agvInfo(@RequestBody List<AgvInfo> infoList) {
agvInfoCacheList = infoList;
return ResultBean.newOkResult(null);
}
/**
* 获取agv状态信息
*
* @param floor
* @return
*/
@RequestMapping("/agvStatus/getAgvInfoBySource")
@AnonymousAccess
public ResultBean getAgvInfoBySource(String floor) {
List<String> locList = new ArrayList<>();
List<String> locCnList = new ArrayList<>();
if (F2.equals(floor) || F3.equals(floor) || F5.equals(floor)) {
locList = KanbanUtils.getLineByFloor(floor);
locList.addAll(getLocByType(0));
locCnList = KanbanUtils.getLineByFloor(floor);
locCnList.addAll(getLocCnByType(0));
} else {
locList.addAll(getLocByType(2));
locCnList.addAll(getLocCnByType(2));
}
for (AgvInfo agvInfo : agvInfoCacheList) {
String loc = agvInfo.getLoc();
agvInfo.setLocCn(Location.getLoc(loc));
agvInfo.setLocList(locList);
agvInfo.setLocCnList(locCnList);
}
return ResultBean.newOkResult(agvInfoCacheList);
}
private List<String> getLocByType(int type) {
List<String> locList = new ArrayList<>();
for (Location loc : Location.values()) {
int locType = Location.getType(loc.name());
if (locType == 0 || locType == type) {
locList.add(loc.name());
}
}
return locList;
}
private List<String> getLocCnByType(int type) {
List<String> locList = new ArrayList<>();
for (Location loc : Location.values()) {
int locType = Location.getType(loc.name());
if (locType == 0 || locType == type) {
locList.add(Location.getLoc(loc.name()));
}
}
return locList;
}
}
package com.neotel.smfcore.custom.lizhen.kanban.utils.bean;
import lombok.Data;
import java.util.List;
@Data
public class AgvInfo {
/**
* 小车名称
*/
private String name;
/**
* 小车电量
*/
private String elec;
/**
* 小车位置
*/
private String loc;
/**
* 小车位置 中文
*/
private String locCn;
/**
* 位置集合
*/
private List<String> locList;
/**
* 位置集合 中文
*/
private List<String> locCnList;
}
package com.neotel.smfcore.custom.lizhen.kanban.utils.enums;
/**
* 点位 AGV
*/
public enum Location {
//外仓点位
WAREHOUSE("仓库", 2),
TAKE("取料点", 2),
PUT("取料点", 2),
//内外仓,通用点位
STANDBY("待机点", 0),
CHARGE("充电点", 0);
private String loc;
private int type;
Location(String loc, int type) {
this.loc = loc;
this.type = type;
}
/**
* 根据名称获取位置
*
* @param name
* @return
*/
public static String getLoc(String name) {
for (Location location : Location.values()) {
if (location.name().equals(name)) {
return location.loc;
}
}
return null;
}
/**
* 根据名称获取类别
*
* @param name
* @return
*/
public static int getType(String name) {
for (Location location : Location.values()) {
if (location.name().equals(name)) {
return location.type;
}
}
return -1;
}
}
package com.neotel.smfcore.custom.lizhen.report.bean.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
/**
* 外仓库存报表展示
*/
@Getter
@Setter
public class InventoryDto {
/**
* 厂别
*/
private String plant;
/**
* 厂区
*/
private String factory;
/**
* 库别
*/
private String warehouseCode;
/**
* 楼层
*/
private String floor = "1F";
/**
* 料号
*/
private String partNumber;
/**
* 物料隔扣码
*/
private String posName;
/**
* 隔口数量
*/
private long posNameCount;
/**
* 卷数
*/
private int reelCount = 1;
/**
* 厂商
*/
private String provider;
/**
* 厂商代码
*/
private String providerNumber;
/**
* lot
*/
private String batch;
/**
* D/C
*/
private String dateCode;
/**
* keeper
*/
private String keeperCode;
/**
* 储位
*/
private String storagePosName;
/**
* 禁用信息
*/
private String disableMsg;
/**
* 首次入库时间
*/
private Date firstPutInDate;
/**
* 当前入库时间
*/
private Date putInDate;
/**
* 姓名
*/
private String creator;
/**
* 唯一码
*/
private String barcode;
/**
* 每卷数量
*/
private int amount;
/**
* 来源
*/
private String source;
}
......@@ -14,14 +14,22 @@ import java.util.List;
@Data
@ApiModel("查询条件")
public class ReportQueryCondition {
@QueryCondition(blurry = "pn,partNumber")
@QueryCondition(blurry = "pn,partNumber,barcode.partNumber")
@ApiModelProperty("料号")
private String pn;
@QueryCondition(propName = "orderNo")
@QueryCondition(blurry = "pn,partNumber,barcode.partNumber")
@ApiModelProperty("料号")
private String partNumber;
@QueryCondition(blurry = "orderNo,sourceName")
@ApiModelProperty("挑料单号")
private String orderNo;
@QueryCondition(type = QueryCondition.Type.IN, propName = "orderNo")
@ApiModelProperty("挑料单号集合")
private List<String> orderNoList;
@QueryCondition(propName = "mo")
@ApiModelProperty("工单号")
private String mo;
......@@ -30,6 +38,9 @@ public class ReportQueryCondition {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private BetweenData<Date> updateDateHHmm;
@QueryCondition
@ApiModelProperty("厂别")
......@@ -39,19 +50,41 @@ public class ReportQueryCondition {
@ApiModelProperty("库别")
private String warehouse;
@QueryCondition
@ApiModelProperty("唯一码")
@QueryCondition(blurry = "barcode.barcode,barcode")
private String barcode;
@QueryCondition
@QueryCondition(blurry = "posName")
@ApiModelProperty("库位")
private String posName;
@QueryCondition
@QueryCondition(blurry = "batch")
@ApiModelProperty("批次")
private String batch;
@ApiModelProperty("线别")
@QueryCondition(propName = "line")
private String line;
@ApiModelProperty("厂商")
@QueryCondition(blurry = "barcode.provider,provider")
private String provider;
@ApiModelProperty("日期代码")
@QueryCondition(blurry = "dateCode")
private String dateCode;
@ApiModelProperty("料仓id")
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList;
@ApiModelProperty("库别")
@QueryCondition(blurry = "warehouseCode")
private String warehouseCode;
@ApiModelProperty("储位")
@QueryCondition(blurry = "posName")
private String storagePosName;
}
......@@ -6,10 +6,10 @@
</Properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} %-5level [%file:%line] - %msg%n"/>
</Console>
<RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}" filePattern="${LOG_HOME}/%d{yyyy-MM-dd}.${LOG_NAME}" append="true">
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level [%file:%line] - %msg%n" />
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss:SSS} %-5level [%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" />
</Policies>
......
......@@ -100,6 +100,7 @@ smfcore.order.out.noTask=\u5DE5\u5355\u65E0\u53EF\u6267\u884C\u7684\u4EFB\u52A1
smfcore.cannotUpdateOrderNum=\u5DE5\u5355\u5DF2\u51FA\u5E93\uFF0C\u4E0D\u80FD\u4FEE\u6539\u6570\u91CF
smfcore.order.close.success=\u5DE5\u5355\u5173\u95ED\u6210\u529F
smfcore.order.close.taskNotEnd=\u5DE5\u5355\u8FD8\u6709\u672A\u5B8C\u6210\u7684\u4EFB\u52A1
smfcore.order.executing=\u5DF2\u7ECF\u6709\u6B63\u5728\u6267\u884C\u7684\u5DE5\u5355,\u8BF7\u6838\u5B9E
smfcore.manualOut=\u624B\u52A8\u51FA\u5E93
smfcore.error.barcode.noRules=\u89E3\u6790\u89C4\u5219\u672A\u5B9A\u4E49
smfcore.error.barcode.wrongLength=\u6761\u7801[{0}]\u957F\u5EA6\u9519\u8BEF
......@@ -115,6 +116,8 @@ smfcore.order.uploadOK=\u5DE5\u5355\u4E0A\u4F20\u6210\u529F
smfcore.order.ameExists=\u5DE5\u5355\u540D\u79F0[{0}]\u5DF2\u5B58\u5728
smfcore.order.hasClose=\u5DE5\u5355\u5DF2\u5173\u95ED
smfcore.order.supplementOutFail=\u672A\u627E\u5230\u53EF\u4EE5\u51FA\u5E93\u7684\u8865\u6599
smfcore.order.confirmExcess=\u8BF7\u9009\u62E9\u5DE5\u5355\u662F\u5426\u8D85\u53D1\uFF0C\u518D\u8FDB\u884C\u51FA\u5E93\u4F5C\u4E1A
smfcore.order.excessSuccess=\u5DE5\u5355\u5DF2\u7ECF\u8D85\u53D1
smfcore.materialBox.quantityshort=\u7269\u6599\u6570\u91CF\u4E0D\u8DB3
smfcore.materialBox.invalid=\u672A\u627E\u5230\u6599\u76D2\u4FE1\u606F{0}
smfcore.materialBox.noReel=\u6599\u76D2\u4E2D\u672A\u627E\u5230\u5BF9\u5E94\u7269\u6599
......@@ -151,6 +154,7 @@ smfcore.solderPasteSetting=\u8BBE\u7F6E
smfcore.orderSetting=\u5171\u4EAB\u6587\u4EF6\u5939
smfcore.enterCorrectFolder=\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u6587\u4EF6\u5939
smfcore.taskHasEnd=\u4EFB\u52A1{0}\u5DF2\u53D6\u6D88\u6216\u5DF2\u7ED3\u675F
smfcore.taskStatusHasUpdate=\u4EFB\u52A1{0}\u5DF2\u7ECF\u4FEE\u6539\u72B6\u6001
smfcore.virtual.notFound=\u672A\u627E\u5230\u865A\u62DF\u4ED3
smfcore.virtual.pos.notInStorage=\u865A\u62DF\u4ED3[{0}]\u4E2D\u672A\u627E\u5230\u5E93\u4F4D[{1}]
smfcore.virtual.msg.outConfirm=[{0}]\u51FA\u5E93\u5B8C\u6210
......@@ -186,6 +190,7 @@ smfcore.storagePos.lockName=\u5DE5\u5355\u53F7
smfcore.storagePos.amount=\u6570\u91CF
smfcore.storagePos.putInTime=\u9996\u6B21\u5165\u5E93\u65F6\u95F4
smfcore.storagePos.putInDate=\u5165\u5E93\u65F6\u95F4
smfcore.storagePos.existBarcode={0}\u5DF2\u5B58\u5728\u5E93\u4F4D{1}\u4E2D
smfcore.inventory.partNumber=\u7269\u6599\u7F16\u53F7
smfcore.inventory.count=\u6570\u91CF
smfcore.inventory.lockReel=\u9501\u5B9A
......@@ -240,6 +245,7 @@ smfcore.error.barcode.errorSize=\u6761\u7801\u672A\u8BBE\u7F6E\u5C3A\u5BF8
smfcore.shelf.msg.alreadyInPos=\u8BE5\u7269\u6599\u5DF2\u5728\u5E93\u4F4D[{0}]\u4E2D
smfcore.shelf.msg.inMergeOk=\u64CD\u4F5C\u6210\u529F,\u8BF7\u5408\u5E76\u5E93\u4F4D[{0}]\u5E76\u653E\u5165\u6599\u76D8
smfcore.shelf.msg.inError=\u672A\u627E\u5230\u9002\u5408[{0}]\u7684\u5E93\u4F4D
smfcore.shelf.msg.noPos=\u672A\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684\u5E93\u4F4D
smfcore.dumpWarehousing=\u8F6C\u50A8\u5165\u5E93
smfcore.singleDiskWarehousing=\u5355\u76D8\u5165\u5E93
smfcore.sluggishMaterials=\u5446\u6EDE\u7269\u6599
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!