09btree

本文详细介绍了C++编程语言及其在数据结构实现中的应用,包括二叉树、队列、栈等基本数据结构的定义与操作。通过具体代码实例,展示了如何使用C++进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

09btree/btree.c

#include <stdio.h>
#include "btree.h"
#include "queue.h"

static void bnode_init(struct btree_info *info,
        struct bnode_info *bnode)
{
    bnode->parent = NULL;
    bnode->lchild = NULL;
    bnode->rchild = NULL;
}

static void btree_add(struct btree_info *info,
        struct bnode_info *bnode,
        int (*cmp)(struct bnode_info *,
            struct bnode_info *)) 
{
    bnode_init(info, bnode);

    struct bnode_info *cur = info->root;
    struct bnode_info **pparent = &info->root;

    while (*pparent) {
        if (cmp(bnode, cur) < 0) {
            pparent = &cur->lchild;
        } else {
            pparent = &cur->rchild;
        }   

        if (*pparent) {
            cur = *pparent;
        }   
    }   

    *pparent = bnode;
    bnode->parent = cur;
}


09btree/Makefile

SRCS := btree.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)


09btree/include/btree.h

struct bnode_info {
    struct bnode_info *parent;
    struct bnode_info *lchild;
    struct bnode_info *rchild;
};

struct btree_info {
    struct bnode_info *root;
    void (*bnode_init)(struct btree_info *,
            struct bnode_info *);
    void (*add)(struct btree_info *,
            struct bnode_info *bnode,
            int (*cmp)(struct bnode_info *,
                struct bnode_info *));
    void (*preorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*inorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*postorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*levelorder)(struct btree_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));
    void (*reverse)(struct btree_info *); 
    void (*del)(struct btree_info *,
            struct bnode_info *,
            void (*)(struct btree_info *,
                struct bnode_info *));


 

    struct bnode_info *(*search)(struct btree_info *,
            struct bnode_info *key,
            int (*cmp)(struct bnode_info *,
                struct bnode_info *));
};

void btree_init(struct btree_info *);
void btree_destroy(struct btree_info *,
        void (*)(struct btree_info *,
            struct bnode_info *));

#define offsetof(type, member) \
    ( (size_t)(&((type*)0)->member) )

#define container_of(ptr, type, member) \
    ({const typeof(((type*)0)->member) *__mptr = ptr; \
      (type *)((char*)ptr - offsetof(type, member));})


 


09btree/include/list.h

struct node_info {
    struct node_info *prev;
    struct node_info *next;
    char priv[];
};

struct list_info {
    struct node_info *head;
    void (*add)(struct list_info *,
            const void *data_entry,
            size_t data_size);
    void (*add_tail)(struct list_info *,
            const void *data_entry,
            size_t data_size);
    void (*del)(struct list_info *,
            struct node_info *,
            size_t data_size);
};

#define list_for_each(cur, head) \
    for (cur = (head)->next; \
        (cur) != (head); \
        cur = (cur)->next)

#define list_for_each_safe(cur, tmp, head) \
    for (cur = (head)->next, tmp = (cur)->next; \
        (cur) != (head); \
        cur = tmp, tmp = (tmp)->next)

#define ENTRY(node, type) ((type*)(node->priv))

void list_init(struct list_info*);
void list_destroy(struct list_info*);


09btree/include/queue.h

#include "list.h"

struct queue_info {
    struct list_info list;
    void (*push)(struct queue_info *,
            const void *data_entry,
            size_t data_size);
    int (*pop)(struct queue_info *,
            void *data_entry,
            size_t data_size);
    int (*top)(struct queue_info *,
            void *data_entry,
            size_t data_size);
    int (*isempty)(struct queue_info *); 
};

void queue_init(struct queue_info *); 
void queue_destroy(struct queue_info *); 
~                                                


09btree/main/test.c

#include <stdio.h>
#include <stdlib.h>
#include "btree.h"

struct node_info {
    ssize_t data;
    struct bnode_info bnode;
};

