到字符串转换成字段 (HCM需求导入)

Posted on 2013-05-07 16:26  水晶石头  阅读(384)  评论(0)    收藏  举报
CREATE OR REPLACE PACKAGE BODY hcm_demand_pck IS

  -- Purpose : HCM-B-P10
  --           DO  Import  Trace
  -- Created : 2009-11-18 9:01:33   hand
  -- Modified:
  g_user_id NUMBER;
  /*==========================================================
    HCM-B-P10-01  SAVE_TRACE
    保存系统参数记录
    参数:  p_new_record          新记录标志。Y:新增记录,N(or NULL):修改记录。
            p_user_id             用户ID
            p_customer_id         客户ID
            p_product_category    产品类别
            p_period_value        时段类型
            p_period_num          时段数
            p_start_date          生效日期
            p_end_date            失效日期
    返回值:HCM_PUBLIC_PCK.G_SUCCESS  保存成功
            其它值                    保存失败时的信息ID
    Created : 2008-8-20 9:01:33   hand
    Modified:
  ==========================================================*/
  FUNCTION save_trace(p_new_record       IN VARCHAR2 DEFAULT 'N',
                      p_user_id          IN NUMBER,
                      p_customer_id      IN NUMBER,
                      p_product_category IN VARCHAR2,
                      p_period_value     IN VARCHAR2,
                      p_period_num       IN NUMBER,
                      p_start_date       IN DATE,
                      p_end_date         IN DATE) RETURN NUMBER IS
    ln_count      NUMBER := 0;
    ln_message_id NUMBER := hcm_public_pck.g_success;
    l_api_name    VARCHAR2(100) := 'save_trace';
    l_rt_msg      VARCHAR2(1000);
  BEGIN
  
    --产品类别不能为空!
    hcm_api.set_message(p_app_name => 'HCM',
                        p_msg_name => 'HCM_DI_CAT_NOT_BE_NULL');
    l_rt_msg := hcm_api.get_message(-1);
  
    IF p_product_category IS NULL THEN
      RETURN hcm_public_pck.insert_message(p_user_id,
                                           l_rt_msg,
                                           'HCM_DEMAND_TRACE_PCK.SAVE_TRACE');
    END IF;
  
    --客户不能为空!
    hcm_api.set_message(p_app_name => 'HCM',
                        p_msg_name => 'HCM_DI_CUST_NOT_BE_NULL');
    l_rt_msg := hcm_api.get_message(-1);
  
    IF p_customer_id IS NULL THEN
      RETURN hcm_public_pck.insert_message(p_user_id,
                                           l_rt_msg,
                                           'HCM_DEMAND_TRACE_PCK.SAVE_TRACE');
    END IF;
  
    --时段类型不能为空!
    hcm_api.set_message(p_app_name => 'HCM',
                        p_msg_name => 'HCM_DI_PER_NOT_BE_NULL');
    l_rt_msg := hcm_api.get_message(-1);
  
    IF p_period_value IS NULL THEN
      RETURN hcm_public_pck.insert_message(p_user_id,
                                           l_rt_msg,
                                           'HCM_DEMAND_TRACE_PCK.SAVE_TRACE');
    END IF;
    IF p_new_record = 'I' THEN
      SELECT COUNT(1)
        INTO ln_count
        FROM hcm_demand_trace_type hdtt
       WHERE hdtt.customer_id = p_customer_id
         AND hdtt.product_category = p_product_category
         AND hdtt.period_type = p_period_value;
      IF ln_count > 0 THEN
      
        --当前【客户 + 类别 + 时段类型】组合 已存在!
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_EXIST_COMB');
        l_rt_msg := hcm_api.get_message(-1);
        RETURN hcm_public_pck.insert_message(p_user_id,
                                             l_rt_msg,
                                             'HCM_DEMAND_TRACE_PCK.SAVE_TRACE');
      
      ELSE
        INSERT INTO hcm_demand_trace_type
          (trace_type_id,
           customer_id,
           product_category,
           period_type,
           period_num,
           start_date,
           end_date,
           creation_date,
           created_by,
           last_updated_by,
           last_update_date,
           last_update_login)
        VALUES
          (hcm_demand_trace_type_s.nextval,
           p_customer_id,
           p_product_category,
           p_period_value,
           p_period_num,
           p_start_date,
           nvl(p_end_date, to_date('9999-12-31', 'yyyy-MM-dd')),
           SYSDATE,
           p_user_id,
           p_user_id,
           SYSDATE,
           p_user_id);
      END IF;
    ELSIF p_new_record = 'U' THEN
      UPDATE hcm_demand_trace_type
         SET start_date = p_start_date,
             end_date   = nvl(p_end_date,
                              to_date('9999-12-31', 'yyyy-MM-dd')),
             period_num = p_period_num
       WHERE customer_id = p_customer_id
         AND period_type = p_period_value
         AND product_category = p_product_category;
    ELSE
      DELETE FROM hcm_demand_trace_type hdtt
       WHERE hdtt.customer_id = p_customer_id
         AND hdtt.period_type = p_period_value
         AND hdtt.product_category = p_product_category;
    END IF;
    RETURN ln_message_id;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN hcm_public_pck.insert_message(p_user_id,
                                           SQLCODE || ':' || SQLERRM,
                                           'HCM_DEMAND_TRACE_PCK.SAVE_TRACE');
  END save_trace;

  /*==========================================================
    HCM-B-P10-01  SAVE_TRACE_FOR_UI
    保存系统参数记录
    参数:  p_new_record          新记录标志。Y:新增记录,N(or NULL):修改记录。
            p_user_id             用户ID
            p_customer_id         客户ID
            p_product_category    产品类别
            p_period_value        时段类型
            p_period_num          时段数
            p_start_date          生效日期
            p_end_date            失效日期
    返回值:HCM_PUBLIC_PCK.G_SUCCESS  保存成功
            其它值                    保存失败时的信息ID
    Created : 2008-8-20 9:01:33   hand
    Modified:
  ==========================================================*/
  FUNCTION save_trace_for_ui(p_new_record       IN VARCHAR2 DEFAULT 'N',
                             p_user_id          IN VARCHAR2,
                             p_customer_id      IN VARCHAR2,
                             p_product_category IN VARCHAR2,
                             p_period_value     IN VARCHAR2,
                             p_period_num       IN VARCHAR2,
                             p_start_date       IN VARCHAR2,
                             p_end_date         IN VARCHAR2) RETURN VARCHAR2 IS
    ln_message_id NUMBER := hcm_public_pck.g_success;
    l_user_id     NUMBER;
    l_customer_id NUMBER;
    l_period_num  NUMBER;
    l_start_date  DATE;
    l_end_date    DATE;
  BEGIN
    l_user_id     := to_number(p_user_id);
    l_customer_id := to_number(p_customer_id);
    l_period_num  := to_number(p_period_num);
    l_start_date  := hcm_public_pck.string_date_convert((p_start_date));
    l_end_date    := hcm_public_pck.string_date_convert(p_end_date);
  
    ln_message_id := save_trace(p_new_record       => p_new_record,
                                p_user_id          => l_user_id,
                                p_customer_id      => l_customer_id,
                                p_product_category => p_product_category,
                                p_period_value     => p_period_value,
                                p_period_num       => l_period_num,
                                p_start_date       => l_start_date,
                                p_end_date         => l_end_date);
    RETURN hcm_public_pck.get_message(ln_message_id);
  END save_trace_for_ui;
  --取p_in_date是第几周
  FUNCTION get_week(p_in_date IN DATE) RETURN NUMBER IS
    l_weeks      NUMBER;
    l_first_date DATE;
  BEGIN
  
    --客户化取周数
    /* SELECT to_date(to_char(p_in_date, 'yyyy') || '0101', 'yyyymmdd') INTO l_first_date FROM dual;
    SELECT ceil((to_char(p_in_date, 'ddd') -
                decode(to_char(l_first_date, 'D'), 1, 1, 7 - to_char(l_first_date, 'D') + 1)) / 7) + 1
      INTO l_weeks
      FROM dual;*/
  
    --标准取周数
    SELECT to_number(to_char(p_in_date, 'IW')) INTO l_weeks FROM dual;
  
    RETURN l_weeks;
  
  END get_week;

  FUNCTION get_ver_ft_time(p_in_date IN DATE) RETURN VARCHAR2 IS
    l_dy    NUMBER;
    l_weeks NUMBER;
  BEGIN
    l_weeks := get_week(p_in_date);
    RETURN REPLACE(substr(to_char(p_in_date, 'yyyy'), 3, 2) || 'W' ||
                   to_char(l_weeks, '09'),
                   ' ',
                   '');
  
  END get_ver_ft_time;

  /*  PROCEDURE get_day_of_week(p_in_date IN VARCHAR2, x_out_date OUT NOCOPY NUMBER) IS
  BEGIN
    IF instr(p_in_date, 'W') > 0 THEN
      SELECT to_char(trunc((SELECT trunc(decode(ww,
                                               53,
                                               to_date(yy || '3112', 'yyyyddmm'),
                                               to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')),
                                        'd') last_day
                             FROM (SELECT substr(p_in_date, 1, 4) yy, to_number(substr(p_in_date, 6)) ww FROM dual)),
                           'yyyy'),
                     'd')
        INTO x_out_date
        FROM dual;
    END IF;
  END get_day_of_week;*/

  PROCEDURE get_date(p_in_date   VARCHAR2,
                     x_out_date1 OUT NOCOPY DATE,
                     x_out_date2 OUT NOCOPY DATE) IS
    l_dy     NUMBER;
    l_num    NUMBER;
    l_curday DATE;
    l_count  NUMBER;
  BEGIN
    IF instr(p_in_date, 'W') > 0 THEN
    
      l_dy     := to_number(substr(p_in_date, 6)); -- 01
      l_curday := to_date(substr(p_in_date, 1, 4) || '01-01', 'yyyy-mm-dd'); --
      SELECT to_char(l_curday, 'd') INTO l_num FROM dual;
    
      l_count := 7 - l_num;
      IF l_num > 5 THEN
        l_dy := l_dy;
      ELSE
        l_dy := l_dy - 1;
      END IF;
    
      SELECT l_curday + (l_dy) * 7 + l_count + 1
        INTO x_out_date2
        FROM dual;
    
      x_out_date1 := x_out_date2 - 6;
    
      /*      GET_DAY_OF_WEEK(to_date(substr(p_in_date,1,4) || '01-01','yyyy-mm-dd'),l_dy);
      IF l_dy > 5 THEN
        x_out_date := x_out_date + 7;
      END IF;  */
      /* l_dy     := to_number(substr(p_in_date, 6));
      l_curday := to_date(substr(p_in_date, 1, 4) || '01-01', 'yyyy-mm-dd');
      SELECT to_char(l_curday, 'd') INTO l_num FROM dual;
      x_out_date1 := CASE l_num
                       WHEN 1 THEN
                        (l_dy - 1) * 7 - 6 + l_curday
                       WHEN 2 THEN
                        (l_dy - 1) * 7 - 6 + 6 + l_curday
                       WHEN 3 THEN
                        (l_dy - 1) * 7 - 6 + 5 + l_curday
                       WHEN 4 THEN
                        (l_dy - 1) * 7 - 6 + 4 + l_curday
                       WHEN 5 THEN
                        (l_dy - 1) * 7 - 6 + 3 + l_curday
                       WHEN 6 THEN
                        (l_dy - 1) * 7 - 6 + 2 + l_curday
                       WHEN 7 THEN
                        (l_dy - 1) * 7 - 6 + 1 + l_curday
                       ELSE
                        l_curday
                     END;
      x_out_date2 := x_out_date1 + 6;
      IF x_out_date1 < to_date(substr(p_in_date, 1, 4) || '01-01', 'yyyy-mm-dd') THEN
        x_out_date1 := to_date(substr(p_in_date, 1, 4) || '01-01', 'yyyy-mm-dd');
      END IF;
      IF x_out_date2 > to_date(substr(p_in_date, 1, 4) || '12-31', 'yyyy-mm-dd') THEN
        x_out_date2 := to_date(substr(p_in_date, 1, 4) || '12-31', 'yyyy-mm-dd');
      END IF;*/
    ELSIF instr(p_in_date, 'M') > 0 THEN
      SELECT to_date(yy || '-' || to_char(ww) || '-01', 'yyyy-mm-dd') first_day
        INTO x_out_date1
        FROM (SELECT substr(p_in_date, 1, 4) yy,
                     to_number(substr(p_in_date, 6)) ww
                FROM dual);
    ELSE
      SELECT to_date(p_in_date, 'yyyy-mm-dd') INTO x_out_date1 FROM dual;
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      x_out_date1 := NULL;
      x_out_date2 := NULL;
  END get_date;

  --支持批量操作
  --从一个字符串中取出一个字段,并返回剩下的字符串
  PROCEDURE popup_field(p_string         IN OUT CLOB,
                        x_field          OUT CLOB,
                        x_next_null_flag OUT VARCHAR2) IS
    l_first_char VARCHAR2(10);
    l_pos        NUMBER;
  BEGIN
    IF p_string IS NULL THEN
      x_field := NULL;
      RETURN;
    END IF;
  
    l_first_char := substr(p_string, 1, length(g_default_col_separator));
    IF l_first_char = g_col_separator THEN
      x_field  := NULL;
      p_string := substr(p_string, length(g_default_col_separator) + 1);
      IF p_string IS NULL THEN
        x_next_null_flag := 'Y';
      END IF;
    ELSE
      l_pos := instr(p_string, g_default_col_separator);
      IF l_pos > 0 THEN
        x_field  := substr(p_string, 1, l_pos - 1);
        p_string := substr(p_string,
                           l_pos + length(g_default_col_separator));
        IF p_string IS NULL THEN
          x_next_null_flag := 'Y';
        END IF;
      ELSE
        x_field  := p_string;
        p_string := NULL;
      END IF;
    END IF;
  END popup_field;

  --把一行CSV数据,分割成每个字段。样例数据:
  --"123,44",4343,zd,周哦,343.454,"sdfsd,343"
  PROCEDURE split_to_field(p_string      IN CLOB,
                           x_field_array OUT large_field_array_type) IS
    l_field_count    NUMBER := 0;
    l_string         CLOB;
    l_field          CLOB;
    x_next_null_flag VARCHAR2(1);
  BEGIN
    l_string := p_string;
    WHILE l_string IS NOT NULL LOOP
      popup_field(l_string, l_field, x_next_null_flag);
      l_field_count := l_field_count + 1;
      x_field_array(l_field_count) := REPLACE(REPLACE(REPLACE(TRIM(l_field),
                                                              g_col_replacer,
                                                              g_col_separator),
                                                      g_c13_replacer,
                                                      chr(13)),
                                              g_c10_replacer,
                                              chr(10));
      IF x_next_null_flag = 'Y' THEN
        l_field_count := l_field_count + 1;
        x_field_array(l_field_count) := NULL;
      END IF;
    END LOOP;
  
    WHILE l_field_count < g_default_in_col_count LOOP
      l_field_count := l_field_count + 1;
      x_field_array(l_field_count) := NULL;
    END LOOP;
  
  END;
  --从一个字符串中取出一行,并返回剩下的字符串
  PROCEDURE popup_line(x_text IN OUT CLOB, x_string OUT CLOB) IS
    l_pos NUMBER;
  BEGIN
    IF x_text IS NULL THEN
      x_string := NULL;
      RETURN;
    END IF;
  
    l_pos := instr(x_text, g_default_row_separator);
    IF l_pos > 0 THEN
      x_string := substr(x_text, 1, l_pos - 1);
      x_text   := substr(x_text, l_pos + length(g_default_row_separator));
    ELSE
      x_string := x_text;
      x_text   := NULL;
    END IF;
  
  END;
  --把一个文本分成一行行
  PROCEDURE split_parameter(p_in_parameter IN CLOB) IS
    x_text               CLOB;
    x_string             CLOB;
    x_in_parameter_array large_field_array_type;
  BEGIN
    g_in_parameter_table.delete;
    g_in_record_count := 0;
    x_text            := p_in_parameter;
    WHILE x_text IS NOT NULL LOOP
      popup_line(x_text => x_text, x_string => x_string);
      split_to_field(x_string, x_in_parameter_array);
      g_in_record_count := g_in_record_count + 1;
      g_in_parameter_table(g_in_record_count) := x_in_parameter_array;
    END LOOP;
  END;
  /*==========================================================
    HCM-B-P02-05
    参数:  p_prod_model              机型
            p_demand_date             需要验证的导入时间 行头或列头的时间
    返回值:x_msg_data                物料ID
            x_msg_date                时间格式的 p_demand_date
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE get_latest_item(p_prod_model  IN VARCHAR2,
                            p_demand_date IN VARCHAR2,
                            x_msg_data    OUT NOCOPY NUMBER,
                            x_msg_date    OUT NOCOPY DATE, --传出周数开始日期
                            x_msg_date2   OUT NOCOPY DATE) --传出周期结束日期
   IS
    l_item_id   NUMBER;
    l_prod_date DATE;
    --l_item_code   VARCHAR2(50);
  BEGIN
    --机型/去向在相应的时间段内是否存在对应的最近的物料
    get_date(p_demand_date, l_prod_date, x_msg_date2);
    x_msg_date := l_prod_date;
    /*   BEGIN
      SELECT *
        INTO l_item_id
        FROM (SELECT hiv.item_id
                FROM hcm_main_item_v hiv
               WHERE nvl(hiv.product_model, hiv.item_code) = p_prod_model
                 AND nvl2(hiv.attribute5, to_date(hiv.attribute5, 'yyyy-mm-dd'), to_date('2000-1-1', 'yyyy-mm-dd')) <=
                     l_prod_date
               ORDER BY hiv.attribute5 DESC) temp
       WHERE rownum = 1;
      x_msg_data := l_item_id;
    EXCEPTION
      WHEN no_data_found THEN
        x_msg_data := NULL;
    END;*/
  
    BEGIN
      SELECT *
        INTO l_item_id
        FROM (SELECT hiv.item_id
                FROM hcm_main_item_v hiv
               WHERE hiv.product_model = p_prod_model
                 AND nvl2(hiv.attribute5,
                          to_date(hiv.attribute5, 'yyyy-mm-dd'),
                          to_date('2000-1-1', 'yyyy-mm-dd')) <= l_prod_date
                 AND hiv.enable_flag = 'Y'
               ORDER BY hiv.attribute5 DESC) temp
       WHERE rownum = 1;
      x_msg_data := l_item_id;
    EXCEPTION
      WHEN no_data_found THEN
      
        BEGIN
          SELECT *
            INTO l_item_id
            FROM (SELECT hiv.item_id
                    FROM hcm_main_item_v hiv
                   WHERE hiv.item_code = p_prod_model --p_prod_model有可能是物料
                     AND nvl2(hiv.attribute5,
                              to_date(hiv.attribute5, 'yyyy-mm-dd'),
                              to_date('2000-1-1', 'yyyy-mm-dd')) <=
                         l_prod_date
                     AND hiv.enable_flag = 'Y'
                   ORDER BY hiv.attribute5 DESC) temp
           WHERE rownum = 1;
          x_msg_data := l_item_id;
        EXCEPTION
          WHEN no_data_found THEN
            x_msg_data := NULL;
        END;
      
    END;
  
  END get_latest_item;
  /*==========================================================
    HCM-B-P02-05  获取物料的产品分类
    参数:  p_item_id              物料
            p_plant_id             工厂
    返回值:x_msg_data
    Created :  2009-10-09 hand
  ==========================================================*/
  FUNCTION get_product_category(p_item_id  IN NUMBER,
                                p_plant_id IN NUMBER DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_prod_type VARCHAR2(100) := NULL;
  BEGIN
    BEGIN
      SELECT hic.segment2
        INTO l_prod_type
        FROM hcm_item_categories_v hic
       WHERE hic.inventory_item_id = p_item_id
         AND hic.category_set_id = 1
            /*AND hic.segment1 LIKE '9%'*/
         AND hic.organization_id =
             nvl(p_plant_id,
                 hcm_public_pck.get_user_parameter(NULL,
                                                   'U',
                                                   NULL,
                                                   'DEFAULT_MAIN_PLANT_ID'))
         AND rownum = 1;
    EXCEPTION
      WHEN no_data_found THEN
        l_prod_type := NULL;
    END;
    RETURN l_prod_type;
  END get_product_category;
  /*============================================
    HCM-B-P02-05  验证BOM是否存在
    参数:  p_item_code
            p_date
            p_item_id
    返回值:
    Created :  hand
  ===============================================*/
  FUNCTION check_bom(p_item_code VARCHAR2 DEFAULT NULL,
                     p_date      DATE DEFAULT NULL,
                     p_item_id   NUMBER DEFAULT NULL) RETURN BOOLEAN IS
    l_count NUMBER;
  BEGIN
    IF p_date IS NOT NULL THEN
      IF p_item_id IS NULL THEN
        SELECT COUNT(1)
          INTO l_count
          FROM hcm_bom hb, hcm_main_item_v item
         WHERE hb.assembly_item_id = item.item_id
           AND item.item_code = p_item_code
           AND item.enable_flag = 'Y'
           AND hb.start_date <= p_date
           AND hb.end_date >= p_date
           AND hb.plant_id = item.attribute8; --物料生产工厂
      
      ELSE
        SELECT COUNT(1)
          INTO l_count
          FROM hcm_bom hb, hcm_main_item_v item
         WHERE hb.assembly_item_id = p_item_id
           AND item.enable_flag = 'Y'
           AND hb.start_date <= p_date
           AND hb.end_date >= p_date
           AND item.item_id = p_item_id
           AND hb.plant_id = item.attribute8; --物料生产工厂
      END IF;
    
    ELSE
      SELECT COUNT(1)
        INTO l_count
        FROM hcm_bom hb
       WHERE hb.assembly_item_id = p_item_id;
    END IF;
  
    IF l_count = 0 THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  
  END check_bom;
  /*============================================
    HCM-B-P02-05  验证物料是否存在
    参数:  p_item_code
            p_date
            p_item_id
    返回值:
    Created :  hand
  ===============================================*/
  FUNCTION check_item(p_item_code VARCHAR2 DEFAULT NULL,
                      p_item_id   NUMBER DEFAULT NULL) RETURN BOOLEAN IS
    l_count NUMBER := 0;
  BEGIN
  
    IF p_item_id IS NOT NULL THEN
    
      SELECT COUNT(1)
        INTO l_count
        FROM hcm_main_item_v hmi
       WHERE hmi.item_id = p_item_id
         AND hmi.enable_flag = 'Y';
    
    ELSE
    
      SELECT COUNT(1)
        INTO l_count
        FROM hcm_main_item_v hmi
       WHERE hmi.item_code = p_item_code
         AND hmi.enable_flag = 'Y';
    
    END IF;
  
    IF l_count = 0 THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  
  END check_item;
  /*==========================================================
    HCM-B-P02-05  验证数据 客户
    参数:  p_customer              客户
    返回值:x_msg_data
            客户名称                系统中不存在 该客户
            NULL                     存在 该客户
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE check_customer(p_customer IN VARCHAR2,
                           x_msg_data OUT NOCOPY VARCHAR2) IS
    l_count NUMBER := 0;
  BEGIN
    --modify by kungan.huang,20100818,
    --修改取客户的逻辑,取-以后的字符
    SELECT COUNT(1)
      INTO l_count
      FROM hcm_customer_v hcv
     WHERE hcv.customer_alias =
           substr(p_customer, instr(p_customer, '-') + 1);
    IF l_count > 0 THEN
      x_msg_data := NULL;
    ELSE
      x_msg_data := p_customer;
    END IF;
  END check_customer;

  FUNCTION check_customer_for_ui(p_in_parameter IN CLOB) RETURN VARCHAR2 IS
    l_record_count NUMBER;
    l_customer     VARCHAR2(50);
    l_msg_data     VARCHAR2(500);
    l_msg_return   VARCHAR2(4000);
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_customer := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_msg_data := NULL;
      --调用客户化物理盘点过程
      check_customer(l_customer, l_msg_data);
      --错误处理
      IF l_msg_data IS NOT NULL THEN
        IF l_msg_return IS NOT NULL THEN
          l_msg_return := l_msg_return || '#' || l_msg_data;
        ELSE
          l_msg_return := l_msg_data;
        END IF;
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END check_customer_for_ui;
  /*============================================
    HCM-B-P02-05  验证机型是否存在
    参数:  p_prodmodel
    返回值:
    Created :  hand
  ===============================================*/
  FUNCTION check_prodmodel_exist(p_prodmodel IN VARCHAR2) RETURN BOOLEAN IS
    l_count NUMBER;
  BEGIN
    --p_prodmodel 有可能是物料
    -- SELECT COUNT(1) INTO l_count FROM hcm_main_item_v hiv WHERE nvl(hiv.product_model,hiv.item_code) = p_prodmodel;
    SELECT COUNT(1)
      INTO l_count
      FROM hcm_main_item_v hiv
     WHERE hiv.product_model = p_prodmodel
       AND hiv.enable_flag = 'Y';
    IF l_count = 0 THEN
      SELECT COUNT(1)
        INTO l_count
        FROM hcm_main_item_v hiv
       WHERE hiv.item_code = p_prodmodel
         AND hiv.enable_flag = 'Y';
    END IF;
  
    IF l_count = 0 THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN FALSE;
  END check_prodmodel_exist;

  /*==========================================================
    HCM-B-P02-05  验证数据 机型 是否存在相应的BOM
    参数:  p_prodmodel              机型
            p_proddate               需求时间
    返回值:x_msg_data
            S@成功                   数据库中存在机型同时也存在该机型对应的BOM
            E@对应的BOM不存在        数据库中存在机型但不存在该机型对应的BOM
            E@机型不存在             数据库中不存在机型也不存在该机型对应的BOM
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE check_prodmodel(p_prodmodel IN VARCHAR2,
                            p_proddate  IN VARCHAR2,
                            x_msg_data  OUT NOCOPY VARCHAR2,
                            x_next_row  OUT NOCOPY BOOLEAN) IS
    l_count            NUMBER := 0;
    l_item_id          NUMBER;
    l_item_code        VARCHAR2(50);
    l_item_date        DATE;
    l_prod_date        DATE;
    l_nouse_date       DATE;
    l_existed          BOOLEAN;
    l_product_category VARCHAR2(100);
    l_msg_data         VARCHAR2(2000);
  BEGIN
    x_next_row := FALSE;
  
    IF p_prodmodel IS NOT NULL THEN
      --判断机型是否存在
      l_existed := check_prodmodel_exist(p_prodmodel);
      IF l_existed = FALSE THEN
        --F@机型不存在
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_PM_NOT_EXIST');
        x_msg_data := 'F@' || hcm_api.get_message(-1);
        x_next_row := TRUE;
        RETURN;
      END IF;
    ELSE
      /* hcm_api.set_message(p_app_name => 'HCM', p_msg_name => 'HCM_COMMON_SUCCESS');
      x_msg_data := 'S@' || hcm_api.get_message(-1);*/
      x_next_row := TRUE;
      RETURN;
    END IF;
  
    --机型/去向在相应的时间段内是否存在对应的物料
    get_latest_item(p_prod_model  => p_prodmodel,
                    p_demand_date => p_proddate,
                    x_msg_data    => l_item_id,
                    x_msg_date    => l_prod_date, --传出周数开始日期
                    x_msg_date2   => l_nouse_date); --传出周期结束日期
  
    IF l_item_id IS NULL THEN
    
      hcm_api.set_message(p_app_name => 'HCM',
                          p_msg_name => 'HCM_DI_PM_PER_NOT_EXIST');
      x_msg_data := 'E@' || hcm_api.get_message(-1);
      RETURN;
    
    END IF;
  
    --验证该物料是否存在BOM
    l_existed := check_bom(p_item_code => NULL,
                           p_date      => l_prod_date,
                           p_item_id   => l_item_id);
  
    IF l_existed = TRUE THEN
    
      SELECT COUNT(1)
        INTO l_count
        FROM hcm_main_item_v hmi
       WHERE hmi.item_id = l_item_id
         AND hmi.item_type = hcm_profile.value('PHANTOM_ITEM_TYPE');
    
      --如果是虚拟件 验证组件
      IF l_count > 0 THEN
      
        FOR lr_comps IN (SELECT comp.component_item_id,
                                hmi2.product_model,
                                hmi2.item_code
                           FROM hcm_bom_component_v comp,
                                hcm_bom             bom,
                                hcm_main_item_v     hmi,
                                hcm_main_item_v     hmi2
                          WHERE comp.bom_id = bom.bom_id
                            AND bom.assembly_item_id = l_item_id
                            AND hmi.item_id = bom.assembly_item_id
                            AND bom.alternate IS NULL
                            AND bom.plant_id = hmi.attribute8 --物料的生产工厂
                            AND hmi2.item_id = comp.component_item_id) LOOP
          IF lr_comps.product_model IS NULL THEN
            hcm_api.set_message(p_app_name     => 'HCM',
                                p_msg_name     => 'HCM_DI_ITEM_PM_NOT_EXIST',
                                p_token1       => 'ITEM_CODE',
                                p_token1_value => lr_comps.item_code);
            l_msg_data := l_msg_data || hcm_api.get_message(-1);
          ELSE
            l_existed := check_bom(p_item_code => NULL,
                                   p_date      => l_prod_date,
                                   p_item_id   => lr_comps.component_item_id);
            IF l_existed = FALSE THEN
              hcm_api.set_message(p_app_name     => 'HCM',
                                  p_msg_name     => 'HCM_DI_BOM_NOT_EXIST',
                                  p_token1       => 'ITEM_CODE',
                                  p_token1_value => lr_comps.item_code);
              l_msg_data := l_msg_data || hcm_api.get_message(-1);
            ELSE
              NULL;
            END IF;
          END IF;
        END LOOP;
      
        IF l_msg_data IS NULL THEN
          --S@成功
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_COMMON_SUCCESS');
          x_msg_data := 'S@' || hcm_api.get_message(-1);
        ELSE
          x_msg_data := 'E@' || l_msg_data;
        END IF;
      
      ELSE
        --S@成功
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_COMMON_SUCCESS');
        x_msg_data := 'S@' || hcm_api.get_message(-1);
      END IF;
    
    ELSE
      SELECT hmi.item_code
        INTO l_item_code
        FROM hcm_main_item_v hmi
       WHERE hmi.item_id = l_item_id;
      --E@对应的BOM不存在
      hcm_api.set_message(p_app_name     => 'HCM',
                          p_msg_name     => 'HCM_DI_BOM_NOT_EXIST',
                          p_token1       => 'ITEM_CODE',
                          p_token1_value => l_item_code);
      x_msg_data := 'E@' || hcm_api.get_message(-1);
    END IF;
  
  END check_prodmodel;

  FUNCTION check_prodmodel_for_ui(p_in_parameter IN CLOB) RETURN VARCHAR2 IS
    l_record_count    NUMBER;
    l_prodmodel       VARCHAR2(50);
    l_proddate        VARCHAR2(20);
    l_msg_data        VARCHAR2(500);
    l_msg_return      VARCHAR2(4000);
    l_next_row        BOOLEAN;
    l_line_number     NUMBER;
    l_previous_number NUMBER := -1;
    l_prod_existed    VARCHAR2(1) := 'Y';
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_line_number := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_prodmodel   := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_proddate    := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_msg_data    := NULL;
    
      IF (l_prod_existed = 'Y' AND l_previous_number = l_line_number) OR
         l_previous_number <> l_line_number THEN
        IF l_previous_number <> l_line_number THEN
          l_msg_return := l_msg_return || '$';
        END IF;
        --验证机型
        check_prodmodel(l_prodmodel, l_proddate, l_msg_data, l_next_row);
        --错误处理
        -- IF l_msg_data IS NOT NULL THEN
      
        IF l_previous_number <> l_line_number THEN
          l_msg_return := l_msg_return || l_msg_data;
        ELSE
          l_msg_return := l_msg_return || '#' || l_msg_data;
        END IF;
      
        /*IF l_msg_return IS NOT NULL THEN
          l_msg_return := l_msg_return || '#' || l_msg_data;
        ELSE
          l_msg_return := l_msg_data;
        END IF;*/
        IF l_next_row THEN
          l_prod_existed := 'N';
          --RETURN l_msg_return;
        ELSE
          l_prod_existed := 'Y';
        END IF;
        --END IF;
      ELSE
      
        l_msg_return := l_msg_return || '#';
      
      END IF;
    
      l_previous_number := l_line_number;
      --added by liuqin 2011.12.8
      IF length(l_proddate) < 7 THEN
        l_msg_return := l_msg_return || '#' || '  周别格式错误';
      END IF;
      --end added  
    END LOOP;
    --TRIM('$'
    RETURN TRIM('$' FROM l_msg_return);
  END check_prodmodel_for_ui;

  /*============================================
    HCM-B-P02-05  验证p_trace_num是否存在
    参数:  p_trace_num
    返回值:
    Created :  hand
  ===============================================*/

  FUNCTION check_trace_num(p_trace_num IN VARCHAR2) RETURN BOOLEAN IS
    l_count NUMBER;
  BEGIN
    SELECT COUNT(1)
      INTO l_count
      FROM hcm_demand_trace_num hdtn
     WHERE hdtn.trace_num = p_trace_num;
    IF l_count = 0 THEN
      RETURN FALSE;
    ELSE
      RETURN TRUE;
    END IF;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN FALSE;
  END check_trace_num;
  /*============================================
    HCM-B-P02-05  根据p_trace_num取数据
    参数:  p_trace_num
    返回值:取到的数据
    Created :  hand
  ===============================================*/
  PROCEDURE get_data_by_trace_num(p_trace_num IN VARCHAR2,
                                  x_item_code OUT NOCOPY VARCHAR,
                                  x_period    OUT NOCOPY VARCHAR,
                                  x_item_id   OUT NUMBER) IS
  BEGIN
    SELECT i.item_code, hdtn.period, i.item_id
      INTO x_item_code, x_period, x_item_id
      FROM hcm_demand_trace_num hdtn, hcm_main_item_v i
     WHERE hdtn.trace_num = p_trace_num
       AND i.item_id = hdtn.item_id
       AND hdtn.attribute2 IS NULL;
  EXCEPTION
    WHEN OTHERS THEN
      x_item_code := NULL;
      x_period    := NULL;
  END get_data_by_trace_num;

  PROCEDURE check_project_imp(p_itemcode    IN VARCHAR2 DEFAULT NULL,
                              p_tracenum    IN VARCHAR2 DEFAULT NULL,
                              p_demand_date IN VARCHAR2,
                              x_msg_data    OUT NOCOPY VARCHAR2) IS
    l_count NUMBER := 0;
    /*l_itemid            NUMBER := 0;*/
    l_count2            NUMBER := 0;
    l_trace_item_code   VARCHAR2(50);
    l_trace_period      VARCHAR2(20);
    l_trace_item_id     NUMBER;
    l_existed           BOOLEAN;
    l_demand_start_date DATE;
    l_demand_end_date   DATE;
    l_combine_existed   BOOLEAN := TRUE;
  BEGIN
  
    -------------------------
    --取日期
    get_date(p_demand_date, l_demand_start_date, l_demand_end_date);
  
    -------------------------
    --验证追踪号
    IF p_tracenum IS NOT NULL THEN
      l_existed := check_trace_num(p_tracenum);
      IF l_existed = FALSE THEN
        --0@系统中不存在该追踪号
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_TRACE_NUM_NOT_EXIST');
        x_msg_data        := '|0@' || hcm_api.get_message(-1);
        l_combine_existed := FALSE;
      END IF;
    END IF;
  
    -------------------------
    --验证物料
    IF p_itemcode IS NOT NULL THEN
    
      l_existed := check_item(p_itemcode);
    
      IF l_existed = FALSE THEN
      
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_ITEM_IS_NULL');
        x_msg_data := x_msg_data || '|1@' || hcm_api.get_message(-1);
      
        l_combine_existed := FALSE;
        RETURN;
      
      END IF;
    
      --验证bom
      l_existed := check_bom(p_item_code => p_itemcode,
                             p_date      => l_demand_start_date);
      IF l_existed = FALSE THEN
      
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_ITEM_BOM_NOT_EXIST');
        x_msg_data := x_msg_data || '|1@' || hcm_api.get_message(-1);
      
        RETURN;
      END IF;
    
      --验证物料与追踪号是否对应
      IF p_tracenum IS NOT NULL AND l_combine_existed = TRUE THEN
      
        get_data_by_trace_num(p_trace_num => p_tracenum,
                              x_item_code => l_trace_item_code,
                              x_period    => l_trace_period,
                              x_item_id   => l_trace_item_id);
      
        IF p_itemcode <> l_trace_item_code THEN
        
          --0@追踪号与BOM NO不对应'
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_TRACE_NOT_MATCH_ITEM');
          x_msg_data := '|0@' || hcm_api.get_message(-1);
        
        END IF;
      
      END IF;
    END IF;
  END check_project_imp;
  /*==========================================================
    HCM-B-P02-05  验证Project型导入 物料、追踪号
    参数:  p_in_parameter            格式如:'机型1,时间1,机型2,时间2.......'‘
    返回值:
            | 列分隔符 # 行分隔符
            E@不存在BOM|E@追踪号不存在#E@物料不存在|E@追踪号与BOM NO 不对应
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION check_projimp_for_ui(p_in_parameter IN CLOB) RETURN VARCHAR2 IS
    l_record_count     NUMBER;
    l_itemcode         VARCHAR2(50);
    l_tracenum         VARCHAR2(20);
    l_demand_date_char VARCHAR2(20);
    l_msg_data         VARCHAR2(500);
    l_msg_return       VARCHAR2(4000);
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    --批处理开始
  
    FOR i IN 1 .. l_record_count LOOP
    
      --取参数
      l_itemcode         := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_tracenum         := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_demand_date_char := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_msg_data         := NULL;
      --验证机型
      check_project_imp(l_itemcode,
                        l_tracenum,
                        l_demand_date_char,
                        l_msg_data);
      --错误处理
      IF i = 1 THEN
        l_msg_return := l_msg_data;
      ELSE
        l_msg_return := l_msg_return || '#' || l_msg_data;
      
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END check_projimp_for_ui;
  /*==========================================================
    HCM-B-P02-05  验证数据 备件信息
    参数:
            p_in_parameter         备件信息 08***|09***:30
    返回值:x_msg_data
  
    Created :  2009-10-09 hand
  ==========================================================*/

  PROCEDURE check_stockinfo(p_in_parameter IN VARCHAR2,
                            x_msg_data     OUT NOCOPY VARCHAR2) IS
    l_text       VARCHAR2(200);
    l_pos        NUMBER;
    l_count      NUMBER;
    l_stockinfo  VARCHAR2(500); --  料号*数量
    l_stock_code VARCHAR2(50); -- 料号
    l_stock_qty  NUMBER; -- 数量
  
    TYPE stockinfo_tp IS RECORD(
      stock_code VARCHAR2(50)); --末件完工时间);
    TYPE stockinfo_array IS TABLE OF stockinfo_tp INDEX BY BINARY_INTEGER;
    l_stockinfo_array stockinfo_array;
    l_index           NUMBER := 0;
    l_existed         BOOLEAN := FALSE;
  
  BEGIN
    l_text := TRIM(REPLACE(REPLACE(TRIM(p_in_parameter), chr(13)), chr(10)));
    WHILE l_text IS NOT NULL LOOP
      l_pos := instr(l_text, '|');
      IF l_pos > 0 THEN
        l_stockinfo := substr(l_text, 1, l_pos - 1);
        l_text      := substr(l_text, l_pos + length('|'));
      ELSE
        l_stockinfo := l_text;
        l_text      := NULL;
      
      END IF;
    
      IF l_stockinfo IS NOT NULL THEN
        --------------------------------------
        -- Add by hand --
        -- 2009.12.23
        BEGIN
          l_stock_code := TRIM(substr(l_stockinfo,
                                      1,
                                      instr(l_stockinfo, '*') - 1));
          l_stock_qty  := to_number(TRIM(substr(l_stockinfo,
                                                instr(l_stockinfo, '*') + 1)));
          IF l_stock_qty <= 0 THEN
            --4@物料' || l_item_code || '的数量' || l_qty || '不正确'
            hcm_api.set_message(p_app_name     => 'HCM',
                                p_msg_name     => 'HCM_DI_ITEM_QTY_ERROR',
                                p_token1       => 'ITEM_CODE',
                                p_token1_value => l_stock_code,
                                p_token2       => 'QTY',
                                p_token2_value => l_stock_qty);
          
            x_msg_data := x_msg_data || '|4@' || hcm_api.get_message(-1);
          END IF;
        
        EXCEPTION
          WHEN OTHERS THEN
            hcm_api.set_message(p_app_name     => 'HCM',
                                p_msg_name     => 'HCM_DI_ITEM_QTY_ERROR',
                                p_token1       => 'ITEM_CODE',
                                p_token1_value => l_stock_code,
                                p_token2       => 'QTY',
                                p_token2_value => l_stock_qty);
          
            x_msg_data := x_msg_data || '|4@' || hcm_api.get_message(-1);
          
        END;
      
        -- Add End --
        --------------------------------------
      
        SELECT COUNT(1)
          INTO l_count
          FROM hcm_main_item_v hiv
         WHERE hiv.item_code = l_stock_code
           AND hiv.enable_flag = 'Y';
      
        --验证备件是否重复
        FOR i IN 1 .. l_stockinfo_array.count LOOP
          IF l_stockinfo_array(i).stock_code = l_stock_code THEN
            l_existed := TRUE;
            EXIT;
          END IF;
        END LOOP;
        IF l_existed = FALSE THEN
          l_index := l_index + 1;
          l_stockinfo_array(l_index).stock_code := l_stock_code;
        ELSE
        
          hcm_api.set_message(p_app_name     => 'HCM',
                              p_msg_name     => 'HCM_DI_STOCK_RPT',
                              p_token1       => 'CODE',
                              p_token1_value => l_stock_code);
          x_msg_data := x_msg_data || '|4@' || hcm_api.get_message(-1);
        END IF;
      
        IF l_count = 0 THEN
        
          hcm_api.set_message(p_app_name     => 'HCM',
                              p_msg_name     => 'HCM_DI_ITEM_NOT_EXIST',
                              p_token1       => 'ITEM_CODE',
                              p_token1_value => l_stock_code);
        
          x_msg_data := x_msg_data || '|4@' || hcm_api.get_message(-1);
        END IF;
      END IF;
    END LOOP;
  
  END check_stockinfo;

  /*==========================================================
    HCM-B-P02-05  验证数据 ODF和SP公用的验证
                       包括:客户是否存在/机型是否存在/trace_num/物料是否一致/是否存在BOM
    参数:
            p_itemcode         物料BOM NO.
            p_tracenum         追踪号
            p_prodmodel        机型
            p_stockinfo        备件信息
            p_tempinfo         样机信息
            p_demanddate       需求时间
  
    返回值:x_msg_data
  
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
    Created :  2009-12-23 Shaowei.Zhang
  ==========================================================*/
  PROCEDURE check_common_data(p_customer       IN VARCHAR2,
                              p_itemcode       IN VARCHAR2 DEFAULT NULL,
                              p_tracenum       IN VARCHAR2,
                              p_prodmodel      IN VARCHAR2,
                              p_period         IN VARCHAR2 DEFAULT NULL,
                              p_cust_site_name IN VARCHAR2 DEFAULT NULL,
                              x_msg_data       OUT NOCOPY VARCHAR2) IS
    l_prod_item_code     VARCHAR2(50); --机型对应的物料
    l_prod_item_id       NUMBER;
    l_trace_item_code    VARCHAR2(50); --追踪对应的物料
    l_trace_item_id      NUMBER;
    l_demand_start_date  DATE; --Trace 表上的 需求时间
    l_demand_end_date    DATE; --Trace 表上的 需求时间
    l_count              NUMBER;
    l_period             VARCHAR2(30);
    l_existed            BOOLEAN;
    l_combine_existed    BOOLEAN := TRUE; -- Trace_Num + ProdModel + ItemCode 三者的验证结果
    l_prod_model_existed BOOLEAN := TRUE;
    l_item_existed       BOOLEAN := TRUE;
    l_msg_data           VARCHAR2(4000);
  
  BEGIN
  
    ------------------------------
    --驗證客戶是否存在
    check_customer(p_customer, l_msg_data);
    IF l_msg_data IS NOT NULL THEN
      hcm_api.set_message(p_app_name => 'HCM',
                          p_msg_name => 'HCM_DI_CUST_NOT_EXIST');
      l_msg_data := l_msg_data || '|0@' || hcm_api.get_message(-1);
    ELSE
      IF p_cust_site_name IS NOT NULL THEN
      
        SELECT COUNT(1)
          INTO l_count
          FROM hcm_customer_sites_v hcs
         WHERE hcs.customer_alias = p_customer
           AND nvl(upper(hcs.customer_site_name), '~~###~~') =
               nvl(upper(p_cust_site_name), '~~###~~'); --客户地点验证不区分大小写
      
        IF l_count < 1 THEN
          --hcm_api.set_message(p_app_name => 'HCM', p_msg_name => 'HCM_DI_CUST_NOT_EXIST');
          l_msg_data := l_msg_data || '|6@客户地点不存在!';
        END IF;
      
      END IF;
      NULL;
    END IF;
  
    ------------------------------
    --判断机型是否存在
    IF p_prodmodel IS NOT NULL THEN
      l_prod_model_existed := check_prodmodel_exist(p_prodmodel => p_prodmodel);
      IF l_prod_model_existed = FALSE THEN
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_PM_NOT_EXIST');
        l_msg_data        := l_msg_data || '|1@' || hcm_api.get_message(-1);
        l_combine_existed := FALSE;
      END IF;
    ELSE
      l_prod_model_existed := FALSE;
    END IF;
  
    ------------------------------
    IF p_tracenum IS NOT NULL THEN
      --判断追踪号
      get_data_by_trace_num(p_tracenum,
                            l_trace_item_code,
                            l_period,
                            l_trace_item_id);
      IF l_trace_item_code IS NULL THEN
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_TRACE_NUM_NOT_EXIST');
        l_msg_data        := l_msg_data || '|2@' || hcm_api.get_message(-1);
        l_combine_existed := FALSE;
      END IF;
    
    END IF;
  
    IF p_itemcode IS NOT NULL THEN
    
      l_existed := check_item(p_item_code => p_itemcode);
    
      IF l_existed = FALSE THEN
      
        hcm_api.set_message(p_app_name     => 'HCM',
                            p_msg_name     => 'HCM_DI_ITEM_NOT_EXIST',
                            p_token1       => 'ITEM_CODE',
                            p_token1_value => p_itemcode);
        l_msg_data := l_msg_data || '|3@' || hcm_api.get_message(-1);
      
        l_combine_existed := FALSE;
      END IF;
    
    END IF;
  
    ------------------------------
    --如果机型验证通过 并且 有需求时间
    IF l_prod_model_existed = TRUE AND nvl(p_period, l_period) IS NOT NULL THEN
    
      get_latest_item(p_prod_model  => p_prodmodel,
                      p_demand_date => nvl(p_period, l_period),
                      x_msg_data    => l_prod_item_id,
                      x_msg_date    => l_demand_start_date,
                      x_msg_date2   => l_demand_end_date);
    
      BEGIN
        SELECT hiv.item_code
          INTO l_prod_item_code
          FROM hcm_main_item_v hiv
         WHERE hiv.item_id = l_prod_item_id;
      EXCEPTION
        WHEN no_data_found THEN
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_TD_DATE_NO_ITEM');
          l_msg_data     := l_msg_data || '|1@' || hcm_api.get_message(-1);
          l_item_existed := FALSE;
      END;
    
      IF l_item_existed <> FALSE THEN
      
        -------------------
        --判断物料是否存在BOM
        l_existed := check_bom(p_item_id => l_prod_item_id,
                               p_date    => l_demand_start_date);
      
        IF l_existed = FALSE THEN
          --该追踪号对应的物料BOM不存在!
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_TI_NOT_EXIST');
          l_msg_data := l_msg_data || '|1@' || hcm_api.get_message(-1);
        
        END IF;
      
      END IF;
    
    END IF;
  
    ------------------------------
    --  如果Trace_Num + ProdModel + ItemCode 三者验证通过
    IF l_combine_existed = TRUE AND p_tracenum IS NOT NULL THEN
    
      -------------------
      --判断追踪号对应的物料,机型对应的物料是否一致
      IF l_prod_item_code <> l_trace_item_code THEN
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_PM_ITEM_NOT_MATCH');
        l_msg_data := l_msg_data || '|1@' || hcm_api.get_message(-1);
      END IF;
    
      IF p_period IS NOT NULL THEN
      
        SELECT COUNT(1)
          INTO l_count
          FROM hcm_demand_trace_num hdtn
         WHERE hdtn.trace_num = p_tracenum
           AND hdtn.period = p_period;
        IF l_count = 0 THEN
          --需求时间与追踪时段不一致!
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_DM_DATE_NOT_MATCH');
          l_msg_data := l_msg_data || '|2@' || hcm_api.get_message(-1);
        END IF;
      
      END IF;
    END IF;
    ------------------------------
    IF l_combine_existed = TRUE AND p_itemcode IS NOT NULL AND
       l_prod_item_code <> p_itemcode THEN
     --  insert into liuqin_test(memo) values (l_prod_item_id || ' ' || l_prod_item_code || '  ' || p_itemcode);
      --BOM NO和机型对应的物料不相符!
      hcm_api.set_message(p_app_name => 'HCM',
                          p_msg_name => 'HCM_DI_BOM_ITEM_NOT_MATCH');
      l_msg_data := l_msg_data || '|3@' || hcm_api.get_message(-1);
    
    END IF;
  
    x_msg_data := l_msg_data;
  
  END check_common_data;
  /*==========================================================
    HCM-B-P02-05  验证数据 机型
    参数:  p_prodmodel              机型
            p_proddate               需求时间
    返回值:x_msg_data
            S@成功                   数据库中存在机型同时也存在该机型对应的BOM
            E@对应的BOM不存在        数据库中存在机型但不存在该机型对应的BOM
            E@机型不存在             数据库中不存在机型也不存在该机型对应的BOM
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE check_spimp(p_customer       IN VARCHAR2,
                        p_prodmodel      IN VARCHAR2,
                        p_proddate       IN VARCHAR2,
                        p_tracenum       IN VARCHAR2,
                        p_cust_site_name IN VARCHAR2,
                        p_batch_id       IN VARCHAR2,
                        p_last_flag      IN VARCHAR2,
                        x_msg_data       OUT NOCOPY VARCHAR2) IS
    l_prod_date       DATE;
    l_item_id         NUMBER; --机型在追踪时段内最近的物料ID
    l_trace_item_id   NUMBER; --追踪号对应的物料ID
    x_no_use          BOOLEAN;
    l_traceid         NUMBER;
    l_item_date       DATE;
    l_demand_date     DATE;
    l_trace_qty       NUMBER;
    l_msg_data        VARCHAR2(50);
    l_count           NUMBER;
    l_common_data_msg VARCHAR2(2000);
    l_sp_qty_sum      NUMBER;
    l_odf_qty_sum     NUMBER;
  BEGIN
    --验证客户、机型、物料、跟踪号
    check_common_data(p_customer       => p_customer,
                      p_itemcode       => NULL,
                      p_tracenum       => p_tracenum,
                      p_prodmodel      => p_prodmodel,
                      p_period         => NULL,
                      p_cust_site_name => p_cust_site_name,
                      x_msg_data       => l_common_data_msg);
  
    --根据trace_num 取没有验证qty的数据
    SELECT COUNT(1)
      INTO l_count
      FROM hcm_check_sp_imp_temp hcs, hcm_demand_trace_num hdt
     WHERE hcs.trace_num = p_tracenum
       AND hcs.checked = 'N'
       AND hdt.trace_num = hcs.trace_num
       AND hdt.attribute2 IS NULL
       AND hcs.batch_id = p_batch_id;
  
    --如果没验证
    IF l_count > 0 THEN
    
      SELECT nvl(SUM(a.shipping_qty), 0)
        INTO l_sp_qty_sum
        FROM hcm_check_sp_imp_temp a
       WHERE a.checked = 'N'
         AND a.trace_num = p_tracenum
         AND a.batch_id = p_batch_id;
    
      --- 汇总主需求数量
      SELECT nvl(SUM(h.shipping_qty), 0)
        INTO l_odf_qty_sum
        FROM hcm_demand_info h, hcm_demand_trace_num t
       WHERE h.trace_id = t.trace_id
         AND t.trace_num = p_tracenum
         AND t.attribute2 IS NULL -- 主需求attribute2 为空
         AND h.demand_type = 'ORDER';
    
      --打标记为已验证
      UPDATE hcm_check_sp_imp_temp a
         SET a.checked = 'Y'
       WHERE a.trace_num = p_tracenum
         AND a.batch_id = p_batch_id;
    
      IF l_sp_qty_sum > l_odf_qty_sum THEN
        --本次导入的Shipping Plan数量之和大于已经发布的ORDER数量
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_MORE_SP_QTY');
        l_common_data_msg := l_common_data_msg || '|5@' ||
                             hcm_api.get_message(-1);
      END IF;
    
    END IF;
  
    --返回结果
    x_msg_data := x_msg_data || l_common_data_msg;
  
  END check_spimp;

  /*==========================================================
    HCM-B-P02-05  验证Shpping Plan型导入 物料、追踪号
    参数:  p_in_parameter            格式如:'机型1,时间1,机型2,时间2.......'‘
    返回值:
  
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION check_spimp_for_ui(p_in_parameter IN CLOB,
                              p_batch_id     IN VARCHAR2,
                              p_last_flag    IN VARCHAR2) RETURN VARCHAR2 IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    l_record_count   NUMBER;
    l_itemmodel      VARCHAR2(50);
    l_itemdate       VARCHAR2(20);
    l_customer       VARCHAR2(50);
    l_tracenum       VARCHAR2(50);
    l_sp_qty         NUMBER;
    l_msg_data       VARCHAR2(500);
    l_msg_return     VARCHAR2(30000);
    l_cust_site_name VARCHAR2(2000);
    l_count          NUMBER := 0;
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
  
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      l_customer  := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_itemmodel := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_itemdate  := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_tracenum  := hcm_demand_pck.g_in_parameter_table(i) (4);
      BEGIN
        l_sp_qty := to_number(hcm_demand_pck.g_in_parameter_table(i) (5));
      EXCEPTION
        WHEN OTHERS THEN
          l_sp_qty := NULL;
          NULL;
      END;
      l_cust_site_name := hcm_demand_pck.g_in_parameter_table(i) (6);
    
      INSERT INTO hcm_check_sp_imp_temp
        (customer, --
         item_model,
         item_date,
         trace_num,
         shipping_qty,
         cust_site_name,
         checked,
         batch_id,
         temp_id)
      VALUES
        (l_customer, --
         l_itemmodel,
         l_itemdate,
         l_tracenum,
         l_sp_qty,
         l_cust_site_name,
         'N',
         to_number(p_batch_id),
         hcm_demand_temp_s.nextval);
    
    END LOOP;
  
    IF p_last_flag = 'Y' THEN
      FOR lr_temp IN (SELECT *
                        FROM hcm_check_sp_imp_temp t
                       WHERE t.batch_id = p_batch_id
                       ORDER BY temp_id ASC) LOOP
      
        l_count := l_count + 1;
      
        --取参数
        l_customer  := lr_temp.customer;
        l_itemmodel := lr_temp.item_model;
        l_itemdate  := lr_temp.item_date;
        l_tracenum  := lr_temp.trace_num;
        -- l_sp_qty         := hcm_demand_pck.g_in_parameter_table(i) (5);
        l_cust_site_name := lr_temp.cust_site_name;
        l_msg_data       := NULL;
        --验证
        check_spimp(l_customer,
                    l_itemmodel,
                    l_itemdate,
                    l_tracenum,
                    l_cust_site_name,
                    p_batch_id,
                    p_last_flag,
                    l_msg_data);
        --错误处理
        IF l_count = 1 THEN
          l_msg_return := l_msg_data;
        ELSE
          l_msg_return := l_msg_return || '#' || l_msg_data;
        END IF;
      END LOOP;
    
      DELETE FROM hcm_check_sp_imp_temp csi
       WHERE csi.batch_id = p_batch_id;
    
    END IF;
    COMMIT;
    RETURN l_msg_return;
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
      RETURN '|5@出现异常,原因:' || SQLERRM;
  END check_spimp_for_ui;

  /*  \*==========================================================
    HCM-B-P02-05  验证ODF型导入 物料、追踪号
    参数:  p_in_parameter            格式如:'机型1,时间1,机型2,时间2.......'‘
    返回值:
  
    Created : 2009-10-09 hand
  ==========================================================*\
  FUNCTION CHECK_ODFIMP_FOR_UI ( p_in_parameter  IN CLOB)
  RETURN VARCHAR2
  IS
    l_record_count NUMBER;
    l_itemcode     VARCHAR2(50);
    l_itemdate     VARCHAR2(20);
    l_msg_data     VARCHAR2(50);
    l_msg_return   VARCHAR2(4000);
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := HCM_DEMAND_PCK.g_in_record_count;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_itemcode               := HCM_DEMAND_PCK.g_in_parameter_table(i) (1);
      l_itemdate               := HCM_DEMAND_PCK.g_in_parameter_table(i) (2);
      l_msg_data               := NULL;
      --验证机型
      CHECK_SPIMP(l_itemcode,l_itemdate,l_msg_data);
      --错误处理
      IF i = 1 THEN
        l_msg_return := l_msg_data;
      ELSE
        l_msg_return := l_msg_return || '#' || l_msg_data ;
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END CHECK_ODFIMP_FOR_UI;*/

  /*==========================================================
    HCM-B-P02-05  验证数据 机型
    参数:
            p_itemcode         物料BOM NO.
            p_tracenum         追踪号
            p_prodmodel        机型
            p_stockinfo        备件信息
            p_tempinfo         样机信息
            p_demanddate       需求时间
  
    返回值:x_msg_data
  
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE check_odfimp(p_customer   IN VARCHAR2,
                         p_itemcode   IN VARCHAR2,
                         p_tracenum   IN VARCHAR2,
                         p_prodmodel  IN VARCHAR2,
                         p_stockinfo  IN VARCHAR2,
                         p_demanddate IN VARCHAR2,
                         x_msg_data   OUT NOCOPY VARCHAR2) IS
    l_prod_date       DATE;
    x_stockinfo       VARCHAR2(200);
    l_nouse_date      DATE;
    l_common_data_msg VARCHAR(2000);
  BEGIN
  
    --取需求时间
    --get_date(p_demanddate, l_prod_date, l_nouse_date);
  
    --验证客户、机型、物料、跟踪号
    check_common_data(p_customer  => p_customer,
                      p_itemcode  => p_itemcode,
                      p_tracenum  => p_tracenum,
                      p_prodmodel => p_prodmodel,
                      p_period    => p_demanddate,
                      x_msg_data  => l_common_data_msg);
    --
    IF p_tracenum IS NOT NULL THEN
      NULL;
    END IF;
  
    --验证备件信息
    check_stockinfo(p_stockinfo, x_stockinfo);
  
    --返回结果
    x_msg_data := x_msg_data || l_common_data_msg || x_stockinfo;
  
  END check_odfimp;

  /*==========================================================
    HCM-B-P02-05  验证ODF型导入 物料、追踪号
    参数:  p_in_parameter            格式如:'机型1,时间1,机型2,时间2.......'‘
    返回值:
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
            5                         样机信息..........
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION check_odfimp_for_ui(p_in_parameter IN CLOB) RETURN VARCHAR2 IS
    l_record_count NUMBER;
    l_itemcode     VARCHAR2(50); --BOM NO.
    l_tracenum     VARCHAR2(50); --追踪号
    l_prodmodel    VARCHAR2(50); --机型
    l_stockinfo    VARCHAR2(500); --备件信息
    l_demanddate   VARCHAR2(50); --需求时间
    l_customer     VARCHAR2(50); --客戶
    l_msg_data     VARCHAR2(500);
    l_msg_return   VARCHAR2(4000);
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_customer   := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_itemcode   := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_tracenum   := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_prodmodel  := hcm_demand_pck.g_in_parameter_table(i) (4);
      l_stockinfo  := hcm_demand_pck.g_in_parameter_table(i) (5);
      l_demanddate := hcm_demand_pck.g_in_parameter_table(i) (6);
      l_msg_data   := NULL;
      --验证机型
      check_odfimp(l_customer,
                   l_itemcode,
                   l_tracenum,
                   l_prodmodel,
                   l_stockinfo,
                   l_demanddate,
                   l_msg_data);
    
      --错误处理
      IF i = 1 THEN
        l_msg_return := l_msg_data;
      ELSE
        l_msg_return := l_msg_return || '#' || l_msg_data;
      END IF;
    END LOOP;
    RETURN TRIM(trailing '#' FROM l_msg_return);
  END check_odfimp_for_ui;

  /*==============================================================================================================*/

  /*==========================================================
    HCM-B-P02-05  判断列头需求时间是否在追踪时段范围内
    参数:  p_item_id                  物料ID
            p_customer_id              客户ID
            p_trace_start_date         追踪起始时间 EXCEL题头的时间
            p_check_date               需要验证的导入时间 行头或列头的时间
    返回值:x_msg_data                 bool
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE check_imp_date(p_item_id          IN NUMBER,
                           p_customer_id      IN NUMBER,
                           p_trace_start_date IN DATE,
                           p_need_check_date  IN DATE,
                           p_period_type      IN VARCHAR2,
                           /*p_user_id          IN NUMBER,*/
                           x_msg_flag OUT NOCOPY BOOLEAN,
                           x_msg_date OUT NOCOPY DATE) IS
    l_prod_type      VARCHAR2(30); --产品类别
    l_period_num     NUMBER; --时段数
    l_period_type    VARCHAR2(10); --时段类型
    l_trace_end_date DATE; --追踪结束日期
  BEGIN
    BEGIN
      /*SELECT hic.segment2
       INTO l_prod_type
       FROM hcm_item_categories_v hic
      WHERE hic.inventory_item_id = p_item_id
        AND hic.category_set_id = 1
           \*AND hic.segment1 LIKE '9%'*\
        AND hic.organization_id = hcm_public_pck.get_user_parameter(NULL, 'U', p_user_id, 'DEFAULT_MAIN_PLANT_ID')
        AND rownum = 1;*/
      l_prod_type := get_product_category(p_item_id => p_item_id);
    
      --根据客户及物料的产品类别  得到 时段类型与时段数
      SELECT hdtt.period_type, hdtt.period_num
        INTO l_period_type, l_period_num
        FROM hcm_demand_trace_type hdtt
       WHERE hdtt.customer_id = p_customer_id
         AND hdtt.product_category = l_prod_type
         AND hdtt.period_type = p_period_type;
      --判断需求 时间是否在追踪时段范围内
      l_trace_end_date := CASE TRIM(l_period_type)
                            WHEN 'D' THEN
                             p_trace_start_date + l_period_num
                            WHEN 'M' THEN
                             add_months(p_trace_start_date, l_period_num)
                            WHEN 'Y' THEN
                             add_months(p_trace_start_date,
                                        l_period_num * 12)
                            WHEN 'W' THEN
                             p_trace_start_date + l_period_num * 7
                            ELSE
                             p_trace_start_date
                          END;
    
      IF p_need_check_date >= p_trace_start_date AND
         p_need_check_date <= l_trace_end_date THEN
        x_msg_flag := TRUE;
        x_msg_date := l_trace_end_date;
      END IF;
    EXCEPTION
      WHEN no_data_found THEN
        x_msg_flag := FALSE;
        x_msg_date := NULL;
    END;
  END check_imp_date;

  /*==========================================================
    HCM-B-P02-05
                       根据客户生成追踪号
    参数:
            p_itemcode         物料BOM NO.
            p_tracenum         追踪号
            p_prodmodel        机型
            p_stockinfo        备件信息
            p_tempinfo         样机信息
            p_demanddate       需求时间
  
    返回值:x_msg_data
  
    Created :  2009-12-23 Shaowei.Zhang
  ==========================================================*/

  FUNCTION build_trace_num(p_customer_id      IN NUMBER,
                           p_demand_type      VARCHAR2,
                           p_trace_start_date DATE,
                           p_demand_date2     IN VARCHAR2,
                           p_period_type      VARCHAR2,
                           p_proj_phase       IN VARCHAR2 DEFAULT NULL,
                           p_customer_name    IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_week             NUMBER;
    l_year             NUMBER;
    l_trace_number     VARCHAR2(20);
    l_trace_max_number VARCHAR2(20);
    l_trace            VARCHAR2(20);
    l_short_name       VARCHAR2(30);
    l_nouse_date       DATE;
    l_imp_date         DATE;
  
  BEGIN
  
    get_date(p_demand_date2, l_imp_date, l_nouse_date);
  
    IF p_demand_type IN ('FCST', 'ORDER') THEN
      /*如果客户字段带有“-”符号,客户简称取“-”符号之前的前两位字符,不足两位以“-”填充;如果客户字段不带有“-”
      符号户简称取自HCM_CUSTOMER_V中的“名称发音*/
    
      /*      SELECT nvl(substr(cust.short_name, 1, 2), 'TL')     --ben 2010-07-14 changed
       INTO l_short_name
       FROM hcm_customer_v cust
      WHERE cust.customer_id = p_customer_id;*/
    
      IF (instr(p_customer_name, '-') <> 0) THEN
        l_short_name := rpad(substr(p_customer_name,
                                    1,
                                    instr(p_customer_name, '-') - 1),
                             2,
                             '-');
      ELSE
        SELECT nvl(substr(cust.short_name, 1, 2), 'XL') --ben 2010-07-14 changed
          INTO l_short_name
          FROM hcm_customer_v cust
         WHERE cust.customer_id = p_customer_id;
      
      END IF;
    
      IF p_period_type = 'Y' THEN
        l_week := 1;
      ELSIF p_period_type = 'M' THEN
        l_week := get_week(p_in_date => trunc(l_imp_date, 'MM'));
      ELSIF p_period_type = 'W' THEN
        l_week := get_week(p_in_date => l_imp_date);
      ELSIF p_period_type = 'D' THEN
        l_week := get_week(p_in_date => l_imp_date);
      END IF;
      IF to_char(l_imp_date, 'YYYY-MM-DD') = '2012-12-31' THEN
        SELECT l_short_name || '13' || lpad(l_week, 2, '0')
          INTO l_trace
          FROM dual;
      ELSE
        SELECT l_short_name || to_char(l_imp_date, 'YY') ||
               lpad(l_week, 2, '0')
          INTO l_trace
          FROM dual;
      
      END IF;
      BEGIN
      
        SELECT trace_num
          INTO l_trace_max_number
          FROM (SELECT t.trace_num
                  FROM hcm_demand_trace_num t
                 WHERE substr(t.trace_num, 1, 6) = l_trace
                 ORDER BY trace_num DESC)
         WHERE rownum = 1;
        --  FOR UPDATE wait 30; --added by liuqin 2011-1-21 避免一个traceid 对应2个tracenum
      
        SELECT l_trace ||
               lpad(to_number(substr(l_trace_max_number, 7, 9)) + 1, 3, '0')
          INTO l_trace_number
          FROM dual;
      
      EXCEPTION
        WHEN no_data_found THEN
          l_trace_number := l_trace || '001';
      END;
    ELSIF p_demand_type IN ('PROJECT') THEN
    
      l_week := get_week(p_in_date => l_imp_date);
    
      IF to_char(l_imp_date, 'YYYY-MM-DD') = '2012-12-31' THEN
        SELECT p_proj_phase || '13' || lpad(l_week, 2, '0')
          INTO l_trace
          FROM dual;
      ELSE
        SELECT p_proj_phase || to_char(l_imp_date, 'YY') ||
               lpad(l_week, 2, '0')
          INTO l_trace
          FROM dual;
      END IF;
      BEGIN
        /* SELECT lpad(MAX(t.trace_num) + 1, 2, '0')
         INTO l_trace_number
         FROM hcm_demand_trace_num t
        WHERE substr(t.trace_num, 1, 7) = l_trace;
        */
      
        SELECT trace_num
          INTO l_trace_max_number
          FROM (SELECT t.trace_num
                  FROM hcm_demand_trace_num t
                 WHERE substr(t.trace_num, 1, 7) = l_trace
                 ORDER BY trace_num DESC)
         WHERE rownum = 1;
      
        SELECT l_trace || lpad(to_number(substr(l_trace_max_number, 8, 10)) + 1,
                               2,
                               '0')
          INTO l_trace_number
          FROM dual;
      
      EXCEPTION
        WHEN no_data_found THEN
          l_trace_number := l_trace || '01';
        WHEN OTHERS THEN
          l_trace_number := NULL;
      END;
    
    END IF;
  
    --dbms_output.put_line('l_trace_number' || l_trace_number);
  
    RETURN l_trace_number;
  
  END build_trace_num;

  /*==========================================================
    HCM-B-P02-05  取或生成追踪号
    参数:  p_prod_model              机型
            p_demand_date1             需求时间 EXCEL题头的时间
            p_demand_date2             需要验证的导入时间 行头或列头的时间
    返回值:x_msg_data
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE get_trace_num(p_user_id       IN NUMBER,
                          p_customer      IN VARCHAR2 DEFAULT NULL,
                          p_item_id       IN VARCHAR2,
                          p_demand_type   IN VARCHAR2,
                          p_demand_date1  IN VARCHAR2,
                          p_demand_date2  IN VARCHAR2,
                          p_buyer         IN VARCHAR2 DEFAULT NULL,
                          p_attribute2    IN VARCHAR2 DEFAULT NULL,
                          p_demand_time   IN DATE,
                          p_week_end_time IN DATE,
                          p_proj_phase    IN VARCHAR2 DEFAULT NULL,
                          x_trace_num     IN OUT NOCOPY VARCHAR2,
                          x_customer_id   OUT NOCOPY NUMBER,
                          x_trace_id      OUT NOCOPY NUMBER,
                          x_demand_date   OUT NOCOPY DATE) IS
    l_item_id               NUMBER;
    l_customer_id           NUMBER;
    l_trace_id              NUMBER;
    l_trace_num             VARCHAR2(20);
    l_period_type_new       VARCHAR2(10); --时段类型
    l_period_type           VARCHAR2(10); --时段类型
    l_trace_start_date      DATE; --追踪开始日期
    l_trace_end_date        DATE; --追踪结束日期
    l_need_check_date       DATE; --需要验证的日期
    l_imp_date_sucess       BOOLEAN; --验证列头或行头时间 是否在 追踪时段范围内
    l_trace_demand_date     DATE;
    l_trace_demand_date_new DATE;
    l_nouse_date            DATE;
    l_trace_num_new         VARCHAR2(50);
    l_item_no               VARCHAR2(50);
  
    --add by kungan.huang,20100818
    l_customer_name_prefix VARCHAR2(80) := substr(p_customer,
                                                  1,
                                                  instr(p_customer, '-') - 1);
  BEGIN
  
    --dbms_output.put_line(p_demand_date1);
  
    --客户ID
    IF p_customer IS NOT NULL THEN
      SELECT hcv.customer_id
        INTO l_customer_id
        FROM hcm_customer_v hcv
       WHERE hcv.customer_alias =
             substr(p_customer,
                    instr(p_customer, '-') + 1,
                    length(p_customer));
    END IF;
  
    --当追踪号不为空的情况下
    IF x_trace_num IS NULL THEN
      get_date(p_demand_date1, l_trace_start_date, l_nouse_date);
      ----物料ID
      l_item_id := p_item_id;
      --取物料code liuqin 2012.7.27防止追踪号重复
      l_item_no := '';
      SELECT DISTINCT hi.item_code
        INTO l_item_no
        FROM hcm_item_v hi
       WHERE hi.item_id = l_item_id;
      IF substr(l_item_no, 1, 1) = '9' THEN
        l_item_no := '9';
      END IF;
    
      l_need_check_date := p_demand_time;
      IF l_item_id IS NOT NULL THEN
        --
        IF instr(p_demand_date2, 'W') > 0 THEN
          l_period_type_new       := 'W';
          l_trace_demand_date_new := p_week_end_time;
        ELSIF instr(p_demand_date2, 'M') > 0 THEN
          l_period_type_new       := 'M';
          l_trace_demand_date_new := add_months(l_need_check_date, 1) - 1;
        ELSIF instr(p_demand_date2, 'D') > 0 THEN
          l_period_type_new       := 'D';
          l_trace_demand_date_new := l_need_check_date;
        ELSIF instr(p_demand_date2, 'Y') > 0 THEN
          l_period_type_new       := 'Y';
          l_trace_demand_date_new := add_months(l_need_check_date, 12) - 1;
        ELSE
          l_period_type_new       := 'D';
          l_trace_demand_date_new := l_need_check_date;
        END IF;
      
        --判断该物料+时段是否在hcm_demand_trace_num中存在
        --增加attribute3的判断, attribte3记录客户名称-字符前的字符
        BEGIN
          SELECT hdtn.trace_id,
                 hdtn.trace_num,
                 hdtn.demand_start_date,
                 hdtn.period_type
            INTO l_trace_id,
                 l_trace_num,
                 l_trace_demand_date,
                 l_period_type
            FROM hcm_demand_trace_num hdtn
           WHERE hdtn.period = p_demand_date2
             AND hdtn.item_id = l_item_id
             AND hdtn.period_type = l_period_type_new
             AND nvl(hdtn.attribute1, '&#&') = nvl(p_buyer, '&#&')
             AND nvl(hdtn.attribute2, '&#&') = nvl(p_attribute2, '&#&')
             AND nvl(hdtn.attribute3, '&#&') =
                 nvl(l_customer_name_prefix, '&#&');
        
        EXCEPTION
          WHEN no_data_found THEN
            --在hcm_demand_trace_num中不存在追踪ID时先插一条记录然后再判断行头或列头时间是否在追踪时段范围内,若在则生成追踪号
            l_period_type       := l_period_type_new;
            l_trace_demand_date := l_trace_demand_date_new;
          
            SELECT hcm_demand_trace_num_s.nextval
              INTO l_trace_id
              FROM dual;
            INSERT INTO hcm_demand_trace_num
              (trace_id,
               period,
               period_type,
               trace_num,
               description,
               demand_start_date,
               demand_end_date,
               item_id,
               attribute1,
               attribute2,
               attribute3,
               creation_date,
               created_by,
               last_updated_by,
               last_update_date,
               last_update_login,
               attribute9,
               attribute10)
            VALUES
              (l_trace_id,
               p_demand_date2,
               l_period_type,
               NULL,
               '',
               l_need_check_date,
               l_trace_demand_date,
               l_item_id,
               p_buyer,
               p_attribute2,
               l_customer_name_prefix, --attbibute3
               SYSDATE,
               p_user_id,
               p_user_id,
               SYSDATE,
               p_user_id,
               l_item_no,
               'ins10');
          
        END;
      
        IF l_trace_num IS NULL THEN
          check_imp_date(p_item_id          => l_item_id,
                         p_customer_id      => l_customer_id,
                         p_trace_start_date => l_trace_start_date,
                         p_need_check_date  => l_need_check_date,
                         p_period_type      => l_period_type,
                         /*p_user_id          => p_user_id,*/
                         x_msg_flag => l_imp_date_sucess,
                         x_msg_date => l_trace_end_date);
          IF l_imp_date_sucess OR p_proj_phase IS NOT NULL THEN
            --在hcm_demand_trace_num中更新该记录的追踪号
            l_trace_num_new := build_trace_num(p_customer_id      => l_customer_id,
                                               p_demand_type      => p_demand_type,
                                               p_trace_start_date => l_trace_start_date,
                                               p_demand_date2     => p_demand_date2,
                                               p_period_type      => l_period_type,
                                               p_proj_phase       => p_proj_phase,
                                               p_customer_name    => p_customer);
          
            UPDATE hcm_demand_trace_num hdtn
               SET hdtn.trace_num   = l_trace_num_new,
                   hdtn.attribute10 = l_customer_id || ';' || p_demand_type || ';' ||
                                      l_trace_start_date || ';' ||
                                      p_demand_date2 || ';' || l_period_type || ';' ||
                                      p_proj_phase || ';' || p_customer -- to_char(l_trace_id)
             WHERE hdtn.trace_id = l_trace_id;
          END IF;
          x_trace_num := l_trace_num_new;
        ELSE
          x_trace_num := l_trace_num;
        END IF;
      
      ELSE
        NULL;
      END IF;
    ELSE
      BEGIN
        SELECT hdtn.trace_id
          INTO l_trace_id
          FROM hcm_demand_trace_num hdtn
         WHERE hdtn.trace_num = x_trace_num
           AND nvl(hdtn.attribute2, '~##~') = nvl(p_attribute2, '~##~')
           AND hdtn.item_id = p_item_id;
      END;
    END IF;
    x_trace_id    := l_trace_id;
    x_customer_id := l_customer_id;
    x_demand_date := l_trace_demand_date;
  END get_trace_num;

  /*==========================================================
    HCM-B-P02-05  版本号生成
    参数:  p_prod_model              机型
            p_demand_date             行头或列头 需求时间
            p_trace_num
    返回值:x_msg_data
    Created :  2009-10-09 hand
  ==========================================================*/
  PROCEDURE get_version(p_prod_model IN VARCHAR2,
                        p_lot        IN VARCHAR2,
                        x_version_id OUT NUMBER,
                        x_msg_data   OUT NOCOPY VARCHAR2) IS
    l_version1      VARCHAR2(30);
    l_version       VARCHAR2(30);
    l_systime       VARCHAR2(10);
    l_trace_date    DATE;
    l_version_exist VARCHAR(1) := 'N';
    l_version_rec   hcm_demand_version%ROWTYPE;
  BEGIN
  
    --先从临时表里面取
    BEGIN
      SELECT temp.version, temp.version_id
        INTO x_msg_data, x_version_id
        FROM hcm_demand_version_temp temp
       WHERE temp.prod_model = p_prod_model;
      l_version_exist := 'Y';
    EXCEPTION
      WHEN no_data_found THEN
        l_version_exist := 'N';
    END;
    --临时表里面没有,根据规则生成
    IF l_version_exist = 'N' THEN
      l_systime  := get_ver_ft_time(SYSDATE);
      l_version1 :=  /*trim(p_prod_model) || '_' ||*/
       l_systime;
      BEGIN
        SELECT *
          INTO l_version
          FROM (SELECT hdv.version
                  FROM hcm_demand_version hdv
                 WHERE hdv.product = TRIM(p_prod_model)
                   AND hdv.version LIKE l_version1 || '%'
                 ORDER BY hdv.version DESC) temp
         WHERE rownum = 1;
        x_msg_data := REPLACE(l_version1 || to_char(to_number(substr(l_version,
                                                                     length(l_version) - 1,
                                                                     2)) + 1,
                                                    '00'),
                              ' ',
                              '');
      EXCEPTION
        WHEN no_data_found THEN
          x_msg_data := l_version1 || '00';
      END;
    
      SELECT hcm_demand_version_s.nextval INTO x_version_id FROM dual;
    
      l_version_rec.version_id        := x_version_id;
      l_version_rec.version           := x_msg_data;
      l_version_rec.product           := p_prod_model;
      l_version_rec.lot               := p_lot;
      l_version_rec.creation_date     := SYSDATE;
      l_version_rec.created_by        := g_user_id;
      l_version_rec.last_updated_by   := g_user_id;
      l_version_rec.last_update_date  := SYSDATE;
      l_version_rec.last_update_login := g_user_id;
      l_version_rec.enter_date        := SYSDATE;
    
      INSERT INTO hcm_demand_version VALUES l_version_rec;
      --把生成的版本号插入到临时表
      INSERT INTO hcm_demand_version_temp
      VALUES
        (p_prod_model, x_msg_data, x_version_id);
    
    END IF;
  END get_version;

  /*==========================================================
    HCM-B-P02-05  版本号生成
    参数:  p_prod_model              机型
            p_demand_date             行头或列头 需求时间
            p_trace_num
    返回值:x_msg_data
    Created :  2009-10-09 hand
  ==========================================================*/
  FUNCTION get_remark(p_remark IN VARCHAR2) RETURN VARCHAR2 IS
    l_remark VARCHAR2(500) := NULL;
  BEGIN
    IF p_remark IS NOT NULL THEN
      l_remark := REPLACE(REPLACE(p_remark, '@', ','), '|', chr(10));
    END IF;
    RETURN l_remark;
  END get_remark;

  /*==========================================================
    HCM-B-P02-05  FCST 导入
    参数:  p_customer              客户
    返回值:x_msg_data
            客户名称                系统中不存在 该客户
            NULL                     存在 该客户
    Created :  2009-10-09 hand
  ==========================================================*/
  /* PROCEDURE check_fcst_imp(p_customer IN VARCHAR2, x_msg_data OUT NOCOPY VARCHAR2) IS
    l_count NUMBER := 0;
  BEGIN
    SELECT COUNT(1) INTO l_count FROM hcm_customer_v hcv WHERE hcv.customer_alias = p_customer;
    IF l_count > 0 THEN
      x_msg_data := NULL;
    ELSE
      x_msg_data := p_customer;
    END IF;
  END check_fcst_imp;*/

  PROCEDURE append_clob(p_batch_id IN NUMBER, p_clob CLOB) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    l_clob_new    CLOB;
    l_clob_old    CLOB;
    l_exists_flag VARCHAR2(1);
    l_new_line    VARCHAR2(30) := chr(13) || chr(10);
  BEGIN
    BEGIN
      SELECT hict.text, 'Y'
        INTO l_clob_old, l_exists_flag
        FROM hcm_imp_clob_temp hict
       WHERE hict.batch_id = p_batch_id;
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  
    IF l_exists_flag = 'Y' THEN
      dbms_lob.createtemporary(lob_loc => l_clob_new, cache => TRUE);
      dbms_lob.writeappend(lob_loc => l_clob_new,
                           amount  => length(l_clob_old),
                           buffer  => l_clob_old);
      dbms_lob.writeappend(lob_loc => l_clob_new,
                           amount  => lengthb(l_new_line),
                           buffer  => l_new_line);
      dbms_lob.writeappend(lob_loc => l_clob_new,
                           amount  => length(p_clob),
                           buffer  => p_clob);
    
      UPDATE hcm_imp_clob_temp hict
         SET hict.text = l_clob_new
       WHERE hict.batch_id = p_batch_id;
    ELSE
      INSERT INTO hcm_imp_clob_temp
        (batch_id, text)
      VALUES
        (p_batch_id, p_clob);
    END IF;
  
    COMMIT;
  END append_clob;

  FUNCTION get_clob(p_batch_id IN NUMBER) RETURN CLOB IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    l_clob CLOB;
  BEGIN
    FOR l_rec IN (SELECT *
                    FROM hcm_imp_clob_temp t
                   WHERE t.batch_id = p_batch_id) LOOP
      l_clob := l_clob || l_rec.text;
    END LOOP;
    DELETE FROM hcm_imp_clob_temp t WHERE t.batch_id = p_batch_id;
    COMMIT;
    RETURN l_clob;
  END get_clob;

  /*==========================================================
    HCM-B-P02-05  FCST需求导入
    参数:  p_in_parameter            格式如:'机型,时间,客户,数量,备注\n时间2.......'‘
            p_demand_date             题头导入时间  '2009W31_FCST'
            p_user_id                 用户ID
    返回值:
            0                         客戶..............
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
            5                         样机信息..........
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION fcst_imp_for_ui(p_in_parameter IN CLOB,
                           p_user_id      IN VARCHAR2,
                           p_demand_date  IN VARCHAR2,
                           p_batch_id     IN VARCHAR2 DEFAULT NULL,
                           p_last_flag    IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_record_count  NUMBER;
    l_user_id       NUMBER;
    l_prod_model    VARCHAR2(50);
    l_customer      VARCHAR2(50);
    l_qty           NUMBER;
    l_demand_qty    NUMBER;
    l_imp_date      VARCHAR2(20);
    l_remark        VARCHAR2(500);
    l_version       VARCHAR2(30) := NULL;
    l_msg_return    VARCHAR2(4000);
    l_msg_compt     VARCHAR2(4000);
    l_version_rec   hcm_demand_version%ROWTYPE;
    l_history_rec   hcm_demand_info_history%ROWTYPE;
    l_item_id       NUMBER;
    l_imp_time      DATE; --列头时间 时间格式
    l_trace_num     VARCHAR2(20);
    l_customer_id   NUMBER;
    l_trace_id      NUMBER;
    l_version_id    NUMBER;
    l_model_code    VARCHAR2(50);
    l_buyer         VARCHAR2(240);
    l_demand_date   DATE; --用于hcm_demand_info_history插入离厂时间
    l_trace_date    VARCHAR2(20); --题头p_demand_date截取'_'字符之前的字符串
    l_pos           NUMBER;
    l_week_end_date DATE; --传出周数结束日期
    l_in_parameter  CLOB;
    l_j_date        NUMBER; --ETD减去对应的天数,飞利浦客户-3,其它还是减8
    p_phantom_item_type VARCHAR2(50);
  
    CURSOR cur_demand_item(p_item_id NUMBER) IS
      SELECT comp.component_item_id item_id,
             comp.component_quantity,
             'Y' comps_flag,
             hmi.product_model
        FROM hcm_bom_component_v comp, hcm_bom bom, hcm_main_item_v hmi
       WHERE comp.bom_id = bom.bom_id
         AND hmi.item_id = bom.assembly_item_id
         AND bom.assembly_item_id = p_item_id
         AND bom.plant_id = hmi.attribute8 --物料的生产工厂
         AND hmi.item_type = p_phantom_item_type
      UNION ALL
      SELECT hmi.item_id item_id,
             0 component_quantity,
             'N' comps_flag,
             hmi.product_model
        FROM hcm_main_item_v hmi
       WHERE hmi.item_id = p_item_id
         AND hmi.item_type <> p_phantom_item_type;
  
  BEGIN
    /*    IF p_last_flag = 'Y' THEN
      append_clob(p_batch_id => p_batch_id,p_clob => p_in_parameter);
      l_in_parameter := get_clob(p_batch_id => p_batch_id);
    ELSE
      append_clob(p_batch_id => p_batch_id,p_clob => p_in_parameter);
      RETURN 'S@';
    END IF;*/
  
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    l_user_id      := to_number(p_user_id);
    l_pos          := instr(p_demand_date, '_');
    g_user_id      := l_user_id;
    IF l_pos > 0 THEN
      l_trace_date := substr(p_demand_date, 1, l_pos - 1);
    END IF;
  
    p_phantom_item_type := hcm_profile.value('PHANTOM_ITEM_TYPE');

    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_prod_model := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_customer   := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_buyer      := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_model_code := hcm_demand_pck.g_in_parameter_table(i) (4);
      l_imp_date   := hcm_demand_pck.g_in_parameter_table(i) (5);
      l_demand_qty := to_number(hcm_demand_pck.g_in_parameter_table(i) (6));
      l_remark     := hcm_demand_pck.g_in_parameter_table(i) (7);
    
      l_customer_id := NULL;
      l_trace_id    := NULL;
      l_trace_num   := NULL;
      l_imp_time    := NULL;
      IF upper(l_customer) = 'PHILIPS' THEN
        l_j_date := 3;
      ELSE
        l_j_date := 8;
      END IF;
      IF l_demand_qty IS NOT NULL THEN
      
        get_latest_item(p_prod_model  => l_prod_model,
                        p_demand_date => l_imp_date,
                        x_msg_data    => l_item_id,
                        x_msg_date    => l_imp_time,
                        x_msg_date2   => l_week_end_date);
      
        FOR lr_demand_item IN cur_demand_item(l_item_id) LOOP
        
          l_trace_num := NULL;
        
          l_item_id := lr_demand_item.item_id;
          IF lr_demand_item.comps_flag = 'Y' THEN
            l_qty        := lr_demand_item.component_quantity *
                            l_demand_qty;
            l_prod_model := lr_demand_item.product_model;
          ELSE
            l_qty := l_demand_qty;
          END IF;
        
          IF l_version IS NULL THEN
            get_version(p_prod_model => l_prod_model,
                        p_lot        => p_demand_date,
                        x_version_id => l_version_id,
                        x_msg_data   => l_version);
          
          END IF;
        
          IF l_version IS NOT NULL THEN
            --往hcm_demand_version中插入一条记录
            /* get_latest_item(p_prod_model  => l_prod_model,
            p_demand_date => l_imp_date,
            x_msg_data    => l_item_id,
            x_msg_date    => l_imp_time,
            x_msg_date2   => l_week_end_date);*/
            IF l_item_id IS NOT NULL THEN
              get_trace_num(p_user_id       => l_user_id,
                            p_customer      => l_customer,
                            p_demand_type   => 'FCST',
                            p_item_id       => l_item_id,
                            p_demand_time   => l_imp_time,
                            p_week_end_time => l_week_end_date,
                            p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                            p_demand_date2  => l_imp_date,
                            p_buyer         => l_buyer,
                            x_trace_num     => l_trace_num,
                            x_customer_id   => l_customer_id,
                            x_trace_id      => l_trace_id,
                            x_demand_date   => l_demand_date);
              SELECT hcm_demand_info_history_s.nextval
                INTO l_history_rec.history_id
                FROM dual;
              l_history_rec.item_id     := l_item_id;
              l_history_rec.customer_id := l_customer_id;
              l_history_rec.trace_id    := l_trace_id;
              l_history_rec.demand_type := 'FCST';
            
              l_history_rec.shipping_date     := l_imp_time - 8 /*7*/
               ; ---导入的需求日期减去一周,为与HJIT日历保持一致,减去8天
              l_history_rec.demand_qty        := l_qty;
              l_history_rec.shipping_qty      := l_qty;
              l_history_rec.version_id        := l_version_id;
              l_history_rec.remark            := get_remark(l_remark);
              l_history_rec.attribute1        := l_model_code;
              l_history_rec.attribute2        := l_buyer;
              l_history_rec.attribute3        := NULL;
              l_history_rec.attribute4        := NULL;
              l_history_rec.attribute5        := NULL;
              l_history_rec.attribute6        := NULL;
              l_history_rec.attribute7        := NULL;
              l_history_rec.attribute8        := NULL;
              l_history_rec.attribute9        := NULL;
              l_history_rec.attribute10       := NULL;
              l_history_rec.creation_date     := SYSDATE;
              l_history_rec.created_by        := l_user_id;
              l_history_rec.last_updated_by   := l_user_id;
              l_history_rec.last_update_date  := SYSDATE;
              l_history_rec.last_update_login := l_user_id;
              INSERT INTO hcm_demand_info_history VALUES l_history_rec;
            
            ELSE
              ROLLBACK;
              --没有对应的物料#!
              hcm_api.set_message(p_app_name => 'HCM',
                                  p_msg_name => 'HCM_DI_ITEM_IS_NULL');
              l_msg_compt := l_msg_compt || hcm_api.get_message(-1) || '#';
            END IF;
          ELSE
            --无法生成版本号#!
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
            l_msg_compt := l_msg_compt || hcm_api.get_message(-1) || '#';
          END IF;
        END LOOP;
      
        IF l_msg_compt IS NOT NULL THEN
          l_msg_return := l_msg_return || '|E@' || l_msg_compt;
        ELSE
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_COMMON_SUCCESS');
          l_msg_return := l_msg_return || '|S@' || hcm_api.get_message(-1) || '#';
        END IF;
      
      ELSE
        --无数量!
        hcm_api.set_message(p_app_name => 'HCM',
                            p_msg_name => 'HCM_DI_QTY_IS_NULL');
        l_msg_return := l_msg_return || '|S@' || hcm_api.get_message(-1) || '#';
      END IF;
    END LOOP;
    RETURN TRIM('#' FROM l_msg_return);
  END fcst_imp_for_ui;

  /*==========================================================
    HCM-B-P02-05  ODF需求导入
    参数:  p_in_parameter            格式如:'机型,时间,数量\n时间2.......'‘
            p_demand_date             题头导入时间
            p_user_id                 用户ID
    返回值:
            0                         客戶.............
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
            5                         样机信息..........
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION odf_imp_for_ui(p_in_parameter IN CLOB,
                          p_user_id      IN VARCHAR2,
                          p_demand_date  IN VARCHAR2,
                          p_batch_id     IN VARCHAR2 DEFAULT NULL,
                          p_last_flag    IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_record_count      NUMBER;
    l_user_id           NUMBER;
    l_prod_model        VARCHAR2(50);
    l_customer          VARCHAR2(50);
    l_qty               NUMBER;
    l_imp_date          VARCHAR2(20);
    l_remark            VARCHAR2(500); --备注  【注意:备注信息中的逗号要做替换】
    l_version           VARCHAR2(30);
    l_msg_return        VARCHAR2(4000);
    l_version_rec       hcm_demand_version%ROWTYPE;
    l_history_rec       hcm_demand_info_history%ROWTYPE;
    l_history_comps_rec hcm_demand_info_history%ROWTYPE;
    l_history_stock_rec hcm_demand_info_history%ROWTYPE;
    l_history_model_rec hcm_demand_info_history%ROWTYPE;
    l_item_id           NUMBER;
    l_imp_time          DATE; --列头时间 时间格式
    l_trace_num         VARCHAR2(20);
    l_customer_id       NUMBER;
    l_trace_id          NUMBER;
    l_version_id        NUMBER;
    l_model_code        VARCHAR2(50);
    l_buyer             VARCHAR2(240);
    l_item_code         VARCHAR2(50); --BOM NO.
    l_dest_pos          VARCHAR2(100); --目的地
    l_left_time         VARCHAR2(20); --离厂时间
    l_stock_info_all    VARCHAR2(200); --备件信息  eg:  物料*数量;物料*数量
    l_stock_info        VARCHAR2(100); -- 拆开后的每个备件信息  eg 物料*数量
    l_model_info        VARCHAR2(200); --样机信息
    l_demand_date       DATE; --用于FCST hcm_demand_info_history插入离厂时间
    l_trace_date        VARCHAR2(20); --题头p_demand_date截取'_'字符之前的字符串
    l_pos               NUMBER;
    l_week_end_date     DATE; --传出周数结束日期
    l_stock_num         VARCHAR2(100);
    l_stock_id          NUMBER;
    l_stock_qty         NUMBER;
  
    l_stock_trace_num     VARCHAR2(20);
    l_stock_trace_id      NUMBER;
    l_stock_version       VARCHAR2(100);
    l_model_trace_id      NUMBER;
    l_model_trace_num     VARCHAR2(20);
    l_item_type           VARCHAR2(20);
    l_plant_id            NUMBER;
    l_comps_code          VARCHAR2(40);
    l_comps_product_model VARCHAR2(40);
    l_comps_trace_num     VARCHAR2(20);
    l_comps_trace_id      NUMBER;
    l_in_parameter        CLOB;
  
  BEGIN
    IF p_last_flag = 'Y' THEN
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      l_in_parameter := get_clob(p_batch_id => p_batch_id);
    ELSE
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      RETURN 'S@';
    END IF;
  
    split_parameter(p_in_parameter => l_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    --dbms_output.put_line('l_record_count:'||l_record_count);
    l_user_id := to_number(p_user_id);
    l_pos     := instr(p_demand_date, '_');
    g_user_id := l_user_id;
    IF l_pos > 0 THEN
      l_trace_date := substr(p_demand_date, 1, l_pos - 1);
    END IF;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_trace_num  := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_prod_model := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_customer   := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_qty        := to_number(hcm_demand_pck.g_in_parameter_table(i) (4));
      --dbms_output.put_line('l_qty:'||l_qty);
      l_imp_date       := hcm_demand_pck.g_in_parameter_table(i) (5);
      l_model_code     := hcm_demand_pck.g_in_parameter_table(i) (6);
      l_buyer          := hcm_demand_pck.g_in_parameter_table(i) (7);
      l_item_code      := hcm_demand_pck.g_in_parameter_table(i) (8);
      l_dest_pos       := hcm_demand_pck.g_in_parameter_table(i) (9);
      l_left_time      := hcm_demand_pck.g_in_parameter_table(i) (10);
      l_stock_info_all := hcm_demand_pck.g_in_parameter_table(i) (11);
      l_model_info     := hcm_demand_pck.g_in_parameter_table(i) (12);
      l_remark         := hcm_demand_pck.g_in_parameter_table(i) (13);
    
      l_customer_id := NULL;
      l_trace_id    := NULL;
      --l_trace_num   := NULL; Comment by hand
      l_imp_time := NULL;
      l_item_id  := NULL;
    
      l_stock_info_all := TRIM(REPLACE(REPLACE(TRIM(l_stock_info_all),
                                               chr(13)),
                                       chr(10)));
    
      ------------------------------------
      -- 实际需求数量 =   需求数量 - 样机
      l_qty := l_qty - nvl(to_number(l_model_info), 0);
    
      get_version(p_prod_model => l_prod_model,
                  p_lot        => p_demand_date,
                  x_version_id => l_version_id,
                  x_msg_data   => l_version);
    
      IF l_version IS NOT NULL THEN
        get_latest_item(p_prod_model  => l_prod_model,
                        p_demand_date => l_imp_date,
                        x_msg_data    => l_item_id,
                        x_msg_date    => l_imp_time,
                        x_msg_date2   => l_week_end_date);
        IF l_item_id IS NOT NULL THEN
        
          SELECT i.item_type, i.attribute8
            INTO l_item_type, l_plant_id
            FROM hcm_main_item_v i
           WHERE i.item_id = l_item_id;
        
          get_trace_num(p_user_id       => l_user_id,
                        p_customer      => l_customer,
                        p_demand_type   => 'ORDER',
                        p_item_id       => l_item_id,
                        p_demand_time   => l_imp_time,
                        p_week_end_time => l_week_end_date,
                        p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                        p_demand_date2  => l_imp_date,
                        p_buyer         => l_buyer,
                        x_trace_num     => l_trace_num,
                        x_customer_id   => l_customer_id,
                        x_trace_id      => l_trace_id,
                        x_demand_date   => l_demand_date);
          SELECT hcm_demand_info_history_s.nextval
            INTO l_history_rec.history_id
            FROM dual;
          l_history_rec.item_id           := l_item_id;
          l_history_rec.customer_id       := l_customer_id;
          l_history_rec.trace_id          := l_trace_id;
          l_history_rec.demand_type       := 'ORDER';
          l_history_rec.shipping_date     := to_date(l_left_time,
                                                     'yyyy-mm-dd hh24:mi:ss');
          l_history_rec.demand_qty        := l_qty;
          l_history_rec.shipping_qty      := l_qty;
          l_history_rec.version_id        := l_version_id;
          l_history_rec.remark            := get_remark(l_remark);
          l_history_rec.attribute1        := l_model_code;
          l_history_rec.attribute2        := l_buyer;
          l_history_rec.attribute3        := l_dest_pos;
          l_history_rec.attribute4        := NULL;
          l_history_rec.attribute5        := l_stock_info_all;
          l_history_rec.attribute6        := l_model_info;
          l_history_rec.attribute7        := NULL;
          l_history_rec.attribute8        := NULL;
          l_history_rec.attribute9        := NULL;
          l_history_rec.attribute10       := NULL;
          l_history_rec.creation_date     := SYSDATE;
          l_history_rec.created_by        := l_user_id;
          l_history_rec.last_updated_by   := l_user_id;
          l_history_rec.last_update_date  := SYSDATE;
          l_history_rec.last_update_login := l_user_id;
          INSERT INTO hcm_demand_info_history VALUES l_history_rec;
        
          ---------------------------
          --样机和备件
          l_history_model_rec := l_history_rec;
          l_history_stock_rec := l_history_rec;
        
          ---------------------------
          --备件
          WHILE l_stock_info_all IS NOT NULL LOOP
          
            l_pos := instr(l_stock_info_all, '|');
            IF l_pos > 0 THEN
              l_stock_info     := substr(l_stock_info_all, 1, l_pos - 1);
              l_stock_info_all := substr(l_stock_info_all,
                                         l_pos + length('|'));
            ELSE
              l_stock_info     := l_stock_info_all;
              l_stock_info_all := NULL;
            END IF;
          
            --备件
            l_stock_num := TRIM(substr(l_stock_info,
                                       1,
                                       instr(l_stock_info, '*') - 1));
            --备件数量
            l_stock_qty := to_number(TRIM(substr(l_stock_info,
                                                 instr(l_stock_info, '*') + 1)));
            IF l_stock_num IS NOT NULL THEN
            
              get_version(p_prod_model => l_stock_num,
                          p_lot        => p_demand_date,
                          x_version_id => l_version_rec.version_id,
                          x_msg_data   => l_stock_version);
            
              SELECT hai.item_id
                INTO l_stock_id
                FROM hcm_main_item_v hai
               WHERE hai.item_code = l_stock_num
                 AND hai.enable_flag = 'Y';
            
              --初始下
              l_stock_trace_num := NULL;
              get_trace_num(p_user_id       => l_user_id,
                            p_customer      => l_customer,
                            p_demand_type   => 'ORDER',
                            p_item_id       => l_stock_id,
                            p_demand_time   => l_imp_time,
                            p_week_end_time => l_week_end_date,
                            p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                            p_demand_date2  => l_imp_date,
                            p_buyer         => l_buyer,
                            p_attribute2    => 'SPARE',
                            x_trace_num     => l_stock_trace_num,
                            x_customer_id   => l_customer_id,
                            x_trace_id      => l_stock_trace_id,
                            x_demand_date   => l_demand_date);
              UPDATE hcm_demand_trace_num dtn
                 SET dtn.trace_num      = l_trace_num,
                     reference_trace_id = l_trace_id,
                     attribute2         = 'SPARE',
                     dtn.attribute10    = 'new2'
               WHERE dtn.trace_id = l_stock_trace_id;
            
              SELECT hcm_demand_info_history_s.nextval
                INTO l_history_stock_rec.history_id
                FROM dual;
              l_history_stock_rec.item_id      := l_stock_id;
              l_history_stock_rec.demand_qty   := l_stock_qty;
              l_history_stock_rec.shipping_qty := l_stock_qty;
              l_history_stock_rec.remark       := l_trace_id;
              l_history_stock_rec.version_id   := l_version_rec.version_id;
              l_history_stock_rec.trace_id     := l_stock_trace_id;
            
              l_history_stock_rec.remark     := NULL;
              l_history_stock_rec.attribute5 := NULL;
              l_history_stock_rec.attribute6 := NULL;
            
              INSERT INTO hcm_demand_info_history
              VALUES l_history_stock_rec;
            END IF;
          END LOOP;
        
          ---------------------------
          --样机
          IF l_model_info IS NOT NULL THEN
          
            --初始下
            l_model_trace_num := NULL;
            get_trace_num(p_user_id       => l_user_id,
                          p_customer      => l_customer,
                          p_demand_type   => 'ORDER',
                          p_item_id       => l_item_id,
                          p_demand_time   => l_imp_time,
                          p_week_end_time => l_week_end_date,
                          p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                          p_demand_date2  => l_imp_date,
                          p_buyer         => l_buyer,
                          p_attribute2    => 'SAMPLE',
                          x_trace_num     => l_model_trace_num,
                          x_customer_id   => l_customer_id,
                          x_trace_id      => l_model_trace_id,
                          x_demand_date   => l_demand_date);
          
            SELECT hcm_demand_info_history_s.nextval
              INTO l_history_model_rec.history_id
              FROM dual;
            l_history_model_rec.demand_qty   := to_number(l_model_info);
            l_history_model_rec.shipping_qty := 0;
            l_history_model_rec.version_id   := l_version_id;
            l_history_model_rec.trace_id     := l_model_trace_id;
            l_history_model_rec.remark       := NULL;
            l_history_model_rec.attribute5   := NULL;
            l_history_model_rec.attribute6   := NULL;
          
            INSERT INTO hcm_demand_info_history VALUES l_history_model_rec;
          
            UPDATE hcm_demand_trace_num dtn
               SET dtn.trace_num      = l_trace_num,
                   reference_trace_id = l_trace_id,
                   attribute2         = 'SAMPLE',
                   dtn.attribute10    = 'new3'
             WHERE dtn.trace_id = l_model_trace_id;
          
          END IF;
        
          ---------------------------
          --如果是虚拟件,导入组件需求
          /*
          IF l_item_type = 'PH' THEN
          
            FOR l_comps IN (SELECT comp.component_item_id, comp.component_quantity
                              FROM hcm_bom_component comp, hcm_bom bom
                             WHERE comp.bom_id = bom.bom_id
                               AND bom.assembly_item_id = l_item_id
                               AND bom.alternate IS NULL
                               AND bom.plant_id = l_plant_id) LOOP
          
              --取机型和组件code
              SELECT nvl(hmi.product_model, hmi.item_code), hmi.item_code
                INTO l_comps_product_model, l_comps_code
                FROM hcm_main_item_v hmi
               WHERE hmi.item_id = l_comps.component_item_id;
          
              get_version(p_prod_model => l_comps_product_model, p_trace_num => NULL, x_msg_data => l_version);
          
              IF l_version IS NOT NULL THEN
                --往hcm_demand_version中插入一条记录
                SELECT hcm_demand_version_s.nextval INTO l_version_id FROM dual;
                l_version_rec.version_id        := l_version_id;
                l_version_rec.version           := l_version;
                l_version_rec.lot               := p_demand_date;
                l_version_rec.product           := l_comps_product_model;
                l_version_rec.creation_date     := SYSDATE;
                l_version_rec.created_by        := l_user_id;
                l_version_rec.last_updated_by   := l_user_id;
                l_version_rec.last_update_date  := SYSDATE;
                l_version_rec.last_update_login := l_user_id;
                l_version_rec.enter_date        := SYSDATE;
                INSERT INTO hcm_demand_version VALUES l_version_rec;
          
                IF l_item_id IS NOT NULL THEN
          
                  get_trace_num(p_user_id       => l_user_id,
                                p_customer      => l_customer,
                                p_demand_type   => 'ORDER',
                                p_item_id       => l_comps.component_item_id,
                                p_demand_time   => l_imp_time,
                                p_week_end_time => l_week_end_date,
                                p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                                p_demand_date2  => l_imp_date,
                                p_buyer         => NULL,
                                x_trace_num     => l_comps_trace_num,
                                x_customer_id   => l_customer_id,
                                x_trace_id      => l_comps_trace_id,
                                x_demand_date   => l_demand_date);
          
                  SELECT hcm_demand_info_history_s.nextval INTO l_history_rec.history_id FROM dual;
                  l_history_rec.item_id       := l_comps.component_item_id;
                  l_history_rec.customer_id   := l_customer_id;
                  l_history_rec.trace_id      := l_comps_trace_id;
                  l_history_rec.demand_type   := 'ORDER';
                  l_history_rec.shipping_date := to_date(l_left_time, 'yyyy-mm-dd');
                  l_history_rec.demand_qty    := l_qty * l_comps.component_quantity;
                  l_history_rec.shipping_qty  := l_qty * l_comps.component_quantity;
                  l_history_rec.version_id    := l_version_id;
                  l_history_rec.remark        := get_remark(l_remark);
                  -- l_history_rec.attribute1        := l_model_code;
                  -- l_history_rec.attribute2        := l_buyer;
                  -- l_history_rec.attribute3        := l_dest_pos;
                  l_history_rec.attribute4 := NULL;
                  -- l_history_rec.attribute5        := l_stock_info;
                  --l_history_rec.attribute6        := l_model_info;
                  l_history_rec.attribute7        := NULL;
                  l_history_rec.attribute8        := NULL;
                  l_history_rec.attribute9        := NULL;
                  l_history_rec.attribute10       := NULL;
                  l_history_rec.creation_date     := SYSDATE;
                  l_history_rec.created_by        := l_user_id;
                  l_history_rec.last_updated_by   := l_user_id;
                  l_history_rec.last_update_date  := SYSDATE;
                  l_history_rec.last_update_login := l_user_id;
                  INSERT INTO hcm_demand_info_history VALUES l_history_rec;
                END IF;
              END IF;
            END LOOP;
          
          END IF;*/
          --PH
        
          --  COMMIT;
          IF l_msg_return IS NULL THEN
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          ELSE
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          END IF;
        
        ELSE
          ROLLBACK;
          IF l_msg_return IS NULL THEN
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          
          ELSE
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          END IF;
        END IF;
      ELSE
        IF l_msg_return IS NULL THEN
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        ELSE
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        END IF;
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END odf_imp_for_ui;
  /*==========================================================
    HCM-B-P02-05  SP需求导入
    参数:  p_in_parameter            格式如:'机型,时间,数量\n时间2.......'‘
            p_demand_date             题头导入时间
            p_user_id                 用户ID
    返回值:
            0                         客戶.............
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
            5                         样机信息..........
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION sp_imp_for_ui(p_in_parameter IN CLOB,
                         p_user_id      IN VARCHAR2,
                         p_demand_date  IN VARCHAR2,
                         p_batch_id     IN VARCHAR2 DEFAULT NULL,
                         p_last_flag    IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_record_count   NUMBER;
    l_user_id        NUMBER;
    l_prod_model     VARCHAR2(50); --机型
    l_customer       VARCHAR2(50); --客户
    l_qty            NUMBER; --走货数量
    l_imp_date       VARCHAR2(20); --导入行头时间  【暂时无】
    l_version        VARCHAR2(30);
    l_msg_return     VARCHAR2(4000);
    l_version_rec    hcm_demand_version%ROWTYPE;
    l_history_rec    hcm_demand_info_history%ROWTYPE;
    l_item_id        NUMBER;
    l_imp_time       DATE; --列头时间 时间格式 通过函数进行转换后的值
    l_customer_id    NUMBER;
    l_trace_id       NUMBER;
    l_version_id     NUMBER;
    l_dest_pos       VARCHAR2(100); --目的地
    l_left_time      VARCHAR2(20); --离厂时间
    l_arear          VARCHAR2(20); --地区
    l_dest_port      VARCHAR2(50); --目的港
    l_custom_order   VARCHAR2(50); --客户订单号
    l_trace_num      VARCHAR2(50); --追踪号
    l_container_num  VARCHAR2(50); --货柜号
    l_container_size VARCHAR2(50); --货柜尺寸
    l_shipmode       VARCHAR2(50); --发运方式
    l_remark         VARCHAR2(500); --备注
    l_demand_date    DATE; --用于FCST hcm_demand_info_history插入离厂时间
    l_trace_date     VARCHAR2(20); --题头p_demand_date截取'_'字符之前的字符串
    l_pos            NUMBER;
    l_week_end_date  DATE; --传出周数结束日期
    l_in_parameter   CLOB;
  BEGIN
    IF p_last_flag = 'Y' THEN
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      l_in_parameter := get_clob(p_batch_id => p_batch_id);
    ELSE
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      RETURN 'S@';
    END IF;
  
    split_parameter(p_in_parameter => l_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
    l_user_id      := to_number(p_user_id);
    l_pos          := instr(p_demand_date, '_');
    g_user_id      := l_user_id;
    IF l_pos > 0 THEN
      l_trace_date := substr(p_demand_date, 1, l_pos - 1);
    END IF;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_prod_model     := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_customer       := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_qty            := to_number(hcm_demand_pck.g_in_parameter_table(i) (3));
      l_arear          := hcm_demand_pck.g_in_parameter_table(i) (4);
      l_dest_port      := hcm_demand_pck.g_in_parameter_table(i) (5);
      l_dest_pos       := hcm_demand_pck.g_in_parameter_table(i) (6);
      l_custom_order   := hcm_demand_pck.g_in_parameter_table(i) (7);
      l_trace_num      := hcm_demand_pck.g_in_parameter_table(i) (8);
      l_left_time      := hcm_demand_pck.g_in_parameter_table(i) (9);
      l_container_num  := hcm_demand_pck.g_in_parameter_table(i) (10);
      l_container_size := hcm_demand_pck.g_in_parameter_table(i) (11);
      l_shipmode       := hcm_demand_pck.g_in_parameter_table(i) (12);
      l_remark         := hcm_demand_pck.g_in_parameter_table(i) (13);
    
      l_customer_id := NULL;
      l_trace_id    := NULL;
      l_imp_time    := NULL;
      l_item_id     := NULL;
    
      --get_version(p_prod_model => l_prod_model, p_trace_num => NULL, x_msg_data => l_version);
    
      get_version(p_prod_model => l_prod_model,
                  p_lot        => p_demand_date,
                  x_version_id => l_version_id,
                  x_msg_data   => l_version);
    
      IF l_version IS NOT NULL THEN
      
        SELECT hdtn.item_id
          INTO l_item_id
          FROM hcm_demand_trace_num hdtn
         WHERE hdtn.trace_num = l_trace_num
           AND hdtn.attribute2 IS NULL; --限定只选择主需求
      
        IF l_item_id IS NOT NULL THEN
          get_trace_num(p_user_id       => l_user_id,
                        p_customer      => l_customer,
                        p_demand_type   => 'SHIPPING',
                        p_item_id       => l_item_id,
                        p_demand_time   => NULL,
                        p_week_end_time => NULL,
                        p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                        p_demand_date2  => NULL,
                        x_trace_num     => l_trace_num,
                        x_customer_id   => l_customer_id,
                        x_trace_id      => l_trace_id,
                        x_demand_date   => l_demand_date);
          SELECT hcm_demand_info_history_s.nextval
            INTO l_history_rec.history_id
            FROM dual;
          l_history_rec.item_id           := l_item_id;
          l_history_rec.customer_id       := l_customer_id;
          l_history_rec.trace_id          := l_trace_id;
          l_history_rec.demand_type       := 'SHIPPING';
          l_history_rec.shipping_date     := to_date(l_left_time,
                                                     'yyyy-mm-dd');
          l_history_rec.demand_qty        := l_qty;
          l_history_rec.shipping_qty      := l_qty;
          l_history_rec.version_id        := l_version_id;
          l_history_rec.remark            := get_remark(l_remark);
          l_history_rec.attribute1        := l_dest_pos;
          l_history_rec.attribute2        := l_container_num;
          l_history_rec.attribute3        := l_shipmode;
          l_history_rec.attribute4        := l_custom_order;
          l_history_rec.attribute5        := l_arear;
          l_history_rec.attribute6        := l_dest_port;
          l_history_rec.attribute7        := l_container_size;
          l_history_rec.attribute8        := NULL;
          l_history_rec.attribute9        := NULL;
          l_history_rec.attribute10       := NULL;
          l_history_rec.creation_date     := SYSDATE;
          l_history_rec.created_by        := l_user_id;
          l_history_rec.last_updated_by   := l_user_id;
          l_history_rec.last_update_date  := SYSDATE;
          l_history_rec.last_update_login := l_user_id;
          INSERT INTO hcm_demand_info_history VALUES l_history_rec;
          -- COMMIT;
          IF l_msg_return IS NULL THEN
          
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          ELSE
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          END IF;
        ELSE
          ROLLBACK;
          IF l_msg_return IS NULL THEN
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          ELSE
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          END IF;
        END IF;
      ELSE
        IF l_msg_return IS NULL THEN
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        ELSE
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        END IF;
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END sp_imp_for_ui;
  /*==========================================================
    HCM-B-P02-05  ODF需求导入
    参数:  p_in_parameter            格式如:'机型,时间,数量\n时间2.......'‘
            p_demand_date             题头导入时间
            p_user_id                 用户ID
    返回值:
            0                         客戶.............
            1                         机型 不存在或.....
            2                         追踪号............
            3                         BOM NO............
            4                         备件信息..........
            5                         样机信息..........
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION proj_imp_for_ui(p_in_parameter IN CLOB,
                           p_user_id      IN VARCHAR2,
                           p_demand_date  IN VARCHAR2,
                           p_batch_id     IN VARCHAR2 DEFAULT NULL,
                           p_last_flag    IN VARCHAR2 DEFAULT NULL)
    RETURN VARCHAR2 IS
    l_record_count  NUMBER;
    l_user_id       NUMBER;
    l_item_code     VARCHAR2(50);
    l_qty           NUMBER;
    l_imp_date      VARCHAR2(20); --试产日期
    l_remark        VARCHAR2(500);
    l_version       VARCHAR2(30);
    l_msg_return    VARCHAR2(4000);
    l_version_rec   hcm_demand_version%ROWTYPE;
    l_history_rec   hcm_demand_info_history%ROWTYPE;
    l_item_id       NUMBER;
    l_customer_id   NUMBER;
    l_imp_time      DATE; --列头时间 时间格式
    l_trace_num     VARCHAR2(20);
    l_trace_id      NUMBER;
    l_version_id    NUMBER;
    l_exp_site      VARCHAR2(50);
    l_proj_phase    VARCHAR2(50);
    l_prod_model    VARCHAR2(50); --机型
    l_demand_date   DATE; --用于FCST hcm_demand_info_history插入离厂时间
    l_trace_date    VARCHAR2(20); --题头p_demand_date截取'_'字符之前的字符串
    l_pos           NUMBER;
    l_week_end_date DATE; --传出周数结束日期
    l_in_parameter  CLOB;
  
  BEGIN
    IF p_last_flag = 'Y' THEN
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      l_in_parameter := get_clob(p_batch_id => p_batch_id);
    ELSE
      append_clob(p_batch_id => p_batch_id, p_clob => p_in_parameter);
      RETURN 'S@';
    END IF;
  
    --p_in_parameter := '';
    split_parameter(p_in_parameter => l_in_parameter);
    /*split_parameter(p_in_parameter => ',93G3235BB-BR41C,GTR,2009-12-20,工程部,90,08-VP3254-SWY|08-TDM03I-D01|46-40270C-24X|46-FF010T-06P|以上物料不用采购,用PGH606批次做的物料
    ,93G3235BB-BR41C,GTR,2009-12-21,工程部,94,新增GTR');*/
    l_record_count := hcm_demand_pck.g_in_record_count;
    l_user_id      := to_number(p_user_id);
    g_user_id      := l_user_id;
    -- l_user_id := to_number('-1');
    l_pos := instr(p_demand_date, '_');
    IF l_pos > 0 THEN
      l_trace_date := substr(p_demand_date, 2, l_pos - 2);
    END IF;
    --批处理开始
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_trace_num  := hcm_demand_pck.g_in_parameter_table(i) (1);
      l_item_code  := hcm_demand_pck.g_in_parameter_table(i) (2);
      l_proj_phase := hcm_demand_pck.g_in_parameter_table(i) (3);
      l_imp_date   := hcm_demand_pck.g_in_parameter_table(i) (4);
      l_exp_site   := hcm_demand_pck.g_in_parameter_table(i) (5);
      l_qty        := to_number(hcm_demand_pck.g_in_parameter_table(i) (6));
      l_remark     := hcm_demand_pck.g_in_parameter_table(i) (7);
    
      l_customer_id := NULL;
      /*l_trace_id    := NULL;
      l_trace_num   := NULL;*/
      l_imp_time := NULL;
      l_item_id  := NULL;
    
      SELECT nvl(hiv.product_model, hiv.item_code), hiv.item_id
        INTO l_prod_model, l_item_id
        FROM hcm_main_item_v hiv
       WHERE hiv.item_code = l_item_code
         AND hiv.enable_flag = 'Y'
         AND rownum = 1;
    
      get_version(p_prod_model => l_prod_model,
                  p_lot        => p_demand_date,
                  x_version_id => l_version_id,
                  x_msg_data   => l_version);
    
      IF l_version IS NOT NULL THEN
        get_latest_item(p_prod_model  => l_prod_model,
                        p_demand_date => l_imp_date,
                        x_msg_data    => l_item_id,
                        x_msg_date    => l_imp_time,
                        x_msg_date2   => l_week_end_date);
        IF l_item_id IS NOT NULL THEN
          get_trace_num(p_user_id       => l_user_id,
                        p_customer      => NULL,
                        p_demand_type   => 'PROJECT',
                        p_item_id       => l_item_id,
                        p_demand_time   => l_imp_time,
                        p_week_end_time => l_week_end_date,
                        p_proj_phase    => l_proj_phase,
                        p_demand_date1  => l_trace_date, ---加工以下只取_前面的字符串
                        p_demand_date2  => l_imp_date,
                        x_trace_num     => l_trace_num,
                        x_customer_id   => l_customer_id,
                        x_trace_id      => l_trace_id,
                        x_demand_date   => l_demand_date);
          SELECT hcm_demand_info_history_s.nextval
            INTO l_history_rec.history_id
            FROM dual;
          l_history_rec.item_id           := l_item_id;
          l_history_rec.customer_id       := l_customer_id;
          l_history_rec.trace_id          := l_trace_id;
          l_history_rec.demand_type       := 'PROJECT';
          l_history_rec.shipping_date     := l_imp_time; ---
          l_history_rec.demand_qty        := l_qty;
          l_history_rec.shipping_qty      := l_qty;
          l_history_rec.version_id        := l_version_id;
          l_history_rec.remark            := get_remark(l_remark);
          l_history_rec.attribute1        := l_proj_phase;
          l_history_rec.attribute2        := l_imp_date;
          l_history_rec.attribute3        := l_exp_site;
          l_history_rec.attribute4        := NULL;
          l_history_rec.attribute5        := NULL;
          l_history_rec.attribute6        := NULL;
          l_history_rec.attribute7        := NULL;
          l_history_rec.attribute8        := NULL;
          l_history_rec.attribute9        := NULL;
          l_history_rec.attribute10       := NULL;
          l_history_rec.creation_date     := SYSDATE;
          l_history_rec.created_by        := l_user_id;
          l_history_rec.last_updated_by   := l_user_id;
          l_history_rec.last_update_date  := SYSDATE;
          l_history_rec.last_update_login := l_user_id;
          INSERT INTO hcm_demand_info_history VALUES l_history_rec;
          --COMMIT;
          IF l_msg_return IS NULL THEN
          
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          
          ELSE
          
            --导入成功
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_COMMON_SUCCESS');
            l_msg_return := l_msg_return || '|S@' ||
                            hcm_api.get_message(-1) || '#';
          
          END IF;
        ELSE
          ROLLBACK;
          IF l_msg_return IS NULL THEN
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          ELSE
            --没有对应的物料
            hcm_api.set_message(p_app_name => 'HCM',
                                p_msg_name => 'HCM_DI_ITEM_IS_NULL');
            l_msg_return := l_msg_return || '|E@' ||
                            hcm_api.get_message(-1) || '#';
          END IF;
        END IF;
      ELSE
        IF l_msg_return IS NULL THEN
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        ELSE
          --无法生成版本号#
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_CAN_NOT_RBD_VERS');
          l_msg_return := l_msg_return || '|E@' || hcm_api.get_message(-1) || '#';
        END IF;
      END IF;
    END LOOP;
    RETURN l_msg_return;
  END proj_imp_for_ui;

  /*==========================================================
    HCM-B-P02-05  插临时表
    参数:  p_in_parameter            格式如:'historyid1,batchid\nhistoryid22.......'‘
    返回值:
    Created : 2009-10-09 hand
  ==========================================================*/
  FUNCTION insert_iemp_for_ui(p_in_parameter IN CLOB,
                              p_batch_id     IN VARCHAR2) RETURN VARCHAR2 IS
    l_history_id   NUMBER;
    l_record_count NUMBER;
  BEGIN
    split_parameter(p_in_parameter => p_in_parameter);
    l_record_count := hcm_demand_pck.g_in_record_count;
  
    FOR i IN 1 .. l_record_count LOOP
      --取参数
      l_history_id := hcm_demand_pck.g_in_parameter_table(i) (1);
      BEGIN
        INSERT INTO hcm_demand_temp_publish
          (history_id, batch_id)
        VALUES
          (l_history_id, p_batch_id);
      EXCEPTION
        WHEN OTHERS THEN
          ROLLBACK;
          --插入异常
          hcm_api.set_message(p_app_name => 'HCM',
                              p_msg_name => 'HCM_DI_INSERT_ERROR');
          RETURN '-1@' || hcm_api.get_message(-1);
      END;
    END LOOP;
    COMMIT;
  
    --成功
    hcm_api.set_message(p_app_name => 'HCM',
                        p_msg_name => 'HCM_COMMON_SUCCESS');
    RETURN '0@' || hcm_api.get_message(-1);
  END insert_iemp_for_ui;

END hcm_demand_pck;

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3