EricGEGE commited on
Commit
16e8c84
·
verified ·
1 Parent(s): 70ba835

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +255 -0
app.py ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # '1ckM1GgD3hG_eTsa_7CGCB7qf8AyKKDII_yIOWwKaWvA' sheet
3
+ import pandas as pd
4
+ import gradio as gr
5
+ from datetime import datetime
6
+ import gspread
7
+ from google.oauth2.service_account import Credentials
8
+
9
+ # Google Sheets settings
10
+ SHEET_ID = '1ckM1GgD3hG_eTsa_7CGCB7qf8AyKKDII_yIOWwKaWvA' # Replace with your Google Sheet ID
11
+ USERS_SHEET = 'Users'
12
+ PURCHASE_ORDERS_SHEET = 'PurchaseOrders'
13
+
14
+ # Service account credentials file path
15
+ CREDENTIALS_FILE = 'E:/appr/credentials.json' # Replace with the path to your service account credentials file
16
+
17
+ # Initialize Google Sheets client
18
+ SCOPES = ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']
19
+ creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=SCOPES)
20
+ gc = gspread.authorize(creds)
21
+ sheet = gc.open_by_key(SHEET_ID)
22
+
23
+ # Initialize Google Sheets
24
+ def init_sheets():
25
+ if USERS_SHEET not in [s.title for s in sheet.worksheets()]:
26
+ sheet.add_worksheet(title=USERS_SHEET, rows="100", cols="20")
27
+ users = sheet.worksheet(USERS_SHEET)
28
+ users.append_row(['id', 'username', 'role'])
29
+ new_users = [
30
+ ['1', 'cevcaigou159', '采购'],
31
+ ['2', 'cevdanzheng789', '单证'],
32
+ ['3', 'cevcaiwu369', '财务'],
33
+ ['4', 'cevboss888', '总经理'],
34
+ ['5', 'cevcaigou357', '采购'],
35
+ ['6', 'investor888', '观察员']
36
+ ]
37
+ for user in new_users:
38
+ users.append_row(user)
39
+
40
+ if PURCHASE_ORDERS_SHEET not in [s.title for s in sheet.worksheets()]:
41
+ sheet.add_worksheet(title=PURCHASE_ORDERS_SHEET, rows="100", cols="20")
42
+ orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
43
+ orders.append_row([
44
+ '付款抬头', '合同号', '运编号', '车辆信息', '销售合同价', '采购价',
45
+ '费用名称', '费用金额', '采购款收款抬头', '采购款收款账号信息',
46
+ '业务员', '客户名称', '客户国家', '在途状态', '开票类型',
47
+ '收款状态', '审批状态', '退款说明', '备注', 'timestamp', '毛利'
48
+ ])
49
+
50
+ init_sheets()
51
+
52
+ # Approval process control
53
+ def get_next_approval_status(current_status):
54
+ try:
55
+ if current_status == '待单证审批':
56
+ return '待财务审批'
57
+ elif current_status == '待财务审批':
58
+ return '待总经理审批'
59
+ elif current_status == '待总经理审批':
60
+ return '已批准'
61
+ return current_status
62
+ except Exception as e:
63
+ return "操作有误: {}".format(e)
64
+
65
+ def approve_order(order_id, approver_role):
66
+ try:
67
+ orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
68
+ order_records = orders.get_all_records()
69
+
70
+ order_index = next((index for (index, d) in enumerate(order_records) if d["运编号"] == order_id), None)
71
+
72
+ if order_index is None:
73
+ return '订单未找到'
74
+
75
+ current_status = order_records[order_index]['审批状态']
76
+
77
+ if (current_status == '待单证审批' and approver_role != '单证') or \
78
+ (current_status == '待财务审批' and approver_role != '财务') or \
79
+ (current_status == '待总经理审批' and approver_role != '总经理'):
80
+ return f'只有{current_status}角色可以批准当前订单'
81
+
82
+ next_status = get_next_approval_status(current_status)
83
+ headers = list(order_records[0].keys())
84
+ orders.update_cell(order_index + 2, headers.index('审批状态') + 1, next_status) # Update approval status
85
+ orders.update_cell(order_index + 2, headers.index('timestamp') + 1,
86
+ datetime.now().strftime('%Y-%m-%dT%H:%M')) # Update timestamp
87
+
88
+ return '订单已批准'
89
+ except Exception as e:
90
+ return "操作有误: {}".format(e)
91
+
92
+ # Global session state
93
+ session_state = {'user_id': None, 'username': None, 'role': None}
94
+
95
+ def login(username):
96
+ try:
97
+ users = sheet.worksheet(USERS_SHEET).get_all_records()
98
+ user = next((u for u in users if u['username'] == username), None)
99
+ if user:
100
+ session_state['user_id'] = user['id']
101
+ session_state['username'] = user['username']
102
+ session_state['role'] = user['role']
103
+ return "登录成功,用户:{}".format(username)
104
+ else:
105
+ return "用户未找到"
106
+ except Exception as e:
107
+ return "操作有误: {}".format(e)
108
+
109
+ def submit_order(
110
+ username,
111
+ 付款抬头, 合同号, 运编号, 车辆信息, 销售合同价, 采购价,
112
+ 费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
113
+ 业务员, 客户名称, 客户国家, 在途状态, 开票类型,
114
+ 收款状态, 退款说明, 备注
115
+ ):
116
+ try:
117
+ global profit
118
+ login(username)
119
+
120
+ if session_state['role'] != '采购':
121
+ return "只有采购角色可以提交订单"
122
+
123
+ orders = sheet.worksheet(PURCHASE_ORDERS_SHEET)
124
+ profit = int(销售合同价)*7.25 - int(采购价) + int(采购价)*0.115
125
+
126
+ new_order = [
127
+ 付款抬头, 合同号, 运编号, 车辆信息, 销售合同价, 采购价,
128
+ 费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
129
+ 业务员, 客户名称, 客户国家, 在途状态, 开票类型,
130
+ 收款状态, '待单证审批', 退款说明, 备注,
131
+ datetime.now().strftime('%Y-%m-%dT%H:%M'), profit
132
+ ]
133
+ orders.append_row(new_order)
134
+ session_state.clear()
135
+ return "订单已提交"
136
+ session_state.clear()
137
+ except Exception as e:
138
+ return "操作有误: {}".format(e)
139
+
140
+ def format_order(order):
141
+ try:
142
+ return f"""
143
+ <table border="1">
144
+ <tr><th>审批状态</b></th><td><b>{order['审批状态']}</b></td></tr>
145
+ <tr><th>付款抬头</th><td>{order['付款抬头']}</td></tr>
146
+ <tr><th>合同号</th><td>{order['合同号']}</td></tr>
147
+ <tr><th>运编号</th><td>{order['运编号']}</td></tr>
148
+ <tr><th>车辆信息</th><td>{order['车辆信息']}</td></tr>
149
+ <tr><th>销售合同价(FOB美元)</th><td>{order['销售合同价']}</td></tr>
150
+ <tr><th>采购价(人民币)</th><td>{order['采购价']}</td></tr>
151
+ <tr><th>费用名称</th><td>{order['费用名称']}</td></tr>
152
+ <tr><th>费用金额</th><td>{order['费用金额']}</td></tr>
153
+ <tr><th>采购款收款抬头</th><td>{order['采购款收款抬头']}</td></tr>
154
+ <tr><th>采购款收款账号信息</th><td>{order['采购款收款账号信息']}</td></tr>
155
+ <tr><th>业务员</th><td>{order['业务员']}</td></tr>
156
+ <tr><th>客户名称</th><td>{order['客户名称']}</td></tr>
157
+ <tr><th>客户国家</th><td>{order['客户国家']}</td></tr>
158
+ <tr><th>在途状态</th><td>{order['在途状态']}</td></tr>
159
+ <tr><th>开票类型</th><td>{order['开票类型']}</td></tr>
160
+ <tr><th>收款状态</th><td>{order['收款状态']}</td></tr>
161
+ <tr><th>退款说明</th><td>{order['退款说明']}</td></tr>
162
+ <tr><th>备注</th><td>{order['备注']}</td></tr>
163
+ <tr><th>时间</th><td>{order['timestamp']}</td></tr>
164
+ <tr><th>毛利</th><td>{order['毛利']}</td></tr>
165
+ <tr><th>当前身份</th><td>{session_state['username']}</td></tr>
166
+ </table>
167
+ """
168
+ except Exception as e:
169
+ return "操作有误: {}".format(e)
170
+
171
+ def display_orders(username):
172
+ try:
173
+
174
+ login(username)
175
+ allowed_roles = [
176
+ '采购', '单证', '财务',
177
+ '总经理', '观察员'
178
+ ]
179
+
180
+ if session_state['role'] not in allowed_roles:
181
+ return ["请登录后查看订单"]
182
+
183
+ orders = sheet.worksheet(PURCHASE_ORDERS_SHEET).get_all_records()
184
+ orders_df = pd.DataFrame(orders)
185
+ orders_df['timestamp'] = pd.to_datetime(orders_df['timestamp'], errors='coerce')
186
+ orders_df = orders_df.sort_values(by='timestamp', ascending=False)
187
+
188
+ order_list = [format_order(order) for _, order in orders_df.iterrows()]
189
+ session_state.clear()
190
+ return order_list
191
+ session_state.clear()
192
+ except Exception as e:
193
+ return "操作有误: {}".format(e)
194
+
195
+ def approve_order_interface(username, order_id):
196
+ try:
197
+ login(username)
198
+
199
+ allowed_roles = ['单证', '财务', '总经理']
200
+
201
+ if session_state['role'] not in allowed_roles:
202
+ return "您没有批准订单的权限"
203
+
204
+ role1 = session_state['role']
205
+ result = approve_order(order_id, role1)
206
+ session_state.clear()
207
+ return result
208
+ session_state.clear()
209
+ except Exception as e:
210
+ return "操作有误: {}".format(e)
211
+
212
+ with gr.Blocks() as app:
213
+ with gr.TabItem("提交订单"):
214
+ username_submit = gr.Textbox(label="用户名")
215
+ 付款抬头 = gr.Textbox(label="付款抬头")
216
+ 合同号 = gr.Textbox(label="合同号")
217
+ 运编号 = gr.Textbox(label="运编号")
218
+ 车辆信息 = gr.Textbox(label="车辆信息")
219
+ 销售合同价 = gr.Textbox(label="销售合同价(FOB美元)")
220
+ 采购价 = gr.Textbox(label="采购价(人民币)")
221
+ 费用名称 = gr.Textbox(label="费用名称")
222
+ 费用金额 = gr.Textbox(label="费用金额")
223
+ 采购款收款抬头 = gr.Textbox(label="采购款收款抬头")
224
+ 采购款收款账号信息 = gr.Textbox(label="采购款收款账号信息")
225
+ 业务员 = gr.Textbox(label="业务员")
226
+ 客户名称 = gr.Textbox(label="客户名称")
227
+ 客户国家 = gr.Textbox(label="客户国家")
228
+ 在途状态 = gr.Textbox(label="在途状态")
229
+ 开票类型 = gr.Textbox(label="开票类型")
230
+ 收款状态 = gr.Textbox(label="收款状态")
231
+ 退款说明 = gr.Textbox(label="退款说明")
232
+ 备注 = gr.Textbox(label="备注")
233
+ submit_button = gr.Button("提交订单")
234
+ submit_output = gr.HTML(label="输出")
235
+ submit_button.click(fn=submit_order, inputs=[
236
+ username_submit, 付款抬头, 合同号, 运编号, 车辆信息, 销售合同价, 采购价,
237
+ 费用名称, 费用金额, 采购款收款抬头, 采购款收款账号信息,
238
+ 业务员, 客户名称, 客户国家, 在途状态, 开票类型,
239
+ 收款状态, 退款说明, 备注
240
+ ], outputs=submit_output)
241
+
242
+ with gr.TabItem("所有订单"):
243
+ username_display = gr.Textbox(label="用户名")
244
+ display_button = gr.Button("显示所有订单")
245
+ orders_output = gr.HTML(label="订单")
246
+ display_button.click(fn=display_orders, inputs=username_display, outputs=orders_output)
247
+
248
+ with gr.TabItem("批准订单"):
249
+ username_approve = gr.Textbox(label="用户名")
250
+ order_id = gr.Textbox(label="运编号")
251
+ approve_order_button = gr.Button("批准订单")
252
+ approve_order_output = gr.HTML(label="输出")
253
+ approve_order_button.click(fn=approve_order_interface, inputs=[username_approve, order_id], outputs=approve_order_output)
254
+
255
+ app.launch(share=True)