static int cmp(struct bnode_info *a, struct bnode_info *b)
{
    struct node_info *pa = container_of(a, struct node_info, bnode);
    struct node_info *pb = container_of(b, struct node_info, bnode);

    return pa->data - pb->data;
}

static void print_node(struct btree_info *info,
        struct bnode_info *bnode)
{
    struct node_info *ptr = container_of(bnode, struct node_info, bnode);
    printf("%ld ", ptr->data);
}

static void m_free(struct btree_info *info,
        struct bnode_info *bnode)
{
    info->bnode_init(info, bnode);
    free(container_of(bnode, struct node_info, bnode));
}


 

int main()
{
    struct btree_info btree;
    btree_init(&btree);

    struct node_info *cur = NULL;

    ssize_t s[] = {10, 15, 2, 6, 7, 3, 8, 5, 2, 0, -2, 6};

    size_t i = 0;
    for (i = 0; i < sizeof(s) / sizeof(ssize_t); ++i) {
        cur = (struct node_info *)malloc(sizeof(struct node_info));
        cur->data = s[i];
        btree.add(&btree, &cur->bnode, cmp);
    }

    struct node_info key = {6};
    struct bnode_info *search_ret = NULL;


 

    printf("del node %ld\n", key.data);
    if (search_ret = btree.search(&btree, &key.bnode, cmp)) {
        btree.del(&btree, search_ret, m_free);
    }

    printf("preorder\n");
    btree.preorder(&btree, print_node);
    printf("\n");
    printf("inorder\n");
    btree.inorder(&btree, print_node);
    printf("\n");
    printf("postorder\n");
    btree.postorder(&btree, print_node);
    printf("\n");
    printf("levelorder\n");
    btree.levelorder(&btree, print_node);
    printf("\n");

    btree_destroy(&btree, m_free);

    return 0;
}


09btree/main/Makefile

SRCS := test.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)


09btree/queue/list.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"


static void __list_add(struct node_info *prev,
        struct node_info *next,
        const void *data_entry,
        size_t data_size)
{
    struct node_info *node = (struct node_info *)malloc(sizeof(struct node_info) + data_size);
    memcpy(node->priv, data_entry, data_size);

    node->prev = prev;
    node->next = next;
    prev->next = node;
    next->prev = node;
}


 

static void list_add(struct list_info *info,
        const void *data_entry, size_t data_size)
{
    __list_add(info->head, info->head->next,
            data_entry, data_size);
}

static void list_add_tail(struct list_info *info,
        const void *data_entry, size_t data_size)
{
    __list_add(info->head->prev, info->head,
            data_entry, data_size);
}


 

static void list_del(struct list_info *info,
        struct node_info *node,
        size_t data_size)
{
    node->prev->next = node->next;
    node->next->prev = node->prev;
    node->prev = node;
    node->next = node;

    if (data_size) {
        memset(node->priv, 0, data_size);
    }
    free(node);
}

void list_init(struct list_info *info)
{
    info->head = (struct node_info *)malloc(sizeof(struct node_info));
    info->head->prev = info->head;
    info->head->next = info->head;

    info->add = list_add;
    info->add_tail = list_add_tail;
    info->del = list_del;
}

void list_destroy(struct list_info *info)
{
    struct node_info *cur = info->head->next;

    for (; cur != info->head; cur = info->head->next) {
        list_del(info, cur, 0);
    }

    free(info->head);
}


09btree/queue/queue.c

#include <stdio.h>
#include <string.h>
#include "queue.h"


static void queue_push(struct queue_info *info,
        const void *data_entry,
        size_t data_size)
{
    info->list.add_tail(&info->list, data_entry, data_size);
}

static int queue_isempty(struct queue_info *info)
{
    return info->list.head->next == info->list.head;
}

static int queue_top(struct queue_info *info,
        void *data_entry,
        size_t data_size)
{
    if (queue_isempty(info)) {
        return -1; 
    }   

    if (data_entry) {
        memcpy(data_entry, info->list.head->next->priv, data_size);
    }   
    return 0;
}


 

