B2B平台对接-药师帮

修改表结构,增加字段

首营表:

ALTER TABLE T_CHK_VENDOR ADD ( XYYNO VARCHAR2(100), YSBNO VARCHAR2(100) );

批发申请单主表

ALTER TABLE T_BATSALEAPPLY_H ADD ( djbh VARCHAR2(100), billsource VARCHAR2(100));

批发申请单明细表

ALTER TABLE T_BATSALEAPPLY_H ADD DJ_SN NUMBER;

批发销售单主表

ALTER TABLE T_BATSALE_H ADD ( djbh VARCHAR2(100), billsource VARCHAR2(100), sale_idbs VARCHAR2(100), expresscompany VARCHAR2(100), express_code VARCHAR2(100), express_no VARCHAR2(100), expressno VARCHAR2(100) );

创建药师帮用户

CREATE USER ysbuser IDENTIFIED BY ysbpwd;

建立药师帮视图

–1.库存(库存 栏)取两个字段:H2.CV_YSB_WAREQTY;

create or replace view cv_ysb_wareqty as
select "WARECODE", "WAREQTY", "NEWWHLPRICE"
  from (select c.warecode as warecode,
               sum(a.wareqty - a.awaitqty - a.pendingqty) as wareqty,
               d.setwhlprice1 AS newwhlprice --批发价
          from t_store_d a, t_store_i b, t_ware c
          left join v_ware_whlprice d
            on c.wareid = d.wareid
          left join s_whlprice_group e
            on e.compid = d.compid
           and e.whlgroupid = d.whlgroupid
         where a.compid = '1'
           and a.busno = '1000'
           and a.wareqty - a.awaitqty - a.pendingqty > 0
           and a.wareid = b.wareid
           and a.compid = b.compid
           and a.batid = b.batid
           and a.wareid = c.wareid
           and b.wareid = c.wareid
           and b.compid = c.compid
           and c.status = '1'
           and d.whlgroupid = '12' --价格只取药师帮价格组的
           and b.Ownerid = '01' --只取电商货主的货
        --   and b.flag1 = 0
           /*and not exists
         (select 1
                  from T_QUALITY_CHECK_H qh, t_quality_check_d qd
                 where qd.checkno = qh.checkno
                   and qh.status = 1
                   and qh.compid = a.compid
                   and qh.checktype = 1
                   AND (qh.objbusnos = '全部' OR
                       instr(',' || qh.objbusnos || ',',
                              ',' || to_char(a.busno) || ',') > 0)
                   and qd.wareid = a.wareid
                   and (qd.makeno = '%' OR nvl(qd.makeno, nvl(b.makeno, '%')) =
                       nvl(b.makeno, '%'))
                   AND (nvl(qd.batid, nvl(a.batid, 0)) = nvl(a.batid, 0) or
                       qd.batid = 0))*/
           --  and b.flag1 = 0 --质量复核锁定
         group by c.warecode, d.setwhlprice1
         order by c.warecode) a
 --where a.newwhlprice > 0 --判断批发价大于0;

–2.价格(价格 栏)取三个字段,编码跟单体价为必须值:H2.CV_YSB_WARE_WHLPRICE;

CREATE OR REPLACE VIEW CV_YSB_WARE_WHLPRICE AS
SELECT t_ware_whlprice.compid        AS compid,
       t_ware_whlprice.whlgroupid    AS whlgroupid,
       t_ware_whlprice.wareid        AS wareid,
       t_ware_base.warecode          AS warecode,
       t_ware_base.warename          AS warename,
       t_ware_whlprice.setwhlprice1 AS setwhlprice1111,
       CASE WHEN t_ware_whlprice.setwhlprice1 = 0 THEN  CASE
         WHEN f_get_sys_inicode(t_ware_whlprice.compid, '2795', NULL) = '1' THEN
          t_ware.lastpurprice
         ELSE
          t_ware_whlprice.setwhlprice1
       END * (1 + (CASE
         WHEN f_get_sys_inicode(t_ware_whlprice.compid, '6030', NULL) = '1' THEN
          (CASE
            WHEN nvl(t_ware_whlprice.purtax, 0) = 0 THEN
             nvl(t_ware_whlprice.purtax, 0)
            ELSE
             swg.purtax
          END)
         ELSE
          nvl(t_ware_whlprice.purtax, 0)
       END) / 100) ELSE setwhlprice1 END AS setwhlprice1,
       t_ware_whlprice.setwhlprice2  AS setwhlprice2,
       t_ware_whlprice.setwhlprice3  AS setwhlprice3,
       t_ware_whlprice.setwhlprice4  AS setwhlprice4,
       t_ware_whlprice.setwhlprice5  AS setwhlprice5,
       t_ware_whlprice.leastwhlprice AS leastwhlprice,
       t_ware_whlprice.maxwhlprice   AS maxwhlprice,
       t_ware_whlprice.purtax        AS purtax
  FROM t_ware_whlprice t_ware_whlprice
 INNER JOIN t_ware_base t_ware_base
    ON t_ware_whlprice.wareid = t_ware_base.wareid
 JOIN t_ware t_ware
    ON t_ware.compid=1
    AND t_ware.wareid=t_ware_base.wareid
 LEFT JOIN s_whlprice_group swg
 ON swg.compid = t_ware_whlprice.compid
 AND swg.whlgroupid = t_ware_whlprice.whlgroupid
 WHERE ( CASE WHEN t_ware_whlprice.setwhlprice1 = 0 THEN  CASE
         WHEN f_get_sys_inicode(t_ware_whlprice.compid, '2795', NULL) = '1' THEN
          t_ware.lastpurprice
         ELSE
          t_ware_whlprice.setwhlprice1
       END * (1 + (CASE
         WHEN f_get_sys_inicode(t_ware_whlprice.compid, '6030', NULL) = '1' THEN
          (CASE
            WHEN nvl(t_ware_whlprice.purtax, 0) = 0 THEN
             nvl(t_ware_whlprice.purtax, 0)
            ELSE
             swg.purtax
          END)
         ELSE
          nvl(t_ware_whlprice.purtax, 0)
       END) / 100) ELSE setwhlprice1 END)>0 ---只同步商品有批发价格的
 and t_ware_whlprice.WHLGROUPID in ('12')  ---价格组控制(只同步批发默认价格组价格)
 and t_ware_whlprice.compid = 1
 ORDER BY t_ware_whlprice.compid,
          t_ware_whlprice.wareid,
          t_ware_whlprice.whlgroupid;

–3.(多价格体系 栏)如果需要上传多个价格 h2.cv_ysb_djpurprice_new;

create or replace view cv_ysb_djpurprice_new as
select distinct  c.warecode,b.purprice
  from (select ti.wareid as wareid, min(ti.batid) as batid
          from t_store_i ti
          left join t_store_d td
          on ti.batid =td.batid
          and ti.wareid = td.wareid
          where ti.ownerid = '01'
         -- and td.stallno in ('0101','0104')
          and (td.wareqty-td.awaitqty-td.pendingqty)>0
         and ti.compid = 1
         group by ti.wareid) a
  left join t_store_i b
    on a.wareid = b.wareid
   and a.batid = b.batid
   left join t_ware c
   on a.wareid = c.wareid
 where b.compid = 1
;

–4.药品效期(药品批号 栏)取四个字段:H2.CV_YSB_WARE_STORE_I;

CREATE OR REPLACE VIEW CV_YSB_WARE_STORE_I AS
SELECT vw.warecode,---商品编码
       i.makeno, ---批号
       i.invalidate, --有效期至
       i.makedate --生产日期
  FROM t_store_d d
  JOIN t_ware vw
    ON d.wareid = vw.wareid
   AND d.compid = vw.compid
  LEFT JOIN t_store_i i
    ON d.compid = i.compid
   AND d.wareid = i.wareid
   AND d.batid = i.batid
 WHERE  (d.wareqty-d.awaitqty-d.pendingqty)>0   ---可用数量大于0
 and d.compid=1 and d.busno='1000'    ---只传输批发公司的库存
 and i.invalidate>SYSDATE    ---有效期至大于当前时间(过效期不同步)
 and i.Ownerid = '01'
 group by vw.warecode,i.invalidate,i.makeno,i.makedate;

–5.药品信息 !!!商品信息同步仅供一键上架功能使用,不更新现有上架品种信息 h2.cv_ysb_ware;

CREATE OR REPLACE VIEW CV_YSB_WARE AS
SELECT rtrim(w.warecode) AS drugcode, --药品编码(字符串)--同其他语句使用的商品编码字段 *
       rtrim(w.warename) AS drugname, --商品名称(字符串) *
       rtrim(w.warespec) AS pack, --商品规格(字符串) *
       rtrim(f.factoryname) AS factory, --生产厂家(字符串) *
       rtrim(w.wareunit) AS unit, --单位  中文药品单位,如盒、包、箱等(字符串) *
       rtrim(w.barcode) AS barcode, --商品条形码(字符串)(*最好有)
       rtrim(w.fileno) AS approval, --批准文号,国药准字H20103180(字符串) *
       rtrim(tcb.classcode) AS busitype, --经营类别(*最好有)(字符串)
       sh.wareqty AS stock, --库存(数字)*(取仓库的库存,用商品表left join库存表取值,保证所有品种可取到)
       nvl(tww.setwhlprice1, 9999) AS price, --价格(数字)*(取值与价格同步语句相同,不同步价格可定9999)
       1 AS step, --购买增量、步长(数字类型)--即 采购倍数(默认填1)
       w.saletax AS taxrate, --税率(数字)
       to_char(w.midqty) AS midpack, --中包装数(数字)
       to_char(w.maxqty) AS wholepack, --整包装数(数字)
       w.lastsaleprice AS recommendedprice --建议零售价(数字)
  FROM t_ware w
  LEFT JOIN t_factory f
    ON f.factoryid = w.factoryid
  LEFT JOIN t_ware_class_base twcb
    ON twcb.compid = w.compid
   AND twcb.wareid = w.wareid
   AND twcb.classgroupno = '18'
  LEFT JOIN t_class_base tcb
    ON tcb.classgroupno = twcb.classgroupno
   AND tcb.classcode = twcb.classcode
  LEFT JOIN (SELECT d.compid,
                    d.wareid,
                    SUM(d.wareqty - d.awaitqty - d.pendingqty) AS wareqty
               FROM t_store_d d, t_store_i i,t_stall ts
              WHERE d.wareid = i.wareid
                AND d.batid = i.batid
                --AND d.stallno IN ('0101', '0104')
                AND ts.compid=d.compid AND ts.busno=d.busno AND ts.stallno=d.stallno
                AND ts.stalltype IN ('11')
                AND i.ownerid = '01'
                group by d.compid,d.wareid) sh
    ON sh.compid = w.compid
   AND sh.wareid = w.wareid
  LEFT JOIN t_ware_whlprice tww
    ON tww.compid = w.compid
   AND tww.wareid = w.wareid
   AND tww.whlgroupid = '12'----价格组可能会有变更
 WHERE w.compid = 1
   AND w.salestatus = 1
   AND w.status = 1
   AND w.warekind <> 3;

–6.药店信息 现在只能同步药店编码用于订单对接 H2.CV_YSB_VENCUS;

CREATE OR REPLACE VIEW CV_YSB_VENCUS AS
SELECT t_vencus.vencuscode,--药店编码 --这个值会同步为平台上录入的药店编码,选在界面上可视的那个或之前同步订单用的那个
       t_vencus.vencusname,
       t_vencus.address
       ---缺少 --系统有存放平台客户id的,才上传这个字段
 FROM t_vencus  t_vencus
 WHERE t_vencus.status = 1
 AND t_vencus.compid=1
 and t_vencus.vencusflag in (2,0) --只取仅客户 与 供应商与客户
  ---暂未控制仅电商客户
order by t_vencus.vencuscode;

–7.上传快递,工具9-2栏 “订单快递” h2.cv_ysb_express;

create or replace view cv_ysb_express as
select
b.djbh as orderId,
--nvl(b.express_code,0) as logisticsId,
case when substr(b.expressno,1,2) = 'SF' then 1  -----快递
  when substr(b.expressno,1,2) = 'JD' then 10194 end  as logisticsId,
nvl(b.expressno,'') as logisticsNo,
'' as invoiceCode,
'' as invoiceNo,
'' as securityCode,
'' as invoiceUrl,
'' as status,
'' as invoiceStatus
from h2.d_batsale_ext b
where  b.expressno is not null
and b.btbbillcode = '1'
order by b.djbh;

–8.上传发票,工具9-3栏 “订单发票”h2.cv_erp2pt_fp;

create or replace view cv_erp2pt_fp as
select aa.batsaleno as batsaleno,
       aa.billsource as billsource,
       aa.djbh as djbh,
       nvl(bb.invoicetenno, '') as invoicetenno,
       nvl(bb.invoicelist, '') as invoicelist,
       '' as securitycode,
       nvl(bb.pdf_url, ' ') as pdf_url,
       bb.invoicedate as invoicedate
  from (select a.invoicepayno, b.batsaleno, b.djbh, b.compid, b.billsource
          from t_invoice_pay_d a, t_batsale_h b
         where a.billno = b.batsaleno
           and b.djbh is not null
           and a.billcode = 'WHL'
           and b.compid = 1) aa
  left join t_invoice_pay_h bb
    on aa.invoicepayno = bb.invoicepayno
   and aa.compid = bb.compid
 where bb.invoicelist is not null
   --and bb.invoicetenno is not null
   and bb.pdf_url is not null
   and aa.billsource is not NULL
   AND TRUNC(bb.execdate)>=SYSDATE-3
 group by aa.batsaleno,
          aa.djbh,
          bb.invoicelist,
          bb.invoicetenno,
          bb.pdf_url,
          aa.billsource,
          bb.invoicedate;

创建药师帮表

–9.订单状态回传,工具8-8栏 h2.ysb_ddmx_writeback;

-- Create table
create table YSB_DDMX_WRITEBACK
(
  orderid   VARCHAR2(15) not null,
  ordercode VARCHAR2(40),
  dj_sn     NUMBER(5),
  drugcode  VARCHAR2(40),
  amount    NUMBER(16,6),
  price     NUMBER(16,6),
  je        NUMBER(16,6),
  batchnum  VARCHAR2(20),
  proddate  VARCHAR2(10),
  validity  VARCHAR2(10),
  status    NUMBER(5) not null
)
tablespace H2DB
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

–10.批发申请单 主表明细表 t_batsaleapply_h t_batsaleapply_d(需要药师帮生成批发申请单才需要这一步)

grant select, insert, update, delete, references, alter, index, debug on T_BATSALEAPPLY_H to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on T_BATSALEAPPLY_D to YSBUSER;

其他表

H2_BATSALE_D

create table H2_BATSALE_D
(
  djbh            VARCHAR2(100) not null,
  dj_sn           NUMBER(30) not null,
  drugcode        VARCHAR2(40) not null,
  shl             NUMBER(14,2),
  dj              NUMBER(14,4),
  je              NUMBER(14,4),
  batchnum        VARCHAR2(20),
  proddate        VARCHAR2(10),
  validity        VARCHAR2(10),
  status          VARCHAR2(20),
  wholesale_type  NUMBER(5) default 0,
  is_zx           VARCHAR2(10) default '否',
  billsource      VARCHAR2(20) not null,
  salebs          VARCHAR2(120),
  shop_amount     NUMBER(14,4) default 0.00,
  platform_amount NUMBER(14,4) default 0.00,
  shl_old         NUMBER(14,2)
)
tablespace H2_TEST
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table H2_BATSALE_D
  is 'H2订单明细表中间表';
-- Add comments to the columns 
comment on column H2_BATSALE_D.djbh
  is '单据编码';
comment on column H2_BATSALE_D.dj_sn
  is '明细序号';
comment on column H2_BATSALE_D.drugcode
  is '药品编码';
comment on column H2_BATSALE_D.shl
  is '数量';
comment on column H2_BATSALE_D.dj
  is '单价';
comment on column H2_BATSALE_D.je
  is '金额';
comment on column H2_BATSALE_D.batchnum
  is '药品批号';
comment on column H2_BATSALE_D.proddate
  is '药品生产日期';
comment on column H2_BATSALE_D.validity
  is '药品有效期';
comment on column H2_BATSALE_D.status
  is '药品明细状态';
comment on column H2_BATSALE_D.wholesale_type
  is '活动类型:0-返现活动, 1-一口价, 2-限量秒杀, 3-折扣活动
 4-一口价特价产品(不可用商家优惠券) 5-限时特价不可用商家券 6-限时特价可用商家券 7-药慧拼(拼团) 8-批购包邮 9-乐药分销 10-赠品';
comment on column H2_BATSALE_D.is_zx
  is '是否执行';
comment on column H2_BATSALE_D.billsource
  is '单据来源(1 药师帮/2 一药城/3 小药药/4 委托配送-和美/5 委托配送同济)';
comment on column H2_BATSALE_D.salebs
  is '销售渠道:1 药师帮/2 一药城/3 小药药/=B;4 委托配送-和美/5 委托配送同济=C';
comment on column H2_BATSALE_D.shop_amount
  is '商品店铺优惠金额';
comment on column H2_BATSALE_D.platform_amount
  is '商品平台优惠金额';
comment on column H2_BATSALE_D.shl_old
  is '原订单数量';
-- Create/Recreate primary, unique and foreign key constraints 
alter table H2_BATSALE_D
  add constraint PK_H2_BATSALE_D primary key (DJBH, DJ_SN, BILLSOURCE)
  using index
  tablespace H2_TEST_INDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

H2_BATSALE_H

create table H2_BATSALE_H
(
  billsource        VARCHAR2(20) not null,
  djbh              VARCHAR2(100) not null,
  rq                VARCHAR2(10),
  ontime            VARCHAR2(8),
  drugstorebranchid NUMBER(20),
  customerid        VARCHAR2(40) not null,
  drugstorename     VARCHAR2(120),
  status            VARCHAR2(20),
  je                NUMBER(14,4),
  xgdjbh            VARCHAR2(40),
  beizhu            VARCHAR2(512),
  is_zx             VARCHAR2(10) default '否',
  invoicetype       VARCHAR2(10) default '0',
  address           VARCHAR2(255),
  recvname          VARCHAR2(80),
  recvphone         VARCHAR2(50),
  provincename      VARCHAR2(80),
  cityname          VARCHAR2(80),
  districtname      VARCHAR2(120),
  streetname        VARCHAR2(120),
  flag              NUMBER(1) default 0,
  err               VARCHAR2(2000),
  bm                VARCHAR2(2000),
  xsbs              VARCHAR2(2000),
  is_invalid        NUMBER(1) default 0,
  djbh_id           VARCHAR2(80),
  lasttime          DATE
)
tablespace H2_TEST
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 8K
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table H2_BATSALE_H
  is 'H2订单汇总中间表';
-- Add comments to the columns 
comment on column H2_BATSALE_H.billsource
  is '单据来源(1 药师帮/2 一药城/3 小药药/4 委托配送-和美/5 委托配送同济)';
comment on column H2_BATSALE_H.djbh
  is '单据编号,平台上订单号';
comment on column H2_BATSALE_H.rq
  is '日期';
comment on column H2_BATSALE_H.ontime
  is '时间';
comment on column H2_BATSALE_H.drugstorebranchid
  is '平台客户id';
comment on column H2_BATSALE_H.customerid
  is '单位(药店)编码(平台上录入的药店编码值)';
comment on column H2_BATSALE_H.drugstorename
  is '单位(药店)名称(平台上的药店名)';
comment on column H2_BATSALE_H.status
  is '状态(可不回写)';
comment on column H2_BATSALE_H.je
  is '订单总金额';
comment on column H2_BATSALE_H.xgdjbh
  is '相关单据编号,随货配送的配送单号(药批ERP系统上的订单编号,可回写以关联药师帮订单和ERP订单)(可不回写)';
comment on column H2_BATSALE_H.beizhu
  is '备注,格式为订单编码 + 订单类型(爆款、自营)+ 客户留言';
comment on column H2_BATSALE_H.is_zx
  is '是否执行(可不回写)';
comment on column H2_BATSALE_H.invoicetype
  is '-发票类型(0 缺省,1 普通发票,2 专用发票)';
comment on column H2_BATSALE_H.address
  is '收货地址';
comment on column H2_BATSALE_H.recvname
  is '收货人';
comment on column H2_BATSALE_H.recvphone
  is '收货人电话';
comment on column H2_BATSALE_H.provincename
  is '省';
comment on column H2_BATSALE_H.cityname
  is '城市';
comment on column H2_BATSALE_H.districtname
  is '区/县';
comment on column H2_BATSALE_H.streetname
  is '街道';
comment on column H2_BATSALE_H.flag
  is '接收标志(0/未接收,1/接收成功,2/接收失败)';
comment on column H2_BATSALE_H.err
  is '错误信息';
comment on column H2_BATSALE_H.bm
  is '部门';
comment on column H2_BATSALE_H.xsbs
  is '销售标识';
comment on column H2_BATSALE_H.is_invalid
  is '是否作废';
-- Create/Recreate primary, unique and foreign key constraints 
alter table H2_BATSALE_H
  add constraint PK_H2_BATSALE_H primary key (DJBH, BILLSOURCE)
  using index
  tablespace H2_TEST_INDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

YSB_DDHZ

create table YSB_DDHZ
(
  djbh              VARCHAR2(15) not null,
  rq                VARCHAR2(10),
  ontime            VARCHAR2(8),
  drugstorebranchid NUMBER(20),
  customerid        VARCHAR2(40) not null,
  drugstorename     VARCHAR2(120),
  status            VARCHAR2(20),
  je                NUMBER(14,4),
  xgdjbh            VARCHAR2(40),
  beizhu            VARCHAR2(512),
  is_zx             VARCHAR2(10) default '否',
  invoicetype       VARCHAR2(10) default '0',
  address           VARCHAR2(255),
  recvname          VARCHAR2(80),
  recvphone         VARCHAR2(50),
  provincename      VARCHAR2(80),
  cityname          VARCHAR2(80),
  districtname      VARCHAR2(120),
  streetname        VARCHAR2(120),
  sync_status       VARCHAR2(10) default '0',
  sync_msg          VARCHAR2(520),
  sync_date         DATE
)
tablespace H2_BUSI
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table YSB_DDHZ
  add primary key (DJBH)
  using index
  tablespace H2_BUSI
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

YYB_DDMX

-- Create table
create table YSB_DDMX
(
  djbh           VARCHAR2(15) not null,
  dj_sn          NUMBER(5) not null,
  drugcode       VARCHAR2(120) not null,
  shl            NUMBER(16,6),
  dj             NUMBER(16,6),
  je             NUMBER(16,6),
  batchnum       VARCHAR2(20),
  proddate       VARCHAR2(10),
  validity       VARCHAR2(10),
  status         VARCHAR2(20),
  wholesale_type NUMBER(5) default 0,
  is_zx          VARCHAR2(10) default '否'  --是否执行(可不回写),
  wholesaleid    NUMBER(15)
)
tablespace H2DB
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns 
comment on column YSB_DDMX.wholesale_type
  is '活动类型:0-返现活动, 1-一口价, 2-限量秒杀, 3-折扣活动 4-一口价特价产品(不可用商家优惠券) 5-限时特价不可用商家券 6-限时特价可用商家券 7-药慧拼(拼团) 8-批购包邮 9-乐药分销 10-赠品';
-- Create/Recreate primary, unique and foreign key constraints 
alter table YSB_DDMX
  add constraint PK_MX primary key (DJBH, DJ_SN)
  using index
  tablespace H2DB
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

YSB_DRUGSTOREINFO

create table YSB_DRUGSTOREINFO
(
  drugstoreid             NUMBER not null,
  customerid              VARCHAR2(50),
  drugstorename           VARCHAR2(255),
  provincename            VARCHAR2(100),
  cityname                VARCHAR2(100),
  districtname            VARCHAR2(100),
  regadress               VARCHAR2(255),
  drugstoretype           VARCHAR2(10),
  invoicetype             VARCHAR2(10),
  busiscope               VARCHAR2(255),
  otcscope                VARCHAR2(255),
  fullbusinessscope       VARCHAR2(2000),
  salesmanphone           VARCHAR2(75),
  salesmanname            VARCHAR2(75),
  receivername            VARCHAR2(75),
  receiverphone           VARCHAR2(75),
  firstordertime          VARCHAR2(20),
  areacode                VARCHAR2(10),
  be_papers_syn           NUMBER default 0,
  busicardurl             VARCHAR2(1500),
  busicardno              VARCHAR2(120),
  busicardissue           VARCHAR2(10),
  busicardvalid           VARCHAR2(10),
  proxyopername           VARCHAR2(75),
  busicardname            VARCHAR2(300),
  busicardaddress         VARCHAR2(300),
  busicardcertifiunit     VARCHAR2(75),
  drugbusiurl             VARCHAR2(1500),
  drugbusitcardno         VARCHAR2(120),
  drugbusiissue           VARCHAR2(10),
  drugbusivalidity        VARCHAR2(10),
  drugbusiproxyopername   VARCHAR2(75),
  qualitymanager          VARCHAR2(75),
  drugbusiprincipal       VARCHAR2(300),
  drugbusiname            VARCHAR2(300),
  drugbusiaddress         VARCHAR2(300),
  drugbusicertifiunit     VARCHAR2(75),
  purchasepaperurl        VARCHAR2(1500),
  purchasepaperno         VARCHAR2(120),
  purchasepaperissue      VARCHAR2(10),
  purchasepapervalid      VARCHAR2(10),
  sellerphone             VARCHAR2(50),
  selidentityurl          VARCHAR2(1500),
  selidentityissue        VARCHAR2(10),
  selidentityvalid        VARCHAR2(10),
  selidentityno           VARCHAR2(120),
  sellername              VARCHAR2(75),
  changerecordurl         VARCHAR2(1500),
  hisorgcardurl           VARCHAR2(1500),
  hisorgcardno            VARCHAR2(120),
  hisorgcardissue         VARCHAR2(10),
  hisorgcardvalid         VARCHAR2(10),
  hisorgcardproxyopername VARCHAR2(75),
  hisorgcardprincipal     VARCHAR2(75),
  hisorgcardname          VARCHAR2(300),
  hisorgcardaddress       VARCHAR2(300),
  hisorgcardcertifiunit   VARCHAR2(75),
  hiseqrecordurl          VARCHAR2(1500),
  hiseqrecord             VARCHAR2(120),
  hiseqrecordissue        VARCHAR2(10),
  hiseqrecordvalid        VARCHAR2(10),
  hiseqbusitcardurl       VARCHAR2(1500),
  hiseqbusitcardno        VARCHAR2(120),
  hiseqbusitcardissue     VARCHAR2(10),
  hiseqbusitcardvalid     VARCHAR2(10),
  foodbusiurl             VARCHAR2(1500),
  foodbusino              VARCHAR2(120),
  foodbusiissue           VARCHAR2(10),
  foodbusivalid           VARCHAR2(10),
  invoiceinfourl          VARCHAR2(1500),
  invoiceinfoname         VARCHAR2(300),
  bankname                VARCHAR2(200),
  bankcardno              VARCHAR2(75),
  taxno                   VARCHAR2(75),
  invoiceinfophone        VARCHAR2(75),
  invoiceinfoaddress      VARCHAR2(300),
  receiverpaperurl        VARCHAR2(1500),
  receiverpapername       VARCHAR2(75),
  receiverpaperphone      VARCHAR2(75),
  receiverpapervalid      VARCHAR2(10),
  is_tq                   VARCHAR2(20) default '否',
  erpcustomerid           VARCHAR2(75) default '',
  iseinvoice              VARCHAR2(10),
  lastordertime           VARCHAR2(20),
  isdownload              NUMBER(1) default 0 not null,
  mtimetimestamp          VARCHAR2(30),
  lastpaperupdatetime     VARCHAR2(30),
  updateflag              VARCHAR2(10),
  sync_status             NUMBER(1) default 0,
  sync_msg                VARCHAR2(400),
  sync_date               DATE,
  gspurl                  VARCHAR2(1000),
  foodbusitcardno         VARCHAR2(100),
  gspvalidity             VARCHAR2(100),
  gspissue                VARCHAR2(100),
  gspcardno               VARCHAR2(100)
)
tablespace H2_BUSI
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Add comments to the columns 
comment on column YSB_DRUGSTOREINFO.drugstoreid
  is '药店ID';
comment on column YSB_DRUGSTOREINFO.customerid
  is '药店编码';
comment on column YSB_DRUGSTOREINFO.drugstorename
  is '客户名称';
