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'