diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 84ee9f46..6319c050 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -388,7 +388,7 @@ class Manufacturing_Connect(http.Controller): ret = json.loads(datas) request.env['center_control.interface.log'].sudo().create( {'content': ret, 'name': 'AutoDeviceApi/LocationChange'}) - logging.info('LocationChange_ret===========:%s' % ret) + logging.info('库位变更LocationChange_ret:%s' % ret) RfidCode = ret['RfidCode'] ChangeType = ret['ChangeType'] OldDeciveId = ret['OldDeciveId'] @@ -398,34 +398,79 @@ class Manufacturing_Connect(http.Controller): OldDeciveStart = ret['OldDeciveStart'] OldDeciveEnd = ret['OldDeciveEnd'] - temp_val_sn_id = None - old_localtion = None - # if ChangeType == 'Part' or ChangeType == 'Tool': - stock_lot_obj = request.env['stock.lot'].sudo().search( - [('rfid', '=', RfidCode)], limit=1) - logging.info('stock_lot_obj===========:%s' % stock_lot_obj) - if not stock_lot_obj: - res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该产品'} - return json.JSONEncoder().encode(res) - if OldPosition: - old_localtion = request.env['sf.shelf.location'].sudo().search( - [('barcode', '=', OldPosition)], limit=1) - logging.info('old_localtion===========:%s' % old_localtion) - new_localtion = request.env['sf.shelf.location'].sudo().search( - [('barcode', '=', NewPosition)], limit=1) - logging.info('new_localtion===========:%s' % new_localtion) - if not new_localtion: - res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'} - return json.JSONEncoder().encode(res) - if old_localtion: - temp_val_sn_id = old_localtion.product_sn_id - logging.info('temp_val_sn_id===========:%s' % temp_val_sn_id) - old_localtion.product_sn_id = None - new_localtion.product_sn_id = temp_val_sn_id - logging.info('====1======') - else: - new_localtion.product_sn_id = stock_lot_obj.id - logging.info('=====2======') + if ChangeType == 'Part': + temp_val_sn_id = None + old_localtion = None + # if ChangeType == 'Part' or ChangeType == 'Tool': + stock_lot_obj = request.env['stock.lot'].sudo().search( + [('rfid', '=', RfidCode)], limit=1) + logging.info('stock_lot_obj===========:%s' % stock_lot_obj) + if not stock_lot_obj: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该产品'} + return json.JSONEncoder().encode(res) + if OldPosition: + old_localtion = request.env['sf.shelf.location'].sudo().search( + [('barcode', '=', OldPosition)], limit=1) + logging.info('old_localtion===========:%s' % old_localtion) + new_localtion = request.env['sf.shelf.location'].sudo().search( + [('barcode', '=', NewPosition)], limit=1) + logging.info('new_localtion===========:%s' % new_localtion) + if not new_localtion: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'} + return json.JSONEncoder().encode(res) + if old_localtion: + temp_val_sn_id = old_localtion.product_sn_id + logging.info('temp_val_sn_id===========:%s' % temp_val_sn_id) + old_localtion.product_sn_id = None + new_localtion.product_sn_id = temp_val_sn_id + logging.info('====1======') + else: + new_localtion.product_sn_id = stock_lot_obj.id + logging.info('=====2======') + elif ChangeType == 'Tool': + # 对功能刀具库位变更信息进行更改 + def write_tool(DeciveId): + if 'Tool' in DeciveId: + shelfinfo = list(filter(lambda x: x.get('DeviceId') == DeciveId, + request.env['sf.shelf.location'].sudo().get_sf_shelf_location_info( + DeciveId))) + total_data = request.env['sf.shelf.location.datasync'].sudo().get_total_data() + for item in shelfinfo: + shelf_barcode = request.env['sf.shelf.location.datasync'].sudo().find_our_code( + total_data, item['Postion']) + location_id = request.env['sf.shelf.location'].sudo().search( + [('barcode', '=', shelf_barcode)], + limit=1) + if location_id: + # 如果是线边刀库信息,则对功能刀具移动生成记录 + if 'Tool' in item['Postion']: + tool = request.env['sf.functional.cutting.tool.entity'].sudo().search( + [('rfid', '=', item['RfidCode']), ('functional_tool_status', '!=', '已拆除')]) + tool.sudo().tool_in_out_stock_location(location_id) + if tool: + location_id.product_sn_id = tool.barcode_id.id + # 修改功能刀具状态 + tool_state = {'Nomal': '正常', 'Warning': '报警'} + if tool_state.get(item.get('State')): + if tool_state.get(item.get('State')) != tool.functional_tool_status: + tool.write({ + 'functional_tool_status': tool_state.get(item['State']) + }) + else: + location_id.product_sn_id = False + logging.info('货架已获取信息:%s' % item) + else: + equipment_id = request.env['maintenance.equipment'].sudo().search([('name', '=', DeciveId)]) + if equipment_id: + equipment_id.sudo().register_equipment_tool() + else: + res_1 = {'Succeed': False, 'ErrorCode': 202, 'Error': f'设备【{DeciveId}】不存在'} + return json.JSONEncoder().encode(res_1) + + if OldDeciveId: + write_tool(OldDeciveId) + elif NewDeciveId: + write_tool(NewDeciveId) except Exception as e: res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('LocationChange error:%s' % e) diff --git a/sf_sale/__manifest__.py b/sf_sale/__manifest__.py index efe72de6..45c95030 100644 --- a/sf_sale/__manifest__.py +++ b/sf_sale/__manifest__.py @@ -20,7 +20,8 @@ 'views/sale_order_view.xml', 'views/res_partner_view.xml', 'views/purchase_order_view.xml', - 'views/quick_easy_order_view.xml' + 'views/quick_easy_order_view.xml', + 'views/purchase_menu.xml' ], 'assets': { 'web.assets_backend': [ diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index a4027a47..348d6c79 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -13,6 +13,11 @@ READONLY_FIELD_STATES = { class ReSaleOrder(models.Model): _inherit = 'sale.order' + mrp_production_count = fields.Integer( + "Count of MO generated", + compute='_compute_mrp_production_ids', + groups='mrp.group_mrp_user,sf_base.group_sale_salemanager,sf_base.group_sale_director') + logistics_way = fields.Selection([('自提', '自提'), ('到付', '到付'), ('在线支付', '在线支付')], string='物流方式') state = fields.Selection( selection=[ diff --git a/sf_sale/security/ir.model.access.csv b/sf_sale/security/ir.model.access.csv index 0e2f0684..0747340c 100644 --- a/sf_sale/security/ir.model.access.csv +++ b/sf_sale/security/ir.model.access.csv @@ -96,5 +96,28 @@ access_product_supplierinfo_group_plan_director,product.supplierinfo user,produc access_product_category_group_plan_director,product.category user,product.model_product_category,sf_base.group_plan_director,1,1,1,0 +access_purchase_report_sf_base_group_purchase,purchase_report_sf_base_group_purchase,purchase.model_purchase_report,sf_base.group_purchase,1,0,0,0 +access_purchase_report_sf_base_group_purchase_director,purchase_report_sf_base_group_purchase_director,purchase.model_purchase_report,sf_base.group_purchase_director,1,0,0,0 +access_sale_order_sf_base_group_purchase,sale_order_sf_base_group_purchase,model_sale_order,sf_base.group_purchase,1,0,0,0 +access_sale_order_sf_base_group_purchase_director,sale_order_sf_base_group_purchase_director,model_sale_order,sf_base.group_purchase_director,1,0,0,0 + + +access_quality_check_group_sale_salemanager,quality_check_group_sale_salemanager,quality.model_quality_check,sf_base.group_sale_salemanager,1,0,0,0 +access_quality_check_group_sale_director,quality_check_group_sale_director,quality.model_quality_check,sf_base.group_sale_director,1,0,0,0 +access_stock_picking_group_sale_salemanager,stock_picking_group_sale_salemanager,stock.model_stock_picking,sf_base.group_sale_salemanager,1,0,0,0 +access_stock_picking_group_sale_director,stock_picking_group_sale_director,stock.model_stock_picking,sf_base.group_sale_director,1,0,0,0 +access_mrp_workorder_group_sale_salemanager,mrp_workorder_group_sale_salemanager,mrp.model_mrp_workorder,sf_base.group_sale_salemanager,1,0,0,0 +access_mrp_workorder_group_sale_director,mrp_workorder_group_sale_director,mrp.model_mrp_workorder,sf_base.group_sale_director,1,0,0,0 +access_mrp_unbuild_group_sale_salemanager,mrp_unbuild_group_sale_salemanager,mrp.model_mrp_unbuild,sf_base.group_sale_salemanager,1,0,0,0 +access_mrp_unbuild_group_sale_director,mrp_unbuild_group_sale_director,mrp.model_mrp_unbuild,sf_base.group_sale_director,1,0,0,0 +access_mrp_workcenter_productivity_group_sale_salemanager,mrp_workcenter_productivity_group_sale_salemanager,mrp.model_mrp_workcenter_productivity,sf_base.group_sale_salemanager,1,0,0,0 +access_mrp_workcenter_productivity_group_sale_director,mrp_workcenter_productivity_group_sale_director,mrp.model_mrp_workcenter_productivity,sf_base.group_sale_director,1,0,0,0 +access_sf_detection_result_group_sale_salemanager,sf_detection_result_group_sale_salemanager,sf_manufacturing.model_sf_detection_result,sf_base.group_sale_salemanager,1,0,0,0 +access_sf_detection_result_group_sale_director,sf_detection_result_group_sale_director,sf_manufacturing.model_sf_detection_result,sf_base.group_sale_director,1,0,0,0 +access_stock_scrap_group_sale_salemanager,stock_scrap_group_sale_salemanager,stock.model_stock_scrap,sf_base.group_sale_salemanager,1,0,0,0 +access_stock_scrap_group_sale_director,stock_scrap_group_sale_director,stock.model_stock_scrap,sf_base.group_sale_director,1,0,0,0 + + + diff --git a/sf_sale/views/purchase_menu.xml b/sf_sale/views/purchase_menu.xml new file mode 100644 index 00000000..3b92ca4b --- /dev/null +++ b/sf_sale/views/purchase_menu.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml index eda8e59d..a45d8049 100644 --- a/sf_sale/views/purchase_order_view.xml +++ b/sf_sale/views/purchase_order_view.xml @@ -86,6 +86,18 @@ + + + + {'readonly': [('state', 'in', ['purchase'])]} diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index 00cca206..ce27a4df 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -6,6 +6,13 @@ sale.order + + sf_base.group_sale_salemanager,sf_base.group_sale_director + + + mrp.group_mrp_user,sf_base.group_sale_salemanager,sf_base.group_sale_director + + @@ -35,12 +42,12 @@