comment on column YSB_DRUGSTOREINFO.provincename
  is '省份';
comment on column YSB_DRUGSTOREINFO.cityname
  is '城市';
comment on column YSB_DRUGSTOREINFO.districtname
  is '区县';
comment on column YSB_DRUGSTOREINFO.regadress
  is '收货地址';
comment on column YSB_DRUGSTOREINFO.drugstoretype
  is '药店类型 0-零售单体 1-第三终端 2-连锁直营 3-连锁加盟 4-连锁总部 5-商业公司';
comment on column YSB_DRUGSTOREINFO.invoicetype
  is '开票类型 0未设置 1-普票 2-专票 3-无要求';
comment on column YSB_DRUGSTOREINFO.busiscope
  is '商品经营范围 商品经营范围(用,分隔) 1-中成药  2-化学药制剂  3-抗生素制剂
                                --4-生物制品(除注射剂)  5-中药饮片 6-医疗器械(二类) 7-医疗器械(三类)
                                --8-普通食品  9-医疗器械(一类)10-日用品 11-化妆品 12消毒产品 13-全球购
                                --14-保健品  15-生物制品(仅注射剂)  16-保健食品  17-中药饮片(药食同源)';
comment on column YSB_DRUGSTOREINFO.otcscope
  is '处方药经营范围 处方药经营范围(用,分隔)   1-处方药  2-甲类非处方  3-乙类非处方  4-其它等非药品';
comment on column YSB_DRUGSTOREINFO.fullbusinessscope
  is '中台详细版药店经营范围(具体字典值参考excel文档)';
comment on column YSB_DRUGSTOREINFO.salesmanphone
  is '店员联系电话';
comment on column YSB_DRUGSTOREINFO.salesmanname
  is '店员姓名';
comment on column YSB_DRUGSTOREINFO.receivername
  is '最近3天内任取一笔订单的收货人姓名,非3天内下单,为null';
comment on column YSB_DRUGSTOREINFO.receiverphone
  is '最近3天内任取一笔订单的收货人电话,非3天内下单,为null';
comment on column YSB_DRUGSTOREINFO.firstordertime
  is '首单时间,时间戳,格式:1563350366';
comment on column YSB_DRUGSTOREINFO.areacode
  is '网上地区编码';
comment on column YSB_DRUGSTOREINFO.be_papers_syn
  is '资质是否可以共享:0-否 1-是';
comment on column YSB_DRUGSTOREINFO.busicardurl
  is '营业执照图片url';
comment on column YSB_DRUGSTOREINFO.busicardno
  is '营业执照编号';
comment on column YSB_DRUGSTOREINFO.busicardissue
  is '营业执照营业执照发证日期,格式为:2015-12-30';
comment on column YSB_DRUGSTOREINFO.busicardvalid
  is '营业执照有效期,格式为:2015-12-30,或者“长期”';
comment on column YSB_DRUGSTOREINFO.proxyopername
  is '营业执照法人代表';
comment on column YSB_DRUGSTOREINFO.busicardname
  is '营业执照药店执照名称';
comment on column YSB_DRUGSTOREINFO.busicardaddress
  is '营业执照药店注册地址';
comment on column YSB_DRUGSTOREINFO.drugbusiurl
  is '药品经营许图片url';
comment on column YSB_DRUGSTOREINFO.drugbusitcardno
  is '药品经营许可证编号';
comment on column YSB_DRUGSTOREINFO.drugbusiissue
  is '药品经营许可证发证日期,格式为:2015-12-30';
comment on column YSB_DRUGSTOREINFO.drugbusivalidity
  is '药品经营许可证有效期,格式为:2015-12-30';
comment on column YSB_DRUGSTOREINFO.drugbusiproxyopername
  is '药品经营许可证法人代表';
comment on column YSB_DRUGSTOREINFO.qualitymanager
  is '药品经营许可证质量负责人';
comment on column YSB_DRUGSTOREINFO.drugbusiprincipal
  is '药品经营许可证主要负责人';
comment on column YSB_DRUGSTOREINFO.drugbusiname
  is '药品经营许可证药店许可证名称';
comment on column YSB_DRUGSTOREINFO.purchasepaperurl
  is '采购委托书图片url';
comment on column YSB_DRUGSTOREINFO.purchasepaperno
  is '采购委托书证件编号';
comment on column YSB_DRUGSTOREINFO.purchasepapervalid
  is '采购委托书有效期 (yyyymmdd)';
comment on column YSB_DRUGSTOREINFO.sellerphone
  is '采购人身份证电话号码';
comment on column YSB_DRUGSTOREINFO.selidentityurl
  is '采购人员身份证图片url';
comment on column YSB_DRUGSTOREINFO.selidentityissue
  is '采购人身份证发证日期  (时间戳,格式为:1563350366)';
comment on column YSB_DRUGSTOREINFO.selidentityvalid
  is '采购人身份证有效期 (yyyymmdd 或者 长期)';
comment on column YSB_DRUGSTOREINFO.selidentityno
  is '采购人员身份证编号';
comment on column YSB_DRUGSTOREINFO.sellername
  is '采购人员身份证名字';
comment on column YSB_DRUGSTOREINFO.changerecordurl
  is '变更记录图片地址';
comment on column YSB_DRUGSTOREINFO.hisorgcardurl
  is '医疗机构执业许可证图片url';
comment on column YSB_DRUGSTOREINFO.hisorgcardno
  is '医疗机构执业许可证编号';
comment on column YSB_DRUGSTOREINFO.hisorgcardissue
  is '医疗机构执业许可证发证日期,格式为:2015-12-30';
comment on column YSB_DRUGSTOREINFO.hisorgcardvalid
  is '医疗机构执业许可证有效日期,格式为:2015-12-30';
comment on column YSB_DRUGSTOREINFO.hisorgcardproxyopername
  is '医疗机构执业许可证法人代表';
comment on column YSB_DRUGSTOREINFO.hisorgcardprincipal
  is '医疗机构执业许可证主要负责人';
comment on column YSB_DRUGSTOREINFO.hiseqrecordurl
  is '二级医疗器械备案凭证图片url';
comment on column YSB_DRUGSTOREINFO.hiseqrecord
  is '医疗器械备案凭证编号';
comment on column YSB_DRUGSTOREINFO.hiseqbusitcardurl
  is '医疗器械经营企业许可证图片url';
comment on column YSB_DRUGSTOREINFO.hiseqbusitcardno
  is '医疗器械经营企业许可证编号';
comment on column YSB_DRUGSTOREINFO.hiseqbusitcardissue
  is '医疗器械经营许可证发证日期  (时间戳,格式为:1563350366)';
comment on column YSB_DRUGSTOREINFO.hiseqbusitcardvalid
  is '医疗器械经营许可证有效期  (yyyymmdd)';
comment on column YSB_DRUGSTOREINFO.foodbusiurl
  is '食品经营许可证图片url';
comment on column YSB_DRUGSTOREINFO.foodbusino
  is '食品经营许可证证件编号';
comment on column YSB_DRUGSTOREINFO.foodbusiissue
  is '食品经营许可证发证日期  (时间戳,格式为:1563350366)';
comment on column YSB_DRUGSTOREINFO.foodbusivalid
  is '食品经营许可证有效期   (yyyymmdd)';
comment on column YSB_DRUGSTOREINFO.invoiceinfourl
  is '是否已提取数据';
comment on column YSB_DRUGSTOREINFO.invoiceinfoname
  is '开票信息开户户名
,invoiceInfoAddress      varchar2(300)     -- 开票信息开票地址';
comment on column YSB_DRUGSTOREINFO.bankname
  is '开户行';
comment on column YSB_DRUGSTOREINFO.bankcardno
  is '银行帐号';
comment on column YSB_DRUGSTOREINFO.taxno
  is '税号';
comment on column YSB_DRUGSTOREINFO.invoiceinfophone
  is '开票信息开票电话';
comment on column YSB_DRUGSTOREINFO.invoiceinfoaddress
  is '开票信息开票地址';
comment on column YSB_DRUGSTOREINFO.erpcustomerid
  is '可用于回写对应erp客户id(要存客户唯一值)';
comment on column YSB_DRUGSTOREINFO.lastordertime
  is '最后下单时间(时间戳,格式为:1563350366)
)';
comment on column YSB_DRUGSTOREINFO.mtimetimestamp
  is '药店信息最近修改时间';
comment on column YSB_DRUGSTOREINFO.lastpaperupdatetime
  is '药店证件最近修改时间';
comment on column YSB_DRUGSTOREINFO.updateflag
  is '药店更新标志(true-有更新,false-无更新,更新内容:药店名称、药店地址、营业执照、药品经营许可证、医疗机构执业许可证、开票信息、变更记录)';
comment on column YSB_DRUGSTOREINFO.sync_status
  is '同步状态';
comment on column YSB_DRUGSTOREINFO.sync_msg
  is '同步信息';
comment on column YSB_DRUGSTOREINFO.sync_date
  is '同步时间';
-- Create/Recreate primary, unique and foreign key constraints 
alter table YSB_DRUGSTOREINFO
  add primary key (DRUGSTOREID)
  using index
  tablespace H2_BUSI
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

H2_VENCUS

create table H2_VENCUS
(
  billsource              VARCHAR2(20) not null,
  drugstoreid             NUMBER not null,
  customerid              VARCHAR2(50),
  drugstorename           VARCHAR2(255),
  provincename            VARCHAR2(100),
  cityname                VARCHAR2(100),
  districtname            VARCHAR2(100),
  regadress               VARCHAR2(255),
  salesmanphone           VARCHAR2(50),
  salesmanname            VARCHAR2(80),
  drugstoretype           VARCHAR2(50),
  invoicetype             VARCHAR2(10),
  taxno                   VARCHAR2(80),
  bankname                VARCHAR2(150),
  bankcardno              VARCHAR2(90),
  busiscope               VARCHAR2(1000),
  otcscope                VARCHAR2(255),
  busicardno              VARCHAR2(120),
  busicardissue           VARCHAR2(60),
  busicardvalid           VARCHAR2(60),
  proxyopername           VARCHAR2(100),
  drugbusitcardno         VARCHAR2(120),
  drugbusiissue           VARCHAR2(60),
  drugbusivalidity        VARCHAR2(60),
  qualitymanager          VARCHAR2(100),
  gspcardno               VARCHAR2(120),
  gspissue                VARCHAR2(60),
  gspvalidity             VARCHAR2(60),
  hisorgcardno            VARCHAR2(120),
  hisorgcardissue         VARCHAR2(60),
  hisorgcardvalid         VARCHAR2(60),
  foodbusitcardno         VARCHAR2(120),
  hiseqbusitcardno        VARCHAR2(120),
  selidentityno           VARCHAR2(120),
  sellername              VARCHAR2(200),
  hiseqrecord             VARCHAR2(120),
  firstordertime          VARCHAR2(120),
  busicardurl             VARCHAR2(1000),
  drugbusiurl             VARCHAR2(1000),
  selidentityurl          VARCHAR2(1000),
  purchasepaperurl        VARCHAR2(1000),
  gspurl                  VARCHAR2(1000),
  hiseqrecordurl          VARCHAR2(1000),
  hiseqbusitcardurl       VARCHAR2(1000),
  foodbusiurl             VARCHAR2(1000),
  hisorgcardurl           VARCHAR2(1000),
  is_tq                   VARCHAR2(10) default '否',
  invoiceinfourl          VARCHAR2(1000),
  changerecordurl         VARCHAR2(1000),
  areacode                NUMBER,
  mtimetimestamp          VARCHAR2(30),
  lastpaperupdatetime     VARCHAR2(30),
  updateflag              VARCHAR2(10),
  busicardname            VARCHAR2(300),
  busicardaddress         VARCHAR2(300),
  drugbusiproxyopername   VARCHAR2(150),
  drugbusiprincipal       VARCHAR2(200),
  drugbusiname            VARCHAR2(300),
  purchasepapervalid      VARCHAR2(30),
  purchasepaperno         VARCHAR2(150),
  selidentityissue        VARCHAR2(30),
  selidentityvalid        VARCHAR2(100),
  sellerphone             VARCHAR2(100),
  foodbusiissue           VARCHAR2(30),
  foodbusivalid           VARCHAR2(30),
  foodbusino              VARCHAR2(150),
  invoiceinfoname         VARCHAR2(300),
  invoiceinfoaddress      VARCHAR2(300),
  invoiceinfophone        VARCHAR2(100),
  hisorgcardproxyopername VARCHAR2(100),
  hisorgcardprincipal     VARCHAR2(100),
  hiseqbusitcardissue     VARCHAR2(30),
  hiseqbusitcardvalid     VARCHAR2(30),
  be_papers_syn           NUMBER default 0,
  fullbusinessscope       VARCHAR2(2000),
  erpcustomerid           VARCHAR2(100),
  receivername            VARCHAR2(75),
  receiverphone           VARCHAR2(75),
  lastordertime           VARCHAR2(30),
  flag                    NUMBER(1),
  err                     VARCHAR2(1000)
)
tablespace H2_TEST
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table H2_VENCUS
  is 'H2客户信息表';
-- Add comments to the columns 
comment on column H2_VENCUS.billsource
  is '单据来源(1 药师帮/2 一药城/3 小药药/4 委托配送-和美/5 委托配送-同济)';
comment on column H2_VENCUS.drugstoreid
  is '药店ID';
comment on column H2_VENCUS.customerid
  is '药店编码';
comment on column H2_VENCUS.drugstorename
  is '客户名称';
comment on column H2_VENCUS.provincename
  is '省份';
comment on column H2_VENCUS.cityname
  is '城市';
comment on column H2_VENCUS.districtname
  is '区县';
comment on column H2_VENCUS.regadress
  is '收货地址';
comment on column H2_VENCUS.salesmanphone
  is '店员联系电话-委托书上的';
comment on column H2_VENCUS.salesmanname
  is '店员姓名-委托书上的';
comment on column H2_VENCUS.drugstoretype
  is '药店类型 0-零售单体 1-第三终端 2-连锁直营 3-连锁加盟 4-连锁总部 5-商业公司';
comment on column H2_VENCUS.invoicetype
  is '开票类型 0未设置 1-普票 2-专票 3-无要求';
comment on column H2_VENCUS.taxno
  is '税号';
comment on column H2_VENCUS.bankname
  is '开户行';
comment on column H2_VENCUS.bankcardno
  is '银行帐号';
comment on column H2_VENCUS.busicardno
  is '营业执照编号';
comment on column H2_VENCUS.busicardissue
  is '营业执照营业执照发证日期,格式为:2015-12-30';
comment on column H2_VENCUS.busicardvalid
  is '营业执照有效期,格式为:2015-12-30,或者“长期”';
comment on column H2_VENCUS.proxyopername
  is '营业执照法人代表';
comment on column H2_VENCUS.drugbusitcardno
  is '药品经营许可证编号';
comment on column H2_VENCUS.drugbusiissue
  is '药品经营许可证发证日期';
comment on column H2_VENCUS.drugbusivalidity
  is '药品经营许可证有效期';
comment on column H2_VENCUS.qualitymanager
  is '药品经营许可证质量负责人';
comment on column H2_VENCUS.gspcardno
  is 'GSP证书编号';
comment on column H2_VENCUS.gspissue
  is 'GSP发证日期';
comment on column H2_VENCUS.gspvalidity
  is 'GSP有效期';
comment on column H2_VENCUS.hisorgcardno
  is '医疗机构执业许可证编号';
comment on column H2_VENCUS.hisorgcardissue
  is '医疗机构执业许可证发证日期';
comment on column H2_VENCUS.hisorgcardvalid
  is '医疗机构执业许可证有效日期';
comment on column H2_VENCUS.foodbusitcardno
  is '食品流通许可证编号';
comment on column H2_VENCUS.hiseqbusitcardno
  is '医疗器械经营企业许可证编号';
comment on column H2_VENCUS.selidentityno
  is '采购人员身份证编号';
comment on column H2_VENCUS.sellername
  is '采购人员身份证名字';
comment on column H2_VENCUS.hiseqrecord
  is '医疗器械备案凭证编号';
comment on column H2_VENCUS.busicardurl
  is '营业执照图片url';
comment on column H2_VENCUS.drugbusiurl
  is '药品经营许图片url';
comment on column H2_VENCUS.selidentityurl
  is '采购人员身份证图片url';
comment on column H2_VENCUS.purchasepaperurl
  is '采购委托书图片url';
comment on column H2_VENCUS.gspurl
  is 'GSP证书图片url';
comment on column H2_VENCUS.hiseqrecordurl
  is '二级医疗器械备案凭证图片url';
comment on column H2_VENCUS.hiseqbusitcardurl
  is '医疗器械经营企业许可证图片url';
comment on column H2_VENCUS.foodbusiurl
  is '食品经营许可证图片url';
comment on column H2_VENCUS.hisorgcardurl
  is '医疗机构执业许可证图片url';
comment on column H2_VENCUS.is_tq
  is '是否已提取数据';
comment on column H2_VENCUS.invoiceinfourl
  is '开票信息图片url';
comment on column H2_VENCUS.changerecordurl
  is '变更记录图片地址';
comment on column H2_VENCUS.areacode
  is '网上地区编码';
comment on column H2_VENCUS.mtimetimestamp
  is '药店信息最近修改时间';
comment on column H2_VENCUS.lastpaperupdatetime
  is '药店证件最近修改时间';
comment on column H2_VENCUS.updateflag
  is '药店更新标志(true-有更新,false-无更新,更新内容:药店名称、药店地址、营业执照、药品经营许可证、医疗机构执业许可证、开票信息、变更记录)';
comment on column H2_VENCUS.busicardname
  is '营业执照药店执照名称';
comment on column H2_VENCUS.busicardaddress
  is '营业执照药店注册地址';
comment on column H2_VENCUS.drugbusiproxyopername
  is '药品经营许可证法人代表';
comment on column H2_VENCUS.drugbusiprincipal
  is '药品经营许可证主要负责人';
comment on column H2_VENCUS.drugbusiname
  is '药品经营许可证药店许可证名称';
comment on column H2_VENCUS.purchasepapervalid
  is '采购委托书有效期 (yyyymmdd)  ';
comment on column H2_VENCUS.purchasepaperno
  is '采购委托书证件编号';
comment on column H2_VENCUS.selidentityissue
  is '采购人身份证发证日期';
comment on column H2_VENCUS.selidentityvalid
  is '采购人身份证有效期';
comment on column H2_VENCUS.sellerphone
  is '采购人身份证电话号码';
comment on column H2_VENCUS.foodbusiissue
  is '食品经营许可证发证日期';
comment on column H2_VENCUS.foodbusivalid
  is '食品经营许可证有效期';
comment on column H2_VENCUS.foodbusino
  is '食品经营许可证证件编号';
comment on column H2_VENCUS.invoiceinfoname
  is '开票信息开户户名';
comment on column H2_VENCUS.invoiceinfoaddress
  is '开票信息开票地址';
comment on column H2_VENCUS.invoiceinfophone
  is '开票信息开票电话';
comment on column H2_VENCUS.hisorgcardproxyopername
  is '医疗机构执业许可证法人代表';
comment on column H2_VENCUS.hisorgcardprincipal
  is '医疗机构执业许可证主要负责人';
comment on column H2_VENCUS.hiseqbusitcardissue
  is '医疗器械经营许可证发证日期';
comment on column H2_VENCUS.hiseqbusitcardvalid
  is '医疗器械经营许可证有效期';
comment on column H2_VENCUS.fullbusinessscope
  is '中台详细版药店经营范围';
comment on column H2_VENCUS.erpcustomerid
  is '可用于回写对应erp客户id';
comment on column H2_VENCUS.receivername
  is '最近3天内任取一笔订单的收货人姓名';
comment on column H2_VENCUS.receiverphone
  is '最近3天内任取一笔订单的收货人电话';
comment on column H2_VENCUS.lastordertime
  is '最后下单时间(时间戳,格式为:1563350366)';
comment on column H2_VENCUS.flag
  is '接收标志';
comment on column H2_VENCUS.err
  is '错误信息';
-- Create/Recreate primary, unique and foreign key constraints 
alter table H2_VENCUS
  add primary key (DRUGSTOREID)
  using index
  tablespace H2_TEST_INDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

给药师帮用户YSBUSER授权

-- 为用户赋予必要的权限
GRANT CONNECT TO ysbuser;

-- 赋予用户对特定视图的读取权限
GRANT SELECT ON H2.cv_ysb_djpurprice_new  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_express  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_vencus  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_ware  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_wareqty  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_ware_store_i  TO ysbuser;
GRANT SELECT ON H2.cv_ysb_ware_whlprice  TO ysbuser;
GRANT SELECT ON H2.cv_erp2pt_fp  TO ysbuser;

grant select, insert, update, delete, references, alter, index, debug on H2.H2_BATSALE_D to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on H2.H2_BATSALE_H to YSBUSER;
grant select on H2.H2_VENCUS to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on H2.YSB_DDHZ to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on H2.YSB_DDMX to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on H2.YSB_DDMX_WRITEBACK to YSBUSER;
grant select, insert, update, delete, references, alter, index, debug on H2.YSB_DRUGSTOREINFO to YSBUSER;

创建存储过程

B2B平台信息转中间表

create or replace procedure CPROC_B2B药师帮到海典中间表 is
/*药师帮平台的订单 和客户信息传到海典*/
  v_errm VARCHAR2(4000);
begin
  -- 平台订单主表 => erp销售中间主表
  for rec in (select djbh
                from ysb_ddhz a
               where nvl(a.sync_status, 0) = 0
               and TO_DATE(RQ, 'YYYY-MM-DD') > TO_DATE('2025-03-12', 'YYYY-MM-DD')) loop
    begin
      insert into H2_Batsale_h
        (billsource, --单据来源
         djbh, --单据编号
         rq, --日期
         ontime, --时间
         drugstorebranchid, --平台客户ID
         customerid, --单位(药店)编码(平台上录入的药店编码值)
         drugstorename, --单位(药店)名称(平台上的药店名)
         status, --状态(可不回写)
         je, --订单总金额
         xgdjbh, --相关单据编码
         beizhu, --备注
         is_zx, --是否执行
         invoicetype, --发票类型
         address, --收货地址
         recvname, --收货人
         recvphone, --收货人电话
         provincename, --省
         cityname, --市
         districtname, --区/县
         streetname, --街道
         flag, --接收标志
         err, --报错信息
         bm, --部门
         xsbs --销售标识
         )
        select 1, --单据来源
               a.djbh, --单据编码
               a.rq, --日期
               a.ontime, --时间
               a.drugstorebranchid, --平台客户编码
               a.customerid, --单位(药店)编码
               a.drugstorename, --单位(药店)名称
               '已提取', --状态
               a.je, --金额
               a.xgdjbh, --相关单据编号
               a.beizhu, --备注
               a.is_zx, --是否执行
               a.invoicetype, --发票类型
               a.address, --收货地址
               a.recvname, --收货人
               a.recvphone, --联系人电话
               a.provincename, --省
               a.cityname, --市
               a.districtname, --区/县
               a.streetname, --街道
               0, --接收标志
               '', --报错信息
               'B2B',
               'YSB'
          from ysb_ddhz a
         where a.djbh = rec.djbh;

      -- 平台订单明细表 => erp销售明细中间表
      insert into H2_Batsale_d
        (djbh, --单据编号
         dj_sn, --明细序号
         drugcode, --药品编码
         shl, --数量
         dj, --单价
         je, --金额
         batchnum, --药品批号
         proddate, --药品生产日期
         validity, --药品有效期
         status, --药品明细状态
         wholesale_type, --活动类型
         is_zx, --是否执行
         billsource, --单据来源
         salebs, --销售渠道
         SHL_OLD
         )
        select mx.djbh, --单据编码
               mx.dj_sn, --明细序号
               mx.drugcode, --药品编码
               mx.shl, --数量
               mx.dj, --单价
               mx.je, --金额
               mx.batchnum, --药品批号
               mx.proddate, --药品生产日期
               mx.validity, --药品有效期
               mx.status, --药品明细状态
               mx.wholesale_type, --活动类型
               '是' , --是否执行
               1, --单据来源
               1, --销售渠道
               mx.shl
          from ysb_ddmx mx
         where mx.djbh = rec.djbh;

      -- 平台中间表插入erp中间表后,将当前已插入的数据的status(状态)字段修改为‘是已提取’
      update ysb_ddhz a
         set a.sync_status = 1,
             sync_date     = SYSDATE,
             SYNC_MSG      = '同步到ERP中间表H2_Batsale_h成功!'
       where nvl(a.sync_status, 0) = 0
         and a.djbh = rec.djbh;
    exception
      when others then
        ROLLBACK;
        v_errm := '药师帮订单号[' || rec.djbh || '],生成ERP中间表H2_Batsale_h失败:' ||
                  SQLERRM || chr(10);
        --更新状态
        UPDATE YSB_DDHZ a
           SET sync_status = -1, sync_date = SYSDATE, SYNC_MSG = v_errm
         WHERE nvl(a.sync_status, 0) = 0
           AND DJBH = rec.DJBH;
        COMMIT;
        CONTINUE;
    end;
    commit;
  end loop;

  -- 平台客户信息表 => erp药店中间表
  for rec_c in (select dr.drugstoreid, dr.customerid, dr.drugstorename
                  from YSB_DRUGSTOREINFO dr
                 where nvl(dr.sync_status, 0) = 0
                and TO_DATE(lastordertime, 'YYYY-MM-DD') > TO_DATE('2025-03-12', 'YYYY-MM-DD')) loop
    begin
      insert into H2_Vencus
        (billsource,
         drugstoreid,
         customerid,
         drugstorename,
         provincename,
         cityname,
         districtname,
         regadress,
         salesmanphone,
         salesmanname,
         drugstoretype,
         invoicetype,
         taxno,
         bankname,
         bankcardno,
         busiscope,
         otcscope,
         busicardno,
         busicardissue,
         busicardvalid,
         proxyopername,
         drugbusitcardno,
         drugbusiissue,
         drugbusivalidity,
         qualitymanager,
         gspcardno,
         gspissue,
         gspvalidity,
         hisorgcardno,
         hisorgcardissue,
         hisorgcardvalid,
         foodbusitcardno,
         hiseqbusitcardno,
         selidentityno,
         sellername,
         hiseqrecord,
         firstordertime,
         busicardurl,
         drugbusiurl,
         selidentityurl,
         purchasepaperurl,
         gspurl,
         hiseqrecordurl,
         hiseqbusitcardurl,
         foodbusiurl,
         hisorgcardurl,
         is_tq,
         invoiceinfourl,
         changerecordurl,
         areacode,
         mtimetimestamp,
         lastpaperupdatetime,
         updateflag,
         busicardname,
         busicardaddress,
         drugbusiproxyopername,
         drugbusiprincipal,
         drugbusiname,
         purchasepapervalid,
         purchasepaperno,
         selidentityissue,
         selidentityvalid,
         sellerphone,
         foodbusiissue,
         foodbusivalid,
         foodbusino,
         invoiceinfoname,
         invoiceinfoaddress,
         invoiceinfophone,
         hisorgcardproxyopername,
         hisorgcardprincipal,
         hiseqbusitcardissue,
         hiseqbusitcardvalid,
         be_papers_syn,
         fullbusinessscope,
         erpcustomerid,
         receivername,
         receiverphone,
         lastordertime,
         flag,
         err)
        select 1, dr.drugstoreid,
               dr.customerid,
               dr.drugstorename,
               dr.provincename,
               dr.cityname,
               dr.districtname,
               dr.regadress,
               dr.salesmanphone,
               dr.salesmanname,
               dr.drugstoretype,
               dr.invoicetype,
               dr.taxno,
               dr.bankname,
               dr.bankcardno,
               dr.busiscope,
               dr.otcscope,
               dr.busicardno,
               dr.busicardissue,
               dr.busicardvalid,
               dr.proxyopername,
               dr.drugbusitcardno,
               dr.drugbusiissue,
               dr.drugbusivalidity,
               dr.qualitymanager,
               dr.gspcardno,
               dr.gspissue,
               dr.gspvalidity,
               dr.hisorgcardno,
               dr.hisorgcardissue,
               dr.hisorgcardvalid,
               dr.foodbusitcardno,
               dr.hiseqbusitcardno,
               dr.selidentityno,
               dr.sellername,
               dr.hiseqrecord,
               dr.firstordertime,
               dr.busicardurl,
               dr.drugbusiurl,
               dr.selidentityurl,
               dr.purchasepaperurl,
               dr.gspurl,
               dr.hiseqrecordurl,
               dr.hiseqbusitcardurl,
               dr.foodbusiurl,
               dr.hisorgcardurl,
               dr.is_tq,
               dr.invoiceinfourl,
               dr.changerecordurl,
               dr.areacode,
               dr.mtimetimestamp,
               dr.lastpaperupdatetime,
               dr.updateflag,
               dr.busicardname,
               dr.busicardaddress,
               dr.drugbusiproxyopername,
               dr.drugbusiprincipal,
               dr.drugbusiname,
               dr.purchasepapervalid,
               dr.purchasepaperno,
               dr.selidentityissue,
               dr.selidentityvalid,
               dr.sellerphone,
               dr.foodbusiissue,
               dr.foodbusivalid,
               dr.foodbusino,
               dr.invoiceinfoname,
               dr.invoiceinfoaddress,
               dr.invoiceinfophone,
               dr.hisorgcardproxyopername,
               dr.hisorgcardprincipal,
               dr.hiseqbusitcardissue,
               dr.hiseqbusitcardvalid,
               dr.be_papers_syn,
               dr.fullbusinessscope,
               dr.erpcustomerid,
               dr.receivername,
               dr.receiverphone,
               dr.lastordertime,
               0,
               ''
          from YSB_DRUGSTOREINFO dr
         where dr.DRUGSTOREID = rec_c.DRUGSTOREID;
      -- 平台中间表插入erp中间表后,将当前已插入的数据的is_zx(是否执行)字段修改为‘是’
      update YSB_DRUGSTOREINFO
         set sync_status = 1, sync_date = SYSDATE, SYNC_MSG = '药师帮客户资料[' || rec_c.DRUGSTOREID || '],生成ERP客户首营数据成功:'
       where DRUGSTOREID = rec_c.DRUGSTOREID;
    exception
      when others then
        ROLLBACK;
        v_errm := '药师帮客户资料[' || rec_c.DRUGSTOREID || '],生成ERP客户首营数据失败:' ||
                  SQLERRM || chr(10);
        --更新状态
        UPDATE YSB_DRUGSTOREINFO a
           SET sync_status = -1, sync_date = SYSDATE, SYNC_MSG = v_errm
         WHERE nvl(a.sync_status, 0) = 0
           AND DRUGSTOREID = rec_c.DRUGSTOREID;
        COMMIT;
        CONTINUE;
    end;
    commit;
  end loop;

