WIP 移动事务处理API Demo

DECLARE
  l_rec_move_txn wip_move_txn_interface%ROWTYPE;
  l_group_id     NUMBER;
  l_txn_id       NUMBER;
  l_available    NUMBER;
  --
  p_wip_entity_id   NUMBER := 178160;
  p_organization_id NUMBER := 683;
  x_error_status    VARCHAR2(1);
  x_error_message   VARCHAR2(2000);
  p_move_qty        NUMBER := 1;
  x_over_qty        NUMBER;

BEGIN
  fnd_global.APPS_INITIALIZE(user_id => 2411,resp_id => 50647,resp_appl_id => 20003);
  --
  SELECT wip_transactions_s.nextval INTO l_group_id FROM dual;
  --使用API一条一条的处理
  l_txn_id       := NULL;
  l_rec_move_txn := NULL;
  --
  SELECT wip_transactions_s.nextval INTO l_txn_id FROM dual;
  --
  l_rec_move_txn.entity_type := 1;--Discrete job
  l_rec_move_txn.transaction_id       := l_txn_id;
  l_rec_move_txn.group_id             := l_group_id;
  l_rec_move_txn.process_phase        := 1;--Move validation
  l_rec_move_txn.process_status       := 2; --pending
  l_rec_move_txn.created_by           := fnd_global.user_id;
  l_rec_move_txn.creation_date        := SYSDATE;
  l_rec_move_txn.last_updated_by      := fnd_global.user_id;
  l_rec_move_txn.last_update_date     := SYSDATE;
  l_rec_move_txn.last_update_login    := fnd_global.login_id;
  l_rec_move_txn.wip_entity_id        := 178160; --p_wip_entity_id;
  l_rec_move_txn.organization_id      := 683; --p_organization_id;
  l_rec_move_txn.transaction_date     := SYSDATE;
  l_rec_move_txn.transaction_quantity := 1; --abs(p_move_qty); --不管怎样,事务处理数量始终取正值
  l_rec_move_txn.transaction_uom      := 'UN'; --p_uom;
  IF p_move_qty > 0 THEN
    --移动数量大于0时,正向移动,由 排队 到 移动工序号由最小走到最大
    l_rec_move_txn.transaction_type := 1; --1.normal move;2.combination move or completion/return transaction
    SELECT MIN(wo.operation_seq_num),
           MAX(wo.operation_seq_num)
      INTO l_rec_move_txn.fm_operation_seq_num,
           l_rec_move_txn.to_operation_seq_num
      FROM wip_operations wo
     WHERE wo.wip_entity_id = p_wip_entity_id
       AND wo.organization_id = p_organization_id;
    l_rec_move_txn.fm_intraoperation_step_type := 1; --排队
    l_rec_move_txn.to_intraoperation_step_type := 3; --移动
    l_available                                := get_available_to_move_qty(p_wip_entity_id   => p_wip_entity_id,
                                                                            p_opr_seq_num     => l_rec_move_txn.fm_operation_seq_num,
                                                                            p_organization_id => p_organization_id,
                                                                            p_intraopr_step   => 1);
    IF l_available < p_move_qty THEN
      --如果可移动数量小于移动数量,则启用超量移动
      l_rec_move_txn.overcompletion_transaction_qty := p_move_qty - l_available;
      l_rec_move_txn.overcompletion_primary_qty     := p_move_qty - l_available;
      x_over_qty                                    := p_move_qty - l_available;
    END IF;
  ELSE
    --移动数量小于0时,反向移动,由 移动 到 排队 工序号由最大走到最小
    l_rec_move_txn.transaction_type := 1; --1.normal move;2.combination move or completion/return transaction
    SELECT MAX(wo.operation_seq_num),
           MIN(wo.operation_seq_num)
      INTO l_rec_move_txn.fm_operation_seq_num,
           l_rec_move_txn.to_operation_seq_num
      FROM wip_operations wo
     WHERE wo.wip_entity_id = p_wip_entity_id
       AND wo.organization_id = p_organization_id;
    l_rec_move_txn.fm_intraoperation_step_type := 3; --移动
    l_rec_move_txn.to_intraoperation_step_type := 1; --排队
  END IF;
  l_rec_move_txn.last_updated_by_name := fnd_global.user_name;
  l_rec_move_txn.created_by_name      := fnd_global.user_name;
  --以下两字段视业务逻辑取数
  l_rec_move_txn.source_code := 'lcy_wip_discrete_jobs';
  --l_rec_move_txn.source_line_id := p_job_id;
  INSERT INTO wip_move_txn_interface VALUES l_rec_move_txn;
  --API
  wip_movproc_pub.processinterface(p_txn_id       => l_txn_id,
                                   p_commit       => 'F',
                                   x_returnstatus => x_error_status,
                                   x_errormsg     => x_error_message);
  --
  IF (nvl(x_error_status, fnd_api.g_ret_sts_error) <> fnd_api.g_ret_sts_success) THEN
    dbms_output.put_line('------------------Error-------------------');
    dbms_output.put_line('Error :' || x_error_message);
  ELSE
    dbms_output.put_line('------------------Success-------------------');
  END IF;
  --
  --end loop;
END;
/
CREATE OR REPLACE FUNCTION get_available_to_move_qty(p_wip_entity_id   IN NUMBER,
                                                     p_opr_seq_num     IN NUMBER,
                                                     p_organization_id IN NUMBER,
                                                     p_intraopr_step   IN NUMBER) RETURN NUMBER IS
  l_available_to_move_qty NUMBER;
  CURSOR csr_wip_operations IS
    SELECT decode(p_intraopr_step,
                  1,
                  wo.quantity_in_queue,
                  2,
                  wo.quantity_running,
                  3,
                  wo.quantity_waiting_to_move,
                  4,
                  wo.quantity_rejected,
                  5,
                  wo.quantity_scrapped,
                  wo.quantity_completed)
      FROM wip_operations wo
     WHERE wo.wip_entity_id = p_wip_entity_id
       AND wo.operation_seq_num = p_opr_seq_num
       AND wo.organization_id = p_organization_id
       AND wo.repetitive_schedule_id IS NULL;
BEGIN
  OPEN csr_wip_operations;
  FETCH csr_wip_operations
    INTO l_available_to_move_qty;
  CLOSE csr_wip_operations;
  RETURN l_available_to_move_qty;
END get_available_to_move_qty;

你可能感兴趣的:(wip)