diff --git a/jikimo_system_order/static/description/系统工单.png b/jikimo_system_order/static/description/系统工单.png
new file mode 100644
index 00000000..b2d3558f
Binary files /dev/null and b/jikimo_system_order/static/description/系统工单.png differ
diff --git a/jikimo_system_order/views/yizuo_system_order_view.xml b/jikimo_system_order/views/yizuo_system_order_view.xml
index 006a085d..c3a3b2f2 100644
--- a/jikimo_system_order/views/yizuo_system_order_view.xml
+++ b/jikimo_system_order/views/yizuo_system_order_view.xml
@@ -234,7 +234,7 @@
-
+
diff --git a/quality_control/static/description/质量.png b/quality_control/static/description/质量.png
new file mode 100644
index 00000000..308ef030
Binary files /dev/null and b/quality_control/static/description/质量.png differ
diff --git a/quality_control/views/quality_views.xml b/quality_control/views/quality_views.xml
index acb0fb71..f7a1a3dc 100644
--- a/quality_control/views/quality_views.xml
+++ b/quality_control/views/quality_views.xml
@@ -1024,7 +1024,7 @@
diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv
index ecc572c7..3d4ba3a0 100644
--- a/sf_base/security/ir.model.access.csv
+++ b/sf_base/security/ir.model.access.csv
@@ -242,3 +242,8 @@ access_sf_fixture_materials_basic_parameters_group_sf_stock_manager,sf_fixture_m
access_sf_multi_mounting_type_group_sf_stock_manager,sf_multi_mounting_type_group_sf_stock_manager,model_sf_multi_mounting_type,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_machine_brand_group_sf_stock_manager,sf_machine_brand_group_sf_stock_manager,model_sf_machine_brand,sf_base.group_sf_stock_manager,1,0,0,0
access_sf_cutting_tool_type_group_sf_stock_manager,sf_cutting_tool_type_group_sf_stock_manager,model_sf_cutting_tool_type,sf_base.group_sf_stock_manager,1,0,0,0
+
+
+access_sf_cutting_tool_material_group_plan_dispatch,sf_cutting_tool_material_group_plan_dispatch,model_sf_cutting_tool_material,sf_base.group_plan_dispatch,1,0,0,0
+access_sf_functional_cutting_tool_model_group_plan_dispatch,sf_functional_cutting_tool_model_group_plan_dispatch,model_sf_functional_cutting_tool_model,sf_base.group_plan_dispatch,1,0,0,0
+access_sf_cutting_tool_type_group_plan_dispatch,sf_cutting_tool_type_group_plan_dispatch,model_sf_cutting_tool_type,sf_base.group_plan_dispatch,1,0,0,0
diff --git a/sf_hr/__manifest__.py b/sf_hr/__manifest__.py
index aaf9cfc7..c0bd63ef 100644
--- a/sf_hr/__manifest__.py
+++ b/sf_hr/__manifest__.py
@@ -10,6 +10,8 @@
'depends': ['hr'],
'data': [
'views/hr_employee.xml',
+ 'views/res_config_settings_views.xml',
+ 'data/cron_data.xml',
],
'demo': [
],
diff --git a/sf_hr/data/cron_data.xml b/sf_hr/data/cron_data.xml
new file mode 100644
index 00000000..4757b5c2
--- /dev/null
+++ b/sf_hr/data/cron_data.xml
@@ -0,0 +1,15 @@
+
+
+
+ 员工企微id同步
+
+ code
+ model._employee_info_sync()
+ 1
+ days
+ -1
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_hr/models/__init__.py b/sf_hr/models/__init__.py
index 633f8661..ffe76391 100644
--- a/sf_hr/models/__init__.py
+++ b/sf_hr/models/__init__.py
@@ -1,2 +1,4 @@
# -*- coding: utf-8 -*-
+from . import hr_employee
+from . import res_config_setting
diff --git a/sf_hr/models/hr_employee.py b/sf_hr/models/hr_employee.py
new file mode 100644
index 00000000..8cf5595d
--- /dev/null
+++ b/sf_hr/models/hr_employee.py
@@ -0,0 +1,26 @@
+import logging
+import requests
+from odoo import models, fields, api, _
+
+_logger = logging.getLogger(__name__)
+
+
+class JkmPracticeEmployee(models.Model):
+ _inherit = 'hr.employee'
+ _description = '员工信息'
+
+ we_id = fields.Char(string='企微ID', index=True)
+
+ def _employee_info_sync(self):
+ url = '/api/get/organization'
+ config = self.env['res.config.settings'].get_values()
+ ret = requests.post((config['ims_url'] + url), json={}, data={})
+ result = ret.json()['result']
+ if result['code'] == 200:
+ if result['employee_list']:
+ for employee_info in result['employee_list']:
+ if employee_info['work_email']:
+ self.sudo().search([('work_email', '=', employee_info['work_email'])]).write(
+ {'we_id': employee_info['we_id']})
+ else:
+ logging.info('_employee_info_sync error:%s' % result['message'])
diff --git a/sf_hr/models/res_config_setting.py b/sf_hr/models/res_config_setting.py
new file mode 100644
index 00000000..f0d6dae4
--- /dev/null
+++ b/sf_hr/models/res_config_setting.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+import logging
+from odoo import api, fields, models
+
+_logger = logging.getLogger(__name__)
+
+
+class ResIMSConfigSettings(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ ims_url = fields.Char('综合管理系统访问地址')
+
+ @api.model
+ def get_values(self):
+ """
+ 重载获取参数的方法,参数都存在系统参数中
+ :return:
+ """
+ values = super(ResIMSConfigSettings, self).get_values()
+ config = self.env['ir.config_parameter'].sudo()
+ ims_url = config.get_param('ims_url', default='')
+ values.update(
+ ims_url=ims_url,
+ )
+ return values
+
+ def set_values(self):
+ super(ResIMSConfigSettings, self).set_values()
+ ir_config = self.env['ir.config_parameter'].sudo()
+ ir_config.set_param("ims_url", self.ims_url or "")
diff --git a/sf_hr/views/hr_employee.xml b/sf_hr/views/hr_employee.xml
index a3db9076..c2b39112 100644
--- a/sf_hr/views/hr_employee.xml
+++ b/sf_hr/views/hr_employee.xml
@@ -7,7 +7,16 @@
- 1
+ 1
+
+
+
+
+
+
+
+
+
diff --git a/sf_hr/views/res_config_settings_views.xml b/sf_hr/views/res_config_settings_views.xml
new file mode 100644
index 00000000..75ee6551
--- /dev/null
+++ b/sf_hr/views/res_config_settings_views.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ res.config.settings.finance.view.form.extend
+ res.config.settings
+
+
+
+
+
+
+
+
+
diff --git a/sf_machine_connect/views/res_config_settings_views.xml b/sf_machine_connect/views/res_config_settings_views.xml
index fa3ba59c..b8a681a2 100644
--- a/sf_machine_connect/views/res_config_settings_views.xml
+++ b/sf_machine_connect/views/res_config_settings_views.xml
@@ -24,7 +24,7 @@
获取检测报告服务配置
-
+
+
+
+
diff --git a/sf_maintenance/static/description/维护.png b/sf_maintenance/static/description/维护.png
new file mode 100644
index 00000000..6d459be8
Binary files /dev/null and b/sf_maintenance/static/description/维护.png differ
diff --git a/sf_maintenance/views/maintenance_views.xml b/sf_maintenance/views/maintenance_views.xml
index 5be7c124..8b084f04 100644
--- a/sf_maintenance/views/maintenance_views.xml
+++ b/sf_maintenance/views/maintenance_views.xml
@@ -1230,5 +1230,9 @@
action="hr_equipment_action1"
sequence="0"/>
+
+
\ No newline at end of file
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 23fd8c79..5de5e780 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -144,6 +144,8 @@ class ResMrpWorkOrder(models.Model):
# 是否绑定托盘
is_trayed = fields.Boolean(string='是否绑定托盘', default=False)
+ tag_type = fields.Selection([("重新加工", "重新加工")], string="标签", tracking=True)
+
@api.depends('name', 'production_id.name')
def _compute_surface_technics_picking_ids(self):
for workorder in self:
@@ -426,7 +428,8 @@ class ResMrpWorkOrder(models.Model):
logging.info('local_file_path:%s' % local_file_path)
remote_path = '/home/ftp/ftp_root/ThreeTest/XT/Before/' + local_filename
logging.info('remote_path:%s' % remote_path)
- if not ftp.file_exists(remote_path):
+ is_get_detection_file = self.env['ir.config_parameter'].sudo().get_param('is_get_detection_file')
+ if not is_get_detection_file:
paload_data = {
"filename": local_filename
}
@@ -603,6 +606,8 @@ class ResMrpWorkOrder(models.Model):
print("(%.2f,%.2f)" % (x, y))
self.material_center_point = ("(%.2f,%.2f,%.2f)" % (x, y, z))
self.X_deviation_angle = jdz
+ logging.info("坯料中心点坐标:(%.2f,%.2f)" % (x, y))
+ logging.info("X轴偏差度数:%.2f" % jdz)
# 将补偿值写入CNC加工工单
workorder = self.env['mrp.workorder'].browse(self.ids)
work = workorder.production_id.workorder_ids
@@ -705,6 +710,7 @@ class ResMrpWorkOrder(models.Model):
'date_planned_finished': datetime.now() + timedelta(days=1),
'duration_expected': duration_expected,
'duration': 0,
+ 'tag_type': '重新加工' if item is False else False,
'cnc_ids': False if route.routing_type != 'CNC加工' else self.env['sf.cnc.processing']._json_cnc_processing(
k, item),
'cmm_ids': False if route.routing_type != 'CNC加工' else self.env['sf.cmm.program']._json_cmm_program(k,
@@ -1183,8 +1189,10 @@ class ResMrpWorkOrder(models.Model):
if not record.rfid_code and record.is_rework is False:
raise UserError("请扫RFID码进行绑定")
if record.is_rework is False:
- if not record.material_center_point or record.X_deviation_angle <= 0:
- raise UserError("坯料中心点为空或X偏差角度小于等于0")
+ if not record.material_center_point:
+ raise UserError("坯料中心点为空,请检查")
+ if record.X_deviation_angle <= 0:
+ raise UserError("X偏差角度小于等于0,请检查!本次计算的X偏差角度为:%s" % record.X_deviation_angle)
record.process_state = '待加工'
# record.write({'process_state': '待加工'})
record.production_id.process_state = '待加工'
@@ -1565,6 +1573,8 @@ class SfWorkOrderBarcodes(models.Model):
def on_barcode_scanned(self, barcode):
logging.info('Rfid:%s' % barcode)
+ if 'O-CMD' in barcode:
+ return None
workorder = self.env['mrp.workorder'].browse(self.ids)
# workorder_preset = self.env['mrp.workorder'].search(
# [('routing_type', '=', '装夹预调'), ('rfid_code', '=', barcode)])
diff --git a/sf_manufacturing/models/res_config_setting.py b/sf_manufacturing/models/res_config_setting.py
index d6b029c6..984ba223 100644
--- a/sf_manufacturing/models/res_config_setting.py
+++ b/sf_manufacturing/models/res_config_setting.py
@@ -4,19 +4,39 @@ from odoo import models, fields, api
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
+ agv_rcs_url = fields.Char(string='avg_rcs访问地址',
+ default='http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask')
+ wbcode = fields.Char('地码')
+ agv_code = fields.Char(string='agv编号')
+ task_type_no = fields.Char('任务单类型编号')
+
is_agv_task_dispatch = fields.Boolean('是否下发AGV任务', default=False)
+ # 是否重新获取检测文件
+ is_get_detection_file = fields.Boolean(string='重新获取检测文件', default=False)
@api.model
def get_values(self):
values = super(ResConfigSettings, self).get_values()
config = self.env['ir.config_parameter'].sudo()
+ agv_rcs_url = config.get_param('agv_rcs_url', default='')
+ wbcode = config.get_param('wbcode', default='')
+ agv_code = config.get_param('agv_code', default='')
is_agv_task_dispatch = config.get_param('is_agv_task_dispatch')
+ is_get_detection_file = config.get_param('is_get_detection_file')
values.update(
+ agv_rcs_url=agv_rcs_url,
+ wbcode=wbcode,
+ agv_code=agv_code,
is_agv_task_dispatch=is_agv_task_dispatch,
+ is_get_detection_file=is_get_detection_file
)
return values
def set_values(self):
super(ResConfigSettings, self).set_values()
config = self.env['ir.config_parameter'].sudo()
+ config.set_param("agv_rcs_url", self.agv_rcs_url or "")
+ config.set_param("wbcode", self.wbcode or "")
+ config.set_param("agv_code", self.agv_code or "")
config.set_param("is_agv_task_dispatch", self.is_agv_task_dispatch or False)
+ config.set_param("is_get_detection_file", self.is_get_detection_file or False)
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index bb451f51..e38f502f 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -32,6 +32,8 @@
+
@@ -43,11 +45,11 @@
-
-
-
-
-
+
+
+
+
+
{'invisible': ['|', '|', '|','|','|', ('production_state','in', ('draft',
'done',
'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')),
@@ -165,8 +167,8 @@
-
-
+
+
-
-
AGV参数配置
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
中控参数配置
diff --git a/sf_tool_management/models/jikimo_bom.py b/sf_tool_management/models/jikimo_bom.py
index 8453eb48..62138d77 100644
--- a/sf_tool_management/models/jikimo_bom.py
+++ b/sf_tool_management/models/jikimo_bom.py
@@ -50,7 +50,7 @@ class jikimo_bom(models.Model):
def write(self, vals):
# 在更新模型时记录旧的 Many2many ID 列表
- if 'product_ids' in vals:
+ if 'product_ids' in vals and not self.env.context.get('is_assembly_options'):
old_product_counter = Counter(self.product_ids.ids)
super(jikimo_bom, self).write(vals)
new_product_counter = Counter(self.product_ids.ids)
@@ -102,7 +102,7 @@ class jikimo_bom(models.Model):
domains = domains + domain
if index != 0:
domains = ['|'] + domains
- domains = domains + [('stock_move_count', '>', 0)]
+ domains = domains + [('stock_move_ids', '!=',False)]
return domains
def generate_bill_materials(self, assembly_options):
@@ -117,7 +117,10 @@ class jikimo_bom(models.Model):
domains = self.bom_product_domains(assembly_options)
products = self.env['product.product'].search(domains)
if products:
- self.product_ids = [Command.set(products.ids)]
+ new_context = dict(self.env.context)
+ new_context['is_assembly_options'] = True
+ self.with_context(new_context).write({'product_ids': [Command.set(products.ids)]})
+ # self.product_ids = [Command.set(products.ids)]
class jikimo_bom_line(models.Model):
@@ -130,15 +133,15 @@ class jikimo_bom_line(models.Model):
class ProductProduct(models.Model):
_inherit = 'product.product'
_order = 'cutting_tool_material_id, cutting_tool_type_id'
- stock_move_count = fields.Integer(string='stock_move count', compute='_compute_stock_move_count', store=True)
-
- @api.depends('stock_move_ids')
- def _compute_stock_move_count(self):
- for record in self:
- if record.stock_move_ids:
- record.stock_move_count = len(record.stock_move_ids)
- else:
- record.stock_move_count = 0
+ # stock_move_count = fields.Integer(string='stock_move count', compute='_compute_stock_move_count')
+ #
+ # @api.depends('stock_move_ids')
+ # def _compute_stock_move_count(self):
+ # for record in self:
+ # if record.stock_move_ids:
+ # record.stock_move_count = len(record.stock_move_ids)
+ # else:
+ # record.stock_move_count = 0
def search(self, args, offset=0, limit=None, order=None, count=False):
# 你可以在这里修改 `args` 以调整搜索条件
diff --git a/sf_tool_management/views/jikimo_bom.xml b/sf_tool_management/views/jikimo_bom.xml
index c42af591..50234ac2 100644
--- a/sf_tool_management/views/jikimo_bom.xml
+++ b/sf_tool_management/views/jikimo_bom.xml
@@ -9,7 +9,7 @@
jikimo.bom.form
jikimo.bom
-