static int queue_pop(struct queue_info *info,
        void *data_entry,
        size_t data_size)
{
    if (queue_top(info, data_entry, data_size) < 0) {
        return -1; 
    }

    //?..绗.?涓..?..?
    info->list.del(&info->list, info->list.head->next, data_size);
    return 0;
}

void queue_init(struct queue_info *info)
{
    list_init(&info->list);
    info->push = queue_push;
    info->pop = queue_pop;
    info->top = queue_top;
    info->isempty = queue_isempty;
}

void queue_destroy(struct queue_info *info)
{
    list_destroy(&info->list);
}


09btree/queue/Makefile

SRCS := list.c queue.c
SUBDIR := 

$(BUILT_IN): $(SRCS:.c=.o) $(SUBDIR)
    $(LD) $(LDFLAGS) -r -o $@ $(SRCS:.c=.o) $(SUBDIR:=/$(BUILT_IN))

$(SUBDIR):
    $(MAKE) -C $@

$(SRCS:.c=.o):
    $(CC) $(CFLAGS) -c $<

$(DEP): $(SRCS)
    $(CC) $(CFLAGS) -MM $(SRCS) >$@
    sed -i "s/: / $@: /g" $@

sinclude $(DEP)

.PHONY: clean $(SUBDIR)

clean:
    for dir in $(SUBDIR); do \
        $(MAKE) -C $$dir clean; \
    done
    $(RM) $(SRCS:.c=.o) $(BUILT_IN) $(DEP)



 