end;

B2B中间表客户转首营(新版首营T_CHK_VENDOR)

CREATE OR REPLACE PROCEDURE CPROC_B2B客户转首营(AN_BILLSOURCE IN VARCHAR2) AS
  V_COMPID   T_VENCUS.COMPID%TYPE;
  V_COUNT    NUMBER(10);
  V_CHECKNO  T_CHK_CUSTOMER.CHECKNO%TYPE;
  V_VENCUSNO T_VENCUS.VENCUSNO%TYPE;
  V_HS       NUMBER(10);
  V_ERRM     VARCHAR2(2000);
BEGIN
  FOR REC IN (SELECT *
                FROM H2.H2_VENCUS H
               WHERE NVL(H.FLAG, 0) = 0
               AND TO_DATE(LASTORDERTIME, 'YYYY-MM-DD') > TO_DATE('2025-03-11', 'YYYY-MM-DD')
               AND H.BILLSOURCE = AN_BILLSOURCE) LOOP
    V_COMPID := 1;

    -- 判断客户是否已生成往来单位
    SELECT COUNT(*)
      INTO V_COUNT
      FROM T_VENCUS T
     WHERE T.VENCUSNAME = REC.DRUGSTORENAME
       AND T.SALENUMBER = REC.TAXNO
       AND T.COMPID = V_COMPID;

    IF V_COUNT = 0 THEN
      -- 判断是否已生成首营企业
      SELECT COUNT(*), MAX(VENDORCHKNO)
        INTO V_HS, V_CHECKNO
        FROM T_CHK_VENDOR T
       WHERE T.VENDORNAME = REC.DRUGSTORENAME
         AND T.BAK_CHAR3 = REC.TAXNO
         AND STATUS <> 2;

      IF V_HS = 0 THEN
        V_CHECKNO  := F_GET_SERIAL('CHV', NULL);
        V_VENCUSNO := F_GET_SERIAL('CUS', NULL);

        BEGIN
          -- 插入首营企业主表
          INSERT INTO T_CHK_VENDOR
            (vencusflag, /* 首营供应商标志 */
             vend_type, /* 供应商类型 */
             vendorsubno, /* 助记码 */
             VENDORCHKNO, /* 首营供应商编号 */
             vendorcode, /* 往来单位自编码 */
             VENDORNO, /* 供应商编号 */
             VENDORNAME, /* 供应商名称 */
             VENDORTYPE, /* 供应商类型 */
             BAK_LCHAR10, /* 商品扩展属性长字符10 */
             ADDRESS, /* 地址 */
             HEADNAME, /* 法人代表 */
             POSTCODE, /* 邮编 */
             ORDERFAX, /* 传真 */
             ORDERNAME, /* 联系人 */
             ORDERTEL, /* 联系电话 */
             LEECHDOMLIC, /* 许可证编号 */
             LEECHDOMDATE, /* 许可证有效期 */
             CHKFILENO, /* 文件归档编号 */
             GRANT_ORG1, /* 营业执照发证机关 */
             BUS_TYPE2, /* 经营方式 */
             BAK_CHAR3, /* 字符型备用字段3 */
             SCOPE1, /* 营业执照经营范围 */
             BUSINESSLIC, /* 营业执照编号 */
             BUSINESSDATE, /* 营业执照有效期 */
             BAK_CHAR4, /* 字符型备用字段4 */
             MANAGER_CHK, /* 领导审核意见 */
             REG_SUM1, /* 注册资本 */
             BAK_CHAR5, /* 字符型备用字段5 */
             QC_TECHNICIAN_COMMENT, /* 质管员意见 */
             AREACODE, /* 地区编码 */
             SCOPE2, /* 生产经营范围 */
             CREATETIME, /* 创建时间 */
             CREATEUSER, /* 创建人 */
             STATUS, /* 状态 */
             BAK_LCHAR09, /* 商品扩展属性长字符9 */
             BAK_LCHAR08, /* 商品扩展属性长字符8 */
             BUYER_CHK, /* 业务员意见 */
             GRANT_ORG3, /* 税务登记证发证机关 */
             EXECDATE, /* 生效时间 */
             CHECKBIT1, /* 审核标志1 */
             CHECKBIT2, /* 审核标志2 */
             CHECKBIT3, /* 审核标志3 */
             CHECKBIT4, /* 审核标志4 */
             CHECKBIT5, /* 审核标志5 */
             COMM_NAME, /* 授权人姓名 */
             COMM_DATE, /* 授权日期 */
             BUYER_DATE, /* 业务员审批时间 */
             BUS_DATE, /* 经营部门审核时间 */
             GSP_DATE, /* 质检审核时间 */
             MANAGER_DATE, /* 主管审批时间 */
             LASTMODIFY, /* 最后修改时间 */
             LASTTIME, /* 最后修改时间(可能为时间戳) */
             BAK_LCHAR07, /* 商品扩展属性长字符7 */
             GSP_NO, /* GSP证书 */
             BAK_DATE10, /* 日期型备用字段10 */
             GSP_END_DATE, /* GSP证书有效期至 */
             APPLY_USERID, /* 申请人 */
             BUYER_NAME, /* 业务审批人 */
             GSP_NAME, /* 质检审核人姓名 */
             MANAGER_NAME, /* 领导姓名 */
             BAK_LCHAR06, /* 商品扩展属性长字符6 */
             ASSI_IDCARD, /* 受托人身份证号码 */
             GSP_CHK, /* 质管部意见 */
             BAK_LCHAR05, /* 商品扩展属性长字符5 */
             BAK_DATE9, /* 日期型备用字段9 */
             COMPID, /* 企业编号 */
             INVOICETYPE, /* 发票类型 */
             SALEZONE, /* 销售区域 */
             IFCREDIT, /* 是否有信用记录 */
             OWNERID, /* 货主编号 */
             DEPARTMENT, /* 部门 */
             PRICE_GROUP, /* 价格组 */
             BUS_TYPE3, /* 付款方式 */
             PAYTYPE, /* 付款账期 */
             CORP_TYPE1, /* 营业执照企业类型 */
             TAXNO, /* 税号 */
             BAK_LCHAR04, /* 商品扩展属性长字符4 */
             BAK_LCHAR03, /* 商品扩展属性长字符3 */
             NEW_FLAG, /* 是否首营新增 */
             PROVINCE, /* 省份 */
             CITY, /* 城市 */
             AREA, /* 区域 */
             IFHAVE1, /* 是否有营业执照 */
             IFHAVE2, /* 是否有许可证 */
             IFHAVE3, /* 是否有税务登记证 */
             IFDEPUTY, /* 是否有业务代表 */
             IFGOODSCHK, /* 商品是否首营审批 */
             BAK_LCHAR02, /* 商品扩展属性长字符2 */
             BUS_GOODS_NAME, /* 经营范围名称 */
             YSBNO, /* 医疗器械生产(经营)许可证编号 */
             YYCNO, /* 毒性药品生产(经营)许可证编号 */
             XYYNO, /* 麻醉药品生产(经营)许可证编号 */
             BAK_LCHAR01, /* 商品扩展属性长字符1 */
             BAK_CHAR10, /* 字符型备用字段10 */
             BAK_CHAR9, /* 字符型备用字段9 */
             BANK, /* 开户银行 */
             BANKNO, /* 银行账号 */
             BAK_CHAR6, /* 字符型备用字段6 */
             BAK_CHAR7, /* 字符型备用字段7 */
             taxdate, /* 税务登记证有效期 */
             saler, /* 业务员备案情况 */
             assi_name, /* 受托人姓名 */
             header2,
             create_depid,
             warehouseaddress )
            SELECT 2, --- 往来单位类型,固定值 2
                   1, --- 供应商类型,药品类型,固定值 1
                   f_st2zjm(rec.DRUGSTORENAME), --- 助记码,通过 `f_st2zjm` 函数生成,传入药店名称 `DRUGSTORENAME`
                   V_CHECKNO, --- 首营供应商编号,字段名 `V_CHECKNO`
                   V_VENCUSNO, --- 供应商编号,字段名 `V_VENCUSNO`
                   V_VENCUSNO, --- 供应商编号,重复字段名 `V_VENCUSNO`
                   REC.DRUGSTORENAME, --- 供应商名称,取自 `DRUGSTORENAME` 字段
                   CASE
                     WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR --- 如果药店名称包含‘诊所’
                          INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR --- 或包含‘卫生’
                          INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR --- 或包含‘医院’
                          INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN --- 或包含‘门诊’
                      '4' --- 如果匹配到,返回 '32',可能是某种类型标识
                     WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN --- 如果药店名称包含‘连锁’
                      '5' --- 返回 '14',可能是连锁药店类型标识
                     ELSE
                      '1' --- 默认返回 '1',表示其他类型
                   END,
                   SUBSTR(REC.DRUGSTORENAME, 1, 15), --- 商品扩展属性,取药店名称的前15个字符
                   REC.REGADRESS, --- 地址,取自 `REGADRESS` 字段
                   REC.PROXYOPERNAME, --- 法人代表,取自 `PROXYOPERNAME` 字段
                   NULL, --- 邮编,固定值为 NULL
                   NULL, --- 传真,固定值为 NULL
                   REC.SALESMANNAME, --- 联系人,取自 `SALESMANNAME` 字段
                   CASE
                     WHEN REC.SALESMANPHONE IS NOT NULL THEN --- 如果销售员电话不为空
                      REC.SALESMANPHONE --- 返回销售员电话
                     ELSE
                      REC.SELLERPHONE --- 否则返回卖家电话
                   END,
                   CASE
                     WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 THEN --- 如果药店名称包含‘诊所’或‘卫生’
                      REC.HISORGCARDNO --- 返回历史组织卡号
                     ELSE
                      REC.DRUGBUSITCARDNO --- 否则返回药品经营许可证编号
                   END,
                   CASE
                     WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 THEN
                      CASE
                       WHEN REC.HISORGCARDVALID = '长期' THEN --- 如果有效期是长期
                        TO_DATE('2099-12-31', 'YYYY-MM-DD') --- 设为长期有效的日期
                       ELSE
                        TO_DATE(SUBSTR(REC.HISORGCARDVALID, 1, 10),
                                'YYYY/MM/DD') --- 否则从字段中提取有效期日期
                     END
                     ELSE
                      CASE
                       WHEN REC.DRUGBUSIVALIDITY = '长期' THEN --- 如果药品经营许可证有效期是长期
                        TO_DATE('2099-12-31', 'YYYY-MM-DD') --- 设为长期有效的日期
                       ELSE
                        TO_DATE(SUBSTR(REC.DRUGBUSIVALIDITY, 1, 10),
                                'YYYY/MM/DD') --- 否则从字段中提取有效期日期
                     END
                   END,
                   null,-- REC.DRUGSTORENAME, --- 档案编号,取自药店名称
                   NULL, --- 发证机关,固定值为 NULL
                   CASE
                     WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN
                      '4' --- 返回 '32',表示某种类型
                     WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN
                      '1' --- 返回 '14',表示连锁药店类型
                     ELSE
                      '1' --- 默认返回 '1',表示其他类型
                   END,
                   REC.REGADRESS, --- 地址,取自 `REGADRESS` 字段
                   '', --- 许可范围,固定为空字符串
                   REC.BUSICARDNO, --- 营业执照编号,取自 `BUSICARDNO` 字段
                   TO_DATE(DECODE(REC.BUSICARDVALID, --- 将营业执照有效期字段转换为日期格式
                                  '长期',
                                  '2099-12-31', --- 如果是长期,设为最大有效日期
                                  SUBSTR(REC.BUSICARDVALID, 1, 10)), --- 否则,提取有效期并转换为日期
                           'YYYY-MM-DD'),
                   NVL(REC.PROXYOPERNAME,REC.hisorgcardproxyopername ), --- 法人代表,取自 `PROXYOPERNAME` 字段
                   NULL, --- 质管中心意见,固定为 NULL
                   NULL, --- 注册资金,固定为 NULL
                   REC.DRUGSTORENAME, --- 经营性质,取药店名称
                   NULL, --- 物流中心意见,固定为 NULL
                   CASE
                     WHEN F_GET_AREACODE(REC.PROVINCENAME) IS NOT NULL THEN
                      F_GET_AREACODE(REC.PROVINCENAME) --- 通过 `F_GET_AREACODE` 获取省份的区域编码
                     ELSE
                      '00' --- 如果没有获取到,设为 '00'
                   END,
                   REC.BUSISCOPE, --- 经营范围,取自 `BUSISCOPE` 字段
                   SYSDATE, --- 创建时间,系统当前日期
                   10004, --- 创建人,固定值 
                   0, --- 状态,固定值 0
                   SUBSTR(REC.REGADRESS, 1, 40), --- 地址扩展属性,取地址的前40个字符
                   REC.DRUGSTORETYPE, --- 经营性质,取自 `DRUGSTORETYPE` 字段
                   NULL, --- 销售员意见,固定为 NULL
                   NULL, --- 发证机关,固定为 NULL
                   '', --- 生效时间,固定为空字符串
                   0, --- 审核标志1,固定值 0
                   0, --- 审核标志2,固定值 0
                   0, --- 审核标志3,固定值 0
                   0, --- 审核标志4,固定值 0
                   0, --- 审核标志5,固定值 0
                   REC.SALESMANNAME, --- 销售员姓名,取自 `SALESMANNAME` 字段
                   TO_DATE(REC.PURCHASEPAPERVALID, 'YYYY/MM/DD'), --- 采购文件有效期,格式化为日期
                   NULL, --- 主管审批时间,固定为 NULL
                   NULL, --- 质管员审批时间,固定为 NULL
                   NULL, --- 经营部门审批时间,固定为 NULL
                   NULL, --- 最后修改时间,固定为 NULL
                   10004, --- 申请人,固定为
                   SYSDATE, --- 最后修改时间,系统当前日期
                   NULL, --- GSP发证机关,固定为 NULL
                   REC.GSPCARDNO, --- GSP证书编号,取自 `GSPCARDNO` 字段
                   TO_DATE(SUBSTR(REC.GSPISSUE, 1, 10), 'YYYY/MM/DD'), --- GSP证书发证日期,转换为日期格式
                   TO_DATE(SUBSTR(REC.GSPVALIDITY, 1, 10), 'YYYY/MM/DD'), --- GSP证书有效期,转换为日期格式
                   '10017', --- 销售员标识,固定值 '10017'
                   NULL, --- 银行信息,固定为 NULL
                   NULL, --- 银行账户,固定为 NULL
                   NULL, --- 银行信息,固定为 NULL
                   V_VENCUSNO, --- 供应商编号,取自 `V_VENCUSNO` 字段
                   REC.SELIDENTITYNO, --- 受托人身份证号,取自 `SELIDENTITYNO` 字段
                   NULL, --- 受托人姓名,固定为 NULL
                   NULL, --- 银行账户地址,固定为 NULL
                   NULL, --- 经营范围名称,固定为 NULL
                   V_COMPID, --- 企业编号,取自 `V_COMPID` 字段
                   CASE
                     WHEN REC.INVOICETYPE = '2' THEN
                      REC.INVOICETYPE --- 如果发票类型为 '2',则返回发票类型
                     ELSE
                      '51' --- 否则返回 '51'
                   END,
                   NULL, --- 字符型备用字段,固定为 NULL
                   '1', --- 是否首营新增,固定值 '1'
                   '01', --- 省份编码,固定值 '01'
                   '01', --- 市区编码,固定值 '01'
                   CASE
                     WHEN REC.BILLSOURCE IN (1, 2, 3) THEN
                      12 --- 根据来源判断,返回固定值 '1001'
                   END,
                   '01', --- 备用字段,固定值 '01'
                   '01', --- 备用字段,固定值 '01'
                   CASE
                     WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR
                          INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN
                      '32' --- 如果包含诊所、卫生等,则返回 '32'
                     WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN
                      '14' --- 否则,如果包含连锁,返回 '14'
                     ELSE
                      '1' --- 默认返回 '1'
                   END,
                   rec.taxno, --- 统一社会信用代码,取自 `TAXNO`
                   REC.DRUGSTORENAME, --- 药店名称,取自 `DRUGSTORENAME`
                   NULL, --- 银行账户地址,固定为空
                   '1', --- 是否新增首营,固定值 '1'
                   CASE
                     WHEN F_GET_AREACODE(REC.PROVINCENAME) IS NOT NULL THEN
                      F_GET_AREACODE(REC.PROVINCENAME) --- 省份的区域编码
                     ELSE
                      '00' --- 没有匹配到则返回 '00'
                   END,
                   CASE
                     WHEN F_GET_AREACODE(REC.CITYNAME) IS NOT NULL THEN
                      F_GET_AREACODE(REC.CITYNAME) --- 城市的区域编码
                     ELSE
                      NULL --- 如果没有匹配到,返回 NULL
                   END,
                   CASE
                     WHEN F_GET_AREACODE(REC.DISTRICTNAME) IS NOT NULL THEN
                      F_GET_AREANAME(REC.DISTRICTNAME) --- 区域名称
                     ELSE
                      NULL --- 没有匹配返回 NULL
                   END, --- 地区编码相关字段
                   '1', --- 固定值 '1'
                   '1', --- 固定值 '1'
                   '1', --- 固定值 '1'
                   '1', --- 固定值 '1'
                   '1', --- 固定值 '1'
                   NULL, --- 银行地址,固定为 NULL
                   '', --- 经营范围名称,固定为空字符串
                   CASE
                     WHEN REC.BILLSOURCE = 1 THEN
                      NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                   END,
                   CASE
                     WHEN REC.BILLSOURCE = 2 THEN
                      NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                   END,
                   CASE
                     WHEN REC.BILLSOURCE = 3 THEN
                      NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                   END,
                   CASE
                     WHEN REC.INVOICETYPE = '2' THEN
                      REC.INVOICEINFONAME
                     ELSE
                      ''
                   END, -- 发票信息名称:根据REC.INVOICETYPE决定
                   REC.TAXNO, -- 税号
                   REC.INVOICEINFOPHONE, -- 发票信息电话
                   REC.BANKNAME, -- 开户银行
                   REC.BANKCARDNO, -- 银行账号
                   REC.BUSICARDADDRESS, -- 营业执照地址
                   REC.HISORGCARDPRINCIPAL, -- 医疗机构负责人
                   TO_DATE(DECODE(REC.BUSICARDVALID,
                                  '长期',
                                  '2099-12-31',
                                  SUBSTR(REC.BUSICARDVALID, 1, 10)),
                           'YYYY-MM-DD'), -- 营业执照有效期(备用)
                   '10017', -- 业务员ID
                   REC.salesmanname ,-- 销售员姓名
                   NVL(REC.PROXYOPERNAME,REC.hisorgcardproxyopername ),
                   5,
                   REC.REGADRESS
              from DUAL;

          /*SELECT 2, ---往来单位类型
                     1, --药品 
                     f_st2zjm(rec.DRUGSTORENAME), ---助记码
                     V_CHECKNO,
                     V_VENCUSNO,
                     V_VENCUSNO,
                     REC.DRUGSTORENAME,
                     CASE
                       WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN
                        '32'
                       WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN
                        '14'
                       ELSE
                        '1'
                     END,
                     SUBSTR(REC.DRUGSTORENAME, 1, 15),
                     REC.REGADRESS,
                     REC.PROXYOPERNAME,
                     NULL, -- 邮编
                     NULL, -- 联系人传真
                     REC.SALESMANNAME,
                     CASE
                       WHEN REC.SALESMANPHONE IS NOT NULL THEN
                        REC.SALESMANPHONE
                       ELSE
                        REC.SELLERPHONE
                     END,
                     CASE
                       WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 THEN
                        REC.HISORGCARDNO
                       ELSE
                        REC.DRUGBUSITCARDNO
                     END,
                     CASE
                       WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 THEN
                        CASE
                         WHEN REC.HISORGCARDVALID = '长期' THEN
                          TO_DATE('2099-12-31', 'YYYY-MM-DD')
                         ELSE
                          TO_DATE(SUBSTR(REC.HISORGCARDVALID, 1, 10),
                                  'YYYY/MM/DD')
                       END
                       ELSE
                        CASE
                         WHEN REC.DRUGBUSIVALIDITY = '长期' THEN
                          TO_DATE('2099-12-31', 'YYYY-MM-DD')
                         ELSE
                          TO_DATE(SUBSTR(REC.DRUGBUSIVALIDITY, 1, 10),
                                  'YYYY/MM/DD')
                       END
                     END,
                     REC.DRUGSTORENAME, -- 档案编号
                     NULL, -- 发证机关
                     CASE
                       WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN
                        '32'
                       WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN
                        '14'
                       ELSE
                        '1'
                     END,
                     REC.REGADRESS,
                     '', -- 许可范围
                     REC.BUSICARDNO,
                     TO_DATE(DECODE(REC.BUSICARDVALID,
                                    '长期',
                                    '2099-12-31',
                                    SUBSTR(REC.BUSICARDVALID, 1, 10)),
                             'YYYY-MM-DD'),
                     REC.PROXYOPERNAME,
                     NULL, -- 质管中心意见
                     NULL, -- 注册资金
                     REC.DRUGSTORENAME,
                     NULL, -- 物流中心意见
                     CASE
                       WHEN F_GET_AREACODE(REC.PROVINCENAME) IS NOT NULL THEN
                        F_GET_AREACODE(REC.PROVINCENAME)
                       ELSE
                        '00'
                     END,
                     REC.BUSISCOPE,
                     SYSDATE,
                     1006,
                     0,
                     SUBSTR(REC.REGADRESS, 1, 40),
                     REC.DRUGSTORETYPE, -- 经营性质
                     NULL, -- 销售员意见
                     NULL, -- 发证机关
                     '', -- 生效时间
                     0,
                     0,
                     0,
                     0,
                     0,
                     REC.SALESMANNAME,
                     TO_DATE(REC.PURCHASEPAPERVALID, 'YYYY/MM/DD'),
                     NULL,
                     NULL,
                     NULL,
                     NULL,
                     1006,
                     SYSDATE,
                     NULL, -- GSP发证机关
                     REC.GSPCARDNO,
                     TO_DATE(SUBSTR(REC.GSPISSUE, 1, 10), 'YYYY/MM/DD'),
                     TO_DATE(SUBSTR(REC.GSPVALIDITY, 1, 10), 'YYYY/MM/DD'),
                     '1017', -- 销售员标识
                     NULL,
                     NULL,
                     NULL,
                     V_VENCUSNO,
                     REC.SELIDENTITYNO,
                     NULL,
                     NULL,
                     NULL,
                     V_COMPID,
                     CASE
                       WHEN REC.INVOICETYPE = '2' THEN
                        REC.INVOICETYPE
                       ELSE
                        '51'
                     END,
                     NULL,
                     '1',
                     '01',
                     '01',
                     CASE
                       WHEN REC.BILLSOURCE IN (1, 2, 3) THEN
                        1001
                     END,
                     '01',
                     '01',
                     CASE
                       WHEN INSTRB(REC.DRUGSTORENAME, '诊所', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '卫生', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '医院', 1, 1) > 1 OR
                            INSTRB(REC.DRUGSTORENAME, '门诊', 1, 1) > 1 THEN
                        '32'
                       WHEN INSTRB(REC.DRUGSTORENAME, '连锁', 1, 1) > 1 THEN
                        '14'
                       ELSE
                        '1'
                     END,
                     rec.taxno, --统一社会信用代码
                     REC.DRUGSTORENAME,
                     NULL, -- 银行账户地址
                     '1', -- 是否新增首营
                     CASE
                       WHEN F_GET_AREACODE(REC.PROVINCENAME) IS NOT NULL THEN
                        F_GET_AREACODE(REC.PROVINCENAME)
                       ELSE
                        '00'
                     END,
                     CASE
                       WHEN F_GET_AREACODE(REC.CITYNAME) IS NOT NULL THEN
                        F_GET_AREACODE(REC.CITYNAME)
                       ELSE
                        NULL
                     END,
                     CASE
                       WHEN F_GET_AREACODE(REC.DISTRICTNAME) IS NOT NULL THEN
                        F_GET_AREANAME(REC.DISTRICTNAME)
                       ELSE
                        NULL
                     END, ----- 地区
                     '1',
                     '1',
                     '1',
                     '1',
                     '1',
                     NULL, -- 银行地址
                     '', -- 经营范围名称
                     CASE
                       WHEN REC.BILLSOURCE = 1 THEN
                        NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                     END,
                     CASE
                       WHEN REC.BILLSOURCE = 2 THEN
                        NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                     END,
                     CASE
                       WHEN REC.BILLSOURCE = 3 THEN
                        NVL(REC.DRUGSTOREID, REC.CUSTOMERID)
                     END,
                     CASE
                       WHEN REC.INVOICETYPE = '2' THEN
                        REC.INVOICEINFONAME
                       ELSE
                        ''
                     END,
                     REC.TAXNO,
                     REC.INVOICEINFOPHONE,
                     REC.BANKNAME,
                     REC.BANKCARDNO,
                     REC.BUSICARDADDRESS,
                     REC.HISORGCARDPRINCIPAL,
                     TO_DATE(DECODE(REC.BUSICARDVALID,
                                    '长期',
                                    '2099-12-31',
                                    SUBSTR(REC.BUSICARDVALID, 1, 10)),
                             'YYYY-MM-DD'),
                     '168', ---业务员
                     REC.salesmanname
                FROM DUAL;
          */
          --循环插入经营范围
          BEGIN
            FOR REC_JY IN (SELECT A.DRUGSTOREID,
                                  A.fullbusinessscope,
                                  REGEXP_SUBSTR(A.fullbusinessscope,
                                                '[^,]+',
                                                1,
                                                L) AS CLASSCODE18
                             FROM H2_VENCUS A,
                                  (SELECT LEVEL L
                                     FROM DUAL
                                   CONNECT BY LEVEL <= 100)
                            WHERE L(+) <=
                                  LENGTH(A.fullbusinessscope) -
                                  LENGTH(REPLACE(A.fullbusinessscope, ',')) + 1
                              AND A.DRUGSTOREID = REC.DRUGSTOREID) LOOP
              INSERT INTO T_CHK_VENCUS_RANGE
                (VENDORCHKNO, --首营单号
                 COMPID, --企业编码
                 VENCUSNO, --往来单位编码
                 CLASSCODE, --经营范围分类编码
                 STATUS, --状态
                 STAMP, --时间戳
                 LASTMODIFY, --最终修改人
                 LASTTIME, --最终修改时间
                 NOTES) --备注
                SELECT DISTINCT V_CHECKNO,
                                V_COMPID,
                                V_VENCUSNO,
                                ysb.classcode_hd,
                                1,
                                '',
                                '10004',
                                SYSDATE,
                                NULL
                  FROM D_RANG_YSB YSB
                 WHERE YSB.CLASSCODE = REC_JY.CLASSCODE18
                   AND YSB.CLASSCODE_HD IS NOT NULL
                   AND NOT EXISTS
                 (SELECT 1
                          FROM T_CHK_VENCUS_RANGE tc
                         WHERE tc.vendorchkno = V_CHECKNO
                           AND tc.compid = V_COMPID
                           AND tc.vencusno = V_VENCUSNO
                           AND ysb.classcode_hd = tc.CLASSCODE);
              COMMIT;
            END LOOP REC_JY;
          END;

          begin
            --001 药品经营许可证
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag,
               GRANT_DATE)
              select 1,
                     v_vencusno,
                     3 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     to_date(decode(drugbusivalidity,
                                    '长期',
                                    '2099-12-31',
                                    substr(drugbusivalidity, 1, 10)),
                             'YYYY-MM-DD') as invalidate,
                     ysb_kh.drugbusitcardno as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     drugbusiurl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null,
                     to_date(DRUGBUSIISSUE, 'yyyy/mm/dd')
                from h2.h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
            --003 医疗器械经营许可证
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag)
              select 1,
                     v_vencusno,
                     5 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     to_date(decode(hiseqbusitcardvalid,
                                    '长期',
                                    '2099-12-31',
                                    substr(hiseqbusitcardvalid, 1, 10)),
                             'YYYY-MM-DD') as invalidate,
                     hiseqbusitcardno as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     hiseqbusitcardurl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null
                from h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
            --004 医疗器械备案凭证
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               --invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag)
              select 1,
                     v_vencusno,
                     7 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     --to_date(hiseqbusitcardvalid, 'YYYYMMDD') as invalidate,
                     HISEQRECORD    as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     hiseqRecordUrl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null
                from h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
            --005 营业执照
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag,
               GRANT_DATE)
              select 1,
                     v_vencusno,
                     1 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     to_date(decode(busicardvalid,
                                    '长期',
                                    '2099-12-31',
                                    substr(busicardvalid, 1, 10)),
                             'YYYY-MM-DD') as invalidate,
                     ysb_kh.busicardno as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     busicardUrl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null,
                     to_date(BUSICARDISSUE, 'yyyy/mm/dd')
                from h2.h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
            --007 医疗机构执业许可证
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag,
               GRANT_DATE)
              select 1,
                     v_vencusno,
                     8 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     to_date(decode(HISORGCARDVALID,
                                    '长期',
                                    '2099-12-31',
                                    substr(HISORGCARDVALID, 1, 10)),
                             'YYYY-MM-DD') as invalidate,
                     ysb_kh.HISORGCARDNO as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     hisOrgcardUrl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null,
                     to_date(HISORGCARDISSUE, 'yyyy/mm/dd')
                from h2.h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
            --008 食品经营许可证
            insert into t_chk_vencus_certificate_qutry
              (compid,
               vencusno,
               certificateid,
               invalidate,
               photo_no,
               lastmodify,
               lasttime,
               invalidate_status,
               photono_status,
               status,
               notes,
               idcard,
               classgroupno,
               classcodelist,
               classnamelist,
               operate_flag)
              select 1,
                     v_vencusno,
                     10 as certificateid, --要根据业务系统t_certificate_set的类型 相应改变
                     to_date(decode(foodBusiValid,
                                    '长期',
                                    '2099-12-31',
                                    substr(foodBusiValid, 1, 10)),
                             'YYYY-MM-DD') as invalidate,
                     ysb_kh.foodBusiNo as photo_no,
                     10004,
                     sysdate,
                     0,
                     0,
                     0,
                     foodBusiUrl, --图片地址存备注
                     null,
                     null,
                     null,
                     null,
                     null
                from h2_vencus ysb_kh
               where ysb_kh.drugstoreid = rec.drugstoreid;
          end;
          INSERT INTO t_chk_vencus_saler
            (compid,
             vencusno,
             ownerid,
             reckonerid,
             saler,
             paytype,
             status,
             whlgroupid,
             whlsign,
             cashtype,
             isdefault,
             vendorchkno)
          VALUES
            (1,
             V_VENCUSNO,
             '01',
             '01',
             10017,
             '01',
             1,
             12,
             0,
             '01',
             0,
             V_CHECKNO);

          -- 子结算户和部门业务员
          BEGIN
            INSERT INTO T_CHK_VENCUS_SUBITEM
              (VENDORCHKNO,
               VENCUSNO,
               SUBITEMID,
               SUBITEMNAME,
               NOTES,
               STAMP,
               ADDRESS,
               POSTCODE,
               CONTACT,
               PHONE,
               FAX,
               MOBILE,
               EMAIL,
               COMPID,
               ISDEFAULT,
               C_SUBITEMID,
               C_VENCUSNO,
               CASHTYPE,
               PAYTYPE,
               SUBITEM_STATUS,
               INVALIDATE,
               STATUS)
              SELECT V_CHECKNO,
                     V_VENCUSNO,
                     '0',
                     '默认子结算户',
                     '',
                     '',
                     REC.REGADRESS,
                     '',
                     REC.SALESMANNAME,
                     CASE
                       WHEN REC.SALESMANPHONE IS NOT NULL THEN
                        REC.SALESMANPHONE
                       ELSE
                        REC.SELLERPHONE
                     END,
                     '',
                     CASE
                       WHEN REC.SALESMANPHONE IS NOT NULL THEN
                        REC.SALESMANPHONE
                       ELSE
                        REC.SELLERPHONE
                     END,
                     '',
                     1,
                     1,
                     '',
                     '',
                     '01',
                     '01',
                     '1',
                     '',
                     1
                FROM DUAL;
          END;

          -- 更新处理标志
          UPDATE H2.H2_VENCUS
             SET FLAG = 1
           WHERE DRUGSTOREID = REC.DRUGSTOREID
             AND BILLSOURCE = REC.BILLSOURCE;

        EXCEPTION
          WHEN OTHERS THEN
            ROLLBACK;
            V_ERRM := SUBSTR(SQLERRM, 1, 1900);
            UPDATE H2.H2_VENCUS
               SET FLAG = 2, ERR = SYSDATE || '---' || V_ERRM
             WHERE DRUGSTOREID = REC.DRUGSTOREID
               AND BILLSOURCE = REC.BILLSOURCE;
            COMMIT;
            CONTINUE;
        END;
      ELSE
        -- 更新外部系统编号
        IF REC.BILLSOURCE = 1 THEN
          UPDATE T_CHK_CUSTOMER
             SET YSBNO = NVL(REC.CUSTOMERID, REC.DRUGSTOREID)
           WHERE CHECKNO = V_CHECKNO;
        ELSIF REC.BILLSOURCE = 2 THEN
          UPDATE T_CHK_CUSTOMER
             SET YYCNO = NVL(REC.CUSTOMERID, REC.DRUGSTOREID)
           WHERE CHECKNO = V_CHECKNO;
        ELSE
          UPDATE T_CHK_CUSTOMER
             SET XYYNO = NVL(REC.CUSTOMERID, REC.DRUGSTOREID)
           WHERE CHECKNO = V_CHECKNO;
        END IF;

        UPDATE H2.H2_VENCUS H
           SET FLAG = 1, ERR = '客户已生成首营企业,单号为' || V_CHECKNO
         WHERE DRUGSTOREID = NVL(REC.CUSTOMERID, REC.DRUGSTOREID);
      END IF;
    ELSE
      UPDATE H2.H2_VENCUS H
         SET FLAG = 1, ERR = '客户已存在'
       WHERE DRUGSTOREID = NVL(REC.CUSTOMERID, REC.DRUGSTOREID);
    END IF;
    COMMIT;
  END LOOP;
