diff --git a/sf_machine_connect/models/ftp_client.py b/sf_machine_connect/models/ftp_client.py index cc4d60e2..d1295217 100644 --- a/sf_machine_connect/models/ftp_client.py +++ b/sf_machine_connect/models/ftp_client.py @@ -1,22 +1,21 @@ # -*- coding: utf-8 -*- -import base64 -import logging import os -import json -import hashlib import time -import requests -from datetime import datetime, timedelta -from odoo.http import request -from odoo import fields, models, api, _ -from odoo.exceptions import ValidationError -from odoo.exceptions import UserError -from odoo.addons.sf_machine_connect.models import py2opcua, ftp_operate - +import json +import base64 import shutil +import logging +import hashlib from io import BytesIO from zipfile import ZipFile +from datetime import datetime, timedelta +import requests +from odoo.http import request +from odoo import fields, models, api, _ +from odoo.exceptions import UserError from odoo.exceptions import MissingError +from odoo.exceptions import ValidationError +from odoo.addons.sf_machine_connect.models import py2opcua, ftp_operate _logger = logging.getLogger(__name__) @@ -514,7 +513,6 @@ class WorkCenterBarcode(models.Model): print('111111111111111111111') workorder_obj_target = self.env['mrp.workorder'].sudo().search([('tray_code', '=', barcode)]) workorder_obj_current = self.env['mrp.workorder'].sudo().search([('id', '=', kwargs['current_id'])]) - # workorder_cnc = self.env['mrp.workorder'].sudo().search(['&', ('production_id', '=', workorder_obj.production_id.id), ('name', '=', 'CNC加工')]) workorder_cnc = self.env['mrp.workorder'].sudo().search( ['&', ('production_id', '=', workorder_obj_target.production_id.id), ('name', '=', workorder_obj_current.name)]) diff --git a/sf_machine_connect/models/ftp_operate.py b/sf_machine_connect/models/ftp_operate.py index 277851ff..a94824f2 100644 --- a/sf_machine_connect/models/ftp_operate.py +++ b/sf_machine_connect/models/ftp_operate.py @@ -49,7 +49,6 @@ class FtpController: self.port = port self.username = username self.password = password - # _logger.info("===================ftppppp==================%s,%s,%s,%s" % self.host, self.port, self.username, self.password) # 测试 print("==============================================") print(self.username, self.port, self.host, self.password) diff --git a/sf_machine_connect/models/res_config_setting.py b/sf_machine_connect/models/res_config_setting.py index bab85379..c8257bf8 100644 --- a/sf_machine_connect/models/res_config_setting.py +++ b/sf_machine_connect/models/res_config_setting.py @@ -33,4 +33,3 @@ class ResBFMConfigSettings(models.TransientModel): super(ResBFMConfigSettings, self).set_values() ir_config = self.env['ir.config_parameter'].sudo() ir_config.set_param("bfm_url", self.bfm_url or "") - diff --git a/sf_machine_connect/static/src/js/barcode_button.js b/sf_machine_connect/static/src/js/barcode_button.js index c6554598..a050b35a 100644 --- a/sf_machine_connect/static/src/js/barcode_button.js +++ b/sf_machine_connect/static/src/js/barcode_button.js @@ -1,29 +1,23 @@ /** @odoo-module **/ import { browser } from "@web/core/browser/browser"; -import { Dialog } from "@web/core/dialog/dialog"; -import { _lt } from "@web/core/l10n/translation"; -import { useChildRef, useOwnedDialogs, useService } from "@web/core/utils/hooks"; -import { sprintf } from "@web/core/utils/strings"; -import { isMobileOS } from "@web/core/browser/feature_detection"; import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; -const { useRef } = owl; -const {xml, Component} = owl; +const { Component } = owl; import { standardFieldProps } from "@web/views/fields/standard_field_props"; import {registry} from "@web/core/registry"; import {useInputField} from "@web/views/fields/input_field_hook"; export class CodeField extends Component { setup() { - console.log('CodeField created') - console.log('this',this) - console.log('this.props',this.props) - console.log('this.props.record',this.props.value) + // console.log('CodeField created') + // console.log('this',this) + // console.log('this.props',this.props) + // console.log('this.props.record',this.props.value) useInputField({ getValue: () => this.props.value, refName: "scan_code", }); - console.log('我是setup1') + // console.log('我是setup1') super.setup(); this.orm = this.env.services.orm; this.record = this.props.record; @@ -45,12 +39,12 @@ export class CodeField extends Component { async search(barcode) { // alert('我是search') const domain = [["code", "=", barcode]]; - console.log(domain) + // console.log(domain) const fields = ["id", "code", "name", "state"]; - console.log(fields) + // console.log(fields) const results = await this.orm.call("sf.tray", "search_read", [domain, fields]); const values = await this.orm.call("sf.tray", "search_read", [domain]); - console.log(results) + // console.log(results) return results.map((result) => { return { id: result.id, @@ -63,16 +57,16 @@ export class CodeField extends Component { } async onBarcodeScanned(barcode) { const results = await this.search(barcode); - console.log(results) + // console.log(results) const records = results.filter((r) => !!r.id); - console.log(records) + // console.log(records) if (records.length === 1) { if (records[0].state === '空闲') { - console.log('currentModel',this) - console.log('this.record.data',this.record.data) - console.log('this.record.data.id', this.record.data.id) + // console.log('currentModel',this) + // console.log('this.record.data',this.record.data) + // console.log('this.record.data.id', this.record.data.id) const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]); - console.log('workorder', workorder[0]) + // console.log('workorder', workorder[0]) const updatedRecord = await this.orm.call("sf.tray", "write", [ [records[0].id], { @@ -81,31 +75,32 @@ export class CodeField extends Component { production_id: workorder[0].product_id[0], // workorder_id: workorder.id, }]); - console.log(workorder[0].routing_type); - console.log(workorder[0].production_id); + // console.log(workorder[0].routing_type); + // console.log(workorder[0].production_id); // const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]); const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]); - console.log('prooooooo', productionIDS); - console.log('values', records[0].values[0]); + // console.log('prooooooo', productionIDS); + // console.log('values', records[0].values[0]); productionIDS.forEach(async (data) => { // 处理每一个数据 - console.log(data); + // console.log(data); const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [ [data], { tray_id: records[0].values[0].id, // tray_id: false, }]); - console.log(updatetrayRecord) + // console.log(updatetrayRecord) }); this.props.update(records[0].code); $('.o_form_button_save').click(); } else { if (records[0].state === '占用') { - console.log('此托盘已占用,请检查') + // console.log('此托盘已占用,请检查') alert('此托盘已占用,请检查') } else { - console.log('此托盘已损坏,请登记') + // console.log('此托盘已损坏,请登记') + alert('此托盘已损坏,请登记') } } diff --git a/sf_machine_connect/static/src/js/barcode_handler_field.js b/sf_machine_connect/static/src/js/barcode_handler_field.js index 020cc5d4..6d24d4c6 100644 --- a/sf_machine_connect/static/src/js/barcode_handler_field.js +++ b/sf_machine_connect/static/src/js/barcode_handler_field.js @@ -8,10 +8,7 @@ const { Component, xml } = owl; export class BarcodeHandlerField extends Component { setup() { - console.log('99999999111'); this.actionService = useService("action") - console.log(this.actionService) - const barcode = useService("barcode"); // this.rpc = useService("rpc"); // useBus(barcode.bus, "barcode_scanned", this.onBarcodeScanned.bind(this)); @@ -20,9 +17,6 @@ export class BarcodeHandlerField extends Component { async _rpc(params) { // const { data } = await this.env.services.rpc('/web/dataset/call_kw', params); const response = await this.env.services.rpc('/web/dataset/call_kw', params); - console.log('response', response); - console.log('response.result', response.result); - // return response const responseObject = JSON.parse(response) return responseObject; @@ -33,8 +27,6 @@ export class BarcodeHandlerField extends Component { this.props.update(barcode); // const actionService = useService("action"); // const productId = 12345 - console.log('111222222222211111'); - // 根据条形码获取相关数据,例如产品ID const response = await this._rpc({ model: 'mrp.workorder', @@ -42,11 +34,10 @@ export class BarcodeHandlerField extends Component { args: [barcode], kwargs:{}, }); - // console.log(productId.result) if (response.result) { - const action = response.result; - console.log(action) - console.log('11111111111111111111111111111111111'); + // const action = response.result; + // console.log(action) + // console.log('11111111111111111111111111111111111'); // 通过产品ID执行操作并跳转到表单视图 // await this.actionService.doAction({ // // type: 'ir.actions.act_window', diff --git a/sf_machine_connect/wizard/__init__.py b/sf_machine_connect/wizard/__init__.py index 5faba653..e84f085d 100644 --- a/sf_machine_connect/wizard/__init__.py +++ b/sf_machine_connect/wizard/__init__.py @@ -1 +1 @@ -from . import action_up \ No newline at end of file +from . import action_up diff --git a/sf_machine_connect/wizard/action_up.py b/sf_machine_connect/wizard/action_up.py index ef4f860c..ffcb88ad 100644 --- a/sf_machine_connect/wizard/action_up.py +++ b/sf_machine_connect/wizard/action_up.py @@ -5,9 +5,8 @@ import os import json import hashlib import time -import requests from datetime import datetime - +import requests from odoo import fields, models, api, _ from odoo.exceptions import ValidationError from odoo.exceptions import UserError diff --git a/sf_manufacturing/static/src/js/kanban_change.js b/sf_manufacturing/static/src/js/kanban_change.js index 2ef6cb4b..1f25caf4 100644 --- a/sf_manufacturing/static/src/js/kanban_change.js +++ b/sf_manufacturing/static/src/js/kanban_change.js @@ -16,12 +16,12 @@ class CustomKanbanController extends KanbanController { console.log('99999999111'); this.workOrders = await this.getAllWorkOrders(); this.workOrdersNew = this.workOrders; - console.log('lines222222222', this.workOrders); - - console.log(typeof this.workOrders); - console.log(Array.isArray(this.workOrders)); - - console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined)); + // console.log('lines222222222', this.workOrders); + // + // console.log(typeof this.workOrders); + // console.log(Array.isArray(this.workOrders)); + // + // console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined)); diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index fa42d270..df1903c4 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import base64 -import json, requests -from odoo import models, fields, api, _ +import json +import requests from datetime import datetime, timedelta +from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError @@ -41,22 +42,13 @@ class sf_production_plan(models.Model): actual_end_time = fields.Datetime(string='实际结束时间') shift = fields.Char(string='班次') - # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 + # 序号、坯料编号、坯料名称、材质、数量、长度、宽度、厚度、直径、计划开始时间、计划结束时间、状态(已产出与待产出)、操作、创建人、创建时间、 + # 客户名称、订单号、行号、长度、宽度、厚度、直径、交货数量、交货日期 # sequence = fields.Integer(string='序号', required=True, copy=False, readonly=True, index=True, # default=lambda self: self.env['ir.sequence'].sudo().next_by_code('sf.pl.plan')) sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True) current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划') - # state = fields.Selection([ - # ('未排程', '未排程'), ('已排程', '已排程')], string='State', copy=False, index=True, readonly=True, - # store=True, tracking=True) - - # orderpoint_id = fields.Many2one('stock.warehouse.orderpoint', compute='_compute_orderpoint_id') - # location_src_id = fields.Many2one('stock.location', 'Components Location', compute='_compute_orderpoint_id', active=False) - # location_dest_id = fields.Many2one('stock.location', 'Finished Products Location', compute='_compute_orderpoint_id') - # picking_type_id = fields.Many2one('stock.picking.type', 'Operation Type', compute='_compute_orderpoint_id') - # move_dest_ids = fields.One2many('stock.move', 'created_production_id', compute='_compute_orderpoint_id') - @api.model def get_import_templates(self): """returns the xlsx import template file""" @@ -135,112 +127,6 @@ class sf_production_plan(models.Model): return num - # pl_no = fields.Char(string='坯料编号', required=True, default=_get_pl_no, readonly=True) - # pl_name = fields.Char(string='坯料名称', size=64, required=True) - # material = fields.Many2one('sf.production.materials', string='材质', required=True) - # quantity = fields.Float(string='数量', required=True) - # length = fields.Float(string='长度', required=True) - # width = fields.Float(string='宽度', required=True) - # thickness = fields.Float(string='厚度', required=True) - # diameter = fields.Float(string='直径', required=True) - # plan_start_time = fields.Datetime(string='计划开始时间') - # plan_end_time = fields.Datetime(string='计划结束时间') - # state = fields.Selection([ - # ('draft', '待排程'), - # ('produce', '已排程'), - # ('done', '已产出'), - # ], string='状态', copy=False, index=True, default='draft') - # customer_name = fields.Char(string='客户名称', size=64) - # order_no = fields.Char(string='订单号', size=64) - # line_no = fields.Char(string='行号', size=64) - # delivery_length = fields.Float(string='交货长度') - # delivery_width = fields.Float(string='交货宽度') - # delivery_thickness = fields.Float(string='交货厚度') - # delivery_diameter = fields.Float(string='交货直径') - # delivery_quantity = fields.Float(string='交货数量') - # delivery_date = fields.Datetime(string='交货日期', related='plan_end_time', readonly=False, store=True) - - # 当不设置计划结束时间时,增加计算计划结束时间的方法,根据采购周期加缓冲期两个值来算就可以了 - # def do_production_schedule(self): - # """ - # 排程方法 - # """ - # if not self.production_line_id: - # raise ValidationError("未选择生产线") - # else: - # aa = self.env['mrp.production'].sudo().search([('name', '=', self.name)]) - # workorder_time = 0 - # workorder_id_list = self.production_id.workorder_ids.ids - # print(workorder_id_list) - # print(type(self.production_id.workorder_ids)) - # if self.production_id.workorder_ids: - # for item in self.production_id.workorder_ids: - # if item.name == 'CNC加工': - # item.date_planned_start = self.date_planned_start - # item.date_planned_finished = item.date_planned_start + timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', 'CNC加工')]).time_cycle) - # item.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', 'CNC加工')]).time_cycle - # # print(item.id) - # sequence = workorder_id_list.index(item.id) - 1 - # # print('sequence', sequence) - # # print('total', len(workorder_id_list)) - # # 计算CNC加工之前工单的开始结束时间 - # for i in range(sequence): - # current_workorder_id = (item.id - (i + 1)) - # current_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', current_workorder_id)]) - # old_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', (current_workorder_id + 1))]) - # work_order = self.env['mrp.workorder'].sudo().search( - # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) - # work_order.date_planned_finished = old_workorder_obj.date_planned_start - # work_order.date_planned_start = old_workorder_obj.date_planned_start - timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle) - # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle - # # 计算CNC加工之后工单的开始结束时间 - # for j in range(len(workorder_id_list) - sequence - 2): - # current_workorder_id = (item.id + (j + 1)) - # current_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', current_workorder_id)]) - # old_workorder_obj = self.env['mrp.workorder'].sudo().search( - # [('id', '=', (current_workorder_id - 1))]) - # work_order = self.env['mrp.workorder'].sudo().search( - # [('production_id', '=', self.production_id.id), ('id', '=', current_workorder_id)]) - # try: - # work_order.date_planned_start = old_workorder_obj.date_planned_finished - # print('work_order.data_start', work_order.date_planned_start) - # work_order.date_planned_finished = old_workorder_obj.date_planned_finished + timedelta( - # minutes=self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle) - # work_order.duration_expected = self.env['mrp.routing.workcenter'].sudo().search( - # [('name', '=', current_workorder_obj.name)]).time_cycle - # except ValueError as e: - # print('时间设置失败,请检查是否为工序分配工作中心,%s' % e) - # - # current_workorder = self.env['mrp.workorder'].sudo().search([('id', '=', item.id)]) - # workorder_time += current_workorder.duration_expected - # print('workorder_time', workorder_time) - # self.date_planned_finished = self.date_planned_start + timedelta(minutes=workorder_time) - # self.state = 'done' - # self.production_id.schedule_state = '已排' - # # self.production_id.date_planned_start = self.date_planned_start - # # self.production_id.date_planned_finished = self.date_planned_finished - # else: - # raise ValidationError("未找到工单") - # # self.date_planned_finished = self.date_planned_start + timedelta(days=3) - # # self.state = 'done' - # return { - # 'name': '排程甘特图', - # 'type': 'ir.actions.act_window', - # 'res_model': 'sf.production.plan', # 要跳转的模型名称 - # 'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 - # 'target': 'current', # 跳转的目标窗口,可以是'current'或'new' - # } - def do_production_schedule(self): """ 排程方法 @@ -261,7 +147,8 @@ class sf_production_plan(models.Model): [('name', '=', 'CNC加工')]).time_cycle self.calculate_plan_time_before(item, workorder_id_list) self.calculate_plan_time_after(item, workorder_id_list) - self.date_planned_start, self.date_planned_finished = item.date_planned_start, item.date_planned_finished + self.date_planned_start, self.date_planned_finished = \ + item.date_planned_start, item.date_planned_finished self.state = 'done' self.production_id.schedule_state = '已排' # self.production_id.date_planned_start = self.date_planned_start @@ -274,7 +161,8 @@ class sf_production_plan(models.Model): 'name': '排程甘特图', 'type': 'ir.actions.act_window', 'res_model': 'sf.production.plan', # 要跳转的模型名称 - 'view_mode': 'gantt,tree,form', # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 + # 要显示的视图类型,可以是'form', 'tree', 'kanban', 'graph', 'calendar', 'pivot'等 + 'view_mode': 'gantt,tree,form', 'target': 'current', # 跳转的目标窗口,可以是'current'或'new' } @@ -348,7 +236,6 @@ class sf_production_plan(models.Model): 'bfm_process_order_list': []} aa = self.env['ir.attachment'].search([('id', '=', 631)]) temp = self.env['product.template'].search([('id', '=', 47)]) - item = aa.datas.decode('utf-8') val = { 'model_long': 3, 'model_width': 1, diff --git a/sf_plan_management/__manifest__.py b/sf_plan_management/__manifest__.py index 66f1b72d..138399e9 100644 --- a/sf_plan_management/__manifest__.py +++ b/sf_plan_management/__manifest__.py @@ -24,10 +24,9 @@ 'web.assets_qweb': [ ], - 'web.assets_backend':[ + 'web.assets_backend': [ ] - }, 'license': 'LGPL-3', 'installable': True,