report_config.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. from odoo import api, fields, models, tools, SUPERUSER_ID, _
  2. from odoo.exceptions import UserError, ValidationError
  3. from odoo.utils.model_util.const import DATE_LIST, get_database_value_from_value, get_value_from_database, EMPTY_CHAR, \
  4. get_date_range_string
  5. from .report_set import DEFAULT_WIDTH, DEFAULT_HEIGHT
  6. LABEL_MODEL = 'jc_bi.report_label'
  7. STYLE_MODEL = 'jc_bi.report_style'
  8. SET_MODEL = 'jc_bi.report_set'
  9. CONDITION_MODEL = 'jc_bi.report_label_condition'
  10. USER_DETAIL_MODEL = 'jc_bi.report_label_user_detail'
  11. class ReportConfig(models.Model):
  12. _description = 'BI.报表配置'
  13. _name = "jc_bi.report_config"
  14. _order = 'id'
  15. default_date_range = fields.Char('通用日期默认条件')
  16. @api.model
  17. def get_config(self):
  18. has_right = self.user_has_groups('base.group_no_one')
  19. label_list = self._query_current_user_label()
  20. default_date_range = self._query_default_date_range()
  21. # group_no_one = self.env.ref('base.group_no_one')
  22. return [has_right, label_list, DATE_LIST, default_date_range, {
  23. 'id': 1,
  24. 'name': 'a',
  25. }]
  26. @api.model
  27. def query_all_label(self):
  28. """
  29. 获取label信息.
  30. :return: label信息列表。每一项信息为 dictionary。内容为:
  31. id:标签ID
  32. name: 标签名称
  33. order: 标签顺序
  34. report_set_id: 报表集ID
  35. report_set_name: 报表集名称
  36. report_label_condition_id: 标签条件ID
  37. report_label_condition_name: 标签条件名称
  38. user_detail_id_list: 用户明细ID
  39. report_set_width: 报表集宽度
  40. report_set_height: 报表集高度
  41. style_list: 样式信息列表。每一项信息为:
  42. 样式信息格式:[样式ID, 样式宽度, 样式高度]
  43. 例如:
  44. [
  45. {'id': 5,
  46. 'name': '仓库:ooo',
  47. 'order': 1,
  48. 'report_set_id': 10,
  49. 'report_set_name': '报表集10-11',
  50. 'report_label_condition_id': 1,
  51. 'report_label_condition_name': 'E仓库:ooo',
  52. 'user_detail_id_list': [1],
  53. 'report_set_width': 100,
  54. 'report_set_height': 800,
  55. 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]]
  56. }
  57. ]
  58. """
  59. return self._query_label([], need_query_user=True)
  60. def _query_label(self, domain, need_query_user):
  61. query_fields = ['id', 'name', 'order', 'report_set_id', 'report_label_condition_id', 'user_detail']
  62. res = self.env[LABEL_MODEL].sudo().search_read(domain, query_fields, order='order,name')
  63. label_list = [ReportConfig._get_label_info(x) for x in res if x['name']]
  64. label_list.sort(key=lambda x: x['order'])
  65. for item in label_list:
  66. # print('report_set_id before:', item[3])
  67. report_set_id = item['report_set_id']
  68. if need_query_user:
  69. user_domain = [('id', 'in', item['user_detail_id_list'])]
  70. res = self.env[USER_DETAIL_MODEL].sudo().search_read(user_domain, ['user_id'])
  71. item['current_user_list'] = [(x['user_id'][0], x['user_id'][1]) for x in res]
  72. if not report_set_id:
  73. item['report_set_width'] = DEFAULT_WIDTH
  74. item['report_set_height'] = DEFAULT_HEIGHT
  75. item['style_list'] = []
  76. continue
  77. # print('report_set_id after:', report_set_id)
  78. set_info = self.env[SET_MODEL].sudo().query_set_info(report_set_id)
  79. item['report_set_width'] = set_info[0][1]
  80. item['report_set_height'] = set_info[0][2]
  81. item['style_list'] = set_info[1]
  82. print('label_list:', label_list)
  83. return label_list
  84. def _query_current_user_label(self):
  85. """
  86. 获取当前用户的label信息.
  87. :return: label信息列表。每一项信息为 dictionary。内容为:
  88. id:标签ID
  89. name: 标签名称
  90. order: 标签顺序
  91. report_set_id: 报表集ID
  92. report_set_name: 报表集名称
  93. report_label_condition_id: 标签条件ID
  94. report_label_condition_name: 标签条件名称
  95. user_detail_id_list: 用户明细ID
  96. report_set_width: 报表集宽度
  97. report_set_height: 报表集高度
  98. style_list: 样式信息列表。每一项信息为:
  99. 样式信息格式:[样式ID, 样式宽度, 样式高度]
  100. 例如:
  101. [
  102. {'id': 5,
  103. 'name': '仓库:ooo',
  104. 'order': 1,
  105. 'report_set_id': 10,
  106. 'report_set_name': '报表集10-11',
  107. 'report_label_condition_id': 1,
  108. 'report_label_condition_name': 'E仓库:ooo',
  109. 'user_detail_id_list': [1],
  110. 'report_set_width': 100,
  111. 'report_set_height': 800,
  112. 'style_list': [[12, 40, 400], [11, 40, 430], [2, 20, 300]]
  113. }
  114. ]
  115. """
  116. user = self.env.user
  117. domain = [('user_id', '=', user.id)]
  118. res = self.env[USER_DETAIL_MODEL].sudo().search_read(domain, ['report_label_id'])
  119. if not res:
  120. return []
  121. id_list = [r['report_label_id'][0] for r in res]
  122. print('id_list:%s' % id_list)
  123. return self._query_label([('id', 'in', id_list)], need_query_user=False)
  124. @staticmethod
  125. def _get_label_info(label_res):
  126. report_set_pair = label_res['report_set_id'] if label_res['report_set_id'] else [0, '']
  127. report_label_condition_pair = label_res['report_label_condition_id'] if label_res[
  128. 'report_label_condition_id'] else [0, '']
  129. return {
  130. 'id': label_res['id'],
  131. 'name': label_res['name'],
  132. 'order': label_res['order'] if label_res['order'] else 0,
  133. 'report_set_id': report_set_pair[0],
  134. 'report_set_name': report_set_pair[1],
  135. 'report_label_condition_id': report_label_condition_pair[0],
  136. 'report_label_condition_name': report_label_condition_pair[1],
  137. 'user_detail_id_list': label_res['user_detail'],
  138. }
  139. def _query_default_date_range(self):
  140. record = self.env[self._name].sudo().search([], limit=1)
  141. if record:
  142. date_range = get_value_from_database(record.default_date_range, 'date')
  143. start_date_define_pair, end_date_define_pair = date_range
  144. start_date_range = get_date_range_string(start_date_define_pair[0])
  145. end_date_range = get_date_range_string(end_date_define_pair[0])
  146. start = list(date_range[0])
  147. end = list(date_range[1])
  148. start.append(start_date_range[0])
  149. end.append(end_date_range[1])
  150. # print('date range:', date_range)
  151. # print('start:', start)
  152. # print('end:', end)
  153. return start, end
  154. return [[EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR], [EMPTY_CHAR, EMPTY_CHAR, EMPTY_CHAR]]
  155. @api.model
  156. def save_default_date(self, default_date_range):
  157. date_range_string = get_database_value_from_value(default_date_range, 'date')
  158. print('date_range_string', date_range_string)
  159. val = {
  160. 'default_date_range': date_range_string,
  161. }
  162. record = self.env[self._name].sudo().search([], limit=1)
  163. if record:
  164. record.write(val)
  165. else:
  166. self.env[self._name].sudo().create(val)
  167. return
  168. @api.model
  169. def save_label(self, _id, name, order, report_set_id, report_label_condition_id):
  170. if not name:
  171. return
  172. val = {
  173. 'name': name,
  174. 'order': order if order else 0,
  175. }
  176. # print('save_label:', val)
  177. if _id == '0':
  178. bill = self.env[LABEL_MODEL].sudo().create(val)
  179. return bill.id
  180. else:
  181. record = self.env[LABEL_MODEL].sudo().browse(int(_id))
  182. if record.report_set_id and not report_set_id:
  183. raise ValidationError('请选择{报表集}!')
  184. if record.report_label_condition_id and not report_label_condition_id:
  185. raise ValidationError('请选择{标签条件}!')
  186. if report_set_id:
  187. val['report_set_id'] = report_set_id
  188. if report_label_condition_id:
  189. val['report_label_condition_id'] = report_label_condition_id
  190. record.write(val)
  191. return
  192. @api.model
  193. def delete_label(self, _id):
  194. _id = int(_id)
  195. if not _id:
  196. return
  197. label = self.env[LABEL_MODEL].sudo().browse(_id)
  198. label.unlink()
  199. return
  200. @api.model
  201. def delete_condition(self, _id):
  202. _id = int(_id)
  203. if not _id:
  204. return
  205. condition = self.env[CONDITION_MODEL].sudo().browse(_id)
  206. condition.unlink()
  207. return
  208. @api.model
  209. def query_archive(self, archive_model, archive_id, archive_fields):
  210. bill = self.env[archive_model].sudo().browse(int(archive_id))
  211. return [bill[f] for f in archive_fields]
  212. @api.model
  213. def query_archive2(self, archive_model, archive_id, archive_fields, detail_reference_field, detail_fields):
  214. bill = self.env[archive_model].sudo().browse(int(archive_id))
  215. # _feilds = self.env[archive_model]._fields
  216. # print('a' if 'report_set_id' in _feilds else 'b')
  217. # print('a' if 'aaa' in _feilds else 'b')
  218. detail = bill[detail_reference_field]
  219. res_detail = []
  220. for d in detail:
  221. item = [d[f] for f in detail_fields]
  222. res_detail.append(item)
  223. return [[self._get_value(archive_model, bill, f) for f in archive_fields], res_detail]
  224. def _get_value(self, archive_model, bill, field):
  225. _feilds = self.env[archive_model]._fields
  226. if field in _feilds:
  227. field_info = _feilds[field]
  228. if field_info.type == 'many2one':
  229. return bill[field]['name']
  230. elif field_info.type in ['char', 'integer']:
  231. return bill[field]
  232. elif field_info.type == 'date':
  233. return 'date类型的数据未处理'
  234. elif field_info.type == 'selection':
  235. return 'selection类型的数据未处理'
  236. else:
  237. return '未知类型:{}'.format(field_info.type)
  238. else:
  239. return ''
  240. @api.model
  241. def save_archive(self, archive_model, archive_id, archive_fields):
  242. print('fields:', archive_fields)
  243. bill = self.env[archive_model].sudo().browse(int(archive_id))
  244. bill.update(archive_fields)
  245. return
  246. # def _query_result(self):
  247. # test_data = ([('订单编号', 100, 0, False), ('订单状态', 90, 100, False), ('日期', 90, 190, False), ('摘要', 90, -1, False),
  248. # ('出库日期', 90, -1, False), ('客户', 90, -1, False), ('销售类型', 90, -1, False), ('公司', 120, -1, False),
  249. # ('部门', 90, -1, False), ('仓库', 90, -1, False), ('销售员', 90, -1, False), ('产品', 90, -1, False),
  250. # ('辅数量', 90, -1, True), ('辅单位', 90, -1, False), ('数量', 90, -1, True), ('主单位', 90, -1, False),
  251. # ('单价', 90, -1, True), ('金额', 90, -1, True), ('备注', 90, -1, False)],
  252. # [
  253. # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'],
  254. # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['产品1'], ['50.00'], ['设备区域1'], ['5'], ['设备分类1'],
  255. # ['3.570'], ['17.85'], ['']],
  256. # [['2022/01/00001'], ['未审核'], ['2022-05-10'], [''], ['2022-01-20'], ['客户1'], ['销售类型1'],
  257. # ['My Company'], ['销售部'], ['成品库'], ['员工1'], ['销售产品3'], ['20.00'], ['袋'], ['2', 'red', 'gray'],
  258. # ['KG'], ['3.200'], ['6.40', '', 'lightblue'], ['']]],
  259. # [['合计', 12], ['5151.00', 1], ['', 1], ['', 1], ['', 1], ['', 1], ['1429.85', 1], ['', 1]], 19, 38)
  260. # return test_data