From bbf11a79fce0131aa95905c09b00f25e7696d20b Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期二, 21 十月 2025 16:53:13 +0800
Subject: [PATCH] *
---
src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java | 73 +++
src/main/java/com/zy/asrs/utils/OptimizedLockerPacking3Utils.java | 737 ++++++++++++++++++++++++++++++++++++++
src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java | 82 +++
src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java | 76 +++
src/main/java/com/zy/asrs/controller/ApiLogController.java | 6
src/main/webapp/views/apiLog/apiLog.html | 8
src/main/java/com/zy/common/config/ControllerResAdvice.java | 1
src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java | 17
src/main/java/com/zy/asrs/utils/MultiLockerOptimizerUtils.java | 10
src/main/webapp/static/js/apiLog/apiLog.js | 23
src/main/java/com/zy/asrs/utils/ToSortLineUtils.java | 67 ++-
11 files changed, 1,009 insertions(+), 91 deletions(-)
diff --git a/src/main/java/com/zy/asrs/controller/ApiLogController.java b/src/main/java/com/zy/asrs/controller/ApiLogController.java
index 1e450a3..dbbb366 100644
--- a/src/main/java/com/zy/asrs/controller/ApiLogController.java
+++ b/src/main/java/com/zy/asrs/controller/ApiLogController.java
@@ -56,7 +56,11 @@
wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
} else {
- wrapper.like(entry.getKey(), val);
+ if (entry.getKey().equals("url")){
+ wrapper.like(entry.getKey(), val).or().like("client_ip", val);
+ } else {
+ wrapper.like(entry.getKey(), val);
+ }
}
}
}
diff --git a/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java b/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java
index 3fae3ca..8786ba7 100644
--- a/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java
+++ b/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java
@@ -5,13 +5,10 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OrderToLine;
import com.zy.asrs.service.*;
-import com.zy.asrs.service.impl.OrderDetlServiceImpl;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.OrderToLineHandler;
-import com.zy.asrs.utils.GroupedLockerOptimizerUtils;
-import com.zy.asrs.utils.OptimizedLockerPackingUtils;
-import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.asrs.utils.ToSortLineUtils;
+import com.zy.asrs.utils.param.ItemUtilParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -48,12 +45,10 @@
for (String orderNo : orderNos) {
try{
List<OrderDetlPakin> orderDetlPakinList = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_no",orderNo));
-// List<GroupedLockerOptimizerUtils.Item> items = new ArrayList<>();
if (orderDetlPakinList.size()<1){
continue;
}
-
- List<OptimizedLockerPackingUtils.Item> items = new ArrayList<>();
+ List<ItemUtilParam.Item> items = new ArrayList<>();
for (OrderDetlPakin orderDetl:orderDetlPakinList){
Integer number = basArmRulesService.getNumber(orderDetl.getWeight(),orderDetl.getVolume(),orderDetl.getManLength(),orderDetl.getWidth(),orderDetl.getHeight());
if (number == null) {
@@ -70,20 +65,18 @@
String name = ToSortLineUtils.MergerParameter(orderDetl.getMatnr(),orderDetl.getStandby1(),orderDetl.getStandby2());
int maxCapacity = number;
int stock = orderDetl.getAnfme().intValue();
-// items.add(new GroupedLockerOptimizerUtils.Item(name, maxCapacity, stock));
- items.add(new OptimizedLockerPackingUtils.Item(name, maxCapacity, stock));
+ items.add(new ItemUtilParam.Item(name, maxCapacity, stock));
}
OrderToLine orderToLine = new OrderToLine();
orderToLine.setOrderNo(orderNo); //鍗曟嵁缂栧彿
orderToLine.setCreateTime(System.currentTimeMillis()); //鍒涘缓鏃堕棿
-// OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLineGro(items, orderToLine);
- OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLineOpt(items, orderToLine);
+ OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLine(items, orderToLine,"Opt3");
try{
ReturnT<String> returnT = orderToLineHandler.start(orderToLineR);
if (!returnT.isSuccess()) {
- log.error("涓嬪彂鍗曟嵁澶辫触===>"+ JSON.toJSON(orderToLineR));
+// log.error("涓嬪彂鍗曟嵁澶辫触===>"+ JSON.toJSON(orderToLineR));
} else {
try{
for (OrderToLine.MatList matList:orderToLineR.getMatList()){
diff --git a/src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java b/src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java
index 4b6fc1f..555f519 100644
--- a/src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java
@@ -2,13 +2,12 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
import com.core.exception.CoolException;
-import com.zy.asrs.entity.BasArmRules;
-import com.zy.asrs.entity.DocType;
-import com.zy.asrs.entity.Order;
-import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.ArmPrecomputeParam;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.BasArmRulesService;
@@ -79,20 +78,40 @@
throw new CoolException("鑾峰彇鐮佸灈鏁伴噺澶辫触");
}
} catch (Exception e) {
- log.error("fail", e);
- return FAIL.setMsg(e.getMessage());
+ try{
+ log.error("fail==>鑾峰彇鐮佸灈鏁伴噺:"+e.getLocalizedMessage());
+ } catch (Exception e1){
+
+ }
+// return FAIL.setMsg(e.getLocalizedMessage());
+ return FAIL;
+// log.error("fail", e);
+// return FAIL.setMsg(e.getMessage());
} finally {
try {
- // 淇濆瓨鎺ュ彛鏃ュ織
- apiLogService.save(
- "鑾峰彇鐮佸灈鏁伴噺",
- URL + QuantityOfPalletizing,
- null,
- "127.0.0.1",
- JSON.toJSONString(armPrecomputeParam),
- response,
- success
- );
+
+ if (success){
+ // 淇濆瓨鎺ュ彛鏃ュ織
+ apiLogService.save(
+ "鑾峰彇鐮佸灈鏁伴噺",
+ URL +"/"+ QuantityOfPalletizing,
+ null,
+ "127.0.0.1",
+ JSON.toJSONString(armPrecomputeParam),
+ response,
+ success
+ );
+ } else {
+ beforeBodyWriteCallApiLogSave(
+ "鑾峰彇鐮佸灈鏁伴噺",
+ URL +"/"+ QuantityOfPalletizing,
+ null,
+ "127.0.0.1",
+ JSON.toJSONString(armPrecomputeParam),
+ response,
+ success
+ );
+ }
} catch (Exception e) { log.error("", e); }
}
}catch (Exception e){
@@ -100,5 +119,30 @@
}
return SUCCESS;
}
+ public void beforeBodyWriteCallApiLogSave(String name, String url, String appkey, String ip, String request, String response, boolean success) {
+ ApiLog apiLog = apiLogService.selectOne(new EntityWrapper<ApiLog>()
+ .eq("namespace", name)
+ .eq("request", request)
+ .eq("response", response)
+ .eq("result", success? 1:0)
+ .orderBy("create_time", false)
+ );
+ if (!Cools.isEmpty(apiLog)){
+ long parseLong = Long.parseLong(apiLog.getTimestamp());
+ if (new Date().getTime()-parseLong<5*1000*60){
+ return;
+ }
+ }
+ // 淇濆瓨鎺ュ彛鏃ュ織
+ apiLogService.save(
+ name,
+ url,
+ appkey,
+ ip,
+ request,
+ response,
+ success
+ );
+ }
}
diff --git a/src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java b/src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java
index 153f89d..9e017d2 100644
--- a/src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java
@@ -2,7 +2,11 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.common.Cools;
+import com.core.common.SpringUtils;
import com.core.exception.CoolException;
+import com.zy.asrs.entity.ApiLog;
import com.zy.asrs.entity.param.ArmPrecomputeParam;
import com.zy.asrs.entity.param.OrderToLine;
import com.zy.asrs.service.ApiLogService;
@@ -12,12 +16,14 @@
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.IpTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -61,20 +67,37 @@
throw new CoolException("涓嬪彂鍗曟嵁澶辫触");
}
} catch (Exception e) {
- log.error("fail", e);
- return FAIL.setMsg(e.getMessage());
+ try{
+ log.error("fail==>涓嬪彂鍗曟嵁鑷冲垎鎷g嚎:"+e.getLocalizedMessage());
+ } catch (Exception e1){
+
+ }
+// return FAIL.setMsg(e.getLocalizedMessage());
+ return FAIL;
} finally {
try {
- // 淇濆瓨鎺ュ彛鏃ュ織
- apiLogService.save(
- "涓嬪彂鍗曟嵁鑷冲垎鎷g嚎",
- URL + Path,
- null,
- "127.0.0.1",
- JSON.toJSONString(orderToline),
- response,
- success
- );
+ if (success){
+ // 淇濆瓨鎺ュ彛鏃ュ織
+ apiLogService.save(
+ "涓嬪彂鍗曟嵁鑷冲垎鎷g嚎",
+ URL +"/"+ Path,
+ null,
+ "127.0.0.1",
+ JSON.toJSONString(orderToline),
+ response,
+ success
+ );
+ } else {
+ beforeBodyWriteCallApiLogSave(
+ "涓嬪彂鍗曟嵁鑷冲垎鎷g嚎",
+ URL +"/"+ Path,
+ null,
+ "127.0.0.1",
+ JSON.toJSONString(orderToline),
+ response,
+ success
+ );
+ }
} catch (Exception e) { log.error("", e); }
}
}catch (Exception e){
@@ -82,4 +105,30 @@
}
return SUCCESS;
}
+
+ public void beforeBodyWriteCallApiLogSave(String name, String url, String appkey, String ip, String request, String response, boolean success) {
+ ApiLog apiLog = apiLogService.selectOne(new EntityWrapper<ApiLog>()
+ .eq("namespace", name)
+ .eq("response", response)
+ .eq("result", success? 1:0)
+ .orderBy("create_time", false)
+ );
+
+ if (!Cools.isEmpty(apiLog)){
+ long parseLong = Long.parseLong(apiLog.getTimestamp());
+ if (new Date().getTime()-parseLong<5*1000*60){
+ return;
+ }
+ }
+ // 淇濆瓨鎺ュ彛鏃ュ織
+ apiLogService.save(
+ name,
+ url,
+ appkey,
+ ip,
+ request,
+ response,
+ success
+ );
+ }
}
diff --git a/src/main/java/com/zy/asrs/utils/MultiLockerOptimizerUtils.java b/src/main/java/com/zy/asrs/utils/MultiLockerOptimizerUtils.java
index e0db69f..b72ade2 100644
--- a/src/main/java/com/zy/asrs/utils/MultiLockerOptimizerUtils.java
+++ b/src/main/java/com/zy/asrs/utils/MultiLockerOptimizerUtils.java
@@ -1,4 +1,7 @@
package com.zy.asrs.utils;
+import com.core.common.SnowflakeIdWorker;
+import com.core.common.SpringUtils;
+
import java.util.*;
public class MultiLockerOptimizerUtils {
@@ -33,12 +36,19 @@
static class Locker {
int id;
double remainingSpace;
+ long bindingTags;
Map<String, Integer> contents;
+ Set<String> itemTypes;
public Locker(int id) {
this.id = id;
this.remainingSpace = 1.0;
this.contents = new HashMap<>();
+ this.itemTypes = new HashSet<>();
+ SnowflakeIdWorker snowflakeIdWorker = SpringUtils.getBean(SnowflakeIdWorker.class);
+// this.bindingTags = System.currentTimeMillis();
+ this.bindingTags = snowflakeIdWorker.nextId();
+
}
// 灏濊瘯鏀惧叆鐗╁搧
diff --git a/src/main/java/com/zy/asrs/utils/OptimizedLockerPacking3Utils.java b/src/main/java/com/zy/asrs/utils/OptimizedLockerPacking3Utils.java
new file mode 100644
index 0000000..c7f12dd
--- /dev/null
+++ b/src/main/java/com/zy/asrs/utils/OptimizedLockerPacking3Utils.java
@@ -0,0 +1,737 @@
+package com.zy.asrs.utils;
+
+import com.core.common.SnowflakeIdWorker;
+import com.core.common.SpringUtils;
+
+import java.util.*;
+
+public class OptimizedLockerPacking3Utils {
+
+ public static class Item {
+ String name;
+ double unitSpace;
+ int maxCapacity;
+ int stock;
+ int allocated; // 鏀逛负宸插垎閰嶆暟閲忥紝閬垮厤鐩存帴淇敼remaining瀵艰嚧鐨勬贩涔�
+
+ public Item(String name, int maxCapacity, int stock) {
+ this.name = name;
+ this.maxCapacity = maxCapacity;
+ this.unitSpace = 1.0 / maxCapacity;
+ this.stock = stock;
+ this.allocated = 0;
+ }
+
+ public int getRemaining() {
+ return stock - allocated;
+ }
+
+ public boolean allocate(int quantity) {
+ if (allocated + quantity <= stock) {
+ allocated += quantity;
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return name + "(鍗曟斁" + maxCapacity + "涓�, 搴撳瓨" + stock + "涓�)";
+ }
+ }
+
+ static class Locker {
+ int id;
+ double remainingSpace;
+ long bindingTags;
+ Map<String, Integer> contents;
+ Set<String> itemTypes;
+
+ public Locker(int id) {
+ this.id = id;
+ this.remainingSpace = 1.0;
+ this.contents = new HashMap<>();
+ this.itemTypes = new HashSet<>();
+ SnowflakeIdWorker snowflakeIdWorker = SpringUtils.getBean(SnowflakeIdWorker.class);
+ this.bindingTags = snowflakeIdWorker.nextId();
+ }
+
+ public boolean canAdd(Item item, int quantity) {
+ return remainingSpace >= quantity * item.unitSpace;
+ }
+
+ public boolean addItem(Item item, int quantity) {
+ // 楠岃瘉鍒嗛厤鏁伴噺
+ if (!item.allocate(quantity)) {
+ return false;
+ }
+
+ double spaceUsed = quantity * item.unitSpace;
+ if (spaceUsed > remainingSpace + 1e-6) {
+ // 鍥炴粴鍒嗛厤
+ item.allocated -= quantity;
+ return false;
+ }
+
+ remainingSpace -= spaceUsed;
+ contents.put(item.name, contents.getOrDefault(item.name, 0) + quantity);
+ itemTypes.add(item.name);
+ return true;
+ }
+
+ public boolean containsItemType(String itemName) {
+ return itemTypes.contains(itemName);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("鍌ㄧ墿鏌�").append(id).append(": ");
+ sb.append(String.format("鍓╀綑绌洪棿%.4f", remainingSpace)).append("\n");
+ for (Map.Entry<String, Integer> entry : contents.entrySet()) {
+ sb.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append("涓猏n");
+ }
+ return sb.toString();
+ }
+ }
+
+ static class PackingSolution {
+ List<Locker> lockers;
+ int totalLockersUsed;
+ double overallUtilization;
+ int itemTypeChanges;
+ int pureLockers;
+
+ public PackingSolution() {
+ this.lockers = new ArrayList<>();
+ }
+
+ public void addLocker(Locker locker) {
+ lockers.add(locker);
+ totalLockersUsed = lockers.size();
+ }
+
+ public void calculateMetrics() {
+ double totalUsedSpace = 0;
+ itemTypeChanges = 0;
+ pureLockers = 0;
+ String lastItemType = null;
+
+ for (Locker locker : lockers) {
+ totalUsedSpace += (1.0 - locker.remainingSpace);
+
+ if (locker.itemTypes.size() == 1) {
+ pureLockers++;
+ }
+
+ for (String itemType : locker.itemTypes) {
+ if (lastItemType != null && !lastItemType.equals(itemType)) {
+ itemTypeChanges++;
+ }
+ lastItemType = itemType;
+ }
+ }
+
+ overallUtilization = totalUsedSpace / totalLockersUsed;
+ }
+
+ @Override
+ public String toString() {
+ calculateMetrics();
+ StringBuilder sb = new StringBuilder();
+ sb.append("=== 浼樺寲鎽嗘斁鏂规 ===\n");
+ sb.append("浣跨敤鐨勫偍鐗╂煖鏁伴噺: ").append(totalLockersUsed).append("涓猏n");
+ sb.append("绾绫诲偍鐗╂煖: ").append(pureLockers).append("涓猏n");
+ sb.append("骞冲潎绌洪棿鍒╃敤鐜�: ").append(String.format("%.2f", overallUtilization * 100)).append("%\n");
+ sb.append("鐗╁搧绉嶇被鍒囨崲娆℃暟: ").append(itemTypeChanges).append("娆n\n");
+
+ List<Locker> pureLockersList = new ArrayList<>();
+ List<Locker> mixedLockersList = new ArrayList<>();
+
+ for (Locker locker : lockers) {
+ if (locker.itemTypes.size() == 1) {
+ pureLockersList.add(locker);
+ } else {
+ mixedLockersList.add(locker);
+ }
+ }
+
+ sb.append("銆愮函绉嶇被鍌ㄧ墿鏌溿��:\n");
+ for (Locker locker : pureLockersList) {
+ sb.append(locker.toString()).append("\n");
+ }
+
+ sb.append("銆愭贩鍚堝偍鐗╂煖銆�:\n");
+ for (Locker locker : mixedLockersList) {
+ sb.append(locker.toString()).append("\n");
+ }
+
+ return sb.toString();
+ }
+ }
+
+ /**
+ * 浣欐枡鐗╁搧杈呭姪绫�
+ */
+ private static class RemainderItem {
+ Item item;
+ int quantity;
+
+ RemainderItem(Item item, int quantity) {
+ this.item = item;
+ this.quantity = quantity;
+ }
+
+ @Override
+ public String toString() {
+ return item.name + "(" + quantity + "涓�)";
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+ RemainderItem that = (RemainderItem) obj;
+ return quantity == that.quantity && item.name.equals(that.item.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(item.name, quantity);
+ }
+ }
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ System.out.println("璇疯緭鍏ョ墿鍝佺绫绘暟閲�:");
+ int itemTypes = scanner.nextInt();
+ scanner.nextLine();
+
+ List<Item> items = new ArrayList<>();
+
+ for (int i = 0; i < itemTypes; i++) {
+ System.out.println("\n璇疯緭鍏ョ" + (i + 1) + "绉嶇墿鍝佺殑淇℃伅:");
+ System.out.print("鐗╁搧鍚嶇О: ");
+ String name = scanner.nextLine();
+
+ System.out.print("鍗曠瀛樻斁鏈�澶ф暟閲�: ");
+ int maxCapacity = scanner.nextInt();
+
+ System.out.print("搴撳瓨鏁伴噺: ");
+ int stock = scanner.nextInt();
+ scanner.nextLine();
+
+ items.add(new Item(name, maxCapacity, stock));
+ }
+
+ PackingSolution solution = optimizedPacking(items);
+ System.out.println("\n" + solution);
+
+ scanner.close();
+ }
+
+ /**
+ * 浼樺寲瑁呯绠楁硶锛氫慨澶嶆暟閲忕鐞嗛棶棰�
+ */
+ public static PackingSolution optimizedPacking(List<Item> items) {
+ // 楠岃瘉杈撳叆
+ if (items == null || items.isEmpty()) {
+ throw new IllegalArgumentException("鐗╁搧鍒楄〃涓嶈兘涓虹┖");
+ }
+
+ // 鍒涘缓鐗╁搧鍓湰鐢ㄤ簬澶勭悊
+ List<Item> itemsToPack = new ArrayList<>();
+ for (Item item : items) {
+ itemsToPack.add(new Item(item.name, item.maxCapacity, item.stock));
+ }
+
+ PackingSolution solution = new PackingSolution();
+ int lockerId = 1;
+
+ // 绗竴闃舵锛氬姣忕鐗╁搧杩涜闆嗕腑澶勭悊锛屽垎閰嶅畬鏁村偍鐗╂煖
+ Map<String, Integer> remainders = new HashMap<>();
+
+ for (Item item : itemsToPack) {
+ if (item.getRemaining() == 0) continue;
+
+ int fullLockersNeeded = item.getRemaining() / item.maxCapacity;
+ int remainder = item.getRemaining() % item.maxCapacity;
+
+ // 鍒嗛厤瀹屾暣鍌ㄧ墿鏌�
+ for (int i = 0; i < fullLockersNeeded; i++) {
+ Locker locker = new Locker(lockerId++);
+ if (locker.addItem(item, item.maxCapacity)) {
+ solution.addLocker(locker);
+ } else {
+ System.out.println("璀﹀憡: 鏃犳硶鍒嗛厤瀹屾暣鍌ㄧ墿鏌滅粰鐗╁搧 " + item.name);
+ }
+ }
+
+ if (remainder > 0) {
+ remainders.put(item.name, remainder);
+ }
+ }
+
+ // 绗簩闃舵锛氫紭鍖栦綑鏂欏垎閰�
+ if (!remainders.isEmpty()) {
+ uniformRemainderProcessing(remainders, itemsToPack, solution, lockerId);
+ }
+
+ // 楠岃瘉缁撴灉
+ if (!validateSolution(items, solution)) {
+ System.out.println("璀﹀憡: 鏁伴噺鍒嗛厤楠岃瘉澶辫触");
+ }
+
+ return solution;
+ }
+
+ /**
+ * 淇鍚庣殑鍧囧寑浣欐枡澶勭悊绠楁硶
+ */
+ private static void uniformRemainderProcessing(Map<String, Integer> remainders,
+ List<Item> items,
+ PackingSolution solution,
+ int startLockerId) {
+ int lockerId = startLockerId;
+
+ // 灏嗕綑鏂欒浆鎹负鍙鐞嗙殑鐗╁搧鍒楄〃
+ List<RemainderItem> remainderItems = new ArrayList<>();
+ for (Item item : items) {
+ Integer remainder = remainders.get(item.name);
+ if (remainder != null && remainder > 0 && item.getRemaining() > 0) {
+ remainderItems.add(new RemainderItem(item, Math.min(remainder, item.getRemaining())));
+ }
+ }
+
+ // 鎸夌墿鍝佸崟浣嶇┖闂翠粠澶у埌灏忔帓搴�
+ remainderItems.sort((a, b) -> Double.compare(b.item.unitSpace, a.item.unitSpace));
+
+ // 浣跨敤淇鍚庣殑浣欐枡澶勭悊绠楁硶
+ List<Locker> remainderLockers = fixedRemainderArrangement(remainderItems, solution, lockerId);
+
+ // 灏嗘渶浼樿В娣诲姞鍒拌В鍐虫柟妗堜腑
+ for (Locker locker : remainderLockers) {
+ solution.addLocker(locker);
+ }
+ }
+
+ /**
+ * 淇鍚庣殑浣欐枡鎺掑垪鏂规
+ */
+ private static List<Locker> fixedRemainderArrangement(List<RemainderItem> remainderItems,
+ PackingSolution solution,
+ int startLockerId) {
+ if (remainderItems.isEmpty()) {
+ return new ArrayList<>();
+ }
+
+ // 鍒涘缓鍓湰閬垮厤淇敼鍘熷鏁版嵁
+ List<RemainderItem> remaining = new ArrayList<>();
+ for (RemainderItem ri : remainderItems) {
+ if (ri.quantity > 0) {
+ remaining.add(new RemainderItem(ri.item, ri.quantity));
+ }
+ }
+
+ List<Locker> lockers = new ArrayList<>();
+ int lockerId = startLockerId;
+
+ // 涓昏绛栫暐锛氬垱寤洪珮鍒╃敤鐜囧偍鐗╂煖
+ while (!remaining.isEmpty()) {
+ Locker locker = createOptimizedLocker(remaining, lockerId);
+ if (locker != null) {
+ lockers.add(locker);
+ lockerId++;
+
+ // 绉婚櫎宸插鐞嗗畬鐨勭墿鍝�
+ Iterator<RemainderItem> iterator = remaining.iterator();
+ while (iterator.hasNext()) {
+ RemainderItem ri = iterator.next();
+ if (ri.quantity == 0) {
+ iterator.remove();
+ }
+ }
+
+ double utilization = (1.0 - locker.remainingSpace) * 100;
+ System.out.println("鍒涘缓鍌ㄧ墿鏌滐紝鍒╃敤鐜�: " + String.format("%.2f", utilization) + "%");
+ } else {
+ break;
+ }
+ }
+
+ // 澶勭悊鍓╀綑鐗╁搧锛堝鏋滄湁锛�
+ if (!remaining.isEmpty()) {
+ System.out.println("浣跨敤鏍囧噯绠楁硶澶勭悊鍓╀綑 " + remaining.size() + " 绉嶇墿鍝�");
+ List<Locker> standardLockers = standardBestFit(remaining, lockerId);
+ lockers.addAll(standardLockers);
+ }
+
+ return lockers;
+ }
+
+ /**
+ * 鍒涘缓浼樺寲鍌ㄧ墿鏌滐紙淇鏁伴噺楠岃瘉锛�
+ */
+ private static Locker createOptimizedLocker(List<RemainderItem> remaining, int lockerId) {
+ if (remaining.isEmpty()) {
+ return null;
+ }
+
+ Locker locker = new Locker(lockerId);
+ double targetUtilization = 0.85;
+ double minUtilization = 0.3; // 鏈�浣庡埄鐢ㄧ巼闃堝��
+
+ // 瀵绘壘鏈�浣崇粍鍚�
+ List<RemainderItem> bestCombination = findValidCombination(remaining, targetUtilization);
+
+ if (bestCombination.isEmpty()) {
+ // 灏濊瘯杈惧埌鏈�浣庡埄鐢ㄧ巼
+ bestCombination = findMinUtilizationCombination(remaining, minUtilization);
+ }
+
+ if (bestCombination.isEmpty()) {
+ return null;
+ }
+
+ // 鍒嗛厤缁勫悎鍒板偍鐗╂煖
+ boolean success = allocateValidCombination(remaining, locker, bestCombination);
+
+ if (!success || locker.contents.isEmpty()) {
+ return null;
+ }
+
+ // 妫�鏌ュ埄鐢ㄧ巼鏄惁鍙帴鍙�
+ double utilization = 1.0 - locker.remainingSpace;
+ if (utilization < minUtilization) {
+ // 鍥炴粴鍒嗛厤
+ rollbackAllocation(remaining, locker);
+ return null;
+ }
+
+ return locker;
+ }
+
+ /**
+ * 瀵绘壘鏈夋晥缁勫悎锛堜慨澶嶆暟閲忛獙璇侊級
+ */
+ private static List<RemainderItem> findValidCombination(List<RemainderItem> items, double targetUtilization) {
+ List<RemainderItem> bestCombination = new ArrayList<>();
+ double[] bestDiff = {Double.MAX_VALUE};
+
+ // 杩囨护鏈夋晥鐗╁搧
+ List<RemainderItem> availableItems = new ArrayList<>();
+ for (RemainderItem ri : items) {
+ if (ri.quantity > 0 && ri.item.getRemaining() > 0) {
+ availableItems.add(ri);
+ }
+ }
+
+ if (availableItems.isEmpty()) {
+ return bestCombination;
+ }
+
+ // 浣跨敤DFS鎼滅储鏈夋晥缁勫悎
+ validDfsCombination(availableItems, 0, 0.0, targetUtilization,
+ new ArrayList<>(), bestCombination, bestDiff);
+
+ return bestCombination;
+ }
+
+ /**
+ * 鏈夋晥鐨凞FS缁勫悎鎼滅储
+ */
+ private static void validDfsCombination(List<RemainderItem> items, int index, double currentSpace,
+ double targetUtilization,
+ List<RemainderItem> current,
+ List<RemainderItem> bestCombination, double[] bestDiff) {
+ // 妫�鏌ュ綋鍓嶇粍鍚堢殑鏈夋晥鎬�
+ if (!current.isEmpty()) {
+ double diff = Math.abs(currentSpace - targetUtilization);
+ if (currentSpace <= 1.0 + 1e-6 && diff < bestDiff[0] && isCombinationValid(current)) {
+ bestCombination.clear();
+ for (RemainderItem ri : current) {
+ bestCombination.add(new RemainderItem(ri.item, ri.quantity));
+ }
+ bestDiff[0] = diff;
+
+ if (diff < 0.01) {
+ return;
+ }
+ }
+ }
+
+ if (index >= items.size() || currentSpace > 1.0 + 1e-6) {
+ return;
+ }
+
+ RemainderItem currentItem = items.get(index);
+
+ // 涓嶉�夋嫨褰撳墠鐗╁搧
+ validDfsCombination(items, index + 1, currentSpace, targetUtilization,
+ current, bestCombination, bestDiff);
+
+ // 閫夋嫨褰撳墠鐗╁搧
+ if (currentItem.quantity > 0) {
+ int maxCanAdd = Math.min(currentItem.quantity,
+ (int) Math.floor((1.0 - currentSpace) / currentItem.item.unitSpace));
+ maxCanAdd = Math.min(maxCanAdd, currentItem.item.getRemaining()); // 閲嶈淇锛氫笉瓒呰繃鍓╀綑鏁伴噺
+
+ for (int qty = 1; qty <= maxCanAdd; qty++) {
+ current.add(new RemainderItem(currentItem.item, qty));
+ validDfsCombination(items, index + 1, currentSpace + qty * currentItem.item.unitSpace,
+ targetUtilization, current, bestCombination, bestDiff);
+ current.remove(current.size() - 1);
+ }
+ }
+ }
+
+ /**
+ * 妫�鏌ョ粍鍚堟槸鍚︽湁鏁堬紙淇鏁伴噺楠岃瘉锛�
+ */
+ private static boolean isCombinationValid(List<RemainderItem> combination) {
+ Map<String, Integer> totalQuantities = new HashMap<>();
+
+ for (RemainderItem ri : combination) {
+ int currentTotal = totalQuantities.getOrDefault(ri.item.name, 0);
+ totalQuantities.put(ri.item.name, currentTotal + ri.quantity);
+
+ // 妫�鏌ユ槸鍚﹁秴杩囩墿鍝佸墿浣欐暟閲�
+ if (currentTotal + ri.quantity > getRemainingQuantity(ri.item)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * 鑾峰彇鐗╁搧鍓╀綑鏁伴噺
+ */
+ private static int getRemainingQuantity(Item item) {
+ return item.stock - item.allocated;
+ }
+
+ /**
+ * 瀵绘壘杈惧埌鏈�浣庡埄鐢ㄧ巼鐨勭粍鍚�
+ */
+ private static List<RemainderItem> findMinUtilizationCombination(List<RemainderItem> items, double minUtilization) {
+ List<RemainderItem> combination = new ArrayList<>();
+ double currentSpace = 0.0;
+
+ // 鎸夊崟浣嶇┖闂存帓搴�
+ List<RemainderItem> sortedItems = new ArrayList<>(items);
+ sortedItems.sort((a, b) -> Double.compare(b.item.unitSpace, a.item.unitSpace));
+
+ for (RemainderItem ri : sortedItems) {
+ if (ri.quantity > 0 && currentSpace < minUtilization) {
+ int maxCanAdd = Math.min(ri.quantity,
+ (int) Math.floor((1.0 - currentSpace) / ri.item.unitSpace));
+ maxCanAdd = Math.min(maxCanAdd, ri.item.getRemaining()); // 閲嶈淇
+
+ if (maxCanAdd > 0) {
+ combination.add(new RemainderItem(ri.item, maxCanAdd));
+ currentSpace += maxCanAdd * ri.item.unitSpace;
+ }
+ }
+ }
+
+ if (currentSpace >= minUtilization) {
+ return combination;
+ }
+
+ return new ArrayList<>();
+ }
+
+ /**
+ * 鍒嗛厤鏈夋晥缁勫悎鍒板偍鐗╂煖锛堜慨澶嶆暟閲忛獙璇侊級
+ */
+ private static boolean allocateValidCombination(List<RemainderItem> remaining, Locker locker,
+ List<RemainderItem> combination) {
+ // 楠岃瘉缁勫悎涓殑鎵�鏈夌墿鍝侀兘鏈夎冻澶熺殑鏁伴噺
+ for (RemainderItem combItem : combination) {
+ boolean found = false;
+ for (RemainderItem remItem : remaining) {
+ if (remItem.item.name.equals(combItem.item.name)) {
+ found = true;
+ if (combItem.quantity > remItem.quantity) {
+ return false;
+ }
+ if (combItem.quantity > remItem.item.getRemaining()) {
+ return false;
+ }
+ break;
+ }
+ }
+ if (!found) {
+ return false;
+ }
+ }
+
+ // 瀹為檯鍒嗛厤
+ for (RemainderItem combItem : combination) {
+ for (RemainderItem remItem : remaining) {
+ if (remItem.item.name.equals(combItem.item.name)) {
+ if (locker.addItem(combItem.item, combItem.quantity)) {
+ remItem.quantity -= combItem.quantity;
+ } else {
+ return false;
+ }
+ break;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * 鍥炴粴鍒嗛厤
+ */
+ private static void rollbackAllocation(List<RemainderItem> remaining, Locker locker) {
+ for (Map.Entry<String, Integer> entry : locker.contents.entrySet()) {
+ String itemName = entry.getKey();
+ int quantity = entry.getValue();
+
+ for (RemainderItem ri : remaining) {
+ if (ri.item.name.equals(itemName)) {
+ ri.quantity += quantity;
+ ri.item.allocated -= quantity; // 鍥炴粴鍒嗛厤鏁伴噺
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * 鏍囧噯鏈�浣抽�傚簲绠楁硶
+ */
+ private static List<Locker> standardBestFit(List<RemainderItem> remainderItems, int startLockerId) {
+ List<Locker> lockers = new ArrayList<>();
+ int lockerId = startLockerId;
+
+ // 鍒涘缓鍓湰
+ List<RemainderItem> remaining = new ArrayList<>();
+ for (RemainderItem ri : remainderItems) {
+ if (ri.quantity > 0) {
+ remaining.add(new RemainderItem(ri.item, ri.quantity));
+ }
+ }
+
+ // 鎸夊崟浣嶇┖闂存帓搴�
+ remaining.sort((a, b) -> Double.compare(b.item.unitSpace, a.item.unitSpace));
+
+ for (RemainderItem ri : remaining) {
+ while (ri.quantity > 0 && ri.item.getRemaining() > 0) {
+ Locker bestLocker = null;
+ double bestRemainingSpace = Double.MAX_VALUE;
+
+ // 瀵绘壘鏈�浣冲偍鐗╂煖
+ for (Locker locker : lockers) {
+ if (locker.canAdd(ri.item, 1) && locker.remainingSpace < bestRemainingSpace) {
+ bestLocker = locker;
+ bestRemainingSpace = locker.remainingSpace;
+ }
+ }
+
+ if (bestLocker != null) {
+ int maxCanAdd = (int) Math.floor(bestLocker.remainingSpace / ri.item.unitSpace);
+ int actualAdd = Math.min(ri.quantity, maxCanAdd);
+ actualAdd = Math.min(actualAdd, ri.item.getRemaining()); // 閲嶈淇
+
+ if (actualAdd > 0 && bestLocker.addItem(ri.item, actualAdd)) {
+ ri.quantity -= actualAdd;
+ } else {
+ break;
+ }
+ } else {
+ // 鍒涘缓鏂板偍鐗╂煖
+ Locker newLocker = new Locker(lockerId++);
+ int maxCanAdd = (int) Math.floor(1.0 / ri.item.unitSpace);
+ int actualAdd = Math.min(ri.quantity, maxCanAdd);
+ actualAdd = Math.min(actualAdd, ri.item.getRemaining()); // 閲嶈淇
+
+ if (actualAdd > 0 && newLocker.addItem(ri.item, actualAdd)) {
+ lockers.add(newLocker);
+ ri.quantity -= actualAdd;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ return lockers;
+ }
+
+ /**
+ * 楠岃瘉瑙e喅鏂规锛堜慨澶嶉獙璇侀�昏緫锛�
+ */
+ private static boolean validateSolution(List<Item> originalItems, PackingSolution solution) {
+ Map<String, Integer> allocatedQuantities = new HashMap<>();
+ Map<String, Integer> originalQuantities = new HashMap<>();
+
+ // 璁板綍鍘熷鏁伴噺
+ for (Item item : originalItems) {
+ originalQuantities.put(item.name, item.stock);
+ }
+
+ // 璁$畻鍒嗛厤鏁伴噺
+ for (Locker locker : solution.lockers) {
+ for (Map.Entry<String, Integer> entry : locker.contents.entrySet()) {
+ String itemName = entry.getKey();
+ int quantity = entry.getValue();
+ allocatedQuantities.put(itemName, allocatedQuantities.getOrDefault(itemName, 0) + quantity);
+ }
+ }
+
+ boolean valid = true;
+ for (Map.Entry<String, Integer> entry : originalQuantities.entrySet()) {
+ String itemName = entry.getKey();
+ int originalQty = entry.getValue();
+ int allocatedQty = allocatedQuantities.getOrDefault(itemName, 0);
+
+ if (originalQty != allocatedQty) {
+ System.out.println("楠岃瘉澶辫触: " + itemName + " 鍘熷鏁伴噺=" + originalQty +
+ ", 鍒嗛厤鏁伴噺=" + allocatedQty);
+ valid = false;
+ }
+ }
+
+ if (valid) {
+ System.out.println("鏁伴噺楠岃瘉閫氳繃");
+ }
+
+ return valid;
+ }
+
+ /**
+ * 鎬ц兘娴嬭瘯鍜屾瘮杈�
+ */
+ public static void performanceTest() {
+ System.out.println("=== 鎬ц兘娴嬭瘯 ===");
+
+ // 娴嬭瘯鏁版嵁
+ List<Item> testItems = Arrays.asList(
+ new Item("X", 20, 87),
+ new Item("Y", 15, 63),
+ new Item("Z", 34, 125),
+ new Item("T", 25, 48),
+ new Item("U", 40, 92)
+ );
+
+ System.out.println("娴嬭瘯鐗╁搧鏁伴噺: " + testItems.size());
+ int totalItems = testItems.stream().mapToInt(item -> item.stock).sum();
+ System.out.println("鎬荤墿鍝佹暟閲�: " + totalItems);
+
+ long startTime = System.currentTimeMillis();
+ PackingSolution solution = optimizedPacking(testItems);
+ long endTime = System.currentTimeMillis();
+
+ System.out.println("\n浼樺寲绠楁硶缁撴灉:");
+ System.out.println("澶勭悊鏃堕棿: " + (endTime - startTime) + "ms");
+ System.out.println("鍌ㄧ墿鏌滄暟閲�: " + solution.totalLockersUsed);
+ System.out.println("绾绫诲偍鐗╂煖: " + solution.pureLockers);
+ System.out.println("绌洪棿鍒╃敤鐜�: " + String.format("%.2f", solution.overallUtilization * 100) + "%");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java b/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java
index 7195635..f2b5c46 100644
--- a/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java
+++ b/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java
@@ -1,7 +1,7 @@
package com.zy.asrs.utils;
-import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.OrderToLine;
+import com.zy.asrs.utils.param.ItemUtilParam;
import java.util.ArrayList;
import java.util.List;
@@ -36,34 +36,29 @@
return sku+sign_F+po+sign_F+upc;
}
- public static OrderToLine GetOrderToLineGro(List<GroupedLockerOptimizerUtils.Item> items,OrderToLine orderToLine){
- List<OrderToLine.MatList> matLists = new ArrayList<>();
- // 浣跨敤鍒嗙粍浼樺厛绠楁硶
- GroupedLockerOptimizerUtils.PackingSolution solution = GroupedLockerOptimizerUtils.packItemsWithGrouping(items);
- for (GroupedLockerOptimizerUtils.Locker locker:solution.lockers) {
- for (String mantnr : locker.contents.keySet()){
- System.out.println(mantnr+"<===>"+locker.contents.get(mantnr));
- String[] split = mantnr.split(Pattern.quote(sign_F));
- OrderToLine.MatList mat = new OrderToLine.MatList(
- split[0], // matnr -> sku
- split[1], // supp -> po -> s1
- locker.contents.get(mantnr).doubleValue(), //鏁存枡
- split[2], //barcode -> upc -> s2
- 1,
- null, //origin -> supplier 璐ф簮
- locker.bindingTags
- );
- matLists.add(mat);
- }
+ public static OrderToLine GetOrderToLine(List<ItemUtilParam.Item> items, OrderToLine orderToLine,String sign){
+ switch (sign){
+ case "Opt":
+ List<OptimizedLockerPackingUtils.Item> itemsOpt = new ArrayList<>();
+ for (ItemUtilParam.Item item:items){
+ itemsOpt.add(new OptimizedLockerPackingUtils.Item(item.getName(),item.getMaxCapacity(),item.getStock()));
+ }
+ return GetOrderToLineOpt(itemsOpt,orderToLine);
+ case "Opt3":
+ List<OptimizedLockerPacking3Utils.Item> itemsOpt3 = new ArrayList<>();
+ for (ItemUtilParam.Item item:items){
+ itemsOpt3.add(new OptimizedLockerPacking3Utils.Item(item.getName(),item.getMaxCapacity(),item.getStock()));
+ }
+ return GetOrderToLineOpt3(itemsOpt3,orderToLine);
+ default:
+ return null;
}
- orderToLine.setMatList(matLists);
- return orderToLine;
}
-
public static OrderToLine GetOrderToLineOpt(List<OptimizedLockerPackingUtils.Item> items,OrderToLine orderToLine){
List<OrderToLine.MatList> matLists = new ArrayList<>();
// 浣跨敤鍒嗙粍浼樺厛绠楁硶
OptimizedLockerPackingUtils.PackingSolution packingSolution = OptimizedLockerPackingUtils.optimizedPacking(items);
+// System.out.println("\n" + packingSolution);
for (OptimizedLockerPackingUtils.Locker locker:packingSolution.lockers) {
for (String mantnr : locker.contents.keySet()){
System.out.println(mantnr+"<===>"+locker.contents.get(mantnr));
@@ -83,4 +78,30 @@
orderToLine.setMatList(matLists);
return orderToLine;
}
+
+ public static OrderToLine GetOrderToLineOpt3(List<OptimizedLockerPacking3Utils.Item> items,OrderToLine orderToLine){
+ List<OrderToLine.MatList> matLists = new ArrayList<>();
+ // 浣跨敤鍒嗙粍浼樺厛绠楁硶
+ OptimizedLockerPacking3Utils.PackingSolution packingSolution = OptimizedLockerPacking3Utils.optimizedPacking(items);
+// System.out.println("\n" + packingSolution);
+ for (OptimizedLockerPacking3Utils.Locker locker:packingSolution.lockers) {
+ for (String mantnr : locker.contents.keySet()){
+// System.out.println(mantnr+"<===>"+locker.contents.get(mantnr));
+ String[] split = mantnr.split(Pattern.quote(sign_F));
+ OrderToLine.MatList mat = new OrderToLine.MatList(
+ split[0], // matnr -> sku
+ split[1], // supp -> po -> s1
+ locker.contents.get(mantnr).doubleValue(), //鏁存枡
+ split[2], //barcode -> upc -> s2
+ 1,
+ null, //origin -> supplier 璐ф簮
+ locker.bindingTags
+ );
+ matLists.add(mat);
+ }
+ }
+ orderToLine.setMatList(matLists);
+ return orderToLine;
+ }
+
}
diff --git a/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java b/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java
index 4ca44df..39c799c 100644
--- a/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java
+++ b/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java
@@ -2,24 +2,78 @@
import lombok.Data;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
@Data
public class ItemUtilParam {
- String name;
- double unitSpace;
- int maxCapacity;
- int stock;
- int remaining;
- public ItemUtilParam(String name, int maxCapacity, int stock) {
- this.name = name;
- this.maxCapacity = maxCapacity;
- this.unitSpace = 1.0 / maxCapacity;
- this.stock = stock;
- this.remaining = stock;
+ @Data
+ public static class Item {
+ String name;
+ double unitSpace;
+ int maxCapacity;
+ int stock;
+ int remaining;
+
+ public Item(String name, int maxCapacity, int stock) {
+ this.name = name;
+ this.maxCapacity = maxCapacity;
+ this.unitSpace = 1.0 / maxCapacity;
+ this.stock = stock;
+ this.remaining = stock;
+ }
+
+ @Override
+ public String toString() {
+ return name + "(鍗曟斁" + maxCapacity + "涓�, 搴撳瓨" + stock + "涓�)";
+ }
}
- @Override
- public String toString() {
- return name + "(鍗曟斁" + maxCapacity + "涓�, 搴撳瓨" + stock + "涓�)";
+
+ static class Locker {
+ int id;
+ double remainingSpace;
+ long bindingTags;
+ Map<String, Integer> contents;
+ Set<String> itemTypes;
+
+ public Locker(int id) {
+ this.id = id;
+ this.remainingSpace = 1.0;
+ this.contents = new HashMap<>();
+ this.itemTypes = new HashSet<>();
+ this.bindingTags = System.currentTimeMillis();
+
+ }
+
+ public boolean canAdd(ItemUtilParam.Item item, int quantity) {
+ return remainingSpace >= quantity * item.unitSpace;
+ }
+
+ public void addItem(ItemUtilParam.Item item, int quantity) {
+ double spaceUsed = quantity * item.unitSpace;
+ remainingSpace -= spaceUsed;
+ contents.put(item.name, contents.getOrDefault(item.name, 0) + quantity);
+ itemTypes.add(item.name);
+ item.remaining -= quantity;
+ }
+
+ public boolean containsItemType(String itemName) {
+ return itemTypes.contains(itemName);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("鍌ㄧ墿鏌�").append(id).append(": ");
+ sb.append(String.format("鍓╀綑绌洪棿%.4f", remainingSpace)).append("\n");
+ for (Map.Entry<String, Integer> entry : contents.entrySet()) {
+ sb.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append("涓猏n");
+ }
+ return sb.toString();
+ }
}
}
diff --git a/src/main/java/com/zy/common/config/ControllerResAdvice.java b/src/main/java/com/zy/common/config/ControllerResAdvice.java
index ba399ec..4f603c4 100644
--- a/src/main/java/com/zy/common/config/ControllerResAdvice.java
+++ b/src/main/java/com/zy/common/config/ControllerResAdvice.java
@@ -85,7 +85,6 @@
ApiLog apiLog = apiLogService.selectOne(new EntityWrapper<ApiLog>()
.eq("namespace", name)
- .eq("request", request)
.eq("response", response)
.eq("result", success? 1:0)
.orderBy("create_time", false)
diff --git a/src/main/webapp/static/js/apiLog/apiLog.js b/src/main/webapp/static/js/apiLog/apiLog.js
index 1d24b5e..947f693 100644
--- a/src/main/webapp/static/js/apiLog/apiLog.js
+++ b/src/main/webapp/static/js/apiLog/apiLog.js
@@ -21,24 +21,25 @@
cellMinWidth: 50,
height: 'full-120',
cols: [[
- {type: 'checkbox'}
+ // {type: 'checkbox'}
// ,{field: 'id', align: 'center',title: 'ID'}
// ,{field: 'uuid', align: 'center',title: '鏃ュ織缂栧彿'}
- ,{field: 'namespace', align: 'center',title: '鍚嶇О绌洪棿'}
- ,{field: 'url', align: 'center',title: '琛ㄥ崟ID'}
+ // ,
+ {field: 'namespace', align: 'center',title: '鍚嶇О绌洪棿',hide: false}
+ ,{field: 'url', align: 'center',title: '鎺ュ彛鍦板潃',hide: false}
,{field: 'appkey', align: 'center',title: '骞冲彴瀵嗛挜',hide: true}
- // ,{field: 'timestamp', align: 'center',title: '鏃堕棿鎴�'}
- ,{field: 'clientIp', align: 'center',title: 'URL',hide: true}
- ,{field: 'request', align: 'center',title: '璇锋眰鍐呭'}
- ,{field: 'response', align: 'center',title: '鎿嶄綔鍐呭'}
- // ,{field: 'err', align: 'center',title: '寮傚父鍐呭'}
- ,{field: 'result$', align: 'center',title: '缁撴灉', templet: '#resTpl', width: 80}
+ ,{field: 'timestamp', align: 'center',title: '鏃堕棿鎴�',hide: true}
+ ,{field: 'clientIp', align: 'center',title: '瀹㈡埛绔疘P',hide: false}
+ ,{field: 'request', align: 'center',title: '璇锋眰鍐呭',hide: false}
+ ,{field: 'response', align: 'center',title: '鎿嶄綔鍐呭',hide: false}
+ // ,{field: 'err', align: 'center',title: '寮傚父鍐呭',hide: true}
+ ,{field: 'result$', align: 'center',title: '缁撴灉', templet: '#resTpl', width: 80,hide: false}
// ,{field: 'status$', align: 'center',title: '鐘舵��'}
- ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿'}
+ ,{field: 'createTime$', align: 'center',title: '娣诲姞鏃堕棿',hide: false}
// ,{field: 'updateTime$', align: 'center',title: '淇敼鏃堕棿'}
,{field: 'memo', align: 'center',title: '澶囨敞', hide: true}
- ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80}
+ ,{fixed: 'right', title:'鎿嶄綔', align: 'center', toolbar: '#operate', width: 80, hide: true}
]],
request: {
pageName: 'curr',
diff --git a/src/main/webapp/views/apiLog/apiLog.html b/src/main/webapp/views/apiLog/apiLog.html
index e35b6a9..132658e 100644
--- a/src/main/webapp/views/apiLog/apiLog.html
+++ b/src/main/webapp/views/apiLog/apiLog.html
@@ -24,6 +24,12 @@
</div>
</div>
<div class="layui-inline">
+ <label class="layui-form-label">鎺ュ彛鍦板潃: </label>
+ <div class="layui-input-inline">
+ <input class="layui-input" type="text" name="url" placeholder="璇疯緭鍏ユ帴鍙e湴鍧�" autocomplete="off">
+ </div>
+ </div>
+ <div class="layui-inline">
<label class="layui-form-label">璇锋眰鍐呭:</label>
<div class="layui-input-inline">
<input class="layui-input" type="text" name="request" placeholder="璇疯緭鍏ワ紙璁㈠崟鍙锋垨鍝佸彿锛�" autocomplete="off">
@@ -47,7 +53,7 @@
<script type="text/html" id="toolbar">
<div class="layui-btn-container">
<!-- <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">鏂板</button>-->
- <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>
+<!-- <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">鍒犻櫎</button>-->
<button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">瀵煎嚭</button>
</div>
</script>
--
Gitblit v1.9.1