END;

B2B中间表转到批发申请单(客户这边是转到批发申请单的模式,转批发销售单的往下面看)

CREATE OR REPLACE PROCEDURE CPROC_B2B中间表转批发申请(an_billsource IN VARCHAR2) AS
  v_procname      t_proc_rep.procrepname%TYPE;
  P_APPLYNO       t_batsale_h.batsaleno%TYPE;
  v_busno         t_batsale_h.busno%TYPE;
  v_compid        t_batsale_h.compid%TYPE;
  v_vencusno      t_batsale_h.vencusno%TYPE;
  v_spsl          NUMBER(10);
  v_vencusname    t_vencus.vencusname%TYPE;
  v_saler         t_vencus_saler.saler%TYPE;
  v_paytype       t_vencus_saler.paytype%TYPE;
   v_reckonerid    t_vencus_saler.reckonerid%TYPE;
  v_whlgroupid    t_vencus_saler.whlgroupid%TYPE;
  v_cashtype      t_vencus_saler.cashtype%TYPE;
  v_subitemid     t_vencus_saler.subitemid%TYPE;
  v_errm          VARCHAR2(2000);
  v_addrid        t_road_addr.addrid%TYPE;
  v_drugcode      VARCHAR2(1000);
  v_pshs          NUMBER(10);
   v_ownerid       t_vencus_saler.ownerid%TYPE;
  v_invoicetype   t_vencus.invoicetype%TYPE;
BEGIN
  -- 检查是否有替换存储过程
  BEGIN
    SELECT procrepname INTO v_procname
    FROM t_proc_rep
    WHERE UPPER(procname) = UPPER('CPROC_B2B中间表转批发申请') AND status = 1;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      v_procname := NULL;
  END;

  IF v_procname IS NOT NULL THEN
    EXECUTE IMMEDIATE 'BEGIN ' || v_procname || '; END;';
    RETURN;
  END IF;

  -- 清除历史错误信息
  UPDATE h2.h2_batsale_h SET err = '' WHERE err LIKE '%资料审核中';

  -- 遍历待处理订单
  FOR rec IN (
    SELECT * FROM h2.h2_batsale_h h
    WHERE NVL(h.flag, 0) = 0
      AND h.billsource = an_billsource
      AND NOT EXISTS (
        SELECT 1 FROM t_batsale_h th
        WHERE th.sale_idbs =H.billsource
          AND th.djbh = h.djbh
          AND th.status <> '2'
      )
      AND EXISTS(SELECT 1 FROM t_vencus WHERE compid = 1 AND vencuscode = h.customerid)
  )
  LOOP
    v_compid := 1;
    v_busno := 1000;

    -- 检查订单明细
    SELECT COUNT(*) INTO v_pshs
    FROM h2.h2_batsale_d d
    WHERE d.djbh = rec.djbh AND d.billsource = rec.billsource;

    IF v_pshs = 0 THEN
      UPDATE h2.h2_batsale_h
      SET flag = 2, err = err || '单据' || rec.djbh || '订单来源' || rec.billsource || '没有明细数据'
      WHERE djbh = rec.djbh AND billsource = rec.billsource;
      COMMIT;
      CONTINUE;
    END IF;

    -- 获取客户信息
    BEGIN
      SELECT vencusno, vencusname, invoicetype
      INTO v_vencusno, v_vencusname, v_invoicetype
      FROM t_vencus
      WHERE compid = v_compid
        AND vencuscode = rec.customerid
        AND status = 1;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        UPDATE h2.h2_batsale_h
        SET flag = 2, err = err || '客户编码' || rec.customerid || '在ERP中找不到'
        WHERE djbh = rec.djbh AND billsource = rec.billsource;
        COMMIT;
        CONTINUE;
    END;

    -- 检查商品有效性
    BEGIN
      SELECT COUNT(*), WM_CONCAT(d.drugcode)
      INTO v_spsl, v_drugcode
      FROM h2.h2_batsale_d d
      WHERE d.djbh = rec.djbh
        AND d.billsource = rec.billsource
        AND NOT EXISTS(SELECT 1 FROM t_ware WHERE compid = v_compid AND warecode = d.drugcode);
    EXCEPTION
      WHEN OTHERS THEN
        v_spsl := 0;
        v_drugcode := NULL;
    END;

    IF v_spsl > 0 THEN
      UPDATE h2.h2_batsale_h
      SET flag = 2, err = err || '无效商品编码: ' || v_drugcode
      WHERE djbh = rec.djbh AND billsource = rec.billsource;
      COMMIT;
      CONTINUE;
    END IF;

    -- 获取子账户信息
   BEGIN
      SELECT '01', reckonerid, saler, paytype, whlgroupid, cashtype, subitemid
      INTO v_ownerid, v_reckonerid, v_saler, v_paytype, v_whlgroupid, v_cashtype, v_subitemid
      FROM t_vencus_saler
      WHERE vencusno = v_vencusno
        AND compid = v_compid
        AND status = 1
        AND ROWNUM = 1;
    EXCEPTION
      WHEN OTHERS THEN
        UPDATE h2.h2_batsale_h
        SET flag = 2, err = err || '客户未配置业务员信息'
        WHERE djbh = rec.djbh AND billsource = rec.billsource;
        COMMIT;
        CONTINUE;
    END;

    -- 生成批发申请单
    BEGIN
      P_APPLYNO := f_get_serial('ACB', v_busno);

     INSERT INTO t_batsaleapply_h (
    COMPID, BILLCODE, APPLYNO, VENCUSNO, BUSNO, WHLGROUPID, PAYTYPE, SALER, 
    CHECKBIT1, CHECKBIT2, CHECKBIT3, CHECKBIT4, CHECKBIT5, STATUS, CREATEUSER, 
    CREATETIME, NOTES, PICKUPTYPE, ACCCHKED, INVOICETYPE, SUBITEMID, LASTMODIFY, 
    LASTTIME, RECKONERID, OWNERID, ADDRID, VENCUSNAME, INDENTFLAG, CASHTYPE, ACCOUNT_DATE,DJBH,SALE_IDBS,BILLSOURCE   ) 
    VALUES (
        v_compid, 'ACB', P_APPLYNO, v_vencusno, v_busno, 12/* v_whlgroupid*/, v_paytype,
        v_saler, '0','0','0','0','0','0',168,sysdate , 'B2C平台[' || rec.djbh || ']',null,'0',rec.invoicetype, v_subitemid, 168,
        sysdate,v_reckonerid,v_ownerid, v_addrid,rec.drugstorename,'0',v_cashtype, SYSDATE,rec.djbh,rec.xsbs,rec.billsource
      );

      -- 插入明细
      INSERT INTO t_batsaleapply_d(
     APPLYNO, WAREID, PURPRICE, WAREQTY, CHECKQTY, WHLPRICE, BACKQTY, SALEPRICE, 
    STDPRICE, COMPURPRICE, PURTAX, SALERPRICE, LEASTPRICE, MAXWHLPRICE, AVGPURPRICE, 
    ROWNO, REDEEMSUM, EXTHOLDER, OLDWHLPRICE, FLAG, MAXQTY, MIDQTY, DEPOTQTY, BATSALEQTY,DJ_SN
      )
      SELECT P_APPLYNO, w.wareid, w.lastpurprice, d.shl, d.shl, d.dj,null,w.lastsaleprice,
      w.lastsaleprice,null,w.purtax,w.lastsaleprice,'0','0','0', d.dj_sn,
      '0','0','0','0',w.maxqty,w.midqty,'0','0',d.dj_sn
      FROM h2.h2_batsale_d d
      JOIN t_ware w ON d.drugcode = w.warecode AND w.compid = v_compid
      WHERE d.djbh = rec.djbh AND d.billsource = rec.billsource;

      -- 更新订单状态
      UPDATE h2.h2_batsale_h SET flag = 1
      WHERE djbh = rec.djbh AND billsource = rec.billsource;

      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
        v_errm := SUBSTR(SQLERRM, 1, 1900);
        UPDATE h2.h2_batsale_h
        SET flag = 2, err = v_errm
        WHERE djbh = rec.djbh AND billsource = rec.billsource;
        COMMIT;
    END;
  END LOOP;
END;

B2B平台订单转批发销售单 (带GSP校验)

CREATE OR REPLACE PROCEDURE P_HC_BATSALE_GSP(an_billsource in varchar2) AS

  v_procname    t_proc_rep.procrepname%TYPE;
  v_batsaleno   t_batsale_h.batsaleno%type;
  v_para2825    s_sys_ini.inipara%TYPE; --前台销售按批次还是效期出库存 0:按批次,1:按效期
  v_para2778    s_sys_ini.inipara%TYPE; --前台销售按批次还是效期出库存 0:按批次,1:按效期
  v_para8139    s_sys_ini.inipara%TYPE; --是否开启整件优先
  v_para2975    s_sys_ini.inipara%TYPE; --批发销售限制货位
  v_para2976    s_sys_ini.inipara%TYPE; --批发销售限制,批发申请转批发需要过滤的商品类别
  v_para2977    s_sys_ini.inipara%TYPE; --控制批发申请转批发,多少天以内的批次不允许出库。
  v_busno       t_batsale_h.busno%TYPE; --业务机构
  v_compid      t_batsale_h.compid%TYPE; --企业
  v_parawms0001 s_sys_ini.inipara%TYPE;
  v_vencusno    t_batsale_h.vencusno%type;
  v_spsl        number(10);
  v_warecode    t_ware.warecode%type;
  v_warename    t_ware.warename%type;
  v_vencusname  t_vencus.vencusname%type;
  v_ownerid     t_vencus_saler.ownerid%type;
  v_reckonerid  t_vencus_saler.reckonerid%type;
  v_saler       t_vencus_saler.saler%type;
  v_paytype     t_vencus_saler.paytype%type;
  v_whlgroupid  t_vencus_saler.whlgroupid%type;
  v_cashtype    t_vencus_saler.cashtype%type;
  v_subitemid   t_vencus_saler.subitemid%type;
  v_xxx         number(10);
  v_sywareqty   t_batsale_d.wareqty%type;
  v_wareqty     t_batsale_d.wareqty%type;
  v_rownum      t_batsale_d.rowno%type;
  v_errm        varchar2(2000);
  v_addrid      t_road_addr.addrid%type;
  v_drugcode    varchar2(1000);
  v_ptwareqty   number(16, 6);
  v_erpwareqty  number(16, 6);
  v_pshs        number(10);
  v_cnt_addr    number(5);
  v_invoicetype t_vencus.invoicetype%type;
  v_statussl    number(10);
  v_warecodehz  varchar2(1000);
  v_drugcode1    varchar2(1000);
  v_sps2        number(10);
  v_into_char    VARCHAR2(1000);
  v_inipara            s_sys_ini.inipara%TYPE;
  v_flag         NUMBER(10);
  v_classcode18    VARCHAR2(4000);
  v_classcode09    VARCHAR2(4000);
  v_jyfl         NUMBER(10);
  V_BAK1          VARCHAR2(4000);
BEGIN
  --是否有替换储存过程
  BEGIN
    SELECT procrepname
      INTO v_procname
      FROM t_proc_rep
     WHERE upper(procname) = upper('p_hc_batsale')
       AND status = 1;
  EXCEPTION
    WHEN no_data_found THEN
      v_procname := NULL;
  END;
  IF v_procname IS NOT NULL THEN
    BEGIN
      EXECUTE IMMEDIATE 'begin ' || v_procname || '; end;';
    END;
    RETURN;
  END IF;
  update h2.h2_batsale_h set err = '' where err like '%资料审核中';
  for rec in (select *
                from h2.h2_batsale_h h
               where nvl(h.flag, 0) = 0
                 and h.billsource = an_billsource
                 --AND h.djbh<>'457443468'
                 and not exists
-- 根据销售标识与单据来源进行过滤
               (select 1
                        from t_batsale_h th
                       where
                       th.sale_idbs = decode(h.billsource,
                                             1,
                                             '0401',
                                             2,
                                             '0405',
                                             3,
                                             '0406',
                                             4,
                                             '0302',
                                             5,
                                             '0303',
                                             6,
                                             '0408',
                                             '')
                    and th.djbh = h.djbh
                    and th.status <> '2') --增加过滤,避免多次接收
-- 拦截不存在与erp往来单位档案内的客户的订单
                 and exists (select 1
                        from t_vencus
                       where compid = 1
                         and vencuscode = h.customerid)
              ) loop
    v_compid := 1;
    v_busno  := 1000;
