|
|
@@ -10,8 +10,7 @@ import com.actionsoft.sdk.local.SDK;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
import java.sql.Connection;
|
|
|
-import java.util.LinkedHashSet;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
|
|
|
public class costPickFormAfterSave extends ExecuteListener {
|
|
|
public String getDescription() {
|
|
|
@@ -114,25 +113,13 @@ public class costPickFormAfterSave extends ExecuteListener {
|
|
|
costProductBO.setBindId(processInstance.getId());
|
|
|
|
|
|
// costProductBO.setBindId(SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_COST", contractCostId, "BINDID").toString());
|
|
|
-
|
|
|
costProductBO.set("WAREHOUSE_ID", WAREHOUSE_ID);
|
|
|
costProductBO.set("CONTRACT_COST_ID", contractCostId);
|
|
|
costProductBO.set("QUANTITY", pickBO.get("PICK_QUANTITY"));
|
|
|
costProductBO.set("SN", pick_sns);
|
|
|
-
|
|
|
costProductBO.set("STATUS_ID", STATUS_ID);
|
|
|
-
|
|
|
costProductBO.set("OLD_QUANTITY", costProductBO.get("QUANTITY"));//配送数量
|
|
|
SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_COST_PRODUCT", costProductBO, processExecutionContext.getUserContext(), conn);
|
|
|
- if (StringUtils.isNotBlank(pick_sns)) {
|
|
|
- for (String serialNumber : pickSerials) {
|
|
|
- BO snBO = new BO();
|
|
|
- snBO.setBindId(costProductBO.getBindId());
|
|
|
- snBO.set("CONTRACT_COST_PRODUCT_ID", costProductBO.getId());
|
|
|
- snBO.set("SN", serialNumber);
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_COST_PRODUCT_SN", snBO, processExecutionContext.getUserContext(), conn);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
|
|
|
//修改状态
|
|
|
@@ -176,16 +163,11 @@ public class costPickFormAfterSave extends ExecuteListener {
|
|
|
ivtTransfer.set("PRODUCT_ID", pickBO.getString("PRODUCT_ID"));
|
|
|
ivtTransfer.set("QUANTITY", pickBO.get("PICK_QUANTITY"));
|
|
|
ivtTransfer.set("TYPE_ID", 1481); // 仓库间转移
|
|
|
+ if (pickSerials.size() > 0)
|
|
|
+ ivtTransfer.set("SN", StringUtils.join(pickSerials, ","));//产品序列号
|
|
|
SDK.getBOAPI().create("BO_EU_DNIVT_TRANSFER", ivtTransfer, transfeProcessIns, processExecutionContext.getUserContext(), conn);
|
|
|
- //BO_EU_DNIVT_TRANSFER_SN
|
|
|
- for (String serialNumber : pickSerials) {
|
|
|
- BO snBO = new BO();
|
|
|
- snBO.setBindId(ivtTransfer.getBindId());
|
|
|
- snBO.set("TRANSFER_ID", ivtTransfer.getId());
|
|
|
- snBO.set("SN", serialNumber);
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNIVT_TRANSFER_SN", snBO, processExecutionContext.getUserContext(), conn);
|
|
|
- }
|
|
|
|
|
|
+ //库存增加
|
|
|
BO toWarehouseProductBO = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT").connection(conn).addQuery("PRODUCT_ID=", pickBO.getString("PRODUCT_ID")).addQuery("WAREHOUSE_ID=", WAREHOUSE_ID).detail();
|
|
|
if (toWarehouseProductBO != null) {
|
|
|
toWarehouseProductBO.set("QUANTITY", ObjToInt(toWarehouseProductBO.get("QUANTITY")) + ObjToInt(pickBO.get("PICK_QUANTITY")));
|
|
|
@@ -200,23 +182,119 @@ public class costPickFormAfterSave extends ExecuteListener {
|
|
|
SDK.getBOAPI().create("BO_EU_DNIVT_WAREHOUSE_PRODUCT", toWarehouseProductBO, twpProcessIns, processExecutionContext.getUserContext(), conn);
|
|
|
}
|
|
|
|
|
|
- //库存转移
|
|
|
+ //库存减少
|
|
|
BO fromWarehouseProductBO = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT").connection(conn).addQuery("PRODUCT_ID=", pickBO.getString("PRODUCT_ID")).addQuery("WAREHOUSE_ID=", pickBO.getString("WAREHOUSE_ID")).detail();
|
|
|
fromWarehouseProductBO.set("QUANTITY", ObjToInt(fromWarehouseProductBO.get("QUANTITY")) - ObjToInt(pickBO.get("PICK_QUANTITY")));
|
|
|
- SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT", fromWarehouseProductBO, conn);
|
|
|
|
|
|
- //BO_EU_DNIVT_WAREHOUSE_PRODUCT_SN
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT", fromWarehouseProductBO, conn);
|
|
|
|
|
|
- for (String serialNumber : pickSerials) {
|
|
|
- DBSql.update(conn, "update BO_EU_DNIVT_WAREHOUSE_PRODUCT_SN set WAREHOUSE_PRODUCT_ID=? where WAREHOUSE_PRODUCT_ID=? and SN=?", new Object[]{toWarehouseProductBO.getId(), fromWarehouseProductBO.getId(), serialNumber});
|
|
|
+ int pickQuantity = ObjToInt(pickBO.get("PICK_QUANTITY"));//拣货数量
|
|
|
+
|
|
|
+
|
|
|
+ //序列号减少 修改库存批次
|
|
|
+ List<BO> lots = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT").addQuery("BINDID=", fromWarehouseProductBO.getBindId()).addQuery("QUANTITY>", 0).orderByCreated().list();
|
|
|
+ int cnt = 0;
|
|
|
+ for (BO lot : lots) {
|
|
|
+ if (pickSerials.size() > 0) {
|
|
|
+ //序列化产品
|
|
|
+ boolean isIn = false;
|
|
|
+ String lotSN = lot.getString("SN");
|
|
|
+ lotSN = "," + lotSN + ",";
|
|
|
+ List<String> toSN = new ArrayList<>();
|
|
|
+ for (String sn : pickSerials) {
|
|
|
+ if (lotSN.contains("," + sn + ",")) {
|
|
|
+ isIn = true;
|
|
|
+ lotSN = lotSN.replace("," + sn + ",", ",");
|
|
|
+ toSN.add(sn);
|
|
|
+ cnt++;
|
|
|
+ }
|
|
|
+ if (cnt >= pickSerials.size())
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (isIn) {
|
|
|
+ if (StringUtils.isNotBlank(lotSN)) {
|
|
|
+ lotSN = lotSN.replaceAll("^,+|,+$", "") // 移除首尾一个或多个逗号
|
|
|
+ .replaceAll(",+", ","); // 合并中间连续逗号
|
|
|
+ int count = (int) lotSN.chars().filter(c -> c == ',').count();
|
|
|
+ lot.set("SN", lotSN);
|
|
|
+ lot.set("QUANTITY", count + 1);
|
|
|
+ } else {
|
|
|
+ lot.set("SN", "");
|
|
|
+ lot.set("QUANTITY", 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新批次上序列号
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", lot, conn);
|
|
|
+
|
|
|
+ //目标 库存批次 增加
|
|
|
+ BO toLot = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT").addQuery("LOT=", lot.get("LOT")).addQuery("ORDER_PRODUCT_ID=", lot.get("ORDER_PRODUCT_ID")).addQuery("BINDID=", toWarehouseProductBO.getBindId()).detail();
|
|
|
+ if (toLot != null) {
|
|
|
+ toLot.set("QUANTITY", Integer.parseInt(toLot.get("QUANTITY").toString()) + toSN.size());
|
|
|
+ toLot.set("SN", toLot.get("SN") + "," + StringUtils.join(toSN, ","));
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", toLot, conn);
|
|
|
+ } else {
|
|
|
+ //新增 目标库批次
|
|
|
+ toLot = new BO();
|
|
|
+ toLot.setAll(lot.asMap());
|
|
|
+ toLot.setId(null);
|
|
|
+ toLot.setBindId(toWarehouseProductBO.getBindId());
|
|
|
+ toLot.set("SN", StringUtils.join(toSN, ","));
|
|
|
+ toLot.set("QUANTITY", toSN.size());
|
|
|
+ toLot.set("ORDER_PRODUCT_ID", lot.get("ORDER_PRODUCT_ID"));
|
|
|
+ toLot.set("WAREHOUSE_ID", toWarehouseProductBO.get("WAREHOUSE_ID"));
|
|
|
+ toLot.set("PRODUCT_ID", toWarehouseProductBO.get("PRODUCT_ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", toLot, processExecutionContext.getUserContext(), conn);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (cnt >= pickSerials.size())
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ //无序列化产品
|
|
|
+ int lotQuantity = Integer.parseInt(lot.get("QUANTITY").toString());
|
|
|
+ int toQuantity = 0;
|
|
|
+ if (lotQuantity > pickQuantity) {
|
|
|
+ lot.set("QUANTITY", lotQuantity - pickQuantity);
|
|
|
+ toQuantity = pickQuantity;
|
|
|
+ pickQuantity = 0;
|
|
|
+
|
|
|
+ } else {
|
|
|
+ lot.set("QUANTITY", 0);
|
|
|
+ toQuantity = lotQuantity;
|
|
|
+ pickQuantity -= lotQuantity;
|
|
|
+ }
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", lot, conn);
|
|
|
+
|
|
|
+ //目标 库存批次 增加
|
|
|
+ BO toLot = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT").addQuery("LOT=", lot.get("LOT")).addQuery("ORDER_PRODUCT_ID=", lot.get("ORDER_PRODUCT_ID")).addQuery("BINDID=", toWarehouseProductBO.getBindId()).detail();
|
|
|
+ if (toLot != null) {
|
|
|
+ toLot.set("QUANTITY", Integer.parseInt(toLot.get("QUANTITY").toString()) + toQuantity);
|
|
|
+ toLot.set("SN", "");
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", toLot, conn);
|
|
|
+ } else {
|
|
|
+ //新增 目标库批次
|
|
|
+ toLot = new BO();
|
|
|
+ toLot.setAll(lot.asMap());
|
|
|
+ toLot.setId(null);
|
|
|
+ toLot.setBindId(toWarehouseProductBO.getBindId());
|
|
|
+ toLot.set("SN", "");
|
|
|
+ toLot.set("QUANTITY", toQuantity);
|
|
|
+ toLot.set("ORDER_PRODUCT_ID", lot.get("ORDER_PRODUCT_ID"));
|
|
|
+ toLot.set("WAREHOUSE_ID", toWarehouseProductBO.get("WAREHOUSE_ID"));
|
|
|
+ toLot.set("PRODUCT_ID", toWarehouseProductBO.get("PRODUCT_ID"));
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", toLot, processExecutionContext.getUserContext(), conn);
|
|
|
+ }
|
|
|
+ if (pickQuantity <= 0)
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
} else if (pickBO.getString("PICK_TYPE").equals("2"))//库存转移给客户
|
|
|
{
|
|
|
- //result = ccBll.TranToItem(product_id, pickNum, ware_id, serNumIds, cost_id, LoginUserId);
|
|
|
|
|
|
BO costBO = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_COST").connection(conn).addQuery("ID=", pickBO.getString("CONTRACT_COST_ID")).detail();
|
|
|
-//ivt_transfer
|
|
|
+
|
|
|
+ //移库记录
|
|
|
ProcessInstance transfeProcessIns = SDK.getProcessAPI().createBOProcessInstance("obj_e15a8fedeaeb43dc85aa258a7e1cffcf", processExecutionContext.getUserContext().getUID(), "库存转移");
|
|
|
BO ivtTransfer = new BO();
|
|
|
ivtTransfer.setBindId(transfeProcessIns.getId());
|
|
|
@@ -231,16 +309,8 @@ public class costPickFormAfterSave extends ExecuteListener {
|
|
|
ivtTransfer.set("TYPE_ID", 1482);
|
|
|
ivtTransfer.set("PRODUCT_ID", pickBO.getString("PRODUCT_ID"));
|
|
|
ivtTransfer.set("QUANTITY", pickBO.get("PICK_QUANTITY"));
|
|
|
+ ivtTransfer.set("SN", StringUtils.join(pickSerials, ","));//产品序列号
|
|
|
SDK.getBOAPI().create("BO_EU_DNIVT_TRANSFER", ivtTransfer, transfeProcessIns, processExecutionContext.getUserContext(), conn);
|
|
|
- //BO_EU_DNIVT_TRANSFER_SN
|
|
|
-
|
|
|
- for (String serialNumber : pickSerials) {
|
|
|
- BO snBO = new BO();
|
|
|
- snBO.setBindId(ivtTransfer.getBindId());
|
|
|
- snBO.set("TRANSFER_ID", ivtTransfer.getId());
|
|
|
- snBO.set("SN", serialNumber);
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNIVT_TRANSFER_SN", snBO, processExecutionContext.getUserContext(), conn);
|
|
|
- }
|
|
|
|
|
|
|
|
|
//减少库存
|
|
|
@@ -248,10 +318,60 @@ public class costPickFormAfterSave extends ExecuteListener {
|
|
|
fromWarehouseProductBO.set("QUANTITY", ObjToInt(fromWarehouseProductBO.get("QUANTITY")) - ObjToInt(pickBO.get("PICK_QUANTITY")));
|
|
|
SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT", fromWarehouseProductBO, conn);
|
|
|
|
|
|
- //BO_EU_DNIVT_WAREHOUSE_PRODUCT_SN
|
|
|
-
|
|
|
- for (String serialNumber : pickSerials) {
|
|
|
- DBSql.update(conn, "delete from BO_EU_DNIVT_WAREHOUSE_PRODUCT_SN where WAREHOUSE_PRODUCT_ID=? and SN=?", new Object[]{fromWarehouseProductBO.getId(), serialNumber});
|
|
|
+ int pickQuantity = ObjToInt(pickBO.get("PICK_QUANTITY"));//拣货数量
|
|
|
+ //减少批次
|
|
|
+ List<BO> lots = SDK.getBOAPI().query("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT").addQuery("BINDID=", fromWarehouseProductBO.getBindId()).addQuery("QUANTITY>", 0).orderByCreated().list();
|
|
|
+ int cnt = 0;
|
|
|
+ for (BO lot : lots) {
|
|
|
+ if (pickSerials.size() > 0) {
|
|
|
+ //序列化产品
|
|
|
+ boolean isIn = false;
|
|
|
+ String lotSN = lot.getString("SN");
|
|
|
+ lotSN = "," + lotSN + ",";
|
|
|
+ List<String> toSN = new ArrayList<>();
|
|
|
+ for (String sn : pickSerials) {
|
|
|
+ if (lotSN.contains("," + sn + ",")) {
|
|
|
+ isIn = true;
|
|
|
+ lotSN = lotSN.replace("," + sn + ",", ",");
|
|
|
+ toSN.add(sn);
|
|
|
+ cnt++;
|
|
|
+ }
|
|
|
+ if (cnt >= pickSerials.size())
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (isIn) {
|
|
|
+ if (StringUtils.isNotBlank(lotSN)) {
|
|
|
+ lotSN = lotSN.replaceAll("^,+|,+$", "") // 移除首尾一个或多个逗号
|
|
|
+ .replaceAll(",+", ","); // 合并中间连续逗号
|
|
|
+ int count = (int) lotSN.chars().filter(c -> c == ',').count();
|
|
|
+ lot.set("SN", lotSN);
|
|
|
+ lot.set("QUANTITY", count + 1);
|
|
|
+ } else {
|
|
|
+ lot.set("SN", "");
|
|
|
+ lot.set("QUANTITY", 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新批次上序列号
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", lot, conn);
|
|
|
+
|
|
|
+ }
|
|
|
+ if (cnt >= pickSerials.size())
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ //无序列号产品
|
|
|
+ int toQuantity = ObjToInt(lot.get("QUANTITY"));
|
|
|
+ if (toQuantity >= pickQuantity) {
|
|
|
+ lot.set("QUANTITY", pickQuantity);
|
|
|
+ pickQuantity = 0;
|
|
|
+ } else {
|
|
|
+ lot.set("QUANTITY", 0);
|
|
|
+ pickQuantity -= toQuantity;
|
|
|
+ }
|
|
|
+ //更新批次上序列号
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT", lot, conn);
|
|
|
+ if (pickQuantity <= 0)
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|