小胖肚最近在开发一套库存管理系统,最终的流程逻辑极其复杂,所以他决定先开发一版简单的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;
}