-- 判断订单是否有明细
    select count(*)
      into v_pshs
      from h2.h2_batsale_d d
     where d.djbh = rec.djbh
       and d.billsource = rec.billsource;
    if v_pshs = 0 then
      rollback;
      UPDATE h2.h2_batsale_h
         SET flag = 2,
             err  = err || '单据' || rec.djbh || '订单来源' || rec.billsource ||
                    '没有明细数据'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;
    --匹配往来单位

    begin
      select vencusno, vencusname, invoicetype
        into v_vencusno, v_vencusname, v_invoicetype
        from t_vencus t
       where t.compid = v_compid
         and t.vencuscode = rec.customerid
         AND t.status=1;
    exception
      when no_data_found then
        rollback;
        UPDATE h2.h2_batsale_h
           SET flag = 2,
               err  = err || '客户编码' || rec.customerid || '在erp中找不到'
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        commit;
        continue;
    end;
    --判断是否存在未审核的往来单位修改单
    select count(*)
      into v_statussl
      from t_vencus_snapshot t
     where t.vencusno = v_vencusno
       and t.compid = v_compid
       and status = 0;
    if v_statussl > 0 then
      rollback;
      UPDATE h2.h2_batsale_h
         SET flag = 0,
             err  = err || '客户编码' || rec.customerid || '资料审核中'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;
    -----------------客户证照效期-----------------
     BEGIN
       SELECT CERTIFICATENAME, STATUS
         INTO V_INTO_CHAR, V_INIPARA
         FROM (SELECT S.CERTIFICATENAME,
                      TO_CHAR(NVL(C.STATUS, NVL(S.STATUS, -1))) AS STATUS,
                      FLOOR(TRUNC(NVL(C.INVALIDATE, SYSDATE)) -
                            TRUNC(SYSDATE)) AS DAYS
                 FROM T_VENCUS V
                INNER JOIN T_VENCUS_CERTIFICATE C
                   ON (V.VENCUSNO = C.VENCUSNO)
                  AND C.COMPID = V_COMPID
                 LEFT JOIN T_CERTIFICATE_SET S
                   ON (C.CERTIFICATEID = S.CERTIFICATEID)
                WHERE S.VENCUSFLAG IN (0, 2)
                  AND NOT (TRIM(C.PHOTO_NO) IS NULL AND C.INVALIDATE IS NULL)
                  AND (NVL(S.VENCUSTYPELIST, ' ') = ' ' OR
                      INSTR(',' || S.VENCUSTYPELIST || ',',
                             ',' || V.VENCUSTYPE || ',') > 0)
                  AND NVL(C.STATUS, NVL(S.STATUS, -1)) <> 1 --1不提示不控制,-1提示且控制,0提示不控制
                  AND NVL(S.CLASSGROUPNO, '%') = '%'
                  AND TRUNC(SYSDATE) >
                      TRUNC(NVL(C.INVALIDATE, SYSDATE - 1)) - 30
                  AND V.VENCUSNO = V_VENCUSNO
                  AND V.COMPID = V_COMPID
                ORDER BY TO_CHAR(NVL(C.STATUS, NVL(S.STATUS, -1))),
                         FLOOR(TRUNC(NVL(C.INVALIDATE, SYSDATE)) -
                               TRUNC(SYSDATE))) K
        WHERE ROWNUM = 1;
       IF LENGTH(TRIM(NVL(V_INTO_CHAR, ' '))) > 0 AND V_INIPARA = '-1' THEN
         ROLLBACK;
         UPDATE H2.H2_BATSALE_H
            SET FLAG = 2,
                ERR  = ERR || '客户编码为' || V_VENCUSNO || '的客户证照【' ||
                       V_INTO_CHAR || '】效期已过期。'
         WHERE DJBH = REC.DJBH AND BILLSOURCE = REC.BILLSOURCE;
         COMMIT;
         CONTINUE;
       END IF;
     EXCEPTION
       WHEN NO_DATA_FOUND THEN
         NULL;
     END;
    -----------------客户证照效期-----------------
    ----------------客户经营范围------------------
        BEGIN
          SELECT a.classname
            INTO v_into_char
            FROM t_class_base a
           INNER JOIN t_vencus_range b
              ON (a.classcode = b.classcode)
           INNER JOIN t_vencus v
              ON (b.compid = v.compid AND b.vencusno = v.vencusno)
           WHERE rownum = 1
             AND b.compid = v_compid
             AND b.vencusno = v_vencusno
             AND b.status = 1
             AND v.vencusflag IN (0, 2);
        EXCEPTION
          WHEN no_data_found THEN
           rollback;
        UPDATE h2.h2_batsale_h
           SET flag = 2,
               err  = err || '客户编码' || rec.customerid || ',没有任何经营范围'
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        commit;
        continue;
        END;
     ----------------客户经营范围------------------

    --匹配子结账户
    begin
      select /*t.ownerid,*/
       '01',
       t.reckonerid,
       t.saler,
       t.paytype,
       t.whlgroupid,
       t.cashtype,
       t.subitemid
        into v_ownerid,
             v_reckonerid,
             v_saler,
             v_paytype,
             v_whlgroupid,
             v_cashtype,
             v_subitemid
        from t_vencus_saler t
       where t.vencusno = v_vencusno
         and t.compid = v_compid
         and status = 1
         and rownum = 1;
    exception
      when others then
        /* v_ownerid    := null;
        v_reckonerid := null;
        v_saler      := null;
        v_paytype    := null;
        v_whlgroupid := null;
        v_cashtype   := null;
        v_subitemid  := null;*/
        rollback;
        UPDATE h2.h2_batsale_h
           SET flag = 2,
               err  = err || '单据中客户编码' || rec.customerid || '名称' ||
                      v_vencusname || '在erp中没有设置批发业务员'
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        commit;
        continue;
    end;

    --判断运输地址是否调整
    select count(1)
      into v_cnt_addr
      from t_road_addr t
     where t.compid = v_compid
       and t.companyid = v_vencusno
       and nvl(t.subitemid, 0) = nvl(v_subitemid, 0)
       and trim(t.address) = trim(rec.address);
    if v_cnt_addr > 0 then
      update t_road_addr t
         set t.address = trim(rec.address)
       where t.compid = v_compid
         and t.companyid = v_vencusno
         and nvl(t.subitemid, 0) = nvl(v_subitemid, 0);
    end if;
    --运输地址
    begin
      select t.addrid
        into v_addrid
        from t_road_addr t
       where t.compid = v_compid
         and t.companyid = v_vencusno
         and nvl(t.subitemid, 0) = nvl(v_subitemid, 0)
         and rownum = 1;
      /*exception
      when others then
        rollback;
         UPDATE h2.h2_batsale_h
         SET flag = 2,
             err  = err || '单据中客户编码' || rec.customerid ||'名称'||v_vencusname|| '在erp中没有设置运输地址'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue; */
    exception
      when others then
        v_addrid := f_get_serial(in_billcode => 'RODD', in_org_code => null);
        insert into t_road_addr
          (compid,
           addrid,
           roadid,
           companyid,
           companyname,
           isdefault,
           addrtype,
           area,
           subitemid,
           address)
          select v_compid,
                 v_addrid,
                 '000018',
                 v_vencusno,
                 v_vencusname,
                 1,
                 '01',
                 null,
                 nvl(v_subitemid, 0),
                 rec.address
            from dual;
    end;

    --判断所有商品是否存在
    select count(*), wm_concat(d.drugcode)
      into v_spsl, v_drugcode
      from h2.h2_batsale_d d
     where d.djbh = rec.djbh
       and d.billsource = rec.billsource
       and not exists (select 1
              from t_ware t
             where t.compid = v_compid
               and t.warecode = d.drugcode);
    if v_spsl > 0 then
      rollback;
      UPDATE h2.h2_batsale_h
         SET flag = 2,
             err  = err || '单据中有商品编码' || v_drugcode || '在erp中找不到'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;

     --判断商品是否网络禁售
    select count(*), wm_concat(d.drugcode)
      into v_sps2, v_drugcode1
      from h2.h2_batsale_d d
     where d.djbh = rec.djbh
       and d.billsource = rec.billsource
       and not exists (select 1
              from t_ware_class_base t
             where t.compid = v_compid
               and t.WAREID = d.drugcode
               AND t.classgroupno='05'
               AND t.classcode='0502');
    if v_sps2 > 0 then
      rollback;
      UPDATE h2.h2_batsale_h
         SET flag = 2,
             err  = err || '单据中商品编码' || v_drugcode1 || '网络禁止销售'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;

    --判断商品是否设置了税率
    begin
      SELECT warecode, warename
        INTO v_warecode, v_warename
        FROM h2.h2_batsale_d a, t_ware b
       WHERE a.drugcode = b.warecode
         AND b.compid = v_compid
         AND a.djbh = rec.djbh
         and a.billsource = rec.billsource
         AND (b.saletax IS NULL OR b.saletax >= 0)
         AND rownum = 1;
    exception
      when others then
        rollback;
        update h2.h2_batsale_h
           SET flag = 2,
               err  = err || '单据中商品编码' || v_warecode || ',名称' || v_warename ||
                      '税率设置为0,请检查!'
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        commit;
        continue;
    end;
    if v_drugcode is not null then
      rollback;
      update h2.h2_batsale_h
         SET flag = 2,
             err  = err || '单据中商品编码' || v_warecode || ',名称' || v_warename ||
                    '在ERP中不存在!'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;
    ------------商品客户经营范围------------------
       BEGIN
         FOR II IN (SELECT D.DRUGCODE WAREID
                      FROM H2.H2_BATSALE_D D
                     WHERE D.DJBH = REC.DJBH
                       AND D.BILLSOURCE = REC.BILLSOURCE) LOOP
           BEGIN
             SELECT A.CLASSNAME
               INTO V_INTO_CHAR
               FROM T_CLASS_BASE A
              INNER JOIN T_VENCUS_RANGE B
                 ON (A.CLASSCODE = B.CLASSCODE)
              INNER JOIN T_VENCUS V
                 ON (B.COMPID = V.COMPID AND B.VENCUSNO = V.VENCUSNO)
              INNER JOIN (SELECT A.WAREID,
                                 B.WARECODE,
                                 A.CLASSGROUPNO,
                                 A.CLASSCODE
                            FROM T_WARE_CLASS_BASE A, T_WARE_BASE B
                           WHERE A.WAREID = B.WAREID
                             AND A.WAREID = II.WAREID
                             AND A.COMPID = 1) W
                 ON (B.CLASSCODE = W.CLASSCODE)
              WHERE ROWNUM = 1
                AND B.COMPID = V_COMPID
                AND B.VENCUSNO = V_VENCUSNO
                AND B.STATUS = 1
                AND V.VENCUSFLAG IN (0, 2);
           EXCEPTION
             WHEN NO_DATA_FOUND THEN
               ROLLBACK;
               UPDATE H2.H2_BATSALE_H
                  SET FLAG = 2,
                      ERR  = ERR || '客户' || V_VENCUSNO || '无此商品【' ||
                             II.WAREID || '】的经营范围;'
                WHERE DJBH = REC.DJBH
                  AND BILLSOURCE = REC.BILLSOURCE;
               COMMIT;
               EXIT;
           END;
         END LOOP;
         BEGIN
           SELECT FLAG
             INTO V_FLAG
             FROM H2.H2_BATSALE_H H
            WHERE H.BILLSOURCE = REC.BILLSOURCE
              AND H.DJBH = REC.DJBH;
           IF V_FLAG = 2 THEN
             CONTINUE;
           END IF;
         END;

       END;
     ------------商品客户经营范围------------------

     ----------商品客户经营分类控制 20240924-------------
     --只控制药品  1801经营范围分类
     BEGIN
       FOR III IN (SELECT D.DRUGCODE WAREID
                    FROM H2.H2_BATSALE_D D
                   WHERE D.DJBH = REC.DJBH
                     AND D.BILLSOURCE = REC.BILLSOURCE) LOOP
         SELECT SUBSTR(C.CLASSCODE, 1, 4)
           INTO V_CLASSCODE18
           FROM T_WARE_CLASS_BASE C, T_WARE B
          WHERE B.WAREID = C.WAREID
            AND B.COMPID = C.COMPID
            AND B.WARECODE = III.WAREID
            AND C.CLASSGROUPNO = '18';

         IF V_CLASSCODE18 = '1801' THEN
           SELECT C.CLASSCODE
             INTO V_CLASSCODE09
             FROM T_WARE_CLASS_BASE C, T_WARE B
            WHERE B.WAREID = C.WAREID
              AND B.COMPID = C.COMPID
              AND B.WARECODE = III.WAREID
              AND C.CLASSGROUPNO = '09';
           SELECT BAK1
             INTO V_BAK1
             FROM T_VENCUS
            WHERE VENCUSCODE = REC.CUSTOMERID
              AND COMPID = 1;
           SELECT NVL(INSTR(V_BAK1, V_CLASSCODE09, 1, 1), 0)
             INTO V_JYFL
             FROM DUAL;
           IF V_JYFL < 0 THEN
             ROLLBACK;
             UPDATE H2.H2_BATSALE_H
                SET FLAG = 2,
                    ERR  = ERR || '单据中商品编码' || V_WARECODE || ',的经营分类' ||
                           V_CLASSCODE09 || '不在该客户经营分类中!'
              WHERE DJBH = REC.DJBH
                AND BILLSOURCE = REC.BILLSOURCE;
             COMMIT;
             EXIT;
           END IF;
         END IF;
       END LOOP;
       BEGIN
         SELECT FLAG
           INTO V_FLAG
           FROM H2.H2_BATSALE_H H
          WHERE H.BILLSOURCE = REC.BILLSOURCE
            AND H.DJBH = REC.DJBH;
         IF V_FLAG = 2 THEN
           CONTINUE;
         END IF;
       END;
     END;
     ----------商品客户经营分类控制 20240924-------------

    --判断库存是否满足
      SELECT wm_concat(a.drugcode)
      into v_warecodehz
      FROM h2.h2_batsale_d a
      left join (
    select warecode, sum(a.wareqty - a.awaitqty) as sl
      from t_store_d a
     inner join t_store_i b
        on a.batid = b.batid
       and a.wareid = b.wareid
     inner join t_stall c
        on a.stallno = c.stallno
       and c.stalltype in (11) --货位类型暂时放开
     inner join t_ware d
        on a.compid = d.compid
       and a.wareid = d.wareid
     where a.wareqty - a.awaitqty > 0
       and nvl(b.flag1, 0) = 0 --库存锁定标识
       and a.compid = v_compid
       and a.busno = v_busno
       and b.ownerid = '01'
       AND b.isstopselling<>2
     group by warecode) b
        on a.drugcode = b.warecode
     where a.djbh = rec.djbh
       and a.billsource = rec.billsource
       and nvl(a.shl,0) > nvl(b.sl,0);

    if v_warecodehz is not null then
      rollback;
      UPDATE h2.h2_batsale_h
         SET flag = 2, err = err ||'商品'|| v_warecodehz || '库存不够'
       WHERE djbh = rec.djbh
         and billsource = rec.billsource;
      commit;
      continue;
    end if;

    v_para2975    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '2975',
                                       p_userid  => NULL);
    v_para2976    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '2976',
                                       p_userid  => NULL);
    v_para2977    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '2977',
                                       p_userid  => NULL);
    v_para2778    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '2778',
                                       p_userid  => NULL);
    v_parawms0001 := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => 'WMS0001',
                                       p_userid  => NULL);
    v_para2825    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '2825',
                                       p_userid  => NULL); --之前取的WMS0001 by WangChao(2515) 20190815
    v_para8139    := f_get_sys_inicode(p_compid  => v_compid,
                                       p_inicode => '8139',
                                       p_userid  => NULL);
   /* DELETE FROM tmp_batsale_act_alloc;
    INSERT INTO tmp_batsale_act_alloc
      (compid, busno, wareid, whlprice, applyqty, actualqty, maxqty)
      SELECT v_compid,
             v_busno,
             c.wareid,
             0,
             bd.shl,
             0,
             decode(nvl(c.maxqty, 0), 0, 1, c.maxqty)
        FROM h2.h2_batsale_d bd, h2.h2_batsale_h h, t_ware c
       WHERE h.djbh = rec.djbh
         and h.billsource = rec.billsource
         AND h.djbh = bd.djbh
         and h.billsource = bd.billsource
         AND c.compid = v_compid
         AND bd.drugcode = c.wareid
         AND NOT EXISTS
       (SELECT 1
                FROM t_ware_class_base wb
               WHERE wb.wareid = c.wareid
                 AND (instr(',' || v_para2976 || ',',
                            ',' || wb.classgroupno || ',') > 0 OR
                     instr(',' || v_para2976 || ',',
                            ',' || wb.classcode || ',') > 0)
                 AND wb.compid = (CASE
                       WHEN EXISTS (SELECT 1
                               FROM t_ware_class_base twcb
                              WHERE twcb.compid = 1
                                AND twcb.wareid = wb.wareid) THEN
                        1
                       ELSE
                        0
                     END));*/

    --生成批发销售单
    begin
      v_batsaleno := f_get_serial(in_billcode => 'WHL',
                                  in_org_code => v_busno);
      INSERT INTO t_batsale_h
        (batsaleno,
         billcode,
         compid,
         batcontno,
         batapplyno,
         vencusno,
         vencusname,
         busno,
         saler,
         pickuptype, --10
         accchkdate,
         accchker,
         accchked,
         invoicetype,
         addrid,
         whlgroupid,
         notes,
         lastmodify,
         lasttime,
         status, --20
         execdate,
         checker1,
         checkbit1,
         checker2,
         checkbit2,
         checker3,
         checkbit3,
         checker4,
         checkbit4,
         checker5, --30
         checkbit5,
         paytype,
         cashtype,
         ownerid,
         reckonerid,
         subitemid,
         parentbatsaltno,
         loadorder,
         checkdate1,
         checkdate2, --40
         checkdate3,
         checkdate4,
         checkdate5,
         notes1,
         createtime,
         createuser,
         versionnum,
         guarantor,
         salename,
         salezone, --50
         wms_flag,
         client,
         batsaletype,
         djbh,
         billsource,
         sale_idbs,
         source_type,
         RECAMOUNT,
         SUM_WHLPRICE,
         stamp,
         shdz,
         shr,
         shrdh,
         shsf,
         shcs,
         shqx) --59
        select v_batsaleno,
               'WHL',
               v_compid,
               null,
               null,
               v_vencusno,
               v_vencusname,
               v_busno,
-- 该字段需要根据实际情况进行修改
               case
                 when rec.billsource in ('1', '2', '3', '6') then
                  '1008'
                 when rec.billsource in ('4', '5') then
                  '1034'
               end,
               '01', --10
               null,
               null,
               0,
               v_invoicetype,
               v_addrid,
-- 该字段需要根据实际情况进行修改
               case
                 when rec.billsource = 1 then
                  '1004'
                 when rec.billsource = 2 then
                  '103'
                 when rec.billsource = 3 then
                  '104'
                 when rec.billsource = 4 then
                  '102'
                 when rec.billsource = 5 then
                  '102'
                 when rec.billsource = 6 then
                  '102'
                 else
                  ''
               end, --单头批发价格组
               null,
--该字段需要根据实际情况进行修改
               case
                 when rec.billsource in ('1', '2', '3', '6') then
                  1008
                 when rec.billsource in ('4', '5') then
                  1034
               end,
               sysdate,
               0, --20
               null,
               /*'1018',
               1,
               '1018',
               1,*/
               null,
               0,
               null,
               0,
               null,
               0,
               null,
               0,
               null, --30
               0,
               v_paytype,
               v_cashtype,
               v_ownerid,
--该字段需要根据实际情况进行修改
               case
                 when rec.billsource in ('1', '2', '3', '6') then
                  '01'
                 when rec.billsource in ('4', '5') then
                  '01'
               end, --部门
               v_subitemid,
               null,
               null,
               null,
               null, --40
               null,
               null,
               null,
               null,
               sysdate,
--该字段需要根据实际情况进行修改
               case
                 when rec.billsource in ('1', '2', '3', '6') then
                  1008
                 when rec.billsource in ('4', '5') then
                  1034
               end,
               0,
               null,
               null,
               null, --50
               case
                 when v_parawms0001 = 1 then
                  1
                 else
                  0
               end,
               null,
--该字段需要根据实际情况进行修改
               decode(rec.billsource,
                      1,
                      111,
                      2,
                      111,
                      3,
                      111,
                      4,
                      111,
                      5,
                      111,
                      6,
                      111), --批发类型
               rec.djbh,
               rec.billsource,
--该字段需要根据实际情况进行修改
               case
                 when rec.billsource = 1 then
                  '0401'
                 when rec.billsource = 2 then
                  '0405'
                 when rec.billsource = 3 then
                  '0406'
                 when rec.billsource = 4 then
                  '0302'
                 when rec.billsource = 5 then
                  '0303'
                 when rec.billsource = 6 then
                  '0408'
                 else
                  ''
               end, --销售标识
--该字段需要根据实际情况进行修改
               case
                 when rec.billsource in ('1', '2', '3', '4', '5', '6') then
                  '8'
               end, -- 单据来源--57
               rec.je,
               rec.je,
               seq_stamp.nextval,
               rec.address,
               rec.recvname,
               rec.recvphone,
               rec.provincename,
               rec.cityname,
               rec.districtname
          from dual;
      v_rownum := 0;
      for header in (select c.compid,
                            v_busno,
                            d.djbh,
                            d.dj_sn,
                            c.wareid,
                            d.shl,
                            d.dj,
                            c.warecode,
                            d.shop_amount,
                            d.platform_amount,
                            decode(d.shl,
                                   0,
                                   d.dj,
                                   round((d.shl * d.dj -
                                         nvl(d.shop_amount, 0) -
                                         nvl(d.platform_amount, 0)) / d.shl,
                                         2)) as price
                       from h2.h2_batsale_d d,
                            h2.h2_batsale_h h,
                            t_ware               c
                      where d.djbh = h.djbh
                        and d.billsource = h.billsource
                        and h.djbh = rec.djbh
                        and h.billsource = rec.billsource
                        and d.drugcode = c.warecode
                        and c.compid = v_compid) loop
        v_sywareqty := header.shl;

        v_xxx := header.dj_sn; --行号
        for detail in (select a.stallno,
                              a.batid,
                              a.wareid,
                              a.wareqty - a.awaitqty as wareqty,
                              b.makeno,
                              b.makedate,
                              b.purprice,
                              b.purtax,
                              d.saletax,
                              b.invalidate,
                              b.distprice,
                              b.factoryid,
                              d.maxqty,
                              d.midqty,
                              d.areacode
                         from t_store_d a
                        inner join t_store_i b
                           on a.batid = b.batid
                          and a.wareid = b.wareid
                        inner join t_stall c
                           on a.stallno = c.stallno
                          and c.stalltype in (11) --货位类型暂时放开
                        inner join t_ware d
                           on a.compid = d.compid
                          and a.wareid = d.wareid
                        where a.wareqty - a.awaitqty > 0
                          and nvl(b.flag1, 0) = 0 --库存锁定标识
                          and a.compid = header.compid
                          and a.busno = v_busno
                          and a.wareid = header.wareid
                          and b.ownerid = '01'
                          and b.invalidate - sysdate > 20
                          AND b.isstopselling<>2
                        ORDER BY /*case
                                   when rec.billsource in (1, 2, 3, 4, 5, 6) then
                                    hb_px
                                   else
                                    hc_px
                                 end, --判断c端先出,还是b端先出*/
                                 CASE
                                   WHEN v_para2825 = '1' THEN --按效期
                                    to_char(b.invalidate -
                                            to_date('19700101', 'yyyymmdd')) --UNIX时间
                                   WHEN v_para2825 = '2' THEN --按库存数
                                    lpad(to_char(floor(a.wareqty)), 10, '0')
                                   WHEN v_para2825 = '3' THEN --按批号
                                    nvl(b.makeno, '')
                                   ELSE
                                    to_char(b.batid) --按批次
                                 END

                       ) loop

          v_rownum := v_rownum + 1;
          IF v_sywareqty > detail.wareqty THEN
            --如果剩余数量大于库存数量,则将库存数量全部插入
            v_wareqty := detail.wareqty;
            --剩余数量 - 库存数量 = 余下还要插入的数量
            v_sywareqty := v_sywareqty - detail.wareqty;
          ELSE
            --如果剩余数量小于库存数量,则将剩余数量全部插入
            v_wareqty   := v_sywareqty;
            v_sywareqty := v_sywareqty - v_sywareqty;
          END IF;
          INSERT INTO t_batsale_d
            (batsaleno,
             rowno,
             wareid,
             factoryid,
             wareqty,
             stallno,
             batid,
             makeno,
             makedate,
             purprice, --进价 10
             purtax,
             saletax,
             saleprice,
             invalidate,
             whlprice, --批销价 15
             leastwhlprice,
             maxwhlprice,
             dtlsaler,
             midqty,
             avgpurprice,
             pstflag,
             backprice,
             notes,
             distprice,
             setpurprice1,
             setpurprice2,
             setwhlprice1,
             setwhlprice2,
             setwhlprice3,
             setwhlprice4,
             setwhlprice5,
             chker1,
             chker2,
             batbackqty,
             batbackamt,
             redeemsum,
             prediswhlprice,
             maxqty,
             areacode,
             multibusno,
             invoiceredeemsum,
             back_var5)
            select v_batsaleno,
                   v_rownum,
                   detail.wareid,
                   detail.factoryid,
                   v_wareqty,
                   detail.stallno,
                   detail.batid,
                   detail.makeno,
                   detail.makedate,
                   detail.purprice, --10 进价
                   detail.purtax,
                   detail.saletax,
                   header.price,
                   detail.invalidate,
                   header.price, --15 批销价
                   header.price,
                   header.price,
                   v_saler,
                   detail.midqty,
                   detail.purprice,
                   0,
                   detail.purprice,
                   null,
                   detail.distprice,
                   null,
                   null,
                   null,
                   null,
                   null,
                   null,
                   null,
                   null,
                   null,
                   0,
                   0,
                   0,
                   header.price,
                   detail.maxqty,
                   detail.areacode,
                   null,
                   0,
                   v_xxx

              from dual;

          -- 如果批销价小于进价,则将一、二审修改为未审
          /*if header.price < f_get_b2bleastwhlprice(rec.billsource,header.warecode) then
          update t_batsale_h
             set checker1 = null, checkbit1 = 0, checker2 = null, checkbit2 = 0
           where batsaleno = v_batsaleno;
          end if;*/

          --如果剩余数量为0 则终止循环
          IF v_sywareqty <= 0 THEN
            EXIT;
          END IF;
        end loop;
        v_warecode := header.warecode;
        IF v_sywareqty > 0 THEN
          rollback;
          delete from t_batsale_h h where h.batsaleno = v_batsaleno;
          delete from t_batsale_d d where d.batsaleno = v_batsaleno;
          UPDATE h2.h2_batsale_h
             SET flag = 2, err = err || header.warecode || '库存不够'
           WHERE djbh = rec.djbh
             and billsource = rec.billsource;
          COMMIT;
          -- CONTINUE;
          EXIT; --跳出游标
        END IF;
      end loop;
      select nvl(sum(wareqty), 0)
        into v_erpwareqty
        from t_batsale_d d
       where d.batsaleno = v_batsaleno;

      select sum(d.shl)
        into v_ptwareqty
        from h2.h2_batsale_d d
       where d.djbh = rec.djbh
         and d.billsource = rec.billsource;
      --判断数量是否一致
      if v_erpwareqty = v_ptwareqty then
        -- update t_batsale_h h
        --  set h.checker1=168,h.checkbit1=1,h.checker2=168,h.checkbit2=1
        -- where h.batsaleno = v_batsaleno;
        UPDATE h2.h2_batsale_h
           SET flag = 1
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;

        /*    if v_erpwareqty = 0 then
          delete from t_batsale_h h where h.batsaleno = v_batsaleno;
          delete from t_batsale_d d where d.batsaleno = v_batsaleno;
          UPDATE h2.h2_batsale_h
             SET flag = 2, err = '整单库存为0'
           WHERE djbh = rec.djbh
             and billsource = rec.billsource;
          CONTINUE;
        end if;*/

        --自动一审/二审
     /*   if rec.billsource in ('1', '2', '3', '6') then
          update t_batsale_h bh
             set bh.checker1   = 1008,
                 bh.checkbit1  = 1,
                 bh.checkdate1 = SYSDATE + numtodsinterval(-3, 'minute')
           where bh.batsaleno = v_batsaleno;

        \*  update t_batsale_h bh
             set bh.checker2   = 1008,
                 bh.checkbit2  = 1,
                 bh.checkdate2 = sysdate + numtodsinterval(-1, 'minute')
           where bh.batsaleno = v_batsaleno;*\
        end if;
*/
        UPDATE h2.h2_batsale_h
           SET flag = 1
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        --药师帮订单插入状态表
        INSERT INTO h2.ysb_ddmx_writeback
          (orderid,
           ordercode,
           dj_sn,
           drugcode,
           amount,
           price,
           je,
           batchnum,
           proddate,
           validity,
           status)
          SELECT rec.djbh AS orderid,
                 d.batsaleno AS ordercode,
                 to_number(d.back_var5) AS dj_sn,
                 w.warecode AS drugcode,
                 d.wareqty AS amount,
                 d.whlprice AS price,
                 d.wareqty * d.whlprice je,
                 d.makeno AS batchnum,
                 to_char(d.makedate, 'yyyy-mm-dd') proddate,
                 to_char(d.invalidate, 'yyyy-mm-dd') validity,
                 0 status
            FROM t_batsale_d d
            join t_batsale_h h
              on h.batsaleno = d.batsaleno
            left join t_ware w
              on w.compid = 1
             and w.wareid = d.wareid
           WHERE d.batsaleno = v_batsaleno
             and h.sale_idbs = '0401';
        COMMIT;
      else
        rollback;
        delete from t_batsale_h h where h.batsaleno = v_batsaleno;
        delete from t_batsale_d d where d.batsaleno = v_batsaleno;
        UPDATE h2.h2_batsale_h
           SET flag = 2,
               err  = '订单数量为' || v_ptwareqty || '跟erp生成的数量' || v_erpwareqty ||
                      '不一致' || v_warecode || '库存不够'
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        COMMIT;
        --CONTINUE;
      end if;
    EXCEPTION
      WHEN OTHERS THEN
        rollback;
        v_errm := substr(sqlerrm, 1, 1900);
        update h2.h2_batsale_h
           set flag = 2, err = v_errm
         WHERE djbh = rec.djbh
           and billsource = rec.billsource;
        COMMIT;
        CONTINUE;
    END;
    commit;
  end loop;
END;

使用平台订单转申请单需要替换申请转销售单的存储过程

CREATE OR REPLACE PROCEDURE cproc_batsaleapply2batsale(p_applyno     IN t_batsaleapply_h.applyno%TYPE,
                                                      p_lastmodify  IN t_batsaleapply_h.lastmodify%TYPE,
                                                      out_batsaleno OUT VARCHAR2) IS
  v_length           INT;
  v_para2975         s_sys_ini.inipara%TYPE; --批发销售限制货位
  v_para2976         s_sys_ini.inipara%TYPE; --批发销售限制,批发申请转批发需要过滤的商品类别
  v_para2977         s_sys_ini.inipara%TYPE; --控制批发申请转批发,多少天以内的批次不允许出库。
  v_para2790         s_sys_ini.inipara%TYPE; --配送申请转配送的历史补货数量是否累加或者或者不累加直接取最后一次补货数量(包含批发申请转批发)
  v_batsaleno        t_batsale_h.batsaleno%TYPE;
  v_old_batsaleno    t_batsale_h.batsaleno%TYPE;
  v_warecode         t_ware.warecode%TYPE;
  v_busno            t_batsale_h.busno%TYPE; --业务机构
  v_compid           t_batsale_h.compid%TYPE; --企业
  v_vencusno         t_batsale_h.vencusno%TYPE; --往来单位
  v_whlgroupid       t_batsale_h.whlgroupid%TYPE; --批发价格组
  v_client           t_batsale_h.client%TYPE; --委托人
  v_vencusno_batsale t_batsale_h.vencusno%TYPE;
  v_compid_batsale   t_batsale_h.compid%TYPE;
  v_wareqty          NUMBER;
  v_notes            VARCHAR2(4000);
  v_notes1           VARCHAR2(4000);
  v_mesgxx           VARCHAR2(4000); --限销提示
  v_count            PLS_INTEGER;
  v_pare2976note     VARCHAR2(4000); --2976参数限制
  v_warecodes        VARCHAR2(4000);
  v_msg              VARCHAR2(4000);
  v_awaitqty_owner   t_store_d.awaitqty%TYPE;
  v_awaitqty_makeno  t_store_d.awaitqty%TYPE;
  v_awaitqty         t_store_d.awaitqty%TYPE;
  v_saler            t_batsale_h.saler%TYPE;
  v_supplyno         VARCHAR2(4000);
  v_ownerid          t_batsale_h.ownerid%TYPE;
  v_vencuscode       t_vencus.vencuscode%TYPE;
  v_wareid_list      number_array;
  v_procname         t_proc_rep.procrepname%TYPE;
  --v_para1307       s_sys_ini.inipara%TYPE;
  v_parawms0001      s_sys_ini.inipara%TYPE;
  v_wms_ownerid      t_owner.wms_ownerid%TYPE;
  v_applyqty         tmp_batsale_act_alloc.applyqty%TYPE;
  v_warename         t_ware_base.warename%TYPE;
  v_actualqty        t_batsale_d.wareqty%TYPE;
  v_actualqty1       t_batsale_d.wareqty%TYPE;
  v_amt              t_batsale_d.whlprice%TYPE;
  v_isxx             PLS_INTEGER;
  v_para2825         s_sys_ini.inipara%TYPE; --前台销售按批次还是效期出库存 0:按批次,1:按效期
  v_para2778         s_sys_ini.inipara%TYPE; --前台销售按批次还是效期出库存 0:按批次,1:按效期
  v_para8139         s_sys_ini.inipara%TYPE; --是否开启整件优先
  v_subitemid        t_batsale_h.subitemid%TYPE;
  v_count1           PLS_INTEGER;
  v_whlprice         t_batsale_d.whlprice%TYPE;
  v_js               PLS_INTEGER;
  v_mestz            VARCHAR2(4000);
  v_wms001           t_wms_store_set.defpara%TYPE;
  v_makeno_check     t_vencus.makeno_check%TYPE;
  v_check_batch_flag t_vencus.check_batch_flag%TYPE;
  v_makejs           PLS_INTEGER;
  v_djbh             t_batsale_h.djbh%TYPE;
