diff --git a/index.html b/index.html
index 5da6808..bc07ef5 100644
--- a/index.html
+++ b/index.html
@@ -233,7 +233,7 @@ while (await new Promise(o => setTimeout(o, 1000, true))) {
$('#statusLabel').innerText = status ? status.charAt(0).toUpperCase() + status.slice(1).toLowerCase() : '';
switch (status) {
- case 'IDLE':
+ case 'BUSY':
continue;
case 'READY':
$('#begin > span.text').innerText = 'Begin';
diff --git a/main.py b/main.py
index 1ad8716..ff18145 100644
--- a/main.py
+++ b/main.py
@@ -42,7 +42,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
sp = ServiceProvider.default()
class Status(Enum):
- IDLE = 0
+ BUSY = 0
READY = 1
RUNNING = 2
STANDBY = 3
@@ -64,7 +64,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
t1 = Timer()
t2 = Timer()
options = dict()
- status = Status.IDLE
+ status = Status.BUSY
def begin(opts: dict, args: dict):
nonlocal status
@@ -141,23 +141,26 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
class ProductInfo:
def __init__(self, file):
self.wb = openpyxl.load_workbook(file, read_only=True)
- self.headers = list()
+ self.indices = dict()
+ self.headers = dict()
+
+ def index(self, *keys: str):
+ self.indices.clear()
+ self.headers.clear()
for col in range(1, self.wb.active.max_column + 1):
value = str(self.wb.active.cell(1, col).value)
- self.headers.append(value)
-
- def search(self, by: str, needle) -> dict:
- a = self.headers.index(by)
- b = None
+ if value in keys: self.headers[value] = col
for row in range(1, self.wb.active.max_row + 1):
- if self.wb.active.cell(row, a+1).value == needle:
- b = row
- break
+ for key in keys:
+ col = self.headers[key]
+ value = str(self.wb.active.cell(row, col).value)
+ self.indices.setdefault(key, dict())[value] = row
- if b is None: return dict()
- return { k: self.wb.active.cell(b, c+1).value for c, k in enumerate(self.headers) }
+ def at(self, by: str, index) -> dict:
+ if (a := self.indices.get(by)) is None or (b := dict.get(a, index)) is None: return dict()
+ return { k: self.wb.active.cell(b, c).value for k, c in self.headers.items() }
try:
logger.info('Downloading product list...')
@@ -183,6 +186,8 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
p = ProductInfo(file)
driver.close()
driver.switch_to.window(driver.window_handles[0])
+ logger.info('Indexing product information...')
+ p.index('产品编号', '产品名称', '产品型号')
logger.info('Done')
status = Status.READY
except Exception as e:
@@ -416,7 +421,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
match kind:
case 'vat':
record[8] = product
- record[9] = (p.search('产品型号', code) or p.search('产品名称', product)).get('产品编号')
+ record[9] = (p.at('产品型号', code) or p.at('产品名称', product)).get('产品编号')
record[10] = code
record[11] = '%.2f' % price
record[12] = '%g%%' % discount
@@ -424,7 +429,7 @@ def main(driver: WebDriver, logger = logging.getLogger('main')):
record[14] = '%g' % quantity
record[15] = description
case 'correction':
- record[8] = p.search('产品编号', profile.remise).get('产品名称')
+ record[8] = p.at('产品编号', profile.remise).get('产品名称')
record[9] = profile.remise
record[13] = '0'
record[14] = '0'