Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop
# Conflicts: # sf_dlm/data/product_data.xml # sf_dlm/models/product_template.py # sf_manufacturing/models/mrp_workorder.py # sf_mrs_connect/controllers/controllers.py
This commit is contained in:
@@ -196,8 +196,7 @@ class MachineTool(models.Model):
|
|||||||
kw = json.dumps(machine_tool_list, ensure_ascii=False)
|
kw = json.dumps(machine_tool_list, ensure_ascii=False)
|
||||||
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||||
ret = r.json()
|
ret = r.json()
|
||||||
self.code = ret['code']
|
self.code = ret['message']
|
||||||
print(r)
|
|
||||||
if r == 200:
|
if r == 200:
|
||||||
return "机床注册成功"
|
return "机床注册成功"
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ class MrsMaterialModel(models.Model):
|
|||||||
density = fields.Float("密度(kg/m³)")
|
density = fields.Float("密度(kg/m³)")
|
||||||
materials_id = fields.Many2one('sf.production.materials', "材料名")
|
materials_id = fields.Many2one('sf.production.materials', "材料名")
|
||||||
remark = fields.Text("备注")
|
remark = fields.Text("备注")
|
||||||
|
gain_way = fields.Selection(
|
||||||
|
[("自加工", "自加工"), ("外协", "外协"), ("采购", "采购")],
|
||||||
|
default="", string="获取方式")
|
||||||
|
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
|
||||||
@@ -63,7 +67,6 @@ class MrsProcessingOrder(models.Model):
|
|||||||
_name = 'sf.processing.order'
|
_name = 'sf.processing.order'
|
||||||
_description = '工序'
|
_description = '工序'
|
||||||
sequence = fields.Integer('Sequence')
|
sequence = fields.Integer('Sequence')
|
||||||
|
|
||||||
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
||||||
index=True, string='加工工艺')
|
index=True, string='加工工艺')
|
||||||
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||||
@@ -79,3 +82,17 @@ class Tray(models.Model):
|
|||||||
[("空闲", "空闲"), ("占用", "占用"), ("报损", "报损")],
|
[("空闲", "空闲"), ("占用", "占用"), ("报损", "报损")],
|
||||||
default="空闲", string="状态")
|
default="空闲", string="状态")
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
|
||||||
|
class SupplierSort(models.Model):
|
||||||
|
_name = 'sf.supplier.sort'
|
||||||
|
_description = '供应商排序'
|
||||||
|
|
||||||
|
sequence = fields.Integer('Sequence')
|
||||||
|
partner_id = fields.Many2one('res.partner', domain="[('is_company', '=', True),('supplier_rank', '!=', 0)]")
|
||||||
|
materials_model_id = fields.Many2one('sf.materials.model')
|
||||||
|
|
||||||
|
_sql_constraints = [
|
||||||
|
('supplier_sort_uniq', 'unique (partner_id,materials_model_id)', '排序不能重复!')
|
||||||
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ access_sf_production_materials,sf_production_materials,model_sf_production_mater
|
|||||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,1
|
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,1
|
||||||
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,1
|
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,1
|
||||||
access_sf_tray,sf_tray,model_sf_tray,base.group_user,1,1,1,1
|
access_sf_tray,sf_tray,model_sf_tray,base.group_user,1,1,1,1
|
||||||
|
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
|
@@ -6,23 +6,17 @@
|
|||||||
<field name="model">sf.processing.technology</field>
|
<field name="model">sf.processing.technology</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="加工工艺">
|
<form string="加工工艺">
|
||||||
|
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="process_encode" readonly="1"/>
|
<field name="process_encode" readonly="1"/>
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="name" required="1"/>
|
<field name="name" required="1"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="remark"/>
|
<field name="remark"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -30,10 +24,8 @@
|
|||||||
<field name="model">sf.processing.technology</field>
|
<field name="model">sf.processing.technology</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="加工工艺">
|
<tree string="加工工艺">
|
||||||
|
|
||||||
<field name="process_encode"/>
|
<field name="process_encode"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -52,13 +44,13 @@
|
|||||||
<field name="model">sf.production.process</field>
|
<field name="model">sf.production.process</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="表面工艺">
|
<tree string="表面工艺">
|
||||||
|
|
||||||
<field name="process_encode" readonly="1"/>
|
<field name="process_encode" readonly="1"/>
|
||||||
<field name="name" readonly="1"/>
|
<field name="name" readonly="1"/>
|
||||||
<field name="remark"/>
|
<field name="remark"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="sf_production_process_form">
|
<record model="ir.ui.view" id="sf_production_process_form">
|
||||||
<field name="model">sf.production.process</field>
|
<field name="model">sf.production.process</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
@@ -77,9 +69,7 @@
|
|||||||
</field>
|
</field>
|
||||||
</tree>
|
</tree>
|
||||||
<form>
|
<form>
|
||||||
|
|
||||||
<field name="processing_technology_ids" widget="many2many">
|
<field name="processing_technology_ids" widget="many2many">
|
||||||
|
|
||||||
</field>
|
</field>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
@@ -110,24 +100,28 @@
|
|||||||
<group>
|
<group>
|
||||||
<field name="materials_no" readonly="1"/>
|
<field name="materials_no" readonly="1"/>
|
||||||
<field name="name" required="1"/>
|
<field name="name" required="1"/>
|
||||||
|
<field name="gain_way" required="1"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
|
<field name="density" required="1"/>
|
||||||
<field name="need_h" default="false"/>
|
<field name="need_h" default="false"/>
|
||||||
<field name="mf_materia_post" attrs="{'invisible':[('need_h','=',False)]} "/>
|
<field name="mf_materia_post" attrs="{'invisible':[('need_h','=',False)]} "/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<group>
|
<group>
|
||||||
<field name='materials_id' default="default" invisible="1"/>
|
<field name='materials_id' default="default" invisible="1"/>
|
||||||
<field name="density" required="1"/>
|
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name='supplier_ids'>
|
||||||
|
<tree editable='bottom'>
|
||||||
|
<field name="sequence" widget="handle" string="序号"/>
|
||||||
|
<field name="partner_id" string="名称"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="remark"/>
|
<field name="remark"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
'website': 'https://www.sf.cs.jikimo.com',
|
'website': 'https://www.sf.cs.jikimo.com',
|
||||||
'depends': ['sf_base', 'sf_sale', 'sf_dlm'],
|
'depends': ['sf_base', 'sf_sale', 'sf_dlm'],
|
||||||
'data': [
|
'data': [
|
||||||
|
'views/res_partner_view.xml'
|
||||||
],
|
],
|
||||||
'demo': [
|
'demo': [
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ class Sf_Bf_Connect(http.Controller):
|
|||||||
ret = json.loads(datas)
|
ret = json.loads(datas)
|
||||||
ret = json.loads(ret['result'])
|
ret = json.loads(ret['result'])
|
||||||
product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
|
product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
|
||||||
|
self_machining_id = request.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
|
||||||
|
outsource_id = request.env.ref('sf_dlm.product_embryo_sf_outsource').sudo()
|
||||||
|
purchase_id = request.env.ref('sf_dlm.product_embryo_sf_purchase').sudo()
|
||||||
company_id = request.env.ref('base.main_company').sudo()
|
company_id = request.env.ref('base.main_company').sudo()
|
||||||
order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create(
|
order_id = request.env['sale.order'].with_user(request.env.ref("base.user_admin")).sale_order_create(
|
||||||
company_id, ret['delivery_name'], ret['delivery_telephone'], ret['delivery_address'],
|
company_id, ret['delivery_name'], ret['delivery_telephone'], ret['delivery_address'],
|
||||||
@@ -32,8 +35,29 @@ class Sf_Bf_Connect(http.Controller):
|
|||||||
product = request.env['product.template'].sudo().product_create(product_id, item, order_id,
|
product = request.env['product.template'].sudo().product_create(product_id, item, order_id,
|
||||||
ret['order_number'], i)
|
ret['order_number'], i)
|
||||||
order_id.with_user(request.env.ref("base.user_admin")).sale_order_create_line(product, item)
|
order_id.with_user(request.env.ref("base.user_admin")).sale_order_create_line(product, item)
|
||||||
bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(product)
|
bom_data = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).get_bom(product)
|
||||||
|
if bom_data:
|
||||||
|
bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(product,
|
||||||
|
'normal')
|
||||||
bom.with_user(request.env.ref("base.user_admin")).bom_create_Line(product)
|
bom.with_user(request.env.ref("base.user_admin")).bom_create_Line(product)
|
||||||
|
else:
|
||||||
|
if product.materials_id.gain_way == '自加工':
|
||||||
|
self_machining = request.env['product.template'].sudo().no_bom_product_create(self_machining_id,
|
||||||
|
item,
|
||||||
|
order_i)
|
||||||
|
bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(
|
||||||
|
self_machining, 'normal')
|
||||||
|
bom.with_user(request.env.ref("base.user_admin")).bom_create_Line(self_machining)
|
||||||
|
|
||||||
|
elif product.materials_id.gain_way == '外协':
|
||||||
|
outsource = request.env['product.template'].sudo().no_bom_product_create(outsource_id, item,
|
||||||
|
order_id)
|
||||||
|
bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(outsource)
|
||||||
|
bom.with_user(request.env.ref("base.user_admin")).bom_create_Line(outsource, 'subcontract')
|
||||||
|
elif product.materials_id.gain_way == '采购':
|
||||||
|
purchase = request.env['product.template'].sudo().no_bom_product_create(purchase_id, item,
|
||||||
|
order_id)
|
||||||
|
|
||||||
i += 1
|
i += 1
|
||||||
res['factory_order_no'] = order_id.name
|
res['factory_order_no'] = order_id.name
|
||||||
return json.JSONEncoder().encode(res)
|
return json.JSONEncoder().encode(res)
|
||||||
|
|||||||
@@ -26,3 +26,4 @@ class ResPartner(models.Model):
|
|||||||
|
|
||||||
sf_token = fields.Char(u'Token', default=get_token)
|
sf_token = fields.Char(u'Token', default=get_token)
|
||||||
sf_secret_key = fields.Char(u'密钥', default=get_secret)
|
sf_secret_key = fields.Char(u'密钥', default=get_secret)
|
||||||
|
|
||||||
|
|||||||
20
sf_bf_connect/views/res_partner_view.xml
Normal file
20
sf_bf_connect/views/res_partner_view.xml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="view_partner_form_sf" model="ir.ui.view">
|
||||||
|
<field name="name">view_partner_form</field>
|
||||||
|
<field name="model">res.partner</field>
|
||||||
|
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[last()]" position="before">
|
||||||
|
<page string="token和密钥">
|
||||||
|
<group>
|
||||||
|
<field name="sf_token"/>
|
||||||
|
<field name="sf_secret_key"/>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@@ -12,5 +12,48 @@
|
|||||||
<field name="company_id" ref="base.main_company"/>
|
<field name="company_id" ref="base.main_company"/>
|
||||||
<field name="active">false</field>
|
<field name="active">false</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="product_category_embryo_sf" model="product.category">
|
||||||
|
<field name="name">胚料</field>
|
||||||
|
<field name="type">胚料</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_embryo_sf_self_machining" model="product.product">
|
||||||
|
<field name="name">自加工</field>
|
||||||
|
<!-- <field name="categ_id" ref="product_category_embryo_sf"/>-->
|
||||||
|
<field name="invoice_policy">delivery</field>
|
||||||
|
<field name="detailed_type">product</field>
|
||||||
|
<field name="purchase_ok">false</field>
|
||||||
|
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active">false</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_embryo_sf_outsource" model="product.product">
|
||||||
|
<field name="name">外协</field>
|
||||||
|
<!-- <field name="categ_id" ref="product_category_embryo_sf"/>-->
|
||||||
|
<field name="invoice_policy">delivery</field>
|
||||||
|
<field name="detailed_type">product</field>
|
||||||
|
<field name="purchase_ok">false</field>
|
||||||
|
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active">false</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_embryo_sf_purchase" model="product.product">
|
||||||
|
<field name="name">采购</field>
|
||||||
|
<!-- <field name="categ_id" ref="product_category_embryo_sf"/>-->
|
||||||
|
<field name="invoice_policy">delivery</field>
|
||||||
|
<field name="detailed_type">product</field>
|
||||||
|
<field name="purchase_ok">false</field>
|
||||||
|
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="active">false</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -35,6 +35,23 @@ class ResProductTemplate(models.Model):
|
|||||||
# def _compute_volume(self):
|
# def _compute_volume(self):
|
||||||
# self.volume = self.long * self.width * self.height
|
# self.volume = self.long * self.width * self.height
|
||||||
|
|
||||||
|
|
||||||
|
single_manufacturing = fields.Boolean(string="单个制造")
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_route(self):
|
||||||
|
route_manufacture = self.env.ref('stock.warehouse0', raise_if_not_found=False).manufacture_pull_id.route_id.id
|
||||||
|
route_mto = self.env.ref('stock.warehouse0', raise_if_not_found=False).mto_pull_id.route_id.id
|
||||||
|
if route_manufacture and route_mto:
|
||||||
|
return [route_manufacture, route_mto]
|
||||||
|
return []
|
||||||
|
|
||||||
|
route_ids = fields.Many2many(default=lambda self: self._get_route())
|
||||||
|
|
||||||
|
# @api.depends('long', 'width', 'height')
|
||||||
|
# def _compute_volume(self):
|
||||||
|
# self.volume = self.long * self.width * self.height
|
||||||
|
|
||||||
# @api.depends('model_long', 'model_width', 'model_height')
|
# @api.depends('model_long', 'model_width', 'model_height')
|
||||||
# def _compute_model_volume(self):
|
# def _compute_model_volume(self):
|
||||||
# self.model_volume = self.model_long * self.model_width * self.model_height
|
# self.model_volume = self.model_long * self.model_width * self.model_height
|
||||||
@@ -54,6 +71,12 @@ class ResProductTemplate(models.Model):
|
|||||||
'height': item['height'],
|
'height': item['height'],
|
||||||
'volume': item['long'] * item['width'] * item['height'],
|
'volume': item['long'] * item['width'] * item['height'],
|
||||||
'model_price': item['price'],
|
'model_price': item['price'],
|
||||||
|
'length': item['model_long'],
|
||||||
|
'width': item['model_width'],
|
||||||
|
'height': item['model_height'],
|
||||||
|
'volume': item['model_long'] * item['model_width'] * item['model_height'],
|
||||||
|
'model_price': item['price'],
|
||||||
|
'tracking': 'serial',
|
||||||
'single_manufacturing': True,
|
'single_manufacturing': True,
|
||||||
'list_price': item['price'],
|
'list_price': item['price'],
|
||||||
'materials_id': self.env['sf.production.materials'].search(
|
'materials_id': self.env['sf.production.materials'].search(
|
||||||
@@ -65,8 +88,44 @@ class ResProductTemplate(models.Model):
|
|||||||
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
|
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
|
||||||
# [('process_encode', '=', item['process_parameters_code'])]).id,
|
# [('process_encode', '=', item['process_parameters_code'])]).id,
|
||||||
'model_remark': item['remark'],
|
'model_remark': item['remark'],
|
||||||
'default_code': '%s-%s' % (order_number, i),
|
# 'default_code': '%s-%s' % (order_number, i),
|
||||||
'barcode': item['barcode'],
|
# 'barcode': item['barcode'],
|
||||||
|
'active': True
|
||||||
|
}
|
||||||
|
logging.info('product_create1:%s' % item)
|
||||||
|
copy_product_id.sudo().write(vals)
|
||||||
|
return copy_product_id
|
||||||
|
|
||||||
|
def no_bom_product_create(self, product_id, item, order_id):
|
||||||
|
copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
|
||||||
|
copy_product_id.product_tmpl_id.active = True
|
||||||
|
logging.info('no_bom_product_create:%s' % item)
|
||||||
|
materials_id = self.env['sf.production.materials'].search(
|
||||||
|
[('materials_no', '=', item['texture_code'])]).id
|
||||||
|
materials_type_id = self.env['sf.materials.model'].search(
|
||||||
|
[('materials_no', '=', item['texture_type_code'])]).id
|
||||||
|
vals = {
|
||||||
|
'name': '%s %s %s %s * %s * %s' % (
|
||||||
|
order_id.name, materials_id.name, materials_type_id.name, item['model_long'], item['model_width'],
|
||||||
|
item['model_height']),
|
||||||
|
'model_long': item['model_long'],
|
||||||
|
'model_width': item['model_width'],
|
||||||
|
'model_height': item['model_height'],
|
||||||
|
'model_volume': item['model_long'] * item['model_width'] * item['model_height'],
|
||||||
|
'length': item['model_long'],
|
||||||
|
'width': item['model_width'],
|
||||||
|
'height': item['model_height'],
|
||||||
|
'volume': item['model_long'] * item['model_width'] * item['model_height'],
|
||||||
|
'model_price': item['price'],
|
||||||
|
'tracking': 'serial',
|
||||||
|
'single_manufacturing': True,
|
||||||
|
'list_price': item['price'],
|
||||||
|
'materials_id': materials_id.id,
|
||||||
|
'materials_type_id': materials_type_id.id,
|
||||||
|
# 'model_surface_process_id': self.env['sf.production.process'].search(
|
||||||
|
# [('process_encode', '=', item['surface_process_code'])]).id,
|
||||||
|
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
|
||||||
|
# [('process_encode', '=', item['process_parameters_code'])]).id,
|
||||||
'active': True
|
'active': True
|
||||||
}
|
}
|
||||||
logging.info('product_create1:%s' % item)
|
logging.info('product_create1:%s' % item)
|
||||||
@@ -99,10 +158,10 @@ class ResMrpBom(models.Model):
|
|||||||
_inherit = 'mrp.bom'
|
_inherit = 'mrp.bom'
|
||||||
|
|
||||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
|
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
|
||||||
def bom_create(self, product):
|
def bom_create(self, product, bom_type):
|
||||||
bom_id = self.env['mrp.bom'].create({
|
bom_id = self.env['mrp.bom'].create({
|
||||||
'product_tmpl_id': product.product_tmpl_id.id,
|
'product_tmpl_id': product.product_tmpl_id.id,
|
||||||
'type': 'normal',
|
'type': bom_type,
|
||||||
'product_qty': 1,
|
'product_qty': 1,
|
||||||
'product_uom_id': 1
|
'product_uom_id': 1
|
||||||
})
|
})
|
||||||
@@ -117,6 +176,24 @@ class ResMrpBom(models.Model):
|
|||||||
logging.info('bom_create_Line:%s' % product)
|
logging.info('bom_create_Line:%s' % product)
|
||||||
embryo = self.env['product.product'].search(
|
embryo = self.env['product.product'].search(
|
||||||
[('categ_id.is_embryo', '=', True), ('materials_type_id', '=', product.materials_type_id.id),
|
[('categ_id.is_embryo', '=', True), ('materials_type_id', '=', product.materials_type_id.id),
|
||||||
|
# 创建新的胚料,根据胚料材料型号的获取方式(
|
||||||
|
# 自加工,外协,采购) 的配置, 选择不同的库存路线,一种材料型号配置一个路线相关的配置:
|
||||||
|
# 材料型号配置不同的获取方式: (自加工, 外协, 采购);
|
||||||
|
# 原材料重量KG(公斤)= 胚料的体积(立方米m³) * 材料密度 * 1000
|
||||||
|
def bom_create_Line(self, embryo, materials):
|
||||||
|
bom_line = self.get_raw_bom(embryo, materials)
|
||||||
|
vals = {
|
||||||
|
'bom_id': self.id,
|
||||||
|
'product_id': bom_line.id,
|
||||||
|
'product_tmpl_id': bom_line.product_tmpl_id.id,
|
||||||
|
'product_qty': bom_line.volume * bom_line.materials_type_id.density * 1000,
|
||||||
|
'product_uom_id': bom_line.uom_id.id
|
||||||
|
}
|
||||||
|
return self.env['mrp.bom.line'].create(vals)
|
||||||
|
|
||||||
|
def get_bom(self, product):
|
||||||
|
embryo = self.env['product.product'].search(
|
||||||
|
[('categ_id.type', '=', '胚料'), ('materials_type_id', '=', product.materials_type_id.id),
|
||||||
('length', '>', product.length), ('width', '>', product.width),
|
('length', '>', product.length), ('width', '>', product.width),
|
||||||
('height', '>', product.height)
|
('height', '>', product.height)
|
||||||
],
|
],
|
||||||
@@ -125,9 +202,32 @@ class ResMrpBom(models.Model):
|
|||||||
)
|
)
|
||||||
logging.info('bom_create_Line1:%s' % product)
|
logging.info('bom_create_Line1:%s' % product)
|
||||||
return self.env['mrp.bom.line'].create(vals)
|
return self.env['mrp.bom.line'].create(vals)
|
||||||
|
if embryo:
|
||||||
|
rate_of_waste = ((embryo.volume - product.model_volume) % embryo.volume) * 100
|
||||||
|
if rate_of_waste <= 20:
|
||||||
|
return embryo
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
# 查bom的原材料
|
||||||
|
def get_raw_bom(self, product):
|
||||||
|
raw_bom = self.env['product.product'].search(
|
||||||
|
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)])
|
||||||
|
return raw_bom
|
||||||
|
|
||||||
|
|
||||||
class ResProductCategory(models.Model):
|
class ResProductCategory(models.Model):
|
||||||
_inherit = "product.category"
|
_inherit = "product.category"
|
||||||
|
|
||||||
is_embryo = fields.Boolean('胚料')
|
type = fields.Selection(
|
||||||
|
[("成品", "成品"), ("胚料", "胚料"), ("原材料", "原材料")],
|
||||||
|
default="", string="类型")
|
||||||
|
|
||||||
|
# @api.constrains('type')
|
||||||
|
# def _check_type(self):
|
||||||
|
# category = self.env['product.category'].search(
|
||||||
|
# [('type', '=', self.type)])
|
||||||
|
# if category:
|
||||||
|
# raise ValidationError("该类别已存在,请选择其他类别")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,16 +48,16 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="view_product_category_form_inherit_sf" model="ir.ui.view">
|
<!-- <record id="view_product_category_form_inherit_sf" model="ir.ui.view">-->
|
||||||
<field name="name">product.category.form.inherit.sf</field>
|
<!-- <field name="name">product.category.form.inherit.sf</field>-->
|
||||||
<field name="model">product.category</field>
|
<!-- <field name="model">product.category</field>-->
|
||||||
<field name="inherit_id" ref="product.product_category_form_view"/>
|
<!-- <field name="inherit_id" ref="product.product_category_form_view"/>-->
|
||||||
<field name="arch" type="xml">
|
<!-- <field name="arch" type="xml">-->
|
||||||
<field name="parent_id" position="before">
|
<!-- <field name="parent_id" position="before">-->
|
||||||
<field name="is_embryo"/>
|
<!-- <field name="type"/>-->
|
||||||
</field>
|
<!-- </field>-->
|
||||||
</field>
|
<!-- </field>-->
|
||||||
</record>
|
<!-- </record>-->
|
||||||
|
|
||||||
<record id="view_template_property_form" model="ir.ui.view">
|
<record id="view_template_property_form" model="ir.ui.view">
|
||||||
<field name="name">product.template.stock.property.form.inherit</field>
|
<field name="name">product.template.stock.property.form.inherit</field>
|
||||||
|
|||||||
@@ -40,24 +40,24 @@ class ResMrpRoutingWorkcenter(models.Model):
|
|||||||
return self.env.cr.dictfetchall()[0].get('workcenter_id')
|
return self.env.cr.dictfetchall()[0].get('workcenter_id')
|
||||||
|
|
||||||
|
|
||||||
class ModelTypeRoutingSort(models.Model):
|
# class ModelTypeRoutingSort(models.Model):
|
||||||
_name = 'sf.model.type.routing.sort'
|
# _name = 'sf.model.type.routing.sort'
|
||||||
_description = '工序排序'
|
# _description = '工序排序'
|
||||||
|
#
|
||||||
sequence = fields.Integer('Sequence')
|
# sequence = fields.Integer('Sequence')
|
||||||
route_workcenter_id = fields.Many2one('mrp.routing.workcenter')
|
# route_workcenter_id = fields.Many2one('mrp.routing.workcenter')
|
||||||
is_repeat = fields.Boolean('重复', related='route_workcenter_id.is_repeat')
|
# is_repeat = fields.Boolean('重复', related='route_workcenter_id.is_repeat')
|
||||||
routing_type = fields.Selection([
|
# routing_type = fields.Selection([
|
||||||
('获取CNC加工程序', '获取CNC加工程序'),
|
# ('获取CNC加工程序', '获取CNC加工程序'),
|
||||||
('装夹', '装夹'),
|
# ('装夹', '装夹'),
|
||||||
('前置三元定位检测', '前置三元定位检测'),
|
# ('前置三元定位检测', '前置三元定位检测'),
|
||||||
('CNC加工', 'CNC加工'),
|
# ('CNC加工', 'CNC加工'),
|
||||||
('后置三元质量检测', '后置三元质量检测'),
|
# ('后置三元质量检测', '后置三元质量检测'),
|
||||||
('解除装夹', '解除装夹'),
|
# ('解除装夹', '解除装夹'),
|
||||||
], string="工序类型", related='route_workcenter_id.routing_type')
|
# ], string="工序类型", related='route_workcenter_id.routing_type')
|
||||||
workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')
|
# workcenter_ids = fields.Many2many('mrp.workcenter', required=False, related='route_workcenter_id.workcenter_ids')
|
||||||
model_type_id = fields.Many2one('sf.model.type')
|
# model_type_id = fields.Many2one('sf.model.type')
|
||||||
|
#
|
||||||
_sql_constraints = [
|
# _sql_constraints = [
|
||||||
('route_model_type_uniq', 'unique (route_workcenter_id,model_type_id)', '工序不能重复!')
|
# ('route_model_type_uniq', 'unique (route_workcenter_id,model_type_id)', '工序不能重复!')
|
||||||
]
|
# ]
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
'material_type_code': cnc.env['sf.materials.model'].search(
|
'material_type_code': cnc.env['sf.materials.model'].search(
|
||||||
[('id', '=', cnc.product_id.materials_type_id.id)]).materials_no,
|
[('id', '=', cnc.product_id.materials_type_id.id)]).materials_no,
|
||||||
'machining_precision': cnc.product_id.model_machining_precision,
|
'machining_precision': cnc.product_id.model_machining_precision,
|
||||||
'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.long,
|
'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.length,
|
||||||
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
|
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
|
||||||
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width
|
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width
|
||||||
# 'factory_code': self.env.user.company_id.partner_id.
|
# 'factory_code': self.env.user.company_id.partner_id.
|
||||||
|
|||||||
@@ -29,9 +29,11 @@ class Sf_Mrs_Connect(http.Controller):
|
|||||||
# # 从ftp拉取对应的文件
|
# # 从ftp拉取对应的文件
|
||||||
model_code = cnc.workorder_id.product_id.barcode
|
model_code = cnc.workorder_id.product_id.barcode
|
||||||
processing_panel = cnc.workorder_id.processing_panel
|
processing_panel = cnc.workorder_id.processing_panel
|
||||||
|
logging.info('model_code:%s' % model_code)
|
||||||
server_dir = cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code,
|
server_dir = cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code,
|
||||||
processing_panel)
|
processing_panel)
|
||||||
cnc_file_path = os.path.join(server_dir, cnc.program_name + '.NC')
|
cnc_file_path = os.path.join(server_dir, cnc.program_name + '.NC')
|
||||||
|
logging.info('cnc_file_path:%s' % cnc_file_path)
|
||||||
cnc.with_user(request.env.ref("base.user_admin")).write_file(cnc_file_path, cnc)
|
cnc.with_user(request.env.ref("base.user_admin")).write_file(cnc_file_path, cnc)
|
||||||
# logging.info('get_cnc_processing_create:%s' % '111111111111111')
|
# logging.info('get_cnc_processing_create:%s' % '111111111111111')
|
||||||
# for root, dirs, files in os.walk(server_dir):
|
# for root, dirs, files in os.walk(server_dir):
|
||||||
|
|||||||
@@ -19,25 +19,24 @@ class FtpController():
|
|||||||
try:
|
try:
|
||||||
self.ftp.connect(host, port)
|
self.ftp.connect(host, port)
|
||||||
self.ftp.login(username, password)
|
self.ftp.login(username, password)
|
||||||
|
logging.info("连接成功: ")
|
||||||
except:
|
except:
|
||||||
logging.info("连接失败: ")
|
logging.info("连接失败: ")
|
||||||
|
|
||||||
# 下载目录下的文件
|
# 下载目录下的文件
|
||||||
def download_file_tree(self, remotepath, serverdir):
|
def download_file_tree(self, target_dir, serverdir):
|
||||||
|
self.ftp.cwd(target_dir) # 切换工作路径
|
||||||
if not os.path.exists(serverdir):
|
if not os.path.exists(serverdir):
|
||||||
os.makedirs(serverdir)
|
os.makedirs(serverdir)
|
||||||
self.ftp.cwd(remotepath)
|
|
||||||
remotenames = self.ftp.nlst()
|
remotenames = self.ftp.nlst()
|
||||||
for file in remotenames:
|
for file in remotenames:
|
||||||
server = os.path.join(serverdir, file)
|
server = os.path.join(serverdir, file)
|
||||||
if file.find(".") != -1:
|
if file.find(".") != -1:
|
||||||
self.download_file(server, file)
|
self.download_file(server, file)
|
||||||
else:
|
return
|
||||||
return False
|
|
||||||
|
|
||||||
# 下载指定目录下的指定文件
|
# 下载指定目录下的指定文件
|
||||||
def download_file(self, serverfile, remotefile):
|
def download_file(self, serverfile, remotefile):
|
||||||
file_handler = open(serverfile, 'wb')
|
file_handler = open(serverfile, 'wb')
|
||||||
self.ftp.retrbinary('RETR ' + remotefile, file_handler.write)
|
self.ftp.retrbinary('RETR ' + remotefile, file_handler.write)
|
||||||
file_handler.close()
|
file_handler.close()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user