BEGIN
  --是否有替换储存过程
  BEGIN
    SELECT procrepname
      INTO v_procname
      FROM t_proc_rep
     WHERE upper(procname) = upper('cproc_batsaleapply2batsale')
       AND status = 1;
  EXCEPTION
    WHEN no_data_found THEN
      v_procname := NULL;
  END;
  IF v_procname IS NOT NULL THEN
    BEGIN
      EXECUTE IMMEDIATE 'begin ' || v_procname || '(:1, :2, :3); end;'
        USING p_applyno, p_lastmodify, OUT out_batsaleno;
    END;
    RETURN;
  END IF;
  BEGIN
    SELECT b.batsaleno
      INTO v_old_batsaleno
      FROM t_batsaleapply_h b
     WHERE b.applyno = p_applyno
       AND b.batsaleno IS NOT NULL;
    raise_application_error(-20001,
                            '您选择的批发申请单已转为批发销售单' || v_old_batsaleno ||
                            ',请不要重复操作!',
                            TRUE);
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  END;
  --raise_application_error(-20001,'abcdefghijk',TRUE);
  SELECT busno, compid, vencusno, whlgroupid, ownerid, subitemid, client ,djbh 
    INTO v_busno,
         v_compid,
         v_vencusno,
         v_whlgroupid,
         v_ownerid,
         v_subitemid,
         v_client
         ,v_djbh
    FROM t_batsaleapply_h
   WHERE applyno = p_applyno;

  BEGIN
    SELECT warecode, warename
      INTO v_warecode, v_warename
      FROM t_batsaleapply_d a, t_ware b
     WHERE a.wareid = b.wareid
       AND b.compid = v_compid
       AND a.applyno = p_applyno
       AND (b.saletax IS NULL OR b.saletax < 0)
       AND rownum = 1;
    raise_application_error(-20001,
                            '您选择的批发申请单的商品' || v_warecode || v_warename ||
                            '没有录入销项税率!',
                            TRUE);
  EXCEPTION
    WHEN no_data_found THEN
      NULL;
  END;

  v_para2975    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '2975',
                                     p_userid  => NULL);
  v_para2976    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '2976',
                                     p_userid  => NULL);
  v_para2977    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '2977',
                                     p_userid  => NULL);
  v_para2778    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '2778',
                                     p_userid  => NULL);
  v_parawms0001 := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => 'WMS0001',
                                     p_userid  => NULL);
  v_wms_ownerid := f_get_wmsownerid(p_compid  => v_compid,
                                    p_ownerid => v_ownerid);
  v_para2825    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '2825',
                                     p_userid  => NULL); --之前取的WMS0001 by WangChao(2515) 20190815
  v_para8139    := f_get_sys_inicode(p_compid  => v_compid,
                                     p_inicode => '8139',
                                     p_userid  => NULL);
  BEGIN
    SELECT defpara
      INTO v_wms001
      FROM t_wms_store_set
     WHERE compid = v_compid
       AND inicode = 'WMS001';
  EXCEPTION
    WHEN no_data_found THEN
      v_wms001 := '0';
  END;
  DELETE FROM tmp_batsale_act_alloc;
  INSERT INTO tmp_batsale_act_alloc
    (compid, busno, wareid, whlprice, applyqty, actualqty, maxqty, ownerid)
    SELECT h.compid,
           h.busno,
           bd.wareid,
           0,
           bd.checkqty,
           0,
           decode(nvl(c.maxqty, 0), 0, 1, c.maxqty),
           h.ownerid
      FROM t_batsaleapply_d bd, t_batsaleapply_h h, t_ware c
     WHERE h.applyno = p_applyno
       AND h.applyno = bd.applyno
       AND h.compid = c.compid
       AND bd.wareid = c.wareid
       AND (v_para2976 IS NULL OR
           (v_para2976 IS NOT NULL AND NOT EXISTS
            (SELECT 1
                FROM t_ware_class_base wb
               WHERE wb.wareid = bd.wareid
                 AND (instr(',' || v_para2976 || ',',
                            ',' || wb.classgroupno || ',') > 0 OR
                     instr(',' || v_para2976 || ',',
                            ',' || wb.classcode || ',') > 0)
                 AND wb.compid = (CASE
                       WHEN EXISTS
                        (SELECT 1
                               FROM t_ware_class_base twcb
                              WHERE twcb.compid = h.compid
                                AND twcb.wareid = wb.wareid
                                AND twcb.classgroupno = wb.classgroupno) THEN
                        h.compid
                       ELSE
                        0
                     END))));
  IF SQL%ROWCOUNT = 0 THEN
    UPDATE t_batsaleapply_h
       SET indentflag = 1,
           notes      = notes || ',被参数2976限制此类别不允许转单'
     WHERE applyno = p_applyno;
    out_batsaleno := '2976限制';
    RETURN;
  END IF;

  SELECT COUNT(1),
         listagg(c.warecode, ',') within GROUP(ORDER BY bd.applyno) warecodes
    INTO v_count, v_warecodes
    FROM t_batsaleapply_d bd, t_batsaleapply_h h, t_ware c
   WHERE h.applyno = p_applyno
     AND h.applyno = bd.applyno
     AND h.compid = c.compid
     AND bd.wareid = c.wareid
     AND v_para2976 IS NOT NULL
     AND EXISTS
   (SELECT 1
            FROM t_ware_class_base wb
           WHERE wb.wareid = bd.wareid
             AND (instr(',' || v_para2976 || ',',
                        ',' || wb.classgroupno || ',') > 0 OR
                 instr(',' || v_para2976 || ',', ',' || wb.classcode || ',') > 0)
             AND wb.compid = (CASE
                   WHEN EXISTS
                    (SELECT 1
                           FROM t_ware_class_base twcb
                          WHERE twcb.compid = h.compid
                            AND twcb.wareid = wb.wareid
                            AND twcb.classgroupno = wb.classgroupno) THEN
                    h.compid
                   ELSE
                    0
                 END));

  IF v_count > 0 THEN
    v_pare2976note := '商品(' || v_warecodes || '),被参数2976限制此类别,无法转单!';

  END IF;
  --/*+ index(sd idx_t_store_d5)*/
  DELETE FROM tmp_batapply_avail_store;
  SELECT wareid BULK COLLECT INTO v_wareid_list FROM tmp_batsale_act_alloc;

  FORALL indx IN v_wareid_list.first .. v_wareid_list.last
    INSERT INTO tmp_batapply_avail_store
      (compid,
       batid,
       wareid,
       invalidate,
       wareqty,
       awaitqty,
       stallno,
       busno,
       factoryid,
       makeno,
       makedate,
       purtax,
       purprice,
       areacode,
       maxqty,
       midqty,
       notes,
       stalltype,
       sealtype,
       seq_id,
       awaitqty_makeno,
       availableqty,
       actualqty,
       whlprice,
       isstopselling,
       ownerid)
      SELECT compid,
             batid,
             wareid,
             invalidate,
             wareqty,
             awaitqty,
             stallno,
             busno,
             factoryid,
             makeno,
             makedate,
             purtax,
             purprice,
             areacode,
             maxqty,
             midqty,
             notes,
             stalltype,
             sealtype,
             seq_temp_batsaleapply_store.nextval,
             0,
             wareqty - nvl(awaitqty, 0),
             0,
             whlprice,
             isstopselling,
             ownerid
        FROM (SELECT *
                FROM (SELECT /*+index(sd idx_t_store_d5)*/
                       si.compid,
                       si.batid,
                       si.wareid,
                       si.invalidate,
                       sd.wareqty,
                       sd.awaitqty,
                       sd.stallno,
                       sd.busno,
                       si.factoryid,
                       si.makeno,
                       si.makedate,
                       si.purtax,
                       si.purprice,
                       si.areacode,
                       si.maxqty,
                       si.midqty,
                       h.notes,
                       a.stalltype,
                       a.sealtype,
                       sd.wareqty - nvl(sd.awaitqty, 0) AS availableqty,
                       d.whlprice,
                       nvl(si.isstopselling, 1) isstopselling,
                       '' AS ownerid
                        FROM t_store_i        si,
                             t_store_d        sd,
                             t_batsaleapply_h h,
                             t_stall          a,
                             t_batsaleapply_d d,
                             t_ware           tw
                       WHERE si.compid = v_compid
                         AND si.wareid = v_wareid_list(indx)
                         AND sd.busno = v_busno
                         AND si.batid = sd.batid
                         AND si.wareid = sd.wareid
                         AND tw.wareid = d.wareid
                         and tw.compid = h.compid
                         and sd.wareqty - sd.awaitqty > 0
                         AND si.ownerid = h.ownerid
                         AND h.applyno = p_applyno
                         AND (v_para2778 <> 0 OR
                             (v_para2778 = 0 AND
                             sd.stallno NOT IN
                             (SELECT TRIM(regexp_substr(v_para2975,
                                                          '[^,]+',
                                                          1,
                                                          LEVEL))
                                  FROM dual
                                CONNECT BY rownum <=
                                           regexp_count(v_para2975, ',') + 1)))
                         AND (si.invalidate is null or
                             si.invalidate > v_para2977 + SYSDATE)
                         AND sd.stallno = a.stallno
                         AND sd.compid = a.compid
                         AND sd.busno = a.busno
                         AND a.stalltype = 11
                         AND h.applyno = d.applyno
                         AND d.wareid = v_wareid_list(indx)
                         AND v_wms001 <> '1'
                       ORDER BY CASE
                                  WHEN v_para2825 = '1' THEN --按效期
                                   to_char(si.invalidate - to_date('19700101', 'yyyymmdd')) --UNIX时间
                                  WHEN v_para2825 = '2' THEN --按库存数
                                   lpad(to_char(floor(sd.wareqty)), 10, '0')
                                  WHEN v_para2825 = '3' THEN --按批号
                                   nvl(si.makeno, '')
                                  ELSE
                                   lpad(to_char(si.batid), 20, '0') --按批次
                                END)
              UNION ALL
              SELECT *
                FROM (SELECT t_store_d.compid,
                             0 AS batid,
                             t_store_d.wareid,
                             MIN(t_store_i.invalidate) AS invalidate,
                             MAX(t_store_makeno.wareqty) AS wareqty,
                             (MAX(t_store_makeno.awaitqty) +
                             MAX(t_store_makeno.defectqty) +
                             MAX(t_store_makeno.testqty)) AS awaitqty,
                             CAST('ALL' AS VARCHAR2(40)) AS stallno,
                             MAX(t_store_makeno.busno) AS busno,
                             MAX(CASE
                                   WHEN v_ware.factoryid = 0 THEN
                                    t_store_i.factoryid
                                   ELSE
                                    v_ware.factoryid
                                 END) AS factoryid,
                             t_store_i.makeno AS makeno,
                             MIN(t_store_i.makedate) AS makedate,
                             MAX(t_store_i.purtax) AS purtax,
                             MAX(t_store_i.purprice) AS purprice,
                             MAX(v_ware.areacode) AS areacode,
                             MAX(t_store_i.maxqty) AS maxqty,
                             MAX(t_store_i.midqty) AS midqty,
                             MAX(h.notes) AS notes,
                             MAX(v_stall.stalltype) AS stalltype,
                             MAX(v_stall.sealtype) AS sealtype,
                             (MAX(t_store_makeno.wareqty) -
                             MAX(t_store_makeno.awaitqty) -
                             MAX(t_store_makeno.defectqty) -
                             MAX(t_store_makeno.testqty)) AS availableqty,
                             MIN(d.whlprice) AS whlprice,
                             nvl(MAX(t_store_i.isstopselling), 1) AS isstopselling,
                             t_store_i.ownerid
                        FROM t_store_i t_store_i
                        JOIN t_store_d t_store_d
                          ON t_store_i.batid = t_store_d.batid
                         AND t_store_i.wareid = t_store_d.wareid
                        JOIN t_store_makeno t_store_makeno
                          ON t_store_d.compid = t_store_makeno.compid
                         AND t_store_d.busno = t_store_makeno.busno
                         AND t_store_d.wareid = t_store_makeno.wareid
                         AND t_store_i.makeno = t_store_makeno.makeno
                         AND t_store_i.ownerid = t_store_makeno.ownerid
                        JOIN t_store_h h
                          ON h.compid = t_store_i.compid
                         AND h.wareid = t_store_i.wareid
                         AND h.busno = t_store_makeno.busno
                        JOIN t_stall v_stall
                          ON t_store_d.stallno = v_stall.stallno
                         AND t_store_d.compid = v_stall.compid
                         AND t_store_d.busno = v_stall.busno
                        JOIN t_batsaleapply_h h
                          ON h.applyno = p_applyno
                         AND h.compid = t_store_i.compid
                         AND h.ownerid = t_store_i.ownerid
                        JOIN t_batsaleapply_d d
                          ON h.applyno = d.applyno
                         AND d.wareid = v_wareid_list(indx)
                        JOIN t_ware v_ware
                          ON v_ware.wareid = t_store_d.wareid
                         AND v_ware.compid = t_store_d.compid
                       WHERE t_store_makeno.wareqty - t_store_makeno.awaitqty > 0
                         AND t_store_makeno.wareqty > 0
                         AND (t_store_i.invalidate is null or
                             t_store_i.invalidate > trunc(SYSDATE))
                         AND t_store_d.wareqty > 0
                         AND t_store_makeno.wareid = v_wareid_list(indx)
                         AND t_store_makeno.compid = v_compid
                         AND t_store_makeno.busno = v_busno
                         AND v_wms001 = '1'
                       GROUP BY t_store_d.compid,
                                t_store_d.busno,
                                t_store_d.wareid,
                                t_store_i.ownerid,
                                t_store_i.makeno
                       ORDER BY invalidate) m);

  --若在批发批次对应客户价格设置中设置了价格,转单时批销价取设置的批销价,否则取申请单的价格
  IF v_wms001 <> '1' THEN
    FOR rec IN (SELECT a.compid, a.wareid, a.batid, a.busno, a.seq_id
                  FROM tmp_batapply_avail_store a) LOOP
      SELECT COUNT(1), MAX(whlprice)
        INTO v_count1, v_whlprice
        FROM t_batsale_cust_whlprice t
       WHERE t.compid = rec.compid
         AND t.vencusno = v_vencusno
         AND (t.whlgroupid = v_whlgroupid OR t.whlgroupid = 0)
         AND t.wareid = rec.wareid
         AND (t.batid = 0 OR t.batid = rec.batid)
         AND (t.subitemid = v_subitemid OR v_subitemid IS NULL)
         AND nvl(t.status, 1) = 1;
      IF v_count1 > 0 THEN
        UPDATE tmp_batapply_avail_store a
           SET a.whlprice = v_whlprice
         WHERE a.seq_id = rec.seq_id;
      END IF;
    END LOOP;
  END IF;
  --这里预分配待出库fyy
  IF v_para2778 <> '0' AND v_wms001 <> '1' THEN
    FOR reca IN (SELECT compid, wareid, busno
                   FROM tmp_batsale_act_alloc
                  WHERE EXISTS
                  (SELECT 1
                           FROM tmp_batapply_avail_store b
                          WHERE tmp_batsale_act_alloc.compid = b.compid
                            AND tmp_batsale_act_alloc.wareid = b.wareid
                            AND tmp_batsale_act_alloc.busno = b.busno)) LOOP
      SELECT awaitqty
        INTO v_awaitqty_owner
        FROM t_store_owner
       WHERE compid = reca.compid
         AND wareid = reca.wareid
         AND busno = reca.busno
         AND ownerid = v_ownerid;

      SELECT SUM(awaitqty)
        INTO v_awaitqty_makeno
        FROM t_store_makeno
       WHERE compid = reca.compid
         AND wareid = reca.wareid
         AND busno = reca.busno
         AND ownerid = v_ownerid;

      SELECT SUM(a.awaitqty)
        INTO v_awaitqty
        FROM t_store_d a, t_store_i b
       WHERE a.compid = b.compid
         AND a.wareid = b.wareid
         AND a.batid = b.batid
         AND b.ownerid = v_ownerid
         AND a.compid = reca.compid
         AND a.busno = reca.busno
         AND a.wareid = reca.wareid;

      IF v_awaitqty = v_awaitqty_makeno AND
         v_awaitqty_owner = v_awaitqty_makeno THEN
        continue;
      END IF;

      INSERT INTO tmp_batapply_store_i
        (compid,
         batid,
         makeno,
         wareid,
         wareqty,
         awaitqty,
         busno,
         seq_id,
         awaitqtyfp)
        SELECT compid,
               batid,
               makeno,
               wareid,
               wareqty,
               awaitqty,
               busno,
               seq_id,
               0
          FROM tmp_batapply_avail_store a
         WHERE a.busno = reca.busno
           AND a.wareid = reca.wareid
           AND a.compid = reca.compid;

      IF v_awaitqty_makeno > v_awaitqty THEN
        FOR recb IN (SELECT a.*
                       FROM t_store_makeno a
                      WHERE a.compid = reca.compid
                        AND a.wareid = reca.wareid
                        AND a.ownerid = v_ownerid
                        AND a.busno = reca.busno
                        AND EXISTS (SELECT 1
                               FROM tmp_batapply_store_i b
                              WHERE a.compid = b.compid
                                AND a.wareid = b.wareid
                                AND a.busno = b.busno
                                AND a.makeno = b.makeno)) LOOP

          SELECT nvl(SUM(awaitqty), 0)
            INTO v_awaitqty
            FROM t_store_d a, t_store_i b
           WHERE a.compid = b.compid
             AND a.wareid = b.wareid
             AND a.batid = b.batid
             AND a.busno = reca.busno
             AND b.ownerid = v_ownerid
             AND b.makeno = recb.makeno
             AND a.compid = reca.compid
             AND a.wareid = reca.wareid
             AND NOT EXISTS (SELECT 1
                    FROM tmp_batapply_store_i c
                   WHERE a.compid = c.compid
                     AND a.wareid = c.wareid
                     AND a.busno = c.busno
                     AND a.batid = c.batid);

          recb.awaitqty := recb.awaitqty - v_awaitqty;
          SELECT SUM(awaitqty)
            INTO v_awaitqty
            FROM tmp_batapply_store_i
           WHERE compid = recb.compid
             AND wareid = recb.wareid
             AND makeno = recb.makeno;
          IF recb.awaitqty > v_awaitqty THEN
            recb.awaitqty := recb.awaitqty - v_awaitqty;
            MERGE INTO tmp_batapply_store_i a
            USING (SELECT compid,
                          seq_id,
                          CASE
                            WHEN sum_store <= applyqty THEN
                             canstoreqty
                            ELSE
                             applyqty + canstoreqty - sum_store
                          END qty

                     FROM (SELECT compid,
                                  seq_id,
                                  (b.wareqty - b.awaitqty) AS canstoreqty,
                                  SUM(b.wareqty - b.awaitqty) over(PARTITION BY b.wareid ORDER BY b.seq_id DESC) sum_store,
                                  recb.awaitqty AS applyqty
                             FROM tmp_batapply_store_i b
                            WHERE b.wareid = recb.wareid
                              AND b.busno = recb.busno
                              AND b.makeno = recb.makeno
                              AND b.wareqty - b.awaitqty > 0
                            ORDER BY b.seq_id DESC)
                    WHERE sum_store - canstoreqty < applyqty) b
            ON (a.seq_id = b.seq_id)
            WHEN MATCHED THEN
              UPDATE SET a.awaitqty = a.awaitqty + b.qty;

          END IF;

        END LOOP;

      END IF;

      IF v_awaitqty_owner > v_awaitqty_makeno THEN
        MERGE INTO tmp_batapply_store_i a
        USING (SELECT compid,
                      seq_id,
                      CASE
                        WHEN sum_store <= applyqty THEN
                         canstoreqty
                        ELSE
                         applyqty + canstoreqty - sum_store
                      END qty

                 FROM (SELECT compid,
                              seq_id,
                              (b.wareqty - b.awaitqty) AS canstoreqty,
                              SUM(b.wareqty - b.awaitqty) over(PARTITION BY b.wareid ORDER BY b.seq_id DESC) sum_store,
                              (v_awaitqty_owner - v_awaitqty_makeno) AS applyqty
                         FROM tmp_batapply_store_i b
                        WHERE b.wareqty - b.awaitqty > 0
                          AND b.wareid = reca.wareid
                          AND b.busno = reca.busno
                        ORDER BY b.seq_id DESC)
                WHERE sum_store - canstoreqty < applyqty) b
        ON (a.seq_id = b.seq_id)
        WHEN MATCHED THEN
          UPDATE SET a.awaitqty = a.awaitqty + b.qty;

      END IF;
      MERGE INTO tmp_batapply_avail_store a
      USING (SELECT * FROM tmp_batapply_store_i) b
      ON (a.seq_id = b.seq_id)
      WHEN MATCHED THEN
        UPDATE
           SET a.availableqty = a.availableqty + a.awaitqty - b.awaitqty,
               a.awaitqty     = b.awaitqty;

    END LOOP;
  END IF;
  /*这里逐个获取是因为,按照品种找库存比直接关联tmp_batsale_act_alloc更快*/
  SELECT h.vencusno,
         h.saler,
         h.ownerid,
         h.compid,
         b.vencuscode,
         nvl(c.makeno_check, 0),
         nvl(c.check_batch_flag, 1)
    INTO v_vencusno_batsale,
         v_saler,
         v_ownerid,
         v_compid_batsale,
         v_vencuscode,
         v_makeno_check,
         v_check_batch_flag
    FROM t_batsaleapply_h h, t_vencus_base b, t_vencus c
   WHERE h.applyno = p_applyno
     AND h.vencusno = b.vencusno
     AND h.compid = c.compid
     AND h.vencusno = c.vencusno;

  --GSP检查
  /*FOR rec_store IN (SELECT st.*, al.applyqty
   FROM tmp_batapply_avail_store st,
        tmp_batsale_act_alloc    al
  WHERE st.compid = al.compid
    AND st.busno = al.busno
    AND st.wareid = al.wareid
    AND st.wareid = al.wareid) LOOP*/
  select count(1)
    into v_count
    from tmp_batapply_avail_store
   where availableqty > 0;
  if v_count > 0 then
    BEGIN
      DELETE FROM tmp_ware_gspcheck;
      INSERT INTO tmp_ware_gspcheck
        (seqno,
         billcode,
         billno,
         rowno,
         compid,
         busno,
         vencusno,
         client,
         wareid,
         warecode,
         batid,
         stallno,
         makeno,
         invalidate,
         direct,
         status)
        select st.seq_id,
               'WHL',
               NULL,
               st.seq_id,
               v_compid,
               st.busno,
               v_vencusno,
               NULL,
               st.wareid,
               NULL,
               st.batid,
               st.stallno,
               st.makeno,
               st.invalidate,
               -1,
               1
          FROM tmp_batapply_avail_store st, tmp_batsale_act_alloc al
         WHERE st.compid = al.compid
           AND st.busno = al.busno
           AND st.wareid = al.wareid
           AND st.wareid = al.wareid;
      BEGIN
        /* proc_ware_gspcheck(0, '',
        'quality_check,warning_ware,range_bus,certif_bus,certif_ware,range_cust,certif_cust',
        2);*/
        proc_ware_gsp_bakcheck(0,
                               '',
                               'quality_check,warning_ware,range_bus,certif_bus,certif_ware,range_cust,certif_cust',
                               2);
        --EXCEPTION
        --WHEN OTHERS THEN
        INSERT INTO tmp_batsaleapply_gsp_del
          (applyno, vencusno, wareid)
          SELECT p_applyno, v_vencusno, wareid
            FROM tmp_ware_gspcheck
           WHERE status = 0
             and NOT EXISTS
           (SELECT 1
                    FROM tmp_batsaleapply_gsp_del del
                   WHERE del.applyno = applyno
                     AND del.vencusno = v_vencusno
                     AND del.wareid = tmp_ware_gspcheck.wareid);
        DELETE FROM tmp_batapply_avail_store
         WHERE seq_id in
               (select seq_id from tmp_ware_gspcheck where status = 0);
      END;
    END;
  end if;
  --END LOOP;
  v_makejs    := 0;
  v_batsaleno := f_get_serial(in_billcode => 'WHL', in_org_code => v_busno);
  INSERT INTO t_batsale_h
    (batsaleno,
     billcode,
     compid,
     batcontno,
     batapplyno,
     vencusno,
     vencusname,
     busno,
     saler,
     pickuptype,
     accchkdate,
     accchker,
     accchked,
     invoicetype,
     addrid,
     whlgroupid,
     notes,
     lastmodify,
     lasttime,
     status,
     execdate,
     checker1,
     checkbit1,
     checker2,
     checkbit2,
     checker3,
     checkbit3,
     checker4,
     checkbit4,
     checker5,
     checkbit5,
     paytype,
     cashtype,
     ownerid,
     reckonerid,
     subitemid,
     parentbatsaltno,
     loadorder,
     checkdate1,
     checkdate2,
     checkdate3,
     checkdate4,
     checkdate5,
     notes1,
     createtime,
     createuser,
     versionnum,
     guarantor,
     salename,
     salezone,
     wms_flag,
     client,
     source_type,
     djbh,
     billsource,
     sale_idbs
     )
    SELECT v_batsaleno,
           'WHL',
           --billcode,
           h.compid,
           --compid,
           NULL,
           --batcontno,
           p_applyno,
           --batapplyno,
           h.vencusno,
           b.vencusname,
           h.busno,
           h.saler,
           --saler,
           h.pickuptype,
           --pickuptype,
           NULL,
           --accchkdate,
           NULL,
           --accchker,
           0,
           --accchked,o
           h.invoicetype,
           h.addrid,
           --addrid,
           h.whlgroupid,
           --whlgroupid,
           NULL,
           --notes,
           p_lastmodify,
           --lastmodify,
           SYSDATE,
           --lasttime,
           0,
           --status,
           NULL,
           --execdate,
           NULL,
           --checker1,
           0,
           --checkbit1,
           NULL,
           --checker2,
           0,
           --checkbit2,
           NULL,
           --checker3,
           0,
           --checkbit3,
           NULL,
           --checker4,
           0,
           --checkbit4,
           NULL,
           --checker5,
           0,
           --checkbit5,
           h.paytype,
           --paytype, 月结
           h.cashtype,
           h.ownerid,
           --ownerid,
           h.reckonerid,
           --reckonerid,
           h.subitemid,
           --subitemid,
           NULL,
           --parentbatsaltno,
           NULL,
           --loadorder,
           NULL,
           --checkdate1,
           NULL,
           --checkdate2,
           NULL,
           --checkdate3,
           NULL,
           --checkdate4,
           NULL,
           --checkdate5,
           NULL,
           --notes1,
           SYSDATE,
           --createtime,
           p_lastmodify,
           --createuser,
           1,
           --versionnum,
           NULL,
           --guarantor,
           NULL,
           --salename,
           NULL,
           --salezone
           CASE
             WHEN v_parawms0001 = '1' AND length(TRIM(v_wms_ownerid)) > 0 THEN
              '1'
             ELSE
              '0'
           END,
           --wms_flag,
           h.client,
           --client
           CASE
             WHEN instr(h.notes, '委托配送申请单') > 0 THEN
              1
             ELSE
              0
           END AS source_type,
           h.djbh,
           h.billsource,
           h.sale_idbs
      FROM t_batsaleapply_h h, t_vencus_base b
     WHERE h.applyno = p_applyno
       AND h.vencusno = b.vencusno;

  v_notes1 := '';
  select count(1)
    into v_count
    from tmp_batapply_avail_store
   where availableqty > 0;
  if v_count > 0 then
    FOR rec IN (SELECT d.wareid,
                       h.compid,
                       d.checkqty AS wareqty,
                       tw.warecode,
                       h.cashtype
                  FROM t_batsaleapply_h h, t_batsaleapply_d d, t_ware tw
                 WHERE h.applyno = p_applyno
                   AND h.applyno = d.applyno
                   AND h.compid = tw.compid
                   AND d.wareid = tw.wareid
                   AND nvl(d.checkqty, 0) > 0) LOOP

      v_isxx   := 0; --是否限销
      v_mesgxx := '';

      delete from tmp_batsale_restrict; --清空临时表
      FOR rec_store IN (SELECT st.*,
                               al.applyqty,
                               decode(st.batid,
                                      0,
                                      'M' || st.makeno,
                                      st.batid) AS batid1
                          FROM tmp_batapply_avail_store st,
                               tmp_batsale_act_alloc    al
                         WHERE st.compid = al.compid
                           AND st.busno = al.busno
                           AND st.wareid = al.wareid
                           AND st.wareid = rec.wareid
                           AND st.availableqty > 0
                           AND st.isstopselling <> 2
                           AND EXISTS
                         (SELECT 1
                                  FROM t_batsale_restrict_h a,
                                       t_batsale_restrict_d b
                                 WHERE a.restrictno = b.restrictno
                                   AND a.status = 1
                                      --AND b.wareid = st.wareid
                                   AND ((nvl(b.rest_flag, 0) = 0 AND
                                       b.wareid = st.wareid) OR
                                       (nvl(b.rest_flag, 0) = 1 AND EXISTS
                                        (SELECT 1
                                            FROM t_ware_class_base d
                                           WHERE (d.compid = rec.compid OR
                                                 (f_get_sys_inicode(rec.compid,
                                                                     '3034',
                                                                     NULL) = '0' AND
                                                 d.compid = 0))
                                             AND d.classgroupno =
                                                 b.classgroupno
                                             AND d.classcode = b.classcode
                                             AND d.wareid = rec.wareid)))
                                   AND a.compid = st.compid
                                      --AND b.wareid = rec.wareid
                                   AND a.compid = rec.compid
                                   AND a.startdate <= SYSDATE
                                   AND a.enddate >= SYSDATE)
                         ORDER BY CASE
                                    WHEN v_makeno_check > 0 and
                                         v_makeno_check <> 99999 THEN
                                     st.availableqty
                                    ELSE
                                     st.seq_id
                                  END) LOOP

        v_isxx := 1;
        v_js   := 0;
        IF rec_store.availableqty = 0 THEN
          --DELETE FROM tmp_batapply_avail_store WHERE seq_id = rec_store.seq_id;
          continue;
        END IF;

        pro_restrict_qty(v_compid,
                         rec_store.busno,
                         rec_store.wareid,
                         rec_store.batid1,
                         v_vencuscode,
                         v_ownerid,
                         v_saler,
                         p_lastmodify,
                         rec_store.availableqty,
                         0,
                         v_wareqty,
                         v_msg,
                         rec.cashtype);

        IF v_wareqty < rec_store.availableqty THEN
          --&@ *@ 请勿改动 否则会导致前端显示出错
          IF TRIM(v_msg) IS NOT NULL THEN
            v_js     := v_js + 1;
            v_mesgxx := v_msg;
          END IF;

          /*IF v_wareqty <= 0 THEN
            DELETE FROM tmp_batapply_avail_store
             WHERE seq_id = rec_store.seq_id;
          END IF;*/ --这里如果被限制不能删除。因为要考虑到缺货登记
          --更新已分配数量
          UPDATE tmp_batapply_avail_store
             SET actualqty = v_wareqty + actualqty
           WHERE seq_id = rec_store.seq_id;
        ELSE
          UPDATE tmp_batapply_avail_store
             SET actualqty = availableqty
           WHERE seq_id = rec_store.seq_id;

        END IF;
      END LOOP;

      v_mestz := '';
      SELECT SUM(nvl(actualqty, 0))
        INTO v_actualqty
        FROM tmp_batapply_avail_store
       WHERE wareid = rec.wareid;

      IF v_actualqty < rec.wareqty THEN

        IF v_isxx = 1 THEN
          v_notes1 := v_notes1 || v_mesgxx;
        END IF;

        SELECT COUNT(1)
          INTO v_count
          FROM tmp_batapply_avail_store
         WHERE compid = rec.compid
           AND wareid = rec.wareid
           AND isstopselling = 2;

        IF v_count > 0 THEN
          v_mestz := '商品' || rec.warecode || '存在已经停销批次' || chr(13);
        END IF;
        IF v_mestz IS NOT NULL THEN
          v_notes1 := v_notes1 || chr(13) || v_mestz;
        END IF;

      END IF; --存在限销得商品记录报错信息
      IF (v_makeno_check > 0 and v_makeno_check <> 99999) AND
         v_check_batch_flag = '2' THEN
        --这里取值取几个可用最大值的批号
        UPDATE tmp_batapply_avail_store
           SET status = 0
         WHERE wareid = rec.wareid;
        IF v_isxx = 1 THEN

          MERGE INTO tmp_batapply_avail_store a
          USING (SELECT *
                   FROM (SELECT qty, compid, wareid, busno, makeno
                           FROM (SELECT SUM(actualqty) qty,
                                        compid,
                                        wareid,
                                        busno,
                                        makeno
                                   FROM tmp_batapply_avail_store
                                  WHERE isstopselling <> 2
                                    AND wareid = rec.wareid
                                  GROUP BY compid, wareid, busno, makeno) a
                          ORDER BY qty DESC) a
                  WHERE rownum <= v_makeno_check) b
          ON (a.compid = b.compid AND a.wareid = b.wareid AND a.busno = b.busno AND a.makeno = b.makeno)
          WHEN MATCHED THEN
            UPDATE SET a.status = 1;
          IF v_makejs = 0 THEN
            SELECT SUM(actualqty) --被限制了分配数量
              INTO v_actualqty
              FROM tmp_batapply_avail_store a
             WHERE wareid = rec.wareid
               AND status = 1;

            SELECT SUM(actualqty) --实际可分配数量
              INTO v_actualqty1
              FROM tmp_batapply_avail_store a
             WHERE wareid = rec.wareid;
            IF v_actualqty < rec.wareqty AND v_actualqty1 > v_actualqty THEN
              v_makejs := 1;
            END IF;
          END IF;
          UPDATE tmp_batapply_avail_store
             SET actualqty = 0
           WHERE wareid = rec.wareid
             AND status = 0;

        ELSE
          MERGE INTO tmp_batapply_avail_store a
          USING (SELECT *
                   FROM (SELECT qty, compid, wareid, busno, makeno
                           FROM (SELECT SUM(availableqty) qty,
                                        compid,
                                        wareid,
                                        busno,
                                        makeno
                                   FROM tmp_batapply_avail_store
                                  WHERE isstopselling <> 2
                                    AND wareid = rec.wareid
                                  GROUP BY compid, wareid, busno, makeno) a
                          ORDER BY qty DESC) a
                  WHERE rownum <= v_makeno_check) b
          ON (a.compid = b.compid AND a.wareid = b.wareid AND a.busno = b.busno AND a.makeno = b.makeno)
          WHEN MATCHED THEN
            UPDATE SET a.status = 1;

          UPDATE tmp_batapply_avail_store
             SET actualqty = availableqty
           WHERE wareid = rec.wareid
             AND status = 1;

          IF v_makejs = 0 THEN
            SELECT SUM(actualqty)
              INTO v_actualqty
              FROM tmp_batapply_avail_store a
             WHERE wareid = rec.wareid
               AND status = 1;

            SELECT SUM(availableqty)
              INTO v_actualqty1
              FROM tmp_batapply_avail_store a
             WHERE wareid = rec.wareid;
            IF v_actualqty < rec.wareqty AND v_actualqty1 > v_actualqty THEN
              v_makejs := 1;
            END IF;
          END IF;
          UPDATE tmp_batapply_avail_store
             SET actualqty = 0
           WHERE wareid = rec.wareid
             AND status = 0;
        END IF;
      END IF;
    end loop;

    delete from tmp_batsale_restrict; --清空临时表
    FOR rec IN (SELECT d.wareid,
                       h.compid,
                       d.checkqty AS wareqty,
                       tw.warecode,
                       h.cashtype,
                       h.busno
                  FROM t_batsaleapply_h h, t_batsaleapply_d d, t_ware tw
                 WHERE h.applyno = p_applyno
                   AND h.applyno = d.applyno
                   AND h.compid = tw.compid
                   AND d.wareid = tw.wareid
                   AND nvl(d.checkqty, 0) > 0) LOOP

      v_isxx := 0; --是否限销

      SELECT count(1)
        into v_count
        FROM t_batsale_restrict_h a, t_batsale_restrict_d b
       WHERE a.restrictno = b.restrictno
         AND a.status = 1
            --AND b.wareid = st.wareid
         AND ((nvl(b.rest_flag, 0) = 0 AND b.wareid = rec.wareid) OR
             (nvl(b.rest_flag, 0) = 1 AND EXISTS
              (SELECT 1
                  FROM t_ware_class_base d
                 WHERE (d.compid = rec.compid OR
                       (f_get_sys_inicode(rec.compid, '3034', NULL) = '0' AND
                       d.compid = 0))
                   AND d.classgroupno = b.classgroupno
                   AND d.classcode = b.classcode
                   AND d.wareid = rec.wareid)))
         AND a.compid = rec.compid
         AND a.startdate <= SYSDATE
         AND a.enddate >= SYSDATE;
      if v_count > 0 then

        v_isxx := 1;
      end if;

      SELECT SUM(nvl(actualqty, 0))
        INTO v_actualqty
        FROM tmp_batapply_avail_store
       WHERE wareid = rec.wareid;
      IF v_actualqty = 0 AND v_isxx = 0 THEN
        --商品没有受到限销

        IF v_para8139 = '1' THEN

          --先计算整件

          select nvl(a.maxqty * (floor(a.applyqty / a.maxqty)), 0) applyqty
            into v_applyqty --整件出库数量
            from tmp_batsale_act_alloc a
           WHERE a.maxqty * (floor(a.applyqty / a.maxqty)) > 0
             AND a.wareid = rec.wareid;
          if v_applyqty > 0 then
            /*        FOR recd IN (SELECT a.compid,
                  a.busno,
                  a.wareid,
                  a.maxqty * (floor(a.applyqty / a.maxqty)) applyqty
             FROM tmp_batsale_act_alloc a
            WHERE a.maxqty * (floor(a.applyqty / a.maxqty)) > 0
              AND a.wareid = rec.wareid) LOOP*/
            INSERT INTO t_batsale_d
              (batsaleno,
               rowno,
               wareid,
               factoryid,
               wareqty,
               stallno,
               batid,
               makeno,
               makedate,
               purprice,
               purtax,
               saletax,
               saleprice,
               invalidate,
               whlprice,
               leastwhlprice,
               maxwhlprice,
               dtlsaler,
               midqty,
               avgpurprice,
               pstflag,
               backprice,
               notes,
               distprice,
               setpurprice1,
               setpurprice2,
               setwhlprice1,
               setwhlprice2,
               setwhlprice3,
               setwhlprice4,
               setwhlprice5,
               chker1,
               chker2,
               batbackqty,
               batbackamt,
               redeemsum,
               prediswhlprice,
               maxqty,
               areacode,
               multibusno,
               invoiceredeemsum,
               packnum,
               ifselectbat,
               ownerid)
              SELECT v_batsaleno,
                     rownum + (SELECT nvl(MAX(rowno), 0)
                                 FROM t_batsale_d
                                WHERE batsaleno = v_batsaleno),
                     wareid,
                     nvl(factoryid, -1),
                     --factoryid,
                     CASE
                       WHEN sumstore_qty <= v_applyqty THEN
                        availableqty
                       ELSE
                        v_applyqty + availableqty - sumstore_qty
                     END,
                     --wareqty
                     stallno,
                     --stallno,
                     batid,
                     --batid,
                     makeno,
                     --makeno,
                     makedate,
                     --makedate,
                     purprice,
                     purtax,
                     saletax,
                     --saletax,
                     0,
                     --saleprice,
                     invalidate,
                     /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                     wareid, batid, purprice, v_subitemid),*/
                     whlprice,
                     0,
                     --leastwhlprice,
                     0,
                     --maxwhlprice,
                     p_lastmodify,
                     --dtlsaler,
                     midqty,
                     0,
                     --avgpurprice,
                     0,
                     --pstflag,
                     0,
                     --backprice,
                     NULL,
                     --notes,
                     0,
                     --distprice,
                     0,
                     --setpurprice1,
                     0,
                     --setpurprice2,
                     0,
                     --setwhlprice1,
                     0,
                     --setwhlprice2,
                     0,
                     --setwhlprice3,
                     0,
                     --setwhlprice4,
                     0,
                     --setwhlprice5,
                     NULL,
                     --chker1,
                     NULL,
                     --chker2,
                     0,
                     --batbackqty,
                     0,
                     --batbackamt,
                     0,
                     --redeemsum,
                     0,
                     --0, --prediswhlprice,
                     maxqty,
                     areacode,
                     NULL,
                     --multibusno,
                     0,
                     --invoiceredeemsum,
                     0,
                     --packnum
                     1,
                     ownerid --ifselectbat
                FROM (SELECT a.*,
                             c.saletax,
                             SUM(a.availableqty) over(PARTITION BY a.compid, a.busno, a.wareid ORDER BY a.seq_id) sumstore_qty

                        FROM tmp_batapply_avail_store a
                        LEFT JOIN t_ware c
                          ON a.wareid = c.wareid
                         AND a.compid = c.compid
                       WHERE a.wareid = rec.wareid
                         AND a.compid = rec.compid
                         AND a.isstopselling <> 2
                         AND a.busno = rec.busno
                         AND a.sealtype = 2
                         AND a.availableqty > 0
                       ORDER BY a.seq_id)
               WHERE /*v_sum_qty - applyqty > 0 AND */
               sumstore_qty - availableqty < v_applyqty;

            MERGE INTO tmp_batapply_avail_store a
            USING (SELECT batid, wareid, stallno, makeno, wareqty
                     FROM t_batsale_d
                    WHERE batsaleno = v_batsaleno) b
            ON (a.wareid = b.wareid AND a.batid = b.batid AND a.stallno = b.stallno AND a.makeno = b.makeno)
            WHEN MATCHED THEN
              UPDATE
                 SET a.actualqty = b.wareqty
               WHERE a.wareid = rec.wareid;

            SELECT nvl(SUM(wareqty), 0)
              INTO v_wareqty
              FROM t_batsale_d
             WHERE batsaleno = v_batsaleno
               AND wareid = rec.wareid;

            UPDATE tmp_batsale_act_alloc a
               SET a.actualqty = v_wareqty
             WHERE a.compid = rec.compid
               AND a.wareid = rec.wareid
               AND a.busno = rec.busno;
          end if;
          -- END LOOP;

          SELECT COUNT(1)
            INTO v_count
            FROM tmp_batsale_act_alloc
           WHERE applyqty > actualqty
             AND wareid = rec.wareid;

          --剩余零件出库
          IF v_count > 0 THEN
            INSERT INTO t_batsale_d
              (batsaleno,
               rowno,
               wareid,
               factoryid,
               wareqty,
               stallno,
               batid,
               makeno,
               makedate,
               purprice,
               purtax,
               saletax,
               saleprice,
               invalidate,
               whlprice,
               leastwhlprice,
               maxwhlprice,
               dtlsaler,
               midqty,
               avgpurprice,
               pstflag,
               backprice,
               notes,
               distprice,
               setpurprice1,
               setpurprice2,
               setwhlprice1,
               setwhlprice2,
               setwhlprice3,
               setwhlprice4,
               setwhlprice5,
               chker1,
               chker2,
               batbackqty,
               batbackamt,
               redeemsum,
               prediswhlprice,
               maxqty,
               areacode,
               multibusno,
               invoiceredeemsum,
               packnum,
               ifselectbat,
               ownerid)
              SELECT v_batsaleno,
                     rownum + (SELECT nvl(MAX(rowno), 0)
                                 FROM t_batsale_d
                                WHERE batsaleno = v_batsaleno),
                     wareid,
                     nvl(factoryid, -1),
                     --factoryid,
                     CASE
                       WHEN sumstore_qty <= applyqtyt THEN
                        cansaleqty
                       ELSE
                        applyqtyt + cansaleqty - sumstore_qty
                     END,
                     --wareqty
                     stallno,
                     --stallno,
                     batid,
                     --batid,
                     makeno,
                     --makeno,
                     makedate,
                     --makedate,
                     purprice,
                     purtax,
                     saletax,
                     --saletax,
                     0,
                     --saleprice,
                     invalidate,
                     /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                     wareid, batid, purprice, v_subitemid),*/
                     whlprice,
                     0,
                     --leastwhlprice,
                     0,
                     --maxwhlprice,
                     p_lastmodify,
                     --dtlsaler,
                     midqty,
                     0,
                     --avgpurprice,
                     0,
                     --pstflag,
                     0,
                     --backprice,
                     NULL,
                     --notes,
                     0,
                     --distprice,
                     0,
                     --setpurprice1,
                     0,
                     --setpurprice2,
                     0,
                     --setwhlprice1,
                     0,
                     --setwhlprice2,
                     0,
                     --setwhlprice3,
                     0,
                     --setwhlprice4,
                     0,
                     --setwhlprice5,
                     NULL,
                     --chker1,
                     NULL,
                     --chker2,
                     0,
                     --batbackqty,
                     0,
                     --batbackamt,
                     0,
                     --redeemsum,
                     0,
                     --0, --prediswhlprice,
                     maxqty,
                     areacode,
                     NULL,
                     --multibusno,
                     0,
                     --invoiceredeemsum,
                     0,
                     --packnum
                     1,
                     ownerid --ifselectbat
                FROM (SELECT a.*,
                             c.saletax,
                             SUM(a.availableqty - a.actualqty) over(PARTITION BY a.compid, a.busno, a.wareid ORDER BY a.sealtype, a.seq_id) sumstore_qty,
                             (b.applyqty - b.actualqty) AS applyqtyt,
                             (a.availableqty - a.actualqty) AS cansaleqty
                        FROM tmp_batapply_avail_store a
                        LEFT JOIN t_ware c
                          ON a.wareid = c.wareid
                         AND a.compid = c.compid,
                       tmp_batsale_act_alloc b
                       WHERE a.wareid = b.wareid
                         AND a.compid = b.compid
                         AND a.busno = b.busno
                         AND a.isstopselling <> 2
                         AND a.wareid = rec.wareid
                         AND a.availableqty - a.actualqty > 0
                         AND b.applyqty > b.actualqty
                       ORDER BY a.sealtype, a.seq_id)
               WHERE sumstore_qty - cansaleqty < applyqtyt;

          END IF;
        ELSE
          INSERT INTO t_batsale_d
            (batsaleno,
             rowno,
             wareid,
             factoryid,
             wareqty,
             stallno,
             batid,
             makeno,
             makedate,
             purprice,
             purtax,
             saletax,
             saleprice,
             invalidate,
             whlprice,
             leastwhlprice,
             maxwhlprice,
             dtlsaler,
             midqty,
             avgpurprice,
             pstflag,
             backprice,
             notes,
             distprice,
             setpurprice1,
             setpurprice2,
             setwhlprice1,
             setwhlprice2,
             setwhlprice3,
             setwhlprice4,
             setwhlprice5,
             chker1,
             chker2,
             batbackqty,
             batbackamt,
             redeemsum,
             prediswhlprice,
             maxqty,
             areacode,
             multibusno,
             invoiceredeemsum,
             packnum,
             ifselectbat,
             ownerid)
            SELECT v_batsaleno,
                   rownum + (SELECT nvl(MAX(rowno), 0)
                               FROM t_batsale_d
                              WHERE batsaleno = v_batsaleno),
                   wareid,
                   nvl(factoryid, -1),
                   --factoryid,
                   CASE
                     WHEN sum_store <= applyqty THEN
                      availableqty
                     ELSE
                      applyqty + availableqty - sum_store
                   END,
                   --wareqty
                   stallno,
                   --stallno,
                   batid,
                   --batid,
                   makeno,
                   --makeno,
                   makedate,
                   --makedate,
                   purprice,
                   purtax,
                   saletax,
                   --saletax,
                   0,
                   --saleprice,
                   invalidate,
                   /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                   wareid, batid, purprice, v_subitemid),*/
                   whlprice,
                   0,
                   --leastwhlprice,
                   0,
                   --maxwhlprice,
                   p_lastmodify,
                   --dtlsaler,
                   midqty,
                   0,
                   --avgpurprice,
                   0,
                   --pstflag,
                   0,
                   --backprice,
                   NULL,
                   --notes,
                   0,
                   --distprice,
                   0,
                   --setpurprice1,
                   0,
                   --setpurprice2,
                   0,
                   --setwhlprice1,
                   0,
                   --setwhlprice2,
                   0,
                   --setwhlprice3,
                   0,
                   --setwhlprice4,
                   0,
                   --setwhlprice5,
                   NULL,
                   --chker1,
                   NULL,
                   --chker2,
                   0,
                   --batbackqty,
                   0,
                   --batbackamt,
                   0,
                   --redeemsum,
                   0,
                   --0, --prediswhlprice,
                   maxqty,
                   areacode,
                   NULL,
                   --multibusno,
                   0,
                   --invoiceredeemsum,
                   0,
                   --packnum
                   1,
                   ownerid --ifselectbat
              FROM (SELECT a.*,
                           b.applyqty,
                           (SUM(a.availableqty)
                            over(PARTITION BY a.compid,
                                 a.busno,
                                 a.wareid ORDER BY a.seq_id)) sum_store,
                           c.saletax
                      FROM tmp_batapply_avail_store a
                      LEFT JOIN t_ware c
                        ON a.wareid = c.wareid
                       AND a.compid = c.compid, tmp_batsale_act_alloc b
                     WHERE a.wareid = b.wareid
                       AND a.compid = b.compid
                       AND a.wareid = rec.wareid
                       AND a.isstopselling <> 2
                       AND a.busno = b.busno
                       AND a.availableqty > 0
                     ORDER BY a.seq_id)
             WHERE sum_store - availableqty < applyqty;
        END IF;
      ELSE
        --商品受到限销
        IF v_para8139 = '1' THEN
          --先计算整件
          Begin
            select nvl(a.maxqty * (floor(a.applyqty / a.maxqty)), 0) applyqty
              into v_applyqty --整件出库数量
              from tmp_batsale_act_alloc a
             WHERE a.maxqty * (floor(a.applyqty / a.maxqty)) > 0
               AND a.wareid = rec.wareid;
          EXCEPTION
            WHEN no_data_found THEN
              v_applyqty := 0;
          END;

          if v_applyqty > 0 then
            v_actualqty := 0;
            for recd in (select a.*,
                                c.saletax,
                                decode(a.batid, 0, 'M' || a.makeno, a.batid) AS batid1
                           FROM tmp_batapply_avail_store a
                           join tmp_batsale_act_alloc al
                             on a.compid = al.compid
                            AND a.busno = al.busno
                            AND a.wareid = al.wareid
                           LEFT JOIN t_ware c
                             ON a.wareid = c.wareid
                            AND a.compid = c.compid
                          WHERE a.wareid = rec.wareid
                            AND a.compid = rec.compid
                            AND a.isstopselling <> 2
                            AND a.busno = rec.busno
                            AND a.sealtype = 2
                            AND a.actualqty > 0
                          ORDER BY a.seq_id) loop

              if v_actualqty = v_applyqty then
                exit;
              end if;

              IF v_isxx = 1 THEN
                pro_restrict_qty(v_compid,
                                 recd.busno,
                                 recd.wareid,
                                 recd.batid1,
                                 v_vencuscode,
                                 v_ownerid,
                                 v_saler,
                                 p_lastmodify,
                                 recd.actualqty,
                                 0,
                                 v_wareqty,
                                 v_msg,
                                 rec.cashtype);
              else
                v_wareqty := recd.actualqty;
              end if;
              if v_wareqty = 0 then
                continue;
              end if;

              if v_wareqty >= v_applyqty - v_actualqty then
                v_wareqty := v_applyqty - v_actualqty;

              end if;

              INSERT INTO t_batsale_d
                (batsaleno,
                 rowno,
                 wareid,
                 factoryid,
                 wareqty,
                 stallno,
                 batid,
                 makeno,
                 makedate,
                 purprice,
                 purtax,
                 saletax,
                 saleprice,
                 invalidate,
                 whlprice,
                 leastwhlprice,
                 maxwhlprice,
                 dtlsaler,
                 midqty,
                 avgpurprice,
                 pstflag,
                 backprice,
                 notes,
                 distprice,
                 setpurprice1,
                 setpurprice2,
                 setwhlprice1,
                 setwhlprice2,
                 setwhlprice3,
                 setwhlprice4,
                 setwhlprice5,
                 chker1,
                 chker2,
                 batbackqty,
                 batbackamt,
                 redeemsum,
                 prediswhlprice,
                 maxqty,
                 areacode,
                 multibusno,
                 invoiceredeemsum,
                 packnum,
                 ifselectbat,
                 ownerid)
                SELECT v_batsaleno,
                       rownum + (SELECT nvl(MAX(rowno), 0)
                                   FROM t_batsale_d
                                  WHERE batsaleno = v_batsaleno),
                       recd.wareid,
                       nvl(recd.factoryid, -1),
                       --factoryid,
                       v_wareqty,
                       --wareqty
                       recd.stallno,
                       --stallno,
                       recd.batid,
                       --batid,
                       recd.makeno,
                       --makeno,
                       recd.makedate,
                       --makedate,
                       recd.purprice,
                       recd.purtax,
                       recd.saletax,
                       --saletax,
                       0,
                       --saleprice,
                       recd.invalidate,
                       /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                       wareid, batid, purprice, v_subitemid),*/
                       recd.whlprice,
                       0,
                       --leastwhlprice,
                       0,
                       --maxwhlprice,
                       p_lastmodify,
                       --dtlsaler,
                       recd.midqty,
                       0,
                       --avgpurprice,
                       0,
                       --pstflag,
                       0,
                       --backprice,
                       NULL,
                       --notes,
                       0,
                       --distprice,
                       0,
                       --setpurprice1,
                       0,
                       --setpurprice2,
                       0,
                       --setwhlprice1,
                       0,
                       --setwhlprice2,
                       0,
                       --setwhlprice3,
                       0,
                       --setwhlprice4,
                       0,
                       --setwhlprice5,
                       NULL,
                       --chker1,
                       NULL,
                       --chker2,
                       0,
                       --batbackqty,
                       0,
                       --batbackamt,
                       0,
                       --redeemsum,
                       0,
                       --0, --prediswhlprice,
                       recd.maxqty,
                       recd.areacode,
                       NULL,
                       --multibusno,
                       0,
                       --invoiceredeemsum,
                       0,
                       --packnum
                       1,
                       recd.ownerid --ifselectbat
                  FROM dual;

              UPDATE tmp_batapply_avail_store
                 SET awaitqty_makeno = v_wareqty
               WHERE wareid = recd.wareid
                 AND batid = recd.batid
                 AND stallno = recd.stallno; --已分配数量存放tmp_batapply_avail_store.awaitqty_makeno

              v_actualqty := v_actualqty + v_wareqty;

            END LOOP;

            SELECT nvl(SUM(wareqty), 0)
              INTO v_wareqty
              FROM t_batsale_d
             WHERE wareid = rec.wareid
               AND batsaleno = v_batsaleno;
            UPDATE tmp_batsale_act_alloc a
               SET a.actualqty = v_wareqty
             WHERE a.compid = rec.compid
               AND a.wareid = rec.wareid
               AND a.busno = rec.busno;
          end if;

          SELECT applyqty - nvl(actualqty, 0)
            INTO v_applyqty
            FROM tmp_batsale_act_alloc
           WHERE wareid = rec.wareid;
          --剩余零件出库
          IF v_applyqty > 0 THEN
            v_actualqty := 0;

            for recd in (select a.*,
                                c.saletax,
                                decode(a.batid, 0, 'M' || a.makeno, a.batid) AS batid1
                           FROM tmp_batapply_avail_store a
                           join tmp_batsale_act_alloc al
                             on a.compid = al.compid
                            AND a.busno = al.busno
                            AND a.wareid = al.wareid
                           LEFT JOIN t_ware c
                             ON a.wareid = c.wareid
                            AND a.compid = c.compid
                          WHERE a.wareid = rec.wareid
                            AND a.compid = rec.compid
                            AND a.isstopselling <> 2
                            AND a.busno = rec.busno
                            AND a.actualqty > 0
                            AND a.actualqty - a.awaitqty_makeno > 0
                          ORDER BY a.sealtype, a.seq_id) loop

              if v_actualqty = v_applyqty then
                exit;
              end if;

              IF v_isxx = 1 THEN
                pro_restrict_qty(v_compid,
                                 recd.busno,
                                 recd.wareid,
                                 recd.batid1,
                                 v_vencuscode,
                                 v_ownerid,
                                 v_saler,
                                 p_lastmodify,
                                 recd.actualqty,
                                 0,
                                 v_wareqty,
                                 v_msg,
                                 rec.cashtype);
              else
                v_wareqty := recd.actualqty;
              end if;
              if v_wareqty = 0 then
                continue;
              end if;

              if v_wareqty >= v_applyqty - v_actualqty then
                v_wareqty := v_applyqty - v_actualqty;

              end if;

              INSERT INTO t_batsale_d
                (batsaleno,
                 rowno,
                 wareid,
                 factoryid,
                 wareqty,
                 stallno,
                 batid,
                 makeno,
                 makedate,
                 purprice,
                 purtax,
                 saletax,
                 saleprice,
                 invalidate,
                 whlprice,
                 leastwhlprice,
                 maxwhlprice,
                 dtlsaler,
                 midqty,
                 avgpurprice,
                 pstflag,
                 backprice,
                 notes,
                 distprice,
                 setpurprice1,
                 setpurprice2,
                 setwhlprice1,
                 setwhlprice2,
                 setwhlprice3,
                 setwhlprice4,
                 setwhlprice5,
                 chker1,
                 chker2,
                 batbackqty,
                 batbackamt,
                 redeemsum,
                 prediswhlprice,
                 maxqty,
                 areacode,
                 multibusno,
                 invoiceredeemsum,
                 packnum,
                 ifselectbat,
                 ownerid)
                SELECT v_batsaleno,
                       rownum + (SELECT nvl(MAX(rowno), 0)
                                   FROM t_batsale_d
                                  WHERE batsaleno = v_batsaleno),
                       recd.wareid,
                       nvl(recd.factoryid, -1),
                       --factoryid,
                       v_wareqty,
                       --wareqty
                       recd.stallno,
                       --stallno,
                       recd.batid,
                       --batid,
                       recd.makeno,
                       --makeno,
                       recd.makedate,
                       --makedate,
                       recd.purprice,
                       recd.purtax,
                       recd.saletax,
                       --saletax,
                       0,
                       --saleprice,
                       recd.invalidate,
                       /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                       wareid, batid, purprice, v_subitemid),*/
                       recd.whlprice,
                       0,
                       --leastwhlprice,
                       0,
                       --maxwhlprice,
                       p_lastmodify,
                       --dtlsaler,
                       recd.midqty,
                       0,
                       --avgpurprice,
                       0,
                       --pstflag,
                       0,
                       --backprice,
                       NULL,
                       --notes,
                       0,
                       --distprice,
                       0,
                       --setpurprice1,
                       0,
                       --setpurprice2,
                       0,
                       --setwhlprice1,
                       0,
                       --setwhlprice2,
                       0,
                       --setwhlprice3,
                       0,
                       --setwhlprice4,
                       0,
                       --setwhlprice5,
                       NULL,
                       --chker1,
                       NULL,
                       --chker2,
                       0,
                       --batbackqty,
                       0,
                       --batbackamt,
                       0,
                       --redeemsum,
                       0,
                       --0, --prediswhlprice,
                       recd.maxqty,
                       recd.areacode,
                       NULL,
                       --multibusno,
                       0,
                       --invoiceredeemsum,
                       0,
                       --packnum
                       1,
                       recd.ownerid --ifselectbat
                  FROM dual;

              UPDATE tmp_batapply_avail_store
                 SET awaitqty_makeno = v_wareqty
               WHERE wareid = recd.wareid
                 AND batid = recd.batid
                 AND stallno = recd.stallno; --已分配数量存放tmp_batapply_avail_store.awaitqty_makeno

              v_actualqty := v_actualqty + v_wareqty;

            end loop;
          END IF;

        ELSE

          SELECT applyqty - nvl(actualqty, 0)
            INTO v_applyqty
            FROM tmp_batsale_act_alloc
           WHERE wareid = rec.wareid;
          IF v_applyqty > 0 THEN
            v_actualqty := 0;

            for recd in (select a.*,
                                c.saletax,
                                decode(a.batid, 0, 'M' || a.makeno, a.batid) AS batid1
                           FROM tmp_batapply_avail_store a
                           join tmp_batsale_act_alloc al
                             on a.compid = al.compid
                            AND a.busno = al.busno
                            AND a.wareid = al.wareid
                           LEFT JOIN t_ware c
                             ON a.wareid = c.wareid
                            AND a.compid = c.compid
                          WHERE a.wareid = rec.wareid
                            AND a.compid = rec.compid
                            AND a.isstopselling <> 2
                            AND a.busno = rec.busno
                            AND a.actualqty > 0
                          ORDER BY a.seq_id) loop

              if v_actualqty = v_applyqty then
                exit;
              end if;

              IF v_isxx = 1 THEN
                pro_restrict_qty(v_compid,
                                 recd.busno,
                                 recd.wareid,
                                 recd.batid1,
                                 v_vencuscode,
                                 v_ownerid,
                                 v_saler,
                                 p_lastmodify,
                                 recd.actualqty,
                                 0,
                                 v_wareqty,
                                 v_msg,
                                 rec.cashtype);
              else
                v_wareqty := recd.actualqty;
              end if;
              if v_wareqty = 0 then
                continue;
              end if;

              if v_wareqty >= v_applyqty - v_actualqty then
                v_wareqty := v_applyqty - v_actualqty;

              end if;

              INSERT INTO t_batsale_d
                (batsaleno,
                 rowno,
                 wareid,
                 factoryid,
                 wareqty,
                 stallno,
                 batid,
                 makeno,
                 makedate,
                 purprice,
                 purtax,
                 saletax,
                 saleprice,
                 invalidate,
                 whlprice,
                 leastwhlprice,
                 maxwhlprice,
                 dtlsaler,
                 midqty,
                 avgpurprice,
                 pstflag,
                 backprice,
                 notes,
                 distprice,
                 setpurprice1,
                 setpurprice2,
                 setwhlprice1,
                 setwhlprice2,
                 setwhlprice3,
                 setwhlprice4,
                 setwhlprice5,
                 chker1,
                 chker2,
                 batbackqty,
                 batbackamt,
                 redeemsum,
                 prediswhlprice,
                 maxqty,
                 areacode,
                 multibusno,
                 invoiceredeemsum,
                 packnum,
                 ifselectbat,
                 ownerid)
                SELECT v_batsaleno,
                       rownum + (SELECT nvl(MAX(rowno), 0)
                                   FROM t_batsale_d
                                  WHERE batsaleno = v_batsaleno),
                       recd.wareid,
                       nvl(recd.factoryid, -1),
                       --factoryid,
                       v_wareqty,
                       --wareqty
                       recd.stallno,
                       --stallno,
                       recd.batid,
                       --batid,
                       recd.makeno,
                       --makeno,
                       recd.makedate,
                       --makedate,
                       recd.purprice,
                       recd.purtax,
                       recd.saletax,
                       --saletax,
                       0,
                       --saleprice,
                       recd.invalidate,
                       /*f_get_gain_whlprice(compid, v_vencusno, v_whlgroupid,
                       wareid, batid, purprice, v_subitemid),*/
                       recd.whlprice,
                       0,
                       --leastwhlprice,
                       0,
                       --maxwhlprice,
                       p_lastmodify,
                       --dtlsaler,
                       recd.midqty,
                       0,
                       --avgpurprice,
                       0,
                       --pstflag,
                       0,
                       --backprice,
                       NULL,
                       --notes,
                       0,
                       --distprice,
                       0,
                       --setpurprice1,
                       0,
                       --setpurprice2,
                       0,
                       --setwhlprice1,
                       0,
                       --setwhlprice2,
                       0,
                       --setwhlprice3,
                       0,
                       --setwhlprice4,
                       0,
                       --setwhlprice5,
                       NULL,
                       --chker1,
                       NULL,
                       --chker2,
                       0,
                       --batbackqty,
                       0,
                       --batbackamt,
                       0,
                       --redeemsum,
                       0,
                       --0, --prediswhlprice,
                       recd.maxqty,
                       recd.areacode,
                       NULL,
                       --multibusno,
                       0,
                       --invoiceredeemsum,
                       0,
                       --packnum
                       1,
                       recd.ownerid --ifselectbat
                  FROM dual;

              UPDATE tmp_batapply_avail_store
                 SET awaitqty_makeno = v_wareqty
               WHERE wareid = recd.wareid
                 AND batid = recd.batid
                 AND stallno = recd.stallno; --已分配数量存放tmp_batapply_avail_store.awaitqty_makeno

              v_actualqty := v_actualqty + v_wareqty;

            end loop;
          END IF;

        END IF;
      END IF;

    END LOOP;
  end if;
  SELECT COUNT(1)
    INTO v_count
    FROM t_batsale_d
   WHERE batsaleno = v_batsaleno;
  IF v_count = 0 THEN
    DELETE FROM t_batsale_h WHERE batsaleno = v_batsaleno;
    IF substr(out_batsaleno, 1, 2) != '错误' OR out_batsaleno IS NULL THEN
      UPDATE t_batsaleapply_h SET indentflag = 1 WHERE applyno = p_applyno;
    END IF;
    v_notes := v_pare2976note || '批发申请单' || p_applyno || '转单失败';
  ELSE
    /*IF v_wms001 <> '1' THEN
      delete from tmp_batsale_restrict;
      for i in (SELECT a.compid,
                       a.busno,
                       b.makeno,
                       b.wareid,
                       decode(b.batid, 0, 'M' || b.makeno, b.batid) AS batid,
                       a.vencusno,
                       c.vencuscode,
                       a.ownerid,
                       a.saler,
                       a.lastmodify,
                       b.wareqty,
                       a.reckonerid,
                       a.cashtype,
                       b.rowno
                  FROM t_batsale_h a, t_batsale_d b, t_vencus c
                 WHERE a.batsaleno = b.batsaleno
                   AND a.compid = c.compid
                   AND nvl(b.pstflag, 0) = 0
                   AND a.vencusno = c.vencusno
                   AND a.batsaleno = v_batsaleno
                   AND EXISTS
                 (SELECT 1
                          FROM t_batsale_restrict_h aa,
                               t_batsale_restrict_d bb
                         WHERE aa.restrictno = bb.restrictno
                           AND aa.status = 1
                           AND bb.control_status = 1
                           AND ((nvl(bb.rest_flag, 0) = 0 AND
                               bb.wareid = b.wareid) OR
                               (nvl(bb.rest_flag, 0) = 1 AND EXISTS
                                (SELECT 1
                                    FROM t_ware_class_base d
                                   WHERE (d.compid = a.compid OR (f_get_sys_inicode(a.compid,
                                                                                    '3034',
                                                                                    NULL) = '0' AND
                                         d.compid = 0))
                                     AND d.classgroupno = bb.classgroupno
                                     AND d.classcode = bb.classcode
                                     AND d.wareid = b.wareid)))
                           AND aa.compid = a.compid
                           AND aa.startdate <= SYSDATE
                           AND aa.enddate >= SYSDATE)
                 ORDER BY b.wareid) loop
        pro_restrict_qty(pi_compid     => i.compid,
                         pi_busno      => i.busno,
                         pi_wareid     => i.wareid,
                         pi_batid      => i.batid,
                         pi_vencusno   => i.vencuscode,
                         pi_ownerid    => i.ownerid,
                         pi_saler      => i.saler,
                         pi_lastmodify => to_char(i.lastmodify),
                         pi_wareqty    => i.wareqty,
                         pi_actualqty  => 0,
                         po_wareqty    => v_wareqty,
                         po_msg        => v_msg,
                         pi_cashtype   => i.cashtype,
                         pi_reckonerid => i.reckonerid);
        if v_wareqty < i.wareqty then
          if v_wareqty > 0 then
            update t_batsale_d
               set wareqty = v_wareqty
             where batsaleno = v_batsaleno
               and rowno = i.rowno;
          else
            delete from t_batsale_d
             where batsaleno = v_batsaleno
               and rowno = i.rowno;
          end if;
          if instr(v_notes1,v_msg) <= 0 then
             v_notes1 := v_notes1 ||v_msg;
          end if;
        end if;
      end loop;
    end if;*/
    UPDATE t_batsaleapply_h
       SET batsaleno = v_batsaleno, indentflag = 1
     WHERE applyno = p_applyno;
    --因取批发销售价时,性能考虑,只能每行调用一次f_get_gain_whlprice, 故把批发销售价更新到折前销售价(prediswhlprice)
    SELECT SUM(wareqty * whlprice)
      INTO v_amt
      FROM t_batsale_d
     WHERE batsaleno = v_batsaleno;
    INSERT INTO tmp_disable_trigger (table_name) VALUES ('t_batsale_d');
    INSERT INTO tmp_disable_trigger (table_name) VALUES ('t_batsale_h');
    UPDATE t_batsale_d bd
       SET bd.prediswhlprice = bd.whlprice
     WHERE bd.batsaleno = v_batsaleno;
    UPDATE t_batsale_h
       SET sum_whlprice = v_amt
     WHERE batsaleno = v_batsaleno
       AND compid = v_compid; --fyy19325更新单头单据金额,资信校验用
    DELETE FROM tmp_disable_trigger WHERE table_name = 't_batsale_d';
    DELETE FROM tmp_disable_trigger WHERE table_name = 't_batsale_h';
    SELECT nvl(SUM(wareqty), 0) qty
      INTO v_count
      FROM t_batsale_d
     WHERE batsaleno = v_batsaleno;
    out_batsaleno := v_batsaleno;
    v_notes       := v_pare2976note || '批发申请单' || p_applyno ||
                     '转单,生成批发销售单:' || v_batsaleno || ',总数量' || v_count;
  END IF;
  /*更新实际分配数量*/
  MERGE INTO tmp_batsale_act_alloc tba
  USING (SELECT SUM(d.wareqty) total, d.wareid
           FROM t_batsale_d d
          WHERE d.batsaleno = v_batsaleno
          GROUP BY d.wareid) t
  ON (tba.wareid = t.wareid)
  WHEN MATCHED THEN
    UPDATE SET tba.actualqty = t.total;

  v_para2790 := f_get_sys_inicode(p_compid  => v_compid,
                                  p_inicode => '2790',
                                  p_userid  => NULL);
  INSERT INTO tmp_disable_trigger (table_name) VALUES ('t_supply');
  ---批发销售同一个客户、货主、部门、商品、在30天内重复请货就根据 2790 是否累加
  --tmp_batsaleapply_gsp_del  记录的GSP排除掉的商品信息 此处不在生成补货申请
  FOR rec_store1 IN (SELECT a.applyqty,
                            a.compid,
                            a.busno,
                            a.wareid,
                            nvl(b.sum_qty, 0) sum_qty,
                            tw.warecode
                       FROM tmp_batsale_act_alloc a
                       LEFT JOIN (SELECT st.compid,
                                        st.wareid,
                                        st.busno,
                                        SUM(st.wareqty - st.awaitqty) AS sum_qty
                                   FROM tmp_batapply_avail_store st
                                  GROUP BY st.compid, st.wareid, st.busno) b
                         ON a.compid = b.compid
                        AND a.busno = b.busno
                        AND a.wareid = b.wareid
                       LEFT JOIN t_ware tw
                         ON a.compid = tw.compid
                        AND a.wareid = tw.wareid
                      WHERE a.applyqty > a.actualqty
                        AND NOT EXISTS
                      (SELECT 1
                               FROM tmp_batsaleapply_gsp_del del
                              WHERE del.applyno = p_applyno
                                AND del.vencusno = v_vencusno
                                AND del.wareid = a.wareid)) LOOP
    v_applyqty := rec_store1.applyqty;
    /*若可用数量大于申请数量,不需要生成补货*/
    IF v_applyqty > rec_store1.sum_qty THEN
      MERGE INTO t_supply ts
      USING (SELECT temp.compid compid,
                    temp.wareid wareid,
                    temp.busno  busno,
                    SYSDATE     supplydate,
                    --supplydate,
                    temp.applyqty - rec_store1.sum_qty supplyqty,
                    --supplyqty,
                    nvl(sh.lastmqty, 0) salemonqty,
                    --salemonqty,
                    nvl(sh.sumqty, 0) busqty,
                    --busqty,
                    nvl(sh.sumqty, 0) sumqty,
                    --sumqty,
                    w.maxqty     maxqty,
                    w.minqty     minqty,
                    p_lastmodify createuser,
                    --createuser,
                    SYSDATE   createtime,
                    p_applyno notes,
                    --notes,
                    0 stamp,
                    --stamp,
                    SYSDATE firstsupplydate,
                    --firstsupplydate,
                    '41' supplydpt,
                    --supplydpt,  这个有点小争议
                    2 supplytype,
                    --supplytype,
                    0 plantype,
                    --plantype,
                    NULL planno,
                    --planno,
                    0 disposetype,
                    --disposetype,
                    NULL disposedate,
                    --disposedate,
                    w.lastvencusno vendorno,
                    --vendorno,
                    p_lastmodify lastmodify,
                    --lastmodify,
                    SYSDATE lastdate,
                    --lastdate,
                    --  f_get_serial('SUP', rec.busno)  SUPPLYNO,
                    b.ownerid    ownerid,
                    b.reckonerid reckonerid,
                    b.vencusno   custno,
                    b.vencusno   vencusno,
                    p_applyno    srccode,
                    --源单据号  srccode
                    'A' srctype,
                    --源单类型来源  srctype    批发申请转批发
                    CASE
                      WHEN v_parawms0001 = '1' AND length(TRIM(v_wms_ownerid)) > 0 THEN
                       '1'
                      ELSE
                       '0'
                    END wms_flag,
                    NULL batsaleno,
                    0 toflag,
                    0 objbusno,
                    b.whlgroupid,
                    b.saler,
                    b.subitemid
               FROM tmp_batsale_act_alloc temp
               JOIN t_ware w
                 ON temp.wareid = w.wareid
                AND temp.compid = w.compid
               LEFT JOIN t_store_h sh
                 ON sh.compid = temp.compid
                AND sh.busno = temp.busno
                AND sh.wareid = temp.wareid
               JOIN t_batsaleapply_h b
                 ON b.applyno = p_applyno
              WHERE temp.applyqty > temp.actualqty
                AND temp.compid = rec_store1.compid
                AND temp.busno = rec_store1.busno
                AND temp.wareid = rec_store1.wareid) t
      ON (ts.vencusno = t.vencusno AND ts.compid = t.compid AND ts.busno = t.busno AND ts.wareid = t.wareid AND SYSDATE - ts.createtime <= 30 AND ts.srctype = 'A' AND ts.reckonerid = t.reckonerid AND ts.ownerid = t.ownerid AND ts.disposetype = 0 AND ts.plantype = 0 AND ts.whlgroupid = t.whlgroupid AND ts.saler = t.saler AND ts.subitemid = t.subitemid)
      WHEN MATCHED THEN
        UPDATE
           SET ts.supplyqty =
               (CASE
                 WHEN v_para2790 = '0' THEN
                  t.supplyqty
                 ELSE
                  ts.supplyqty + t.supplyqty
               END),
               ts.lastmodify = p_lastmodify,
               ts.lastdate   = SYSDATE,
               ts.srccode    = p_applyno,
               ts.notes      = ts.notes || ',' || p_applyno
      WHEN NOT MATCHED THEN
        INSERT
          (compid,
           wareid,
           busno,
           supplydate,
           supplyqty,
           salemonqty,
           busqty,
           sumqty,
           maxqty,
           minqty,
           createuser,
           createtime,
           notes,
           stamp,
           firstsupplydate,
           supplydpt,
           supplytype,
           plantype,
           planno,
           disposetype,
           disposedate,
           vendorno,
           lastmodify,
           lastdate,
           supplyno,
           ownerid,
           reckonerid,
           custno,
           vencusno,
           srccode,
           srctype,
           wms_flag,
           batsaleno,
           toflag,
           objbusno,
           whlgroupid,
           saler,
           subitemid)
        VALUES
          (t.compid,
           t.wareid,
           t.busno,
           t.supplydate,
           t.supplyqty,
           t.salemonqty,
           t.busqty,
           t.sumqty,
           t.maxqty,
           t.minqty,
           t.createuser,
           t.createtime,
           t.notes,
           t.stamp,
           t.firstsupplydate,
           t.supplydpt,
           t.supplytype,
           t.plantype,
           t.planno,
           t.disposetype,
           t.disposedate,
           t.vendorno,
           t.lastmodify,
           t.lastdate,
           f_get_serial('SUP', t.busno),
           t.ownerid,
           t.reckonerid,
           t.custno,
           t.vencusno,
           t.srccode,
           t.srctype,
           t.wms_flag,
           t.batsaleno,
           t.toflag,
           t.objbusno,
           t.whlgroupid,
           t.saler,
           t.subitemid);
      DELETE FROM tmp_disable_trigger WHERE table_name = 't_supply';
    END IF;
  END LOOP;

  SELECT listagg(supplyno, ',') within GROUP(ORDER BY supplyno)
    INTO v_supplyno
    FROM t_supply
   WHERE srccode = p_applyno
     AND compid = v_compid
     and srctype = 'A';

  SELECT a.data_length
    INTO v_length
    FROM user_tab_columns a
   WHERE a.table_name = 'T_BATSALEAPPLY_H'
     AND a.column_name = 'NOTES';

  UPDATE t_batsaleapply_h
     SET notes = substrb((notes || ' ' || v_notes || CASE
                           WHEN v_supplyno IS NULL THEN
                            ''
                           ELSE
                            ',生成缺货登记:' || v_supplyno
                         END || v_notes1 || CASE
                           WHEN v_makejs = 0 THEN
                            ''
                           ELSE
                            ',往来单位存在批号混批个数限制。'
                         END),
                         1,
                         v_length)

   WHERE applyno = p_applyno;

  MERGE INTO t_batsaleapply_d a
  USING (SELECT srccode AS applyno, wareid, supplyno
           FROM t_supply
          WHERE compid = v_compid
            AND srccode = p_applyno
            and srctype = 'A') b
  ON (a.applyno = b.applyno AND a.wareid = b.wareid AND a.applyno = p_applyno)
  WHEN MATCHED THEN
    UPDATE SET a.supplyno = b.supplyno; --把缺货登记单号回写批发申请单

  --清除GSP过滤记录
  DELETE FROM tmp_batsaleapply_gsp_del del WHERE del.applyno = p_applyno;

