diff --git a/excel_report_designer/controllers/excel_report_designer.py b/excel_report_designer/controllers/excel_report_designer.py
index a902a9bcb..a82b3eb4f 100644
--- a/excel_report_designer/controllers/excel_report_designer.py
+++ b/excel_report_designer/controllers/excel_report_designer.py
@@ -62,6 +62,10 @@ class XLSXReportController(http.Controller):
report_obj.get_xlsx_meal_report(options, response)
elif report_name == '误餐归档明细报表':
report_obj.get_xlsx_meal_active_report(options, response)
+ elif report_name == '加班详情报表':
+ report_obj.get_xlsx_overtime_detail_report(options, response)
+ elif report_name == '加班结转明细报表':
+ report_obj.get_xlsx_overtime_carryover_report(options, response)
else:
report_obj.get_xlsx_report(options, response)
response.set_cookie('fileToken', token)
diff --git a/excel_report_designer/models/report_excel.py b/excel_report_designer/models/report_excel.py
index b15ccbef6..1f6530eb2 100644
--- a/excel_report_designer/models/report_excel.py
+++ b/excel_report_designer/models/report_excel.py
@@ -1326,6 +1326,153 @@ class ReportExcel(models.Model):
response.stream.write(output.read())
output.close()
+ def get_xlsx_overtime_detail_report(self, data, response):
+ """加班详情报表的自定义 Excel 样式 - 对应 vacation.over.line.overtime.tree 视图"""
+ import io
+ import xlsxwriter
+ from datetime import datetime, date
+
+ output = io.BytesIO()
+ workbook = xlsxwriter.Workbook(output, {'in_memory': True})
+ sheet = workbook.add_worksheet('加班详情')
+
+ header_format = workbook.add_format({
+ 'font_size': 11, 'bold': True, 'border': 1,
+ 'align': 'center', 'valign': 'vcenter', 'bg_color': '#D3D3D3'
+ })
+ data_format = workbook.add_format({
+ 'font_size': 10, 'border': 1, 'align': 'center', 'valign': 'vcenter'
+ })
+ datetime_format = workbook.add_format({
+ 'font_size': 10, 'border': 1, 'align': 'center',
+ 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd hh:mm'
+ })
+ date_format = workbook.add_format({
+ 'font_size': 10, 'border': 1, 'align': 'center',
+ 'valign': 'vcenter', 'num_format': 'yyyy-mm-dd'
+ })
+
+ col_widths = [40, 12, 18, 20, 20, 8, 10, 12, 12, 10, 15]
+ col = 0
+ for label in data['field_label']:
+ sheet.write(0, col, label, header_format)
+ width = col_widths[col] if col < len(col_widths) else 15
+ sheet.set_column(col, col, width)
+ col += 1
+
+ records_data = data.get('export_data', [])
+ row = 1
+ for rec_data in records_data:
+ col = 0
+ for field_name in data['fields_name']:
+ value = rec_data.get(field_name, '')
+ if isinstance(value, datetime):
+ sheet.write_datetime(row, col, value, datetime_format)
+ elif isinstance(value, date):
+ sheet.write_datetime(row, col, value, date_format)
+ elif isinstance(value, float):
+ sheet.write(row, col, value, data_format)
+ else:
+ sheet.write(row, col, value or '', data_format)
+ col += 1
+ row += 1
+
+ if row > 1:
+ sheet.autofilter(0, 0, row - 1, len(data['field_label']) - 1)
+ sheet.freeze_panes(1, 0)
+
+ workbook.close()
+ output.seek(0)
+ response.stream.write(output.read())
+ output.close()
+
+ def get_xlsx_overtime_carryover_report(self, data, response):
+ """加班结转明细报表的自定义 Excel 样式"""
+ import io
+ import xlsxwriter
+ from datetime import datetime, date
+
+ output = io.BytesIO()
+ workbook = xlsxwriter.Workbook(output, {'in_memory': True})
+ sheet = workbook.add_worksheet('加班结转明细')
+
+ # 表头格式
+ header_format = workbook.add_format({
+ 'font_size': 11,
+ 'bold': True,
+ 'border': 1,
+ 'align': 'center',
+ 'valign': 'vcenter',
+ 'bg_color': '#D3D3D3'
+ })
+ # 数据格式
+ data_format = workbook.add_format({
+ 'font_size': 10,
+ 'border': 1,
+ 'align': 'center',
+ 'valign': 'vcenter'
+ })
+ # 日期时间格式
+ datetime_format = workbook.add_format({
+ 'font_size': 10,
+ 'border': 1,
+ 'align': 'center',
+ 'valign': 'vcenter',
+ 'num_format': 'yyyy-mm-dd hh:mm'
+ })
+ # 日期格式
+ date_format = workbook.add_format({
+ 'font_size': 10,
+ 'border': 1,
+ 'align': 'center',
+ 'valign': 'vcenter',
+ 'num_format': 'yyyy-mm-dd'
+ })
+
+ # 写表头
+ col = 0
+ for label in data['field_label']:
+ sheet.write(0, col, label, header_format)
+ if col == 0: # 姓名
+ sheet.set_column(col, col, 15)
+ elif col == 1: # 部门
+ sheet.set_column(col, col, 18)
+ elif col in [2, 3]: # 开始/结束时间
+ sheet.set_column(col, col, 20)
+ else:
+ sheet.set_column(col, col, 15)
+ col += 1
+
+ # 写数据行(使用预处理的 export_data)
+ records_data = data.get('export_data', [])
+ row = 1
+ for rec_data in records_data:
+ col = 0
+ for field_name in data['fields_name']:
+ value = rec_data.get(field_name, '')
+ if isinstance(value, datetime):
+ sheet.write_datetime(row, col, value, datetime_format)
+ elif isinstance(value, date):
+ sheet.write_datetime(row, col, value, date_format)
+ elif isinstance(value, float):
+ sheet.write(row, col, value, data_format)
+ else:
+ sheet.write(row, col, value or '', data_format)
+ col += 1
+ row += 1
+
+ # 加筛选
+ if row > 1:
+ sheet.autofilter(0, 0, row - 1, len(data['field_label']) - 1)
+
+ # 冻结首行
+ sheet.freeze_panes(1, 0)
+
+ workbook.close()
+ output.seek(0)
+ response.stream.write(output.read())
+ output.close()
+
def get_xlsx_meal_report(self, data, response):
"""误餐明细报表的自定义 Excel 样式"""
output = io.BytesIO()
diff --git a/yuthon_hr_attendance/__manifest__.py b/yuthon_hr_attendance/__manifest__.py
index 5f566c4dd..67f7d648a 100644
--- a/yuthon_hr_attendance/__manifest__.py
+++ b/yuthon_hr_attendance/__manifest__.py
@@ -126,6 +126,8 @@
'yuthon_hr_attendance/static/src/xml/button_meal_active_export.xml',
'yuthon_hr_attendance/static/src/js/button_vacation_put.js',
'yuthon_hr_attendance/static/src/xml/button_vacation_put.xml',
+ 'yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js',
+ 'yuthon_hr_attendance/static/src/xml/button_overtime_carryover_export.xml',
'yuthon_hr_attendance/static/src/planning_gantt/planning_gantt_controller.xml',
diff --git a/yuthon_hr_attendance/models/overtime_carryover.py b/yuthon_hr_attendance/models/overtime_carryover.py
index 0cc96db9c..0d465e694 100644
--- a/yuthon_hr_attendance/models/overtime_carryover.py
+++ b/yuthon_hr_attendance/models/overtime_carryover.py
@@ -25,8 +25,8 @@ class OvertimeCarryover(models.Model):
store=False,
)
duration1 = fields.Float(string='动态时长')
- last_month = fields.Float(string="上月剩余")
- this_month = fields.Float(string="本月结余")
+ last_month = fields.Float(string="上期剩余")
+ this_month = fields.Float(string="本期结余")
is_void = fields.Boolean(string='作废')
carryover_type = fields.Selection([('fee', '加班费结算'), ('leave', '假单结算'), ('cancel', '销假')], string='加班补偿方式',
default='leave')
diff --git a/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js b/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js
new file mode 100644
index 000000000..5bbd90a02
--- /dev/null
+++ b/yuthon_hr_attendance/static/src/js/button_overtime_carryover_export.js
@@ -0,0 +1,39 @@
+/** @odoo-module */
+import { ListController } from "@web/views/list/list_controller";
+import { registry } from '@web/core/registry';
+import { listView } from '@web/views/list/list_view';
+
+export class CustomOvertimeCarryoverExportController extends ListController {
+ setup() {
+ super.setup();
+ }
+
+ async exportOvertimeCarryoverExcel() {
+ const selectedIds = await this.getSelectedResIds();
+ // 没有勾选时,取当前视图所有记录的 ID
+ let exportIds = selectedIds;
+ if (!exportIds || exportIds.length === 0) {
+ exportIds = this.model.root.records.map(r => r.resId);
+ }
+ return this.actionService.doAction({
+ type: 'ir.actions.act_window',
+ res_model: 'export.date.wizard',
+ name: '打印明细',
+ view_mode: 'form',
+ view_type: 'form',
+ views: [[false, 'form']],
+ target: 'new',
+ context: {
+ default_export_type: 'overtime_carryover',
+ default_model_name: 'overtime.carryover',
+ default_active_ids: JSON.stringify(exportIds),
+ },
+ });
+ }
+}
+
+registry.category("views").add("custom_overtime_carryover_export_button", {
+ ...listView,
+ Controller: CustomOvertimeCarryoverExportController,
+ buttonTemplate: "overtime_carryover_export_module.ListView.Buttons",
+});
diff --git a/yuthon_hr_attendance/static/src/js/button_overtime_export.js b/yuthon_hr_attendance/static/src/js/button_overtime_export.js
index fb92e936d..c53afe55d 100644
--- a/yuthon_hr_attendance/static/src/js/button_overtime_export.js
+++ b/yuthon_hr_attendance/static/src/js/button_overtime_export.js
@@ -29,9 +29,13 @@ export class CustomOvertimeExportController extends ListController {
}
async exportOvertimeDetailExcel() {
- // 导出加班详情(包含审批类型、开始结束时间、事由、餐费等)
+ // 导出加班详情(包含加班明细视图字段)
const selectedIds = await this.getSelectedResIds();
-
+ // 没有勾选时,取当前视图所有记录的 ID
+ let exportIds = selectedIds;
+ if (!exportIds || exportIds.length === 0) {
+ exportIds = this.model.root.records.map(r => r.resId);
+ }
return this.actionService.doAction({
type: 'ir.actions.act_window',
res_model: 'export.date.wizard',
@@ -43,7 +47,7 @@ export class CustomOvertimeExportController extends ListController {
context: {
default_export_type: 'overtime_detail',
default_model_name: 'vacation.over.line',
- default_active_ids: JSON.stringify(selectedIds),
+ default_active_ids: JSON.stringify(exportIds),
},
});
}
diff --git a/yuthon_hr_attendance/views/overtime_carryover_views.xml b/yuthon_hr_attendance/views/overtime_carryover_views.xml
index 64f40fc31..f010b4c37 100644
--- a/yuthon_hr_attendance/views/overtime_carryover_views.xml
+++ b/yuthon_hr_attendance/views/overtime_carryover_views.xml
@@ -26,7 +26,7 @@
overtime.carryover.tree1
overtime.carryover
-
+
diff --git a/yuthon_hr_attendance/wizard/export_date_wizard.py b/yuthon_hr_attendance/wizard/export_date_wizard.py
index a6c09ec22..79a952252 100644
--- a/yuthon_hr_attendance/wizard/export_date_wizard.py
+++ b/yuthon_hr_attendance/wizard/export_date_wizard.py
@@ -45,6 +45,9 @@ class ExportDateWizard(models.TransientModel):
return self._export_meal(start_date, end_date)
elif self.export_type == 'meal_active':
return self._export_meal_active(start_date, end_date)
+ elif self.export_type == 'overtime_carryover':
+ return self._export_overtime_carryover(start_date, end_date)
+
else:
raise UserError('未知的导出类型')
@@ -171,33 +174,56 @@ class ExportDateWizard(models.TransientModel):
}
def _export_overtime_detail(self, start_date, end_date):
- """导出加班详情"""
+ """导出加班详情 - 对应 vacation.over.line.overtime.tree 视图字段"""
active_ids = json.loads(self.active_ids) if self.active_ids else []
-
- domain = [('carry_forward_date', '>=', start_date), ('carry_forward_date', '<', end_date)]
+
+ carry_forward_state_map = {
+ 'pending': '待结转',
+ 'completed': '已结转',
+ 'partial': '部分结转',
+ }
+
if active_ids:
- domain = [('id', 'in', active_ids)] + domain
-
- filtered_records = self.env['vacation.over.line'].search(domain)
-
- if not filtered_records:
+ records = self.env['vacation.over.line'].browse(active_ids)
+ else:
+ domain = [('start_time', '>=', start_date), ('start_time', '<', end_date)]
+ records = self.env['vacation.over.line'].search(domain)
+
+ if not records:
raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班记录')
-
- filtered_ids = filtered_records.ids
-
- fields_name = ['employee_id', 'department_id', 'workflow_id', 'start_time',
- 'end_time', 'duration', 'reason_application', 'meal']
- field_label = ['员工', '部门', '审批类型', '加班开始时间', '加班结束时间',
- '加班时长', '事由', '加班餐费']
-
+
+ export_data = []
+ for rec in records:
+ export_data.append({
+ 'overtime_name': rec.overtime_name or '',
+ 'employee_id': rec.employee_id.name if rec.employee_id else '',
+ 'department_id': rec.department_id.name if rec.department_id else '',
+ 'start_time': (rec.start_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if rec.start_time else '',
+ 'end_time': (rec.end_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if rec.end_time else '',
+ 'duration': rec.duration,
+ 'carry_forward_quantity': rec.carry_forward_quantity,
+ 'carry_forward_date': rec.carry_forward_date,
+ 'carry_forward_state': carry_forward_state_map.get(rec.carry_forward_state, rec.carry_forward_state or ''),
+ 'remaining_quantity': rec.remaining_quantity,
+ 'validity': rec.validity or '',
+ })
+
+ fields_name = ['overtime_name', 'employee_id', 'department_id', 'start_time', 'end_time',
+ 'duration', 'carry_forward_quantity', 'carry_forward_date',
+ 'carry_forward_state', 'remaining_quantity', 'validity']
+ field_label = ['标题', '员工', '部门', '开始时间', '结束时间',
+ '时长', '结转时长', '结转日期',
+ '结转状态', '剩余数', '有效期']
+
data = {
'report_name': '加班详情报表',
'model_name': 'vacation.over.line',
'fields_name': fields_name,
'field_label': field_label,
- 'active_ids': filtered_ids,
+ 'export_data': export_data,
+ 'date_field': None,
}
-
+
return {
'type': 'ir.actions.report',
'data': {
@@ -300,6 +326,61 @@ class ExportDateWizard(models.TransientModel):
}
+ def _export_overtime_carryover(self, start_date, end_date):
+ """导出加班结转明细(overtime.carryover.tree1 视图数据)"""
+ active_ids = json.loads(self.active_ids) if self.active_ids else []
+
+ if active_ids:
+ records = self.env['overtime.carryover'].browse(active_ids)
+ else:
+ records = self.env['overtime.carryover'].search([
+ ('carry_forward_date', '>=', start_date.date()),
+ ('carry_forward_date', '<', end_date.date()),
+ ])
+
+ if not records:
+ raise UserError(f'在 {self.year} 年 {self.month} 月没有找到符合条件的加班结转记录')
+
+ export_data = []
+ for record in records:
+ over_line = record.over_line_id
+ export_data.append({
+ 'employee_id': record.employee_id.name if record.employee_id else '',
+ 'department_id': record.department_id.name if record.department_id else '',
+ 'start_time': (over_line.start_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.start_time else '',
+ 'end_time': (over_line.end_time + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if over_line and over_line.end_time else '',
+ 'carry_forward_date': record.carry_forward_date,
+ 'last_month': record.last_month,
+ 'carry_forward_quantity1': record.carry_forward_quantity1,
+ 'this_month': record.this_month,
+ 'carry_result': '成功',
+ })
+
+ fields_name = ['employee_id', 'department_id', 'start_time', 'end_time',
+ 'carry_forward_date', 'last_month', 'carry_forward_quantity1', 'this_month', 'carry_result']
+ field_label = ['姓名', '部门', '加班开始时间', '加班结束时间',
+ '结转日期', '上期剩余', '结转时长', '本期结余', '结转结果']
+
+ data = {
+ 'report_name': '加班结转明细报表',
+ 'model_name': 'overtime.carryover',
+ 'fields_name': fields_name,
+ 'field_label': field_label,
+ 'export_data': export_data,
+ 'date_field': None,
+ }
+
+ return {
+ 'type': 'ir.actions.report',
+ 'data': {
+ 'model': 'report.excel',
+ 'options': json.dumps(data, default=date_utils.json_default),
+ 'output_format': 'xlsx',
+ 'report_name': '加班结转明细报表',
+ },
+ 'report_type': 'xlsx',
+ }
+
def _export_meal(self, start_date, end_date):
"""导出误餐明细"""
active_ids = json.loads(self.active_ids) if self.active_ids else []
diff --git a/yuthon_hr_employee/views/inherit_hr_applicant_views.xml b/yuthon_hr_employee/views/inherit_hr_applicant_views.xml
index d0354911e..6f3bd94bd 100644
--- a/yuthon_hr_employee/views/inherit_hr_applicant_views.xml
+++ b/yuthon_hr_employee/views/inherit_hr_applicant_views.xml
@@ -26,7 +26,7 @@
-
+
@@ -85,7 +85,7 @@
岗位
-
+
diff --git a/yuthon_hr_employee/views/inherit_res_groups_views.xml b/yuthon_hr_employee/views/inherit_res_groups_views.xml
index ee7e52a3a..6003be5f8 100644
--- a/yuthon_hr_employee/views/inherit_res_groups_views.xml
+++ b/yuthon_hr_employee/views/inherit_res_groups_views.xml
@@ -18,7 +18,7 @@
-
+
diff --git a/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml
index ff3735ca6..93cbe6b2c 100644
--- a/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml
+++ b/yuthon_hr_employee/wizard/hr_employee_time_wizard_views.xml
@@ -7,7 +7,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
index 46b829f5b..0edcb6fc8 100644
--- a/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
+++ b/yuthon_hr_employee_approval/views/property_reimbursement_form_views.xml
@@ -73,7 +73,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
index c24886b8a..3728a14fe 100644
--- a/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_department_change_viwes.xml
@@ -64,7 +64,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
index 6e7eb6780..1a4beb4c1 100644
--- a/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_employee_add_views.xml
@@ -82,7 +82,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
index aac025857..37028227e 100644
--- a/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_leaving_approval_views.xml
@@ -62,7 +62,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
index fc9a5d220..96e7fd459 100644
--- a/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_pre_examination_views.xml
@@ -49,7 +49,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
index c696a433b..59e7aa9b6 100644
--- a/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_prepare_approval_views.xml
@@ -65,7 +65,7 @@
-
+
@@ -82,7 +82,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
index efb5b0174..da0486788 100644
--- a/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_recruitment_approval_views.xml
@@ -53,7 +53,7 @@
-
+
@@ -66,7 +66,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
index e6cbca9c2..c0d3d4ddb 100644
--- a/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_retired_approval_views.xml
@@ -57,7 +57,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
index 2ddef9b0d..d67535cd9 100644
--- a/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_reward_approval_views.xml
@@ -54,7 +54,7 @@
-
+
@@ -69,7 +69,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
index b7233dc0b..a415040d6 100644
--- a/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_service_approval_views.xml
@@ -57,7 +57,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
index d5dfe1c55..7e03b461b 100644
--- a/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_social_files_approval_view.xml
@@ -60,7 +60,7 @@
-
+
diff --git a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
index 0a125f3cc..bf9adea08 100644
--- a/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
+++ b/yuthon_hr_employee_approval/views/yuthon_transfer_approval_views.xml
@@ -61,7 +61,7 @@
-
+
diff --git a/yuthon_issue/views/issue_approval_decision_views.xml b/yuthon_issue/views/issue_approval_decision_views.xml
index b0fc16a66..548a27520 100644
--- a/yuthon_issue/views/issue_approval_decision_views.xml
+++ b/yuthon_issue/views/issue_approval_decision_views.xml
@@ -53,7 +53,7 @@
-
+
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index 6f57641a8..f7febdf8d 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -264,7 +264,7 @@
-
+
@@ -292,7 +292,7 @@
-
+
@@ -537,7 +537,7 @@
-
+
diff --git a/yuthon_official/views/yuthon_official_incoming_normal_views.xml b/yuthon_official/views/yuthon_official_incoming_normal_views.xml
index 2e1450adc..8f1a41d95 100644
--- a/yuthon_official/views/yuthon_official_incoming_normal_views.xml
+++ b/yuthon_official/views/yuthon_official_incoming_normal_views.xml
@@ -76,7 +76,7 @@
-
+
diff --git a/yuthon_official/views/yuthon_sub_enterprises_view.xml b/yuthon_official/views/yuthon_sub_enterprises_view.xml
index 59aae21ae..4f71b41e9 100644
--- a/yuthon_official/views/yuthon_sub_enterprises_view.xml
+++ b/yuthon_official/views/yuthon_sub_enterprises_view.xml
@@ -56,7 +56,7 @@
-
+