CREATE DEFINER=`root`@`localhost` PROCEDURE `MoveOrderUtil_PartMove`( in company_id_ int , in owner_id_ varchar(10), in warehouse_ varchar(10), in part_no_ varchar(20), in lot_batch_no_ varchar(20), in fr_location_no_ varchar(20), in to_warehouse_ varchar(10), in to_location_no_ varchar(20), in qty_to_move_ int, in user_id_ varchar(40)) BEGIN DECLARE totalSum_ int ; DECLARE qty_onhand_ int ; DECLARE inv_stk_id_ int ; DECLARE move_no_ varchar(20); DECLARE move_id_ int ; if nvl(lot_batch_no_ , '*') = '*' then begin DECLARE get_in_stock CURSOR FOR SELECT sum(qty_onhand) FROM inventory_part_in_stock WHERE logistics_company_id = company_id_ and warehouse = warehouse_ and location_no = fr_location_no_ and part_no = part_no_ ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET totalSum_ = NULL; OPEN get_in_stock; FETCH get_in_stock INTO totalSum_; CLOSE get_in_stock; end; else begin DECLARE get_in_stock CURSOR FOR SELECT sum(qty_onhand) FROM inventory_part_in_stock WHERE logistics_company_id = company_id_ and warehouse = warehouse_ and location_no = fr_location_no_ and part_no = part_no_ and lot_batch_no = lot_batch_no_ ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET totalSum_ = NULL; OPEN get_in_stock; FETCH get_in_stock INTO totalSum_; CLOSE get_in_stock; end; end if; if(nvl(totalSum_ , 0) < qty_to_move_ ) then CALL ErrorSys_RecordGeneral('MoveOrder', '庫位 :P1 庫存 : P2 少於需移庫數量 : P3 !', fr_location_no_, totalSum_, qty_to_move_); end if; begin DECLARE get_in_stock CURSOR for( SELECT id , qty_onhand from temp_view); DECLARE CONTINUE HANDLER FOR NOT FOUND SET inv_stk_id_ = null; DROP VIEW IF EXISTS temp_view; SET @sqlstr = "CREATE VIEW temp_view as "; if nvl(lot_batch_no_ , '*') = '*' then SET @sqlstr = CONCAT(@sqlstr , "SELECT id , qty_onhand FROM inventory_part_in_stock WHERE logistics_company_id = ", company_id_ ," and warehouse = '", warehouse_ ,"' and location_no = '", fr_location_no_ ,"' and part_no = '", part_no_ ,"' "); else SET @sqlstr = CONCAT(@sqlstr , "SELECT id , qty_onhand FROM inventory_part_in_stock WHERE logistics_company_id = ", company_id_ ," and warehouse = '", warehouse_ ,"' and location_no = '", fr_location_no_ ,"' and part_no = '", part_no_ ,"' and lot_batch_no = '", lot_batch_no_ ,"' "); end if ; PREPARE stmt FROM @sqlstr; EXECUTE stmt; DEALLOCATE PREPARE stmt; OPEN get_in_stock; moveLoop : loop FETCH get_in_stock INTO inv_stk_id_ , qty_onhand_ ; if inv_stk_id_ is NULL then leave moveLoop; end if ; if qty_onhand_ >= qty_to_move_ then -- 新增入庫單 call MoveOrderUtil_NewOrder(move_no_ ,company_id_ , warehouse_ , inv_stk_id_ , qty_to_move_ , to_warehouse_ ,to_location_no_ , owner_id_ , 1 , user_id_); leave moveLoop; else -- 新增入庫單 call MoveOrderUtil_NewOrder(move_no_ ,company_id_ , warehouse_ , inv_stk_id_ , qty_to_move_ , to_warehouse_ ,to_location_no_ , owner_id_ , 1 , user_id_); set qty_to_move_ = qty_to_move_ - qty_onhand_ ; end if; end loop moveLoop ; close get_in_stock ; set move_id_ = MoveOrderUtil_GetIdByUnindex(company_id_ ,move_no_ ); -- 執行移庫確認 call MoveOrderUtil_ConfirmOrder(move_id_ , user_id_); -- 執行移庫完成 call MoveOrderUtil_ExecMove(move_id_ , user_id_); end ; END