2018年10月

需求背景

对于出口企业来说,涉及到出口退税,发票的开具必须依照报关单进行,收取外汇也要根据报关单,通过浏览器插件进入电子口岸采集报关单到中间系统,然后中间系统从用友U8读取相应的发货订单情况,建立关联,然后根据航天开票系统的参数进行发票导出配置,这样就可以进行报关单直接导入到开票系统进行发票开具,发票开具完成后,再从发票系统导出开票数据到中间系统,中间系统进行开票关联,这样,报关到开票到系统订单就打通了,现在系统是写死的,需要进行改造,改造中的思路需要记录一下。

配置表

现有系统的参数都是写死的,不利于数据对接。为了便于可扩展,现在需要对系统进行单独建表配置。
开票系统

  • 产品编码
  • 产品名称
  • 规格
    U8系统
  • 订单号字段
  • 费用字段
    报关单系统
  • 备注字段

线性表基本操作

  • 插入删除
  • 建表
  • 划分
  • 归并
  • 逆置
  • 去最值
  • 其他
    线性表操作属性

插入操作

  • 判断位置是否合法
  • 取值 0 到 length
  • 小于maxSize
  • 移动元素从后往前
  • 调整顺序表length的长度
    顺序表插入流程

    删除操作

  • 顺序从前往后移动
  • 调整length长度
  • 清零 length=0,元素虽然留在数组,但是可以认为是隐藏的,当length等于0时,不可以再删除元素

    int deleteElem(int sqList[],int &length,int p,int &e)
    {
    /*首先判断参数是否合法*/
    if(p<0 || p>length-1){
      return 0;
    }
    e = sqList[p];
    for(int i=p;i<length-1;++i){
      sqList[i]=sqList[i+1];
      /*注意要变动静态表的长度*/
      --length;
    }
    return 1;
    }

建表(链表分为头插法和尾插法)

  • 带头结点head指针
  • 一开始没有指向
  • 数据域的来源,一个是键盘输入,一个是数组提供

    /*尾插法Rear,一般用带头节点的单链表*/
    void createLinkListRear(LNode *&head)
    {
    head = (LNode*)malloc(sizeof(Lnode));
    head->next = NULL;/*需要初始化*/
    /*定义两个指针一个是当前的p,一个是尾节点r*/;
    LNode *p = NULL,*r = head;
    int n;
    std::cin>>n; // scanf("%d",&n)
    for(int i=0;i < n ; ++)
    {
      p = (LNode*)malloc(sizeof(LNode));
      p->next = NULL;
      std::cin>>p->data;//scanf("%d",&(p->data));
      /*建好之后,r节点为尾节点,p节点需要基础*/
      p->next = r->next;
      r->next = p;
      r = p;
    }
    }

静态链表

  • 每个元素有两个属性
  • data
  • next
  • 隐藏属性 index
    静态链表结构图
    节点插入