diff --git a/yuthon_property/wizard/property_statements_wizard.py b/yuthon_property/wizard/property_statements_wizard.py index ab9396d31..e6e70efd0 100644 --- a/yuthon_property/wizard/property_statements_wizard.py +++ b/yuthon_property/wizard/property_statements_wizard.py @@ -44,26 +44,26 @@ class PropertyStatementsWizard(models.Model): for rx in range(4, sh.nrows): row = sh.row(rx) self.property_bank_statements_dj_data(row, your_own_account) + elif self.selection_bank in ('gs', 'xy'): + # 工商银行(兴源格式):xlsx文件,数据从第2行(索引1)开始 + import openpyxl, io + wb = openpyxl.load_workbook(io.BytesIO(file_content)) + ws = wb.active + for i, row_cells in enumerate(ws.iter_rows(values_only=True)): + if i < 1: # 跳过表头行 + continue + self.property_bank_statements_xy_data_openpyxl(row_cells) else: - first_round = True book = xlrd.open_workbook(file_contents=file_content) sh = book.sheet_by_index(0) for rx in range(1, sh.nrows): row = sh.row(rx) - if self.selection_bank == 'gs': - if first_round: - first_round = False - continue if self.selection_bank == 'js': self.property_bank_statements_jh_data(row) elif self.selection_bank == 'sh': self.property_bank_statements_sh_data(row) elif self.selection_bank == 'ms': self.property_bank_statements_ms_data(row) - elif self.selection_bank == 'gs': - self.property_bank_statements_gc_data(row) - # elif self.selection_bank == 'xy': - # self.property_bank_statements_xy_data(row) count_after = self.env['property.bank.statements'].search_count([]) _logger.info('[银行流水导入] 银行=%s 导入前总条数=%d 导入后总条数=%d 新增=%d', self.selection_bank, count_before, count_after, count_after - count_before) @@ -465,6 +465,76 @@ class PropertyStatementsWizard(models.Model): # if not existing_record: # self.env['property.bank.statements'].create(bank_data) + def property_bank_statements_xy_data_openpyxl(self, row): + """工商银行(兴源)openpyxl版本解析,row为元组,列结构: + 0:交易时间, 1:对方单位, 2:摘要, 4:转入金额(贷时取), 7:借贷标志, + 8:发生额(借时取), 9:对方账号, 16:本方账号, 22:对方行名, 31:顺序号 + """ + def get_val(idx): + v = row[idx] if len(row) > idx and row[idx] is not None else '' + return str(v).strip() + + time_val = get_val(0) + if time_val and time_val != 'None': + try: + start_time = datetime.strptime(time_val, '%Y-%m-%d %H:%M:%S') + except Exception: + start_time = None + else: + start_time = None + + direction_val = get_val(7) + if direction_val == '贷': + lending_direction = 'loan' + amount_str = get_val(4).replace(',', '') # E列:转入金额 + elif direction_val == '借': + lending_direction = 'borrow' + amount_str = get_val(8).replace(',', '') # I列:发生额 + else: + return + + try: + original_amount = float(amount_str) + except Exception: + return + if not original_amount: + return + + name = get_val(9) # 对方账号 + name_account = get_val(1) # 对方单位 + remake = get_val(2) # 摘要 + bank_branch = get_val(22) # 对方行名 + your_own_account = get_val(16) + serial_number = get_val(31) # 顺序号 + + your_own_unit = self.classify_by_last_four(your_own_account) + company_id = self._get_company_by_unit(your_own_unit) + if not company_id: + return + + dedup_key = serial_number if serial_number and serial_number != '0' else (time_val + name) + existing_record = self.env['property.bank.statements'].search( + [('serial_number', '=', dedup_key)], limit=1 + ) + bank_data = { + 'name': name, + 'name_account': name_account, + 'serial_number': dedup_key, + 'your_own_account': your_own_account, + 'your_own_unit': your_own_unit, + 'bank_branch': bank_branch, + 'original_amount': original_amount, + 'lending_direction': lending_direction, + 'start_time': start_time - timedelta(hours=8) if start_time else False, + 'remake': remake, + 'company_id': company_id.id, + 'bank_state': 'not_reconciled', + } + if not existing_record: + self.env['property.bank.statements'].create(bank_data) + else: + existing_record.write(bank_data) + def _get_company_by_unit(self, unit_name): """根据简称匹配 yuthon.property.company 配置,再匹配 res.company""" if not unit_name: