Compare commits
2 Commits
release/re
...
feature/66
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc030957fb | ||
|
|
10bea40159 |
@@ -1,5 +1,26 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
<record id="view_delivery_record_form_inherit_sf" model="ir.ui.view">
|
||||||
|
<field name="name">delivery.record.form.inherit.sf</field>
|
||||||
|
<field name="model">mrp.workorder</field>
|
||||||
|
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[last()-3]" position="before">
|
||||||
|
<!-- <page string="下发记录" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>-->
|
||||||
|
<page string="下发记录" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "HDR")]}'>
|
||||||
|
<field name="delivery_records">
|
||||||
|
<tree create="false">
|
||||||
|
<field name="delivery_type"/>
|
||||||
|
<field name="delivery_time"/>
|
||||||
|
<field name="influence_record"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
|
||||||
|
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
<!-- <record id="seqence_b_purchase_order" model='ir.sequence'> -->
|
<!-- <record id="seqence_b_purchase_order" model='ir.sequence'> -->
|
||||||
<!-- <field name='name'>Purchase Order</field> -->
|
<!-- <field name='name'>Purchase Order</field> -->
|
||||||
<!-- <field name='code'>sf_machine_connect.delivery.record</field> -->
|
<!-- <field name='code'>sf_machine_connect.delivery.record</field> -->
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
<record id="view_machine_info_form_inherit_sf" model="ir.ui.view">
|
<record id="view_machine_info_form_inherit_sf" model="ir.ui.view">
|
||||||
<field name="name">machine.info.form.inherit.sf</field>
|
<field name="name">machine.info.form.inherit.sf</field>
|
||||||
<field name="model">mrp.workorder</field>
|
<field name="model">mrp.workorder</field>
|
||||||
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
|
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//page[@name='CMR']" position="after">
|
<xpath expr="//page[last()-3]" position="before">
|
||||||
<page string="机床信息" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "MTI")]}'>
|
<page string="机床信息" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "MTI")]}'>
|
||||||
<group string="机床信息">
|
<group string="机床信息">
|
||||||
<group>
|
<group>
|
||||||
@@ -33,15 +33,6 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
<page string="下发记录" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "HDR")]}'>
|
|
||||||
<field name="delivery_records">
|
|
||||||
<tree create="false">
|
|
||||||
<field name="delivery_type"/>
|
|
||||||
<field name="delivery_time"/>
|
|
||||||
<field name="influence_record"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</page>
|
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -1,72 +1,57 @@
|
|||||||
<odoo>
|
<odoo>
|
||||||
<data noupdate="0">
|
<data noupdate="1">
|
||||||
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_1">
|
||||||
|
<field name="code">PTD</field>
|
||||||
|
<field name="name">后置三元检测</field>
|
||||||
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_2">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_2">
|
||||||
<field name="code">WCP</field>
|
<field name="code">WCP</field>
|
||||||
<field name="name">工件装夹</field>
|
<field name="name">工件装夹</field>
|
||||||
<field name="sequence">10</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_3">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_3">
|
||||||
<field name="code">ITD_PP</field>
|
<field name="code">ITD_PP</field>
|
||||||
<field name="name">前置三元检测定位参数</field>
|
<field name="name">前置三元检测定位参数</field>
|
||||||
<field name="sequence">20</field>
|
|
||||||
</record>
|
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_6">
|
|
||||||
<field name="code">WD</field>
|
|
||||||
<field name="name">工件配送</field>
|
|
||||||
<field name="sequence">30</field>
|
|
||||||
</record>
|
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_9">
|
|
||||||
<field name="code">CNC_P</field>
|
|
||||||
<field name="name">CNC程序</field>
|
|
||||||
<field name="sequence">40</field>
|
|
||||||
</record>
|
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_10">
|
|
||||||
<field name="code">CMM_P</field>
|
|
||||||
<field name="name">CMM程序</field>
|
|
||||||
<field name="sequence">50</field>
|
|
||||||
</record>
|
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_1">
|
|
||||||
<field name="code">PTD</field>
|
|
||||||
<field name="name">后置三元检测</field>
|
|
||||||
<field name="sequence">60</field>
|
|
||||||
</record>
|
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_14">
|
|
||||||
<field name="code">DCP</field>
|
|
||||||
<field name="name">解除装夹</field>
|
|
||||||
<field name="sequence">70</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_4">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_4">
|
||||||
<field name="code">2D_MD</field>
|
<field name="code">2D_MD</field>
|
||||||
<field name="name">2D加工图纸</field>
|
<field name="name">2D加工图纸</field>
|
||||||
<field name="sequence">80</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_5">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_5">
|
||||||
<field name="code">QIS</field>
|
<field name="code">QIS</field>
|
||||||
<field name="name">质检标准</field>
|
<field name="name">质检标准</field>
|
||||||
<field name="sequence">90</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_15">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_6">
|
||||||
<field name="code">CMR</field>
|
<field name="code">WD</field>
|
||||||
<field name="name">开料要求</field>
|
<field name="name">工件配送</field>
|
||||||
<field name="sequence">100</field>
|
</record>
|
||||||
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_9">
|
||||||
|
<field name="code">CNC_P</field>
|
||||||
|
<field name="name">CNC程序</field>
|
||||||
|
</record>
|
||||||
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_10">
|
||||||
|
<field name="code">CMM_P</field>
|
||||||
|
<field name="name">CMM程序</field>
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_11">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_11">
|
||||||
<field name="code">MTI</field>
|
<field name="code">MTI</field>
|
||||||
<field name="name">机床信息</field>
|
<field name="name">机床信息</field>
|
||||||
<field name="sequence">110</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_12">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_12">
|
||||||
<field name="code">HDR</field>
|
<field name="code">HDR</field>
|
||||||
<field name="name">下发记录</field>
|
<field name="name">下发记录</field>
|
||||||
<field name="sequence">120</field>
|
|
||||||
</record>
|
</record>
|
||||||
<record model="sf.work.individuation.page" id="sf_work_individuation_page_13">
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_13">
|
||||||
<field name="code">ER</field>
|
<field name="code">ER</field>
|
||||||
<field name="name">异常记录</field>
|
<field name="name">异常记录</field>
|
||||||
<field name="sequence">130</field>
|
|
||||||
</record>
|
</record>
|
||||||
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_14">
|
||||||
|
<field name="code">DCP</field>
|
||||||
|
<field name="name">解除装夹</field>
|
||||||
|
</record>
|
||||||
|
<record model="sf.work.individuation.page" id="sf_work_individuation_page_15">
|
||||||
|
<field name="code">CMR</field>
|
||||||
|
<field name="name">开料要求</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- 原生页签先不进行配置 -->
|
<!-- 原生页签先不进行配置 -->
|
||||||
<!-- <record model="sf.work.individuation.page" id="sf_work_individuation_page_7">-->
|
<!-- <record model="sf.work.individuation.page" id="sf_work_individuation_page_7">-->
|
||||||
|
|||||||
@@ -87,11 +87,12 @@ class AgvScheduling(models.Model):
|
|||||||
agv_route_type: AGV任务类型
|
agv_route_type: AGV任务类型
|
||||||
workorders: 工单
|
workorders: 工单
|
||||||
"""
|
"""
|
||||||
|
scheduling = None
|
||||||
_logger.info('创建AGV调度任务\r\n起点为【%s】,任务类型为【%s】,工单为【%s】' % (agv_start_site_name, agv_route_type, workorders))
|
_logger.info('创建AGV调度任务\r\n起点为【%s】,任务类型为【%s】,工单为【%s】' % (agv_start_site_name, agv_route_type, workorders))
|
||||||
if not workorders:
|
if not workorders:
|
||||||
raise UserError(_('工单不能为空'))
|
raise UserError(_('工单不能为空'))
|
||||||
agv_start_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)], limit=1)
|
agv_start_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_start_site_name)])
|
||||||
if not agv_start_site:
|
if not agv_start_sites:
|
||||||
raise UserError(_('不存在名称为【%s】的接驳站,请先创建!' % agv_start_site_name))
|
raise UserError(_('不存在名称为【%s】的接驳站,请先创建!' % agv_start_site_name))
|
||||||
# 如果存在相同任务类型工单的AGV调度任务,则提示错误
|
# 如果存在相同任务类型工单的AGV调度任务,则提示错误
|
||||||
agv_scheduling = self.sudo().search([
|
agv_scheduling = self.sudo().search([
|
||||||
@@ -107,24 +108,32 @@ class AgvScheduling(models.Model):
|
|||||||
(','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name)
|
(','.join(repetitive_workorders.mapped('production_id.name')), agv_scheduling.name)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称
|
||||||
|
agv_routes = self.env['sf.agv.task.route'].sudo().search([
|
||||||
|
('route_type', '=', agv_route_type),
|
||||||
|
('start_site_id', 'in', agv_start_sites.ids)
|
||||||
|
])
|
||||||
vals = {
|
vals = {
|
||||||
'start_site_id': agv_start_site.id,
|
|
||||||
'agv_route_type': agv_route_type,
|
'agv_route_type': agv_route_type,
|
||||||
'workorder_ids': workorders.ids,
|
'workorder_ids': workorders.ids,
|
||||||
# 'workpiece_delivery_ids': deliveries.mapped('id') if deliveries else [],
|
# 'workpiece_delivery_ids': deliveries.mapped('id') if deliveries else [],
|
||||||
'task_create_time': fields.Datetime.now()
|
'task_create_time': fields.Datetime.now()
|
||||||
}
|
}
|
||||||
# 如果只有唯一任务路线,则自动赋予终点接驳站跟任务名称
|
|
||||||
agv_routes = self.env['sf.agv.task.route'].sudo().search([
|
|
||||||
('route_type', '=', agv_route_type),
|
|
||||||
('start_site_id', '=', agv_start_site.id)
|
|
||||||
])
|
|
||||||
if not agv_routes:
|
if not agv_routes:
|
||||||
raise UserError(_('不存在起点为【%s】的【%s】任务路线,请先创建!' % (agv_start_site_name, agv_route_type)))
|
raise UserError(_('不存在起点为【%s】的【%s】任务路线,请先创建!' % (agv_start_site_name, agv_route_type)))
|
||||||
|
# 如果路线中包含起点与终点相同的接驳站,则不创建AGV调度任务
|
||||||
|
if agv_routes.filtered(lambda r: r.start_site_id.name == r.end_site_id.name):
|
||||||
|
return True
|
||||||
|
# 配送类型相同的接驳站为同一个,取第一个即可
|
||||||
|
vals.update({
|
||||||
|
'start_site_id': agv_routes[0].start_site_id.id,
|
||||||
|
})
|
||||||
idle_route = None
|
idle_route = None
|
||||||
if len(agv_routes) == 1:
|
if len(agv_routes) == 1:
|
||||||
idle_route = agv_routes[0]
|
idle_route = agv_routes[0]
|
||||||
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id})
|
vals.update({
|
||||||
|
'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id
|
||||||
|
})
|
||||||
else:
|
else:
|
||||||
# 判断终点接驳站是否为空闲
|
# 判断终点接驳站是否为空闲
|
||||||
idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲')
|
idle_routes = agv_routes.filtered(lambda r: r.end_site_id.state == '空闲')
|
||||||
@@ -132,7 +141,10 @@ class AgvScheduling(models.Model):
|
|||||||
# 将空闲的路线按照终点接驳站名称排序
|
# 将空闲的路线按照终点接驳站名称排序
|
||||||
idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name)
|
idle_routes = sorted(idle_routes, key=lambda r: r.end_site_id.name)
|
||||||
idle_route = idle_routes[0]
|
idle_route = idle_routes[0]
|
||||||
vals.update({'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id})
|
vals.update({
|
||||||
|
'end_site_id': idle_route.end_site_id.id, 'agv_route_id': idle_route.id
|
||||||
|
})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
scheduling = self.env['sf.agv.scheduling'].sudo().create(vals)
|
scheduling = self.env['sf.agv.scheduling'].sudo().create(vals)
|
||||||
# 触发空闲接驳站状态更新,触发新任务下发
|
# 触发空闲接驳站状态更新,触发新任务下发
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class AgvSetting(models.Model):
|
|||||||
|
|
||||||
# name必须唯一
|
# name必须唯一
|
||||||
_sql_constraints = [
|
_sql_constraints = [
|
||||||
('name_uniq', 'unique (name)', '站点编号必须唯一!'),
|
('name_uniq', 'unique (name, workcenter_id)', '同一工作中心的站点编号必须唯一!'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# def update_site_state(self):
|
# def update_site_state(self):
|
||||||
@@ -68,11 +68,12 @@ class AgvSetting(models.Model):
|
|||||||
"""
|
"""
|
||||||
if isinstance(agv_site_state_arr, dict):
|
if isinstance(agv_site_state_arr, dict):
|
||||||
for agv_site_name, is_occupy in agv_site_state_arr.items():
|
for agv_site_name, is_occupy in agv_site_state_arr.items():
|
||||||
agv_site = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)])
|
agv_sites = self.env['sf.agv.site'].sudo().search([('name', '=', agv_site_name)])
|
||||||
if agv_site:
|
if agv_sites:
|
||||||
agv_site.state = is_occupy
|
agv_sites.state = is_occupy
|
||||||
if notify:
|
if notify:
|
||||||
self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state)
|
for agv_site in agv_sites:
|
||||||
|
self.env['sf.agv.scheduling'].on_site_state_change(agv_site.id, agv_site.state)
|
||||||
else:
|
else:
|
||||||
_logger.error("更新失败:接驳站站点错误!%s" % agv_site_name)
|
_logger.error("更新失败:接驳站站点错误!%s" % agv_site_name)
|
||||||
raise UserError("更新失败:接驳站站点错误!")
|
raise UserError("更新失败:接驳站站点错误!")
|
||||||
|
|||||||
@@ -107,8 +107,6 @@ class ResMrpRoutingWorkcenter(models.Model):
|
|||||||
|
|
||||||
class WorkIndividuationPage(models.Model):
|
class WorkIndividuationPage(models.Model):
|
||||||
_name = 'sf.work.individuation.page'
|
_name = 'sf.work.individuation.page'
|
||||||
_order = 'sequence'
|
|
||||||
|
|
||||||
code = fields.Char('编号')
|
code = fields.Char('编号')
|
||||||
name = fields.Char('名称')
|
name = fields.Char('名称')
|
||||||
sequence = fields.Integer('序号')
|
|
||||||
|
|||||||
@@ -226,6 +226,22 @@
|
|||||||
<!-- string="返工"-->
|
<!-- string="返工"-->
|
||||||
<!-- attrs='{"invisible": [("rework_flag","=",True)]}' confirm="是否返工"/>-->
|
<!-- attrs='{"invisible": [("rework_flag","=",True)]}' confirm="是否返工"/>-->
|
||||||
</xpath>
|
</xpath>
|
||||||
|
<xpath expr="//page[1]" position="before">
|
||||||
|
<page string="开料要求" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CMR")]}'>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="product_tmpl_id_materials_id" widget="many2one"/>
|
||||||
|
<field name="product_tmpl_id_materials_type_id" widget="many2one"/>
|
||||||
|
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="product_tmpl_id_length"/>
|
||||||
|
<field name="product_tmpl_id_width"/>
|
||||||
|
<field name="product_tmpl_id_height"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
<xpath expr="//label[1]" position="before">
|
<xpath expr="//label[1]" position="before">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
<field name="production_id" invisible="0"/>
|
<field name="production_id" invisible="0"/>
|
||||||
@@ -309,8 +325,6 @@
|
|||||||
|
|
||||||
|
|
||||||
<xpath expr="//page[1]" position="before">
|
<xpath expr="//page[1]" position="before">
|
||||||
<field name="results" invisible="1"/>
|
|
||||||
<field name="individuation_page_list" invisible="1"/>
|
|
||||||
<page string="工件装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WCP")]}'>
|
<page string="工件装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WCP")]}'>
|
||||||
<group>
|
<group>
|
||||||
<!-- <field name="_barcode_scanned" widget="barcode_handler"/> -->
|
<!-- <field name="_barcode_scanned" widget="barcode_handler"/> -->
|
||||||
@@ -489,6 +503,7 @@
|
|||||||
<field name='X_deviation_angle' readonly="1"/>
|
<field name='X_deviation_angle' readonly="1"/>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
|
|
||||||
<page string="工件配送" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WD")]}'>
|
<page string="工件配送" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "WD")]}'>
|
||||||
<field name="workpiece_delivery_ids">
|
<field name="workpiece_delivery_ids">
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
@@ -508,6 +523,58 @@
|
|||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
|
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
<xpath expr="//form//header" position="inside">
|
||||||
|
<button type="object" class="oe_highlight jikimo_button_confirm" name="get_three_check_datas"
|
||||||
|
string="获取数据"
|
||||||
|
attrs='{"invisible": ["|", ("state","!=","progress"), ("routing_type","!=","装夹预调")]}'/>
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
<!-- =====原生页签,暂时不进行配置===== -->
|
||||||
|
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
|
||||||
|
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "ML")]}</attribute>-->
|
||||||
|
<!-- </xpath>-->
|
||||||
|
<!-- <xpath expr="//page[@name='time_tracking']" position="attributes">-->
|
||||||
|
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "TT")]}</attribute>-->
|
||||||
|
<!-- </xpath>-->
|
||||||
|
<!-- ============================= -->
|
||||||
|
|
||||||
|
<xpath expr="//page[1]" position="before">
|
||||||
|
<field name="results" invisible="1"/>
|
||||||
|
<field name="individuation_page_list" invisible="1"/>
|
||||||
|
<page string="后置三元检测" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "PTD")]}'>
|
||||||
|
<group>
|
||||||
|
<field name="test_results"
|
||||||
|
attrs='{"readonly":["&","|",("state","!=","to be detected"), "|",("routing_type","=","CNC加工"),("is_inspect", "=", True),("state","in",["done","rework"])],
|
||||||
|
"invisible":[("results","!=",False)]}'/>
|
||||||
|
<!-- <field name="is_remanufacture" attrs='{"invisible":[("test_results","!=","报废")]}'/>-->
|
||||||
|
<!-- <field name="is_fetchcnc"-->
|
||||||
|
<!-- attrs='{"invisible":["|",("test_results","=","合格"),("is_remanufacture","=",False)]}'/>-->
|
||||||
|
<field name="reason"
|
||||||
|
attrs='{"required":[("test_results","!=","合格")],"invisible":[("test_results","=","合格")],"readonly":[("state","in",("done", "rework"))]}'/>
|
||||||
|
<field name="detailed_reason"
|
||||||
|
attrs='{"required":[("test_results","!=","合格")],"invisible":[("test_results","=","合格")],"readonly":[("state","in",("done", "rework"))]}'/>
|
||||||
|
<!-- <field name="results" readonly="1" attrs='{"invisible":[("results","!=","合格")]}'/>-->
|
||||||
|
<field name="detection_report" attrs='{"invisible":[("results","!=",False)]}'
|
||||||
|
widget="pdf_viewer" readonly="1"/>
|
||||||
|
</group>
|
||||||
|
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
|
||||||
|
<!-- <button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder"-->
|
||||||
|
<!-- string="检测确认"-->
|
||||||
|
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
</page>
|
||||||
|
<page string="2D加工图纸" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "2D_MD")]}'>
|
||||||
|
<field name="machining_drawings" widget="adaptive_viewer"/>
|
||||||
|
</page>
|
||||||
|
|
||||||
|
<page string="质检标准" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "QIS")]}'>
|
||||||
|
<field name="quality_standard" widget="adaptive_viewer"/>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//page[1]" position="before">
|
||||||
<page string="CNC程序" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CNC_P")]}'>
|
<page string="CNC程序" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CNC_P")]}'>
|
||||||
<field name="cnc_ids" widget="one2many" string="工作程序" default_order="sequence_number,id"
|
<field name="cnc_ids" widget="one2many" string="工作程序" default_order="sequence_number,id"
|
||||||
readonly="0">
|
readonly="0">
|
||||||
@@ -543,28 +610,8 @@
|
|||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
<page string="后置三元检测" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "PTD")]}'>
|
</xpath>
|
||||||
<group>
|
<xpath expr="//page[1]" position="before">
|
||||||
<field name="test_results"
|
|
||||||
attrs='{"readonly":["&","|",("state","!=","to be detected"), "|",("routing_type","=","CNC加工"),("is_inspect", "=", True),("state","in",["done","rework"])],
|
|
||||||
"invisible":[("results","!=",False)]}'/>
|
|
||||||
<!-- <field name="is_remanufacture" attrs='{"invisible":[("test_results","!=","报废")]}'/>-->
|
|
||||||
<!-- <field name="is_fetchcnc"-->
|
|
||||||
<!-- attrs='{"invisible":["|",("test_results","=","合格"),("is_remanufacture","=",False)]}'/>-->
|
|
||||||
<field name="reason"
|
|
||||||
attrs='{"required":[("test_results","!=","合格")],"invisible":[("test_results","=","合格")],"readonly":[("state","in",("done", "rework"))]}'/>
|
|
||||||
<field name="detailed_reason"
|
|
||||||
attrs='{"required":[("test_results","!=","合格")],"invisible":[("test_results","=","合格")],"readonly":[("state","in",("done", "rework"))]}'/>
|
|
||||||
<!-- <field name="results" readonly="1" attrs='{"invisible":[("results","!=","合格")]}'/>-->
|
|
||||||
<field name="detection_report" attrs='{"invisible":[("results","!=",False)]}'
|
|
||||||
widget="pdf_viewer" readonly="1"/>
|
|
||||||
</group>
|
|
||||||
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
|
|
||||||
<!-- <button type="object" class="oe_highlight" name="recreateManufacturingOrWorkerOrder"-->
|
|
||||||
<!-- string="检测确认"-->
|
|
||||||
<!-- attrs='{"invisible": ["|","|",("state","!=","progress"),("user_permissions","=",False),("results","=","合格")]}'/>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
</page>
|
|
||||||
<page string="解除装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "DCP")]}'>
|
<page string="解除装夹" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "DCP")]}'>
|
||||||
<!-- <field name="tray_id" readonly="1"/>-->
|
<!-- <field name="tray_id" readonly="1"/>-->
|
||||||
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
|
<!-- <div class="col-12 col-lg-6 o_setting_box">-->
|
||||||
@@ -578,45 +625,7 @@
|
|||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
|
|
||||||
</page>
|
</page>
|
||||||
<page string="2D加工图纸" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "2D_MD")]}'>
|
|
||||||
<field name="machining_drawings" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
<page string="质检标准" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "QIS")]}'>
|
|
||||||
<field name="quality_standard" widget="adaptive_viewer"/>
|
|
||||||
</page>
|
|
||||||
<page name="CMR" string="开料要求" attrs='{"invisible": ["!", ("individuation_page_list", "ilike", "CMR")]}'>
|
|
||||||
<group>
|
|
||||||
<group>
|
|
||||||
<field name="product_tmpl_id_materials_id" widget="many2one"/>
|
|
||||||
<field name="product_tmpl_id_materials_type_id" widget="many2one"/>
|
|
||||||
|
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="product_tmpl_id_length"/>
|
|
||||||
<field name="product_tmpl_id_width"/>
|
|
||||||
<field name="product_tmpl_id_height"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
|
||||||
</page>
|
|
||||||
</xpath>
|
</xpath>
|
||||||
|
|
||||||
<xpath expr="//form//header" position="inside">
|
|
||||||
<button type="object" class="oe_highlight jikimo_button_confirm" name="get_three_check_datas"
|
|
||||||
string="获取数据"
|
|
||||||
attrs='{"invisible": ["|", ("state","!=","progress"), ("routing_type","!=","装夹预调")]}'/>
|
|
||||||
</xpath>
|
|
||||||
|
|
||||||
<!-- =====原生页签,暂时不进行配置===== -->
|
|
||||||
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
|
|
||||||
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "ML")]}</attribute>-->
|
|
||||||
<!-- </xpath>-->
|
|
||||||
<!-- <xpath expr="//page[@name='time_tracking']" position="attributes">-->
|
|
||||||
<!-- <attribute name="attrs">{"invisible": ["!", ("individuation_page_list", "ilike", "TT")]}</attribute>-->
|
|
||||||
<!-- </xpath>-->
|
|
||||||
<!-- ============================= -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- <xpath expr="//form//sheet//group//group//div[1]" position="after">-->
|
<!-- <xpath expr="//form//sheet//group//group//div[1]" position="after">-->
|
||||||
<!-- <label for="date_start" string="实际加工时间"/>-->
|
<!-- <label for="date_start" string="实际加工时间"/>-->
|
||||||
<!-- <div class="oe_inline">-->
|
<!-- <div class="oe_inline">-->
|
||||||
|
|||||||
@@ -117,17 +117,30 @@ class WorkpieceDeliveryWizard(models.TransientModel):
|
|||||||
item.button_finish()
|
item.button_finish()
|
||||||
|
|
||||||
# return scheduling.read()[0]
|
# return scheduling.read()[0]
|
||||||
return {
|
if isinstance(scheduling, bool) and scheduling is True:
|
||||||
'type': 'ir.actions.client',
|
return{
|
||||||
'tag': 'display_notification',
|
'type': 'ir.actions.client',
|
||||||
'target': 'new',
|
'tag': 'display_notification',
|
||||||
'params': {
|
'target': 'new',
|
||||||
'message': f'任务下发成功!AGV任务调度编号为【{scheduling.name}】',
|
'params': {
|
||||||
'type': 'success',
|
'message': f'解除装夹成功',
|
||||||
'sticky': False,
|
'type': 'success',
|
||||||
'next': {'type': 'ir.actions.act_window_close'},
|
'sticky': False,
|
||||||
|
'next': {'type': 'ir.actions.act_window_close'},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.client',
|
||||||
|
'tag': 'display_notification',
|
||||||
|
'target': 'new',
|
||||||
|
'params': {
|
||||||
|
'message': f'任务下发成功!AGV任务调度编号为【{scheduling.name}】',
|
||||||
|
'type': 'success',
|
||||||
|
'sticky': False,
|
||||||
|
'next': {'type': 'ir.actions.act_window_close'},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.info('%s任务下发失败:%s', self.delivery_type, e)
|
logging.info('%s任务下发失败:%s', self.delivery_type, e)
|
||||||
raise UserError(f'{self.delivery_type}任务下发失败:{e}') from e
|
raise UserError(f'{self.delivery_type}任务下发失败:{e}') from e
|
||||||
|
|||||||
@@ -791,50 +791,48 @@ class FunctionalToolAssembly(models.Model):
|
|||||||
# 刀柄之外的物料配置
|
# 刀柄之外的物料配置
|
||||||
if options == '刀柄+整体式刀具':
|
if options == '刀柄+整体式刀具':
|
||||||
# 配置整体式刀具
|
# 配置整体式刀具
|
||||||
integra_lot_ids = self._get_old_tool_material_lot(bom.get('integral_ids'))
|
integra_lot_id = self._get_old_tool_material_lot(bom.get('integral_ids'))
|
||||||
integra_location_lot_id = self._get_shelf_location_lot(integra_lot_ids)
|
integra_location_lot_id = self._get_shelf_location_lot(integra_lot_id)
|
||||||
self.integral_freight_barcode_id = integra_location_lot_id.shelf_location_id.id
|
self.integral_freight_barcode_id = integra_location_lot_id.shelf_location_id.id
|
||||||
self.integral_lot_id = integra_location_lot_id.lot_id.id
|
self.integral_lot_id = integra_location_lot_id.lot_id.id
|
||||||
else:
|
else:
|
||||||
# 配置刀片
|
# 配置刀片
|
||||||
blade_lot_ids = self._get_old_tool_material_lot(bom.get('blade_ids'))
|
blade_lot_id = self._get_old_tool_material_lot(bom.get('blade_ids'))
|
||||||
blade_location_lot_id = self._get_shelf_location_lot(blade_lot_ids)
|
blade_location_lot_id = self._get_shelf_location_lot(blade_lot_id)
|
||||||
self.blade_freight_barcode_id = blade_location_lot_id.shelf_location_id.id
|
self.blade_freight_barcode_id = blade_location_lot_id.shelf_location_id.id
|
||||||
self.blade_lot_id = blade_location_lot_id.lot_id.id
|
self.blade_lot_id = blade_location_lot_id.lot_id.id
|
||||||
|
|
||||||
if options == '刀柄+刀杆+刀片':
|
if options == '刀柄+刀杆+刀片':
|
||||||
# 配置刀杆
|
# 配置刀杆
|
||||||
bar_lot_ids = self._get_old_tool_material_lot(bom.get('bar_ids'))
|
bar_lot_id = self._get_old_tool_material_lot(bom.get('bar_ids'))
|
||||||
bar_location_lot_id = self._get_shelf_location_lot(bar_lot_ids)
|
bar_location_lot_id = self._get_shelf_location_lot(bar_lot_id)
|
||||||
self.bar_freight_barcode_id = bar_location_lot_id.shelf_location_id.id
|
self.bar_freight_barcode_id = bar_location_lot_id.shelf_location_id.id
|
||||||
self.bar_lot_id = bar_location_lot_id.lot_id.id
|
self.bar_lot_id = bar_location_lot_id.lot_id.id
|
||||||
elif options == '刀柄+刀盘+刀片':
|
elif options == '刀柄+刀盘+刀片':
|
||||||
# 配置刀盘
|
# 配置刀盘
|
||||||
pad_lot_ids = self._get_old_tool_material_lot(bom.get('pad_ids'))
|
pad_lot_id = self._get_old_tool_material_lot(bom.get('pad_ids'))
|
||||||
pad_location_lot_id = self._get_shelf_location_lot(pad_lot_ids)
|
pad_location_lot_id = self._get_shelf_location_lot(pad_lot_id)
|
||||||
self.pad_freight_barcode_id = pad_location_lot_id.shelf_location_id.id
|
self.pad_freight_barcode_id = pad_location_lot_id.shelf_location_id.id
|
||||||
self.pad_lot_id = pad_location_lot_id.lot_id.id
|
self.pad_lot_id = pad_location_lot_id.lot_id.id
|
||||||
|
|
||||||
def _get_old_tool_material_lot(self, material_ids):
|
def _get_old_tool_material_lot(self, material_ids):
|
||||||
""" 根据先进先出原则选择物料批次 """
|
""" 根据先进先出原则选择物料批次 """
|
||||||
location_id = self.env['stock.location'].search([('name', '=', '刀具房')])
|
location_id = self.env['stock.location'].search([('name', '=', '刀具房')])
|
||||||
stock_quant_ids = self.env['stock.quant'].sudo().search(
|
stock_quant = self.env['stock.quant'].sudo().search(
|
||||||
[('location_id', '=', location_id.id), ('product_id', 'in', material_ids.ids), ('quantity', '>', '0')],
|
[('location_id', '=', location_id.id), ('product_id', 'in', material_ids.ids), ('quantity', '>', '0')],
|
||||||
order='lot_id')
|
order='lot_id', limit=1)
|
||||||
if stock_quant_ids:
|
if stock_quant:
|
||||||
return [stock_quant_id.lot_id for stock_quant_id in stock_quant_ids]
|
return stock_quant.lot_id
|
||||||
else:
|
else:
|
||||||
raise ValidationError(f'【{material_ids[0].cutting_tool_material_id.name}】物料库存不足,请先进行盘点或采购')
|
raise ValidationError(f'【{material_ids[0].cutting_tool_material_id.name}】物料库存不足,请先进行盘点或采购')
|
||||||
|
|
||||||
def _get_shelf_location_lot(self, lot_ids):
|
def _get_shelf_location_lot(self, lot_id):
|
||||||
"""根据所给的刀具物料批次号,返回一个刀具物料货位、批次信息"""
|
"""根据所给的刀具物料批次号,返回一个刀具物料货位、批次信息"""
|
||||||
for lot_id in lot_ids:
|
location_lots = self.env['sf.shelf.location.lot'].sudo().search([('lot_id', '=', lot_id.id)])
|
||||||
location_lots = self.env['sf.shelf.location.lot'].sudo().search([('lot_id', '=', lot_id.id)])
|
if not location_lots:
|
||||||
if location_lots:
|
raise ValidationError(f'没有查询到批次为【{lot_id.name}】物料的货位信息!')
|
||||||
return location_lots[0]
|
else:
|
||||||
if lot_ids:
|
return location_lots[0]
|
||||||
raise ValidationError(
|
|
||||||
f'【{lot_ids[0].product_id.cutting_tool_material_id.name}】物料在货位上库存不足,请先进行盘点或采购!')
|
|
||||||
|
|
||||||
def _get_inventory_bom(self, inventory_id):
|
def _get_inventory_bom(self, inventory_id):
|
||||||
"""获取BOM的刀具物料产品信息"""
|
"""获取BOM的刀具物料产品信息"""
|
||||||
|
|||||||
@@ -150,4 +150,4 @@ access_sf_shelf_lot_group_user,sf.shelf.location.lot.group_user,model_sf_shelf_l
|
|||||||
|
|
||||||
|
|
||||||
access_ir_model_group_sf_stock_user,ir_model_group_sf_stock_user,base.model_ir_model,sf_base.group_sf_stock_user,1,1,0,0
|
access_ir_model_group_sf_stock_user,ir_model_group_sf_stock_user,base.model_ir_model,sf_base.group_sf_stock_user,1,1,0,0
|
||||||
access_mrp_workorder_group_sf_stock_user,mrp_workorder_group_sf_stock_user,mrp.model_mrp_workorder,sf_base.group_sf_stock_user,1,0,0,0
|
access_mrp_workorder_group_sf_stock_user,mrp_workorder_group_sf_stock_user,mrp.model_mrp_workorder,sf_base.group_sf_stock_user,1,1,0,0
|
||||||
|
|||||||
|
Reference in New Issue
Block a user