仓库管理系统

小胖肚最近在开发一套库存管理系统,最终的流程逻辑极其复杂,所以他决定先开发一版简单的demo版本。

库存系统共有5种操作:

1. 采购操作(代号:CG):我们通过采购单向供应商去购买商品。一张采购单(有采购单号)会有多种商品,同时每个商品的数量至少为1。

2. 入库操作(代号:RK):采购的商品到达仓库后会进行卸货,由于商品品类较多,所以可能会分批入库,同一种商品也可能会分批入库。例如A商品有50个,可以先入库20个,然后入库30个。

3. 调拨操作(代号:DB):仓库与仓库间、同仓库中的库区与库区间还会进行商品调拨,例如A仓库中的a1库区的X商品调拨到A仓库中的b1库区,A仓库中的a1库区的X商品调拨到B仓库中的a1库区都是可以的。如果同个库区有相同的商品来自不同的采购单号,优先调拨来自采购单号字典序小的。

4. 出售操作(代号:CS):商品会被出售,如果同个库区有相同的商品来自不同的采购单号,优先出售来自采购单号字典序小的。

5. 盘库操作(代号:PK):按仓库名称、库区名称、商品名称、采购单号字典序从小到大排序输出仓内商品数据,每条数据占一行,按仓库名、库区名,商品的采购单号、名称、数量的顺序进行输出。(数量为0的不输出)

一开始,仓库没有任何的货物。你能帮助汪某人完成这个demo版的库存管理系统吗?

思路:超级大模拟,模拟一个ERP的业务逻辑,代码不一定是最短的,但一定是最流畅的!!1

#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int N = 1e5+5;
map<string,map<string,int> >CG;
map<string,map<string,map<string,map<string,int> > > >CK;
struct node{
    string a,b,c,d;
    int e;
}lst[N];
bool cmp(node a,node b){
    if(a.a != b.a)return a.a < b.a;
    if(a.b != b.b)return a.b < b.b;
    if(a.d != b.d)return a.d < b.d;
    if(a.c != b.c)return a.c < b.c;
    return a.e < b.e;
}
void fun_CG(){
    int k;cin>>k;
    for(int i=0;i<k;i++){
        string id,name;
        int num;
        cin>>id>>name>>num;
        CG[id][name]+=num;
    }
}
void fun_RK(){
    string cg_id,name,ru_ck,ru_kq;
    int num;
    cin>>cg_id>>name>>ru_ck>>ru_kq>>num;
    int need = CG[cg_id][name];
    if(need >= num){// 判断有没有多
        CG[cg_id][name] -= num;
        CK[ru_ck][ru_kq][cg_id][name] += num;
    }else{
        cout<<"RK error!"<<endl;
    }
}
void fun_DB(){
    string chu_ck,chu_kq,ru_ck,ru_kq,name;
    int num;
    cin>>chu_ck>>chu_kq>>ru_ck>>ru_kq>>name>>num;
    int sum = 0;
    for(auto it:CK[chu_ck][chu_kq]){
        if(CK[chu_ck][chu_kq][it.first][name] > 0)sum += CK[chu_ck][chu_kq][it.first][name];
    }
    if(sum >= num){
        for(auto it:CK[chu_ck][chu_kq]){
            if(it.second[name] <= num){
                num -= it.second[name];
                CK[ru_ck][ru_kq][it.first][name] += it.second[name];
                CK[chu_ck][chu_kq][it.first][name] = 0;
            }else{
                CK[chu_ck][chu_kq][it.first][name] -= num;
                CK[ru_ck][ru_kq][it.first][name] += num;
                num = 0;
                break;
            }
        }
    }else{
        cout<<"DB error!"<<endl;
    }
}
void fun_CS(){
    string out_ck,out_kq,name;
    int num;
    cin>>out_ck>>out_kq>>name>>num;
    int sum = 0;
    for(auto it:CK[out_ck][out_kq]){
        sum += it.second[name];
    }
    if(sum >= num){
        for(auto it:CK[out_ck][out_kq]){
            if(CK[out_ck][out_kq][it.first][name] <= num){
                num -= CK[out_ck][out_kq][it.first][name];
                CK[out_ck][out_kq][it.first][name] = 0;
            }else{
                CK[out_ck][out_kq][it.first][name] -= num;
                num = 0;
                break;
            }
        }
    }else{
        cout<<"CS error!"<<endl;
    }
}
void fun_PK(){
    int cnt = 0;
    for(auto i:CK){
        for(auto j:i.second){
            for(auto k:j.second){
                for(auto q:k.second){
                    if(q.second == 0)continue;
                    lst[cnt] = {i.first,j.first,k.first,q.first,q.second};
                    cnt++;
                }
            }
        }
    }
    sort(lst,lst+cnt,cmp);
    for(int i=0;i<cnt;i++){
        cout<<lst[i].a<<" "<<lst[i].b<<" "<<lst[i].c<<" "<<lst[i].d<<" "<<lst[i].e<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string op;
    while(cin>>op){
        if(op == "CG"){
            fun_CG();
        }else if(op == "RK"){
            fun_RK();
        }else if(op == "DB"){
            fun_DB();
        }else if(op == "CS"){
            fun_CS();
        }else if(op == "PK"){
            fun_PK();
            break;
        }
    }
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值