/* Navicat Premium Dump SQL Source Server : 1 Source Server Type : MySQL Source Server Version : 50744 (5.7.44) Source Host : localhost:32770 Source Schema : 实习 Target Server Type : MySQL Target Server Version : 50744 (5.7.44) File Encoding : 65001 Date: 02/07/2025 16:55:29 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for 出库单 -- ---------------------------- DROP TABLE IF EXISTS `出库单`; CREATE TABLE `出库单` ( `出库单号` int(11) NOT NULL, `出库日期` date NULL DEFAULT NULL, `仓储编号` int(11) NULL DEFAULT NULL, `出库状态` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`出库单号`) USING BTREE, INDEX `idx_出库单号`(`出库单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 出库细则 -- ---------------------------- DROP TABLE IF EXISTS `出库细则`; CREATE TABLE `出库细则` ( `出库细则号` int(11) NOT NULL, `农产品号` int(11) NULL DEFAULT NULL, `出库单号` int(11) NULL DEFAULT NULL, `出库数` int(11) NULL DEFAULT NULL, PRIMARY KEY (`出库细则号`) USING BTREE, INDEX `idx_出库细则号`(`出库细则号`) USING BTREE, INDEX `idx_出库单号_出库细则`(`出库单号`) USING BTREE, INDEX `idx_农产品编号_出库`(`农产品号`) USING BTREE, CONSTRAINT `出库细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `出库细则_ibfk_2` FOREIGN KEY (`出库单号`) REFERENCES `出库单` (`出库单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 订货单 -- ---------------------------- DROP TABLE IF EXISTS `订货单`; CREATE TABLE `订货单` ( `订货单号` int(11) NOT NULL, `订货_time` datetime NULL DEFAULT NULL, `订单状态` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`订货单号`) USING BTREE, INDEX `idx_订货单号`(`订货单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 订货细则 -- ---------------------------- DROP TABLE IF EXISTS `订货细则`; CREATE TABLE `订货细则` ( `订货细则号` int(11) NOT NULL, `农产品号` int(11) NULL DEFAULT NULL, `订货单号` int(11) NULL DEFAULT NULL, `下单数量` int(11) NULL DEFAULT NULL, PRIMARY KEY (`订货细则号`) USING BTREE, INDEX `订货单号`(`订货单号`) USING BTREE, INDEX `idx_订货细则号`(`订货细则号`) USING BTREE, INDEX `idx_农产品编号_订货`(`农产品号`) USING BTREE, CONSTRAINT `订货细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `订货细则_ibfk_2` FOREIGN KEY (`订货单号`) REFERENCES `订货单` (`订货单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 供应商 -- ---------------------------- DROP TABLE IF EXISTS `供应商`; CREATE TABLE `供应商` ( `供应商号` int(11) NOT NULL, `供应商名称` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `供应商电话` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `银行账号` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`供应商号`) USING BTREE, INDEX `idx_供应商号`(`供应商号`) USING BTREE, INDEX `idx_供应商名称`(`供应商名称`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 购买流水 -- ---------------------------- DROP TABLE IF EXISTS `购买流水`; CREATE TABLE `购买流水` ( `流水单号` int(11) NOT NULL, `顾客编号` int(11) NULL DEFAULT NULL, `流水日期` datetime NULL DEFAULT NULL, `流水类型` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `金额` decimal(10, 2) NULL DEFAULT NULL, PRIMARY KEY (`流水单号`) USING BTREE, INDEX `idx_流水单号_购买流水`(`流水单号`) USING BTREE, INDEX `idx_顾客编号`(`顾客编号`) USING BTREE, CONSTRAINT `购买流水_ibfk_1` FOREIGN KEY (`顾客编号`) REFERENCES `顾客` (`顾客编号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 购买细则 -- ---------------------------- DROP TABLE IF EXISTS `购买细则`; CREATE TABLE `购买细则` ( `购买细则号` int(11) NOT NULL, `农产品号` int(11) NULL DEFAULT NULL, `购买流水单号` int(11) NULL DEFAULT NULL, `购买数量` int(11) NULL DEFAULT NULL, PRIMARY KEY (`购买细则号`) USING BTREE, INDEX `idx_购买细则号`(`购买细则号`) USING BTREE, INDEX `idx_购买流水单号`(`购买流水单号`) USING BTREE, INDEX `idx_农产品编号_购买`(`农产品号`) USING BTREE, CONSTRAINT `购买细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `购买细则_ibfk_2` FOREIGN KEY (`购买流水单号`) REFERENCES `购买流水` (`流水单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 顾客 -- ---------------------------- DROP TABLE IF EXISTS `顾客`; CREATE TABLE `顾客` ( `顾客编号` int(11) NOT NULL, `顾客名` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `收货地址` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `联系方式` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `身份` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`顾客编号`) USING BTREE, INDEX `idx_顾客名`(`顾客名`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 货架 -- ---------------------------- DROP TABLE IF EXISTS `货架`; CREATE TABLE `货架` ( `货架编号` int(11) NOT NULL, `农产品号` int(11) NULL DEFAULT NULL, `货架位置` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `货架已占用容量` int(11) NULL DEFAULT NULL, `货架总容量` int(11) NULL DEFAULT NULL, PRIMARY KEY (`货架编号`) USING BTREE, INDEX `idx_货架编号`(`货架编号`) USING BTREE, INDEX `idx_农产品编号_货架`(`农产品号`) USING BTREE, CONSTRAINT `货架_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 交易反馈单 -- ---------------------------- DROP TABLE IF EXISTS `交易反馈单`; CREATE TABLE `交易反馈单` ( `交易反馈单单号` int(11) NOT NULL DEFAULT 0, `交易_time` datetime NULL DEFAULT NULL, `交易状态` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `订单单号` int(11) NULL DEFAULT 0, PRIMARY KEY (`交易反馈单单号`) USING BTREE, INDEX `idx_交易反馈单单号`(`交易反馈单单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 交易细则 -- ---------------------------- DROP TABLE IF EXISTS `交易细则`; CREATE TABLE `交易细则` ( `交易细则号` int(11) NOT NULL DEFAULT 0, `农产品号` int(11) NULL DEFAULT NULL, `交易反馈单单号` int(11) NULL DEFAULT 0, `交易数量` int(11) NULL DEFAULT 0, PRIMARY KEY (`交易细则号`) USING BTREE, INDEX `idx_交易细则号`(`交易细则号`) USING BTREE, INDEX `idx_交易反馈单单号`(`交易反馈单单号`) USING BTREE, INDEX `idx_农产品编号_交易`(`农产品号`) USING BTREE, CONSTRAINT `交易细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `交易细则_ibfk_2` FOREIGN KEY (`交易反馈单单号`) REFERENCES `交易反馈单` (`交易反馈单单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 进货单 -- ---------------------------- DROP TABLE IF EXISTS `进货单`; CREATE TABLE `进货单` ( `进货单号` int(11) NOT NULL DEFAULT 0, `进货日期` datetime NOT NULL DEFAULT '1970-01-01 00:00:00', `供应商号` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`进货单号`) USING BTREE, INDEX `idx_进货单号`(`进货单号`) USING BTREE, INDEX `idx_供应商号_进货单`(`供应商号`) USING BTREE, CONSTRAINT `进货单_ibfk_1` FOREIGN KEY (`供应商号`) REFERENCES `供应商` (`供应商号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 进货细则 -- ---------------------------- DROP TABLE IF EXISTS `进货细则`; CREATE TABLE `进货细则` ( `进货细则号` int(11) NOT NULL DEFAULT 0, `农产品号` int(11) NOT NULL DEFAULT 0, `进货单号` int(11) NOT NULL DEFAULT 0, `采购数量` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`进货细则号`) USING BTREE, INDEX `idx_进货细则号`(`进货细则号`) USING BTREE, INDEX `idx_农产品号_进货`(`农产品号`) USING BTREE, INDEX `idx_进货单号_进货细则`(`进货单号`) USING BTREE, CONSTRAINT `进货细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `进货细则_ibfk_2` FOREIGN KEY (`进货单号`) REFERENCES `进货单` (`进货单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 库存流水 -- ---------------------------- DROP TABLE IF EXISTS `库存流水`; CREATE TABLE `库存流水` ( `流水单号` int(11) NOT NULL DEFAULT 0, `流水日期` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `流水类型` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `金额` decimal(10, 2) NOT NULL DEFAULT 0.00, `单号` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`流水单号`) USING BTREE, INDEX `idx_流水单号_库存流水`(`流水单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 库存流水细则 -- ---------------------------- DROP TABLE IF EXISTS `库存流水细则`; CREATE TABLE `库存流水细则` ( `库存流水细则号` int(11) NOT NULL DEFAULT 0 AUTO_INCREMENT, `流水单号` int(11) NOT NULL DEFAULT 0, `农产品号` int(11) NOT NULL DEFAULT 0, `变动数量` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`库存流水细则号`) USING BTREE, INDEX `idx_流水单号_库存流水细则`(`流水单号`) USING BTREE, INDEX `idx_农产品编号_库存流水`(`农产品号`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 200050 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 库存信息 -- ---------------------------- DROP TABLE IF EXISTS `库存信息`; CREATE TABLE `库存信息` ( `农产品号` int(11) NOT NULL, `当前库存数量` int(11) NOT NULL DEFAULT 0, `安全库存数量` int(11) NOT NULL DEFAULT 0, `库存更新_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`农产品号`) USING BTREE, INDEX `idx_当前库存数量`(`当前库存数量`) USING BTREE, INDEX `idx_农产品编号_库存`(`农产品号`) USING BTREE, CONSTRAINT `库存信息_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 农产品 -- ---------------------------- DROP TABLE IF EXISTS `农产品`; CREATE TABLE `农产品` ( `农产品号` int(11) NOT NULL, `产品名称` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', `产品进价` decimal(10, 2) NOT NULL DEFAULT 0.00, `产品售价` decimal(10, 2) NOT NULL DEFAULT 0.00, `产品质量` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '', PRIMARY KEY (`农产品号`) USING BTREE, INDEX `idx_农产品号`(`农产品号`) USING BTREE, INDEX `idx_产品名称`(`产品名称`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 缺货单 -- ---------------------------- DROP TABLE IF EXISTS `缺货单`; CREATE TABLE `缺货单` ( `缺货单号` int(11) NOT NULL DEFAULT 0, `缺货时间` datetime NULL DEFAULT NULL, `预计进货日期` datetime NULL DEFAULT NULL, PRIMARY KEY (`缺货单号`) USING BTREE, INDEX `idx_缺货单号`(`缺货单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 缺货细则 -- ---------------------------- DROP TABLE IF EXISTS `缺货细则`; CREATE TABLE `缺货细则` ( `缺货细则号` int(11) NOT NULL DEFAULT 0 AUTO_INCREMENT, `缺货单号` int(11) NULL DEFAULT 0, `农产品号` int(11) NULL DEFAULT NULL, `缺货数量` int(11) NULL DEFAULT NULL, PRIMARY KEY (`缺货细则号`) USING BTREE, INDEX `idx_缺货细则号`(`缺货细则号`) USING BTREE, INDEX `idx_缺货单号_缺货细则`(`缺货单号`) USING BTREE, INDEX `idx_农产品编号_缺货`(`农产品号`) USING BTREE, CONSTRAINT `缺货细则_ibfk_1` FOREIGN KEY (`缺货单号`) REFERENCES `缺货单` (`缺货单号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `缺货细则_ibfk_2` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 800026 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 入库单 -- ---------------------------- DROP TABLE IF EXISTS `入库单`; CREATE TABLE `入库单` ( `入库单号` int(11) NOT NULL DEFAULT 0, `入库日期` date NOT NULL DEFAULT '1970-01-01', PRIMARY KEY (`入库单号`) USING BTREE, INDEX `idx_入库单号`(`入库单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 入库细则 -- ---------------------------- DROP TABLE IF EXISTS `入库细则`; CREATE TABLE `入库细则` ( `入库细则号` int(11) NOT NULL DEFAULT 0, `入库单号` int(11) NOT NULL DEFAULT 0, `农产品号` int(11) NOT NULL DEFAULT 0, `入库数量` int(11) NOT NULL DEFAULT 0, INDEX `idx_入库细则号`(`入库细则号`) USING BTREE, INDEX `idx_入库单号_入库细则`(`入库单号`) USING BTREE, INDEX `idx_农产品编号_入库`(`农产品号`) USING BTREE, CONSTRAINT `入库细则_ibfk_1` FOREIGN KEY (`入库单号`) REFERENCES `入库单` (`入库单号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `入库细则_ibfk_2` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 退货单 -- ---------------------------- DROP TABLE IF EXISTS `退货单`; CREATE TABLE `退货单` ( `退货单号` int(11) NOT NULL, `退货申请_time` datetime NULL DEFAULT NULL, `退货审批_time` datetime NULL DEFAULT NULL, `退货金额` decimal(10, 2) NULL DEFAULT NULL, `退货地址` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `退货审批人` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `状态` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`退货单号`) USING BTREE, INDEX `idx_退货单号`(`退货单号`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for 退货细则 -- ---------------------------- DROP TABLE IF EXISTS `退货细则`; CREATE TABLE `退货细则` ( `退货细则号` int(11) NOT NULL, `农产品号` int(11) NULL DEFAULT NULL, `退货单号` int(11) NULL DEFAULT NULL, `退货数量` int(11) NULL DEFAULT NULL, `退货原因` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`退货细则号`) USING BTREE, INDEX `idx_退货细则号`(`退货细则号`) USING BTREE, INDEX `idx_退货单号_退货细则`(`退货单号`) USING BTREE, INDEX `idx_农产品编号_退货`(`农产品号`) USING BTREE, CONSTRAINT `退货细则_ibfk_1` FOREIGN KEY (`农产品号`) REFERENCES `农产品` (`农产品号`) ON DELETE RESTRICT ON UPDATE RESTRICT, CONSTRAINT `退货细则_ibfk_2` FOREIGN KEY (`退货单号`) REFERENCES `退货单` (`退货单号`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Triggers structure for table 出库细则 -- ---------------------------- DROP TRIGGER IF EXISTS `validate_shelf_capacity_before_out`; delimiter ;; CREATE TRIGGER `validate_shelf_capacity_before_out` BEFORE INSERT ON `出库细则` FOR EACH ROW BEGIN DECLARE shelf_capacity INT; DECLARE shelf_used INT; -- 获取对应货架容量信息 SELECT 货架总容量, 货架已占用容量 INTO shelf_capacity, shelf_used FROM 货架 WHERE 农产品号 = NEW.农产品号 LIMIT 1; -- 验证出库数量是否超过货架容量 IF (shelf_used - NEW.出库数) < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '出库数量超过货架当前容量'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 出库细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_validate_shelf_capacity`; delimiter ;; CREATE TRIGGER `trg_validate_shelf_capacity` BEFORE INSERT ON `出库细则` FOR EACH ROW BEGIN DECLARE shelf_capacity INT; DECLARE shelf_used INT; -- 获取货架容量信息 SELECT 货架总容量, 货架已占用容量 INTO shelf_capacity, shelf_used FROM 货架 WHERE 农产品号 = NEW.农产品号; -- 验证出库数量是否可行 IF NEW.出库数 > shelf_used THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '错误: 出库数量超过货架当前容量'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 出库细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_before_insert_stock_out`; delimiter ;; CREATE TRIGGER `trg_before_insert_stock_out` BEFORE INSERT ON `出库细则` FOR EACH ROW BEGIN DECLARE current_stock INT; -- 获取当前库存 SELECT 当前库存数量 INTO current_stock FROM 库存信息 WHERE 农产品号 = NEW.农产品号; -- 验证库存是否足够 IF current_stock < NEW.出库数 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '错误: 库存不足,无法出库'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 购买细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_update_purchase_amount`; delimiter ;; CREATE TRIGGER `trg_update_purchase_amount` AFTER INSERT ON `购买细则` FOR EACH ROW BEGIN DECLARE product_price DECIMAL(10,2); DECLARE amount DECIMAL(10,2); -- 获取产品单价 SELECT 产品售价 INTO product_price FROM 农产品 WHERE 农产品号 = NEW.农产品号; -- 计算金额 SET amount = product_price * NEW.购买数量; -- 更新购买流水总金额 UPDATE 购买流水 SET 金额 = IFNULL(金额, 0) + amount WHERE 流水单号 = NEW.购买流水单号; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 购买细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_generate_transaction_feedback`; delimiter ;; CREATE TRIGGER `trg_generate_transaction_feedback` AFTER INSERT ON `购买细则` FOR EACH ROW BEGIN DECLARE transaction_count INT DEFAULT 0; DECLARE transaction_id INT; -- 检查是否已完成购买 SELECT COUNT(*) INTO transaction_count FROM 交易反馈单 WHERE 订单单号 = NEW.购买流水单号; -- 如果还没有交易反馈单,创建新的 IF transaction_count = 0 THEN INSERT INTO 交易反馈单 (交易_time, 交易状态, 订单单号) VALUES (NOW(), '处理中', NEW.购买流水单号); SET transaction_id = LAST_INSERT_ID(); ELSE SELECT 交易反馈单单号 INTO transaction_id FROM 交易反馈单 WHERE 订单单号 = NEW.购买流水单号; END IF; -- 添加交易细则 INSERT INTO 交易细则 (农产品号, 交易反馈单单号, 交易数量) VALUES (NEW.农产品号, transaction_id, NEW.购买数量); END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 购买细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_after_insert_purchase_detail`; delimiter ;; CREATE TRIGGER `trg_after_insert_purchase_detail` AFTER INSERT ON `购买细则` FOR EACH ROW BEGIN -- 更新库存数量 UPDATE 库存信息 SET 当前库存数量 = 当前库存数量 - NEW.购买数量, 库存更新_time = NOW() WHERE 农产品号 = NEW.农产品号; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 进货细则 -- ---------------------------- DROP TRIGGER IF EXISTS `防止0主键_进货细则`; delimiter ;; CREATE TRIGGER `防止0主键_进货细则` BEFORE INSERT ON `进货细则` FOR EACH ROW BEGIN IF NEW.进货细则号 = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '主键值不能为0'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 库存流水细则 -- ---------------------------- DROP TRIGGER IF EXISTS `防止0主键_库存流水细则`; delimiter ;; CREATE TRIGGER `防止0主键_库存流水细则` BEFORE INSERT ON `库存流水细则` FOR EACH ROW BEGIN IF NEW.库存流水细则号 = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '主键值不能为0'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 库存流水细则 -- ---------------------------- DROP TRIGGER IF EXISTS `update_inventory_after_stock_flow`; delimiter ;; CREATE TRIGGER `update_inventory_after_stock_flow` AFTER INSERT ON `库存流水细则` FOR EACH ROW BEGIN DECLARE product_id INT; DECLARE change_quantity INT; SET product_id = NEW.农产品号; SET change_quantity = NEW.变动数量; UPDATE 库存信息 SET 当前库存数量 = 当前库存数量 + change_quantity, 库存更新_time = NOW() WHERE 农产品号 = product_id; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 库存流水细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_update_inventory`; delimiter ;; CREATE TRIGGER `trg_update_inventory` AFTER INSERT ON `库存流水细则` FOR EACH ROW BEGIN UPDATE 库存信息 SET 当前库存数量 = 当前库存数量 + NEW.变动数量, 库存更新_time = NOW() WHERE 农产品号 = NEW.农产品号; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 库存信息 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_check_safety_stock`; delimiter ;; CREATE TRIGGER `trg_check_safety_stock` AFTER UPDATE ON `库存信息` FOR EACH ROW BEGIN IF NEW.当前库存数量 < NEW.安全库存数量 THEN INSERT INTO 缺货单 (缺货时间, 预计进货日期) VALUES (NOW(), DATE_ADD(NOW(), INTERVAL 7 DAY)); SET @last_out_of_stock_id = LAST_INSERT_ID(); INSERT INTO 缺货细则 (缺货单号, 农产品号, 缺货数量) VALUES (@last_out_of_stock_id, NEW.农产品号, (NEW.安全库存数量 - NEW.当前库存数量)); END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 入库细则 -- ---------------------------- DROP TRIGGER IF EXISTS `防止0主键_入库细则`; delimiter ;; CREATE TRIGGER `防止0主键_入库细则` BEFORE INSERT ON `入库细则` FOR EACH ROW BEGIN IF NEW.入库细则号 = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '主键值不能为0'; END IF; END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 入库细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_after_insert_stock_in`; delimiter ;; CREATE TRIGGER `trg_after_insert_stock_in` AFTER INSERT ON `入库细则` FOR EACH ROW BEGIN -- 更新库存数量 UPDATE 库存信息 SET 当前库存数量 = 当前库存数量 + NEW.入库数量, 库存更新_time = NOW() WHERE 农产品号 = NEW.农产品号; -- 记录库存流水 INSERT INTO 库存流水 (流水日期, 流水类型, 单号) VALUES (NOW(), '入库', NEW.入库单号); END ;; delimiter ; -- ---------------------------- -- Triggers structure for table 退货细则 -- ---------------------------- DROP TRIGGER IF EXISTS `trg_after_insert_return_detail`; delimiter ;; CREATE TRIGGER `trg_after_insert_return_detail` AFTER INSERT ON `退货细则` FOR EACH ROW BEGIN -- 更新库存数量 UPDATE 库存信息 SET 当前库存数量 = 当前库存数量 + NEW.退货数量, 库存更新_time = NOW() WHERE 农产品号 = NEW.农产品号; END ;; delimiter ; SET FOREIGN_KEY_CHECKS = 1; 分别生成存储过程,包括:顾客退货,农产品入库,进货
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值