---更新t_batsale_d 的行号
merge into t_batsale_d a
using (select d.dj_sn,d.wareid,h.BATAPPLYNO, h.batsaleno from  t_batsaleapply_d d left join t_batsale_h h on d.applyno = nvl(h.BATAPPLYNO,1) and d.applyno = p_applyno ) b
on ( a.wareid = b.wareid and a.batsaleno = b.batsaleno)
when matched then update
 set a.back_var5 = b.dj_sn;

/*---更新主表单据编号和来源类型

 update t_batsale_h h
    set h.djbh    =
        (select djbh
           from t_batsaleapply_h tba
          where tba.applyno = h.batapplyno
          and tba.applyno = p_applyno )
       ,h.billsource =
        (select billsource
           from t_batsaleapply_h tba
          where tba.applyno = h.batapplyno
          and tba.applyno = p_applyno)
  where h.batapplyno = p_applyno;
*/
END;

批发销售单需要增加触发器,用来回传销售出库数据

CREATE OR REPLACE TRIGGER ctr_t_batsale_h_ysb
  BEFORE INSERT OR UPDATE ON t_batsale_h
  FOR EACH ROW
/*本触发器用于销售单保存时,更新药师帮主表提取字段 */
DECLARE
  v_disable_trigger_ind PLS_INTEGER;
