|
@@ -13,6 +13,7 @@ import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
import java.util.HashSet;
|
|
import java.util.HashSet;
|
|
|
import java.util.LinkedHashMap;
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
+import java.util.LinkedHashSet;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
@@ -34,6 +35,13 @@ public class ErpProductionOrderService {
|
|
|
private final ConcurrentHashMap<String, ViewDetailCacheEntry> viewCategoryCache = new ConcurrentHashMap<>();
|
|
private final ConcurrentHashMap<String, ViewDetailCacheEntry> viewCategoryCache = new ConcurrentHashMap<>();
|
|
|
/** BillQuery 存货类别字段不可用时会自动降级为 View 兜底 */
|
|
/** BillQuery 存货类别字段不可用时会自动降级为 View 兜底 */
|
|
|
private volatile boolean billQueryCategoryFieldDisabled = false;
|
|
private volatile boolean billQueryCategoryFieldDisabled = false;
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 生产订单「领料套数」BillQuery 字段(金蝶列表领料状态据此计算)。
|
|
|
|
|
+ * 勿加入已确认不存在的标识(如 FPickMtrlQty),否则会反复触发元数据报错。
|
|
|
|
|
+ */
|
|
|
|
|
+ private static final List<String> PICK_EXTRA_FIELD_CANDIDATES = Arrays.asList(
|
|
|
|
|
+ "FIssueQty", "FPickMtrlStatus");
|
|
|
|
|
+ private final Set<String> disabledPickExtraFields = ConcurrentHashMap.newKeySet();
|
|
|
private static final String HEADER_FIELD_KEYS = String.join(",",
|
|
private static final String HEADER_FIELD_KEYS = String.join(",",
|
|
|
"FID",
|
|
"FID",
|
|
|
"FBILLNO",
|
|
"FBILLNO",
|
|
@@ -243,14 +251,14 @@ public class ErpProductionOrderService {
|
|
|
int startRow, int limit) {
|
|
int startRow, int limit) {
|
|
|
JSONObject data = new JSONObject();
|
|
JSONObject data = new JSONObject();
|
|
|
data.put("FormId", FORM_ID);
|
|
data.put("FormId", FORM_ID);
|
|
|
- data.put("FieldKeys", DETAIL_FIELD_KEYS);
|
|
|
|
|
|
|
+ data.put("FieldKeys", buildDetailFieldKeys());
|
|
|
data.put("FilterString", buildMaterialNumberFilter(billNo, materialNumbers));
|
|
data.put("FilterString", buildMaterialNumberFilter(billNo, materialNumbers));
|
|
|
data.put("OrderString", "FDate DESC,FBILLNO DESC,FTreeEntity_FSeq");
|
|
data.put("OrderString", "FDate DESC,FBILLNO DESC,FTreeEntity_FSeq");
|
|
|
data.put("StartRow", Math.max(startRow, 0));
|
|
data.put("StartRow", Math.max(startRow, 0));
|
|
|
data.put("Limit", Math.max(limit, 1));
|
|
data.put("Limit", Math.max(limit, 1));
|
|
|
logger.info("ERP production order material-filter query: {}", data.toJSONString());
|
|
logger.info("ERP production order material-filter query: {}", data.toJSONString());
|
|
|
|
|
|
|
|
- JSONArray rows = erpClient.billQuery(data);
|
|
|
|
|
|
|
+ JSONArray rows = executeDetailBillQuery(data, false);
|
|
|
List<ErpProductionOrder> list = new ArrayList<>();
|
|
List<ErpProductionOrder> list = new ArrayList<>();
|
|
|
for (int i = 0; i < rows.size(); i++) {
|
|
for (int i = 0; i < rows.size(); i++) {
|
|
|
list.add(toDetail(rows.getJSONObject(i), i));
|
|
list.add(toDetail(rows.getJSONObject(i), i));
|
|
@@ -404,6 +412,9 @@ public class ErpProductionOrderService {
|
|
|
if (!isBillQueryCategoryFieldError(ex)) {
|
|
if (!isBillQueryCategoryFieldError(ex)) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (billQueryCategoryFieldDisabled) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
billQueryCategoryFieldDisabled = true;
|
|
billQueryCategoryFieldDisabled = true;
|
|
|
logger.warn("ERP BillQuery 存货类别字段 {} 不可用,已切换为 View 兜底:{}",
|
|
logger.warn("ERP BillQuery 存货类别字段 {} 不可用,已切换为 View 兜底:{}",
|
|
|
erpProperties.getInventoryCategoryField(), ex.getMessage());
|
|
erpProperties.getInventoryCategoryField(), ex.getMessage());
|
|
@@ -412,24 +423,37 @@ public class ErpProductionOrderService {
|
|
|
|
|
|
|
|
private boolean isBillQueryCategoryFieldError(IllegalStateException ex) {
|
|
private boolean isBillQueryCategoryFieldError(IllegalStateException ex) {
|
|
|
String message = ex.getMessage();
|
|
String message = ex.getMessage();
|
|
|
- return message != null && message.contains("不存在");
|
|
|
|
|
|
|
+ String categoryField = erpProperties.getInventoryCategoryField();
|
|
|
|
|
+ return message != null
|
|
|
|
|
+ && message.contains("不存在")
|
|
|
|
|
+ && StringUtils.isNotBlank(categoryField)
|
|
|
|
|
+ && message.contains(categoryField.trim());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private JSONArray executeDetailBillQuery(JSONObject data, boolean strictCategoryField) {
|
|
private JSONArray executeDetailBillQuery(JSONObject data, boolean strictCategoryField) {
|
|
|
- try {
|
|
|
|
|
- return erpClient.billQuery(data);
|
|
|
|
|
- } catch (IllegalStateException ex) {
|
|
|
|
|
- String categoryField = erpProperties.getInventoryCategoryField();
|
|
|
|
|
- if (disableBillQueryCategoryFieldIfInvalid(ex)) {
|
|
|
|
|
- if (strictCategoryField) {
|
|
|
|
|
- throw ex;
|
|
|
|
|
- }
|
|
|
|
|
- data.put("FieldKeys", DETAIL_FIELD_KEYS);
|
|
|
|
|
- data.put("FilterString", stripCategoryFilter(data.getString("FilterString"), categoryField));
|
|
|
|
|
|
|
+ int attempts = 0;
|
|
|
|
|
+ while (attempts < 12) {
|
|
|
|
|
+ data.put("FieldKeys", buildDetailFieldKeys());
|
|
|
|
|
+ try {
|
|
|
return erpClient.billQuery(data);
|
|
return erpClient.billQuery(data);
|
|
|
|
|
+ } catch (IllegalStateException ex) {
|
|
|
|
|
+ attempts++;
|
|
|
|
|
+ // 先处理领料扩展字段缺失,避免误判成存货类别字段不可用
|
|
|
|
|
+ if (disableMissingPickExtraField(ex)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (disableBillQueryCategoryFieldIfInvalid(ex)) {
|
|
|
|
|
+ if (strictCategoryField) {
|
|
|
|
|
+ throw ex;
|
|
|
|
|
+ }
|
|
|
|
|
+ String categoryField = erpProperties.getInventoryCategoryField();
|
|
|
|
|
+ data.put("FilterString", stripCategoryFilter(data.getString("FilterString"), categoryField));
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ throw ex;
|
|
|
}
|
|
}
|
|
|
- throw ex;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ throw new IllegalStateException("ERP BillQuery 多次重试后仍失败");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String stripCategoryFilter(String filterString, String categoryField) {
|
|
private String stripCategoryFilter(String filterString, String categoryField) {
|
|
@@ -754,6 +778,11 @@ public class ErpProductionOrderService {
|
|
|
order.setWorkshopName(detail.getWorkshopName());
|
|
order.setWorkshopName(detail.getWorkshopName());
|
|
|
order.setPlannerName(detail.getPlannerName());
|
|
order.setPlannerName(detail.getPlannerName());
|
|
|
order.setInventoryCategory(detail.getInventoryCategory());
|
|
order.setInventoryCategory(detail.getInventoryCategory());
|
|
|
|
|
+ order.setBusinessStatus(detail.getBusinessStatus());
|
|
|
|
|
+ order.setBusinessStatusName(detail.getBusinessStatusName());
|
|
|
|
|
+ order.setPickMtrlQty(detail.getPickMtrlQty());
|
|
|
|
|
+ order.setPickStatus(detail.getPickStatus());
|
|
|
|
|
+ order.setPickStatusName(detail.getPickStatusName());
|
|
|
return order;
|
|
return order;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -786,6 +815,9 @@ public class ErpProductionOrderService {
|
|
|
order.setPlanFinishDate(formatErpDate(row.getString("FPlanFinishDate")));
|
|
order.setPlanFinishDate(formatErpDate(row.getString("FPlanFinishDate")));
|
|
|
order.setBusinessStatus(row.getString("FStatus"));
|
|
order.setBusinessStatus(row.getString("FStatus"));
|
|
|
order.setBusinessStatusName(businessStatusName(order.getBusinessStatus()));
|
|
order.setBusinessStatusName(businessStatusName(order.getBusinessStatus()));
|
|
|
|
|
+ order.setPickMtrlQty(firstDecimal(row, "FIssueQty"));
|
|
|
|
|
+ order.setPickStatus(firstNonBlank(row.getString("FPickMtrlStatus")));
|
|
|
|
|
+ order.setPickStatusName(resolvePickStatusName(order.getPickStatus(), order.getPickMtrlQty(), order.getQty()));
|
|
|
order.setStockName(row.getString("FStockId.FNAME"));
|
|
order.setStockName(row.getString("FStockId.FNAME"));
|
|
|
order.setBomNumber(row.getString("FBomId.FNUMBER"));
|
|
order.setBomNumber(row.getString("FBomId.FNUMBER"));
|
|
|
order.setRoutingNumber(row.getString("FRoutingId.FNUMBER"));
|
|
order.setRoutingNumber(row.getString("FRoutingId.FNUMBER"));
|
|
@@ -906,6 +938,19 @@ public class ErpProductionOrderService {
|
|
|
if (qty != null) {
|
|
if (qty != null) {
|
|
|
summary.totalQty = summary.totalQty.add(qty);
|
|
summary.totalQty = summary.totalQty.add(qty);
|
|
|
}
|
|
}
|
|
|
|
|
+ String entryStatus = firstNonBlank(entry.getString("Status"), entry.getString("FStatus"));
|
|
|
|
|
+ String statusName = businessStatusName(entryStatus);
|
|
|
|
|
+ if (StringUtils.isNotBlank(statusName) && !summary.businessStatusNames.contains(statusName)) {
|
|
|
|
|
+ summary.businessStatusNames.add(statusName);
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal pickQty = firstDecimal(entry, "IssueQty", "FIssueQty");
|
|
|
|
|
+ String pickStatus = firstNonBlank(
|
|
|
|
|
+ entry.getString("PickMtrlStatus"),
|
|
|
|
|
+ entry.getString("FPickMtrlStatus"));
|
|
|
|
|
+ String pickStatusName = resolvePickStatusName(pickStatus, pickQty, qty);
|
|
|
|
|
+ if (StringUtils.isNotBlank(pickStatusName) && !summary.pickStatusNames.contains(pickStatusName)) {
|
|
|
|
|
+ summary.pickStatusNames.add(pickStatusName);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
return summary;
|
|
return summary;
|
|
|
}
|
|
}
|
|
@@ -983,6 +1028,22 @@ public class ErpProductionOrderService {
|
|
|
return "";
|
|
return "";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private BigDecimal firstDecimal(JSONObject row, String... keys) {
|
|
|
|
|
+ if (row == null || keys == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (String key : keys) {
|
|
|
|
|
+ if (StringUtils.isBlank(key)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal value = row.getBigDecimal(key);
|
|
|
|
|
+ if (value != null) {
|
|
|
|
|
+ return ErpKingdeeParseUtils.normalizeQtyNullable(value);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/** BillQuery 明细行优先取 FWorkShopID,表头 FWorkShopID0 兜底 */
|
|
/** BillQuery 明细行优先取 FWorkShopID,表头 FWorkShopID0 兜底 */
|
|
|
private String readWorkshopName(JSONObject row) {
|
|
private String readWorkshopName(JSONObject row) {
|
|
|
return firstNonBlank(
|
|
return firstNonBlank(
|
|
@@ -1007,6 +1068,8 @@ public class ErpProductionOrderService {
|
|
|
if (StringUtils.isBlank(header.getPlannerName())) {
|
|
if (StringUtils.isBlank(header.getPlannerName())) {
|
|
|
header.setPlannerName(detail.getPlannerName());
|
|
header.setPlannerName(detail.getPlannerName());
|
|
|
}
|
|
}
|
|
|
|
|
+ mergeBusinessStatusName(header, detail.getBusinessStatus(), detail.getBusinessStatusName());
|
|
|
|
|
+ mergePickStatusName(header, detail.getPickStatusName());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void mergeHeaderFieldsFromSummary(ErpProductionOrder header, ViewDetailSummary summary) {
|
|
private void mergeHeaderFieldsFromSummary(ErpProductionOrder header, ViewDetailSummary summary) {
|
|
@@ -1019,6 +1082,53 @@ public class ErpProductionOrderService {
|
|
|
if (StringUtils.isBlank(header.getPlannerName())) {
|
|
if (StringUtils.isBlank(header.getPlannerName())) {
|
|
|
header.setPlannerName(summary.plannerName);
|
|
header.setPlannerName(summary.plannerName);
|
|
|
}
|
|
}
|
|
|
|
|
+ if (StringUtils.isBlank(header.getBusinessStatusName()) && !summary.businessStatusNames.isEmpty()) {
|
|
|
|
|
+ header.setBusinessStatusName(String.join(" / ", summary.businessStatusNames));
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(header.getPickStatusName()) && !summary.pickStatusNames.isEmpty()) {
|
|
|
|
|
+ header.setPickStatusName(String.join(" / ", summary.pickStatusNames));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void mergeBusinessStatusName(ErpProductionOrder header, String status, String statusName) {
|
|
|
|
|
+ String name = StringUtils.isNotBlank(statusName) ? statusName.trim() : businessStatusName(status);
|
|
|
|
|
+ if (StringUtils.isBlank(name)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(header.getBusinessStatusName())) {
|
|
|
|
|
+ header.setBusinessStatus(status);
|
|
|
|
|
+ header.setBusinessStatusName(name);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Set<String> names = new LinkedHashSet<>();
|
|
|
|
|
+ for (String part : header.getBusinessStatusName().split(" / ")) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(part)) {
|
|
|
|
|
+ names.add(part.trim());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (names.add(name)) {
|
|
|
|
|
+ header.setBusinessStatusName(String.join(" / ", names));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void mergePickStatusName(ErpProductionOrder header, String pickStatusName) {
|
|
|
|
|
+ if (header == null || StringUtils.isBlank(pickStatusName)) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ String name = pickStatusName.trim();
|
|
|
|
|
+ if (StringUtils.isBlank(header.getPickStatusName())) {
|
|
|
|
|
+ header.setPickStatusName(name);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ Set<String> names = new LinkedHashSet<>();
|
|
|
|
|
+ for (String part : header.getPickStatusName().split(" / ")) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(part)) {
|
|
|
|
|
+ names.add(part.trim());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (names.add(name)) {
|
|
|
|
|
+ header.setPickStatusName(String.join(" / ", names));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private boolean isAllowedCategory(String value) {
|
|
private boolean isAllowedCategory(String value) {
|
|
@@ -1120,14 +1230,56 @@ public class ErpProductionOrderService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private String buildDetailFieldKeys() {
|
|
private String buildDetailFieldKeys() {
|
|
|
- if (!useBillQueryCategoryField()) {
|
|
|
|
|
- return DETAIL_FIELD_KEYS;
|
|
|
|
|
|
|
+ String keys = DETAIL_FIELD_KEYS;
|
|
|
|
|
+ if (useBillQueryCategoryField()) {
|
|
|
|
|
+ keys = keys + "," + erpProperties.getInventoryCategoryField().trim();
|
|
|
|
|
+ }
|
|
|
|
|
+ String pickFields = getEnabledPickExtraFields();
|
|
|
|
|
+ if (StringUtils.isNotBlank(pickFields)) {
|
|
|
|
|
+ keys = keys + "," + pickFields;
|
|
|
|
|
+ }
|
|
|
|
|
+ return keys;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String getEnabledPickExtraFields() {
|
|
|
|
|
+ List<String> enabled = new ArrayList<>();
|
|
|
|
|
+ for (String field : PICK_EXTRA_FIELD_CANDIDATES) {
|
|
|
|
|
+ if (!disabledPickExtraFields.contains(field)) {
|
|
|
|
|
+ enabled.add(field);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- return DETAIL_FIELD_KEYS + "," + erpProperties.getInventoryCategoryField().trim();
|
|
|
|
|
|
|
+ return String.join(",", enabled);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean disableMissingPickExtraField(IllegalStateException ex) {
|
|
|
|
|
+ String message = ex.getMessage();
|
|
|
|
|
+ if (message == null || !message.contains("不存在")) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (String field : PICK_EXTRA_FIELD_CANDIDATES) {
|
|
|
|
|
+ if (!disabledPickExtraFields.contains(field) && messageContainsField(message, field)) {
|
|
|
|
|
+ disabledPickExtraFields.add(field);
|
|
|
|
|
+ logger.warn("ERP BillQuery 生产订单字段 {} 不可用,已跳过", field);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean messageContainsField(String message, String field) {
|
|
|
|
|
+ if (StringUtils.isBlank(message) || StringUtils.isBlank(field)) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ return message.contains("标识为" + field)
|
|
|
|
|
+ || message.contains("\"" + field + "\"")
|
|
|
|
|
+ || message.contains("'" + field + "'")
|
|
|
|
|
+ || message.contains(field);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static class ViewDetailSummary {
|
|
private static class ViewDetailSummary {
|
|
|
private final Map<String, String> categories = new LinkedHashMap<>();
|
|
private final Map<String, String> categories = new LinkedHashMap<>();
|
|
|
|
|
+ private final List<String> businessStatusNames = new ArrayList<>();
|
|
|
|
|
+ private final List<String> pickStatusNames = new ArrayList<>();
|
|
|
private int entryCount;
|
|
private int entryCount;
|
|
|
private BigDecimal totalQty = BigDecimal.ZERO;
|
|
private BigDecimal totalQty = BigDecimal.ZERO;
|
|
|
private String workshopName = "";
|
|
private String workshopName = "";
|
|
@@ -1191,6 +1343,59 @@ public class ErpProductionOrderService {
|
|
|
if ("6".equals(status)) {
|
|
if ("6".equals(status)) {
|
|
|
return "结案";
|
|
return "结案";
|
|
|
}
|
|
}
|
|
|
|
|
+ if ("7".equals(status)) {
|
|
|
|
|
+ return "结算";
|
|
|
|
|
+ }
|
|
|
return status;
|
|
return status;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private String resolvePickStatusName(String status, BigDecimal pickQty, BigDecimal orderQty) {
|
|
|
|
|
+ String mapped = pickStatusName(status);
|
|
|
|
|
+ if (StringUtils.isNotBlank(mapped)) {
|
|
|
|
|
+ return mapped;
|
|
|
|
|
+ }
|
|
|
|
|
+ return computePickStatusName(pickQty, orderQty);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String pickStatusName(String status) {
|
|
|
|
|
+ if (StringUtils.isBlank(status)) {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ String trimmed = status.trim();
|
|
|
|
|
+ if ("未领料".equals(trimmed) || "部分领料".equals(trimmed)
|
|
|
|
|
+ || "全部领料".equals(trimmed) || "超额领料".equals(trimmed)) {
|
|
|
|
|
+ return trimmed;
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("0".equals(trimmed) || "1".equals(trimmed)) {
|
|
|
|
|
+ return "未领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("2".equals(trimmed)) {
|
|
|
|
|
+ return "部分领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("3".equals(trimmed)) {
|
|
|
|
|
+ return "全部领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ if ("4".equals(trimmed)) {
|
|
|
|
|
+ return "超额领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String computePickStatusName(BigDecimal pickQty, BigDecimal orderQty) {
|
|
|
|
|
+ if (pickQty == null) {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ BigDecimal qty = orderQty == null ? BigDecimal.ZERO : orderQty;
|
|
|
|
|
+ if (pickQty.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
|
|
+ return "未领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ int cmp = pickQty.compareTo(qty);
|
|
|
|
|
+ if (cmp < 0) {
|
|
|
|
|
+ return "部分领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ if (cmp == 0) {
|
|
|
|
|
+ return "全部领料";
|
|
|
|
|
+ }
|
|
|
|
|
+ return "超额领料";
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|