master-sf1.0
This commit is contained in:
3
sf_mrs_connect/__init__.py
Normal file
3
sf_mrs_connect/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from . import controllers
|
||||
from . import models
|
||||
|
||||
25
sf_mrs_connect/__manifest__.py
Normal file
25
sf_mrs_connect/__manifest__.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
{
|
||||
'name': '机企猫智能工厂 对接制造资源库 ',
|
||||
'version': '1.0',
|
||||
'summary': '智能工厂连接制造资源库模块',
|
||||
'sequence': 1,
|
||||
'description': """
|
||||
在本模块,智能工厂连接制造资源库
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.cs.jikimo.com',
|
||||
'depends': ['sf_base', 'base_setup'],
|
||||
'data': [
|
||||
'data/ir_cron_data.xml',
|
||||
'views/res_config_settings_views.xml'
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
'qweb': [
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
1
sf_mrs_connect/controllers/__init__.py
Normal file
1
sf_mrs_connect/controllers/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import controllers
|
||||
52
sf_mrs_connect/controllers/controllers.py
Normal file
52
sf_mrs_connect/controllers/controllers.py
Normal file
@@ -0,0 +1,52 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import json
|
||||
import base64
|
||||
import logging
|
||||
import os
|
||||
from datetime import date, timedelta
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class Sf_Mrs_Connect(http.Controller):
|
||||
|
||||
@http.route('/api/cnc_processing/create', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||
cors="*")
|
||||
def get_cnc_processing_create(self, **kw):
|
||||
"""
|
||||
获取mrs下发的编程单
|
||||
:param kw:
|
||||
:return:
|
||||
"""
|
||||
logging.info('get_cnc_processing_create:%s' % kw)
|
||||
try:
|
||||
res = {'status': 1, 'message': '成功'}
|
||||
datas = request.httprequest.data
|
||||
ret = json.loads(datas)
|
||||
ret = json.loads(ret['result'])
|
||||
# 查询状态为进行中且类型为获取CNC加工程序的工单
|
||||
cnc_workorder = request.env['mrp.workorder'].with_user(
|
||||
request.env.ref("base.user_admin")).search([('production_id.name', '=', ret['production_order_no']),
|
||||
('routing_type', '=', '获取CNC加工程序'),
|
||||
('state', '=', 'progress')])
|
||||
if cnc_workorder:
|
||||
# 拉取所有加工面的程序文件
|
||||
# i = 1
|
||||
for r in ret['processing_panel']:
|
||||
download_state = request.env['sf.cnc.processing'].with_user(
|
||||
request.env.ref("base.user_admin")).download_file_tmp(
|
||||
ret['folder_name'], r)
|
||||
if download_state == False:
|
||||
res['status'] = -2
|
||||
res['message'] = '制造订单号为%s的CNC程序文件从FTP拉取失败' % (cnc_workorder.production_id.name)
|
||||
return json.JSONEncoder().encode(res)
|
||||
request.env['sf.cnc.processing'].with_user(
|
||||
request.env.ref("base.user_admin")).cnc_processing_create(cnc_workorder, ret)
|
||||
return json.JSONEncoder().encode(res)
|
||||
else:
|
||||
res = {'status': 0, 'message': '该制造订单暂未开始'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
except Exception as e:
|
||||
res = {'status': -1, 'message': '系统解析失败'}
|
||||
logging.info('get_cnc_processing_create error:%s' % e)
|
||||
return json.JSONEncoder().encode(res)
|
||||
134
sf_mrs_connect/data/ir_cron_data.xml
Normal file
134
sf_mrs_connect/data/ir_cron_data.xml
Normal file
@@ -0,0 +1,134 @@
|
||||
<?xml version="1.0" encoding='UTF-8'?>
|
||||
<odoo>
|
||||
<record model="ir.cron" id="sf_cron1">
|
||||
<field name="name">同步资源库材料</field>
|
||||
<field name="model_id" ref="model_sf_production_materials"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_production_materials()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron2">
|
||||
<field name="name">同步资源库材料型号</field>
|
||||
<field name="model_id" ref="model_sf_materials_model"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_materials_model()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron3">
|
||||
<field name="name">同步资源库表面工艺</field>
|
||||
<field name="model_id" ref="model_sf_production_process"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_production_process()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron4">
|
||||
<field name="name">同步资源库加工工艺</field>
|
||||
<field name="model_id" ref="model_sf_processing_technology"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_processing_technology()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron5">
|
||||
<field name="name">同步资源库标签</field>
|
||||
<field name="model_id" ref="model_sf_machine_brand_tags"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_machine_brand_tags()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron6">
|
||||
<field name="name">同步资源库控制系统</field>
|
||||
<field name="model_id" ref="model_sf_machine_control_system"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_machine_tool_type_control_system()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron7">
|
||||
<field name="name">同步资源库品牌</field>
|
||||
<field name="model_id" ref="model_sf_machine_brand"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_machine_brand()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<!-- <record model="ir.cron" id="sf_cron8">-->
|
||||
<!-- <field name="name">同步注册机床</field>-->
|
||||
<!-- <field name="model_id" ref="model_mrs_machine_tool"/>-->
|
||||
<!-- <field name="state">code</field>-->
|
||||
<!-- <field name="code">model.enroll_machine_tool()</field>-->
|
||||
<!-- <field name="interval_number">1</field>-->
|
||||
<!-- <field name="interval_type">days</field>-->
|
||||
<!-- <field name="numbercall">-1</field>-->
|
||||
<!-- <field name="doall" eval="False"/>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<record model="ir.cron" id="sf_cron9">
|
||||
<field name="name">同步资源库机床型号</field>
|
||||
<field name="model_id" ref="model_sf_machine_tool_type"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_machine_tool_type()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron10">
|
||||
<field name="name">同步资源库刀具类别</field>
|
||||
<field name="model_id" ref="model_sf_cutting_tool_category"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_cutting_tool_category()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron11">
|
||||
<field name="name">同步资源库刀具型号</field>
|
||||
<field name="model_id" ref="model_sf_cutting_tool_type"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_cutting_tool_type()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.cron" id="sf_cron12">
|
||||
<field name="name">同步资源库工序</field>
|
||||
<field name="model_id" ref="model_sf_processing_order"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.sync_processing_order()</field>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field name="doall" eval="False"/>
|
||||
</record>
|
||||
</odoo>
|
||||
5
sf_mrs_connect/models/__init__.py
Normal file
5
sf_mrs_connect/models/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from . import ftp_operate
|
||||
from . import res_config_setting
|
||||
from . import sync_common
|
||||
|
||||
|
||||
47
sf_mrs_connect/models/ftp_operate.py
Normal file
47
sf_mrs_connect/models/ftp_operate.py
Normal file
@@ -0,0 +1,47 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import posixpath
|
||||
from odoo.modules import get_resource_path
|
||||
from ftplib import FTP
|
||||
import logging
|
||||
|
||||
|
||||
# FTP接口类
|
||||
class FtpController():
|
||||
'''
|
||||
这是ftp接口类,在类初始化的时候就连接了ftp服务器,能否成功连接有反馈。
|
||||
类中定义了两个接口:上传接口和删除接口
|
||||
'''
|
||||
|
||||
ftp = FTP()
|
||||
|
||||
def __init__(self, host, port, username, password):
|
||||
try:
|
||||
self.ftp.connect(host, port)
|
||||
self.ftp.login(username, password)
|
||||
logging.info("ftp连接成功")
|
||||
except:
|
||||
logging.info("ftp连接失败")
|
||||
|
||||
# 下载目录下的文件
|
||||
def download_file_tree(self, target_dir, serverdir):
|
||||
if not os.path.exists(serverdir):
|
||||
os.makedirs(serverdir)
|
||||
try:
|
||||
logging.info("进入FTP目录 ")
|
||||
self.ftp.cwd(target_dir) # 切换工作路径
|
||||
logging.info('FTP目录:%s' % target_dir)
|
||||
remotenames = self.ftp.nlst()
|
||||
logging.info('FTP目录文件:%s' % remotenames)
|
||||
for file in remotenames:
|
||||
server = os.path.join(serverdir, file)
|
||||
if file.find(".") != -1:
|
||||
self.download_file(server, file)
|
||||
except:
|
||||
return False
|
||||
|
||||
# 下载指定目录下的指定文件
|
||||
def download_file(self, serverfile, remotefile):
|
||||
file_handler = open(serverfile, 'wb')
|
||||
self.ftp.retrbinary('RETR ' + remotefile, file_handler.write)
|
||||
file_handler.close()
|
||||
83
sf_mrs_connect/models/res_config_setting.py
Normal file
83
sf_mrs_connect/models/res_config_setting.py
Normal file
@@ -0,0 +1,83 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = 'res.config.settings'
|
||||
|
||||
token = fields.Char(string='TOKEN', default='b811ac06-3f00-11ed-9aed-0242ac110003')
|
||||
sf_secret_key = fields.Char(string='密钥', default='wBmxej38OkErKhD6')
|
||||
sf_url = fields.Char(string='访问地址', default='https://sf.cs.jikimo.com')
|
||||
ftp_host = fields.Char(string='FTP的ip')
|
||||
ftp_port = fields.Char(string='FTP端口')
|
||||
ftp_user = fields.Char(string='FTP用户')
|
||||
ftp_password = fields.Char(string='FTP密码')
|
||||
|
||||
def sf_all_sync(self):
|
||||
self.env['sf.production.materials'].sync_all_production_materials()
|
||||
_logger.info("同步资源库材料")
|
||||
self.env['sf.materials.model'].sync_all_materials_model()
|
||||
_logger.info("同步资源库材料型号")
|
||||
self.env['sf.production.process'].sync_all_production_process()
|
||||
_logger.info("同步资源库表面工艺")
|
||||
self.env['sf.processing.technology'].sync_all_processing_technology()
|
||||
_logger.info("同步资源库加工工艺")
|
||||
self.env['sf.machine.brand.tags'].sync_all_machine_brand_tags()
|
||||
_logger.info("同步资源库品牌类别")
|
||||
self.env['sf.machine.brand'].sync_all_machine_brand()
|
||||
_logger.info("同步资源库品牌")
|
||||
self.env['sf.machine.control_system'].sync_all_machine_tool_type_control_system()
|
||||
_logger.info("同步资源库控制系统")
|
||||
# self.env['sf.machine_tool'].sync_all_machine_tool()
|
||||
# _logger.info("同步机床行业编码")
|
||||
self.env['sf.machine_tool.type'].sync_all_machine_tool_type()
|
||||
_logger.info("同步资源库机床型号")
|
||||
self.env['sf.cutting_tool.category'].sync_all_cutting_tool_category()
|
||||
_logger.info("同步资源库刀具类别")
|
||||
self.env['sf.cutting_tool.type'].sync_all_cutting_tool_type()
|
||||
_logger.info("同步资源库刀具")
|
||||
# self.env['sf.processing.order'].sync_all_processing_order()
|
||||
|
||||
@api.model
|
||||
def get_values(self):
|
||||
"""
|
||||
重载获取参数的方法,参数都存在系统参数中
|
||||
:return:
|
||||
"""
|
||||
values = super(ResConfigSettings, self).get_values()
|
||||
config = self.env['ir.config_parameter'].sudo()
|
||||
token = config.get_param('token', default='')
|
||||
sf_secret_key = config.get_param('sf_secret_key', default='')
|
||||
sf_url = config.get_param('sf_url', default='')
|
||||
ftp_host = config.get_param('ftp_host', default='')
|
||||
ftp_port = config.get_param('ftp_port', default='')
|
||||
ftp_user = config.get_param('ftp_user', default='')
|
||||
ftp_password = config.get_param('ftp_password', default='')
|
||||
|
||||
values.update(
|
||||
token=token,
|
||||
sf_secret_key=sf_secret_key,
|
||||
sf_url=sf_url,
|
||||
ftp_host=ftp_host,
|
||||
ftp_port=ftp_port,
|
||||
ftp_user=ftp_user,
|
||||
ftp_password=ftp_password
|
||||
)
|
||||
return values
|
||||
|
||||
def set_values(self):
|
||||
super(ResConfigSettings, self).set_values()
|
||||
ir_config = self.env['ir.config_parameter'].sudo()
|
||||
ir_config.set_param("token", self.token or "")
|
||||
ir_config.set_param("sf_secret_key", self.sf_secret_key or "")
|
||||
ir_config.set_param("sf_url", self.sf_url or "")
|
||||
ir_config.set_param("ftp_host", self.ftp_host or "")
|
||||
ir_config.set_param("ftp_port", self.ftp_port or "")
|
||||
ir_config.set_param("ftp_user", self.ftp_user or "")
|
||||
ir_config.set_param("ftp_password", self.ftp_password or "")
|
||||
1088
sf_mrs_connect/models/sync_common.py
Normal file
1088
sf_mrs_connect/models/sync_common.py
Normal file
File diff suppressed because it is too large
Load Diff
68
sf_mrs_connect/views/res_config_settings_views.xml
Normal file
68
sf_mrs_connect/views/res_config_settings_views.xml
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="res_config_settings_view_form_sf_sync" model="ir.ui.view">
|
||||
<field name="name">res.config.settings.view.form.inherit.sf_sync</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[hasclass('app_settings_block')]/div" position="before">
|
||||
<div>
|
||||
<h2>同步参数配置</h2>
|
||||
<div class="row mt16 o_settings_container" id="pay_api">
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<div class="o_setting_left_pane"/>
|
||||
<div class="o_setting_right_pane">
|
||||
<div class="text-muted">
|
||||
<label for="sf_url"/>
|
||||
<field name="sf_url"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="token" string="Token"/>
|
||||
<field name="token"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="sf_secret_key"/>
|
||||
<field name="sf_secret_key"/>
|
||||
</div>
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<button type="object" class="oe_highlight" name="sf_all_sync"
|
||||
string="同步资源库基础数据"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2>FTP参数配置</h2>
|
||||
<div class="row mt16 o_settings_container" id="pay_api">
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<div class="o_setting_left_pane"/>
|
||||
<div class="o_setting_right_pane">
|
||||
<div class="text-muted">
|
||||
<label for="ftp_host" string="访问地址"/>
|
||||
<field name="ftp_host"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="ftp_port" string="端口"/>
|
||||
<field name="ftp_port"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="ftp_user" string="用户"/>
|
||||
<field name="ftp_user"/>
|
||||
</div>
|
||||
<div class="text-muted">
|
||||
<label for="ftp_password" string="密码"/>
|
||||
<field name="ftp_password" password="True"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user