Skip to content

订单重构

订单重构

数据库

订单表

    CREATE TABLE `tbl_order` (
      `id` varchar(11) NOT NULL DEFAULT '' COMMENT '订单ID',
      `type` tinyint(4) NOT NULL COMMENT '订单类型(1:PL,2:LK)',
      `serial` varchar(64) NOT NULL DEFAULT '' COMMENT '订单修改序列号',
      `user_id` varchar(11) NOT NULL DEFAULT '' COMMENT '用户ID或站点ID',
      `address_id` varchar(11) NOT NULL DEFAULT '' COMMENT '店铺ID或站点ID',
      `address` varchar(200) NOT NULL DEFAULT '' COMMENT '收货地址',
      `receiver_name` varchar(50) NOT NULL DEFAULT '' COMMENT '收货人',
      `receiver_phone` varchar(50) NOT NULL DEFAULT '' COMMENT '收货人电话',
      `area_id` bigint(20) NOT NULL COMMENT '区域ID',
      `district_code` varchar(10) NOT NULL DEFAULT '' COMMENT '城市码',
      `resname` varchar(100) NOT NULL DEFAULT '' COMMENT '店铺名',
      `pay_method` tinyint(4) NOT NULL COMMENT '付款方式',
      `station_id` varchar(10) NOT NULL DEFAULT '' COMMENT '站点ID',
      `time_config_id` varchar(10) NOT NULL DEFAULT '' COMMENT '时间配置ID',
      `order_time` datetime NOT NULL COMMENT '下单时间',
      `sorting_time` datetime DEFAULT NULL COMMENT '分拣时间',
      `distribute_time` datetime DEFAULT NULL COMMENT '配送时间',
      `pay_time` datetime DEFAULT NULL COMMENT '支付时间',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `modify_time` datetime DEFAULT NULL COMMENT '修改时间',
      `delete_time` datetime DEFAULT NULL COMMENT '删除时间',
      `expire_time` datetime DEFAULT NULL COMMENT '过期时间',
      `close_time` datetime DEFAULT NULL COMMENT '关闭时间',
      `receive_begin_time` datetime NOT NULL COMMENT '收货开始时间',
      `receive_end_time` datetime NOT NULL COMMENT '收货结束时间',
      `status` int(11) NOT NULL COMMENT '状态',
      `pay_status` int(11) NOT NULL COMMENT '支付状态',
      `settle_way` int(11) NOT NULL COMMENT '商户结算方式',
      `price` bigint(11) NOT NULL COMMENT '下单金额',
      `real_price` bigint(11) NOT NULL COMMENT '出库金额',
      `fee` bigint(11) NOT NULL COMMENT '应付金额',
      `real_pay` bigint(11) NOT NULL DEFAULT '0' COMMENT '实付',
      `paid_amount` bigint(11) NOT NULL DEFAULT '0' COMMENT '已支付金额',
      `refund_amount` bigint(11) NOT NULL DEFAULT '0' COMMENT '退款金额',
      `freeze` int(11) NOT NULL COMMENT '订单锁定状态',
      `refund_price` bigint(11) NOT NULL DEFAULT '0' COMMENT '退货金额',
      `refund_number` int(11) NOT NULL DEFAULT '0' COMMENT '退货数',
      `abnormal_price` bigint(11) NOT NULL DEFAULT '0' COMMENT '异常金额',
      `abnormal_number` int(11) NOT NULL DEFAULT '0' COMMENT '异常数',
      `freight_price` int(11) NOT NULL DEFAULT '0' COMMENT '退货金额',
      `remark` varchar(100) DEFAULT NULL COMMENT '订单备注',
      `pay_remak` varchar(100) DEFAULT NULL COMMENT '付款备注',
      `aggregate_type` int(11) NOT NULL DEFAULT '0' COMMENT '聚合方式',
      `extra1` int(11) DEFAULT NULL COMMENT '备份字段',
      `extra2` int(11) DEFAULT NULL COMMENT '备份字段',
      `extra3` varchar(32) DEFAULT NULL COMMENT '备份字段',
      `extra4` varchar(32) DEFAULT NULL COMMENT '备份字段',
      `extra5` datetime DEFAULT NULL COMMENT '备份字段',
      `extra6` datetime DEFAULT NULL COMMENT '备份字段',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

订单详情表

    CREATE TABLE `tbl_order_detail` (
      `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
      `order_id` varchar(11) NOT NULL DEFAULT '' COMMENT '订单ID',
      `sku_id` varchar(20) NOT NULL DEFAULT '' COMMENT '商品ID',
      `sku_version` int(11) NOT NULL COMMENT '版本号',
      `sku_name` varchar(50) NOT NULL DEFAULT '' COMMENT 'sku名称',
      `sale_unit_name` varchar(10) NOT NULL DEFAULT '' COMMENT 'sku单位',
      `sale_price` int(11) NOT NULL COMMENT '销售价',
      `sku_is_weight` tinyint(4) NOT NULL COMMENT '是否称重商品',
      `sku_is_price_timing` tinyint(11) NOT NULL COMMENT '是否时价商品',
      `sku_attrition_rate` float NOT NULL COMMENT 'sku损耗率',
      `sale_ratio` float NOT NULL COMMENT '规格',
      `spu_id` varchar(20) NOT NULL DEFAULT '' COMMENT 'spu id',
      `std_unit_name` varchar(10) NOT NULL DEFAULT '' COMMENT 'spu单位',
      `std_sale_price` int(11) NOT NULL COMMENT 'sku售价',
      `is_weighted` int(11) NOT NULL COMMENT '是否已称重',
      `spu_remark` varchar(50) DEFAULT NULL COMMENT '商品备注',
      `order_count` double NOT NULL COMMENT '下单数',
      `real_count` double NOT NULL COMMENT '实际下单数(包含损耗)',
      `out_count` double NOT NULL COMMENT '出库数',
      `pay_count` double NOT NULL COMMENT '结账数',
      `weight_count` double DEFAULT NULL COMMENT '称重数',
      `out_of_stock` tinyint(4) DEFAULT NULL COMMENT '缺货标记',
      `std_real_count` double NOT NULL COMMENT '标准单位出库数',
      `std_pay_count` double NOT NULL COMMENT '标准单位结账数',
      `total_price` int(11) NOT NULL COMMENT '下单金额',
      `real_price` int(11) NOT NULL COMMENT '出库金额',
      `fee` int(11) NOT NULL COMMENT '应付金额',
      `salemenu_id` varchar(11) NOT NULL DEFAULT '' COMMENT '销售单ID',
      `origin_sale_price` int(11) DEFAULT NULL COMMENT '原销售价',
      `rule_id` varchar(20) DEFAULT NULL COMMENT '锁价规格ID',
      `origin_price` int(11) DEFAULT NULL COMMENT '原下单金额',
      `fake_price` int(11) DEFAULT NULL COMMENT '伪下单金额',
      `cost` int(11) DEFAULT NULL COMMENT '成本价格',
      `extra1` int(11) DEFAULT NULL COMMENT '备用字段',
      `extra2` int(11) DEFAULT NULL COMMENT '备用字段',
      `extra3` varchar(32) DEFAULT NULL COMMENT '备用字段',
      `extra4` varchar(32) DEFAULT NULL COMMENT '备用字段',
      `extra5` datetime DEFAULT NULL COMMENT '备用字段',
      `extra6` datetime DEFAULT NULL COMMENT '备用字段',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

订单供应关系表

    CREATE TABLE `tbl_order_supply_chain` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `origin_order_id` varchar(11) NOT NULL DEFAULT '',
      `origin_sku_id` varchar(11) NOT NULL DEFAULT '',
      `origin_quantity` double NOT NULL,
      `up_order_id` varchar(11) NOT NULL DEFAULT '',
      `up_sku_id` varchar(11) NOT NULL DEFAULT '',
      `up_quantity` double NOT NULL,
      `up_station_id` varchar(10) NOT NULL COMMENT '站点ID',
      `aggregate_type` int(11) NOT NULL DEFAULT '0' COMMENT '聚合方式',
      `time_config_id` varchar(10) NOT NULL DEFAULT '' COMMENT '时间配置ID',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

订单流水表

    CREATE TABLE `tbl_order_flow` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `key` varchar(128) NOT NULL,
      `serial` varchar(64) NOT NULL,
      `datetime` datetime NOT NULL,
      `request_id` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

相关功能接口

bshop

  1. /order/submit 提交订单 新建订单或更新订单商品
  2. /order/receipt 签收订单 更新订单状态
  3. /order/paid 设置订单为已支付 查询订单 更新订单状态和支付信息
  4. /pay 获取支付信息 更新订单状态和支付信息
  5. /pay/wechat/notify 支付结果通知 更新订单状态和支付信息

manage

  1. /ordermanage/exception/PLxx 添加异常信息 更新订单商品实收数量、应付金额和异常、退货信息

station

  1. update_order_sku_stock 出库接口 修改订单商品成本金额
  2. set_real_quantity 称重接口 更新商品出库数及相关金额信息
  3. /station/order/create station下单 创建订单、更新订单
  4. /station/order/edit station更新订单 更新订单
  5. /station/order/set_status 批量设置订单状态 更新订单状态

接口

bshop

split_order 分单

  1. 将购物车中的商品根据站点和服务时间分组
  2. 判断每组商品是否可以合并到已经已经下的订单中
  3. 计算分组的商品总价和运费

/order/submit 订单提交

接口名: /order/submit
Method: POST
请求:
    orders     M   list     下单信息
    [{
        salemenu_ids     M    list    销售单ID列表
        sku_ids  M    list    商品ID列表
        station_id     M    string    站点ID
        spu_remark   M   dict   商品备注
        {
            spu_id: 备注信息
        }
    }]
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   订单信息
    [{
        code  M  int  下单结果
        msg   M  string  提示信息
        extender  M  dict  信息
        {
            _id  M  string  订单ID
            order_id  M  string  订单ID
            total_pay M  int  下单金额
            customer  M  dict
            {
                receive_begin_time  M  string  收货开始时间
                receive_end_time    M  string  收货结束时间
            }
        }
    }]
逻辑:
    1. 检测商户状态(是否冻结、欠款)
    2. 检测收货时间设置
    3. 检查下单时间(当前是否在下单周期内)
    4. 生成收货时间
    5. 处理spu备注
    6. 检查sku是否存在、上架状态、当前客户能否下单、库存
    7. 验证服务时间 商品是否处理同一服务时间的销售单、是否在下单时间内
    9. 扣减库存
    10. 调用下单/更新接口
    11. 成功,发送消息通知;失败,恢复库存

order

/order/create 创建订单

接口名: /order/create
Method: POST
请求:
    customer     M   dict     商户信息
    {
        user_id     M    string    用户ID
        address_id  M    string    店铺ID
        address     M    string    店铺地址
        receiver_name   M   string   收货人
        receiver_phone  M   string  收货电话
        resname     M    string    店铺名
        area_id     M    int    店铺区域
        district_code     M    string    城市码
        pay_method     M    int    支付方式
        settle_way    M    int    结算方式
    }
    station_id   M   string   站点ID
    receive_begin_time  M   string 收货开始时间
    receive_end_time    M   string 收货结束时间
    skus         M   list     下单商品信息
    [{
        id     M    string    商品ID
        amount   M   float    商品数量
        price    O   float    商品价格
        name   M    string    商品名
        version M   int       sku版本号
        sale_unit_name   M   string    单位名称
        sale_price   M  int      销售价格
        is_weight   M   int     是否称重
        salemenu_id  M   string  销售单ID
        is_price_timing M int  是否时价商品
        attrition_rate M float 损耗率
        sale_ratio   M   float   规格
        spu_id  M  string   spu id
        std_unit_name M string 标准单位
        std_sale_price M float 标准单位价格
        spu_remark M string 商品备注
    }]
    price_rule   M   dict     锁价信息
    {
        sku_id  M  string  商品ID
        {
            rule_type  M  int  规则类型
            rule_id  M  string  规则ID
            yx_price  M  int  规则价格
        }
    }
    freight      M   dict     运费规则
    time_config_id M   str     服务时间ID
    remark       M   string   订单备注
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   订单信息
    {
        order_id M  string 订单ID
    }
逻辑:
    1. 生成商品详情(根据锁价规则、是否传入单价计算商品价格)
    2. 计算订单价格
    3. 生成运费
    4. 保存订单
    5. 发送异步消息(更新LK单,同步出库单)

/order/update 更新订单详情

接口名: /order/update
Method: POST
请求:
    order_id   M   string   站点ID
    receive_begin_time  O   int 收货开始时间
    receive_end_time    O   int 收货结束时间
    price_rule   M   list     锁价信息
    freight      M   dict     运费规则
    is_delta   M   bool  是否增量修改(默认为False)
    skus         M   list     下单商品信息
    [{
        id     M    string    商品ID
        amount   M   float    商品数量
        price    O   float    商品价格
        name   M    string    商品名
        version M   int       sku版本号
        sale_unit_name   M   string    单位名称
        sale_price   M  int      销售价格
        is_weight   M   int     是否称重
        salemenu_id  M   string  销售单ID
        is_price_timing M int  是否时价商品
        attrition_rate M float 损耗率
        material    M     list   spu相关信息
        [{
            sale_ratio   M   float   规格
            spu_id  M  string   spu id
            std_unit_name M string 标准单位
            std_sale_price M float 标准单位价格
        }]
    }]
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   返回数据
逻辑:
    1. 获取订单数据
    2. 区分新增商品、更新商品
    3. 新增商品生成商品详情,更新商品修改商品数量、计算商品价格
    4. 计算订单总价
    5. 生成运费
    6. 保存订单
    7. 发送异步消息(更新LK单,同步出库单)

/order/delete 删除订单详情

接口名: /order/delete
Method: POST
请求:
    id   M   string   订单ID
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   返回数据
逻辑:
    1. 获取订单数据
    2. 更新订单状态为已删除
    3. 发送异步消息(更新LK单,同步出库单)

/order/supply/update 更新上游供应订单

接口名: /order/supply/update
Method: POST
请求:
    order_id   M   string   站点ID
    customer     M   dict     商户信息
    {
        user_id     M    string    用户ID
        address_id  M    string    店铺ID
        address     M    string    店铺地址
        receiver_name   M   string   收货人
        receiver_phone  M   string  收货电话
        resname     M    string    店铺名
        area_id     M    int    店铺区域
        district_code     M    string    城市码
        pay_method     M    int    支付方式
    }
    station_id   M   string   站点ID
    receive_begin_time  M   string 收货开始时间
    receive_end_time    M   string 收货结束时间
    cart         M   list     购物车商品信息
    [{
        sku_id   M   string   商品ID
        amount   M   float    商品数量
        origin_sku_id   M   string   原商品ID
        origin_amount   M   float    原商品数量
    }]
    skus         M   list     商品信息
    [{
        id     M    string    商品ID
        name   M    string    商品名
        version M   int       sku版本号
        sale_unit_name   M   string    单位名称
        sale_price   M  int      销售价格
        is_weight   M   int     是否称重
        salemenu_id  M   string  销售单ID
        is_price_timing M int  是否时价商品
        attrition_rate M float 损耗率
        split_flag   M   int  分切标识
        sale_ratio   M   float   规格
        spu_id  M  string   spu id
        std_unit_name M string 标准单位
        std_sale_price M float 标准单位价格
    }]
    price_rule   M   dict     锁价信息
    time_config_id  M  str   服务时间配置ID
    service_time_type  M  int  服务时间类型
    aggregate_type  M  int  订单聚合类型
    service_begin_time  M   string 站点开始服务时间
    service_end_time    M   string 站点结束服务时间
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   返回数据
逻辑:
    1. 判断订单是否存在上游,存在上游则合并商品到上游订单中
    2. 不存在上游,则判断聚合类型是否合单,不合单则新建订单
    3. 查询是否存在是否存在相同站点、聚合类型、时间配置在同一时间周期下的订单
    4. 存在上游订单则更新订单,不存在则新建订单

station

/station/order/supply/dispatch 订单上游分配

接口名: /order/supply/dispatch
Method: POST
请求:
    order_id   M    string    订单ID
    cart       M    list      原订单商品和数量
    [{
        sku_id    M    string    订单ID
        amount    M   float    商品数量
    }]
响应:
    code    M    int    返回码
    msg     M    str    错误提示信息
    data    M    dict   返回数据
逻辑:
    1. 获取订单详情
    2. 获取商品详情
    3. 根据商品站点、聚合类型进行商品分组
    4. 根据站点信息生成customer参数
    5. 生成收货时间,预售根据用户的收货时间设置,非预售设置为第二天站点收货时间
    6. 计算站点的下单周期或者收货周期(合单用), 预售计算客户收货时间所在的收货周期,非预售计算时间配置的下单周期
    7. 调用更新上游供应商订单接口

逻辑改动

  1. 生成sku快照放在修改sku信息时
  2. 库存扣减放在web层