123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- from odoo import api, fields, models, tools, SUPERUSER_ID, _
- from odoo.exceptions import UserError, ValidationError
- from odoo.utils.model_util.const import DATE_LIST, get_database_value_from_value, get_value_from_database, EMPTY_CHAR, \
- get_date_range_string
- from .report_set import DEFAULT_WIDTH, DEFAULT_HEIGHT
- LABEL_MODEL = 'jc_bi.report_label'
- STYLE_MODEL = 'jc_bi.report_style'
- SET_MODEL = 'jc_bi.report_set'
- CONDITION_MODEL = 'jc_bi.report_label_condition'
- USER_DETAIL_MODEL = 'jc_bi.report_label_user_detail'
- class ReportConfig(models.Model):
- _description = 'BI.报表配置'
- _name = "jc_bi.report_config"
- _order = 'id'
- default_date_range = fields.Char('通用日期默认条件')
- @api.model
- def get_config(self):
- has_right = self.user_has_groups('base.group_no_one')
- label_list = self._query_current_user_label()
- default_date_range = self._query_default_date_range()
- # group_no_one = self.env.ref('base.group_no_one')
- return [has_right, label_list, DATE_LIST, default_date_range, {
- 'id': 1,
- 'name': 'a',
- }]
- @api.model
- def query_all_label(self):
- """
- 获取label信息.
- :return: label信息列表。每一项信息为 dictionary。内容为:
- id:标签ID
- name: 标签名称
- order: 标签顺序
- report_set_id: 报表集ID
- report_set_name: 报表集名称
- report_label_condition_id: 标签条件ID
- report_label_condition_name: 标签条件名称
- user_detail_id_list: 用户明细ID
- report_set_width: 报表集宽度
- report_set_height: 报表集高度
- style_list: 样式信息列表。每一项信息为:
- 样式信息格式:[样式ID, 样式宽度, 样式高度]
- 例如:
- [
- {'id': 5,
- 'name': '仓库:ooo',
- 'order': 1,
- 'report_set_id': 10,
- 'report_set_name': '报表集10-11',
- 'report_label_condition_id': 1,
- 'report_label_condition_name': 'E仓库:ooo',
- 'user_detail_id_list': [1],
- 'report_set_width': 100,
- 'report_set_height': 800,
- 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]]
- }
- ]
- """
- return self._query_label([], need_query_user=True)
- def _query_label(self, domain, need_query_user):
- query_fields = ['id', 'name', 'order', 'report_set_id', 'report_label_condition_id', 'user_detail']
- res = self.env[LABEL_MODEL].sudo().search_read(domain, query_fields, order='order,name')
- label_list = [ReportConfig._get_label_info(x) for x in res if x['name']]
- label_list.sort(key=lambda x: x['order'])
- for item in label_list:
- # print('report_set_id before:', item[3])
- report_set_id = item['report_set_id']
- if need_query_user:
- user_domain = [('id', 'in', item['user_detail_id_list'])]
- res = self.env[USER_DETAIL_MODEL].sudo().search_read(user_domain, ['user_id'])
- item['current_user_list'] = [(x['user_id'][0], x['user_id'][1]) for x in res]
- if not report_set_id:
- item['report_set_width'] = DEFAULT_WIDTH
- item['report_set_height'] = DEFAULT_HEIGHT
- item['style_list'] = []
- continue
- # print('report_set_id after:', report_set_id)
- set_info = self.env[SET_MODEL].sudo().query_set_info(report_set_id)
- item['report_set_width'] = set_info[0][1]
- item['report_set_height'] = set_info[0][2]
- item['style_list'] = set_info[1]
- print('label_list:', label_list)
- return label_list
- def _query_current_user_label(self):
- """
- 获取当前用户的label信息.
- :return: label信息列表。每一项信息为 dictionary。内容为:
- id:标签ID
- name: 标签名称
- order: 标签顺序
- report_set_id: 报表集ID
- report_set_name: 报表集名称
- report_label_condition_id: 标签条件ID
- report_label_condition_name: 标签条件名称
- user_detail_id_list: 用户明细ID
- report_set_width: 报表集宽度
- report_set_height: 报表集高度
- style_list: 样式信息列表。每一项信息为:
- 样式信息格式:[样式ID, 样式宽度, 样式高度]
- 例如:
- [
- {'id': 5,
- 'name': '仓库:ooo',
- 'order': 1,
- 'report_set_id': 10,
- 'report_set_name': '报表集10-11',
- 'report_label_condition_id': 1,
- 'report_label_condition_name': 'E仓库:ooo',
- 'user_detail_id_list': [1],
- 'report_set_width': 100,
- 'report_set_height': 800,
- 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]]
- }
- ]
- """
- user = self.env.user
- domain = [('user_id', '=', user.id)]
- res = self.env[USER_DETAIL_MODEL].sudo().search_read(domain, ['report_label_id'])
- if not res:
- return []
- id_list = [r['report_label_id'][0] for r in res]
- print('id_list:%s' % id_list)
- return self._query_label([('id', 'in', id_list)], need_query_user=False)
- @staticmethod
- def _get_label_info(label_res):
- report_set_pair = label_res['report_set_id'] if label_res['report_set_id'] else [0, '']
- report_label_condition_pair = label_res['report_label_condition_id'] if label_res[
- 'report_label_condition_id'] else [0, '']
- return {
- 'id': label_res['id'],
- 'name': label_res['name'],
- 'order': label_res['order'] if label_res['order'] else 0,
- 'report_set_id': report_set_pair[0],
- 'report_set_name': report_set_pair[1],
- 'report_label_condition_id': report_label_condition_pair[0],
- 'report_label_condition_name': report_label_condition_pair[1],
- 'user_detail_id_list': label_res['user_detail'],
- }
- def _query_default_date_range(self):
- record = self.env[self._name].sudo().search([], limit=1)
- if record:
- date_range = get_value_from_database(record.default_date_range, 'date')
- start_date_define_pair, end_date_define_pair = date_range
- start_date_range = get_date_range_string(start_date_define_pair[0])
- end_date_range = get_date_range_string(end_date_define_pair[0])
- start = list(date_range[0])
- end = list(date_range[1])
- start.append(start_date_range[0])
- end.append(end_date_range[1])
- # print('date range:', date_range)
- # print('start:', start)
- # print('end:', end)
- return start, end
- return [[EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR], [EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR]]
- @api.model
- def save_default_date(self, default_date_range):
- date_range_string = get_database_value_from_value(default_date_range, 'date')
- print('date_range_string', date_range_string)
- val = {
- 'default_date_range': date_range_string,
- }
- record = self.env[self._name].sudo().search([], limit=1)
- if record:
- record.write(val)
- else:
- self.env[self._name].sudo().create(val)
- return
- @api.model
- def save_label(self, _id, name, order, report_set_id, report_label_condition_id):
- if not name:
- return
- val = {
- 'name': name,
- 'order': order if order else 0,
- }
- # print('save_label:', val)
- if _id == '0':
- bill = self.env[LABEL_MODEL].sudo().create(val)
- return bill.id
- else:
- record = self.env[LABEL_MODEL].sudo().browse(int(_id))
- if record.report_set_id and not report_set_id:
- raise ValidationError('请选择{报表集}!')
- if record.report_label_condition_id and not report_label_condition_id:
- raise ValidationError('请选择{标签条件}!')
- if report_set_id:
- val['report_set_id'] = report_set_id
- if report_label_condition_id:
- val['report_label_condition_id'] = report_label_condition_id
- record.write(val)
- return
- @api.model
- def delete_label(self, _id):
- _id = int(_id)
- if not _id:
- return
- label = self.env[LABEL_MODEL].sudo().browse(_id)
- label.unlink()
- return
- @api.model
- def delete_condition(self, _id):
- _id = int(_id)
- if not _id:
- return
- condition = self.env[CONDITION_MODEL].sudo().browse(_id)
- condition.unlink()
- return
- @api.model
- def query_archive(self, archive_model, archive_id, archive_fields):
- bill = self.env[archive_model].sudo().browse(int(archive_id))
- return [bill[f] for f in archive_fields]
- @api.model
- def query_archive2(self, archive_model, archive_id, archive_fields, detail_reference_field, detail_fields):
- bill = self.env[archive_model].sudo().browse(int(archive_id))
- # _feilds = self.env[archive_model]._fields
- # print('a' if 'report_set_id' in _feilds else 'b')
- # print('a' if 'aaa' in _feilds else 'b')
- detail = bill[detail_reference_field]
- res_detail = []
- for d in detail:
- item = [d[f] for f in detail_fields]
- res_detail.append(item)
- return [[self._get_value(archive_model, bill, f) for f in archive_fields], res_detail]
- def _get_value(self, archive_model, bill, field):
- _feilds = self.env[archive_model]._fields
- if field in _feilds:
- field_info = _feilds[field]
- if field_info.type == 'many2one':
- return bill[field]['name']
- elif field_info.type in ['char', 'integer']:
- return bill[field]
- elif field_info.type == 'date':
- return 'date类型的数据未处理'
- elif field_info.type == 'selection':
- return 'selection类型的数据未处理'
- else:
- return '未知类型:{}'.format(field_info.type)
- else:
- return ''
- @api.model
- def save_archive(self, archive_model, archive_id, archive_fields):
- print('fields:', archive_fields)
- bill = self.env[archive_model].sudo().browse(int(archive_id))
- bill.update(archive_fields)
- return
- # def _query_result(self):
- # test_data = ([('订单编号', 100, 0, False), ('订单状态', 90, 100, False), ('日期', 90, 190, False), ('摘要', 90, -1, False),
- # ('出库日期', 90, -1, False), ('客户', 90, -1, False), ('销售类型', 90, -1, False), ('公司', 120, -1, False),
- # ('部门', 90, -1, False), ('仓库', 90, -1, False), ('销售员', 90, -1, False), ('产品', 90, -1, False),
- # ('辅数量', 90, -1, True), ('辅单位', 90, -1, False), ('数量', 90, -1, True), ('主单位', 90, -1, False),
- # ('单价', 90, -1, True), ('金额', 90, -1, True), ('备注', 90, -1, False)],
- # [
- # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'],
- # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['产品1'], ['50.00'], ['设备区域1'], ['5'], ['设备分类1'],
- # ['3.570'], ['17.85'], ['']],
- # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'],
- # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['销售产品3'], ['20.00'], ['袋'], ['2', 'red', 'gray'],
- # ['KG'], ['3.200'], ['6.40', '', 'lightblue'], ['']]],
- # [['合计', 12], ['5151.00', 1], ['', 1], ['', 1], ['', 1], ['', 1], ['1429.85', 1], ['', 1]], 19, 38)
- # return test_data
|