BEGIN
  SELECT COUNT(*)
    INTO v_disable_trigger_ind
    FROM tmp_disable_trigger
   WHERE table_name = 't_batsale_h';

  IF v_disable_trigger_ind > 0 THEN
    RETURN;
  END IF;
  --生效时更新药师帮状态表状态
  IF :new.compid = 1 AND :new.checkbit1 = 1 AND :old.checkbit1 = 0 and :new.djbh is not null THEN

    INSERT INTO ysb_ddmx_writeback
      (orderid,
       ordercode,
       dj_sn,
       drugcode,
       amount,
       price,
       je,
       batchnum,
       proddate,
       validity,
       status)
    SELECT h.djbh,
           h.batsaleno,
           d.rowno,
           f_get_warecode(d.wareid,h.compid),
           d.wareqty,
           d.whlprice,
           ROUND(d.wareqty * d.whlprice, 4),
           d.makeno,
           TO_CHAR(d.makedate, 'yyyy-mm-dd'),
           TO_CHAR(d.invalidate, 'yyyy-mm-dd'),
           3
    FROM t_batsale_d d
    LEFT JOIN t_batsale_h h
      ON h.batsaleno = d.batsaleno
     WHERE  h.batsaleno = :new.batsaleno;

  END IF;
  IF :new.compid = 1 AND :new.status = 1 AND :old.status = 0 and :new.djbh is not null THEN

    MERGE INTO ysb_ddmx_writeback a
    USING (SELECT r.orderid, r.dj_sn
             FROM t_batsale_d d, ysb_ddmx_writeback r
            WHERE r.orderid = :new.djbh
              AND r.dj_sn = to_number(d.back_var5)
              AND d.batsaleno = :new.batsaleno
            GROUP BY r.orderid, r.dj_sn) t
    ON (a.orderid = t.orderid AND a.dj_sn = t.dj_sn)
    WHEN MATCHED THEN
      UPDATE SET a.status = 2;
  END IF;

  -- 生效时将快递单号回写至快递单表
  IF :new.compid = 1 AND :new.status = 1 AND :old.status = 0 and :new.djbh is not null THEN
    for rec in (select * from table(f_split_str(:new.expressno, ','))) loop
      insert into d_batsale_ext
        (djbh,
         batsaleno,
         expressno,
         express_code,
         expresscompany,
         btbbillcode)
      values
        (:new.djbh,
         :new.batsaleno,
         rec.str,
         :new.express_code,
         :new.expresscompany,
         :new.sale_idbs);
    end loop;
  end if;
END ctr_t_batsale_h_ysb;

给药师帮提供如下数据

/*
登录信息:
数据库登录地址192.168.X.XX:1521
数据库实例:hydee
账号:ysbuser
密码:ysbpwd
*/

-- 1.库存(库存 栏)取两个字段:
select warecode as "drugCode",nvl(wareqty,0) as "stock" from H2.CV_YSB_WAREQTY;

--2.价格(价格 栏)取三个字段,编码跟单体价为必须值:
select rtrim(warecode) as "drugCode" , 
setwhlprice1 as "price", --(数字,不能传字符的值)
setwhlprice1 as "chainPrice" --(没有另外定价的,就与单体价格取值一致,一个商品只能上传一个单体价格)
from H2.CV_YSB_WARE_WHLPRICE;

--3.(多价格体系 栏)如果需要上传多个价格
select rtrim(a.warecode) as "drugCode",
nvl((case when a.purprice=0 then 999999 else a.purprice end),9999) as "price9"
from h2.cv_ysb_djpurprice_new a;

--4.药品效期(药品批号 栏)取四个字段:
SELECT warecode as "drugCode", ---商品编码
min(makeno) as "batchNum", ---批号
nvl(to_char(min(invalidate),'yyyy-mm-dd'),' ') as "validity", --有效期至
nvl(to_char(min(makedate),'yyyy-mm-dd'),' ') as "prodDate" --生产日期
from H2.CV_YSB_WARE_STORE_I
group by warecode;

--6.药店信息  现在只能同步药店编码用于订单对接
select ' ' as "controlType", --管控方式(取''就行)
'' as "code",
rtrim(vencuscode) as "number", --药店编码--这个值会同步为平台上录入的药店编码,选在界面上可视的那个或之前同步订单用的那个
rtrim(vencusname) as "storeTitle", --药店名称
'' as "busiScope",
'' as "certNo",
'' as "invalidDate",
'' as "address",
'' as "address"--地址
--nvl(to_char(''),'0') as "drugstoreBranchId"--系统有存放平台客户id的,才上传这个字段
from H2.CV_YSB_VENCUS
--and spjl='1'--审批合格
order by "number";

--5.药品信息 !!!商品信息同步仅供一键上架功能使用,不更新现有上架品种信息!!!
select
drugCode as "drugCode", --药品编码(字符串)--同其他语句使用的商品编码字段 *
drugName as "drugName" , --商品名称(字符串) *
pack as "pack" , --商品规格(字符串) *
factory as "factory" , --生产厂家(字符串) *
unit as "unit" , --单位  中文药品单位,如盒、包、箱等(字符串) *
barcode as "barcode" , --商品条形码(字符串)(*最好有)
approval as "approval" , --批准文号,国药准字H20103180(字符串) *
busiType as "busiType" , --经营类别(*最好有)(字符串)
stock as "stock" , --库存(数字)*(取仓库的库存,用商品表left join库存表取值,保证所有品种可取到)
price as "price" , --价格(数字)*(取值与价格同步语句相同,不同步价格可定9999)
step as "step" , --购买增量、步长(数字类型)--即 采购倍数(默认填1)
taxRate as "taxRate" , --税率(数字)
midPack as "midPack" , --中包装数(数字)
wholePack as "wholePack",  --整包装数(数字)
recommendedPrice as "recommendedPrice" --建议零售价(数字)
from h2.cv_ysb_ware;

--9.订单状态回传,工具8-8栏
select to_number(orderId) as "orderId",  --取药师帮平台上的订单id
orderCode  as "orderCode",  --随货给客户的明细单上的单号,一般是出库单号或是销售单号
status  as "status",  --3-分捡中 2-待配送 (按实际状态填对应数字,如填2,该单据会在平台上跳转到待配送列表下,顺序是3-2)
drugCode  as "drugCode",  --平台上该药物的编码
amount  as "amount",  --实际出库数量
price  as "price",   --单价
batchNum  as "batchNum",  --批号
validity  as "validity",  --有效期
prodDate  as "prodDate"  --生产日期
from h2.ysb_ddmx_writeback where orderId in (VAL_orderIds)
order by "orderId","drugCode","batchNum"

--7.上传快递,工具9-2栏 “订单快递”
select 
orderId as "orderId",
logisticsId as "logisticsId",
logisticsNo as "logisticsNo",
1 as "status",
invoiceStatus as "invoiceStatus"
from h2.cv_ysb_express;

--8.上传发票,工具9-3栏 “订单发票”
select 
a.djbh as "orderId",
a.invoicetenno as "invoiceCode",
a.invoicelist as "invoiceNo",
'' as "securityCode",
a.pdf_url as "invoiceUrl"
from h2.cv_erp2pt_fp a 
where billsource = 1
order by a.djbh

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