保留装夹测量数据
diff --git a/sf_manufacturing/wizard/workpiece_delivery_wizard.py b/sf_manufacturing/wizard/workpiece_delivery_wizard.py
index 6a13fc08..bc4b8210 100644
--- a/sf_manufacturing/wizard/workpiece_delivery_wizard.py
+++ b/sf_manufacturing/wizard/workpiece_delivery_wizard.py
@@ -54,10 +54,7 @@ class WorkpieceDeliveryWizard(models.TransientModel):
}
}
- def _get_agv_route_type_selection(self):
- return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
-
- delivery_type = fields.Selection(selection=_get_agv_route_type_selection, string='类型')
+ delivery_type = fields.Selection(related='route_id.route_type', string='类型')
def dispatch_confirm(self):
if len(self.workorder_ids) < 4:
diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml
index b429d766..4003df45 100644
--- a/sf_message/data/bussiness_node.xml
+++ b/sf_message/data/bussiness_node.xml
@@ -156,4 +156,12 @@
product.product
+
+
+
+ 计划数据异常跟踪
+ mrp.workorder
+
+
+
\ No newline at end of file
diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml
index 11f05a3c..c0e96d99 100644
--- a/sf_message/data/template_data.xml
+++ b/sf_message/data/template_data.xml
@@ -402,4 +402,19 @@
事项:有{{num}}个质检单需要处理。
+
+
+
+ 计划数据异常跟踪
+
+ mrp.workorder
+
+ markdown
+ normal
+ ### 工单计划数据异常删除:
+工单号:{{name}}
+异动时间:{{write_date}}
+
+
+
\ No newline at end of file
diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py
index 653562e1..42b03139 100644
--- a/sf_message/models/sf_message_workorder.py
+++ b/sf_message/models/sf_message_workorder.py
@@ -188,3 +188,10 @@ class SFMessageWork(models.Model):
])
if message_queue_ids:
message_queue_ids.write({'message_status': 'cancel'})
+
+ def write(self, vals):
+ res = super(SFMessageWork, self).write(vals)
+ if ('leave_id' in vals and vals['leave_id'] is False or 'date_planned_start' in vals and vals['date_planned_start'] is False) \
+ and self.schedule_state != '未排':
+ self.add_queue('计划数据异常跟踪')
+ return res
diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py
index 835183b3..9115bc65 100644
--- a/sf_mrs_connect/models/sync_common.py
+++ b/sf_mrs_connect/models/sync_common.py
@@ -1988,6 +1988,9 @@ class CuttingSpeed(models.Model):
})
else:
cutting_speed.write({
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -2040,6 +2043,9 @@ class CuttingSpeed(models.Model):
})
else:
cutting_speed.write({
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'execution_standard_id': self.env['sf.international.standards'].search(
[('code', '=', item['execution_standard_code'])]).id,
'material_name_id': self.env['sf.materials.model'].search(
@@ -2130,6 +2136,9 @@ class CuttingSpeed(models.Model):
})
else:
feed_per_tooth.write({
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2168,6 +2177,9 @@ class CuttingSpeed(models.Model):
})
else:
feed_per_tooth.write({
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'materials_type_id': self.env['sf.materials.model'].search(
[('materials_no', '=', item['materials_type_code'])]).id,
'cutting_width_depth_id': self.env['sf.cutting.width.depth'].search(
@@ -2454,6 +2466,11 @@ class CuttingToolBasicParameters(models.Model):
else:
self.search([('code', '=', integral_tool_item['code'])]).write({
'name': integral_tool_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [(
+ 'code', '=',
+ integral_tool_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2516,6 +2533,9 @@ class CuttingToolBasicParameters(models.Model):
else:
self.search([('code', '=', blade_item['code'])]).write({
'name': blade_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', blade_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2573,6 +2593,9 @@ class CuttingToolBasicParameters(models.Model):
else:
self.search([('code', '=', chuck_item['code'])]).write({
'name': chuck_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2632,6 +2655,9 @@ class CuttingToolBasicParameters(models.Model):
else:
self.search([('code', '=', cutter_arbor_item['code'])]).write({
'name': cutter_arbor_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -2697,6 +2723,9 @@ class CuttingToolBasicParameters(models.Model):
else:
self.search([('code', '=', cutter_head_item['code'])]).write({
'name': cutter_head_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -2727,6 +2756,9 @@ class CuttingToolBasicParameters(models.Model):
[('code', '=', knife_handle_item['code']), ('active', 'in', [True, False])])
val = {
'name': knife_handle_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'taper_shank_model': knife_handle_item['taper_shank_model'],
'total_length': knife_handle_item['total_length'],
'flange_shank_length': knife_handle_item['flange_length'],
@@ -2751,9 +2783,6 @@ class CuttingToolBasicParameters(models.Model):
if not knife_handle:
val['code'] = knife_handle_item['code']
val['cutting_tool_type'] = '刀柄'
- val['standard_library_id'] = self.env['sf.cutting_tool.standard.library'].search(
- [('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
- 'factory_short_name']))]).id
self.create(val)
else:
self.search([('code', '=', knife_handle_item['code'])]).write(val)
@@ -2809,6 +2838,11 @@ class CuttingToolBasicParameters(models.Model):
else:
integral_tool.write({
'name': integral_tool_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [(
+ 'code', '=',
+ integral_tool_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'total_length': integral_tool_item['total_length'],
'blade_diameter': integral_tool_item['blade_diameter'],
'blade_length': integral_tool_item['blade_length'],
@@ -2871,6 +2905,9 @@ class CuttingToolBasicParameters(models.Model):
else:
blade.write({
'name': blade_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', blade_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'length': blade_item['length'],
'thickness': blade_item['thickness'],
'cutting_blade_length': blade_item['cutting_blade_length'],
@@ -2928,6 +2965,9 @@ class CuttingToolBasicParameters(models.Model):
else:
chuck.write({
'name': chuck_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', chuck_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'er_size_model': chuck_item['size_model'],
'min_clamping_diameter': chuck_item['clamping_diameter_min'],
'max_clamping_diameter': chuck_item['clamping_diameter_max'],
@@ -2987,6 +3027,9 @@ class CuttingToolBasicParameters(models.Model):
else:
cutter_arbor.write({
'name': cutter_arbor_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', cutter_arbor_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'height': cutter_arbor_item['height'],
'width': cutter_arbor_item['width'],
'total_length': cutter_arbor_item['total_length'],
@@ -3053,6 +3096,9 @@ class CuttingToolBasicParameters(models.Model):
else:
cutter_head.write({
'name': cutter_head_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', cutter_head_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'install_blade_tip_num': cutter_head_item['number_blade_installed'],
'blade_diameter': cutter_head_item['blade_diameter'],
'cutter_head_diameter': cutter_head_item['cutter_diameter'],
@@ -3114,6 +3160,9 @@ class CuttingToolBasicParameters(models.Model):
else:
knife_handle.write({
'name': knife_handle_item['name'],
+ 'standard_library_id': self.env['sf.cutting_tool.standard.library'].search(
+ [('code', '=', knife_handle_item['standard_library_code'].replace("JKM", result[
+ 'factory_short_name']))]).id,
'total_length': knife_handle_item['total_length'],
'taper_shank_model': knife_handle_item['taper_shank_model'],
'flange_shank_length': knife_handle_item['flange_length'],
diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py
index 4b6c1774..6bfdf4f1 100644
--- a/sf_quality/models/quality.py
+++ b/sf_quality/models/quality.py
@@ -85,6 +85,18 @@ class QualityCheck(models.Model):
raise ValidationError('请填写【判定结果】里的信息')
if self.test_results == '合格':
raise ValidationError('请重新选择【判定结果】-【检测结果】')
+ if self.workorder_id.routing_type != 'CNC加工' and self.workorder_id.individuation_page_PTD is False:
+ self.workorder_id.production_id.write({'detection_result_ids': [(0, 0, {
+ 'rework_reason': self.workorder_id.reason,
+ 'detailed_reason': self.workorder_id.detailed_reason,
+ 'processing_panel': self.workorder_id.processing_panel,
+ 'routing_type': self.workorder_id.routing_type,
+ 'handle_result': '待处理' if (self.workorder_id.test_results in ['返工', '报废']
+ or self.workorder_id.is_rework is True) else '',
+ 'test_results': self.workorder_id.test_results,
+ 'test_report': self.workorder_id.detection_report})],
+ 'is_scrap': True if self.workorder_id.test_results == '报废' else False
+ })
if self.workorder_id.state not in ['done']:
self.workorder_id.write(
{'test_results': self.test_results, 'reason': self.reason, 'detailed_reason': self.detailed_reason})
diff --git a/sf_quality/views/quality_check_view.xml b/sf_quality/views/quality_check_view.xml
index 61309737..00b139de 100644
--- a/sf_quality/views/quality_check_view.xml
+++ b/sf_quality/views/quality_check_view.xml
@@ -74,6 +74,7 @@
+
@@ -89,8 +90,15 @@
-
+
+ {
+ 'is_web_request': True,
+ 'search_default_progress': 1,
+ 'search_default_passed': 1,
+ 'search_default_failed': 1,
+ }
+
\ No newline at end of file
diff --git a/sf_sale/static/src/css/purchase_list.css b/sf_sale/static/src/css/purchase_list.css
index 2deacb9c..5e2aa86e 100644
--- a/sf_sale/static/src/css/purchase_list.css
+++ b/sf_sale/static/src/css/purchase_list.css
@@ -1,3 +1,9 @@
.purchase_order_list_name {
min-width: 62px !important;
+}
+
+.section_and_note_text span{
+ white-space: wrap!important;
+ overflow: auto!important;
+ text-overflow: unset!important;
}
\ No newline at end of file
diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml
index 1c96bf59..d408e807 100644
--- a/sf_sale/views/sale_order_view.xml
+++ b/sf_sale/views/sale_order_view.xml
@@ -102,7 +102,7 @@
+ string="模型文件" attrs="{'readonly': [('state', 'in', ['draft'])], 'isInList': True}"/>
@@ -112,6 +112,7 @@
{'no_create': True}
{'is_sale_order_line': True }
+ section_and_note_text
{'readonly': [('state', 'in', ['cancel','sale'])]}
@@ -228,6 +229,18 @@
+
+ sale.order.line.tree.sale.stock.qty.sf
+
+ sale.order
+
+
+
+
+
+
+
+
sale.order.quotation.tree.inherit.sf
sale.order
diff --git a/sf_stock/models/stock_picking.py b/sf_stock/models/stock_picking.py
index f8105097..7b73485b 100644
--- a/sf_stock/models/stock_picking.py
+++ b/sf_stock/models/stock_picking.py
@@ -18,7 +18,7 @@ class StockPicking(models.Model):
@api.depends('name')
def _compute_pro_purchase_count(self):
for sp in self:
- if sp:
+ if sp.name and sp.name != '/':
po_ids = self.env['purchase.order'].sudo().search([
('origin', 'like', sp.name), ('purchase_type', '=', 'standard')])
if po_ids:
@@ -52,7 +52,7 @@ class StockPicking(models.Model):
@api.depends('name')
def _compute_pro_out_purchase_count(self):
for sp in self:
- if sp:
+ if sp.name and sp.name != '/':
po_ids = self.env['purchase.order'].sudo().search([
('origin', 'like', sp.name), ('purchase_type', '=', 'outsourcing')])
if po_ids:
diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py
index fb80618a..582d7a59 100644
--- a/sf_warehouse/models/model.py
+++ b/sf_warehouse/models/model.py
@@ -935,6 +935,17 @@ class SfStockPicking(models.Model):
_inherit = 'stock.picking'
check_in = fields.Char(string='查询是否为入库单', compute='_check_is_in')
+ product_uom_qty_sp = fields.Float('需求数量', compute='_compute_product_uom_qty_sp', store=True)
+
+ @api.depends('move_ids_without_package', 'move_ids_without_package.product_uom_qty')
+ def _compute_product_uom_qty_sp(self):
+ for sp in self:
+ if sp.move_ids_without_package:
+ sp.product_uom_qty_sp = 0
+ for move_id in sp.move_ids_without_package:
+ sp.product_uom_qty_sp += move_id.product_uom_qty
+ else:
+ sp.product_uom_qty_sp = 0
def batch_stock_move(self):
"""
diff --git a/sf_warehouse/views/change_stock_move_views.xml b/sf_warehouse/views/change_stock_move_views.xml
index 9e1073c9..8cde3ca3 100644
--- a/sf_warehouse/views/change_stock_move_views.xml
+++ b/sf_warehouse/views/change_stock_move_views.xml
@@ -156,6 +156,9 @@
+
+
+
diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.css b/web_widget_model_viewer/static/src/js/3d_viewer.css
new file mode 100644
index 00000000..238f793d
--- /dev/null
+++ b/web_widget_model_viewer/static/src/js/3d_viewer.css
@@ -0,0 +1,3 @@
+.model-viewer-in-list {
+ width: 150px;
+}
\ No newline at end of file
diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.js b/web_widget_model_viewer/static/src/js/3d_viewer.js
index 4ed9dcc1..6e4b969c 100644
--- a/web_widget_model_viewer/static/src/js/3d_viewer.js
+++ b/web_widget_model_viewer/static/src/js/3d_viewer.js
@@ -63,11 +63,16 @@ StepViewer.supportedTypes = ["binary"];
StepViewer.props = {
...standardFieldProps,
url: {type: String, optional: true},
+ isInList: {type: Boolean, optional: true},
};
StepViewer.extractProps = ({attrs}) => {
+ const modifiedAttrs = JSON.parse(attrs.modifiers || '{}');
+
+
return {
url: attrs.options.url,
+ isInList: modifiedAttrs.isInList,
};
};
diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.xml b/web_widget_model_viewer/static/src/js/3d_viewer.xml
index 73f142c9..9053d184 100644
--- a/web_widget_model_viewer/static/src/js/3d_viewer.xml
+++ b/web_widget_model_viewer/static/src/js/3d_viewer.xml
@@ -5,6 +5,7 @@