diff --git a/jikimo_purchase_request/models/purchase_request.py b/jikimo_purchase_request/models/purchase_request.py
index 4b5f86ba..9e610612 100644
--- a/jikimo_purchase_request/models/purchase_request.py
+++ b/jikimo_purchase_request/models/purchase_request.py
@@ -1,4 +1,5 @@
import re
+import ast
from odoo import models, fields, api
@@ -20,6 +21,13 @@ class PurchaseRequest(models.Model):
if pr.state != 'draft' and pr.rule_new_add:
pr.rule_new_add = False
+ def action_view_purchase_order(self):
+ action = super(PurchaseRequest, self).action_view_purchase_order()
+ origin_context = ast.literal_eval(action['context'])
+ if 'search_default_draft' in origin_context:
+ origin_context.pop('search_default_draft')
+ action['context'] = origin_context
+ return action
class PurchaseRequestLine(models.Model):
_inherit = 'purchase.request.line'
diff --git a/jikimo_purchase_request_tier_validation/__init__.py b/jikimo_purchase_request_tier_validation/__init__.py
new file mode 100644
index 00000000..cde864ba
--- /dev/null
+++ b/jikimo_purchase_request_tier_validation/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
diff --git a/jikimo_purchase_request_tier_validation/__manifest__.py b/jikimo_purchase_request_tier_validation/__manifest__.py
new file mode 100644
index 00000000..403297ab
--- /dev/null
+++ b/jikimo_purchase_request_tier_validation/__manifest__.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': "机企猫 采购审批流程",
+
+ 'summary': """
+ Short (1 phrase/line) summary of the module's purpose, used as
+ subtitle on modules listing or apps.openerp.com""",
+
+ 'description': """
+ Long description of module's purpose
+ """,
+
+ 'author': "My Company",
+ 'website': "https://www.yourcompany.com",
+
+ # Categories can be used to filter modules in modules listing
+ # Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml
+ # for the full list
+ 'category': 'Uncategorized',
+ 'version': '0.1',
+
+ # any module necessary for this one to work correctly
+ 'depends': ['purchase_request_tier_validation'],
+
+ # always loaded
+ 'data': [
+ ],
+}
diff --git a/jikimo_purchase_request_tier_validation/models/__init__.py b/jikimo_purchase_request_tier_validation/models/__init__.py
new file mode 100644
index 00000000..5305644d
--- /dev/null
+++ b/jikimo_purchase_request_tier_validation/models/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import models
\ No newline at end of file
diff --git a/jikimo_purchase_request_tier_validation/models/models.py b/jikimo_purchase_request_tier_validation/models/models.py
new file mode 100644
index 00000000..0070a4c7
--- /dev/null
+++ b/jikimo_purchase_request_tier_validation/models/models.py
@@ -0,0 +1,24 @@
+from odoo import models, fields, api, _
+from odoo.exceptions import ValidationError
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class PurchaseRequest(models.Model):
+ _inherit = 'purchase.request'
+
+
+ def _validate_tier(self, tiers=False):
+ res = super(PurchaseRequest, self)._validate_tier(tiers)
+
+ # 检查是否所有审批都已通过
+ all_approved = all(
+ tier_review.status == 'approved'
+ for tier_review in self.review_ids
+ )
+
+ if self.review_ids and all_approved: # 确保有审批记录
+ self.state = 'approved'
+
+ return res
diff --git a/jikimo_purchase_tier_validation/__manifest__.py b/jikimo_purchase_tier_validation/__manifest__.py
index 4d676d8f..ed0cecb7 100644
--- a/jikimo_purchase_tier_validation/__manifest__.py
+++ b/jikimo_purchase_tier_validation/__manifest__.py
@@ -1,14 +1,12 @@
# -*- coding: utf-8 -*-
{
- 'name': "机企猫 采购审批流程",
+ 'name': "机企猫 采购申请审批流程",
'summary': """
- Short (1 phrase/line) summary of the module's purpose, used as
- subtitle on modules listing or apps.openerp.com""",
+ 采购申请审批流程""",
'description': """
- Long description of module's purpose
- """,
+ 采购申请审批流程""",
'author': "My Company",
'website': "https://www.yourcompany.com",
diff --git a/jikimo_sale_multiple_supply_methods/models/mrp_bom.py b/jikimo_sale_multiple_supply_methods/models/mrp_bom.py
index 2528d0a4..aa9d6c60 100644
--- a/jikimo_sale_multiple_supply_methods/models/mrp_bom.py
+++ b/jikimo_sale_multiple_supply_methods/models/mrp_bom.py
@@ -9,5 +9,6 @@ class MrpBom(models.Model):
# 成品的供应商从模板中获取
if product_type == 'product':
- bom_id.subcontractor_id = product.product_tmpl_id.seller_ids.partner_id.id
+ if product.product_tmpl_id.seller_ids:
+ bom_id.subcontractor_id = product.product_tmpl_id.seller_ids[-1].partner_id.id
return bom_id
diff --git a/sf_base/models/base.py b/sf_base/models/base.py
index d7a71e1e..54a1fe1f 100644
--- a/sf_base/models/base.py
+++ b/sf_base/models/base.py
@@ -421,3 +421,4 @@ class EmbryoRedundancy(models.Model):
width = fields.Float('宽度(mm)', required=True)
height = fields.Float('高度(mm)', required=True)
active = fields.Boolean('有效', default=True)
+ remark = fields.Char('描述')
diff --git a/sf_base/models/fixture.py b/sf_base/models/fixture.py
index f64fe473..264878e9 100644
--- a/sf_base/models/fixture.py
+++ b/sf_base/models/fixture.py
@@ -32,6 +32,7 @@ class FixtureModel(models.Model):
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
model_file = fields.Binary(string="图片")
+ glb_url = fields.Char(string="图片")
status = fields.Boolean('状态')
active = fields.Boolean('有效', default=False)
diff --git a/sf_base/views/base_view.xml b/sf_base/views/base_view.xml
index bd6f103b..ccac31c9 100644
--- a/sf_base/views/base_view.xml
+++ b/sf_base/views/base_view.xml
@@ -645,6 +645,7 @@
+
diff --git a/sf_base/views/fixture_view.xml b/sf_base/views/fixture_view.xml
index 07dadd33..1149875d 100644
--- a/sf_base/views/fixture_view.xml
+++ b/sf_base/views/fixture_view.xml
@@ -158,6 +158,8 @@
+
diff --git a/sf_bf_connect/controllers/controllers.py b/sf_bf_connect/controllers/controllers.py
index d79e7137..7f46765d 100644
--- a/sf_bf_connect/controllers/controllers.py
+++ b/sf_bf_connect/controllers/controllers.py
@@ -29,7 +29,7 @@ class Sf_Bf_Connect(http.Controller):
bfm_process_order_list = json.loads(kw['bfm_process_order_list'])
order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create(
company_id, kw['delivery_name'], kw['delivery_telephone'], kw['delivery_address'],
- kw['delivery_end_date'], kw['payments_way'], kw['pay_way'])
+ kw['delivery_end_date'], kw['payments_way'], kw['pay_way'], model_display_version=kw.get('model_display_version'))
i = 1
# 给sale_order的default_code字段赋值
aa = request.env['sale.order'].sudo().search([('name', '=', order_id.name)])
diff --git a/sf_dlm/models/product_template.py b/sf_dlm/models/product_template.py
index 1e37be2b..f9825c88 100644
--- a/sf_dlm/models/product_template.py
+++ b/sf_dlm/models/product_template.py
@@ -44,7 +44,7 @@ class ResProductTemplate(models.Model):
else:
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
- # model_file = fields.Binary('模型文件')
+ model_file = fields.Binary('模型文件')
# 胚料的库存路线设置
# def _get_routes(self, route_type):
diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml
index 1f3dc50b..01c2f51b 100644
--- a/sf_dlm_management/views/product_template_management_view.xml
+++ b/sf_dlm_management/views/product_template_management_view.xml
@@ -16,15 +16,21 @@
+
-
+
-
+
+
+
+
+
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 64c1c7a8..c1f165fd 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -251,7 +251,8 @@
-
+
+
-
+
-
+
+
+
+
+
diff --git a/sf_manufacturing/views/stock_picking_view.xml b/sf_manufacturing/views/stock_picking_view.xml
index 3cb877a9..f5b1941b 100644
--- a/sf_manufacturing/views/stock_picking_view.xml
+++ b/sf_manufacturing/views/stock_picking_view.xml
@@ -68,14 +68,8 @@
context="{'group_by': 'retrospect_ref'}"/>
-
-
+
+
@@ -97,7 +91,8 @@
True
-
diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py
index cd0d8405..652ec3eb 100644
--- a/sf_mrs_connect/models/sync_common.py
+++ b/sf_mrs_connect/models/sync_common.py
@@ -3214,6 +3214,7 @@ class EmbryoRedundancySync(models.Model):
embryo_redundancy.width = item['width']
embryo_redundancy.height = item['height']
embryo_redundancy.active = item['active']
+ embryo_redundancy.remark = item['remark']
else:
self.env['sf.embryo.redundancy'].sudo().create({
"name": item['name'],
@@ -3222,4 +3223,5 @@ class EmbryoRedundancySync(models.Model):
"width": item['width'],
"height": item['height'],
"active": item['active'],
+ "remark": item['remark'],
})
\ No newline at end of file
diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py
index b3932481..9d762e4e 100644
--- a/sf_quality/models/quality.py
+++ b/sf_quality/models/quality.py
@@ -26,6 +26,7 @@ class QualityCheck(models.Model):
string='生产线')
equipment_id = fields.Many2one(related='workorder_id.equipment_id', string='加工设备')
model_file = fields.Binary(related='workorder_id.glb_file', string='加工模型')
+ glb_url = fields.Char(related='workorder_id.glb_url', string='加工模型')
detection_report = fields.Binary(related='workorder_id.detection_report', readonly=True, string='检测报告')
test_results = fields.Selection([("合格", "合格"), ("返工", "返工")], string="检测结果",
diff --git a/sf_quality/models/quality_cnc_test.py b/sf_quality/models/quality_cnc_test.py
index 9810b0e0..1e89ef92 100644
--- a/sf_quality/models/quality_cnc_test.py
+++ b/sf_quality/models/quality_cnc_test.py
@@ -12,6 +12,7 @@ class SfQualityCncTest(models.Model):
production_id = fields.Many2one(related='workorder_id.production_id', string='制造订单')
product_id = fields.Many2one(related='workorder_id.product_id', string='产品')
model_file = fields.Binary(related='workorder_id.glb_file', string='加工模型')
+ glb_url = fields.Char(related='workorder_id.glb_url', string='加工模型')
processing_panel = fields.Char(related='workorder_id.processing_panel', string='加工面')
equipment_id = fields.Many2one(related='workorder_id.equipment_id', string='加工设备')
production_line_id = fields.Many2one(related='workorder_id.production_line_id',
diff --git a/sf_quality/views/quality_check_view.xml b/sf_quality/views/quality_check_view.xml
index c584eb8d..cadedc8e 100644
--- a/sf_quality/views/quality_check_view.xml
+++ b/sf_quality/views/quality_check_view.xml
@@ -13,6 +13,8 @@
+
diff --git a/sf_quality/views/quality_cnc_test_view.xml b/sf_quality/views/quality_cnc_test_view.xml
index d2d37686..188ff7be 100644
--- a/sf_quality/views/quality_cnc_test_view.xml
+++ b/sf_quality/views/quality_cnc_test_view.xml
@@ -87,7 +87,8 @@
-
+
+
diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py
index 081807a4..d164d8cc 100644
--- a/sf_sale/models/quick_easy_order.py
+++ b/sf_sale/models/quick_easy_order.py
@@ -314,7 +314,7 @@ class QuickEasyOrder(models.Model):
company_id = self.env.ref('base.main_company').sudo()
# user_id = request.env.ref('base.user_admin').sudo()
order_id = self.env['sale.order'].sale_order_create(company_id, 'XXXXX', 'XXXXX', 'XXXXX',
- str(datetime.now()), '现结', '支付宝')
+ str(datetime.now()), '现结', '支付宝', 'v2')
i = 1
# 给sale_order的default_code字段赋值
aa = self.env['sale.order'].sudo().search([('name', '=', order_id.name)])
diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py
index 87848e3a..cbf0f8f1 100644
--- a/sf_sale/models/quick_easy_order_old.py
+++ b/sf_sale/models/quick_easy_order_old.py
@@ -237,7 +237,7 @@ class QuickEasyOrder(models.Model):
company_id = self.env.ref('base.main_company').sudo()
# user_id = request.env.ref('base.user_admin').sudo()
order_id = self.env['sale.order'].sale_order_create(company_id, 'XXXXX', 'XXXXX', 'XXXXX',
- str(datetime.now()), '现结', '支付宝')
+ str(datetime.now()), '现结', '支付宝', 'v2')
i = 1
# 给sale_order的default_code字段赋值
aa = self.env['sale.order'].sudo().search([('name', '=', order_id.name)])
diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py
index 51e7ca3c..09dc24dd 100644
--- a/sf_sale/models/sale_order.py
+++ b/sf_sale/models/sale_order.py
@@ -61,9 +61,12 @@ class ReSaleOrder(models.Model):
order_code = fields.Char('平台订单号', readonly=True)
+ model_display_version = fields.Char('模型展示版本', default="v1")
+
# 业务平台分配工厂后在智能工厂先创建销售订单
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
- deadline_of_delivery, payments_way, pay_way, order_number, state='sale'):
+ deadline_of_delivery, payments_way, pay_way, order_number, state='sale',
+ model_display_version='v1'):
now_time = datetime.datetime.now()
partner = self.get_customer()
data = {
@@ -80,6 +83,7 @@ class ReSaleOrder(models.Model):
'payments_way': payments_way,
'pay_way': pay_way,
'order_code': order_number,
+ 'model_display_version': model_display_version,
}
if deadline_of_delivery:
# deadline_of_delivery字段存在为false字符串情况
@@ -138,11 +142,14 @@ class ReSaleOrder(models.Model):
product.materials_id.name),
'price_unit': product.list_price,
'product_uom_qty': item['number'],
- 'model_glb_file': base64.b64decode(item['model_file']) if item['model_file'] else None,
+ # 'model_glb_file': base64.b64decode(item['model_file']) if item['model_file'] else None,
+ 'model_url': item['model_url'],
+ 'glb_url': item['glb_url'],
'remark': item.get('remark'),
'embryo_redundancy_id': item.get('embryo_redundancy_id'),
'is_incoming_material': True if item.get('embryo_redundancy_id') else False,
- 'manual_quotation': item.get('manual_quotation')
+ 'manual_quotation': item.get('manual_quotation'),
+ 'model_id': item['model_id'],
}
return self.env['sale.order.line'].with_context(skip_procurement=True).create(vals)
@@ -245,6 +252,7 @@ class ResaleOrderLine(models.Model):
# part_number = fields.Char('零件图号', related='product_id.part_number', readonly=True)
part_name = fields.Char('零件名称', related='product_id.part_name', readonly=True)
model_glb_file = fields.Binary('模型的glb文件', compute='_compute_model_glb_file', store=True)
+ glb_url = fields.Char('glb文件地址', compute='_compute_model_glb_file', store=True)
# product_template_id = fields.Many2one(
# string="产品",
# comodel_name='product.template',
@@ -261,6 +269,8 @@ class ResaleOrderLine(models.Model):
is_incoming_material = fields.Boolean('客供料', compute='_compute_is_incoming_material', store=True)
embryo_redundancy_id = fields.Many2one('sf.embryo.redundancy', '坯料冗余')
manual_quotation = fields.Boolean('人工编程', default=False)
+ model_url = fields.Char('模型文件地址')
+ model_id = fields.Char('模型id')
@api.depends('embryo_redundancy_id')
def _compute_is_incoming_material(self):
@@ -273,6 +283,8 @@ class ResaleOrderLine(models.Model):
if line.product_template_id:
if not line.model_glb_file:
line.model_glb_file = line.product_id.product_tmpl_id.model_file
+ if not line.glb_url:
+ line.glb_url = line.product_id.product_tmpl_id.glb_url
if not line.price_unit:
line.price_unit = line.product_id.product_tmpl_id.list_price
diff --git a/sf_sale/views/quick_easy_order_view.xml b/sf_sale/views/quick_easy_order_view.xml
index 89792a49..d8af409a 100644
--- a/sf_sale/views/quick_easy_order_view.xml
+++ b/sf_sale/views/quick_easy_order_view.xml
@@ -50,9 +50,13 @@
-
+
+
+
+
-
+ string="模型文件" readonly="1" attrs="{'column_invisible': [('parent.model_display_version', '!=', 'v1')]}"/>
+
+
diff --git a/sf_stock/models/stock_picking.py b/sf_stock/models/stock_picking.py
index 7b73485b..4623c4ed 100644
--- a/sf_stock/models/stock_picking.py
+++ b/sf_stock/models/stock_picking.py
@@ -94,7 +94,7 @@ class StockPicking(models.Model):
if send_move_ids:
for item in send_move_ids:
val = {
- 'name': item.product_id.upload_model_file.display_name,
+ 'name': item.product_id.upload_model_file.display_name if item.product_id.upload_model_file else item.product_id.model_name,
'quantity_done': item.quantity_done,
'date': date_utils.json_default(item.date) if item.date else None,
'description_picking': item.description_picking,
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 6e4b969c..de3d581b 100644
--- a/web_widget_model_viewer/static/src/js/3d_viewer.js
+++ b/web_widget_model_viewer/static/src/js/3d_viewer.js
@@ -27,7 +27,10 @@ export class StepViewer extends Component {
formatUrl() {
var url = '';
if (this.props.value) {
- if (this.props.value.slice(-1) == 'b' && !isNaN(this.props.value.split(' ')[0])) {
+ if (this.props.value.startsWith('http')) {
+ // 从url读取文件内容
+ url = this.props.value;
+ } else if (this.props.value.slice(-1) == 'b' && !isNaN(this.props.value.split(' ')[0])) {
var url_props = {
base_url: session['web.base.url'],
model: this.props.record.resModel,
@@ -37,21 +40,19 @@ export class StepViewer extends Component {
url = url_props['base_url'].replace('http://', 'https://') + '/web/content/' + url_props['model'] + '/' + url_props['id'] + '/' + url_props['field'] + '?download=true';
// url = 'http://localhost:8069'+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true'
// console.log('url111111', url)
- return url;
+
} else {
url = "data:model/gltf-binary;base64," + this.props.value;
// console.log('url2', url)
- return url;
+
// localStorage.setItem('url',url)
// let new_url = localStorage.getItem(('url'))
// var oViewer = document.getElementsByTagName('model-viewer')[0];
// return new_url
// url = "web_widget_model_viewer/static/src/images/not_model.png";
}
- } else {
- // var oImg = document.getElementsByClassName('test')[0]
- // console.log(oImg)
- }
+ }
+ return url;
}
}