diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py
index 1bfdd356..09fecfae 100644
--- a/sf_bf_connect/models/process_status.py
+++ b/sf_bf_connect/models/process_status.py
@@ -36,6 +36,7 @@ class StatusChange(models.Model):
# 使用super()来调用原始方法(在本例中为'sale.order'模型的'action_confirm'方法)
try:
res = super(StatusChange, self).action_confirm()
+ logging.info('原生方法返回结果:%s' % res)
# 原有方法执行后,进行额外的操作(如调用外部API)
process_start_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
config = self.env['res.config.settings'].get_values()
@@ -61,6 +62,7 @@ class StatusChange(models.Model):
traceback_error = traceback.format_exc()
logging.error("工厂加工同步订单状态失败:%s " % traceback_error)
raise UserError(e)
+ logging.info('最终返回值:%s' % res)
return res
def action_cancel(self):
diff --git a/sf_dlm_management/__manifest__.py b/sf_dlm_management/__manifest__.py
index a5c894d4..9a94082a 100644
--- a/sf_dlm_management/__manifest__.py
+++ b/sf_dlm_management/__manifest__.py
@@ -9,7 +9,7 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
- 'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing'],
+ 'depends': ['sf_sale', 'sf_dlm', 'sf_manufacturing','jikimo_attachment_viewer'],
'data': [
'data/stock_data.xml',
'views/product_template_management_view.xml',
diff --git a/sf_hr/models/__init__.py b/sf_hr/models/__init__.py
index ffe76391..9744f0cc 100644
--- a/sf_hr/models/__init__.py
+++ b/sf_hr/models/__init__.py
@@ -2,3 +2,4 @@
from . import hr_employee
from . import res_config_setting
+from . import res_users
diff --git a/sf_hr/models/hr_employee.py b/sf_hr/models/hr_employee.py
index e9826f29..5d37f199 100644
--- a/sf_hr/models/hr_employee.py
+++ b/sf_hr/models/hr_employee.py
@@ -11,6 +11,42 @@ class JkmPracticeEmployee(models.Model):
we_id = fields.Char(string='企微ID', index=True)
+ @api.model_create_multi
+ def create(self, vals_list):
+ for val in vals_list:
+ if 'work_email' in val:
+ val["we_id"] = self._get_we_id(val.get('work_email'))
+ return super(JkmPracticeEmployee, self).create(vals_list)
+
+ def write(self, vals):
+ if 'work_email' in vals:
+ vals["we_id"] = self._get_we_id(vals.get('work_email'))
+ return super(JkmPracticeEmployee, self).write(vals)
+
+ @api.depends('work_contact_id', 'work_contact_id.mobile', 'work_contact_id.email')
+ def _compute_work_contact_details(self):
+ for employee in self:
+ if employee.work_contact_id:
+ employee.mobile_phone = employee.work_contact_id.mobile
+ employee.work_email = employee.work_contact_id.email
+ if employee.work_contact_id.email:
+ employee.we_id = self._get_we_id(employee.work_contact_id.email)
+
+ def _get_we_id(self, work_email):
+ json1 = {
+ 'params': {
+ 'work_email': work_email
+ }
+ }
+ url = '/api/get/we_id/info'
+ config = self.env['res.config.settings'].get_values()
+ ret = requests.post((config['ims_url'] + url), json=json1, data={})
+ result = ret.json()['result']
+ if result['code'] == 200:
+ if result['we_id']:
+ return result['we_id']
+ return None
+
def _employee_info_sync(self):
url = '/api/get/organization'
config = self.env['res.config.settings'].get_values()
diff --git a/sf_hr/models/res_users.py b/sf_hr/models/res_users.py
new file mode 100644
index 00000000..7ced81bc
--- /dev/null
+++ b/sf_hr/models/res_users.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+import random
+from odoo import models, fields, api
+from odoo.http import request
+from odoo.exceptions import AccessDenied
+
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class ResUsers(models.Model):
+ _inherit = 'res.users'
+
+ we_employee_id = fields.Char(string=u'企业微信账号', related='employee_id.we_id', default="")
diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py
index 71f4027a..fd15858a 100644
--- a/sf_manufacturing/__manifest__.py
+++ b/sf_manufacturing/__manifest__.py
@@ -10,7 +10,7 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
- 'depends': ['sf_base', 'sf_maintenance', 'web_widget_model_viewer', 'sf_warehouse'],
+ 'depends': ['sf_base', 'sf_maintenance', 'web_widget_model_viewer', 'sf_warehouse','jikimo_attachment_viewer'],
'data': [
'data/stock_data.xml',
'data/empty_racks_data.xml',
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index 1b9ddf39..43cfc434 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -141,12 +141,12 @@ class MrpProduction(models.Model):
], string='工序状态', default='待装夹')
# 零件图号
- part_number = fields.Char('零件图号', readonly=True)
+ part_number = fields.Char('零件图号', related='product_id.part_number', readonly=True)
# 上传零件图纸
- part_drawing = fields.Binary('零件图纸', readonly=True)
+ part_drawing = fields.Binary('零件图纸', related='product_id.machining_drawings', readonly=True)
- quality_standard = fields.Binary('质检标准', readonly=True)
+ quality_standard = fields.Binary('质检标准', related='product_id.quality_standard', readonly=True)
@api.depends('product_id.manual_quotation')
def _compute_manual_quotation(self):
@@ -806,6 +806,8 @@ class MrpProduction(models.Model):
'date_to': date_planned_end,
})
# work.write({'date_planned_start': date_planned_start, 'date_planned_finished': date_planned_end})
+ # 设置一个较大的结束时间,防止在设置开始时间时,结束时间小于开始时间
+ work.date_planned_finished = datetime.datetime.today() + datetime.timedelta(days=100)
work.date_planned_start = date_planned_start
work.date_planned_finished = date_planned_end
routing_workcenter = self.env['mrp.routing.workcenter'].sudo().search(
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index d2613b9a..37d42b42 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -306,6 +306,7 @@ class ResMrpWorkOrder(models.Model):
is_delivery = fields.Boolean('是否配送完成', default=False)
rfid_code = fields.Char('RFID码')
rfid_code_old = fields.Char('RFID码(已解除)')
+ is_test_env = fields.Boolean('测试环境', default=False)
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
string='生产线', store=True, tracking=True)
@@ -321,6 +322,9 @@ class ResMrpWorkOrder(models.Model):
detailed_reason = fields.Text('详细原因')
is_rework = fields.Boolean(string='是否返工', default=False)
+ def button_change_env(self):
+ self.is_test_env = not self.is_test_env
+
@api.constrains('blocked_by_workorder_ids')
def _check_no_cyclic_dependencies(self):
if self.production_id.state not in ['rework'] and self.state not in ['rework']:
diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py
index e61f9b32..7391c788 100644
--- a/sf_manufacturing/models/product_template.py
+++ b/sf_manufacturing/models/product_template.py
@@ -777,8 +777,6 @@ class ResProductMo(models.Model):
part_number = fields.Char(string='零件图号', readonly=True)
machining_drawings = fields.Binary('2D加工图纸', readonly=True)
quality_standard = fields.Binary('质检标准', readonly=True)
- machining_drawings_name = fields.Char('2D加工图纸名', readonly=True)
- quality_standard_name = fields.Char('质检标准名', readonly=True)
@api.constrains('tool_length')
def _check_tool_length_size(self):
@@ -840,10 +838,10 @@ class ResProductMo(models.Model):
else:
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
- def attachment_update(self, name, res_id, res_field):
+ def attachment_update(self, name, res_id, res_field, mimetype):
attachment_info = self.env['ir.attachment'].sudo().search(
[('res_id', '=', res_id), ('res_field', '=', res_field)], limit=1)
- attachment_info.write({'name': name})
+ attachment_info.write({'name': name, 'mimetype': mimetype})
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
def product_create(self, product_id, item, order_id, order_number, i):
@@ -883,8 +881,6 @@ class ResProductMo(models.Model):
'manual_quotation': item['manual_quotation'] or False,
'part_number': item.get('part_number') or '',
'active': True,
- 'machining_drawings_name': item['machining_drawings_name'],
- 'quality_standard_name': item['quality_standard_name'],
'machining_drawings': '' if not item['machining_drawings'] else base64.b64decode(
item['machining_drawings']),
'quality_standard': '' if not item['quality_standard'] else base64.b64decode(item['quality_standard']),
@@ -895,12 +891,12 @@ class ResProductMo(models.Model):
vals.update({'taxes_id': [(6, 0, [int(tax_id)])]})
copy_product_id.sudo().write(vals)
product_id.product_tmpl_id.active = False
- if item['machining_drawings'] and item['machining_drawings_name']:
+ if item['machining_drawings'] and item['machining_drawings_name'] and item['machining_drawings_mimetype']:
self.attachment_update(item['machining_drawings_name'], copy_product_id.product_tmpl_id.id,
- 'machining_drawings')
- if item['quality_standard'] and item['quality_standard_name']:
+ 'machining_drawings', item['machining_drawings_mimetype'])
+ if item['quality_standard'] and item['quality_standard_name'] and item['quality_standard_mimetype']:
self.attachment_update(item['quality_standard_name'], copy_product_id.product_tmpl_id.id,
- 'quality_standard')
+ 'quality_standard', item['quality_standard_mimetype'])
return copy_product_id
def _get_ids(self, param):
diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py
index 02161b4a..40d159d5 100644
--- a/sf_manufacturing/models/stock.py
+++ b/sf_manufacturing/models/stock.py
@@ -272,21 +272,6 @@ class StockRule(models.Model):
workorder_duration += workorder.duration_expected
sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)])
- # 根据销售订单号查询快速订单
- quick_easy_order = self.env['quick.easy.order'].sudo().search([('sale_order_id', '=', sale_order.id)])
- if quick_easy_order:
- production.write({'part_number': quick_easy_order.part_drawing_number,
- 'part_drawing': quick_easy_order.machining_drawings})
- else:
- production.write({'part_number': production.product_id.part_number,
- 'part_drawing': production.product_id.machining_drawings,
- 'quality_standard': production.product_id.quality_standard})
- if production.product_id.machining_drawings and production.product_id.machining_drawings_name:
- self.attachment_update(production.product_id.machining_drawings_name, production.id,
- 'part_drawing')
- if production.product_id.quality_standard and production.product_id.quality_standard_name:
- self.attachment_update(production.product_id.quality_standard_name, production.id,
- 'quality_standard')
if sale_order:
# sale_order.write({'schedule_status': 'to schedule'})
self.env['sf.production.plan'].sudo().with_company(company_id).create({
diff --git a/sf_manufacturing/security/group_security.xml b/sf_manufacturing/security/group_security.xml
index fdbc3ae5..040e7b92 100644
--- a/sf_manufacturing/security/group_security.xml
+++ b/sf_manufacturing/security/group_security.xml
@@ -1,5 +1,9 @@
-
-
+
+
+ 演示模式
+
+
-
\ No newline at end of file
+
+
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 76c7ff4d..8d3c6c4f 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -247,11 +247,24 @@
+
+
+
+
+
+
+
+
diff --git a/sf_message/models/sf_message_sale.py b/sf_message/models/sf_message_sale.py
index f9932013..58d1a021 100644
--- a/sf_message/models/sf_message_sale.py
+++ b/sf_message/models/sf_message_sale.py
@@ -34,18 +34,19 @@ class SFMessageSale(models.Model):
picking_id.procurement_group_id.stock_move_ids.move_orig_ids.purchase_line_id.order_id).ids
purchase_order_id.extend(purchase_order_ids)
if purchase_order_id:
- purchase_order_list = self.env['purchase.order'].search([('id', 'in', purchase_order_id)])
+ purchase_order_list = self.env['purchase.order'].sudo().search([('id', 'in', purchase_order_id)])
for purchase_order_info in purchase_order_list:
purchase_order_info.add_queue('坯料采购提醒')
except Exception as e:
logging.info('add_queue error:%s' % e)
+ logging.info('action_confirm res:%s' % res)
return res
# 继承并重写jikimo.message.dispatch的_get_message()
def _get_message(self, message_queue_ids):
contents = []
bussiness_node = None
- url = self.env['ir.config_parameter'].get_param('web.base.url')
+ url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
@@ -60,7 +61,7 @@ class SFMessageSale(models.Model):
contents.append(content)
elif item.message_template_id.bussiness_node_id.name == '确认接单':
content = super(SFMessageSale, self)._get_message(item)
- sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(item.res_id))])
+ sale_order_line = self.env['sale.order.line'].sudo().search([('order_id', '=', int(item.res_id))])
product = sale_order_line[0].product_id.name if len(sale_order_line) == 1 else '%s...' % \
sale_order_line[
0].product_id.name
@@ -112,7 +113,7 @@ class SFMessageSale(models.Model):
sale_order = self.sudo().search(
[('state', 'in', ['sale']), ('deadline_of_delivery', '!=', False), ('delivery_status', '!=', 'full')])
for item in sale_order:
- production = self.env['mrp.production'].search([('origin', '=', item.name)])
+ production = self.env['mrp.production'].sudo().search([('origin', '=', item.name)])
production_not_done = production.filtered(lambda p: p.state not in ['done', 'scrap', 'cancel'])
production_done_count = len(production.filtered(lambda p: p.state in ['done', 'scrap', 'cancel']))
deadline_of_delivery = item.deadline_of_delivery.strftime("%Y-%m-%d")
@@ -153,11 +154,11 @@ class SFMessageSale(models.Model):
for wo in overdue_orders:
business_node_id = business_node_ids.get(wo.delivery_warning)
if business_node_id:
- message_template = self.env["jikimo.message.template"].search([
+ message_template = self.env["jikimo.message.template"].sudo().search([
("model", "=", self._name),
("bussiness_node_id", "=", business_node_id)
], limit=1)
- sale_order_has = self.env['jikimo.message.queue'].search([
+ sale_order_has = self.env['jikimo.message.queue'].sudo().search([
('res_id', '=', wo.id),
('message_status', '=', 'pending'),
('message_template_id', '=', message_template.id)
@@ -180,7 +181,7 @@ class SFMessageSale(models.Model):
('message_template_id', '=', message_template_warning.id)
])
if sale_order_warning:
- logging.info('取消发送:%s' % sale_order_warning.name)
+ logging.info('取消发送:%s' % sale_order_warning)
sale_order_warning.write({'message_status': 'cancel'})
def _recover_sale_time_warning_func(self):
diff --git a/sf_message/models/sf_message_stock_picking.py b/sf_message/models/sf_message_stock_picking.py
index 9d7c7f0e..6e80c670 100644
--- a/sf_message/models/sf_message_stock_picking.py
+++ b/sf_message/models/sf_message_stock_picking.py
@@ -29,14 +29,14 @@ class SFMessageStockPicking(models.Model):
[('origin', '=', record.origin), ('state', '!=', 'done'),
('picking_type_id.sequence_code', '=', 'SFP')])
if not stock_picking_sfp:
- stock_picking_send = self.env["jikimo.message.queue"].search([('res_id', '=', record.id)])
+ stock_picking_send = self.env["jikimo.message.queue"].sudo().search([('res_id', '=', record.id)])
if not stock_picking_send:
record.add_queue('订单发货提醒')
def deal_stock_picking_sfp(self, message_queue_id): # 处理订单发货提醒
content = None
- stock_picking = self.env['stock.picking'].search([('id', '=', int(message_queue_id.res_id))])
- stock_picking_out = self.env['stock.picking'].search(
+ stock_picking = self.env['stock.picking'].sudo().search([('id', '=', int(message_queue_id.res_id))])
+ stock_picking_out = self.env['stock.picking'].sudo().search(
[('origin', '=', stock_picking.origin), ('state', '=', 'assigned'),
('picking_type_id.sequence_code', '=', 'OUT')])
if stock_picking_out and len(stock_picking_out) > 0:
@@ -54,10 +54,10 @@ class SFMessageStockPicking(models.Model):
i = 0
if message_queue_id.message_template_id.name == '坯料发料提醒':
content = message_queue_id.message_template_id.content
- stock_picking_line = self.env['stock.picking'].search([('id', '=', int(message_queue_id.res_id))])
- mrp_production_info = self.env['mrp.production'].search(
+ stock_picking_line = self.env['stock.picking'].sudo().search([('id', '=', int(message_queue_id.res_id))])
+ mrp_production_info = self.env['mrp.production'].sudo().search(
[('name', '=', stock_picking_line.origin)])
- mrp_production_list = self.env['mrp.production'].search(
+ mrp_production_list = self.env['mrp.production'].sudo().search(
[('product_id', '=', mrp_production_info.product_id.id)])
for mrp_production_line in mrp_production_list:
picking_ids = mrp_production_line.picking_ids
@@ -87,9 +87,9 @@ class SFMessageStockPicking(models.Model):
return super(SFMessageStockPicking, self).get_special_url(id, tmplate_name, special_name, model_id)
def request_url(self):
- url = self.env['ir.config_parameter'].get_param('web.base.url')
+ url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
action_id = self.env.ref('stock.stock_picking_type_action').id
- menu_id = self.env['ir.model.data'].search([('name', '=', 'module_theme_treehouse')]).id
+ menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_theme_treehouse')]).id
# 查询参数
params = {'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
'view_type': 'kanban'}
@@ -100,9 +100,9 @@ class SFMessageStockPicking(models.Model):
return full_url
def request_url1(self, id):
- url = self.env['ir.config_parameter'].get_param('web.base.url')
+ url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
action_id = self.env.ref('stock.action_picking_tree_all').id
- menu_id = self.env['ir.model.data'].search([('name', '=', 'module_theme_treehouse')]).id
+ menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_theme_treehouse')]).id
# 查询参数
params = {'id': id, 'menu_id': menu_id, 'action': action_id, 'model': 'stock.picking',
'view_type': 'form'}
diff --git a/sf_message/models/sf_message_workorder.py b/sf_message/models/sf_message_workorder.py
index 135aa1cd..d5186797 100644
--- a/sf_message/models/sf_message_workorder.py
+++ b/sf_message/models/sf_message_workorder.py
@@ -26,7 +26,7 @@ class SFMessageWork(models.Model):
contents = []
product_id = []
bussiness_node = None
- url = self.env['ir.config_parameter'].get_param('web.base.url')
+ url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
current_time_strf = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
current_time = self.env['sf.sync.common'].sudo().get_add_time(current_time_strf)
current_time_datetime = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
@@ -39,8 +39,8 @@ class SFMessageWork(models.Model):
for message_queue_id in message_queue_ids:
if message_queue_id.message_template_id.name == '工单已下发通知':
content = message_queue_id.message_template_id.content
- mrp_workorder_line = self.env['mrp.workorder'].search([('id', '=', int(message_queue_id.res_id))])
- mrp_workorder_list = self.env['mrp.workorder'].search(
+ mrp_workorder_line = self.env['mrp.workorder'].sudo().search([('id', '=', int(message_queue_id.res_id))])
+ mrp_workorder_list = self.env['mrp.workorder'].sudo().search(
[('product_id', '=', mrp_workorder_line.product_id.id), ('state', '=', 'ready'),
('routing_type', '=', '装夹预调')])
if len(mrp_workorder_list) > 0 and mrp_workorder_line.product_id.id not in product_id:
@@ -96,10 +96,10 @@ class SFMessageWork(models.Model):
return contents
def request_url(self):
- url = self.env['ir.config_parameter'].get_param('web.base.url')
+ url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
action_id = self.env.ref('sf_message.mrp_workorder_issued_action').id
- menu_id = self.env['ir.model.data'].search([('name', '=', 'module_stock_dropshipping')]).id
- active_id = self.env['mrp.workcenter'].search([('name', '=', '工件装夹中心')]).id
+ menu_id = self.env['ir.model.data'].sudo().search([('name', '=', 'module_stock_dropshipping')]).id
+ active_id = self.env['mrp.workcenter'].sudo().search([('name', '=', '工件装夹中心')]).id
# 查询参数
params = {'menu_id': menu_id, 'action': action_id, 'model': 'mrp.workorder',
'view_type': 'list', 'active_id': active_id}
@@ -190,7 +190,7 @@ class SFMessageWork(models.Model):
('message_template_id', '=', message_template_warning.id)
])
if work_order_warning:
- logging.info('取消发送:%s' % work_order_warning.name)
+ logging.info('取消发送:%s' % work_order_warning)
work_order_warning.write({'message_status': 'cancel'})
def _recover_time_warning_func(self):
diff --git a/sf_message/security/ir.model.access.csv b/sf_message/security/ir.model.access.csv
index 05a7366c..4aa153e6 100644
--- a/sf_message/security/ir.model.access.csv
+++ b/sf_message/security/ir.model.access.csv
@@ -5,24 +5,28 @@ access_jikimo_message_template_group_purchase,jikimo_message_template,jikimo_mes
access_jikimo_message_template_group_sf_stock_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_stock_user,1,1,1,0
access_jikimo_message_template_group_sf_order_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_order_user,1,1,1,0
access_jikimo_message_template_group_sf_tool_user,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_sf_tool_user,1,1,1,0
+access_jikimo_message_template_group_purchase_director,jikimo_message_template,jikimo_message_notify.model_jikimo_message_template,sf_base.group_purchase_director,1,1,1,0
access_jikimo_message_bussiness_node_group_sale_salemanager,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sale_salemanager,1,1,1,0
access_jikimo_message_bussiness_node_group_purchase,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_purchase,1,1,1,0
access_jikimo_message_bussiness_node_group_sf_stock_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_stock_user,1,1,1,0
access_jikimo_message_bussiness_node_group_sf_order_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_order_user,1,1,1,0
access_jikimo_message_bussiness_node_group_sf_tool_user,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_sf_tool_user,1,1,1,0
+access_jikimo_message_bussiness_node_group_purchase_director,jikimo_message_bussiness_node,jikimo_message_notify.model_jikimo_message_bussiness_node,sf_base.group_purchase_director,1,1,1,0
access_jikimo_message_queue_group_sale_salemanager,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sale_salemanager,1,1,1,0
access_jikimo_message_queue_group_purchase,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_purchase,1,1,1,0
access_jikimo_message_queue_group_sf_stock_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_stock_user,1,1,1,0
access_jikimo_message_queue_group_sf_order_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_order_user,1,1,1,0
access_jikimo_message_queue_group_sf_tool_user,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_sf_tool_user,1,1,1,0
+access_jikimo_message_queue_group_purchase_director,jikimo_message_queue,jikimo_message_notify.model_jikimo_message_queue,sf_base.group_purchase_director,1,1,1,0
access_jikimo_message_reminder_time_group_sale_salemanager,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sale_salemanager,1,1,1,0
access_jikimo_message_reminder_time_group_purchase,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_purchase,1,1,1,0
access_jikimo_message_reminder_time_group_sf_stock_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_stock_user,1,1,1,0
access_jikimo_message_reminder_time_group_sf_order_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_order_user,1,1,1,0
access_jikimo_message_reminder_time_group_sf_tool_user,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_sf_tool_user,1,1,1,0
+access_jikimo_message_reminder_time_group_purchase_director,jikimo_message_reminder_time,jikimo_message_notify.model_jikimo_message_reminder_time,sf_base.group_purchase_director,1,1,1,0
diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py
index 492ef525..bdf916ce 100644
--- a/sf_plan/models/custom_plan.py
+++ b/sf_plan/models/custom_plan.py
@@ -246,26 +246,27 @@ class sf_production_plan(models.Model):
record.date_planned_finished = item.date_planned_finished
# 计算下一个cnc工单的开始时间
last_cnc_start = workorder_list[-1].date_planned_finished + timedelta(minutes=pre_duration)
- record.state = 'done'
- # record.production_id.schedule_state = '已排'
- record.sudo().production_id.schedule_state = '已排'
- record.sudo().production_id.process_state = '待装夹'
- # self.env['sale.order'].browse(record.production_id.origin).schedule_status = 'to process'
- # sale_obj = self.env['sale.order'].search([('name', '=', record.origin)])
- # if 'S' in sale_obj.name:
- # sale_obj.schedule_status = 'to process'
- mrp_production_ids = record.production_id._get_children().ids
- print('mrp_production_ids', mrp_production_ids)
- for i in mrp_production_ids:
- record.env['mrp.production'].sudo().browse(i).schedule_state = '已排'
- # record.production_id.date_planned_start = record.date_planned_start
- # record.production_id.date_planned_finished = record.date_planned_finished
- record.sudo().production_id.production_line_id = record.production_line_id.id
- if record.production_id.workorder_ids:
- record.sudo().production_id.workorder_ids.filtered(
- lambda b: b.routing_type == "装夹预调").workpiece_delivery_ids.write(
- {'production_line_id': record.production_line_id.id,
- 'plan_start_processing_time': record.date_planned_start})
+ # 没有工单也能排程
+ record.state = 'done'
+ # record.production_id.schedule_state = '已排'
+ record.sudo().production_id.schedule_state = '已排'
+ record.sudo().production_id.process_state = '待装夹'
+ # self.env['sale.order'].browse(record.production_id.origin).schedule_status = 'to process'
+ # sale_obj = self.env['sale.order'].search([('name', '=', record.origin)])
+ # if 'S' in sale_obj.name:
+ # sale_obj.schedule_status = 'to process'
+ mrp_production_ids = record.production_id._get_children().ids
+ print('mrp_production_ids', mrp_production_ids)
+ for i in mrp_production_ids:
+ record.env['mrp.production'].sudo().browse(i).schedule_state = '已排'
+ # record.production_id.date_planned_start = record.date_planned_start
+ # record.production_id.date_planned_finished = record.date_planned_finished
+ record.sudo().production_id.production_line_id = record.production_line_id.id
+ if record.production_id.workorder_ids:
+ record.sudo().production_id.workorder_ids.filtered(
+ lambda b: b.routing_type == "装夹预调").workpiece_delivery_ids.write(
+ {'production_line_id': record.production_line_id.id,
+ 'plan_start_processing_time': record.date_planned_start})
# record.date_planned_finished = record.date_planned_start + timedelta(days=3)
# record.state = 'done'
diff --git a/sf_plan/wizard/action_plan_some.py b/sf_plan/wizard/action_plan_some.py
index 1c08ff0f..86b3f1ac 100644
--- a/sf_plan/wizard/action_plan_some.py
+++ b/sf_plan/wizard/action_plan_some.py
@@ -37,52 +37,4 @@ class Action_Plan_All_Wizard(models.TransientModel):
# 判断能否排成
self.plan_ids.deal_processing_schedule(self.date_planned_start)
self.plan_ids.do_production_schedule()
- # for plan in temp_plan_ids:
- # # 处理每个计划
- # # 比如更新计划状态、分配资源等
- # # 示例:plan.state = 'scheduled'
- # print('处理计划:', plan.id)
- # # 拿到计划对象
- # plan_obj = self.env['sf.production.plan'].browse(plan.id)
- # plan_obj.production_line_id = self.production_line_id.id
- # plan.date_planned_start = self.date_planned_start
- # plan_obj.do_production_schedule()
- # plan_obj.state = 'done'
_logger.info('处理计划: %s 完成', self.plan_ids.ids)
-
- # # 获取当前生产线
- # production_line_id = self.production_line_id
- # # 获取当前生产线的所有生产订单
- # production_order_ids = self.env['mrp.production'].search([('production_line_id', '=', production_line_id.id)])
- # # 获取当前生产线的所有生产订单的id
- # production_order_id_list = []
- # for production_order_id in production_order_ids:
- # production_order_id_list.append(production_order_id.id)
- # # 获取当前生产线的所有生产订单的排程状态
- # production_order_plan_state_list = []
- # for production_order_id in production_order_ids:
- # production_order_plan_state_list.append(production_order_id.plan_state)
- # # 如果当前生产线的所有生产订单的排程状态都是已排程,则报错
- # if all(production_order_plan_state == '已排程' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已排程,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是未排程,则报错
- # if all(production_order_plan_state == '未排程' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都未排程,请先排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已完成,则报错
- # if all(production_order_plan_state == '已完成' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已完成,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已取消,则报错
- # if all(production_order_plan_state == '已取消' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已取消,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已暂停,则报错
- # if all(production_order_plan_state == '已暂停' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已暂停,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已完成,则报错
- # if all(production_order_plan_state == '已完成' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已完成,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已取消,则报错
- # if all(production_order_plan_state == '已取消' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已取消,请勿重复排程!')
- # # 如果当前生产线的所有生产订单的排程状态都是已暂停,则报错
- # if all(production_order_plan_state == '已暂停' for production_order_plan_state in production_order_plan_state_list):
- # raise UserError('当前生产线的所有生产订单都已暂停,请勿重复排程!')
diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py
index b1151b6d..582e306a 100644
--- a/sf_quality/__manifest__.py
+++ b/sf_quality/__manifest__.py
@@ -13,7 +13,7 @@
'author': 'jikimo',
'website': 'https://sf.cs.jikimo.com',
# 此处依赖sf_manufacturing是因为我要重写其中的一个字段operation_id的string,故需要sf_manufacturing先安装
- 'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing'],
+ 'depends': ['quality_control', 'web_widget_model_viewer', 'sf_manufacturing','jikimo_attachment_viewer'],
'data': [
'security/ir.model.access.csv',
'views/view.xml',
diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py
index 48e76765..6a9ac067 100644
--- a/sf_sale/models/quick_easy_order_old.py
+++ b/sf_sale/models/quick_easy_order_old.py
@@ -220,7 +220,14 @@ class QuickEasyOrder(models.Model):
'total_amount': item.price,
'remark': '',
'manual_quotation': True,
- 'barcode': barcode
+ 'barcode': barcode,
+ 'part_number': item.part_drawing_number,
+ 'machining_drawings_name': '',
+ 'quality_standard_name': '',
+ 'machining_drawings_mimetype': '',
+ 'quality_standard_mimetype': '',
+ 'machining_drawings': item.machining_drawings,
+ 'quality_standard': '',
})
# res['bfm_process_order_list'] = json.dumps(res['bfm_process_order_list'])
product_id = self.env.ref('sf_dlm.product_template_sf').sudo()
diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py
index acd1d60c..53f73aef 100644
--- a/sf_sale/models/sale_order.py
+++ b/sf_sale/models/sale_order.py
@@ -118,12 +118,16 @@ class ReSaleOrder(models.Model):
# 业务平台分配工厂时在创建完产品后再创建销售明细信息
def sale_order_create_line(self, product, item):
+ machining_accuracy_name = ''
+ if product.model_machining_precision:
+ machining_accuracy_name = self.env['sf.machining.accuracy'].sudo().search(
+ [('sync_id', '=', product.model_machining_precision)]).name
vals = {
'order_id': self.id,
'product_id': product.id,
- 'name': '%s/%s/%s/%s/±%s/%s' % (
+ 'name': '%s/%s/%s/%s/%s/%s' % (
product.model_long, product.model_width, product.model_height, product.model_volume,
- product.model_machining_precision,
+ machining_accuracy_name,
product.materials_id.name),
'price_unit': product.list_price,
'product_uom_qty': item['number'],
diff --git a/sf_sale/views/quick_easy_order_view.xml b/sf_sale/views/quick_easy_order_view.xml
index 22c342f2..3b386062 100644
--- a/sf_sale/views/quick_easy_order_view.xml
+++ b/sf_sale/views/quick_easy_order_view.xml
@@ -80,8 +80,8 @@
-
-
+
+
diff --git a/sf_tool_management/models/mrp_workorder.py b/sf_tool_management/models/mrp_workorder.py
index 267dbe60..8fe9748e 100644
--- a/sf_tool_management/models/mrp_workorder.py
+++ b/sf_tool_management/models/mrp_workorder.py
@@ -200,6 +200,8 @@ class MrpProduction(models.Model):
self[0].write({'is_rework': False})
# 修改制造订单 编程状态变为“编程中” 制造订单状态为‘返工’
self.write({'programming_state': '编程中', 'work_state': '编程中', 'state': 'rework'})
+ self[0].workorder_ids.filtered(
+ lambda a: a.name == '装夹预调' and a.state not in ['rework', 'done', 'cancel'])._compute_state()
if missing_tool_1:
logging.info(f'线边、机内缺刀:{missing_tool_1}')
# 修改 修改cnc程序的‘刀具状态’ 为 ‘缺刀’