Compare commits

...

489 Commits

Author SHA1 Message Date
jinling.yang
9a157125ba 优化agv相关页面及对应接口 2024-04-22 22:30:05 +08:00
杨金灵
b526565ac4 Accept Merge Request #960: (feature/修复快递订单模型路径字段问题 -> develop)
Merge Request: 修复快递订单模型路径字段问题

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/960?initial=true
2024-04-22 15:49:46 +08:00
jinling.yang
690a66b6a1 修复快递订单模型路径字段问题 2024-04-22 15:46:43 +08:00
jinling.yang
c0db402f5e Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-22 15:45:29 +08:00
jinling.yang
d634cf20ba Merge branch 'feature/修复快速订单' into develop 2024-04-22 15:10:39 +08:00
杨金灵
220af93ed6 Accept Merge Request #959: (feature/修复快速订单 -> develop)
Merge Request: 修复快速订单

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/959
2024-04-22 15:07:17 +08:00
jinling.yang
eb6607be00 修复获取cnc程序方法关于快速订单部分 2024-04-22 14:27:59 +08:00
jinling.yang
4b2e58a66d 修复快速订单订单号和人工报价及注释掉识别长宽高代码 2024-04-22 14:14:59 +08:00
jinling.yang
9c5b3d7c4e Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-22 14:04:50 +08:00
马广威
9cb1b8c5aa Accept Merge Request #958: (feature/制造代码优化 -> develop)
Merge Request: 增加工单模型展示,工单物料增加长宽高值

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/958?initial=true
2024-04-22 10:58:54 +08:00
mgw
e108e2d5d6 增加工单模型展示,工单物料增加长宽高值 2024-04-22 10:58:04 +08:00
jinling.yang
90c87f7ddb Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-22 09:28:51 +08:00
jinling.yang
f0bfd18549 Merge branch 'feature/优化agv和ftp' into develop 2024-04-22 09:26:52 +08:00
杨金灵
c86fd099eb Accept Merge Request #957: (feature/优化agv和ftp -> develop)
Merge Request: 优化agv和ftp

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/957
2024-04-22 09:26:33 +08:00
jinling.yang
5cb1e3c838 修复快速订单 2024-04-19 17:24:51 +08:00
jinling.yang
45b300f8a1 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv和ftp 2024-04-19 16:50:59 +08:00
jinling.yang
a30c620823 优化快读订单 2024-04-19 16:50:38 +08:00
黄焱
263b8ddec7 Accept Merge Request #956: (feature/前端样式修改 -> develop)
Merge Request: 修复列表总计合计与单项合计错开了一列

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/956?initial=true
2024-04-19 15:45:17 +08:00
mgw
89eccb40ac 处理按钮显示 2024-04-19 15:42:35 +08:00
黄焱
761d0b0417 修复列表总计合计与单项合计错开了一列 2024-04-19 15:41:05 +08:00
禹翔辉
f22ee428b6 Accept Merge Request #955: (feature/库存模块优化 -> develop)
Merge Request: 1、优化货位看板的更换货位功能、添加按编码搜索功能;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/955
2024-04-19 15:02:40 +08:00
yuxianghui
1a860a5eb9 1、设备机床新增机床基坐标page页及其基本信息字段,新增主动获取和被动获取基坐标数据中控接口(接口待对接); 2024-04-19 14:59:19 +08:00
yuxianghui
96a4ee4e26 1 2024-04-19 13:42:12 +08:00
yuxianghui
80f0284c3c 1、优化货位看板的更换货位功能、添加按编码搜索功能; 2024-04-19 13:39:17 +08:00
jinling.yang
bcba08042b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv和ftp
# Conflicts:
#	sf_manufacturing/models/mrp_production.py
#	sf_manufacturing/models/mrp_workorder.py
#	sf_mrs_connect/models/ftp_operate.py
#	sf_sale/models/quick_easy_order_old.py
2024-04-19 11:28:50 +08:00
禹翔辉
25ee2136c3 Accept Merge Request #954: (feature/库存模块优化 -> develop)
Merge Request: 库存模块优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/954?initial=true
2024-04-19 11:00:36 +08:00
yuxianghui
50f5815070 Merge branch 'feature/内部调拨作业详情添加Rfid字段' into feature/库存模块优化
# Conflicts:
#	sf_manufacturing/models/mrp_production.py
#	sf_manufacturing/models/mrp_workorder.py
2024-04-19 10:54:36 +08:00
yuxianghui
b43c3496a1 1、货位看板模型添加货位变更弹窗模块及其功能按钮,实现产品在同库区的内部货位移动; 2024-04-19 10:49:48 +08:00
杨金灵
f1972ca572 Accept Merge Request #953: (feature/优化获取CNC程序 -> develop)
Merge Request: 优化获取cnc程序和FTP

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/953?initial=true
2024-04-19 09:10:46 +08:00
jinling.yang
5f2600c96f 释放注释代码 2024-04-19 08:34:41 +08:00
jinling.yang
040b3b16f0 修复产品条码 2024-04-19 08:33:04 +08:00
yuxianghui
67f3c312de 1、添加采购入库作业详情选取目标货位重复校验 2024-04-18 20:46:09 +08:00
yuxianghui
f26b4510cf 1、采购入库作业详情的目标位置字段关闭创建功能,关闭货位的创建功能;2、优化入库到货位流程(进行中); 2024-04-18 19:10:41 +08:00
jinling.yang
053fa3feb3 优化ftp路径 2024-04-18 19:09:48 +08:00
jinling.yang
59670fb3d7 优化获取CNC程序:添加编程方式(人工/自动),如是快速订单,编程方式为人工 2024-04-18 18:40:05 +08:00
yuxianghui
8dfef16b51 1、产品模型、制造订单模型、工单模型,添加人工编程字段;2、放开工单扫描绑定Rfid的检验功能;3、bfm下单创建产品添加人工报价字段内容;4、优化CNC程序用刀检验库区是否有刀的流程; 2024-04-18 15:38:16 +08:00
jinling.yang
3d1dd533b5 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-17 17:11:39 +08:00
jinling.yang
83d1d397f5 Merge branch 'feature/优化货架货位-新增打印条码' into develop 2024-04-17 17:09:37 +08:00
杨金灵
0a9cfd916a Accept Merge Request #949: (feature/优化货架货位-新增打印条码 -> develop)
Merge Request: 优化货架货位-新增打印条码

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/949
2024-04-17 17:06:53 +08:00
jinling.yang
2e5dd55a7b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化货架货位-新增打印条码 2024-04-17 17:05:36 +08:00
马广威
4fb57373d5 Accept Merge Request #951: (feature/制造代码优化 -> develop)
Merge Request: 三次元检测z计算修改

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/951?initial=true
2024-04-17 17:03:38 +08:00
禹翔辉
8a85581347 Accept Merge Request #950: (feature/内部调拨作业详情添加Rfid字段 -> develop)
Merge Request: 1、优化品牌同步接口,2、内部调拨作业详情添加Rfid字段;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/950
2024-04-17 17:03:04 +08:00
yuxianghui
22c388f52c 1、优化品牌同步接口,2、内部调拨作业详情添加Rfid字段; 2024-04-17 17:01:01 +08:00
mgw
0103024f1c Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-04-17 16:52:08 +08:00
jinling.yang
988241a1bd 条码添加图片展示控件 2024-04-17 16:10:44 +08:00
jinling.yang
92af278451 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化货架货位-新增打印条码 2024-04-17 16:01:10 +08:00
jinling.yang
19b062f5ac 新增货架一键打印所有货位条码和单个打印货位条码 2024-04-17 16:00:47 +08:00
禹翔辉
7897e6e55b Accept Merge Request #948: (feature/功能刀具组装流程优化完成 -> develop)
Merge Request: 功能刀具组装流程优化完成

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/948
2024-04-17 15:02:52 +08:00
yuxianghui
259f12a11f Merge branch 'feature/功能刀具组装流程测试及优化' into feature/功能刀具组装流程优化完成 2024-04-17 14:57:39 +08:00
yuxianghui
c6b1c5e047 1、删除功能刀具列表模型的刀具名称计算方法,改为创建记录时给数据;2、功能刀具组装单弹窗添加根据旧刀具名称自动选择新刀具的名称;优化没有序列号的刀具物料的库存位移方法,并在刀具物料出库同时货位物料数减一;关闭弹窗创建刀具组、功能刀具名称记录功能; 2024-04-17 14:55:45 +08:00
杨金灵
38c89a4167 Accept Merge Request #947: (feature/优化快速订单 -> develop)
Merge Request: 优化快速订单

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/947?initial=true
2024-04-17 14:21:49 +08:00
jinling.yang
59683790b7 优化页面展示 2024-04-17 14:19:38 +08:00
mgw
ceae788ecc 三次元检测z计算修改 2024-04-17 14:18:40 +08:00
jinling.yang
f04cbac8d9 1.去掉上色和特征识别方法,
2.转换模型需自动识别模型长宽高
3.优化页面:下拉框关闭创建
4.权限修改为不可编辑
2024-04-17 13:19:07 +08:00
yuxianghui
36db60812e Merge branch 'feature/功能刀具组装优化' into feature/功能刀具组装流程测试及优化 2024-04-16 17:23:55 +08:00
yuxianghui
3c47553be6 1、添加销售总监和采购总监对夹具的可读权限;2、工单的tree视图添加制造订单字段 2024-04-16 17:22:16 +08:00
jinling.yang
c535808d5f Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-16 16:22:50 +08:00
jinling.yang
d8a876796a Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv和ftp 2024-04-16 16:22:40 +08:00
jinling.yang
d777970a9b 1.ftp文件路径修改为:/NC/以下 2024-04-16 16:22:26 +08:00
马广威
d1e9254996 Accept Merge Request #946: (feature/制造代码优化 -> develop)
Merge Request: 修改测点位置匹配,优化错误抛出方式

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/946?initial=true
2024-04-15 21:15:28 +08:00
mgw
028eb18dd8 修改测点位置匹配,优化错误抛出方式 2024-04-15 21:14:12 +08:00
黄焱
c4ddd067e7 Accept Merge Request #945: (feature/前端样式修改 -> develop)
Merge Request: 修改因添加表格必填而出现报错问题

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/945?initial=true
2024-04-15 17:22:01 +08:00
黄焱
48cba4274b 修改因添加表格必填而出现报错问题 2024-04-15 17:04:43 +08:00
mgw
9df62129b7 控制按钮显隐逻辑 2024-04-15 13:39:58 +08:00
马广威
65330b083b Accept Merge Request #944: (feature/制造代码优化 -> develop)
Merge Request: 前置三次元检测数据读取功能初步完成

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/944?initial=true
2024-04-15 11:40:57 +08:00
mgw
543f1a8e9b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-04-15 11:39:35 +08:00
mgw
19156f5944 优化代码健壮性,解决部分硬编码问题 2024-04-15 11:39:10 +08:00
mgw
9ac3ef7c93 前置三次元检测数据读取 2024-04-15 11:16:33 +08:00
禹翔辉
3f9eb762f9 Accept Merge Request #943: (feature/刀具定时同步到cloud -> develop)
Merge Request: 添加刀具信息定时同步到cloud功能

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/943?initial=true
2024-04-15 10:25:15 +08:00
yuxianghui
ef0e09ba4b 1、优化没有刀具信息记录时同步报错问题 2024-04-15 10:22:19 +08:00
yuxianghui
eb2db1dfdd 1、添加定时同步刀具物料和功能刀具相关的信息到cloud的功能;2、添加同步所以刀具物料和所以功能刀具相关记录同步接口; 2024-04-12 17:30:59 +08:00
yuxianghui
180db6b91e 1、调整功能刀具清单模型的菜单代码位置,解决依赖冲突问题;2、产品采购时,添加一个订单同时采购多个相同产品的校验;3、优化刀柄采购入库时,自动生成的序列号规则; 2024-04-12 16:15:02 +08:00
yuxianghui
482dbb9baa Merge branch 'feature/优化组装单模型' into feature/功能刀具组装优化 2024-04-12 10:22:26 +08:00
yuxianghui
4391a4e145 1、功能刀具清单模型添加功能刀具名称重名检验,2、功能刀具安全库存模型添加根据所选功能刀具名称自动带出类型、刀具组、直径、R角信息;3、优化刀具物料搜索模型,物料数量字段改为存储字段,根据对应产品的各个位置的库存数量自动计算刀具物料的总数等值; 2024-04-11 17:34:15 +08:00
yuxianghui
010fbb23b0 1、优化工单扫描绑定托盘的验证条件,只有在工单已完成时不能再扫描绑定托盘;2、优化中控的刀具组接口,改为传输功能刀具清单的刀具组数据;3、优化功能刀具组装单模型的刀柄信息,删除刀柄货位字段,添加刀柄Rfid字段,根据货位带出刀柄信息改为根据序列号带出;5、优化功能刀具组装单弹窗,删除刀柄货位字段添加刀柄Rfid字段,删除刀柄的扫货位录入信息的代码;夹头货位改为非必填;添加组装后刀具组字段,添加根据所选的功能刀具名称,自动带出功能刀具的类型、刀具组、直径、刀尖R角、最大寿命值、总长度、伸出长、避空长信息,且可修改;6、优化调整功能刀具组装单弹窗的布局; 2024-04-11 15:11:50 +08:00
yuxianghui
7f6444cc89 1、优化功能刀具组装模型,重构刀具物料的组成结构;2、优化刀具物料查询模型,重构刀具物流库存统计方法;3、优化功能刀具组装流程,重构刀具物料出库方法;4、重构扫码录入刀具物料数据方法;5、优化功能刀具列表模型; 2024-04-10 17:32:35 +08:00
马广威
b5767970a4 Accept Merge Request #942: (feature/制造代码优化 -> develop)
Merge Request: 开完库存处新增需求基本完成

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/942?initial=true
2024-04-09 20:43:57 +08:00
mgw
422e4bda6c Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化
# Conflicts:
#	sf_warehouse/models/model.py
2024-04-09 20:42:15 +08:00
马广威
29790b7760 Accept Merge Request #941: (feature/优化组装单模型 -> develop)
Merge Request: 优化组装单

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/941#mr-941-review-140567
2024-04-09 20:16:09 +08:00
mgw
310a2de34f 开完库存处新增需求基本完成 2024-04-09 20:14:44 +08:00
yuxianghui
12a54d1f2a Merge branch 'feature/新增功能刀具清单' into feature/优化组装单模型 2024-04-09 17:29:13 +08:00
yuxianghui
f19a1a282a 1、优化扫描录入刀具物料方法, 2024-04-09 17:27:37 +08:00
jinling.yang
cc7a72d6f4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-09 17:25:16 +08:00
jinling.yang
1681e9e4da Merge branch 'feature/修复刀具物料同步' into develop 2024-04-09 17:24:55 +08:00
杨金灵
cf3514e407 Accept Merge Request #940: (feature/修复刀具物料同步 -> develop)
Merge Request: 修复刀具物料同步

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/940?initial=true
2024-04-09 17:24:36 +08:00
jinling.yang
abdb636176 1.补充agv优化代码
2.修复刀具物料同步
2024-04-09 17:10:53 +08:00
yuxianghui
85649daef6 1、功能刀具清单模型添加功能刀具类型、加工材料、寿命字段;2、删除供应商的地址和email必填;3、优化功能刀具组装单模型,新增五种物料的货位字段,修改继承关系,添加根据货位获取刀具物料信息功能; 2024-04-09 16:53:15 +08:00
jinling.yang
8eee9d9173 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/new 2024-04-09 16:47:56 +08:00
jinling.yang
c104ecf24b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-09 16:47:12 +08:00
mgw
961b4f8e2d 库存需求修改1 2024-04-09 15:21:47 +08:00
yuxianghui
0a4c86f601 功能刀具清单添加刀具组字段 2024-04-09 13:38:13 +08:00
禹翔辉
9e5843c4a8 Accept Merge Request #938: (feature/新增功能刀具清单 -> develop)
Merge Request: 新增功能刀具清单模型

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/938?initial=true
2024-04-09 11:18:47 +08:00
yuxianghui
e9bca64f20 Merge branch 'feature/工单扫描绑定Rfid优化' into feature/新增功能刀具清单 2024-04-09 10:48:57 +08:00
yuxianghui
34ea140941 1、新增功能刀具清单模型,及其tree视图、权限;2、功能刀具安全库存模型和功能刀具组装单模型新增功能刀具名称关联功能刀具清单,优化功能刀具组装流程生成功能刀具安全库存信息的流程 2024-04-09 10:46:08 +08:00
黄焱
0dc94fa69b Accept Merge Request #937: (feature/前端样式修改 -> develop)
Merge Request: 修改制造模块子页面样式问题

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/937?initial=true
2024-04-08 17:19:01 +08:00
黄焱
4c9fbab471 修改制造模块子页面样式问题 2024-04-08 17:17:27 +08:00
jinling.yang
51685ba68b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-08 16:51:54 +08:00
jinling.yang
04de8fe9de Merge branch 'feature/优化Rfid绑定工单' into develop 2024-04-08 16:51:32 +08:00
杨金灵
bb29db2ff5 Accept Merge Request #936: (feature/优化Rfid绑定工单 -> develop)
Merge Request: 优化工单和agv

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/936?initial=true
2024-04-08 16:51:13 +08:00
jinling.yang
3f86dd48ec Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化Rfid绑定工单
# Conflicts:
#	sf_manufacturing/models/mrp_workorder.py
#	sf_manufacturing/models/product_template.py
#	sf_manufacturing/views/mrp_workorder_view.xml
2024-04-08 16:47:16 +08:00
jinling.yang
00802f9fc0 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-04-08 16:39:52 +08:00
jinling.yang
07230703d8 1.优化agv配置及接口:新增站点集合对象,agv车辆编号及任务单类型编号字段
2.优化rfid和工单部分需求:点完工按钮,若为工件装夹工单,完工需校验工件坯料、RFID码、前置三元定位是否填写;若未填写,页面弹出对应提示,反之则需要二次确认弹窗
3.新增最初版的快速订单:为了工厂测试下单走流程
4.工单优化:新增检测结果和是否重新生成制造订单字段
2024-04-08 16:39:26 +08:00
禹翔辉
4cd2cbe1a7 Accept Merge Request #935: (feature/工单扫描绑定Rfid优化 -> develop)
Merge Request: 优化工单扫托盘Rfid绑定Rfid码录入信息时,工单的开始等按键消失的问题

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/935
2024-04-08 15:58:09 +08:00
yuxianghui
6bddc4c262 Merge branch 'feature/功能刀具组装功能优化' into feature/工单扫描绑定Rfid优化 2024-04-08 14:45:05 +08:00
yuxianghui
4faeda11b8 1、优化工单扫托盘Rfid绑定Rfid码录入信息时,工单的开始等按键消失的问题 2024-04-08 14:43:46 +08:00
禹翔辉
3a484682fa Accept Merge Request #934: (feature/功能刀具组装功能优化 -> develop)
Merge Request: 1、处理刀具物料注册时搜索不到的问题;2、功能刀具组装时,当没有选择物料的时候功能刀具编码不显示数据;添加最大寿命值、报警值、有效长、避空长的必填验证;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/934?initial=true
2024-04-07 16:46:26 +08:00
yuxianghui
556c3cb4bb Merge branch 'feature/工单扫Rfid绑定托盘' into feature/功能刀具组装功能优化 2024-04-07 15:37:52 +08:00
yuxianghui
000280e53a no message 2024-04-07 15:36:05 +08:00
yuxianghui
4dd733c466 1、处理刀具物料注册时搜索不到的问题;2、功能刀具组装时,当没有选择物料的时候功能刀具编码不显示数据;添加最大寿命值、报警值、有效长、避空长的必填验证; 2024-04-07 15:35:47 +08:00
禹翔辉
92e522905c Accept Merge Request #933: (feature/工单扫Rfid绑定托盘 -> develop)
Merge Request: 暂时关闭工单扫Rfid绑定托盘的Rfid重复验证

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/933?initial=true
2024-04-03 17:27:03 +08:00
yuxianghui
2ef832c17e 暂时关闭工单扫Rfid绑定托盘的Rfid重复验证 2024-04-03 17:23:57 +08:00
禹翔辉
7fd92e44b3 Accept Merge Request #932: (feature/工单扫Rfid绑定托盘 -> develop)
Merge Request: 托盘物料添加Rfid码,工单扫Rfid绑定托盘

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/932?initial=true
2024-04-03 16:59:55 +08:00
yuxianghui
392784041c Merge branch 'feature/刀具物料采购生成序列号优化' into feature/工单扫Rfid绑定托盘 2024-04-03 16:54:10 +08:00
yuxianghui
02e5972272 1、新增装夹预调工单扫拖盘Rfid绑定托盘;2、删除工单的Rfid字段的customRFID样式;3、修改序列号模型的Rfid字段的隐藏条件;4、优化刀柄、托盘物料采购时绑定Rfid的判断条件 2024-04-03 16:52:16 +08:00
禹翔辉
eb3583222c Accept Merge Request #931: (feature/刀具物料采购生成序列号优化 -> develop)
Merge Request: 当产品的刀具物料不是刀柄时,隐藏对应序列号模型的Rfid字段

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/931
2024-04-02 16:43:21 +08:00
yuxianghui
aac5195b4d 当产品的刀具物料不是刀柄时,隐藏对应序列号模型的Rfid字段 2024-04-02 16:38:19 +08:00
禹翔辉
715119d250 Accept Merge Request #930: (feature/刀具物料采购生成序列号优化 -> develop)
Merge Request: 1、优化产品采购刀具物料生成的序列号出现不连续的问题;2、采购刀柄物料时,在入库验证环节增加Rfid是否全部录入检验。

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/930?initial=true
2024-04-02 16:16:25 +08:00
yuxianghui
9ed3930a1b Merge branch 'feature/刀柄入库录入Rfid' into feature/刀具物料采购生成序列号优化 2024-04-02 16:03:35 +08:00
yuxianghui
2580e0c795 1、优化产品采购刀具物料生成的序列号出现不连续的问题;2、采购刀柄物料时,在入库验证环节增加Rfid是否全部录入检验。 2024-04-02 15:36:28 +08:00
jinling.yang
f4f1c9f839 1.新增表面工艺外协路线初始化数据 2024-04-01 17:34:56 +08:00
禹翔辉
827e056dc8 Accept Merge Request #928: (feature/刀柄入库录入Rfid -> develop)
Merge Request: 添加刀柄采购入库时录入Rfid功能;添加功能刀具组装时,扫Rfid带出刀柄、夹头信息,并填写功能刀具Rfid码

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/928
2024-04-01 17:14:03 +08:00
yuxianghui
02e4987281 优化选取适用夹头方法 2024-04-01 17:12:47 +08:00
yuxianghui
e89b8ac65c Merge branch 'feature/功能刀具安全库存注册' into feature/刀柄入库录入Rfid 2024-04-01 16:56:56 +08:00
yuxianghui
f0b972e705 1、优化刀柄物料产品适用夹头型号没有数据的问题,优化刀具标准库基本参数同步接口;2、优化功能刀具组装时,只需扫入刀柄的Rfid,将自动带出刀柄信息,并根据刀柄适用夹头型号和适配夹头尺寸随机带出一个可用夹头物料信息,同时将刀柄的Rfid码填入功能刀具的Rfid码。3、优化刀柄物料采购入库时的验证的判断条件; 2024-04-01 16:56:15 +08:00
马广威
5c220af28c Accept Merge Request #927: (feature/制造代码优化 -> develop)
Merge Request: 修复自定义角色打印无权限的问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/927?initial=true
2024-04-01 14:56:35 +08:00
mgw
82947a909e Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-04-01 14:55:31 +08:00
mgw
18dcb79116 修复自定义角色打印无权限的问题 2024-04-01 14:55:10 +08:00
jinling.yang
8d1e4a89c2 1、没绑定工单不能完工,绑定后才可以完工
2、工单绑定后没完工可以换绑
3、工单点完工按钮要有确认弹窗
2024-03-29 17:38:35 +08:00
yuxianghui
48809cd654 1、序列号模型对象添加rfid字段且rfid仅在产品为刀柄时展示,序列号模型添加规格字段,且添加自动根据对应产品类型不同计算出其值,产品为夹具时看板展示其规格的值;2、在采购入库流程,录入序列号的过程界面添加录入rfid字段,当产品是刀柄时需录入刀柄的rfid,并在验证通过后刀柄的序列号中带有rfid码; 2024-03-29 17:37:02 +08:00
jinling.yang
35fd1e329d Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-29 16:56:06 +08:00
jinling.yang
af289b7030 Merge branch 'feature/优化下发编程单的同时拉取CMM程序' into develop 2024-03-29 16:55:52 +08:00
杨金灵
5b3ee99bf3 Accept Merge Request #926: (feature/优化下发编程单的同时拉取CMM程序 -> develop)
Merge Request: 优化下发编程单的同时拉取CMM程序

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/926?initial=true
2024-03-29 16:55:31 +08:00
jinling.yang
be975ea901 文件匹配添加注释 2024-03-29 16:52:05 +08:00
jinling.yang
1451539bb4 释放注释代码 2024-03-29 16:48:44 +08:00
jinling.yang
154e7de8a4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化下发编程单的同时拉取CMM程序 2024-03-29 16:47:18 +08:00
禹翔辉
d21b25467b Accept Merge Request #925: (feature/功能刀具安全库存注册 -> develop)
Merge Request: 优化功能刀具安全库存信息更新时没有及时注册的问题

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/925?initial=true
2024-03-28 17:34:29 +08:00
yuxianghui
71b7b07949 Merge branch 'feature/表面工艺添加类别筛选' into feature/功能刀具安全库存注册 2024-03-28 17:31:42 +08:00
yuxianghui
4115bbb05e 1、优化功能刀具安全库存信息更新时没有及时注册的问题 2024-03-28 17:30:16 +08:00
禹翔辉
c380d99a26 Accept Merge Request #924: (feature/表面工艺添加类别筛选 -> develop)
Merge Request: 表面工艺添加按类别筛选

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/924
2024-03-28 10:39:15 +08:00
yuxianghui
a0d50edc84 Merge branch 'feature/夹具管理' into feature/表面工艺添加类别筛选 2024-03-28 10:36:29 +08:00
yuxianghui
2aa29e5cbf 1、表面工艺添加按类型筛选功能;2、夹具产品的类型、规格添加必填 2024-03-28 10:35:08 +08:00
杨金灵
32907109ef Accept Merge Request #923: (feature/修复表面工艺外协 -> develop)
Merge Request: 修复表面工艺外协

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/923?initial=true
2024-03-27 17:30:24 +08:00
jinling.yang
303fcfaabd 查询源位置的条件=改为ilike 2024-03-27 17:28:48 +08:00
jinling.yang
f767433a96 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-27 17:26:37 +08:00
jinling.yang
3eae506e48 注释occ代码 2024-03-27 17:26:27 +08:00
jinling.yang
0ddefacda7 注释OCC代码 2024-03-27 17:26:14 +08:00
禹翔辉
42a748e0f8 Accept Merge Request #922: (feature/夹具管理 -> develop)
Merge Request: 1、制造模块新增夹具管理菜单,将夹具物料查询菜单移到夹具管理菜单下,设置夹具管理菜单为工件装夹岗可见;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/922?initial=true
2024-03-27 11:52:45 +08:00
yuxianghui
63263e3509 修改刀具管理权限 2024-03-27 11:49:42 +08:00
yuxianghui
aaf782b4a1 Merge branch 'feature/刀具管理' into feature/夹具管理
# Conflicts:
#	sf_tool_management/security/ir.model.access.csv
2024-03-27 11:47:28 +08:00
yuxianghui
ce069e8b50 1、制造模块新增夹具管理菜单,将夹具物料查询菜单移到夹具管理菜单下,设置夹具管理菜单为工件装夹岗可见; 2024-03-27 11:39:07 +08:00
马广威
609ea62d0d Accept Merge Request #921: (feature/制造代码优化 -> develop)
Merge Request: 控制cnc只能看到cnc产线;增加必填标识

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/921?initial=true
2024-03-27 10:35:29 +08:00
mgw
f7f9cf1e43 控制cnc只能看到cnc产线;增加必填标识 2024-03-27 10:26:46 +08:00
马广威
75eb359c5a Accept Merge Request #920: (feature/制造代码优化 -> develop)
Merge Request: 优化翻译、排序、权限问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/920
2024-03-26 20:40:07 +08:00
mgw
7906ff2836 优化翻译、排序、权限问题 2024-03-26 18:09:23 +08:00
禹翔辉
5e97747ec1 Accept Merge Request #919: (feature/功能刀具安全库存优化 -> develop)
Merge Request: 禁用功能刀具安全库存的刀具组字段创建新记录的功能

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/919?initial=true
2024-03-26 15:20:18 +08:00
yuxianghui
ead758d34c Merge branch 'feature/零件特采接口优化' into feature/功能刀具安全库存优化 2024-03-26 15:17:49 +08:00
yuxianghui
decb6c7792 禁用功能刀具安全库存的刀具组字段创建新记录的功能 2024-03-26 15:16:26 +08:00
jinling.yang
b83e5575dc Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-26 14:19:40 +08:00
jinling.yang
a003987111 Merge branch 'feature/优化agv配置和客户' into develop 2024-03-26 14:19:13 +08:00
杨金灵
db2052a019 Accept Merge Request #918: (feature/优化agv配置和客户 -> develop)
Merge Request: 优化agv配置和客户

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/918
2024-03-26 14:18:56 +08:00
jinling.yang
ca06d11d79 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-26 14:11:25 +08:00
jinling.yang
e63eed3405 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv配置和客户 2024-03-26 14:11:11 +08:00
jinling.yang
d05c0951eb 1.agv配置参数新增地码
2.bpm分配工厂时的客户(业务平台)的必填信息(税,邮箱,号码)赋值
3.报价页面的客户改为不可新建
2024-03-26 14:10:51 +08:00
禹翔辉
0500a2dd02 Accept Merge Request #917: (feature/零件特采接口优化 -> develop)
Merge Request: 零件特采接口优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/917?initial=true
2024-03-25 16:55:37 +08:00
yuxianghui
37ea48dbee Merge branch 'feature/夹具物料搜索' into feature/零件特采接口优化 2024-03-25 16:51:04 +08:00
yuxianghui
48cd8399f4 1、优化中控零件特采接口,2、将刀具管理的功能刀具所有rfid改为Rfid 2024-03-25 16:49:49 +08:00
马广威
ee3c0d702d Accept Merge Request #916: (feature/制造代码优化 -> develop)
Merge Request: 修复员工模块js问题、能力特征哭js问题、设备处问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/916?initial=true
2024-03-25 16:19:22 +08:00
mgw
1212ea0930 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化
# Conflicts:
#	jikimo_frontend/static/src/js/custom_form_status_indicator.js
2024-03-25 16:18:42 +08:00
mgw
ed8c39d005 修复员工模块js问题、能力特征哭js问题、设备处问题 2024-03-25 16:17:19 +08:00
黄焱
fe4782eecf Accept Merge Request #915: (feature/前端样式修改 -> develop)
Merge Request: 修改field错误问题

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/915?initial=true
2024-03-25 09:10:37 +08:00
黄焱
57bfec02eb 修改field错误问题 2024-03-25 09:07:45 +08:00
马广威
53c4b01a74 Accept Merge Request #914: (feature/制造代码优化 -> develop)
Merge Request: odoo标签打印及去除odoo相关标识

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/914?initial=true
2024-03-20 17:34:56 +08:00
mgw
5b535fae18 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-03-20 17:33:58 +08:00
mgw
ba79b358a9 调整打印机模型结构 2024-03-20 17:32:17 +08:00
mgw
c788392b36 打印配置初步优化并测试成功,自测流程成功 2024-03-20 16:58:57 +08:00
禹翔辉
d3819e818b Accept Merge Request #913: (feature/夹具物料搜索 -> develop)
Merge Request: 新增夹具物料搜索模型及注册接口

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/913
2024-03-20 16:38:43 +08:00
yuxianghui
0725b7a7ba Merge branch 'feature/功能刀具组装优化' into feature/夹具物料搜索 2024-03-20 16:36:00 +08:00
yuxianghui
a07563e166 1、新增夹具物料搜索模型,完成tree视图和form视图;2、新增夹具物料序列号、夹具物料搜索模型注册到cloud的接口,优化刀具物料序列号注册接口及流程;3、删除刀具物料搜索模型的无关字段; 2024-03-20 16:34:11 +08:00
mgw
2407d2cfc7 移除系统中odoo相关标识、信息 2024-03-20 16:15:00 +08:00
mgw
f38c062804 打印相关抽象为公用类 2024-03-20 11:28:58 +08:00
mgw
0363f8c8a3 odoo16中直连局域网zebra标签打印机打印二维码初版测试成功 2024-03-19 17:48:00 +08:00
禹翔辉
2e83fc2e44 Accept Merge Request #912: (feature/功能刀具组装优化 -> develop)
Merge Request: 1、解决刀具物料采购时,自动生成序列号重复问题;2、优化刀具物料生成序列号时,自动更新刀具物料查询记录的方法

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/912?initial=true
2024-03-19 17:22:24 +08:00
yuxianghui
952e663b31 1、解决刀具物料采购时,自动生成序列号重复问题;2、优化刀具物料生成序列号时,自动更新刀具物料查询记录的方法 2024-03-19 17:20:19 +08:00
禹翔辉
bb78404772 Accept Merge Request #911: (feature/功能刀具组装优化 -> develop)
Merge Request: 优化刀具组装时的物料选取

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/911?initial=true
2024-03-19 10:33:04 +08:00
yuxianghui
e5b6f2dcdc Merge branch 'feature/夹具型号基本参数同步' into feature/功能刀具组装优化 2024-03-19 10:28:07 +08:00
yuxianghui
3458deef09 1、解决功能刀具组装时,已使用刀具物料还能再选到的问题;2、解决功能刀具组装完成后的功能刀具注册到cloud没有编码的问题;3、刀具物料添加未入库状态; 2024-03-19 10:26:55 +08:00
禹翔辉
f8d1bff5d3 Accept Merge Request #910: (feature/夹具型号基本参数同步 -> develop)
Merge Request: 夹具型号基本参数同步

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/910?initial=true
2024-03-18 17:21:29 +08:00
yuxianghui
d3e050bd21 Merge branch 'feature/夹具型号同步优化' into feature/夹具型号基本参数同步 2024-03-18 17:17:10 +08:00
yuxianghui
c470935cc5 1、删除夹具型号同步接口中的夹具型号基本参数的数据;2、新增夹具型号基本参数模型同步接口,完成夹具型号基本参数的同步;3、修改刀具管理菜单下子菜单名称;4、关闭刀具物料搜索模型form视图的注册接口 2024-03-18 17:15:34 +08:00
jinling.yang
b053edd655 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-18 15:02:07 +08:00
jinling.yang
0324acd4fd Merge branch 'feature/优化产品模版' into develop 2024-03-18 15:01:54 +08:00
杨金灵
3eb274aa01 Accept Merge Request #909: (feature/优化产品模版 -> develop)
Merge Request: 优化产品模版

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/909
2024-03-18 15:01:20 +08:00
jinling.yang
d4c786ff1e 1.选择规则,带出对应型号图片 2024-03-18 14:46:49 +08:00
jinling.yang
ab58f5b40c Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化产品模版 2024-03-18 14:46:35 +08:00
jinling.yang
83327136eb Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-18 14:43:50 +08:00
jinling.yang
cfd2910ead Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-18 14:43:27 +08:00
jinling.yang
e444e27cad 1.选择规则,带出对应型号图片
2.规格弹出的页面隐藏刀具类型
3.型号新建弹出的页面图片字段去掉option设置,编码改为强制保存
2024-03-18 14:42:51 +08:00
禹翔辉
64050ac461 Accept Merge Request #908: (feature/夹具型号同步优化 -> develop)
Merge Request: 夹具型号同步优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/908?initial=true
2024-03-18 10:31:25 +08:00
yuxianghui
6062ebdf9c Merge branch 'feature/刀具注册' into feature/夹具型号同步优化 2024-03-18 10:29:22 +08:00
yuxianghui
698ea31d31 夹具型号同步优化 2024-03-18 10:28:08 +08:00
马广威
d52c208ba9 Accept Merge Request #907: (feature/制造代码优化 -> develop)
Merge Request: 优化用户反馈

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/907?initial=true
2024-03-18 09:16:23 +08:00
mgw
38e3f5f31c 优化用户反馈 2024-03-18 09:15:39 +08:00
马广威
4477b12f8d Accept Merge Request #906: (feature/制造代码优化 -> develop)
Merge Request: 对“还原库存调整按钮”做权限控制

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/906?initial=true
2024-03-18 08:52:17 +08:00
mgw
76ce105289 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-03-18 08:51:30 +08:00
mgw
0b9f64fbfc 对“还原库存调整按钮”做权限控制 2024-03-18 08:51:11 +08:00
马广威
7dac3ad21a Accept Merge Request #905: (feature/制造代码优化 -> develop)
Merge Request: 修复“待排程状态的制造订单有实际时长,不应该有【实际时长】、【安排的日期】【计划结束时间】这几个字段”问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/905?initial=true
2024-03-16 11:41:34 +08:00
mgw
aeca8ef2b2 修复“待排程状态的制造订单有实际时长,不应该有【实际时长】、【安排的日期】【计划结束时间】这几个字段”问题 2024-03-16 11:22:01 +08:00
yuxianghui
3b7e120eb2 1、优化夹具型号静态数据同步 2024-03-15 17:38:43 +08:00
jinling.yang
56dacd0815 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-15 17:09:15 +08:00
jinling.yang
415717ee10 Merge branch 'feature/优化坯料和修复质量标准' into develop 2024-03-15 17:03:03 +08:00
杨金灵
716e04a0a8 Accept Merge Request #904: (feature/优化坯料和修复质量标准 -> develop)
Merge Request: 优化坯料和修复质量标准

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/904
2024-03-15 17:02:47 +08:00
jinling.yang
8ebf71dc23 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-15 17:00:14 +08:00
jinling.yang
1a702512e5 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化坯料和修复质量标准 2024-03-15 17:00:05 +08:00
jinling.yang
d5a1a82c72 1.优化分配工厂时材料型号获取方式为采购和外协时未有供应商返回提示
2.修复质量标准去掉审核按钮显示
2024-03-15 16:59:51 +08:00
马广威
5e3aff31e0 Accept Merge Request #903: (feature/制造代码优化 -> develop)
Merge Request: 待排程状态隐藏tab页

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/903?initial=true
2024-03-15 16:03:24 +08:00
mgw
d1eba51f61 待排程状态隐藏tab页 2024-03-15 16:02:54 +08:00
jinling.yang
df42932630 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-15 10:54:07 +08:00
jinling.yang
3c700e57d1 Merge branch 'feature/优化表面工艺可选参数' into develop 2024-03-15 10:53:29 +08:00
杨金灵
fa66b45373 Accept Merge Request #902: (feature/优化表面工艺可选参数 -> develop)
Merge Request: 优化表面工艺可选参数

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/902?initial=true
2024-03-15 10:53:16 +08:00
jinling.yang
0facdee321 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化表面工艺可选参数 2024-03-15 10:48:58 +08:00
jinling.yang
4d45b81ebc Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-15 10:48:13 +08:00
jinling.yang
4765e34c09 1.优化表面工艺可选参数
2.修复质量警报质量总监没有制造订单访问权限
2024-03-15 10:48:01 +08:00
黄焱
7717731a22 Accept Merge Request #901: (feature/前端样式修改 -> develop)
Merge Request: 解决频繁报错弹窗,新增判断

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/901?initial=true
2024-03-15 10:12:44 +08:00
黄焱
f639e59b91 解决频繁报错弹窗,新增判断 2024-03-15 10:10:17 +08:00
黄焱
2352f862ee Accept Merge Request #900: (feature/前端样式修改 -> develop)
Merge Request: 增加owl监听field必填功能

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/900
2024-03-15 09:52:05 +08:00
黄焱
c3bd0b1391 Merge branch 'feature/前端样式修改' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改 2024-03-14 16:50:34 +08:00
黄焱
776877f7a4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改 2024-03-14 16:50:03 +08:00
黄焱
cdf8e7227c Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改
# Conflicts:
#	sf_maintenance/views/equipment_maintenance_standards_views.xml

增加owl监听必填标识功能
2024-03-14 16:47:20 +08:00
黄焱
827b8337bd Merge branch refs/heads/develop into refs/heads/feature/前端样式修改 2024-03-14 16:13:01 +08:00
jinling.yang
603f9e3f34 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-03-14 15:49:11 +08:00
jinling.yang
f971216c03 Merge branch 'feature/修复部分bug' into develop 2024-03-14 15:48:42 +08:00
杨金灵
cfc044b7bc Accept Merge Request #899: (feature/修复部分bug -> develop)
Merge Request: 修复部分bug

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/899
2024-03-14 15:48:14 +08:00
jinling.yang
9120ebe6f7 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修复部分bug 2024-03-14 15:46:03 +08:00
jinling.yang
02f1805505 修复部分bug 2024-03-14 15:45:40 +08:00
马广威
b937372f82 Accept Merge Request #898: (feature/制造代码优化 -> develop)
Merge Request: 修改zpl相关

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/898?initial=true
2024-03-14 14:31:53 +08:00
mgw
89f3f4b493 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-03-14 14:31:07 +08:00
马广威
9a47a4c094 Accept Merge Request #897: (feature/修改机床参数bug -> develop)
Merge Request: 增加必填按钮 修改字段string

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/897#mr-897-review-133358
2024-03-14 14:30:40 +08:00
qihao.gong@jikimo.com
20436ff6ac 增加必填按钮 修改字段string 2024-03-14 14:28:38 +08:00
mgw
70218f29ac Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化
# Conflicts:
#	zpl_print/models/common.py
2024-03-14 14:24:26 +08:00
mgw
59677c0304 修改zpl相关等 2024-03-14 14:22:50 +08:00
杨金灵
35e2e4354a Accept Merge Request #896: (feature/优化agv接口 -> develop)
Merge Request: 优化agv接口和修复刀具产品模版

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/896
2024-03-14 14:08:38 +08:00
jinling.yang
5743ba5fac Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv接口 2024-03-14 11:54:34 +08:00
jinling.yang
86ec97bad1 修复刀具产品模版 2024-03-14 11:54:10 +08:00
jinling.yang
5e0b4aa509 优化产品页面 2024-03-13 17:34:35 +08:00
马广威
8117715a02 Accept Merge Request #895: (feature/制造代码优化 -> develop)
Merge Request: 修复能力特征库报错:no placeholder

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/895?initial=true
2024-03-13 09:44:07 +08:00
mgw
cf5fa70f28 修复能力特征库报错:no placeholder 2024-03-13 09:42:46 +08:00
禹翔辉
1e81ef9174 Accept Merge Request #894: (feature/刀具注册 -> develop)
Merge Request: 刀具注册,功能刀具组装流程优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/894
2024-03-13 09:08:05 +08:00
yuxianghui
d6c4eb7479 Merge branch 'feature/功能刀具注册优化' into feature/刀具注册 2024-03-13 09:02:34 +08:00
yuxianghui
0957bded16 1、优化刀具物料接口、优化功能刀具安全库存接口、优化功能刀具预警接口;2、优化功能刀具组装流程;3、优化刀具物料序列号同步步骤; 2024-03-12 17:39:21 +08:00
jinling.yang
0c44bba5f2 优化刀具产品 2024-03-12 17:32:40 +08:00
龚启豪
26942afc27 Accept Merge Request #892: (feature/修改机床参数bug -> develop)
Merge Request: 删除工序,加工工艺对象,新增表面工艺可选参数对象

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/892
2024-03-12 09:48:23 +08:00
yuxianghui
fbce395321 1、优化刀具物料序列号、刀具物料注册接口;2、优化功能刀具、功能刀具出入库记录接口;3、优化刀具物料搜索模型 2024-03-11 17:34:03 +08:00
jinling.yang
0289e2f9ff Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化agv接口 2024-03-11 17:30:46 +08:00
jinling.yang
b24355dd67 1.优化产品页面
2.优化agv回调接口且新增agv参数配置
3.优化工件配送
2024-03-11 17:30:32 +08:00
qihao.gong@jikimo.com
b315f4b3fe 维保计划项目可删除 2024-03-11 17:23:43 +08:00
黄焱
a705d805c9 设置设备模块页面强制必填字段及标识需求【表格】 2024-03-11 15:39:15 +08:00
马广威
e3b8b0a43d Accept Merge Request #891: (feature/制造代码优化 -> develop)
Merge Request: 修改工单显隐控制逻辑,优化代码

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/891?initial=true
2024-03-11 11:26:19 +08:00
mgw
2044db4d3e 修复权限问题 2024-03-11 11:25:31 +08:00
mgw
8a800e909f 修改工单显隐控制逻辑 2024-03-11 10:56:03 +08:00
mgw
0f2e6b165c 因接口触发按钮,无法触发按钮切换事件。经沟通,暂时隐藏手动触发开始等按钮的功能。 2024-03-08 21:46:26 +08:00
qihao.gong@jikimo.com
b16d2c2864 删除工序,加工工艺,新增表面工艺可选参数相关视图 2024-03-08 17:32:21 +08:00
yuxianghui
61b0b57b87 优化功能刀具等注册接口 2024-03-08 17:31:11 +08:00
黄焱
cfdc7f93ed Accept Merge Request #890: (feature/前端样式修改 -> develop)
Merge Request: 更改表格底部按钮样式

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/890
2024-03-08 15:15:14 +08:00
黄焱
d9cbc52928 Merge branch refs/heads/develop into refs/heads/feature/前端样式修改 2024-03-08 15:14:07 +08:00
黄焱
62e5105191 更改表格底部按钮样式 2024-03-08 15:11:59 +08:00
禹翔辉
1b6e474b9e Accept Merge Request #889: (feature/功能刀具注册优化 -> develop)
Merge Request: 刀具管理模块新增功能刀具相关模型注册到mrs接口

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/889?initial=true
2024-03-07 17:28:58 +08:00
yuxianghui
a7e43ad9af Merge branch 'feature/功能刀具注册-新' into feature/功能刀具注册优化 2024-03-07 17:25:26 +08:00
yuxianghui
47692a9b43 1、测试功能刀具相关模型的注册接口并优化;2、功能刀具管理模块中的需要注册的模型前端页面添加注册按钮; 2024-03-07 17:20:43 +08:00
马广威
21ebbc877a Accept Merge Request #888: (feature/制造代码优化 -> develop)
Merge Request: 修改按钮样式、优化权限

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/888?initial=true
2024-03-07 11:54:52 +08:00
mgw
457035e464 修改按钮样式、优化权限 2024-03-07 11:53:57 +08:00
yuxianghui
71cb09c08b 1、刀具物料搜索模型添加编码字段,添加自动计算编码方法;2、完善刀具物料搜索和功能刀具列表注册到cloud的接口; 2024-03-06 17:30:54 +08:00
马广威
70d6fb5660 Accept Merge Request #887: (feature/制造代码优化 -> develop)
Merge Request: 修复权限问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/887?initial=true
2024-03-06 11:21:38 +08:00
mgw
b4e0436b41 修复权限问题 2024-03-06 11:20:58 +08:00
龚启豪
0262d709eb Accept Merge Request #886: (feature/修改机床参数bug -> develop)
Merge Request: 处理设备字段类型相关缺陷

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/886
2024-03-05 17:03:10 +08:00
qihao.gong@jikimo.com
1a50a8220e 处理设备字段类型相关缺陷 2024-03-05 16:50:08 +08:00
马广威
f2213bd5f4 Accept Merge Request #885: (feature/制造代码优化 -> develop)
Merge Request: 修改工单状态

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/885?initial=true
2024-03-05 11:37:56 +08:00
mgw
fcbe33714e 修改工单状态 2024-03-05 11:37:21 +08:00
禹翔辉
184ca7940b Accept Merge Request #884: (feature/功能优化 -> develop)
Merge Request: 功能优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/884
2024-03-04 17:17:11 +08:00
yuxianghui
dceaf7fe8d Merge branch 'feature/刀具添加归档功能' into feature/功能优化 2024-03-04 17:13:42 +08:00
yuxianghui
d85b05f999 1 2024-03-04 17:11:18 +08:00
yuxianghui
9d2bad977c 1、产品模型的产品类别字段添加必填标记;2、制造订单的工单添加RFID码(已解除)字段,当工单解除装夹时保存RFID码到RFID码(已解除)字段进行展示;3、功能刀具列表的当前位置字段改为Selection类型,并优化自动计算功能刀具当前位置的方法;4、获取机床刀库信息时,对新装刀的功能刀具进行库存位移刀制造前(机内刀库);5、优化功能刀具组装时扫码自动录入RFID码功能; 2024-03-04 17:10:41 +08:00
马广威
4c8ba67cad Accept Merge Request #883: (feature/制造代码优化 -> develop)
Merge Request: 调整必填、增加用户组控制;优化代码

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/883
2024-03-04 11:54:20 +08:00
mgw
3ca5c02880 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-03-04 11:52:29 +08:00
mgw
3c0649392e 优化代码 2024-03-04 11:52:04 +08:00
黄焱
8a2d6df43b Accept Merge Request #882: (feature/前端样式修改 -> develop)
Merge Request: * 修改必填标识js,修改之前必填标识样式

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/882?initial=true
2024-03-04 11:25:29 +08:00
黄焱
98103bac73 修改必填标识js,修改之前必填标识样式 2024-03-04 11:21:50 +08:00
mgw
6cbc21cc4e 调整必填、增加用户组控制 2024-03-04 10:58:39 +08:00
黄焱
7edeb59853 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改 2024-03-04 10:27:56 +08:00
马广威
806f921ad2 Accept Merge Request #881: (feature/制造代码优化 -> develop)
Merge Request: 优化质量相关翻译,增加必填标识;处理采购订单按钮

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/881
2024-03-04 09:47:32 +08:00
mgw
ec54c8e014 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-03-04 09:45:55 +08:00
mgw
b7be5251b8 处理采购订单按钮展示的问题 2024-03-04 09:45:19 +08:00
mgw
33dc25f400 优化质量相关翻译,增加必填标识 2024-03-04 09:18:12 +08:00
黄焱
e761ff9140 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改 2024-03-01 16:31:12 +08:00
马广威
2f26a42b68 Accept Merge Request #880: (feature/制造代码优化 -> develop)
Merge Request: 优化质量模块翻译

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/880?initial=true
2024-03-01 16:27:12 +08:00
马广威
2ed7aa60ff Accept Merge Request #879: (feature/修改机床参数bug -> develop)
Merge Request: 增加必填标识,修改csv相关参数

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/879#mr-879-review-129484
2024-03-01 15:46:04 +08:00
qihao.gong@jikimo.com
7e4a3251c8 增加必填标识 2024-03-01 15:43:03 +08:00
qihao.gong@jikimo.com
b73e46dbc4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug
# Conflicts:
#	sf_warehouse/security/ir.model.access.csv
2024-03-01 11:34:59 +08:00
qihao.gong@jikimo.com
4185b79e0d 修改csv权限相关文件 2024-03-01 11:30:03 +08:00
杨金灵
3f037b2051 Accept Merge Request #878: (feature/修复日计划工单接口 -> develop)
Merge Request: 修复日计划工单接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/878?initial=true
2024-02-29 17:20:16 +08:00
jinling.yang
51c6b7ef9b 修复日计划工单接口 2024-02-29 17:16:27 +08:00
马广威
ceffbd012e Accept Merge Request #877: (feature/修复产品页面合并问题 -> develop)
Merge Request: 修复产品页面合并问题

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/877#mr-877-review-129080
2024-02-29 15:44:50 +08:00
jinling.yang
12c3869794 修复产品页面合并问题 2024-02-29 15:43:49 +08:00
杨金灵
5a348ae685 Accept Merge Request #876: (feature/修复权限 -> develop)
Merge Request: 修复权限

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/876?initial=true
2024-02-29 15:34:30 +08:00
jinling.yang
c1da64fc36 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修复权限
# Conflicts:
#	sf_dlm_management/views/product_template_management_view.xml
2024-02-29 15:32:54 +08:00
jinling.yang
c262110b9a 修复权限 2024-02-29 15:30:10 +08:00
禹翔辉
dac0c4e767 Accept Merge Request #875: (feature/刀具添加归档功能 -> develop)
Merge Request: 1、刀具组和刀具管理模块下的所以模型添加active字段,添加已归档搜索方式;2、解决俩个警告;3、产品模型的刀具物料、型号、规格字段添加当产品物料为刀具时必填及红星样式;4、关闭刀具物料查询模型和CAM用刀模型的创建按钮;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/875
2024-02-29 14:54:41 +08:00
yuxianghui
25e65b39bc Merge branch 'feature/刀具物料序列号优化' into feature/刀具添加归档功能
# Conflicts:
#	sf_dlm_management/views/product_template_management_view.xml
2024-02-29 14:52:47 +08:00
yuxianghui
3c569fd485 1、刀具组和刀具管理模块下的所以模型添加active字段,添加已归档搜索方式;2、解决俩个警告;3、产品模型的刀具物料、型号、规格字段添加当产品物料为刀具时必填及红星样式;4、关闭刀具物料查询模型和CAM用刀模型的创建按钮; 2024-02-29 14:48:21 +08:00
马广威
7c3b6de41b Accept Merge Request #874: (feature/修复分配工厂创建订单和质检接口 -> develop)
Merge Request: 修复分配工厂创建订单和质检接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/874#mr-874-review-129033
2024-02-29 14:44:40 +08:00
jinling.yang
abdc522f9f 修复分配工厂创建订单和质检接口 2024-02-29 14:42:10 +08:00
jinling.yang
ec5297937d Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-29 11:23:29 +08:00
jinling.yang
ff768a6e5d Merge branch 'feature/修复质检接口' into develop 2024-02-29 11:22:35 +08:00
杨金灵
e0ffe68446 Accept Merge Request #873: (feature/修复质检接口 -> develop)
Merge Request: 修复质检接口和产品页面相关模型的访问权限

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/873?initial=true
2024-02-29 11:22:21 +08:00
jinling.yang
0bc055b1a7 优化加工订单接口日志 2024-02-29 11:09:20 +08:00
jinling.yang
6b8789a54b 修复产品页面涉及到其他模型的访问权限 2024-02-29 11:03:02 +08:00
jinling.yang
d270eaefd0 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修复质检接口 2024-02-29 10:35:38 +08:00
jinling.yang
5dd89d3afc 修复质检接口 2024-02-29 10:34:18 +08:00
马广威
556e6ba261 Accept Merge Request #872: (feature/修改机床参数bug -> develop)
Merge Request: 修改设备oee自动生成,设备刀库编码规则

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/872#mr-872-review-128778
2024-02-28 17:15:56 +08:00
qihao.gong@jikimo.com
75354c67db 修改设备oee自动生成,设备刀库编码规则 2024-02-28 17:14:42 +08:00
禹翔辉
cf7da65ff9 Accept Merge Request #871: (feature/刀具物料序列号优化 -> develop)
Merge Request: 优化采购刀具物料时刀具物料的序列号生成规则

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/871?initial=true
2024-02-28 16:55:34 +08:00
yuxianghui
17b167f1de Merge branch 'feature/必填字段添加红星样式' into feature/刀具物料序列号优化 2024-02-28 16:53:43 +08:00
yuxianghui
6937d59b9f 1、优化采购刀具物料时刀具物料的序列号生成规则 2024-02-28 16:52:27 +08:00
杨金灵
e2e8b0a287 Accept Merge Request #870: (feature/修复质检接口 -> develop)
Merge Request: 修复质检接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/870?initial=true
2024-02-28 16:47:00 +08:00
jinling.yang
c89f3623f6 修复质检接口 2024-02-28 16:45:50 +08:00
马广威
a5122e2e18 Accept Merge Request #869: (feature/优化cnc程序和检测文件 -> develop)
Merge Request: 优化cnc程序和检测文件及质量检测

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/869
2024-02-28 16:08:57 +08:00
jinling.yang
7d96963b60 修复cnc程序排序 2024-02-28 16:03:26 +08:00
jinling.yang
b6acb48dbf Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化cnc程序和检测文件 2024-02-28 15:54:10 +08:00
jinling.yang
0538763059 1.修复及优化质检接口2.质量检查新增检测报告和检测结果2个字段 2024-02-28 15:53:46 +08:00
黄焱
6a07c09686 Accept Merge Request #868: (feature/前端样式修改 -> develop)
Merge Request: 修改,增加强制必填字段方法

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/868?initial=true
2024-02-28 14:45:54 +08:00
黄焱
19be421875 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/前端样式修改 2024-02-28 14:44:16 +08:00
黄焱
1c6544ffbf 修改,增加强制必填字段方法 2024-02-28 14:42:57 +08:00
mgw
58d2367f02 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-02-28 09:44:07 +08:00
mgw
569e28b229 优化质量模块翻译 2024-02-28 09:43:44 +08:00
黄焱
ab6a3f8b6b Accept Merge Request #867: (feature/前端样式修改 -> develop)
Merge Request: 修改*样式,增加扫码枪判断

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/867?initial=true
2024-02-27 17:58:21 +08:00
黄焱
f2c8bd7333 修改*样式,增加扫码枪判断 2024-02-27 17:57:00 +08:00
马广威
9d2e8d020b Accept Merge Request #866: (feature/制造代码优化 -> develop)
Merge Request: 处理排程处按钮的显隐规则

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/866?initial=true
2024-02-27 17:33:50 +08:00
mgw
586216fa01 代码优化 2024-02-27 17:33:08 +08:00
mgw
70038e05c8 处理排程处按钮的显隐规则 2024-02-27 17:23:15 +08:00
禹翔辉
e301a4d211 Accept Merge Request #865: (feature/必填字段添加红星样式 -> develop)
Merge Request: 1、新增必填字段前添加 * 的样式;2、给刀具管理模块的必填字段添加红星样式;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/865
2024-02-27 17:22:31 +08:00
yuxianghui
659f869d63 取消刀具安全库存的tree视图必填样式 2024-02-27 17:20:42 +08:00
yuxianghui
0952bc9b70 Merge branch 'feature/工单rfid解绑' into feature/必填字段添加红星样式 2024-02-27 17:17:19 +08:00
yuxianghui
0f8bee120b 1、新增必填字段前添加 * 的样式;2、给刀具管理模块的必填字段添加红星样式; 2024-02-27 17:15:22 +08:00
马广威
e4e03e1765 Accept Merge Request #864: (feature/制造代码优化 -> develop)
Merge Request: 增加中控接口返回对工单、计划单属性的改变(状态,时间等)

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/864
2024-02-27 15:52:08 +08:00
mgw
27c83f7d3c Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造代码优化 2024-02-27 15:49:34 +08:00
mgw
391dedc7b1 产品加工进度反馈给销售订单 2024-02-27 15:47:16 +08:00
mgw
fdddf19d13 增加中控接口返回对工单、计划单属性的改变(状态,时间等) 2024-02-27 11:42:59 +08:00
杨金灵
46f74405a1 Accept Merge Request #863: (feature/去掉多余定义的bfm_url -> develop)
Merge Request: 去掉多余定义的bfm_url

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/863?initial=true
2024-02-27 11:24:43 +08:00
jinling.yang
de6db3c313 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/去掉多余定义的bfm_url 2024-02-27 11:21:18 +08:00
jinling.yang
2ddff54311 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-27 11:21:05 +08:00
jinling.yang
a423d0c3bf 去掉多余定义的bfm_url 2024-02-27 11:20:32 +08:00
龚启豪
d684dfe8d0 Accept Merge Request #862: (feature/修改机床参数bug -> develop)
Merge Request: 修改工单布局

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/862?initial=true
2024-02-27 10:52:51 +08:00
qihao.gong@jikimo.com
e22e4801c1 修改工单布局 2024-02-27 10:51:50 +08:00
jinling.yang
8b7de5ec25 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-27 10:50:17 +08:00
jinling.yang
a1afcc517a Merge branch 'feature/优化工单搜索' into develop 2024-02-27 10:49:34 +08:00
杨金灵
25eab5c203 Accept Merge Request #861: (feature/优化工单搜索 -> develop)
Merge Request: 优化工单搜索和修复销售审查按钮

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/861?initial=true
2024-02-27 10:49:20 +08:00
jinling.yang
545c1a0407 修复销售总监审核未通过审核按钮未隐藏 2024-02-27 10:46:41 +08:00
jinling.yang
42acd22978 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-27 10:38:43 +08:00
jinling.yang
3ff8e6d0f8 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化工单搜索 2024-02-27 10:38:32 +08:00
jinling.yang
424754db1a 1.工单查询页面新增工序类型和状态搜索面板
2.销售模块新增delivery依赖
2024-02-27 10:37:59 +08:00
禹翔辉
dfada55cf7 Accept Merge Request #860: (feature/工单rfid解绑 -> develop)
Merge Request: 解除装夹工单时解除RFID码和工单的绑定关系

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/860
2024-02-26 17:22:08 +08:00
yuxianghui
7f50a3f1d3 Merge branch 'feature/刀具物料搜索计算方法优化' into feature/工单rfid解绑 2024-02-26 17:19:45 +08:00
龚启豪
ed1a528fa7 Accept Merge Request #859: (feature/修改机床参数bug -> develop)
Merge Request: 修改定时同步接口,机床参数

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/859?initial=true
2024-02-26 17:12:03 +08:00
yuxianghui
c9825805db 1、解除装夹工单时解除RFID码和工单的绑定关系 2024-02-26 17:10:34 +08:00
qihao.gong@jikimo.com
e70a91d1ec 修改定时同步接口,机床参数 2024-02-26 17:07:16 +08:00
jinling.yang
bf7926acf4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-26 16:39:43 +08:00
jinling.yang
1fcc0d2ae3 Merge branch 'feature/优化cnc程序' into develop 2024-02-26 16:39:30 +08:00
杨金灵
74678a56f7 Accept Merge Request #858: (feature/优化cnc程序 -> develop)
Merge Request: 优化cnc程序

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/858
2024-02-26 16:39:13 +08:00
jinling.yang
2a39320fc3 优化获取cnc程序的判断条件 2024-02-26 16:37:54 +08:00
jinling.yang
c528c62536 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化cnc程序 2024-02-26 16:35:01 +08:00
jinling.yang
28a080d1cd Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-26 16:34:43 +08:00
jinling.yang
267667b3f5 优化cnc程序, 2024-02-26 16:34:26 +08:00
禹翔辉
0b6f5db9ff Accept Merge Request #857: (feature/刀具物料搜索计算方法优化 -> develop)
Merge Request: 计算方法优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/857?initial=true
2024-02-26 12:09:33 +08:00
yuxianghui
a103f84635 Merge branch 'feature/刀具物料搜索优化' into feature/刀具物料搜索计算方法优化 2024-02-26 12:07:39 +08:00
yuxianghui
da89b2f00d 删除刀具物料搜索的计算字段的store=True属性,优化计算方法; 2024-02-26 12:06:00 +08:00
禹翔辉
30e7c616a2 Accept Merge Request #856: (feature/刀具物料搜索优化 -> develop)
Merge Request: 解决刀具物料搜索的计算字段数据问题;

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/856?initial=true
2024-02-26 11:42:43 +08:00
yuxianghui
690c388143 解决刀具物料搜索的计算字段数据问题; 2024-02-26 11:39:25 +08:00
jinling.yang
dbdc2e1238 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-23 19:49:55 +08:00
马广威
6c98ea7781 Accept Merge Request #855: (feature/修改机床参数bug -> develop)
Merge Request: 修改库位变更接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/855#mr-855-review-127671
2024-02-23 18:38:45 +08:00
qihao.gong@jikimo.com
85f4d01cee 修改库位变更接口 2024-02-23 18:33:35 +08:00
马广威
33b456d991 Accept Merge Request #854: (feature/修改机床参数bug -> develop)
Merge Request: 修改库位变更接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/854#mr-854-review-127659
2024-02-23 18:20:34 +08:00
qihao.gong@jikimo.com
8c8aa63b3a Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-23 18:15:45 +08:00
qihao.gong@jikimo.com
5e97f0ef2d 修改库位变更接口 2024-02-23 18:15:28 +08:00
禹翔辉
a255155b4d Accept Merge Request #853: (feature/中控接口优化1 -> develop)
Merge Request: 优化中控接口

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/853
2024-02-23 17:35:45 +08:00
yuxianghui
97165a0a82 Merge branch 'feature/刀具组接口18-19优化' into feature/中控接口优化1
# Conflicts:
#	sf_warehouse/models/model.py
2024-02-23 17:33:32 +08:00
yuxianghui
db48ef396e 1、优化中控接口14-16 2024-02-23 17:29:04 +08:00
马广威
1cd05f53b1 Accept Merge Request #852: (feature/ftp添加新的注释 -> develop)
Merge Request: ftp添加新的注释

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/852#mr-852-review-127619
2024-02-23 17:26:33 +08:00
jinling.yang
e126b812b6 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-23 17:25:08 +08:00
jinling.yang
4fcbf57e97 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-23 17:24:58 +08:00
jinling.yang
6b2608e419 ftp添加新的注释 2024-02-23 17:24:46 +08:00
马广威
9c1365f45e Accept Merge Request #851: (feature/修改机床参数bug -> develop)
Merge Request: 修改库存信息接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/851#mr-851-review-127615
2024-02-23 17:21:32 +08:00
qihao.gong@jikimo.com
acf99d3e05 修改库存信息接口 2024-02-23 17:20:25 +08:00
jinling.yang
73ee29246f Merge branch 'feature/ftp添加输出' into develop 2024-02-23 16:51:08 +08:00
jinling.yang
73e4106dc9 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/ftp添加输出 2024-02-23 16:50:25 +08:00
马广威
96cdc2aba8 Accept Merge Request #850: (feature/ftp添加输出 -> develop)
Merge Request: ftp添加输出

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/850
2024-02-23 16:48:02 +08:00
马广威
342ff9e025 Accept Merge Request #849: (feature/修改机床参数bug -> develop)
Merge Request: 修改库位信息接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/849#mr-849-review-127596
2024-02-23 16:47:40 +08:00
jinling.yang
c2ad923581 ftp添加输出 2024-02-23 16:46:52 +08:00
qihao.gong@jikimo.com
6a7cff656b 修改库位信息接口 2024-02-23 16:46:30 +08:00
龚启豪
7a00108852 Accept Merge Request #848: (feature/修改机床参数bug -> develop)
Merge Request: 修改库区信息方法

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/848?initial=true
2024-02-23 16:42:53 +08:00
qihao.gong@jikimo.com
e1d6726d8b 修改库区信息方法 2024-02-23 16:41:09 +08:00
杨金灵
dcd0f5f892 Accept Merge Request #847: (feature/修复质检接口 -> develop)
Merge Request: 修复质检接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/847?initial=true
2024-02-23 16:33:21 +08:00
龚启豪
40fdc1f804 Accept Merge Request #846: (feature/修改机床参数bug -> develop)
Merge Request: 修改获取库区接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/846
2024-02-23 16:33:19 +08:00
jinling.yang
33e88eb9cc 修复质检接口 2024-02-23 16:31:56 +08:00
qihao.gong@jikimo.com
8b8c8ebd26 修改获取库区接口 2024-02-23 16:29:23 +08:00
杨金灵
bfe7005962 Accept Merge Request #845: (feature/优化ftp -> develop)
Merge Request: 优化ftp

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/845?initial=true
2024-02-23 16:18:57 +08:00
jinling.yang
45fa6931d7 新增下拉检测文件 2024-02-23 16:16:49 +08:00
杨金灵
6f82feddeb Accept Merge Request #844: (feature/修复质检接口 -> develop)
Merge Request: 修复质检接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/844?initial=true
2024-02-23 16:03:32 +08:00
jinling.yang
998900955d 修复质检接口 2024-02-23 16:01:19 +08:00
龚启豪
1c2b50a343 Accept Merge Request #843: (feature/修改机床参数bug -> develop)
Merge Request: 新增获取库区信息定时器,完善库区变更接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/843?initial=true
2024-02-23 15:34:37 +08:00
杨金灵
49d77c736e Accept Merge Request #842: (feature/优化检测文件 -> develop)
Merge Request: 优化质检接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/842
2024-02-23 15:33:59 +08:00
jinling.yang
6711543567 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化检测文件 2024-02-23 15:33:24 +08:00
qihao.gong@jikimo.com
397cae4f87 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-23 15:31:44 +08:00
qihao.gong@jikimo.com
c726bb614c 新增获取库区信息定时器
修改库存变更接口
2024-02-23 15:31:25 +08:00
黄焱
6fa8bfffe7 Accept Merge Request #841: (feature/前端样式修改 -> develop)
Merge Request: 扫码RFID实时显示功能

Created By: @黄焱
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/841?initial=true
2024-02-23 15:31:04 +08:00
jinling.yang
2e62915b41 通过质检接口的质检文件路径获取 2024-02-23 15:29:21 +08:00
黄焱
a80f62c87f 扫码RFID实时显示功能 2024-02-23 15:28:30 +08:00
qihao.gong@jikimo.com
99ba2d0a4d Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-23 11:58:26 +08:00
qihao.gong@jikimo.com
b045854a63 修改库位变更接口 2024-02-23 11:58:12 +08:00
马广威
f015cbb9fd Accept Merge Request #839: (feature/修改机床参数bug -> develop)
Merge Request: 修改工单开始接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/839
2024-02-23 11:12:11 +08:00
杨金灵
2b9c088d1d Accept Merge Request #840: (feature/修复agv接口 -> develop)
Merge Request: 修复agv接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/840?initial=true
2024-02-23 11:12:05 +08:00
jinling.yang
9ecd95faa0 1.修复质量模块的权限2.修复agv接口 2024-02-23 11:09:57 +08:00
qihao.gong@jikimo.com
7062289c89 修改工单开始 2024-02-23 10:41:28 +08:00
qihao.gong@jikimo.com
d2b80ea42c 修改工单开始接口 2024-02-23 10:32:51 +08:00
jinling.yang
39381ac5b0 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-23 10:20:11 +08:00
jinling.yang
cc7b3ea25e Merge branch 'feature/优化后置三元检测' into develop 2024-02-23 10:19:50 +08:00
杨金灵
85a4fa49a4 Accept Merge Request #838: (feature/优化后置三元检测 -> develop)
Merge Request: 优化后置三元检测

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/838?initial=true
2024-02-23 10:19:25 +08:00
jinling.yang
935b317fe6 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化后置三元检测 2024-02-23 10:17:46 +08:00
jinling.yang
ad0b9983bf 1.新增检测报告链接地址字段
2.优化rfid码扫描
3.优化工单页面
2024-02-23 10:17:20 +08:00
龚启豪
648954faa3 Accept Merge Request #837: (feature/修改机床参数bug -> develop)
Merge Request: 修改开始结束工单

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/837?initial=true
2024-02-23 10:15:16 +08:00
qihao.gong@jikimo.com
e885d7b372 修改开始结束工单 2024-02-23 10:13:41 +08:00
龚启豪
5fcff90c01 Accept Merge Request #836: (feature/修改机床参数bug -> develop)
Merge Request: 修改工单开始结束接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/836?initial=true
2024-02-23 09:58:12 +08:00
马广威
8c4c8b0323 Accept Merge Request #835: (feature/制造代码优化 -> develop)
Merge Request: 修改货位编码规则

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/835?initial=true
2024-02-23 09:57:34 +08:00
mgw
f8101c2a16 修改货位编码规则 2024-02-23 09:57:02 +08:00
qihao.gong@jikimo.com
b7c64d9eb4 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-23 09:56:16 +08:00
qihao.gong@jikimo.com
e456b811f2 修改工单开始结束接口 2024-02-23 09:56:01 +08:00
杨金灵
01c4e13198 Accept Merge Request #834: (feature/优化接口和工单 -> develop)
Merge Request: 优化接口和工单

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/834
2024-02-22 19:41:54 +08:00
jinling.yang
7bf2316c09 优化接口和工单 2024-02-22 19:40:25 +08:00
杨金灵
e55f7c59e6 Accept Merge Request #833: (feature/修复日计划工单接口和http -> develop)
Merge Request: 修复日计划工单接口和http

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/833?initial=true
2024-02-22 18:54:15 +08:00
jinling.yang
5916b4a740 修复日计划工单接口和http 2024-02-22 18:52:36 +08:00
jinling.yang
a3f6946823 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 18:26:41 +08:00
jinling.yang
87cda7e641 Merge branch 'feature/修复日计划工单和工件预调接口' into develop 2024-02-22 18:24:54 +08:00
杨金灵
247b82e816 Accept Merge Request #832: (feature/修复日计划工单和工件预调接口 -> develop)
Merge Request: 修复日计划工单和工件预调接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/832?initial=true
2024-02-22 18:24:31 +08:00
jinling.yang
4d745b48cf Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修复日计划工单和工件预调接口 2024-02-22 18:23:14 +08:00
jinling.yang
fc2588140b 修复日计划工单和工件预调接口 2024-02-22 18:22:56 +08:00
禹翔辉
e619e6660e Accept Merge Request #831: (feature/刀具组接口18-19优化 -> develop)
Merge Request: 刀具组接口优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/831?initial=true
2024-02-22 18:16:51 +08:00
yuxianghui
475b45b293 Merge branch 'feature/中控接口14-16优化' into feature/刀具组接口18-19优化 2024-02-22 18:14:56 +08:00
yuxianghui
3c4a2b58b1 1、优化刀具接口 2024-02-22 18:12:51 +08:00
杨金灵
a8fb541568 Accept Merge Request #830: (feature/修复日计划工单接口 -> develop)
Merge Request: 修复日计划工单

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/830
2024-02-22 18:03:09 +08:00
jinling.yang
90c499f9c7 修复日计划工单 2024-02-22 18:00:16 +08:00
马广威
e6bef9d1ab Accept Merge Request #829: (feature/新增agv反馈接口 -> develop)
Merge Request: 新增agv接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/829#mr-829-review-127286
2024-02-22 17:18:31 +08:00
jinling.yang
5d22318f7d Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/新增agv反馈接口
# Conflicts:
#	sf_manufacturing/controllers/controllers.py
2024-02-22 17:17:02 +08:00
jinling.yang
da97fce6d5 新增agv相关接口 2024-02-22 17:16:16 +08:00
龚启豪
b34611d1b3 Accept Merge Request #828: (feature/修改机床参数bug -> develop)
Merge Request: 修改接口

Created By: @龚启豪
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @龚启豪
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/828?initial=true
2024-02-22 16:55:55 +08:00
qihao.gong@jikimo.com
75e2b2fabe Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug
# Conflicts:
#	sf_manufacturing/controllers/controllers.py
2024-02-22 16:54:15 +08:00
qihao.gong@jikimo.com
df57b33e19 修改接口 2024-02-22 16:52:48 +08:00
jinling.yang
0ca4165219 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 16:00:03 +08:00
jinling.yang
9ce4cf779b Merge branch 'feature/新增cmm程序' into develop 2024-02-22 15:58:53 +08:00
杨金灵
4ccebfac29 Accept Merge Request #827: (feature/新增cmm程序 -> develop)
Merge Request: 新增cmm程序及接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/827?initial=true
2024-02-22 15:58:35 +08:00
jinling.yang
1142400e9c 新增库位接口(启豪的代码) 2024-02-22 15:56:34 +08:00
jinling.yang
abcada8466 新增cmm程序对象及新增cmm接口 2024-02-22 15:55:35 +08:00
qihao.gong@jikimo.com
a8bedd0425 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-22 15:35:48 +08:00
jinling.yang
fe89a971a6 Merge branch 'feature/优化工件预调接口' into develop 2024-02-22 15:23:33 +08:00
jinling.yang
6df562a8ab Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化工件预调接口 2024-02-22 15:20:13 +08:00
jinling.yang
c086bd03f0 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 15:19:58 +08:00
jinling.yang
9e591c3813 修复工件预调接口 2024-02-22 15:18:40 +08:00
jinling.yang
0be75bc54f Merge branch 'feature/优化中控接口' into develop 2024-02-22 14:44:06 +08:00
杨金灵
d94e4469f6 Accept Merge Request #825: (feature/优化中控接口 -> develop)
Merge Request: 优化中控接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/825
2024-02-22 14:43:48 +08:00
jinling.yang
4b4fd649e6 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/优化中控接口 2024-02-22 14:42:06 +08:00
jinling.yang
fad44a5413 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 14:41:47 +08:00
禹翔辉
8910b3493e Accept Merge Request #824: (feature/中控刀具接口优化 -> develop)
Merge Request: 刀具组接口优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/824
2024-02-22 14:35:44 +08:00
yuxianghui
20fe65c73c Merge branch 'feature/刀具组接口优化' into feature/中控刀具接口优化 2024-02-22 14:34:16 +08:00
qihao.gong@jikimo.com
3fe9c9e532 修改接口方法 2024-02-22 14:30:51 +08:00
yuxianghui
259d723ec9 优化刀具组接口 2024-02-22 14:30:38 +08:00
jinling.yang
0d755a50ae 优化工单相关接口 2024-02-22 14:26:56 +08:00
禹翔辉
e27f2f72bf Accept Merge Request #823: (feature/刀具组接口优化 -> develop)
Merge Request: 刀具组接口优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/823
2024-02-22 14:26:26 +08:00
yuxianghui
b6ea81d07f Merge branch 'feature/中控接口14-19优化' into feature/刀具组接口优化 2024-02-22 14:24:26 +08:00
yuxianghui
ed8cbb1f81 1、优化刀具组接口 2024-02-22 14:23:19 +08:00
jinling.yang
65b5f7f30a Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 13:44:25 +08:00
杨金灵
bc30c0558d Accept Merge Request #822: (feature/修复中控接口 -> develop)
Merge Request: 修复中控接口

Created By: @杨金灵
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/822
2024-02-22 11:56:38 +08:00
jinling.yang
8913d2f65f Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修复中控接口 2024-02-22 11:54:18 +08:00
jinling.yang
907f5db4e2 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 11:54:01 +08:00
jinling.yang
79c6459adf 1.cnc工单新增程序文件字段2.优化获取编程单接口3.修复与中控对接的接口 2024-02-22 11:53:50 +08:00
qihao.gong@jikimo.com
87e9ecb9e2 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug 2024-02-22 10:24:03 +08:00
禹翔辉
e5129fe55f Accept Merge Request #821: (feature/中控接口14-19优化 -> develop)
Merge Request: 接口优化

Created By: @禹翔辉
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/821
2024-02-22 10:20:15 +08:00
yuxianghui
5f760cf94b Merge branch 'feature/新增中控接口' into feature/中控接口14-19优化 2024-02-22 10:17:24 +08:00
yuxianghui
ce01127664 中控对接接口优化 2024-02-22 10:15:07 +08:00
jinling.yang
ef3219a098 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop 2024-02-22 09:35:37 +08:00
qihao.gong@jikimo.com
473a8ea6fe Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/修改机床参数bug
# Conflicts:
#	sf_warehouse/views/shelf_location.xml
2024-02-21 16:40:24 +08:00
qihao.gong@jikimo.com
bb321f90a5 处理库存报错bug 2024-02-21 16:26:18 +08:00
jinling.yang
af725fa363 Merge branch 'feature/优化快速订单' into develop 2024-02-21 14:54:58 +08:00
134 changed files with 8655 additions and 4473 deletions

View File

@@ -10,9 +10,9 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['web', 'purchase'],
'depends': ['web', 'purchase', 'base_setup'],
'data': [
'views/bye_odoo.xml',
],
'demo': [
],
@@ -23,6 +23,8 @@
'web.assets_backend': [
'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*',
'jikimo_frontend/static/src/fields/Many2OneRadioField/*',
# 移除odoo相关标识
'jikimo_frontend/static/src/bye_odoo/*',
'jikimo_frontend/static/src/scss/custom_style.scss',
# 'jikimo_frontend/static/src/views/list_nums/list_nbCols.js',
'jikimo_frontend/static/src/views/list_nums/list_nums.xml',
@@ -36,7 +38,7 @@
# 'jikimo_frontend/static/src/list/custom_import.js',
# 'jikimo_frontend/static/src/list/custom_width.js',
'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml',
# 'jikimo_frontend/static/src/css/list_border_styles.css',
'jikimo_frontend/static/src/css/list_border_styles.css',
],

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="partner_demo_company" model="res.partner">
<field name="name">JKM</field>
<field name="street">B-25</field>
<field name="city">USA</field>
<!-- Use the correct reference or actual ID for the country -->
<field name="country_id" ref="base.bd"/>
<field name="zip">1229</field>
<field name="phone">+8801-712901764</field>
<field name="email">info@kolpolok.com</field>
<field name="website">www.kolpoloktechnologies.com</field>
</record>
<record id="demo_company" model="res.company">
<field name="name">Custom</field>
<field name="logo" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
<field name="favicon" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
<field name="partner_id" ref="partner_demo_company"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,16 @@
/** @odoo-module **/
import { UserMenu } from "@web/webclient/user_menu/user_menu";
import { patch } from "@web/core/utils/patch";
import { registry } from "@web/core/registry";
const userMenuRegistry = registry.category("user_menuitems");
patch(UserMenu.prototype, "legion_hide_odoo.UserMenu", {
setup() {
this._super.apply(this, arguments);
userMenuRegistry.remove("documentation");
userMenuRegistry.remove("support");
userMenuRegistry.remove("odoo_account");
},
});

View File

@@ -0,0 +1,11 @@
/** @odoo-module **/
import { WebClient } from "@web/webclient/webclient";
import { patch } from "web.utils";
patch(WebClient.prototype, "kolpolok_custom_title_and_favicon.WebClient", {
setup() {
this._super();
this.title.setParts({ zopenerp: "JIKIMO" });
},
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -4,59 +4,207 @@ import {patch} from '@web/core/utils/patch';
// import { Dialog } from "@web/core/dialog/dialog";
import {_t} from "@web/core/l10n/translation";
import {FormStatusIndicator} from "@web/views/form/form_status_indicator/form_status_indicator";
import {ListRenderer} from "@web/views/list/list_renderer";
import {Field} from "@web/views/fields/field";
var Dialog = require('web.Dialog');
// var {patch} = require("web.utils") 这句话也行
const filedRequiredList = {
// 设备大模块
'control_system_id': { multiple: false, noLabel: false },
'workbench_L': { multiple: true, noLabel: false },
'number_of_axles': { multiple: true, noLabel: false },
'x_axis': { multiple: true, noLabel: false },
'number_of_knife_library': { multiple: false, noLabel: false },
'brand_id': { multiple: false, noLabel: false },
'type_id': { multiple: false, noLabel: false },
'taper_type_id': { multiple: false, noLabel: false },
'eq_maintenance_id': { multiple: false, noLabel: false },
'overhaul_id': { multiple: false, noLabel: false },
'overhaul_period': { multiple: false, noLabel: false },
'maintenance_equipment_category_id': { multiple: false, noLabel: false },
'maintenance_type': { multiple: false, noLabel: false },
// 销售大模块
'partner_id': { multiple: false, noLabel: false },
'validity_date': { multiple: false, noLabel: false },
'vat': { multiple: false, noLabel: false },
'phone': { multiple: false, noLabel: false },
'mobile': { multiple: false, noLabel: false },
'email': { multiple: false, noLabel: false },
'category_id': { multiple: false, noLabel: false },
'radio_field_1_person': { multiple: false, noLabel: true },
// 采购大模块
'date_order': { multiple: false, noLabel: false },
'picking_type_id': { multiple: false, noLabel: false },
// 制造大模块
'production_line_id': { multiple: false, noLabel: false },
'date_approve': { multiple: false, noLabel: false },
'date_planned_start': { multiple: false, noLabel: false },
'date_planned_finished': { multiple: false, noLabel: false },
}
const tableRequiredList = [
'product_template_id', 'product_uom_qty', 'price_unit','product_id','product_qty',
'name', 'fault_type', 'maintenance_standards', 'Period'
]
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
// 你可以重写或者添加一些方法和属性
async _onDiscardChanges() {
// var self = this;
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
title: _t("Discard Changes"),
// 你可以重写或者添加一些方法和属性
async _onDiscardChanges() {
// var self = this;
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
title: _t("Discard Changes"),
// confirm_callback: function () {
// self.model.discardChanges(self.handle);
// },
});
},
// confirm_callback: function () {
// self.model.discardChanges(self.handle);
// },
});
},
async discard() {
// if (window.confirm("Are you sure you want to discard changes?")) {
// await this.props.discard();
// }
// const result = await this._confirmDiscardChange();
await this._confirmDiscardChange();
await this.props.discard();
},
async discard() {
// if (window.confirm("Are you sure you want to discard changes?")) {
// await this.props.discard();
// }
// const result = await this._confirmDiscardChange();
await this._confirmDiscardChange();
await this.props.discard();
},
_confirmDiscardChange(){
var self = this;
var def = new Promise(function (resolve, reject) {
var message = _t("请确认是否要舍弃之前的更改?");
var dialog = Dialog.confirm(self, message, {
title: _t("Warning"),
confirm_callback: resolve.bind(self, true),
cancel_callback: reject,
});
dialog.on('closed', self, reject);
});
return def;
},
_confirmDiscardChange() {
var self = this;
var def = new Promise(function (resolve, reject) {
var message = _t("请确认是否要舍弃之前的更改?");
var dialog = Dialog.confirm(self, message, {
title: _t("Warning"),
confirm_callback: resolve.bind(self, true),
cancel_callback: reject,
});
dialog.on('closed', self, reject);
});
return def;
},
}
}
);
patch(Field.prototype, 'jikimo_frontend.Field', {
setup() {
owl.onMounted(this.setRequired);
return this._super(...arguments);
},
setRequired() {
const id = this.props.id
const isRequired = filedRequiredList[id]
if(id == 'number_of_axles') {
console.log(isRequired)
}
if(isRequired) {
let dom;
dom = $(`label[for=${id}]`)
if(isRequired.multiple && dom.length > 1) {
dom = dom.eq(-1)
dom = dom.parent().parent().next().find('label')
}
if(isRequired.noLabel) {
dom = dom.parent().parent()
}
let t = dom.html()
t = '<i class="c* r" style="color: red;margin-left: -4px">*</i>' + t
dom.html(t)
}
}
})
patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
setup(){
owl.onMounted(() => {
this.activeElement = this.uiService.activeElement;
this.setRequired()
})
return this._super(...arguments);
},
setRequired() {
this.allColumns.forEach(_ => {
if( tableRequiredList.indexOf(_.name) >= 0 ) {
const dom = $(`th[data-name=${_.name}]`)
dom.addClass('addRequired')
}
})
try {
const dom = this.tableRef.el
if(dom ) {
const tfoot = $(dom).children('tfoot')
const tbooy = $(dom).children('tbody')
if(tfoot.length) {
const tfoot_tr = tfoot.children().eq(0)
const tbody_tr = tbooy.children().eq(0)
if(tfoot_tr.children().length < tbody_tr.children().length) {
tfoot_tr.prepend('<td class="prepend">')
}
}
}
} catch (e) {
console.log(e)
}
}
})
$(function (){
$(function () {
document.addEventListener('click', function () {
const dom = $('.o_form_status_indicator_buttons ')
if(dom) {
if (dom) {
const dom1 = dom.children().eq(0)
const dom2 = dom.children().eq(1)
if(!dom1.text()) {
if (!dom1.text()) {
dom1.append('保存')
dom2.append('取消')
}
}
})
function customRequired() {
let timer = null
let timer_count = 0
clearInterval(timer)
timer = setInterval(() => {
timer_count++
const dom = $('.custom_required')
let tableDom = $('.table_custom_required')
if (tableDom.length) {
tableDom = tableDom.eq(0).parents('tr').children('.table_custom_required')
tableDom.each(function () {
const i = $(this).index()
const requiredDom = $(this).parents('table').find('thead').find('th').eq(i).find('span').eq(0)
const t = requiredDom.text().replace('*', '')
requiredDom.html('<i style="color: red;margin-left: -4px">*</i>' + t)
})
clearInterval(timer)
}
if (dom.length) {
dom.each(function () {
const requiredDom = $(this).parent().prev().find('label')
let t = requiredDom.html()
if (t && t.indexOf('c*') < 0) {
t = '<i class="c*" style="color: red;margin-left: -4px">*</i>' + t
}
requiredDom.html(t)
})
clearInterval(timer)
}
if (timer_count == 20) {
clearInterval(timer)
}
}, 500)
}
var currentUrl = location.href
const listenerUrl = setInterval(() => {
const isChange = currentUrl != location.href
if (isChange) {
currentUrl = location.href
customRequired()
}
}, 500)
customRequired()
})

View File

@@ -3,6 +3,15 @@
import { registry } from "@web/core/registry";
import { url } from "@web/core/utils/urls";
import { ImageField, imageCacheKey } from '@web/views/fields/image/image_field';
import { isBinarySize } from "@web/core/utils/binary";
export const fileTypeMagicWordMap = {
"/": "jpg",
R: "gif",
i: "png",
P: "svg+xml",
};
const placeholder = "/web/static/img/placeholder.png";
export class CustomImageField extends ImageField {
setup() {
@@ -13,7 +22,7 @@ export class CustomImageField extends ImageField {
getUrl(previewFieldName) {
console.log('8888888888886666666666666666666')
if (this.state.isValid && this.props.value) {
if (1) {
if (isBinarySize(this.props.value) || this.props.value.length < 50) {
if (!this.rawCacheKey) {
this.rawCacheKey = this.props.record.data.__last_update;
}

View File

@@ -13,7 +13,7 @@ div:has(.o_required_modifier) > label::before {
color: red !important;
padding: 0 4px !important;
vertical-align: top !important;
font-size: 1.5rem !important;
font-size: unset !important;
}
.my-image div {
@@ -325,7 +325,7 @@ div[class="o_content o_component_with_search_panel"] .show_state span {
div:has(.o_required_modifier) > label::before {
position: absolute;
left: -3px;
left: 24px;
}
//.o_form_view .o_form_label {
@@ -449,4 +449,46 @@ div:has(.o_required_modifier) > label::before {
}
}
}
// 更改表格底部按钮样式
.o_list_renderer .o_field_x2many_list_row_add a,.treeHeaderBtn,.o_x2m_control_panel .o_cp_buttons .btn{
display: inline-block;
margin: 5px 0;
font-size: 14px;
color: #71639e;
border: 1px solid #71639e;
padding: 0.2rem 0.6rem;
font-size: 1.08333333rem;
border-radius: 0.25rem;
transition: all .3s;
}
.o_list_renderer .o_field_x2many_list_row_add a:hover,.treeHeaderBtn:hover,.o_x2m_control_panel .o_cp_buttons .btn:hover{
background: #71639e;
color: #fff
}
// 修改时间输入框宽度
.o_datepicker_input.o_input.datetimepicker-input {
width: 200px;
}
.o_form_view .o_form_editable .o_row > .o_field_widget, .o_form_view .o_form_editable .o_row > .o_field_widget.o_field_float_time {
width: auto !important;
flex: unset;
}
.addRequired {
padding-left: calc(0.3rem + 2px)!important;
}
.addRequired:before {
content: '*';
color: red;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
.o_list_renderer .o_list_table tfoot .o_list_number {
text-align: left;
}

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- 修改页面头部图标及文字 -->
<template id="favicon_icon" inherit_id="web.layout" name="Web layout">
<!-- change the title with reliance partner -->
<xpath expr="//head//title" position="before">
<title t-esc="'JIKIMO'"/>
</xpath>
<!-- change the default favicon icon with -->
<xpath expr="//head//link[@rel='shortcut icon']" position="replace">
<link type="image/x-icon" rel="shortcut icon" href="/jikimo_frontend/static/src/img/jikimo-logo.ico"/>
</xpath>
</template>
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
</template>
<!-- 隐藏odoo版本信息 -->
<record id="jikimo_res_config_settings_view_form" model="ir.ui.view">
<field name="name">jikimo.res.config.settings.view.form.inherit.base.setup</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[@id='about']" position="replace">
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -263,6 +263,8 @@ class QualityCheck(models.Model):
picture = fields.Binary('Picture', attachment=True)
additional_note = fields.Text(
'Additional Note', help="Additional remarks concerning this check.")
report_result = fields.Char('检测结果', readonly=True)
report_pdf = fields.Binary('检测报告', readonly=True)
def _compute_alert_count(self):
alert_data = self.env['quality.alert'].read_group([('check_id', 'in', self.ids)], ['check_id'], ['check_id'])
@@ -408,3 +410,5 @@ class QualityAlert(models.Model):
domain = [('team_ids', '=', False)]
stage_ids = stages._search(domain, order=order, access_rights_uid=SUPERUSER_ID)
return stages.browse(stage_ids)

View File

@@ -9,8 +9,10 @@ access_quality_point_user,quality.point,quality.model_quality_point,quality.grou
access_quality_point_test_type_user,quality.point.test_type,quality.model_quality_point_test_type,quality.group_quality_user,1,0,0,0
access_quality_check_stock_user,quality.check,quality.model_quality_check,stock.group_stock_user,1,1,1,0
access_stock_lot_user,stock.lot,stock.model_stock_lot,quality.group_quality_user,1,0,0,0
access_stock_pack_user,stock.move.line,stock.model_stock_move_line,quality.group_quality_user,1,0,0,0
access_stock_picking,stock.move.line,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
access_stock_picking_group_quality_user,stock_picking_group_quality_user,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
access_quality_alert_team_manager,quality.alert.team,quality.model_quality_alert_team,quality.group_quality_manager,1,1,1,1
access_quality_check_manager,quality.check,quality.model_quality_check,quality.group_quality_manager,1,1,1,1
access_quality_alert_manager,quality.alert,quality.model_quality_alert,quality.group_quality_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
9 access_quality_point_test_type_user quality.point.test_type quality.model_quality_point_test_type quality.group_quality_user 1 0 0 0
10 access_quality_check_stock_user quality.check quality.model_quality_check stock.group_stock_user 1 1 1 0
11 access_stock_lot_user stock.lot stock.model_stock_lot quality.group_quality_user 1 0 0 0
12 access_stock_pack_user stock.move.line stock.model_stock_move_line quality.group_quality_user 1 0 0 0
13 access_stock_pack_user access_stock_picking_group_quality_user stock.move.line stock_picking_group_quality_user stock.model_stock_move_line stock.model_stock_picking quality.group_quality_user 1 0 0 0
14 access_stock_picking access_quality_alert_team_manager stock.move.line quality.alert.team stock.model_stock_picking quality.model_quality_alert_team quality.group_quality_user quality.group_quality_manager 1 0 1 0 1 0 1
15 access_quality_check_manager quality.check quality.model_quality_check quality.group_quality_manager 1 1 1 1
16 access_quality_alert_team_manager access_quality_alert_manager quality.alert.team quality.alert quality.model_quality_alert_team quality.model_quality_alert quality.group_quality_manager 1 1 1 1
17 access_quality_check_manager access_quality_reason_manager quality.check quality.reason quality.model_quality_check quality.model_quality_reason quality.group_quality_manager 1 1 1 1
18 access_quality_alert_manager access_quality_tag_manager quality.alert quality.tag quality.model_quality_alert quality.model_quality_tag quality.group_quality_manager 1 1 1 1

View File

@@ -32,7 +32,9 @@
<field name="tag_ids"/>
</div>
<div>
<strong><field name="product_tmpl_id"/></strong>
<strong>
<field name="product_tmpl_id"/>
</strong>
</div>
<div>
<field name="display_name"/>
@@ -65,20 +67,28 @@
<field name="company_id" invisible="1"/>
<field name="product_id" invisible="1"/>
<div class="oe_button_box">
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}" class="oe_stat_button" icon="fa-check-square-o">
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}"
class="oe_stat_button" icon="fa-check-square-o">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="check_id" readonly="1"/></span>
<span class="o_stat_value">
<field name="check_id" readonly="1"/>
</span>
<span class="o_stat_text">Quality Check</span>
</div>
</button>
</div>
<div class="oe_title"><h1><field name="name" readonly="1"/></h1></div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="title"/>
<field name="product_tmpl_id"/>
<field name="product_id" groups="product.group_product_variant"/>
<field name="lot_id" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
<field name="lot_id" context="{'default_product_id': product_id}"
groups="stock.group_production_lot"/>
<field name="picking_id"/>
</group>
<group>
@@ -144,25 +154,25 @@
</record>
<record id="quality_alert_view_pivot" model="ir.ui.view">
<field name="name">quality.alert.view.pivot</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<pivot string="Quality Alert Analysis" sample="1">
<field name="stage_id" type="col"/>
<field name="team_id" type="row"/>
</pivot>
</field>
<field name="name">quality.alert.view.pivot</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<pivot string="Quality Alert Analysis" sample="1">
<field name="stage_id" type="col"/>
<field name="team_id" type="row"/>
</pivot>
</field>
</record>
<record id="quality_alert_view_graph" model="ir.ui.view">
<field name="name">quality.alert.view.graph</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<graph string="Quality Alert Analysis" sample="1">
<field name="reason_id"/>
<field name="stage_id"/>
</graph>
</field>
<field name="name">quality.alert.view.graph</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<graph string="Quality Alert Analysis" sample="1">
<field name="reason_id"/>
<field name="stage_id"/>
</graph>
</field>
</record>
<record id="quality_alert_view_calendar" model="ir.ui.view">
@@ -186,7 +196,8 @@
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="domain">[('team_id', '=', active_id)]</field>
<field name="context">{'default_team_id': active_id,
'search_default_team_id': [active_id]}</field>
'search_default_team_id': [active_id]}
</field>
</record>
<record id="quality_alert_action_check" model="ir.actions.act_window">
@@ -195,7 +206,7 @@
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new quality alert
Create a new quality alert
</p>
</field>
</record>
@@ -212,24 +223,35 @@
</record>
<!-- QUALITY.CHECK -->
<record id="quality_check_view_form" model="ir.ui.view">
<record id="quality_check_view_form" model="ir.ui.view">
<field name="name">quality.check.view.form</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<form>
<header>
<button name="do_pass" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}" groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
<button name="do_fail" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}" groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
<button name="do_measure" type="object" attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}" string="Measure" data-hotkey="v"/>
<button name="do_alert" type="object" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}" string="Create Alert" data-hotkey="g"/>
<button name="do_alert" type="object" class="btn-primary" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}" string="Create Alert" data-hotkey="g"/>
<button name="do_pass" type="object" class="btn-primary"
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}"
groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
<button name="do_fail" type="object" class="btn-primary"
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}"
groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
<button name="do_measure" type="object"
attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}"
string="Measure" data-hotkey="v"/>
<button name="do_alert" type="object"
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}"
string="Create Alert" data-hotkey="g"/>
<button name="do_alert" type="object" class="btn-primary"
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}"
string="Create Alert" data-hotkey="g"/>
<field name="quality_state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button" attrs="{'invisible': [('alert_count', '=', 0)]}">
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button"
attrs="{'invisible': [('alert_count', '=', 0)]}">
<field name="alert_count" string="Alerts" widget="statinfo"/>
</button>
</div>
@@ -242,21 +264,27 @@
<field name="move_line_id" invisible="1"/>
<field name="product_tracking" invisible="1"/>
<field name="is_lot_tested_fractionally" invisible="1"/>
<field name="lot_name" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
<field name="lot_id" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
<field name="lot_name"
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
<field name="lot_id"
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
<label for="qty_line" attrs="{'invisible': [('move_line_id', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': [('move_line_id', '=', False)]}">
<field name="qty_line"/>
<field name="qty_line"/>
<field name="uom_id"/>
</div>
<label for="qty_to_test" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_to_test"/>
<label for="qty_to_test"
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row"
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_to_test"/>
<field name="uom_id"/>
</div>
<label for="qty_tested" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
<label for="qty_tested"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
<div class="o_row"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
<field name="uom_id"/>
</div>
<field name="test_type" invisible="1"/>
@@ -264,26 +292,32 @@
<field name="alert_ids" invisible="1"/>
</group>
<group>
<field name="picking_id" attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
<field name="picking_id"
attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
<field name="point_id"/>
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}" attrs="{'readonly': [('point_id', '!=', False)]}"/>
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}"
attrs="{'readonly': [('point_id', '!=', False)]}"/>
<field name="control_date" invisible="1"/>
<field name="team_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="user_id" string="Control Person" invisible="1"/>
<field name="partner_id" string="Partner" attrs="{'invisible': [('partner_id', '=', False)]}"/>
<field name="partner_id" string="Partner"
attrs="{'invisible': [('partner_id', '=', False)]}"/>
</group>
</group>
<group attrs="{'invisible': [('test_type', '!=', 'picture')]}">
<field name="picture" widget="image"/>
</group>
<notebook>
<page string="Notes" name="notes">
<group>
<field string="Instructions" name="note"/>
<field string="Notes" name="additional_note"/>
</group>
</page>
<notebook>
<page string="Notes" name="notes">
<group>
<field name="report_result"/>
<field name="report_pdf" widget="pdf_viewer"/>
<field string="Instructions" name="note"/>
<field string="Notes" name="additional_note"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
@@ -311,18 +345,30 @@
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div class="row">
<div class="col-6">
<strong><span><t t-esc="record.name.value"/></span></strong>
<strong>
<span>
<t t-esc="record.name.value"/>
</span>
</strong>
</div>
<div class="col-6">
<strong><span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}"><t t-esc="record.quality_state.value"/></span></strong>
<strong>
<span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}">
<t t-esc="record.quality_state.value"/>
</span>
</strong>
</div>
</div>
<div class="row text-muted">
<div class="col-8">
<span><t t-esc="record.product_id.value"/></span>
<span>
<t t-esc="record.product_id.value"/>
</span>
</div>
<div class="col-4">
<span><t t-esc="record.lot_id.value"/></span>
<span>
<t t-esc="record.lot_id.value"/>
</span>
</div>
</div>
<div class="oe_kanban_bottom_right float-end">
@@ -350,7 +396,8 @@
<field name="user_id" string="Checked By" optional="show" widget='many2one_avatar_user'/>
<field name="point_id" optional="hide"/>
<field name="team_id" optional="show"/>
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'" decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'"
decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
<field name="company_id" groups="base.main_company"/>
</tree>
</field>
@@ -368,14 +415,14 @@
</record>
<record id="quality_check_view_pivot" model="ir.ui.view">
<field name="name">quality.check.view.pivot</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<pivot string="Quality Check Analysis" sample="1">
<field name="control_date" type="col" interval="day"/>
<field name="product_id" type="row"/>
</pivot>
</field>
<field name="name">quality.check.view.pivot</field>
<field name="model">quality.check</field>
<field name="arch" type="xml">
<pivot string="Quality Check Analysis" sample="1">
<field name="control_date" type="col" interval="day"/>
<field name="product_id" type="row"/>
</pivot>
</field>
</record>
<record id="quality_check_view_search" model="ir.ui.view">
@@ -383,7 +430,8 @@
<field name="model">quality.check</field>
<field name="arch" type="xml">
<search>
<field name="product_id" string="Product" filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
<field name="product_id" string="Product"
filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
<field name="picking_id"/>
<field name="lot_id"/>
<field name="team_id"/>
@@ -426,10 +474,11 @@
</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality check found
</p><p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
No quality check found
</p>
<p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
</p>
</field>
</record>
@@ -458,10 +507,11 @@
<field name="view_mode">tree,kanban,form,pivot,graph</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality check found
</p><p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
No quality check found
</p>
<p>
Define Quality Control Points in order to automatically generate
quality checks at the right logistic operation: transfers, manufacturing orders.
</p>
</field>
</record>
@@ -485,17 +535,25 @@
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list"
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
groups="quality.group_quality_user">
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
</button>
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" groups="quality.group_quality_user">
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}"
groups="quality.group_quality_user">
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">Pass:</span>
<span class="o_stat_text">Fail:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
<span class="o_stat_value">
<field name="quality_pass_qty"/>
</span>
<span class="o_stat_value">
<field name="quality_fail_qty"/>
</span>
</div>
</button>
</xpath>
@@ -509,17 +567,25 @@
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button"
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
groups="quality.group_quality_user">
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
</button>
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" groups="quality.group_quality_user" attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" >
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
groups="quality.group_quality_user"
attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}">
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">Pass:</span>
<span class="o_stat_text">Fail:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
<span class="o_stat_value">
<field name="quality_pass_qty"/>
</span>
<span class="o_stat_value">
<field name="quality_fail_qty"/>
</span>
</div>
</button>
</xpath>
@@ -533,8 +599,8 @@
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="%(quality_check_action_production_lot)d" type="action"
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
<field string="Quality Checks" name="quality_check_qty" widget="statinfo"/>
</button>
</xpath>
@@ -557,24 +623,36 @@
<templates>
<t t-name="kanban-box">
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
<span class="oe_kanban_color_help" t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img" t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
<span class="oe_kanban_color_help"
t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img"
t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
<div t-attf-class="o_kanban_card_header">
<div class="o_kanban_card_header_title">
<div class="o_primary"><field name="name"/></div>
<div class="o_primary">
<field name="name"/>
</div>
<div t-if="record.alias_name.value and record.alias_domain.value">
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias" title="Domain alias"></i>&amp;nbsp; <field name="alias_id"/></small>
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias"
title="Domain alias"></i>&amp;nbsp;
<field name="alias_id"/>
</small>
</div>
</div>
</div>
<div class="container o_kanban_card_content">
<div class="row">
<div class="col-6 o_kanban_primary_left">
<button class="btn btn-primary" name="%(quality_alert_action_team)d" type="action">
<span><field name="alert_count"/> Quality Alerts</span>
<button class="btn btn-primary" name="%(quality_alert_action_team)d"
type="action">
<span>
<field name="alert_count"/>
Quality Alerts
</span>
</button>
</div>
<div class="col-6 o_kanban_primary_right">
<a class="oe_kanban_stock_picking_type_list" name="%(quality_check_action_team)d" type="action">
<a class="oe_kanban_stock_picking_type_list"
name="%(quality_check_action_team)d" type="action">
<field name="check_count"/>
Checks In Progress
</a>
@@ -585,11 +663,14 @@
<div t-if="widget.editable" role="menuitem">
<a class="dropdown-item ps-0" type="edit">Configuration</a>
</div>
<div t-if="widget.editable" role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
<div t-if="widget.editable" role="menuitem" aria-haspopup="true"
class="o_no_padding_kanban_colorpicker">
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
</div>
</div>
<a class="o_kanban_manage_toggle_button o_left" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
<a class="o_kanban_manage_toggle_button o_left" href="#">
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
</a>
</div>
</t>
</templates>
@@ -615,13 +696,14 @@
<label for="alias_name" string="Email Alias"/>
<div name="alias_def">
<field name="alias_id" class="oe_read_only oe_inline"
string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
string="Email Alias" required="0"/>
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
<field name="alias_name" class="oe_inline"/>@
<field name="alias_domain" class="oe_inline" readonly="1"/>
</div>
</div>
<field name="alias_contact" class="oe_inline" groups="base.group_no_one"
string="Accept Emails From"/>
string="Accept Emails From"/>
</group>
<group>
<field name="company_id" groups="base.group_multi_company"/>
@@ -658,7 +740,9 @@
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
<div class="row">
<div class="col-12">
<strong><field name="name"/></strong>
<strong>
<field name="name"/>
</strong>
</div>
</div>
</div>
@@ -672,14 +756,15 @@
<field name="name">Quality Overview</field>
<field name="res_model">quality.alert.team</field>
<field name="view_mode">kanban,form</field>
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban" />
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban"/>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
</p><p>
Quality Teams group the different quality alerts/checks
according to the roles (teams) that need them.
</p>
</field>
<p>
Quality Teams group the different quality alerts/checks
according to the roles (teams) that need them.
</p>
</field>
</record>
<record id="quality_alert_team_action_config" model="ir.actions.act_window">
@@ -716,9 +801,9 @@
<field name="res_model">quality.tag</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Add a new tag
</p>
<p class="o_view_nocontent_smiling_face">
Add a new tag
</p>
</field>
</record>
@@ -747,7 +832,9 @@
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div>
<strong><field name="name"/></strong>
<strong>
<field name="name"/>
</strong>
</div>
</div>
</t>
@@ -763,8 +850,9 @@
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new quality alert stage
</p><p>
Quality Alert stages define the different steps a quality alert should go through.
</p>
<p>
Quality Alert stages define the different steps a quality alert should go through.
</p>
</field>
</record>
@@ -816,9 +904,19 @@
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
<div><strong><t t-esc="record.name.value"/></strong></div>
<div><strong>Products :</strong> <t t-esc="record.product_ids.value"/></div>
<div><strong>Operations :</strong> <t t-esc="record.picking_type_ids.value"/></div>
<div>
<strong>
<t t-esc="record.name.value"/>
</strong>
</div>
<div>
<strong>Products :</strong>
<t t-esc="record.product_ids.value"/>
</div>
<div>
<strong>Operations :</strong>
<t t-esc="record.picking_type_ids.value"/>
</div>
</div>
</t>
</templates>
@@ -836,39 +934,54 @@
<field string="Quality Checks" name="check_count" widget="statinfo"/>
</button>
<button name="action_see_spc_control" type="object" class="oe_stat_button"
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
<span class="fa fa-2x" data-icon="&#x2211;" style="padding-left: 10px;" role="img" aria-label="Statistics" title="Statistics"/>
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
<span class="fa fa-2x" data-icon="&#x2211;" style="padding-left: 10px;" role="img"
aria-label="Statistics" title="Statistics"/>
<div class="o_field_widget o_stat_info mr4">
<span class="o_stat_text">AVG:</span>
<span class="o_stat_text">STD:</span>
</div>
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="average"/></span>
<span class="o_stat_value"><field name="standard_deviation"/></span>
<span class="o_stat_value">
<field name="average"/>
</span>
<span class="o_stat_value">
<field name="standard_deviation"/>
</span>
</div>
</button>
</xpath>
<xpath expr="//page[@name='instructions']" position="after">
<page string="Message If Failure" name="message_if_failure"
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
<field name="failure_message"/>
</page>
</xpath>
<xpath expr="//field[@name='test_type']" position="before">
<field name="measure_on"/>
<field name="measure_frequency_type" string="Control Frequency"/>
<label for="measure_frequency_value" string="" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
<label for="measure_frequency_value" string=""
attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
<div class="o_row" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every </span>
<field name="measure_frequency_value" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Operations" attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Transfers" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
<field name="measure_frequency_unit" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every</span>
<field name="measure_frequency_value" nolabel="1"
attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Operations"
attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<label for="measure_frequency_value" string="% of Transfers"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1"
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
<field name="measure_frequency_unit"
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
</div>
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}" string="Partial Transfer Test"/>
<label for="testing_percentage_within_lot" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}" string="Percentage"/>
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}"
string="Partial Transfer Test"/>
<label for="testing_percentage_within_lot"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}"
string="Percentage"/>
<div class="o_row"
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
<field name="testing_percentage_within_lot" nolabel="1"/>
<label for="testing_percentage_within_lot" string="%"/>
</div>
@@ -877,12 +990,15 @@
<label for="norm" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
<div class="o_row" attrs="{'invisible': [('test_type', '!=', 'measure')]}">
<field name="norm" attrs="{'required': [('test_type', '=', 'measure')]}"/>
<field name="norm_unit" string="Unit of Measure" attrs="{'required': [('test_type', '=', 'measure')]}"/>
<field name="norm_unit" string="Unit of Measure"
attrs="{'required': [('test_type', '=', 'measure')]}"/>
</div>
<label for="tolerance_min" string="Tolerance" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
<div attrs="{'invisible': [('test_type', '!=', 'measure')]}" class="o_row">
<span>from </span> <field name="tolerance_min"/>
<span>to </span> <field name="tolerance_max"/>
<span>from</span>
<field name="tolerance_min"/>
<span>to</span>
<field name="tolerance_max"/>
</div>
</xpath>
</field>
@@ -895,95 +1011,96 @@
<field name="search_view_id" ref="quality_point_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No quality control point found
</p><p>
Quality control points define the quality checks which should be
performed at each operation, for your different products.
No quality control point found
</p>
<p>
Quality control points define the quality checks which should be
performed at each operation, for your different products.
</p>
</field>
</record>
<!-- Menu structure-->
<menuitem
id="menu_quality_root"
name="Quality"
web_icon="quality_control,static/description/icon.svg"
sequence="150"
groups="quality.group_quality_user"/>
id="menu_quality_root"
name="Quality"
web_icon="quality_control,static/description/icon.svg"
sequence="150"
groups="quality.group_quality_user"/>
<menuitem
id="menu_quality_dashboard"
name="Overview"
action="quality_alert_team_action"
parent="menu_quality_root"
sequence="5"/>
id="menu_quality_dashboard"
name="Overview"
action="quality_alert_team_action"
parent="menu_quality_root"
sequence="5"/>
<menuitem
id="menu_quality_control"
name="Quality Control"
parent="menu_quality_root"
sequence="15"/>
id="menu_quality_control"
name="Quality Control"
parent="menu_quality_root"
sequence="15"/>
<menuitem
id="menu_quality_control_points"
name="Control Points"
parent="menu_quality_control"
action="quality_point_action"
groups="quality.group_quality_manager"
sequence="17"/>
id="menu_quality_control_points"
name="Control Points"
parent="menu_quality_control"
action="quality_point_action"
groups="quality.group_quality_manager"
sequence="17"/>
<menuitem
id="menu_quality_checks"
name="Quality Checks"
action="quality_check_action_main"
parent="menu_quality_control"
sequence="18"/>
id="menu_quality_checks"
name="Quality Checks"
action="quality_check_action_main"
parent="menu_quality_control"
sequence="18"/>
<menuitem
id="menu_quality_alert"
name="Quality Alerts"
action="quality_alert_action_check"
parent="menu_quality_control"
sequence="20"/>
id="menu_quality_alert"
name="Quality Alerts"
action="quality_alert_action_check"
parent="menu_quality_control"
sequence="20"/>
<menuitem
id="menu_quality_configuration"
name="Configuration"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="25"/>
id="menu_quality_configuration"
name="Configuration"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="25"/>
<menuitem
id="menu_quality_config_alert_team"
name="Quality Teams"
action="quality_alert_team_action_config"
parent="menu_quality_configuration"
sequence="5"/>
id="menu_quality_config_alert_team"
name="Quality Teams"
action="quality_alert_team_action_config"
parent="menu_quality_configuration"
sequence="5"/>
<menuitem
id="menu_quality_config_alert_stage"
name="Quality Alert Stages"
action="quality_alert_stage_action"
parent="menu_quality_configuration"
groups="base.group_no_one"
sequence="15"/>
id="menu_quality_config_alert_stage"
name="Quality Alert Stages"
action="quality_alert_stage_action"
parent="menu_quality_configuration"
groups="base.group_no_one"
sequence="15"/>
<menuitem
id="menu_config_quality_tags"
name="Quality Tags"
groups="base.group_no_one"
action="quality_tag_action"
parent="menu_quality_configuration"
sequence="25"/>
id="menu_config_quality_tags"
name="Quality Tags"
groups="base.group_no_one"
action="quality_tag_action"
parent="menu_quality_configuration"
sequence="25"/>
<menuitem
id="menu_quality_reporting"
name="Reporting"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="20"/>
id="menu_quality_reporting"
name="Reporting"
groups="quality.group_quality_manager"
parent="menu_quality_root"
sequence="20"/>
<menuitem
id="menu_quality_alert_report"
action="quality_alert_action_report"
parent="menu_quality_reporting"
sequence="6"/>
id="menu_quality_alert_report"
action="quality_alert_action_report"
parent="menu_quality_reporting"
sequence="6"/>
<menuitem
id="menu_quality_check_report"
action="quality_check_action_report"
parent="menu_quality_reporting"
sequence="5"/>
id="menu_quality_check_report"
action="quality_check_action_report"
parent="menu_quality_reporting"
sequence="5"/>
</odoo>

View File

@@ -24,6 +24,7 @@
'views/tool_menu.xml',
'views/menu_fixture_view.xml',
'views/change_base_view.xml',
'views/Printer.xml',
],
'demo': [

View File

@@ -0,0 +1,28 @@
from odoo import models, fields
class Printer(models.Model):
_name = 'printer'
_description = 'Printer'
name = fields.Char(string='名称', required=True)
ip_address = fields.Char(string='IP 地址', required=True)
port = fields.Integer(string='端口', default=9100)
class TableStyle(models.Model):
_name = 'table.style'
_description = '标签样式'
name = fields.Char(string='名称', required=True)
# todo
class PrinterConfiguration(models.Model):
_name = 'printer.configuration'
_description = 'Printer Configuration'
name = fields.Char(string='名称', required=True)
printer_id = fields.Many2one('printer', string='打印机')
model = fields.Many2one('ir.model', string='模型名称')
# # 其他相关字段...

View File

@@ -1 +1,2 @@
from . import common
from . import Printer

View File

@@ -1,8 +1,8 @@
# -*- coding: utf-8 -*-
import time
import time, datetime
import hashlib
from odoo import models
import socket
class Common(models.Model):
_name = 'sf.sync.common'
@@ -29,3 +29,66 @@ class Common(models.Model):
d = dt + datetime.timedelta(hours=8)
nTime = d.strftime("%Y-%m-%d %H:%M:%S")
return nTime
class PrintingUtils(models.AbstractModel):
_name = 'printing.utils'
_description = 'Utility class for printing functionalities'
def generate_zpl_code(self, code):
# 实现生成ZPL代码的逻辑
# 初始化ZPL代码字符串
zpl_code = "^XA\n"
zpl_code += "^CW1,E:SIMSUN.TTF^FS\n"
zpl_code += "^CI28\n"
# 设置二维码位置
zpl_code += "^FO50,50\n" # 调整二维码位置,使其与资产编号在同一行
zpl_code += f"^BQN,2,6^FDLM,B0093{code}^FS\n"
# 设置资产编号文本位置
zpl_code += "^FO300,60\n" # 资产编号文本的位置,与二维码在同一行
zpl_code += "^A1N,45,45^FD编码名称: ^FS\n"
# 设置{code}文本位置
# 假设{code}文本需要位于资产编号和二维码下方,中间位置
# 设置{code}文本位置并启用自动换行
zpl_code += "^FO300,120\n" # {code}文本的起始位置
zpl_code += "^FB400,4,0,L,0\n" # 定义一个宽度为500点的文本框最多4行左对齐
zpl_code += f"^A1N,40,40^FD{code}^FS\n"
# 在{code}文本框周围绘制线框
# 假设线框的外部尺寸为宽度500点高度200点
# zpl_code += "^FO300,110^GB500,200,2^FS\n" # 绘制线框边框粗细为2点
zpl_code += "^PQ1,0,1,Y\n"
zpl_code += "^XZ\n"
return zpl_code
def send_to_printer(self, host, port, zpl_code):
# 实现发送ZPL代码到打印机的逻辑
# 将ZPL代码转换为字节串
print('zpl_code', zpl_code)
zpl_bytes = zpl_code.encode('utf-8')
print(zpl_bytes)
# 创建socket对象
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
mysocket.connect((host, port)) # 连接到打印机
mysocket.send(zpl_bytes) # 发送ZPL代码
print("ZPL code sent to printer successfully.")
except Exception as e:
print(f"Error with the connection: {e}")
finally:
mysocket.close() # 关闭连接
def print_qr_code(self, lot_name, host, port):
# 实现打印二维码的逻辑
# 这里需要传入 lot_name 参数,因为我们不能直接访问 self.lot_id.name
zpl_code = self.generate_zpl_code(lot_name)
# 发送ZPL代码到打印机
# host = "192.168.50.110" # 可以作为参数传入,或者在此配置
# port = 9100 # 可以作为参数传入,或者在此配置
self.send_to_printer(host, port, zpl_code)

View File

@@ -8,7 +8,7 @@ from odoo.http import request
class Manufacturing_Connect(http.Controller):
@http.route('/AutoDeviceApi/MaintenanceToolGroups', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
@http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_maintenance_tool_groups_Info(self, **kw):
"""
@@ -20,7 +20,7 @@ class Manufacturing_Connect(http.Controller):
try:
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
# ret = json.loads(ret['result'])
logging.info('DeviceId:%s' % ret)
tool_groups = request.env['sf.tool.groups'].sudo().search([])

View File

@@ -106,6 +106,7 @@ class MachineTool(models.Model):
lead_screw = fields.Char('丝杆')
workbench_L = fields.Char('工作台长度(mm)')
workbench_W = fields.Char('工作台宽度(mm)')
workbench_H = fields.Char('工作台高度(mm)')
guide_rail = fields.Char('导轨')
machine_tool_L = fields.Char('机床长度(mm)')
machine_tool_W = fields.Char('机床宽度(mm)')
@@ -193,6 +194,7 @@ class MachineTool(models.Model):
item.lead_screw = item.type_id.lead_screw
item.workbench_L = item.type_id.workbench_L
item.workbench_W = item.type_id.workbench_W
item.workbench_H = item.type_id.workbench_H
item.guide_rail = item.type_id.guide_rail
item.machine_tool_L = item.type_id.machine_tool_L
item.machine_tool_W = item.type_id.machine_tool_W
@@ -280,6 +282,7 @@ class MachineToolType(models.Model):
workpiece_load = fields.Char('工件最大负载(kg)')
workbench_L = fields.Char('工作台长度(mm)')
workbench_W = fields.Char('工作台宽度(mm)')
workbench_H = fields.Char('工作台高度(mm)')
machine_tool_L = fields.Char('机床长度(mm)')
machine_tool_W = fields.Char('机床宽度(mm)')
machine_tool_H = fields.Char('机床高度(mm)')
@@ -295,8 +298,9 @@ class MachineToolType(models.Model):
x_axis = fields.Integer('X轴')
y_axis = fields.Integer('Y轴')
z_axis = fields.Integer('Z轴')
b_axis = fields.Integer('B')
c_axis = fields.Integer('C')
a_axis = fields.Char('a')
b_axis = fields.Char('B')
c_axis = fields.Char('C轴')
remark = fields.Char('备注')
control_system_id = fields.Many2one('sf.machine.control_system',
string="控制系统")
@@ -309,7 +313,7 @@ class MachineToolType(models.Model):
default="", string="轴数")
# 1212新增字段
a_axis = fields.Integer('a轴')
function_type = fields.Selection(
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
default="", string="功能类型")
@@ -335,23 +339,23 @@ class MachineToolType(models.Model):
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
X_precision = fields.Char('X轴定位精度(mm)')
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
Y_precision = fields.Char('Y轴定位精度(mm)')
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
Z_precision = fields.Char('Z轴定位精度(mm)')
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
a_precision = fields.Char('a轴定位精度(mm)')
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
b_precision = fields.Char('b轴定位精度(mm)')
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
c_precision = fields.Char('c轴定位精度(mm)')
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
T_tool_time = fields.Integer('T-T换刀时间(s)')
C_tool_time = fields.Integer('C-C换刀时间(s)')
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
jg_image_id = fields.Many2many('maintenance.equipment.image', 'jg_equipment_id', string='加工能力',
domain="[('type', '=', '加工能力')]")

View File

@@ -67,186 +67,220 @@ class BasicParametersFixture(models.Model):
mounting_hole_depth = fields.Float('安装孔深度(mm)', digits=(16, 2))
centering_diameter = fields.Float('定心直径(mm)', digits=(16, 2))
code = fields.Char('编码')
active = fields.Boolean('有效', default=True)
def _get_basic_parameters_list(self, fixture_materials_data, fixture_materials_name):
if fixture_materials_name == '零点卡盘':
return self._json_zero_chuck_param(fixture_materials_data)
elif fixture_materials_name == '零点托盘':
return self._json_zero_tray_param(fixture_materials_data)
elif fixture_materials_name == '气动夹具':
return self._json_pneumatic_fixture_param(fixture_materials_data)
elif fixture_materials_name == '虎钳夹具':
return self._json_jaw_vice_fixture_param(fixture_materials_data)
elif fixture_materials_name == '磁吸夹具':
return self._json_magnet_fixture_param(fixture_materials_data)
elif fixture_materials_name == '转接板(锁板)夹具':
return self._json_adapter_board_fixture_param(fixture_materials_data)
elif fixture_materials_name == '三爪卡盘':
return self._json_scroll_chuck_param(fixture_materials_data)
return {}
def _json_zero_chuck_param(self, obj):
zero_chuck_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'orientation_dish_diameter': obj['orientation_dish_diameter'],
'clamping_diameter': obj['clamping_diameter'],
'clamping_num': obj['clamping_num'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_transposing_hole': obj['boolean_transposing_hole'],
'unlocking_method': obj['unlocking_method'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rigidity': obj['rigidity'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
})
return zero_chuck_param_str
"""零点卡盘将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'orientation_dish_diameter': obj['orientation_dish_diameter'],
'clamping_diameter': obj['clamping_diameter'],
'clamping_num': obj['clamping_num'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_transposing_hole': obj['boolean_transposing_hole'],
'unlocking_method': obj['unlocking_method'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rigidity': obj['rigidity'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
'active': obj['active']}
def _json_zero_tray_param(self, obj):
zero_tray_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'clamping_diameter': obj['clamping_diameter'],
'connector_diameter': obj['connector_diameter'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'way_to_install': obj['way_to_install'],
'type_of_drive': obj['type_of_drive'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
})
return zero_tray_param_str
"""零点托盘将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'clamping_diameter': obj['clamping_diameter'],
'connector_diameter': obj['connector_diameter'],
'chucking_power_max': obj['chucking_power_max'],
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
'way_to_install': obj['way_to_install'],
'type_of_drive': obj['type_of_drive'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'active': obj['active']}
def _json_pneumatic_fixture_param(self, obj):
pneumatic_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rated_air_pressure': obj['rated_air_pressure'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return pneumatic_fixture_param_str
"""气动夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'rated_air_pressure': obj['rated_air_pressure'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
def _json_jaw_vice_fixture_param(self, obj):
jaw_vice_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'transverse_groove': obj['transverse_groove'],
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return jaw_vice_fixture_param_str
"""虎钳夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'transverse_groove': obj['transverse_groove'],
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
def _json_magnet_fixture_param(self, obj):
magnet_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'height_tolerance_value': obj['height_tolerance_value'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'rated_adsorption_force': obj['rated_adsorption_force'],
'magnetic_field_height': obj['magnetic_field_height'],
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
})
return magnet_fixture_param_str
"""磁吸夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'height_tolerance_value': obj['height_tolerance_value'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'rated_adsorption_force': obj['rated_adsorption_force'],
'magnetic_field_height': obj['magnetic_field_height'],
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
def _json_adapter_board_fixture_param(self, obj):
adapter_board_fixture_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'screw_size': obj['screw_size'],
'via_hole_diameter': obj['via_hole_diameter'],
'type_of_drive': obj['type_of_drive'],
})
return adapter_board_fixture_param_str
"""转接板(锁板)夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'screw_size': obj['screw_size'],
'via_hole_diameter': obj['via_hole_diameter'],
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}
def _json_scroll_chuck_param(self, obj):
scroll_chuck_param_str = (0, '', {
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'mounting_hole_depth': obj['mounting_hole_depth'],
'centering_diameter': obj['centering_diameter'],
'type_of_drive': obj['type_of_drive'],
})
return scroll_chuck_param_str
"""转接板(锁板)夹具将data数据转换成list数据"""
return {'code': obj['code'],
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
[('code', '=', obj.get('fixture_model_code'))]).id,
'name': obj['name'],
'length': obj['length'],
'width': obj['width'],
'height': obj['height'],
'diameter': obj['diameter'],
'weight': obj['weight'],
'gripper_length_min': obj['gripper_length_min'],
'gripper_width_min': obj['gripper_width_min'],
'gripper_height_min': obj['gripper_height_min'],
'gripper_diameter_min': obj['gripper_diameter_min'],
'gripper_length_max': obj['gripper_length_max'],
'gripper_width_max': obj['gripper_width_max'],
'gripper_height_max': obj['gripper_height_max'],
'gripper_diameter_max': obj['gripper_diameter_max'],
'chucking_power_max': obj['chucking_power_max'],
'carrying_capacity_max': obj['carrying_capacity_max'],
'materials_model_id': self.env['sf.materials.model'].sudo().search(
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
'rigidity': obj['rigidity'],
'mounting_hole_depth': obj['mounting_hole_depth'],
'centering_diameter': obj['centering_diameter'],
'type_of_drive': obj['type_of_drive'],
'active': obj['active']}

View File

@@ -61,10 +61,10 @@ class MrsMaterialModel(models.Model):
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
active = fields.Boolean('有效', default=True)
@api.constrains('supplier_ids')
@api.onchange('gain_way')
def _check_gain_way(self):
if not self.gain_way:
raise UserError("输入获取方式")
raise UserError("选择获取方式")
if self.gain_way in ['外协', '采购']:
if not self.supplier_ids:
raise UserError("请添加供应商")
@@ -90,7 +90,7 @@ class MrsProductionProcess(models.Model):
code = fields.Char("编码")
name = fields.Char('名称')
remark = fields.Text("备注")
processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
# processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂')
active = fields.Boolean('有效', default=True)
parameter_ids = fields.One2many('sf.production.process.parameter', 'process_id', string='可选参数')
@@ -98,25 +98,25 @@ class MrsProductionProcess(models.Model):
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
class MrsProcessingTechnology(models.Model):
_name = 'sf.processing.technology'
_description = '加工工艺'
name = fields.Char('名称', index=True)
remark = fields.Text('备注', index=True)
code = fields.Char("编码")
processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
index=True, string='工序')
active = fields.Boolean('有效', default=True)
# class MrsProcessingTechnology(models.Model):
# _name = 'sf.processing.technology'
# _description = '加工工艺'
#
# name = fields.Char('名称', index=True)
# remark = fields.Text('备注', index=True)
# code = fields.Char("编码")
# processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
# index=True, string='工序')
# active = fields.Boolean('有效', default=True)
class MrsProcessingOrder(models.Model):
_name = 'sf.processing.order'
_description = '工序'
sequence = fields.Integer('Sequence')
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
index=True, string='加工工艺')
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
# class MrsProcessingOrder(models.Model):
# _name = 'sf.processing.order'
# _description = '工序'
# sequence = fields.Integer('Sequence')
# processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
# index=True, string='加工工艺')
# production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
class SupplierSort(models.Model):

View File

@@ -26,10 +26,10 @@ class FixtureModel(models.Model):
_name = 'sf.fixture.model'
_description = "夹具型号"
name = fields.Char(string="名称", size=50, required=True)
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", required=True)
name = fields.Char(string="名称", size=50)
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料")
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name')
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型", required=True)
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
model_file = fields.Binary(string="图片")
status = fields.Boolean('状态')

View File

@@ -1,9 +1,7 @@
# -*- coding: utf-8 -*-
import json
import requests
from datetime import date
from odoo import fields, models, api
from odoo.exceptions import ValidationError
from odoo.addons.sf_base.commons.common import Common
from odoo.exceptions import UserError
class CuttingToolMaterial(models.Model):
@@ -113,6 +111,24 @@ class CuttingToolModel(models.Model):
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)')
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)')
material_model_id = fields.Many2one('sf.materials.model', '材料型号')
@api.onchange('cutting_tool_material_id')
def _get_code(self):
if self.is_cloud is False:
today = date.today().strftime("%Y%m%d")
today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today)
cutting_tool_model = self.search(
[('code', 'ilike', today_code), ('is_cloud', '=', False),
('active', 'in', [True, False])],
limit=1,
order="id desc")
if not cutting_tool_model:
num = "%03d" % 1
else:
m = int(today_code[-3:]) + 1
num = "%03d" % m
self.code = "%s%s" % (today_code, num)
# 适用夹头型号可以多选
# chuck_ids = fields.Many2many(
# 'sf.cutting_tool.standard.library',
@@ -189,9 +205,9 @@ class MaintenanceStandardImage(models.Model):
('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')],
string='特征')
equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备')
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备')
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备能力特征')
jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号')
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号')
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号能力特征')
def _get_ids(self, name_arr):
ability_feature_ids = []
@@ -254,31 +270,34 @@ class ToolGroups(models.Model):
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
remark = fields.Char('备注', size=50)
active = fields.Boolean(string='已归档', default=True)
# ==========机床刀具组接口==========
def _register_tool_groups(self, obj):
create_url = '/AutoDeviceApi/MaintenanceToolGroups'
sf_sync_config = self.env['res.config.settings'].get_values()
token = sf_sync_config['token']
sf_secret_key = sf_sync_config['sf_secret_key']
headers = Common.get_headers(obj, token, sf_secret_key)
strurl = sf_sync_config['sf_url'] + create_url
device_id = ''
name = None
if obj:
for equipment_id in obj.equipment_ids:
device_id = '%s,%s' % (device_id, equipment_id.name)
name = obj.name
val = {
'DeviceId': device_id,
'GroupName': name,
}
kw = json.dumps(val, ensure_ascii=False)
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
ret = r.json()
if r == 200:
return "机床刀具组发送成功"
else:
raise ValidationError("机床刀具组发送失败")
# def _register_tool_groups(self, obj):
# # create_url = '/AutoDeviceApi/MachineToolGroup'
# sf_sync_config = self.env['res.config.settings'].get_values()
# token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(obj, token, sf_secret_key)
# strurl = "https://x24467i973.zicp.fun/AutoDeviceApi/MachineToolGroup"
# device_id = ''
# name = None
# if obj:
# for equipment_id in obj.equipment_ids:
# device_id = '%s,%s' % (device_id, equipment_id.name)
# name = obj.name
# val = {
# 'DeviceId': device_id,
# 'GroupName': name,
# }
# kw = json.dumps(val, ensure_ascii=False)
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
# print(r)
# ret = r.json()
# if r == 200:
# return "机床刀具组发送成功"
# else:
# raise ValidationError("机床刀具组发送失败")
# def write(self, vals):
# obj = super().write(vals)
@@ -290,3 +309,41 @@ class ToolGroups(models.Model):
# records = super(ToolGroups, self).create(vals_list)
# self._register_tool_groups(records)
# return records
class ToolInventory(models.Model):
_name = 'sf.tool.inventory'
_description = '功能刀具清单'
name = fields.Char('功能刀具名称', required=True)
type = fields.Char('类型')
functional_cutting_tool_model_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
prefix = fields.Char('前缀')
postfix = fields.Char('后缀')
diameter = fields.Float('直径(mm)')
angle = fields.Float('R角(mm)')
tool_length = fields.Float('刀具总长(mm)')
blade_length = fields.Float('避空长/刃长(mm)')
knife_head_name = fields.Char('刀头名称')
cutter_number = fields.Char('刀号')
blade_number = fields.Integer('刃数(个)')
extension = fields.Float('伸出长度(mm)')
work_material = fields.Selection([('', ''), ('', '')], string='加工材料')
life_span = fields.Float('寿命(h)')
tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组')
active = fields.Boolean('已归档', default=True)
@api.model_create_multi
def create(self, vals_list):
# 名称重复校验
name_list = []
for val in vals_list:
tool_inventory = self.search([('name', '=', val['name'])])
if tool_inventory:
name_list.append(val['name'])
if name_list:
raise UserError("功能刀具名称%s已存在,请重新输入" % name_list)
records = super(ToolInventory, self).create(vals_list)
return records

View File

@@ -10,6 +10,7 @@ class ToolMaterialsBasicParameters(models.Model):
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库')
cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型',
store=True)
is_cloud = fields.Boolean(related='standard_library_id.is_cloud', string='云端数据')
# 整体式刀具参数
total_length = fields.Float('总长度(mm)')
@@ -21,7 +22,7 @@ class ToolMaterialsBasicParameters(models.Model):
handle_diameter = fields.Float('柄部直径(mm)')
handle_length = fields.Float('柄部长度(mm)')
blade_tip_diameter = fields.Integer('刀尖直径(mm)')
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
blade_tip_taper = fields.Integer('刀尖锥度(°)')
blade_diameter = fields.Float('刃部直径(mm)')
blade_length = fields.Float('刃部长度(mm)')
@@ -37,7 +38,7 @@ class ToolMaterialsBasicParameters(models.Model):
cutting_blade_length = fields.Float('切削刃长(mm)')
relief_angle = fields.Integer('后角(°)')
blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20)
inscribed_circle_diameter = fields.Float('内接圆直径(mm)')
inscribed_circle_diameter = fields.Float('内接圆直径IC/D(mm)')
install_aperture_diameter = fields.Float('安装孔直径(mm)')
chip_breaker_groove = fields.Selection([('', ''), ('单面', '单面'), ('双面', '双面')],
string='有无断屑槽')
@@ -170,8 +171,6 @@ class FeedPerTooth(models.Model):
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20)
active = fields.Boolean(string='有效', default=True)
# @api.depends('product_template_id')
# def _compute_product_template_id(self):
# if self.product_template_id is not None:

View File

@@ -65,7 +65,7 @@
<record id="group_plan_dispatch" model="res.groups">
<field name="name">计划调度岗</field>
<field name="category_id" ref="module_category_plan"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<!-- <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> -->
</record>
<record id="group_plan_director" model="res.groups">

View File

@@ -9,19 +9,25 @@ access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,b
access_sf_machine_brand_tags_admin,sf_machine_brand_tags_admin,model_sf_machine_brand_tags,base.group_system,1,1,1,0
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0
access_sf_machine_control_system_admin,sf_machine_control_system_admin,model_sf_machine_control_system,base.group_system,1,1,1,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,0
access_sf_processing_order_admin,sf_processing_order_admin,model_sf_processing_order,base.group_system,1,1,1,0
access_sf_production_process_group_sale_director,sf_production_process_group_sale_director,model_sf_production_process,sf_base.group_sale_director,1,0,0,0
access_sf_production_process_group_sale_salemanager,sf_production_process_group_sale_salemanager,model_sf_production_process,sf_base.group_sale_salemanager,1,0,0,0
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0
access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,base.group_system,1,1,1,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,0,0,0
access_sf_production_materials_group_sale_salemanager,sf_production_materials_group_sale_salemanager,model_sf_production_materials,sf_base.group_sale_salemanager,1,0,0,0
access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,0
access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_model,base.group_system,1,1,1,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,0
access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_processing_technology,base.group_system,1,1,1,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0
access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
access_sf_production_process_parameter_group_sale_salemanager,sf_production_process_parameter_group_sale_salemanager,model_sf_production_process_parameter,sf_base.group_sale_salemanager,1,0,0,0
access_sf_production_process_parameter_group_plan_director,sf_production_process_parameter_group_plan_director,model_sf_production_process_parameter,sf_base.group_plan_director,1,0,0,0
access_sf_production_process_parameter_group_purchase_director,sf_production_process_parameter_group_purchase_director,model_sf_production_process_parameter,sf_base.group_purchase_director,1,0,0,0
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
@@ -37,7 +43,6 @@ access_sf_cutting_tool_type_admin,sf_cutting_tool_type_admin,model_sf_cutting_to
access_sf_cutting_tool_type_group_purchase_director,sf_cutting_tool_type_group_purchase_director,model_sf_cutting_tool_type,sf_base.group_purchase_director,1,1,0,0
access_sf_cutting_tool_type_group_sale_director,sf_cutting_tool_type_group_sale_director,model_sf_cutting_tool_type,sf_base.group_sale_director,1,1,0,0
access_sf_cutting_tool_type_group_plan_director,sf_cutting_tool_type_group_plan_director,model_sf_cutting_tool_type,sf_base.group_plan_director,1,1,0,0
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,0
access_sf_functional_cutting_tool_admin,sf_functional_cutting_tool_admin,model_sf_functional_cutting_tool,base.group_system,1,1,1,0
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,0
@@ -60,6 +65,12 @@ access_sf_international_standards,sf_international_standards,model_sf_internatio
access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,0
access_material_apply_admin,material_apply_admin,model_material_apply,base.group_system,1,1,1,0
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
access_material_apply_group_sale_director,material_apply_group_sale_director,model_material_apply,sf_base.group_sale_director,1,0,0,0
access_material_apply_group_plan_director,material_apply_group_plan_director,model_material_apply,sf_base.group_plan_director,1,0,0,0
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
access_material_apply_group_sale_salemanager,material_apply_group_sale_salemanager,model_material_apply,sf_base.group_sale_salemanager,1,0,0,0
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,0
access_sf_cutting_tool_standard_library_admin,sf_cutting_tool_standard_library_admin,model_sf_cutting_tool_standard_library,base.group_system,1,1,1,0
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,0
@@ -68,10 +79,17 @@ access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,
access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base.group_system,1,1,1,0
access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0
access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0
access_sf_cutting_speed_group_plan_dispatch,sf_cutting_speed_group_plan_dispatch,model_sf_cutting_speed,sf_base.group_plan_dispatch,1,0,0,0
access_sf_cutting_speed_group_plan_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,1,1,1,0
access_sf_cutting_speed_group_quality_director,sf_cutting_speed_group_quality_director,model_sf_cutting_speed,sf_base.group_quality_director,1,1,1,0
access_sf_cutting_speed_group_quality,sf_cutting_speed_group_quality,model_sf_cutting_speed,sf_base.group_quality,1,1,1,0
access_sf_feed_per_tooth_group_purchase_director,sf_feed_per_tooth_group_purchase_director,model_sf_feed_per_tooth,sf_base.group_purchase_director,1,1,0,0
access_sf_feed_per_tooth_group_sale_director,sf_feed_per_tooth_group_sale_director,model_sf_feed_per_tooth,sf_base.group_sale_director,1,1,0,0
access_sf_feed_per_tooth_group_plan_dispatch,sf_feed_per_tooth_group_plan_dispatch,model_sf_feed_per_tooth,sf_base.group_plan_dispatch,1,0,0,0
access_sf_feed_per_tooth_group_plan_director,sf_feed_per_tooth_group_plan_director,model_sf_feed_per_tooth,sf_base.group_plan_director,1,1,0,0
access_sf_feed_per_tooth_group_sale_salemanager,sf_feed_per_tooth_group_sale_salemanager,model_sf_feed_per_tooth,sf_base.group_sale_salemanager,1,0,0,0
access_sf_feed_per_tooth_group_quality,sf_feed_per_tooth_group_quality,model_sf_feed_per_tooth,sf_base.group_quality,1,1,1,0
access_sf_feed_per_tooth_group_quality_director,sf_feed_per_tooth_group_quality_director,model_sf_feed_per_tooth,sf_base.group_quality_director,1,1,1,0
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0
access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1
@@ -86,17 +104,19 @@ access_sf_machine_brand_group_purchase_director,sf_machine_brand_group_purchase_
access_sf_machine_brand_group_sale_director,sf_machine_brand_group_sale_director,model_sf_machine_brand,sf_base.group_sale_director,1,0,0,0
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_materials_group_plan_director,sf_production_materials_group_plan_director,model_sf_production_materials,sf_base.group_plan_director,1,1,0,0
access_sf_production_materials_group_purchase_director,sf_production_materials_group_purchase_director,model_sf_production_materials,sf_base.group_purchase_director,1,1,0,0
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,1,0,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_materials_model_group_sale_salemanager,sf_materials_model_group_sale_salemanager,model_sf_materials_model,sf_base.group_sale_salemanager,1,0,0,0
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
access_sf_materials_model_group_plan_director,sf_materials_model_group_plan_director,model_sf_materials_model,sf_base.group_plan_director,1,0,0,0
access_sf_materials_model_group_purchase_director,sf_materials_model_group_purchase_director,model_sf_materials_model,sf_base.group_purchase_director,1,0,0,0
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
@@ -116,57 +136,45 @@ access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,s
access_sf_sync_common,sf_sync_common,model_sf_sync_common,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_international_standards,sf_international_standards,model_sf_international_standards,sf_base.group_sf_mrp_user,1,0,0,0
access_material_apply,material_apply,model_material_apply,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_tool_standard_library_group_sf_mrp_user,sf_cutting_tool_standard_library_group_sf_mrp_user,model_sf_cutting_tool_standard_library,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_tool_standard_library_group_purchase_director,sf_cutting_tool_standard_library_group_purchase_director,model_sf_cutting_tool_standard_library,sf_base.group_purchase_director,1,0,1,0
access_sf_cutting_tool_standard_library_group_plan_director,sf_cutting_tool_standard_library_group_plan_director,model_sf_cutting_tool_standard_library,sf_base.group_plan_director,1,0,1,0
access_sf_cutting_tool_standard_library_group_sale_director,sf_cutting_tool_standard_library_group_sale_director,model_sf_cutting_tool_standard_library,sf_base.group_sale_director,1,0,1,0
access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_tool_materials_basic_parameters_group_sale_director,sf_tool_materials_basic_parameters_group_sale_director,model_sf_tool_materials_basic_parameters,sf_base.group_sale_director,1,0,1,0
access_sf_tool_materials_basic_parameters_group_plan_director,sf_tool_materials_basic_parameters_group_plan_director,model_sf_tool_materials_basic_parameters,sf_base.group_plan_director,1,0,1,0
access_sf_tool_materials_basic_parameters_group_purchase_director,sf_tool_materials_basic_parameters_group_purchase_director,model_sf_tool_materials_basic_parameters,sf_base.group_purchase_director,1,0,1,0
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_speed_group_purchase,sf_cutting_speed_group_purchase,model_sf_cutting_speed,sf_base.group_purchase,1,0,0,0
access_sf_cutting_speed_group_sale_salemanager,sf_cutting_speed_group_sale_salemanager,model_sf_cutting_speed,sf_base.group_sale_salemanager,1,0,0,0
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_feed_per_tooth_group_purchase,sf_feed_per_tooth_group_purchase,model_sf_feed_per_tooth,sf_base.group_purchase,1,0,0,0
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_ramping_angle_group_purchase,sf_ramping_angle_group_purchase,model_sf_ramping_angle,sf_base.group_purchase,1,0,0,0
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cutting_width_depth_group_purchase,sf_cutting_width_depth_group_purchase,model_sf_cutting_width_depth,sf_base.group_purchase,1,0,0,0
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0
access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0
access_sf_tool_groups_group_plan_director,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_director,1,1,1,0
access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
access_res_partner,res.partner,base.model_res_partner,sf_base.group_plan_dispatch,1,0,0,0
access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_line,sf_base.group_plan_dispatch,1,0,0,0
access_account_move_line,account.move.line,account.model_account_move_line,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_tool_type_group_plan_dispatch,sf.machine_tool.type,model_sf_machine_tool_type,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,1,0,0
@@ -179,10 +187,43 @@ access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,1,0,0
access_mrp_production_group_sale_salemanager,mrp_production_group_sale_salemanager,mrp.model_mrp_production,sf_base.group_sale_salemanager,1,0,0,0
access_mrp_production_group_sale_director,mrp_production_group_sale_director,mrp.model_mrp_production,sf_base.group_sale_director,1,0,0,0
access_material_apply_group_plan_dispatch,material_apply,model_material_apply,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_brand_tags_group_plan_dispatch,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_plan_dispatch,1,0,0,0
access_ir_actions_act_window_group_plan_dispatch,ir.actions.act_window,base.model_ir_actions_act_window,sf_base.group_plan_dispatch,1,0,0,0
access_ir_actions_act_window_view_group_plan_dispatch,ir.actions.act_window.view,base.model_ir_actions_act_window_view,sf_base.group_plan_dispatch,1,0,0,0
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
access_sf_international_standards_group_sale_salemanager,sf_international_standards_group_sale_salemanager,model_sf_international_standards,sf_base.group_sale_salemanager,1,0,0,0
access_sf_international_standards_group_sale_director,sf_international_standards_group_sale_director,model_sf_international_standards,sf_base.group_sale_director,1,0,0,0
access_sf_international_standards_group_plan_director,sf_international_standards_group_plan_director,model_sf_international_standards,sf_base.group_plan_director,1,0,0,0
access_sf_international_standards_group_purchase,sf_international_standards_group_purchase,model_sf_international_standards,sf_base.group_purchase,1,0,0,0
access_sf_international_standards_group_purchase_director,sf_international_standards_group_purchase_director,model_sf_international_standards,sf_base.group_purchase_director,1,0,0,0
access_sf_machine_brand_tags_group_sale_salemanager,sf_machine_brand_tags_group_sale_salemanager,model_sf_machine_brand_tags,sf_base.group_sale_salemanager,1,0,0,0
access_sf_machine_brand_tags_group_sale_director,sf_machine_brand_tags_group_sale_director,model_sf_machine_brand_tags,sf_base.group_sale_director,1,0,0,0
access_sf_machine_brand_tags_group_plan_director,sf_machine_brand_tags_group_plan_director,model_sf_machine_brand_tags,sf_base.group_plan_director,1,0,0,0
access_sf_machine_brand_tags_group_purchase,sf_machine_brand_tags_group_purchase,model_sf_machine_brand_tags,sf_base.group_purchase,1,0,0,0
access_sf_machine_brand_tags_group_purchase_director,sf_machine_brand_tags_group_purchase_director,model_sf_machine_brand_tags,sf_base.group_purchase_director,1,0,0,0
access_printer,printer,model_printer,base.group_user,1,1,1,1
access_printer_configuration,printer.configuration,model_printer_configuration,base.group_user,1,1,1,1
access_group_sf_mrp_user,sf_tool_inventory,model_sf_tool_inventory,base.group_user,1,1,1,0
access_group_sf_mrp_user_admin,sf_tool_inventory_admin,model_sf_tool_inventory,base.group_system,1,1,1,0
access_group_sf_mrp_user_group_purchase_director,sf_tool_inventory_group_purchase_director,model_sf_tool_inventory,sf_base.group_purchase_director,1,0,1,0
access_group_sf_mrp_user_group_sale_director,sf_tool_inventory_group_sale_director,model_sf_tool_inventory,sf_base.group_sale_director,1,0,1,0
access_sf_cutting_tool_material_group_plan_director,sf_tool_inventory_group_plan_director,model_sf_tool_inventory,sf_base.group_plan_director,1,0,1,0
access_group_sf_mrp_user_group_sf_mrp_user,sf_tool_inventory_group_sf_mrp_user,model_sf_tool_inventory,sf_base.group_sf_mrp_user,1,1,0,0
access_sf_fixture_material_group_purchase_director,sf_fixture_material_group_purchase_director,model_sf_fixture_material,sf_base.group_purchase_director,1,0,0,0
access_sf_multi_mounting_type_group_purchase_director,sf_multi_mounting_type_group_purchase_director,model_sf_multi_mounting_type,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_model_group_purchase_director,sf_fixture_model_group_purchase_director,model_sf_fixture_model,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_purchase_director,sf_fixture_materials_basic_parameters_group_purchase_director,model_sf_fixture_materials_basic_parameters,sf_base.group_purchase_director,1,0,0,0
access_sf_machine_tool_type_group_purchase_director,sf_machine_tool_type_group_purchase_director,model_sf_machine_tool_type,sf_base.group_purchase_director,1,0,0,0
access_sf_fixture_material_group_sale_director,sf_fixture_material_group_sale_director,model_sf_fixture_material,sf_base.group_sale_director,1,0,0,0
access_sf_multi_mounting_type_group_sale_director,sf_multi_mounting_type_group_sale_director,model_sf_multi_mounting_type,sf_base.group_sale_director,1,0,0,0
access_sf_fixture_model_group_sale_director,sf_fixture_model_group_sale_director,model_sf_fixture_model,sf_base.group_sale_director,1,0,0,0
access_sf_fixture_materials_basic_parameters_group_sale_director,sf_fixture_materials_basic_parameters_group_sale_director,model_sf_fixture_materials_basic_parameters,sf_base.group_sale_director,1,0,0,0
access_sf_machine_tool_type_group_sale_director,sf_machine_tool_type_group_sale_director,model_sf_machine_tool_type,sf_base.group_sale_director,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
9 access_sf_machine_brand_tags_admin sf_machine_brand_tags_admin model_sf_machine_brand_tags base.group_system 1 1 1 0
10 access_sf_machine_control_system sf_machine_control_system model_sf_machine_control_system base.group_user 1 1 1 0
11 access_sf_machine_control_system_admin sf_machine_control_system_admin model_sf_machine_control_system base.group_system 1 1 1 0
12 access_sf_processing_order access_sf_production_process_group_sale_director sf_processing_order sf_production_process_group_sale_director model_sf_processing_order model_sf_production_process base.group_user sf_base.group_sale_director 1 1 0 1 0 0
13 access_sf_processing_order_admin access_sf_production_process_group_sale_salemanager sf_processing_order_admin sf_production_process_group_sale_salemanager model_sf_processing_order model_sf_production_process base.group_system sf_base.group_sale_salemanager 1 1 0 1 0 0
14 access_sf_production_process sf_production_process model_sf_production_process base.group_user 1 1 1 0
15 access_sf_production_process access_sf_production_process_admin sf_production_process sf_production_process_admin model_sf_production_process base.group_user base.group_system 1 1 1 0
16 access_sf_production_process_admin access_sf_production_materials sf_production_process_admin sf_production_materials model_sf_production_process model_sf_production_materials base.group_system base.group_user 1 1 1 0
17 access_sf_production_materials access_sf_production_materials_group_sale_director sf_production_materials sf_production_materials_group_sale_director model_sf_production_materials base.group_user sf_base.group_sale_director 1 1 0 1 0 0
18 access_sf_production_materials_group_sale_salemanager sf_production_materials_group_sale_salemanager model_sf_production_materials sf_base.group_sale_salemanager 1 0 0 0
19 access_sf_production_materials_admin sf_production_materials_admin model_sf_production_materials base.group_system 1 1 1 0
20 access_sf_materials_model sf_materials_model model_sf_materials_model base.group_user 1 1 1 0
21 access_sf_production_materials_admin access_sf_materials_model_admin sf_production_materials_admin sf_materials_model_admin model_sf_production_materials model_sf_materials_model base.group_system 1 1 1 0
22 access_sf_materials_model access_sf_supplier_sort sf_materials_model sf_supplier_sort model_sf_materials_model model_sf_supplier_sort base.group_user 1 1 1 0
23 access_sf_materials_model_admin access_sf_supplier_sort_admin sf_materials_model_admin sf_supplier_sort_admin model_sf_materials_model model_sf_supplier_sort base.group_system 1 1 1 0
access_sf_processing_technology sf_processing_technology model_sf_processing_technology base.group_user 1 1 1 0
access_sf_processing_technology_admin sf_processing_technology_admin model_sf_processing_technology base.group_system 1 1 1 0
24 access_sf_supplier_sort access_sf_production_process_parameter sf_supplier_sort sf_production_process_parameter model_sf_supplier_sort model_sf_production_process_parameter base.group_user 1 1 1 0
25 access_sf_supplier_sort_admin access_sf_production_process_parameter_group_sale_director sf_supplier_sort_admin sf_production_process_parameter_group_sale_director model_sf_supplier_sort model_sf_production_process_parameter base.group_system sf_base.group_sale_director 1 1 0 1 0 0
26 access_sf_production_process_parameter access_sf_production_process_parameter_group_sale_salemanager sf_production_process_parameter sf_production_process_parameter_group_sale_salemanager model_sf_production_process_parameter base.group_user sf_base.group_sale_salemanager 1 1 0 1 0 0
27 access_sf_production_process_parameter_group_plan_director sf_production_process_parameter_group_plan_director model_sf_production_process_parameter sf_base.group_plan_director 1 0 0 0
28 access_sf_production_process_parameter_group_purchase_director sf_production_process_parameter_group_purchase_director model_sf_production_process_parameter sf_base.group_purchase_director 1 0 0 0
29 access_sf_production_process_parameter_group_sale_director sf_production_process_parameter_group_sale_director model_sf_production_process_parameter sf_base.group_sale_director 1 0 0 0
30 access_sf_production_process_parameter_admin sf_production_process_parameter_admin model_sf_production_process_parameter base.group_system 1 1 1 0
31 access_sf_production_process_parameter_group_plan_director access_sf_production_process_category sf_production_process_parameter_group_plan_director sf_production_process_category model_sf_production_process_parameter model_sf_production_process_category sf_base.group_plan_director base.group_user 1 0 1 0 1 0
32 access_sf_production_process_parameter_group_purchase_director access_sf_production_process_category_admin sf_production_process_parameter_group_purchase_director sf_production_process_category_admin model_sf_production_process_parameter model_sf_production_process_category sf_base.group_purchase_director base.group_system 1 0 1 0 1 0
33 access_sf_production_process_parameter_group_sale_director access_sf_machine_tool_category sf_production_process_parameter_group_sale_director sf_machine_tool_category model_sf_production_process_parameter model_sf_machine_tool_category sf_base.group_sale_director base.group_user 1 0 1 0 1 0
43 access_sf_cutting_tool_type_group_purchase_director access_sf_functional_cutting_tool_admin sf_cutting_tool_type_group_purchase_director sf_functional_cutting_tool_admin model_sf_cutting_tool_type model_sf_functional_cutting_tool sf_base.group_purchase_director base.group_system 1 1 0 1 0
44 access_sf_cutting_tool_type_group_sale_director access_sf_functional_cutting_tool_model sf_cutting_tool_type_group_sale_director sf_functional_cutting_tool_model model_sf_cutting_tool_type model_sf_functional_cutting_tool_model sf_base.group_sale_director base.group_user 1 1 0 1 0
45 access_sf_cutting_tool_type_group_plan_director access_sf_functional_cutting_tool_model_admin sf_cutting_tool_type_group_plan_director sf_functional_cutting_tool_model_admin model_sf_cutting_tool_type model_sf_functional_cutting_tool_model sf_base.group_plan_director base.group_system 1 1 0 1 0
access_sf_functional_cutting_tool sf_functional_cutting_tool model_sf_functional_cutting_tool base.group_user 1 1 1 0
46 access_sf_functional_cutting_tool_admin access_sf_fixture_material sf_functional_cutting_tool_admin sf_fixture_material model_sf_functional_cutting_tool model_sf_fixture_material base.group_system base.group_user 1 1 1 0
47 access_sf_functional_cutting_tool_model access_sf_fixture_material_admin sf_functional_cutting_tool_model sf_fixture_material_admin model_sf_functional_cutting_tool_model model_sf_fixture_material base.group_user base.group_system 1 1 1 0
48 access_sf_functional_cutting_tool_model_admin access_sf_fixture_materials_basic_parameters sf_functional_cutting_tool_model_admin sf_fixture_materials_basic_parameters model_sf_functional_cutting_tool_model model_sf_fixture_materials_basic_parameters base.group_system base.group_user 1 1 1 0
65 access_material_apply access_material_apply_group_sale_director material_apply material_apply_group_sale_director model_material_apply base.group_user sf_base.group_sale_director 1 1 0 1 0 0
66 access_material_apply_admin access_material_apply_group_plan_director material_apply_admin material_apply_group_plan_director model_material_apply base.group_system sf_base.group_plan_director 1 1 0 1 0 0
67 access_sf_cutting_tool_standard_library access_material_apply_group_purchase_director sf_cutting_tool_standard_library material_apply_group_purchase_director model_sf_cutting_tool_standard_library model_material_apply base.group_user sf_base.group_purchase_director 1 1 0 1 0 0
68 access_material_apply_group_sale_salemanager material_apply_group_sale_salemanager model_material_apply sf_base.group_sale_salemanager 1 0 0 0
69 access_sf_cutting_tool_standard_library sf_cutting_tool_standard_library model_sf_cutting_tool_standard_library base.group_user 1 1 1 0
70 access_sf_cutting_tool_standard_library_admin sf_cutting_tool_standard_library_admin model_sf_cutting_tool_standard_library base.group_system 1 1 1 0
71 access_sf_tool_materials_basic_parameters sf_tool_materials_basic_parameters model_sf_tool_materials_basic_parameters base.group_user 1 1 1 0
72 access_sf_tool_materials_basic_parameters_admin sf_tool_materials_basic_parameters_admin model_sf_tool_materials_basic_parameters base.group_system 1 1 1 0
73 access_sf_cutting_speed sf_cutting_speed model_sf_cutting_speed base.group_user 1 1 1 0
74 access_sf_cutting_tool_standard_library_admin access_sf_cutting_speed_admin sf_cutting_tool_standard_library_admin sf_cutting_speed_admin model_sf_cutting_tool_standard_library model_sf_cutting_speed base.group_system 1 1 1 0
75 access_sf_tool_materials_basic_parameters access_sf_cutting_speed_group_purchase_director sf_tool_materials_basic_parameters sf_cutting_speed_group_purchase_director model_sf_tool_materials_basic_parameters model_sf_cutting_speed base.group_user sf_base.group_purchase_director 1 1 1 0
76 access_sf_tool_materials_basic_parameters_admin access_sf_cutting_speed_group_sale_director sf_tool_materials_basic_parameters_admin sf_cutting_speed_group_sale_director model_sf_tool_materials_basic_parameters model_sf_cutting_speed base.group_system sf_base.group_sale_director 1 1 1 0
79 access_sf_cutting_speed_group_purchase_director access_sf_cutting_speed_group_quality_director sf_cutting_speed_group_purchase_director sf_cutting_speed_group_quality_director model_sf_cutting_speed sf_base.group_purchase_director sf_base.group_quality_director 1 1 1 0
80 access_sf_cutting_speed_group_sale_director access_sf_cutting_speed_group_quality sf_cutting_speed_group_sale_director sf_cutting_speed_group_quality model_sf_cutting_speed sf_base.group_sale_director sf_base.group_quality 1 1 1 0
81 access_sf_cutting_speed_group_plan_director access_sf_feed_per_tooth_group_purchase_director sf_cutting_speed_group_plan_director sf_feed_per_tooth_group_purchase_director model_sf_cutting_speed model_sf_feed_per_tooth sf_base.group_plan_director sf_base.group_purchase_director 1 1 1 0 0
82 access_sf_feed_per_tooth_group_sale_director sf_feed_per_tooth_group_sale_director model_sf_feed_per_tooth sf_base.group_sale_director 1 1 0 0
83 access_sf_feed_per_tooth_group_purchase_director access_sf_feed_per_tooth_group_plan_dispatch sf_feed_per_tooth_group_purchase_director sf_feed_per_tooth_group_plan_dispatch model_sf_feed_per_tooth sf_base.group_purchase_director sf_base.group_plan_dispatch 1 1 0 0 0
84 access_sf_feed_per_tooth_group_plan_director sf_feed_per_tooth_group_plan_director model_sf_feed_per_tooth sf_base.group_plan_director 1 1 0 0
85 access_sf_feed_per_tooth_group_sale_salemanager sf_feed_per_tooth_group_sale_salemanager model_sf_feed_per_tooth sf_base.group_sale_salemanager 1 0 0 0
86 access_sf_feed_per_tooth_group_sale_director access_sf_feed_per_tooth_group_quality sf_feed_per_tooth_group_sale_director sf_feed_per_tooth_group_quality model_sf_feed_per_tooth sf_base.group_sale_director sf_base.group_quality 1 1 0 1 0
87 access_sf_feed_per_tooth_group_plan_director access_sf_feed_per_tooth_group_quality_director sf_feed_per_tooth_group_plan_director sf_feed_per_tooth_group_quality_director model_sf_feed_per_tooth sf_base.group_plan_director sf_base.group_quality_director 1 1 0 1 0
88 access_sf_feed_per_tooth sf_feed_per_tooth model_sf_feed_per_tooth base.group_user 1 1 1 0
89 access_sf_feed_per_tooth access_sf_feed_per_tooth_admin sf_feed_per_tooth sf_feed_per_tooth_admin model_sf_feed_per_tooth base.group_user base.group_system 1 1 1 0
90 access_sf_ramping_angle sf_ramping_angle model_sf_ramping_angle base.group_user 1 1 1 1
91 access_sf_ramping_angle_admin sf_ramping_angle_admin model_sf_ramping_angle base.group_system 1 1 1 1
92 access_sf_cutting_width_depth sf_cutting_width_depth model_sf_cutting_width_depth base.group_user 1 1 1 1
93 access_sf_feed_per_tooth_admin access_sf_cutting_width_depth_admin sf_feed_per_tooth_admin sf_cutting_width_depth_admin model_sf_feed_per_tooth model_sf_cutting_width_depth base.group_system 1 1 1 0 1
94 access_sf_ramping_angle access_sf_machine_tool sf_ramping_angle sf_machine_tool model_sf_ramping_angle model_sf_machine_tool base.group_user sf_base.group_sf_mrp_user 1 1 0 1 0 1 0
95 access_sf_ramping_angle_admin access_sf_machine_tool_type sf_ramping_angle_admin sf_machine_tool_type model_sf_ramping_angle model_sf_machine_tool_type base.group_system sf_base.group_sf_mrp_user 1 1 0 1 0 1 0
104 access_sf_machine_brand_tags access_sf_production_materials_group_plan_director sf_machine_brand_tags sf_production_materials_group_plan_director model_sf_machine_brand_tags model_sf_production_materials base.group_user sf_base.group_plan_director 1 1 1 0 1 0
105 access_sf_machine_control_system access_sf_production_materials_group_purchase_director sf_machine_control_system sf_production_materials_group_purchase_director model_sf_machine_control_system model_sf_production_materials sf_base.group_sf_mrp_user sf_base.group_purchase_director 1 0 1 0 0
106 access_sf_processing_order access_sf_production_materials_group_sale_director sf_processing_order sf_production_materials_group_sale_director model_sf_processing_order model_sf_production_materials sf_base.group_sf_mrp_user sf_base.group_sale_director 1 0 1 0 0
access_sf_production_process sf_production_process model_sf_production_process sf_base.group_sf_mrp_user 1 0 0 0
107 access_sf_production_materials access_sf_materials_model sf_production_materials sf_materials_model model_sf_production_materials model_sf_materials_model sf_base.group_sf_mrp_user 1 0 0 0
108 access_sf_production_materials_group_plan_director access_sf_materials_model_group_sale_salemanager sf_production_materials_group_plan_director sf_materials_model_group_sale_salemanager model_sf_production_materials model_sf_materials_model sf_base.group_plan_director sf_base.group_sale_salemanager 1 1 0 0 0
109 access_sf_production_materials_group_purchase_director access_sf_materials_model_group_sale_director sf_production_materials_group_purchase_director sf_materials_model_group_sale_director model_sf_production_materials model_sf_materials_model sf_base.group_purchase_director sf_base.group_sale_director 1 1 0 0 0
110 access_sf_production_materials_group_sale_director access_sf_materials_model_group_plan_director sf_production_materials_group_sale_director sf_materials_model_group_plan_director model_sf_production_materials model_sf_materials_model sf_base.group_sale_director sf_base.group_plan_director 1 1 0 0 0
111 access_sf_materials_model access_sf_materials_model_group_purchase_director sf_materials_model sf_materials_model_group_purchase_director model_sf_materials_model sf_base.group_sf_mrp_user sf_base.group_purchase_director 1 0 0 0
112 access_sf_materials_model_group_plan_director access_sf_materials_model_group_sale_director sf_materials_model_group_plan_director sf_materials_model_group_sale_director model_sf_materials_model sf_base.group_plan_director sf_base.group_sale_director 1 0 0 0
113 access_sf_supplier_sort sf_supplier_sort model_sf_supplier_sort sf_base.group_sf_mrp_user 1 0 0 0
114 access_sf_production_process_parameter sf_production_process_parameter model_sf_production_process_parameter sf_base.group_sf_mrp_user 1 0 0 0
115 access_sf_production_process_category sf_production_process_category model_sf_production_process_category sf_base.group_sf_mrp_user 1 0 0 0
116 access_sf_machine_tool_category sf_machine_tool_category model_sf_machine_tool_category sf_base.group_sf_mrp_user 1 0 0 0
117 access_sf_materials_model_group_purchase_director access_sf_cutting_tool_material_group_purchase_director sf_materials_model_group_purchase_director sf_cutting_tool_material_group_purchase_director model_sf_materials_model model_sf_cutting_tool_material sf_base.group_purchase_director 1 0 0 1 0
118 access_sf_materials_model_group_sale_director access_sf_cutting_tool_material_group_sale_director sf_materials_model_group_sale_director sf_cutting_tool_material_group_sale_director model_sf_materials_model model_sf_cutting_tool_material sf_base.group_sale_director 1 0 0 1 0
119 access_sf_processing_technology access_sf_cutting_tool_material_group_plan_director sf_processing_technology sf_cutting_tool_material_group_plan_director model_sf_processing_technology model_sf_cutting_tool_material sf_base.group_sf_mrp_user sf_base.group_plan_director 1 0 0 1 0
access_sf_supplier_sort sf_supplier_sort model_sf_supplier_sort sf_base.group_sf_mrp_user 1 0 0 0
120 access_sf_production_process_parameter access_sf_cutting_tool_type sf_production_process_parameter sf_cutting_tool_type model_sf_production_process_parameter model_sf_cutting_tool_type sf_base.group_sf_mrp_user 1 0 0 0
121 access_sf_production_process_category access_sf_functional_cutting_tool sf_production_process_category sf_functional_cutting_tool model_sf_production_process_category model_sf_functional_cutting_tool sf_base.group_sf_mrp_user 1 0 0 0
122 access_sf_machine_tool_category access_sf_functional_cutting_tool_model sf_machine_tool_category sf_functional_cutting_tool_model model_sf_machine_tool_category model_sf_functional_cutting_tool_model sf_base.group_sf_mrp_user 1 0 0 0
136 access_sf_international_standards access_sf_tool_groups sf_international_standards sf_tool_groups model_sf_international_standards model_sf_tool_groups sf_base.group_sf_mrp_user 1 0 0 0
137 access_material_apply access_sf_tool_materials_basic_parameters_group_sale_director material_apply sf_tool_materials_basic_parameters_group_sale_director model_material_apply model_sf_tool_materials_basic_parameters sf_base.group_sf_mrp_user sf_base.group_sale_director 1 0 0 1 0
138 access_sf_cutting_tool_standard_library_group_sf_mrp_user access_sf_tool_materials_basic_parameters_group_plan_director sf_cutting_tool_standard_library_group_sf_mrp_user sf_tool_materials_basic_parameters_group_plan_director model_sf_cutting_tool_standard_library model_sf_tool_materials_basic_parameters sf_base.group_sf_mrp_user sf_base.group_plan_director 1 0 0 1 0
access_sf_cutting_tool_standard_library_group_purchase_director sf_cutting_tool_standard_library_group_purchase_director model_sf_cutting_tool_standard_library sf_base.group_purchase_director 1 0 1 0
139 access_sf_cutting_tool_standard_library_group_plan_director access_sf_tool_materials_basic_parameters_group_purchase_director sf_cutting_tool_standard_library_group_plan_director sf_tool_materials_basic_parameters_group_purchase_director model_sf_cutting_tool_standard_library model_sf_tool_materials_basic_parameters sf_base.group_plan_director sf_base.group_purchase_director 1 0 1 0
140 access_sf_cutting_tool_standard_library_group_sale_director access_sf_cutting_speed sf_cutting_tool_standard_library_group_sale_director sf_cutting_speed model_sf_cutting_tool_standard_library model_sf_cutting_speed sf_base.group_sale_director sf_base.group_sf_mrp_user 1 0 1 0 0
141 access_sf_tool_groups access_sf_cutting_speed_group_purchase sf_tool_groups sf_cutting_speed_group_purchase model_sf_tool_groups model_sf_cutting_speed sf_base.group_sf_mrp_user sf_base.group_purchase 1 0 0 0
142 access_sf_tool_materials_basic_parameters_group_sale_director access_sf_cutting_speed_group_sale_salemanager sf_tool_materials_basic_parameters_group_sale_director sf_cutting_speed_group_sale_salemanager model_sf_tool_materials_basic_parameters model_sf_cutting_speed sf_base.group_sale_director sf_base.group_sale_salemanager 1 0 1 0 0
access_sf_tool_materials_basic_parameters_group_plan_director sf_tool_materials_basic_parameters_group_plan_director model_sf_tool_materials_basic_parameters sf_base.group_plan_director 1 0 1 0
143 access_sf_tool_materials_basic_parameters_group_purchase_director access_sf_feed_per_tooth sf_tool_materials_basic_parameters_group_purchase_director sf_feed_per_tooth model_sf_tool_materials_basic_parameters model_sf_feed_per_tooth sf_base.group_purchase_director sf_base.group_sf_mrp_user 1 0 1 0 0
144 access_sf_cutting_speed access_sf_feed_per_tooth_group_purchase sf_cutting_speed sf_feed_per_tooth_group_purchase model_sf_cutting_speed model_sf_feed_per_tooth sf_base.group_sf_mrp_user sf_base.group_purchase 1 0 0 0
145 access_sf_cutting_speed_group_purchase access_sf_ramping_angle sf_cutting_speed_group_purchase sf_ramping_angle model_sf_cutting_speed model_sf_ramping_angle sf_base.group_purchase sf_base.group_sf_mrp_user 1 0 0 0
146 access_sf_cutting_speed_group_sale_salemanager access_sf_ramping_angle_group_purchase sf_cutting_speed_group_sale_salemanager sf_ramping_angle_group_purchase model_sf_cutting_speed model_sf_ramping_angle sf_base.group_sale_salemanager sf_base.group_purchase 1 0 0 0
access_sf_feed_per_tooth sf_feed_per_tooth model_sf_feed_per_tooth sf_base.group_sf_mrp_user 1 0 0 0
147 access_sf_feed_per_tooth_group_purchase access_sf_cutting_width_depth sf_feed_per_tooth_group_purchase sf_cutting_width_depth model_sf_feed_per_tooth model_sf_cutting_width_depth sf_base.group_purchase sf_base.group_sf_mrp_user 1 0 0 0
148 access_sf_ramping_angle access_sf_cutting_width_depth_group_purchase sf_ramping_angle sf_cutting_width_depth_group_purchase model_sf_ramping_angle model_sf_cutting_width_depth sf_base.group_sf_mrp_user sf_base.group_purchase 1 0 0 0
149 access_sf_ramping_angle_group_purchase access_maintenance_equipment_image sf_ramping_angle_group_purchase maintenance_equipment_image model_sf_ramping_angle model_maintenance_equipment_image sf_base.group_purchase base.group_user 1 0 1 0 1 0 1
access_sf_cutting_width_depth sf_cutting_width_depth model_sf_cutting_width_depth sf_base.group_sf_mrp_user 1 0 0 0
access_sf_cutting_width_depth_group_purchase sf_cutting_width_depth_group_purchase model_sf_cutting_width_depth sf_base.group_purchase 1 0 0 0
150 access_maintenance_equipment_image access_purchase_order_group_purchase maintenance_equipment_image access_purchase_order_group_purchase model_maintenance_equipment_image purchase.model_purchase_order base.group_user sf_base.group_purchase 1 1 1 1 0
151 access_purchase_order_group_purchase access_purchase_order_line_group_purchase access_purchase_order_group_purchase access_purchase_order_line_group_purchase purchase.model_purchase_order purchase.model_purchase_order_line sf_base.group_purchase 1 1 1 0
152 access_purchase_order_group_purchase_director access_spindle_taper_type access_purchase_order_group_purchase_director spindle_taper_type purchase.model_purchase_order model_spindle_taper_type sf_base.group_purchase_director base.group_user 1 1 1 0 1
153 access_purchase_order_line_group_purchase access_sf_tool_groups_group_plan_dispatch access_purchase_order_line_group_purchase sf_tool_groups purchase.model_purchase_order_line model_sf_tool_groups sf_base.group_purchase sf_base.group_plan_dispatch 1 1 0 1 0 0
154 access_purchase_order_line_group_purchase_director access_sf_tool_groups_group_plan_director access_purchase_order_line_group_purchase_director sf_tool_groups purchase.model_purchase_order_line model_sf_tool_groups sf_base.group_purchase_director sf_base.group_plan_director 1 1 1 0
155 access_spindle_taper_type access_sf_tool_groups_group_sf_tool_user spindle_taper_type sf_tool_groups model_spindle_taper_type model_sf_tool_groups base.group_user sf_base.group_sf_tool_user 1 1 1 1
access_sf_tool_groups_group_plan_dispatch sf_tool_groups model_sf_tool_groups sf_base.group_plan_dispatch 1 0 0 0
156 access_sf_tool_groups_group_sf_tool_user access_purchase_order sf_tool_groups purchase.order model_sf_tool_groups purchase.model_purchase_order sf_base.group_sf_tool_user sf_base.group_plan_dispatch 1 1 0 1 0 1 0
157 access_purchase_order access_res_partner purchase.order res.partner purchase.model_purchase_order base.model_res_partner sf_base.group_plan_dispatch 1 0 0 0
access_res_partner res.partner base.model_res_partner sf_base.group_plan_dispatch 1 0 0 0
158 access_purchase_order_line purchase.order.line purchase.model_purchase_order_line sf_base.group_plan_dispatch 1 0 0 0
access_account_move_line account.move.line account.model_account_move_line sf_base.group_plan_dispatch 1 0 0 0
159 access_sf_machine_tool access_account_move_line sf_machine_tool account.move.line model_sf_machine_tool account.model_account_move_line sf_base.group_sf_mrp_user sf_base.group_plan_dispatch 1 1 0 0 0
access_sf_machine_tool_type sf_machine_tool_type model_sf_machine_tool_type sf_base.group_sf_mrp_user 1 1 0 0
160 access_sf_machine_brand access_sf_machine_tool_type_group_plan_dispatch sf_machine_brand sf.machine_tool.type model_sf_machine_brand model_sf_machine_tool_type sf_base.group_sf_mrp_user sf_base.group_plan_dispatch 1 1 0 0 0
161 access_sf_machine_tool sf_machine_tool model_sf_machine_tool sf_base.group_sf_mrp_user 1 1 0 0
162 access_sf_machine_brand_tags access_sf_machine_tool_type sf_machine_brand_tags sf_machine_tool_type model_sf_machine_brand_tags model_sf_machine_tool_type sf_base.group_sf_mrp_user 1 1 0 0
access_sf_machine_control_system sf_machine_control_system model_sf_machine_control_system sf_base.group_sf_mrp_user 1 1 0 0
access_sf_processing_order sf_processing_order model_sf_processing_order sf_base.group_sf_mrp_user 1 1 0 0
access_sf_production_process sf_production_process model_sf_production_process sf_base.group_sf_mrp_user 1 1 0 0
163 access_sf_production_materials access_sf_machine_brand sf_production_materials sf_machine_brand model_sf_production_materials model_sf_machine_brand sf_base.group_sf_mrp_user 1 1 0 0
164 access_sf_materials_model access_sf_machine_brand_tags sf_materials_model sf_machine_brand_tags model_sf_materials_model model_sf_machine_brand_tags sf_base.group_sf_mrp_user 1 1 0 0
165 access_sf_processing_technology access_sf_machine_control_system sf_processing_technology sf_machine_control_system model_sf_processing_technology model_sf_machine_control_system sf_base.group_sf_mrp_user 1 1 0 0
166 access_sf_supplier_sort access_sf_production_process sf_supplier_sort sf_production_process model_sf_supplier_sort model_sf_production_process sf_base.group_sf_mrp_user 1 1 0 0
167 access_sf_production_process_parameter access_sf_production_materials sf_production_process_parameter sf_production_materials model_sf_production_process_parameter model_sf_production_materials sf_base.group_sf_mrp_user 1 1 0 0
168 access_sf_materials_model sf_materials_model model_sf_materials_model sf_base.group_sf_mrp_user 1 1 0 0
169 access_sf_production_process_category access_sf_supplier_sort sf_production_process_category sf_supplier_sort model_sf_production_process_category model_sf_supplier_sort sf_base.group_sf_mrp_user 1 1 0 0
170 access_sf_machine_tool_category access_sf_production_process_parameter sf_machine_tool_category sf_production_process_parameter model_sf_machine_tool_category model_sf_production_process_parameter sf_base.group_sf_mrp_user 1 1 0 0
171 access_sf_cutting_tool_material access_sf_production_process_category sf_cutting_tool_material sf_production_process_category model_sf_cutting_tool_material model_sf_production_process_category sf_base.group_sf_mrp_user 1 1 0 0
172 access_sf_cutting_tool_type access_sf_machine_tool_category sf_cutting_tool_type sf_machine_tool_category model_sf_cutting_tool_type model_sf_machine_tool_category sf_base.group_sf_mrp_user 1 1 0 0
173 access_sf_functional_cutting_tool access_sf_cutting_tool_material sf_functional_cutting_tool sf_cutting_tool_material model_sf_functional_cutting_tool model_sf_cutting_tool_material sf_base.group_sf_mrp_user 1 1 0 0
174 access_sf_functional_cutting_tool_model access_sf_cutting_tool_type sf_functional_cutting_tool_model sf_cutting_tool_type model_sf_functional_cutting_tool_model model_sf_cutting_tool_type sf_base.group_sf_mrp_user 1 1 0 0
access_sf_fixture_material sf_fixture_material model_sf_fixture_material sf_base.group_sf_mrp_user 1 1 0 0
175 access_sf_fixture_materials_basic_parameters access_sf_functional_cutting_tool sf_fixture_materials_basic_parameters sf_functional_cutting_tool model_sf_fixture_materials_basic_parameters model_sf_functional_cutting_tool sf_base.group_sf_mrp_user 1 1 0 0
176 access_mrp_production_group_sale_salemanager access_sf_functional_cutting_tool_model mrp_production_group_sale_salemanager sf_functional_cutting_tool_model mrp.model_mrp_production model_sf_functional_cutting_tool_model sf_base.group_sale_salemanager sf_base.group_sf_mrp_user 1 0 1 0 0
177 access_mrp_production_group_sale_director access_sf_fixture_material mrp_production_group_sale_director sf_fixture_material mrp.model_mrp_production model_sf_fixture_material sf_base.group_sale_director sf_base.group_sf_mrp_user 1 0 1 0 0
access_material_apply_group_plan_dispatch material_apply model_material_apply sf_base.group_plan_dispatch 1 0 0 0
178 access_sf_machine_brand_tags_group_plan_dispatch access_sf_fixture_materials_basic_parameters sf_machine_brand_tags sf_fixture_materials_basic_parameters model_sf_machine_brand_tags model_sf_fixture_materials_basic_parameters sf_base.group_plan_dispatch sf_base.group_sf_mrp_user 1 0 1 0 0
179 access_ir_actions_act_window_group_plan_dispatch access_mrp_production_group_sale_salemanager ir.actions.act_window mrp_production_group_sale_salemanager base.model_ir_actions_act_window mrp.model_mrp_production sf_base.group_plan_dispatch sf_base.group_sale_salemanager 1 0 0 0
180 access_ir_actions_act_window_view_group_plan_dispatch access_mrp_production_group_sale_director ir.actions.act_window.view mrp_production_group_sale_director base.model_ir_actions_act_window_view mrp.model_mrp_production sf_base.group_plan_dispatch sf_base.group_sale_director 1 0 0 0
187 access_sf_international_standards_group_sale_director sf_international_standards_group_sale_director model_sf_international_standards sf_base.group_sale_director 1 0 0 0
188 access_sf_international_standards_group_plan_director sf_international_standards_group_plan_director model_sf_international_standards sf_base.group_plan_director 1 0 0 0
189 access_sf_international_standards_group_purchase sf_international_standards_group_purchase model_sf_international_standards sf_base.group_purchase 1 0 0 0
190 access_sf_international_standards_group_purchase_director sf_international_standards_group_purchase_director model_sf_international_standards sf_base.group_purchase_director 1 0 0 0
191 access_sf_machine_brand_tags_group_sale_salemanager sf_machine_brand_tags_group_sale_salemanager model_sf_machine_brand_tags sf_base.group_sale_salemanager 1 0 0 0
192 access_sf_machine_brand_tags_group_sale_director sf_machine_brand_tags_group_sale_director model_sf_machine_brand_tags sf_base.group_sale_director 1 0 0 0
193 access_sf_machine_brand_tags_group_plan_director sf_machine_brand_tags_group_plan_director model_sf_machine_brand_tags sf_base.group_plan_director 1 0 0 0
194 access_sf_machine_brand_tags_group_purchase sf_machine_brand_tags_group_purchase model_sf_machine_brand_tags sf_base.group_purchase 1 0 0 0
195 access_sf_machine_brand_tags_group_purchase_director sf_machine_brand_tags_group_purchase_director model_sf_machine_brand_tags sf_base.group_purchase_director 1 0 0 0
196 access_printer printer model_printer base.group_user 1 1 1 1
197 access_printer_configuration printer.configuration model_printer_configuration base.group_user 1 1 1 1
198 access_group_sf_mrp_user sf_tool_inventory model_sf_tool_inventory base.group_user 1 1 1 0
199 access_group_sf_mrp_user_admin sf_tool_inventory_admin model_sf_tool_inventory base.group_system 1 1 1 0
200 access_group_sf_mrp_user_group_purchase_director sf_tool_inventory_group_purchase_director model_sf_tool_inventory sf_base.group_purchase_director 1 0 1 0
201 access_group_sf_mrp_user_group_sale_director sf_tool_inventory_group_sale_director model_sf_tool_inventory sf_base.group_sale_director 1 0 1 0
202 access_sf_cutting_tool_material_group_plan_director sf_tool_inventory_group_plan_director model_sf_tool_inventory sf_base.group_plan_director 1 0 1 0
203 access_group_sf_mrp_user_group_sf_mrp_user sf_tool_inventory_group_sf_mrp_user model_sf_tool_inventory sf_base.group_sf_mrp_user 1 1 0 0
204 access_sf_fixture_material_group_purchase_director sf_fixture_material_group_purchase_director model_sf_fixture_material sf_base.group_purchase_director 1 0 0 0
205 access_sf_multi_mounting_type_group_purchase_director sf_multi_mounting_type_group_purchase_director model_sf_multi_mounting_type sf_base.group_purchase_director 1 0 0 0
206 access_sf_fixture_model_group_purchase_director sf_fixture_model_group_purchase_director model_sf_fixture_model sf_base.group_purchase_director 1 0 0 0
207 access_sf_fixture_materials_basic_parameters_group_purchase_director sf_fixture_materials_basic_parameters_group_purchase_director model_sf_fixture_materials_basic_parameters sf_base.group_purchase_director 1 0 0 0
208 access_sf_machine_tool_type_group_purchase_director sf_machine_tool_type_group_purchase_director model_sf_machine_tool_type sf_base.group_purchase_director 1 0 0 0
209 access_sf_fixture_material_group_sale_director sf_fixture_material_group_sale_director model_sf_fixture_material sf_base.group_sale_director 1 0 0 0
210 access_sf_multi_mounting_type_group_sale_director sf_multi_mounting_type_group_sale_director model_sf_multi_mounting_type sf_base.group_sale_director 1 0 0 0
211 access_sf_fixture_model_group_sale_director sf_fixture_model_group_sale_director model_sf_fixture_model sf_base.group_sale_director 1 0 0 0
212 access_sf_fixture_materials_basic_parameters_group_sale_director sf_fixture_materials_basic_parameters_group_sale_director model_sf_fixture_materials_basic_parameters sf_base.group_sale_director 1 0 0 0
213 access_sf_machine_tool_type_group_sale_director sf_machine_tool_type_group_sale_director model_sf_machine_tool_type sf_base.group_sale_director 1 0 0 0
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229

View File

@@ -189,3 +189,6 @@ td.o_required_modifier {
flex-direction: row !important;
}
.supplier_ids_set_css thead th[data-name=partner_id]{
width: 500px!important;
}

112
sf_base/views/Printer.xml Normal file
View File

@@ -0,0 +1,112 @@
<odoo>
<data>
<record id="view_printer_tree" model="ir.ui.view">
<field name="name">printer.tree</field>
<field name="model">printer</field>
<field name="arch" type="xml">
<tree string="Printer">
<field name="name"/>
<field name="ip_address"/>
<field name="port"/>
<!-- 其他字段... -->
</tree>
</field>
</record>
<record id="view_printer_form" model="ir.ui.view">
<field name="name">printer.form</field>
<field name="model">printer</field>
<field name="arch" type="xml">
<form string="Printer">
<sheet>
<group>
<field name="name"/>
<field name="ip_address"/>
<field name="port"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_printer_configuration_tree" model="ir.ui.view">
<field name="name">printer.configuration.tree</field>
<field name="model">printer.configuration</field>
<field name="arch" type="xml">
<tree string="Printer Configuration">
<field name="name"/>
<field name="printer_id"/>
<field name="model"/>
<!-- 其他字段... -->
</tree>
</field>
</record>
<record id="view_printer_configuration_form" model="ir.ui.view">
<field name="name">printer.configuration.form</field>
<field name="model">printer.configuration</field>
<field name="arch" type="xml">
<form string="Printer Configuration">
<sheet>
<group>
<field name="name"/>
<field name="printer_id"/>
<field name="model"/>
<!-- 其他字段... -->
</group>
</sheet>
</form>
</field>
</record>
<!-- 其他视图... -->
<record id="action_printer" model="ir.actions.act_window">
<field name="name">打印机</field>
<field name="res_model">printer</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Action to open the printer configuration list -->
<record id="action_printer_configuration" model="ir.actions.act_window">
<field name="name">打印配置</field>
<field name="res_model">printer.configuration</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Add a menu item for the printer configuration -->
<!-- <record id="menu_printer_configuration" model="ir.ui.menu"> -->
<!-- <field name="name">打印配置</field> -->
<!-- <field name="action" ref="action_printer_configuration"/> -->
<!-- <field name="parent_id" ref="base.menu_administration"/> -->
<!-- </record> -->
<!-- <record id="menu_printer" model="ir.ui.menu"> -->
<!-- <field name="name">打印机</field> -->
<!-- <field name="action" ref="action_printer"/> -->
<!-- <field name="parent_id" ref="menu_printer"/> -->
<!-- </record> -->
<menuitem
id="printer_main_menu"
name="打印配置"
sequence="10"
parent="base.menu_administration"/>
<menuitem
id="menu_printer"
name="打印机"
action="action_printer"
sequence="1"
parent="printer_main_menu"/>
<menuitem
id="menu_printer_configuration"
name="打印配置"
action="action_printer_configuration"
sequence="2"
parent="printer_main_menu"/>
</data>
</odoo>

View File

@@ -98,6 +98,7 @@
<field name="name" string="名称"/>
<field name="machine_tool_category"/>
<field name="brand_id"/>
<field name="function_type"/>
<field name="machine_tool_picture" widget="image"/>
<field name="remark"/>
</tree>
@@ -122,6 +123,7 @@
domain="[('tag_ids', '=', '机床')]"
options="{'no_create': True}"/>
<field name="machine_tool_category" required="1"/>
<field name="function_type" required="1"/>
</group>
<group>
<field name="machine_tool_picture" widget="image" nolabel="1"/>
@@ -171,6 +173,10 @@
<label for="workbench_W" string="宽"/>
<field name="workbench_W" class="o_address_zip" required="1"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="workbench_H" string="高"/>
<field name="workbench_H" class="o_address_zip" required="1"
options="{'format': false}"/>
</div>
<field name="workpiece_load"/>
<label for="machine_tool_L" string="机床尺寸(mm)"/>
@@ -237,15 +243,15 @@
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="b_axis" string="b"
<label for="c_axis" string="c"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
<field name="b_axis" class="o_address_zip"
<field name="c_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="c_axis" string="c"
<label for="b_axis" string="b"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
<field name="c_axis" class="o_address_zip"
<field name="b_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
options="{'format': false}"/>
</div>

View File

@@ -1,6 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!--表面工艺可选参数-->
<record model="ir.ui.view" id="mrs_production_process_parameter_tree">
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<tree string="表面工艺可选参数" create="0" delete="0">
<field name="code"/>
<field name="name"/>
<field name="gain_way"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="mrs_production_process_parameter_form">
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<form string="表面工艺可选参数" create="0" delete="0">
<sheet>
<div class="oe_title">
<h1>
<field name="name" required="1" placeholder="名称"/>
</h1>
</div>
<group>
<group>
<field name="code" readonly="1"/>
<field name="process_id" readonly="1"/>
<field name="gain_way"/>
</group>
</group>
<notebook>
<page string="适用材料">
<field name="materials_model_ids" readonly="1"></field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="search_mrs_production_process_parameter_view">
<field name="name">search.mrs.production.process.parameter</field>
<field name="model">sf.production.process.parameter</field>
<field name="arch" type="xml">
<search>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码" filter_domain="[('codeNum','ilike',self)]"/>
<searchpanel class="account_root">
<field name="process_id" icon="fa-filter"/>
</searchpanel>
</search>
</field>
</record>
<!--加工工艺-->
<!-- <record model="ir.ui.view" id="sf_processing_technology_form">-->
<!-- <field name="model">sf.processing.technology</field>-->
@@ -20,26 +75,26 @@
<!-- </form>-->
<!-- </field>-->
<!-- </record>-->
<record model="ir.ui.view" id="sf_processing_technology_tree">
<field name="model">sf.processing.technology</field>
<field name="arch" type="xml">
<tree string="加工工艺" create="0" edit="0" delete="1">
<field name="code"/>
<field name="name"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="search_sf_processing_technology_view">
<field name="name">search.sf.processing.technology.type</field>
<field name="model">sf.processing.technology</field>
<field name="arch" type="xml">
<search>
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
</search>
</field>
</record>
<!-- <record model="ir.ui.view" id="sf_processing_technology_tree">-->
<!-- <field name="model">sf.processing.technology</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <tree string="加工工艺" create="0" edit="0" delete="1">-->
<!-- <field name="code"/>-->
<!-- <field name="name"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </record>-->
<!-- <record model="ir.ui.view" id="search_sf_processing_technology_view">-->
<!-- <field name="name">search.sf.processing.technology.type</field>-->
<!-- <field name="model">sf.processing.technology</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <search>-->
<!-- <field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>-->
<!-- <field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>-->
<!-- <filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>-->
<!-- </search>-->
<!-- </field>-->
<!-- </record>-->
<!--表面工艺类别-->
<record model="ir.ui.view" id="sf_production_process_category_form">
@@ -156,19 +211,7 @@
</form>
</field>
</page>
<page string="工序">
<field name='processing_order_ids' options="{'no_create':True}" widget="one2many">
<tree editable='bottom'>
<field name="sequence" widget="handle"/>
<field name="processing_technology_ids" widget="many2many_tags">
</field>
</tree>
<form>
<field name="processing_technology_ids" widget="many2many">
</field>
</form>
</field>
</page>
</notebook>
</group>
<group>
@@ -188,6 +231,9 @@
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
<searchpanel>
<field name="category_id" icon="fa-building" enable_counters="1"/>
</searchpanel>
</search>
</field>
</record>
@@ -223,7 +269,7 @@
</group>
<notebook>
<page string="供应商">
<field name='supplier_ids'>
<field name='supplier_ids' class="supplier_ids_set_css">
<tree editable='bottom'>
<field name="sequence" widget="handle" string="序号"/>
<field name="partner_id" string="名称"/>
@@ -241,7 +287,7 @@
<record model="ir.ui.view" id="sf_materials_model_tree">
<field name="model">sf.materials.model</field>
<field name="arch" type="xml">
<tree string="材料型号" delete="0">
<tree string="材料型号" delete="0">
<field name="materials_no"/>
<field name="materials_code"/>
<field name="name"/>
@@ -350,12 +396,12 @@
<field name="res_model">sf.materials.model</field>
<field name="view_mode">tree,form</field>
</record>
<record id="sf_processing_technology" model="ir.actions.act_window">
<field name="name">加工工艺</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.processing.technology</field>
<field name="view_mode">tree</field>
</record>
<!-- <record id="sf_processing_technology" model="ir.actions.act_window">-->
<!-- <field name="name">加工工艺</field>-->
<!-- <field name="type">ir.actions.act_window</field>-->
<!-- <field name="res_model">sf.processing.technology</field>-->
<!-- <field name="view_mode">tree</field>-->
<!-- </record>-->
<record id="sf_production_process_category" model="ir.actions.act_window">
<field name="name">表面工艺类别</field>
@@ -363,6 +409,12 @@
<field name="res_model">sf.production.process.category</field>
<field name="view_mode">tree,form</field>
</record>
<record id="mrs_production_process_parameter_action" model="ir.actions.act_window">
<field name="name">表面工艺可选参数</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.production.process.parameter</field>
<field name="view_mode">tree,form</field>
</record>
</data>

View File

@@ -165,6 +165,7 @@
<field name="zero_chuck_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '零点卡盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -190,6 +191,7 @@
<field name="zero_tray_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '零点托盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -213,6 +215,7 @@
<field name="pneumatic_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '气动夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -240,6 +243,7 @@
<field name="jaw_vice_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '虎钳夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -268,6 +272,7 @@
<field name="magnet_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '磁吸夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -297,6 +302,7 @@
<field name="adapter_board_fixture_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '转接板(锁板)夹具')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>
@@ -323,6 +329,7 @@
<field name="scroll_chuck_ids"
attrs="{'invisible': [('fixture_material_type', '!=', '三爪卡盘')]}">
<tree editable="bottom" class="center" delete="0">
<field name="code" invisible="1"/>
<field name="name"/>
<field name="length"/>
<field name="width"/>

View File

@@ -111,13 +111,19 @@
/>
<menuitem
id="menu_sf_processing_technology"
name="加工工艺"
<menuitem
id="mrs_production_process_parameter_view"
name="表面工艺可选参数"
parent="menu_sf_production_process_1"
sequence="3"
action="sf_processing_technology"/>
sequence="2"
action="mrs_production_process_parameter_action"
/>
<!-- <menuitem-->
<!-- id="menu_sf_processing_technology"-->
<!-- name="加工工艺"-->
<!-- parent="menu_sf_production_process_1"-->
<!-- sequence="3"-->
<!-- action="sf_processing_technology"/>-->
<!-- <menuitem-->
<!-- id="menu_sf_partner_views"-->
@@ -143,5 +149,6 @@
sequence="1"
action="action_sf_machine_control_system"/>
</data>
</odoo>

View File

@@ -1,132 +1,302 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<!-- ================================================刀具基础参数================================================ -->
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
<field name="total_length" />
<field name="blade_number" />
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter" />
<field name="handle_length" />
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper" />
<field name="blade_diameter" />
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width" />
<field name="blade_width" />
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<!-- ================================================刀具基础参数================================================ -->
<record id="view_sf_tool_materials_basic_parameters_integral_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0" edit="0" sample="1">
<field name="total_length"/>
<field name="blade_number"/>
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter"/>
<field name="handle_length"/>
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper"/>
<field name="blade_diameter"/>
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width"/>
<field name="blade_width"/>
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length" />
<field name="length" />
<field name="thickness"/>
<field name="width"/>
<field name="cutting_blade_length" />
<field name="relief_angle" />
<field name="blade_tip_circular_arc_radius"/>
<field name="inscribed_circle_diameter"/>
<field name="install_aperture_diameter" />
<field name="chip_breaker_groove" />
<field name="blade_teeth_model"/>
<field name="blade_blade_number"/>
<field name="main_included_angle" />
<field name="top_angle" />
<field name="thread_model"/>
<field name="thread_num" />
<field name="blade_tip_height_tolerance" />
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_blade_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length"/>
<field name="length"/>
<field name="thickness"/>
<field name="width"/>
<field name="cutting_blade_length"/>
<field name="relief_angle"/>
<field name="blade_tip_circular_arc_radius"/>
<field name="inscribed_circle_diameter"/>
<field name="install_aperture_diameter"/>
<field name="chip_breaker_groove"/>
<field name="blade_teeth_model"/>
<field name="blade_blade_number"/>
<field name="main_included_angle"/>
<field name="top_angle"/>
<field name="thread_model"/>
<field name="thread_num"/>
<field name="blade_tip_height_tolerance"/>
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_cutter_bar_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length" />
<field name="height" />
<field name="blade_height"/>
<field name="cut_depth_max"/>
<field name="cutter_arbor_diameter" />
<field name="min_machining_aperture" />
<field name="install_blade_tip_num"/>
<field name="cutting_blade_model"/>
<field name="is_cooling_hole" />
<field name="locating_slot_code" />
<field name="installing_structure"/>
<field name="blade_id"/>
<field name="tool_shim" />
<field name="cotter_pin" />
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner" />
</tree>
</field>
</record>
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" delete="0" create="0">
<field name="total_length"/>
<field name="height"/>
<field name="blade_height"/>
<field name="cut_depth_max"/>
<field name="cutter_arbor_diameter"/>
<field name="min_machining_aperture"/>
<field name="install_blade_tip_num"/>
<field name="cutting_blade_model"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
<field name="installing_structure"/>
<field name="blade_id"/>
<field name="tool_shim"/>
<field name="cotter_pin"/>
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner"/>
</tree>
</field>
</record>
<record id="view_sf_tool_materials_basic_parameters_tree" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数" >
<field name="total_length" />
<field name="blade_number" />
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter" />
<field name="handle_length" />
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper" />
<field name="blade_diameter" />
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width" />
<field name="blade_width" />
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<field name="name">sf.tool.materials.basic.parameters.tree</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<tree string="基础参数">
<field name="total_length"/>
<field name="blade_number"/>
<field name="neck_diameter"/>
<field name="neck_length"/>
<field name="handle_diameter"/>
<field name="handle_length"/>
<field name="blade_tip_diameter"/>
<field name="blade_tip_working_size"/>
<field name="blade_tip_taper"/>
<field name="blade_diameter"/>
<field name="blade_length"/>
<field name="blade_helix_angle"/>
<field name="blade_width"/>
<field name="blade_width"/>
<field name="pitch"/>
<field name="cutting_depth"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
<field name="name">sf.tool.materials.basic.parameters.search</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_sf_tool_materials_basic_parameters_search">
<field name="name">sf.tool.materials.basic.parameters.search</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
</search>
</field>
</record>
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
<field name="name">基础参数</field>
<field name="res_model">sf.tool.materials.basic.parameters</field>
<field name="view_mode">tree</field>
<record id="view_sf_tool_materials_basic_parameters_form" model="ir.ui.view">
<field name="name">sf.tool.materials.basic.parameters.form</field>
<field name="model">sf.tool.materials.basic.parameters</field>
<field name="arch" type="xml">
<form string="规则">
<sheet>
<field name="cutting_tool_type" invisible="1"/>
<field name="standard_library_id" invisible="1"/>
<group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
<field name="total_length"/>
<field name="blade_diameter" class="diameter"/>
<field name="blade_length"/>
<field name="blade_number"/>
<field name="neck_length"/>
<field name="neck_diameter" class="diameter"/>
<field name="handle_diameter" class="diameter"/>
<field name="handle_length"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
<field name="blade_tip_working_size"/>
<field name="blade_tip_diameter" class="diameter"/>
<field name="blade_tip_taper"/>
<field name="blade_helix_angle"/>
<field name="pitch"/>
<field name="blade_width"/>
<field name="blade_depth"/>
<field name="cut_depth_max"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
<field name="length"/>
<field name="thickness"/>
<field name="inscribed_circle_diameter" class="diameter"/>
<field name="install_aperture_diameter" class="diameter" string="安装孔直径D1(mm)"/>
<field name="blade_tip_circular_arc_radius" string="刀尖圆弧半径RE(mm)"/>
<field name="cutting_blade_length"/>
<field name="relief_angle"/>
<field name="chip_breaker_groove"/>
<field name="chip_breaker_type_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
<field name="blade_teeth_model"/>
<field name="thread_model"/>
<field name="pitch"/>
<field name="thread_num"/>
<field name="cut_depth_max"/>
<field name="blade_blade_number" string="刃数"/>
<field name="blade_width" string="刃宽"/>
<field name="main_included_angle"/>
<field name="top_angle"/>
<field name="blade_tip_height_tolerance"/>
<field name="inscribed_circle_tolerance"/>
<field name="thickness_tolerance"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
<field name="total_length"/>
<field name="width"/>
<field name="height"/>
<label for="knife_head_length" string="刀头尺寸"/>
<div class="test_model">
<label for="knife_head_length" string="长"/>
<field name="knife_head_length" class="o_address_zip"
options="{'format': false}"/>
<label for="knife_head_width" string="宽"/>
<field name="knife_head_width" class="o_address_zip"
options="{'format': false}"/>
<label for="knife_head_height" string="高"/>
<field name="knife_head_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="blade_diameter" class="diameter"/>
<field name="cutter_arbor_diameter" class="diameter"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
<field name="main_included_angle"/>
<field name="relief_angle"/>
<field name="cutting_blade_length"/>
<field name="cut_depth_max"/>
<field name="min_machining_aperture"/>
<field name="install_blade_tip_num"/>
<field name="installing_structure"/>
<field name="blade_id" options="{'no_create': True}"/>
<field name="tool_shim"/>
<field name="cotter_pin"/>
<field name="pressing_plate"/>
<field name="screw"/>
<field name="spanner"/>
</group>
<!-- <field name="context">{'selection_mode': 'single'}</field>-->
<field name="domain">[]</field>
<!-- <field name="multi">false</field>-->
</record>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
<field name="install_blade_tip_num"/>
<field name="blade_diameter" class="diameter"/>
<field name="cutter_head_diameter" class="diameter"/>
<field name="interface_diameter" class="diameter"/>
<field name="total_length"/>
<field name="blade_length"/>
<field name="cutting_blade_length"/>
<field name="cut_depth_max"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}">
<field name="main_included_angle"/>
<field name="installing_structure"/>
<field name="blade_id" options="{'no_create': True}"/>
<field name="screw"/>
<field name="spanner"/>
<field name="is_cooling_hole"/>
<field name="locating_slot_code"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
<field name="er_size_model" string="尺寸型号"/>
<label for="min_clamping_diameter" string="夹持直径"/>
<div class="test_model">
<label for="min_clamping_diameter" string="最小"/>
<field name="min_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
<label for="max_clamping_diameter" string="最大"/>
<field name="max_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
</div>
<field name="total_length"/>
<field name="outer_diameter" class="diameter"/>
<field name="inner_diameter" class="diameter"/>
<field name="taper"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}">
<field name="run_out_accuracy"/>
<field name="top_diameter" class="diameter"/>
<field name="weight"/>
<field name="max_load_capacity"/>
<field name="cooling_jacket"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
<field name="taper_shank_model"/>
<field name="total_length"/>
<field name="shank_length"/>
<field name="shank_diameter" class="diameter"/>
<field name="flange_shank_length"/>
<field name="flange_diameter" class="diameter"/>
<field name="diameter_slip_accuracy"/>
<field name="dynamic_balance_class"/>
</group>
<group attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}">
<label for="min_clamping_diameter" string="夹持直径"/>
<div class="test_model">
<label for="min_clamping_diameter" string="最小"/>
<field name="min_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
<label for="max_clamping_diameter" string="最大"/>
<field name="max_clamping_diameter" class="o_address_zip diameter"
options="{'format': false}"/>
</div>
<field name="max_rotate_speed"/>
<field name="fit_chuck_size"/>
<field name="nut"/>
<field name="spanner"/>
<field name="clamping_mode"/>
<field name="tool_changing_time"/>
<field name="cooling_model"/>
<field name="is_quick_cutting"/>
<field name="is_safe_lock"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_sf_tool_materials_basic_parameters" model="ir.actions.act_window">
<field name="name">基础参数</field>
<field name="res_model">sf.tool.materials.basic.parameters</field>
<field name="view_mode">form</field>
<field name="context">{'default_cutting_tool_type': cutting_tool_type}</field>
<field name="domain">[]</field>
<!-- <field name="multi">false</field>-->
</record>
</data>
</odoo>

View File

@@ -21,6 +21,7 @@
<field name="name">刀具标准库</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.cutting_tool.standard.library</field>
<!-- <field name="context">{'default_cutting_tool_material_id': cutting_tool_material_id}</field>-->
<field name="view_mode">tree,form</field>
</record>
<!-- 功能刀具action -->
@@ -58,46 +59,54 @@
id="menu_sf_cutting_tool_type"
parent="menu_sf_cutting_tool"
name="刀具类型"
sequence="2"
sequence="10"
action="action_sf_cutting_tool_type"
/>
<menuitem
id="menu_sf_cutting_tool_standard_library"
parent="menu_sf_cutting_tool"
name="刀具标准库"
sequence="3"
sequence="20"
action="action_sf_cutting_tool_standard_library"
/>
<menuitem
id="menu_sf_tool_inventory"
parent="menu_sf_cutting_tool"
name="功能刀具清单"
sequence="25"
action="action_sf_tool_inventory"
/>
<!-- 功能刀具 -->
<!-- <menuitem-->
<!-- id="menu_sf_functional_cutting_tool"-->
<!-- parent="menu_sf_cutting_tool"-->
<!-- name="功能刀具"-->
<!-- sequence="5"-->
<!-- action="action_sf_functional_cutting_tool"-->
<!-- />-->
<!-- <menuitem-->
<!-- id="menu_sf_functional_cutting_tool"-->
<!-- parent="menu_sf_cutting_tool"-->
<!-- name="功能刀具"-->
<!-- sequence="5"-->
<!-- action="action_sf_functional_cutting_tool"-->
<!-- />-->
<!-- 功能刀具类型 -->
<menuitem
id="menu_sf_functional_cutting_tool_model_type"
parent="menu_sf_cutting_tool"
name="功能刀具类型"
sequence="4"
sequence="30"
action="action_sf_functional_cutting_tool_model_type"
/>
<menuitem
id="menu_sf_maintenance_equipment_image"
name="能力特征库"
parent="menu_sf_cutting_tool"
action="action_maintenance_equipment_image"
sequence="5"/>
id="menu_sf_maintenance_equipment_image"
name="能力特征库"
parent="menu_sf_cutting_tool"
action="action_maintenance_equipment_image"
sequence="40"/>
<menuitem
id="menu_sf_tool_groups"
name="刀具组"
parent="menu_sf_cutting_tool"
action="sf_tool_groups_view_act"
sequence="10"/>
id="menu_sf_tool_groups"
name="刀具组"
parent="menu_sf_cutting_tool"
action="sf_tool_groups_view_act"
sequence="50"/>
</data>
</odoo>

View File

@@ -123,19 +123,19 @@
<form string="刀具标准库" delete="0" create="0" edit="0">
<sheet>
<field name="image" widget='image' class="oe_avatar"
options="{'zoom': true, 'preview_image':'image_128'}"/>
required="1"/>
<div class="oe_title">
<h1>
<field name="code"/>
<field name="code" readonly="1" force_save="1"/>
</h1>
</div>
<group>
<group>
<field name="name"/>
<field name="cutting_tool_material_id"/>
<field name="cutting_tool_type"/>
<field name="cutting_tool_type_id"/>
<field name="brand_id"/>
<field name="cutting_tool_material_id" readonly="1"/>
<field name="cutting_tool_type" invisible="1"/>
<field name="cutting_tool_type_id" required="1"/>
<field name="brand_id" required="1"/>
<label for="integral_run_out_accuracy_min" string="端跳精度"
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
<div class="o_address_format"
@@ -165,8 +165,7 @@
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
</group>
<group>
<field name="material_model_id" placeholder="请选择" string="材质"
attrs="{'required': [('cutting_tool_type', 'not in', ['刀柄', '夹头'])]}"/>
<field name="material_model_id" placeholder="请选择" string="材质"/>
<field name="tool_hardness" string="硬度(hrc)" options="{'format': false}"
widget="integer"/>
<field name="coating_material"/>
@@ -505,11 +504,23 @@
</field>
</record>
<record id="sf_tool_groups_search" model="ir.ui.view">
<field name="name">刀具组搜索</field>
<field name="model">sf.tool.groups</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="equipment_ids"/>
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record id="sf_tool_groups_view_act" model="ir.actions.act_window">
<field name="name">刀具组</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.tool.groups</field>
<field name="view_mode">tree</field>
<field name="view_mode">tree,search</field>
</record>
<!-- ================================================刀具基础参数================================================ -->
@@ -536,7 +547,66 @@
<!-- <field name="cutting_depth"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </record>-->
<!-- </record>-->'
<!-- ================================================功能刀具清单================================================ -->
<record id="view_tool_inventory_tree" model="ir.ui.view">
<field name="name">sf.tool.inventory.tree</field>
<field name="model">sf.tool.inventory</field>
<field name="arch" type="xml">
<tree string="功能刀具清单" create="1" edit="1" delete="0" editable="bottom">
<field name="name"/>
<field name="functional_cutting_tool_model_id"/>
<field name="tool_groups_id"/>
<field name="work_material"/>
<field name="life_span"/>
<field name="prefix" optional="hide"/>
<field name="postfix" optional="hide"/>
<field name="diameter"/>
<field name="angle"/>
<field name="tool_length"/>
<field name="blade_length"/>
<field name="knife_head_name" optional="hide"/>
<field name="cutter_number"/>
<field name="blade_number"/>
<field name="extension"/>
<field name="create_uid" string="创建人" optional="hide"/>
<field name="create_date" string="创建时间" optional="hide"/>
<field name="type" invisible="1"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_cutting_tool_material_search">
<field name="name">sf.tool.inventory.search</field>
<field name="model">sf.tool.inventory</field>
<field name="arch" type="xml">
<search string="功能刀具清单">
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
<field name="functional_cutting_tool_model_id"/>
<field name="tool_groups_id"/>
<field name="work_material"/>
<field name="life_span"/>
<field name="prefix"/>
<field name="postfix"/>
<field name="diameter"/>
<field name="angle"/>
<field name="tool_length"/>
<field name="blade_length"/>
<field name="knife_head_name"/>
<field name="cutter_number"/>
<field name="blade_number"/>
<field name="extension"/>
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
</search>
</field>
</record>
<record id="action_sf_tool_inventory" model="ir.actions.act_window">
<field name="name">功能刀具清单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.tool.inventory</field>
<field name="view_mode">tree</field>
</record>
</odoo>

View File

@@ -16,7 +16,7 @@ class Sf_Bf_Connect(http.Controller):
:return:
"""
res = {'status': 1, 'factory_order_no': ''}
logging.info('get_bfm_process_order_list:%s' % kw)
logging.info('get_bfm_process_order_list:%s' % kw['order_number'])
try:
product_id = request.env.ref('sf_dlm.product_template_sf').sudo()
self_machining_id = request.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
@@ -62,7 +62,7 @@ class Sf_Bf_Connect(http.Controller):
request.env.ref("base.user_admin")).bom_create_line(
self_machining_embryo)
if not self_machining_bom_line:
res['status'] = 2
res['status'] = -2
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
@@ -79,6 +79,11 @@ class Sf_Bf_Connect(http.Controller):
order_id,
'subcontract',
i)
if outsource_embryo == -3:
res['status'] = -3
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
# 创建坯料的bom
outsource_bom = request.env['mrp.bom'].with_user(request.env.ref("base.user_admin")).bom_create(
outsource_embryo,
@@ -87,7 +92,7 @@ class Sf_Bf_Connect(http.Controller):
outsource_bom_line = outsource_bom.with_user(
request.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
if not outsource_bom_line:
res['status'] = 2
res['status'] = -2
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
@@ -101,6 +106,11 @@ class Sf_Bf_Connect(http.Controller):
item,
order_id,
'purchase', i)
if purchase_embryo == -3:
res['status'] = -3
res['message'] = '该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配'
request.cr.rollback()
return json.JSONEncoder().encode(res)
# 产品配置bom
product_bom_purchase = request.env['mrp.bom'].with_user(
request.env.ref("base.user_admin")).bom_create(product, 'normal', False)
@@ -143,3 +153,17 @@ class jdElcp(http.Controller):
aa.bill_url = kw['bill']
logging.info('get_jd_bill================:%s' %
aa.bill_url)
@http.route('/api/update/order/status', type='http', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def update_order_status(self, **kw):
"""
根据拿到的商家单号,修改订单状态
"""
logging.info('change_sale_order_state================:%s', kw)
if not kw.get('orderNo'):
return json.dumps({'statusCode': 415, 'statusMessage': '订单号不能为空'}, ensure_ascii=False)
aa = request.env['sale.order'].sudo().search([('name', '=', kw['orderNo'])])
if aa:
aa.schedule_status = 'received'
return json.dumps({'statusCode': 200, 'statusMessage': '修改成功'}, ensure_ascii=False)

View File

@@ -21,7 +21,6 @@ class Http(models.AbstractModel):
def _auth_method_sf_token(cls):
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
datas = request.httprequest.headers.environ
logging.info(datas)
if 'HTTP_TOKEN' in datas:
_logger.info('token:%s' % datas['HTTP_TOKEN'])
# 查询密钥
@@ -41,7 +40,11 @@ class Http(models.AbstractModel):
raise AuthenticationError('请求已过期')
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
_logger.info('check_str:%s' % check_sf_str)
_logger.info('HTTP_TIMESTAMP:%s' % post_time)
_logger.info('HTTP_CHECKSTR:%s' % datas['HTTP_CHECKSTR'])
_logger.info('check_sf_str:%s' % check_sf_str)
_logger.info('check_str:%s' % check_str)
_logger.info('sf_secret_key:%s' % factory_secret.sf_secret_key)
if check_sf_str != datas['HTTP_CHECKSTR']:
raise AuthenticationError('数据校验不通过')
else:

View File

@@ -164,6 +164,9 @@ class JdEclp(models.Model):
self.is_bill = True
self.logistics_status = '1'
# 京东物流下单后,销售订单状态改为待收货
self.env['sale.order'].search([('name', '=', self.origin)]).write({'scheduled_status': 'to receive'})
# else:
# raise UserError("选择京东物流才能下单呦")

View File

@@ -35,14 +35,14 @@
<field name="type">功能刀具</field>
</record>
<!-- <record id="res_partner_bfm" model="res.partner">-->
<!-- <field name="name">业务平台</field>-->
<!-- &lt;!&ndash; <field name="company_id" ref="base.main_company"/>&ndash;&gt;-->
<!-- </record>-->
<record id="res_partner_bfm" model="res.partner">
<field name="name">业务平台</field>
<!-- <field name="company_id" ref="base.main_company"/>-->
</record>
<!-- <record id="res_users_bfm" model="res.users">-->
<!-- <field name="name">业务平台</field>-->
<!-- <field name="partner_id" ref="res_partner_bfm"/>-->
<!--&lt;!&ndash; <field name="partner_id" ref="res_partner_bfm"/>&ndash;&gt;-->
<!-- </record>-->
<record id="product_functional_tool_sf" model="product.product">

View File

@@ -100,7 +100,7 @@ class ResMrpBomMo(models.Model):
if rate_of_waste <= 20:
return embryo_has
else:
return
return None
# 查bom的原材料
def get_raw_bom(self, product):

View File

@@ -7,9 +7,10 @@
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
<field name="arch" type="xml">
<field name="invoice_policy" position="after">
<field name='categ_id' attrs="{'readonly': [('id', '!=', False)]}"/>
<field name='categ_id' class="custom_required" attrs="{'readonly': [('id', '!=', False)]}"/>
<field name='is_bfm' invisible="1"/>
<field name='categ_type' invisible="1"/>
<field name='manual_quotation' attrs="{'invisible':[('upload_model_file', '=', [])]}"/>
<field name="upload_model_file"
widget="many2many_binary"
attrs="{'invisible': ['|', '|',('categ_type', '!=', '成品'),('categ_type', '=', False),('is_bfm','=', True)]}"/>
@@ -17,32 +18,39 @@
attrs="{'invisible': ['|','|', ('categ_type', '!=', '成品'),('categ_type', '=', False),('model_file', '=', False)]}"/>
<field name='cutting_tool_type' invisible="1"/>
<field name="fixture_material_type" invisible="1"/>
<field name="embryo_model_type_id" string="模型类型"
<field name="embryo_model_type_id" string="模型类型" options="{'no_create': True}"
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)],'readonly': [('id', '!=', False)]}"/>
<field name="materials_id" string="材料" placeholder="请选择"
<field name="materials_id" string="材料" placeholder="请选择" options="{'no_create': True}"
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
<field name="materials_type_id" string="型号" placeholder="请选择"
domain="[('materials_id', '=', materials_id)]"
<field name="materials_type_id" string="型号" placeholder="请选择" options="{'no_create': True}"
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
<field name="server_product_process_parameters_id" string="表面工艺参数"
options="{'no_create': True}"
attrs="{'invisible': ['|',('categ_type', '!=', '表面工艺'),('categ_type', '=', False)]}"/>
<field name="cutting_tool_material_id"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
<field name="cutting_tool_material_id" class="custom_required"
options="{'no_create': True}"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}"
placeholder="请选择"/>
<field name="cutting_tool_model_id" placeholder="请选择"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
<field name="specification_id" placeholder="请选择"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
<field name="cutting_tool_model_id" placeholder="请选择" class="custom_required"
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"
context="{'default_cutting_tool_material_id': cutting_tool_material_id}"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}">
</field>
<!-- <button name="%(sf_base.action_sf_cutting_tool_standard_library)d" string="新建" type="action"-->
<!-- context="{'default_cutting_tool_material_id': cutting_tool_material_id}"/>-->
<field name="specification_id" placeholder="请选择" class="custom_required"
context="{'default_cutting_tool_type': cutting_tool_type,'default_standard_library_id':cutting_tool_model_id}"
attrs="{'invisible': [('categ_type', '!=', '刀具')],'required': [('categ_type', '=', '刀具')],'readonly': [('id', '!=', False)]}"
domain="[('standard_library_id','=',cutting_tool_model_id)]"/>
<field name="fixture_material_id" attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
placeholder="请选择"/>
<field name="fixture_model_id" string="型号" placeholder="请选择"
<field name="fixture_material_id"
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
placeholder="请选择" options="{'no_create': True}"/>
<field name="fixture_model_id" string="型号" placeholder="请选择" options="{'no_create': True}"
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
domain="[('fixture_material_id','=',fixture_material_id)]"/>
<field name="specification_fixture_id" string="规格" placeholder="请选择"
attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
options="{'no_create': True}"
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
domain="[('fixture_model_id','=',fixture_model_id)]"/>
</field>
<xpath expr="//label[@for='volume']" position="before">
@@ -88,7 +96,7 @@
</field>
</record>
<record model="ir.ui.view" id="view_product_template_form_inherit_sf">
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
<field name="name">product.template.only.form.inherit.sf</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
@@ -102,7 +110,7 @@
</field>
</record>
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
<record model="ir.ui.view" id="view_product_template_only_dlm_form_inherit_sf">
<field name="name">product.template.only.form.inherit.sf</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="sf_dlm_management.view_sale_product_template_form_inherit_sf"/>
@@ -140,6 +148,10 @@
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
<field name="tool_height"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_shank_length" string="刀柄长度(mm)"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_shank_diameter" string="刀柄直径(mm)" class="diameter"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_flange_diameter"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_flange_length"
@@ -256,7 +268,7 @@
<span>(mm)&amp;nbsp;</span>
</div>
<field name="cutting_tool_clamping_way"
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄','夹头'))],'readonly': [('id', '!=', False)]}"/>
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_top_diameter" class="diameter"
attrs="{'invisible': [('cutting_tool_type','not in',('夹头'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_outer_diameter" class="diameter"
@@ -295,7 +307,7 @@
<field name="tool_weight"
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))],"readonly": [("id", "!=", False)]}'/>
<field name="cutting_tool_taper"
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_taper_shank_model"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_dynamic_balance_class"
@@ -338,9 +350,9 @@
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_er_size_model"
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_handle_id"
options="{'no_create': True}"
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
<!-- <field name="cutting_tool_handle_id"-->
<!-- options="{'no_create': True}"-->
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>-->
<field name="cooling_suit_type_ids"
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
<!-- 刀杆 -->
@@ -352,7 +364,7 @@
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_locating_slot_code"
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_blade_id"
<field name="cutting_tool_blade_id" options="{'no_create': True}"
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
<field name="cutting_tool_tool_shim"
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>

View File

@@ -2,18 +2,23 @@
<odoo>
<record id="workcenter_form_vieww_scan_barcode_search" model="ir.ui.view">
<field name="name">work.order.search</field>
<!-- <field name="model">mrp.workcenter</field>-->
<!-- <field name="model">mrp.workcenter</field>-->
<field name="model">mrp.workorder</field>
<field name="inherit_id" ref="mrp.view_mrp_production_work_order_search"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='production_id']" position="before">
<!-- <field name="name" filter_domain="['|', '|', ('明确的字段内容', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>-->
<!-- <field name="tray_code" filter_domain="[('production_id.tray_ids.code','=',self)]"/>-->
<!-- <field name="production_id"/>-->
</xpath>
<!-- <xpath expr="//search//group//filter[@name='product']" position="before">-->
<!-- <filter string="Tray code" name="traycode" domain="[]" context="{'group_by': 'tray_code'}"/>-->
<!-- </xpath>-->
<xpath expr="//group" position="before">
<searchpanel>
<field name="routing_type" select="multi" string="工序类型" icon="fa-building" enable_counters="1"/>
<field name="state" select="multi" string="状态" icon="fa-building" enable_counters="1"/>
</searchpanel>
<!-- <field name="name" filter_domain="['|', '|', ('明确的字段内容', 'ilike', self), ('shortdesc', 'ilike', self), ('name', 'ilike', self)]" string="Theme"/>-->
<!-- <field name="tray_code" filter_domain="[('production_id.tray_ids.code','=',self)]"/>-->
<!-- <field name="production_id"/>-->
</xpath>
<!-- <xpath expr="//search//group//filter[@name='product']" position="before">-->
<!-- <filter string="Tray code" name="traycode" domain="[]" context="{'group_by': 'tray_code'}"/>-->
<!-- </xpath>-->
</field>
</record>

View File

@@ -51,7 +51,7 @@ class SfEquipmentSaintenanceStandards(models.Model):
domain="[('category_id', '=', maintenance_equipment_category_id)]"
)
maintenance_standards_ids = fields.One2many('maintenance.standards', 'equipment_maintenance_standards_id',
string='维保项目', widget='one2many_list')
string='维保项目')
eq_maintenance_ids = fields.One2many('maintenance.equipment', 'eq_maintenance_id', string='保养设备')
overhaul_ids = fields.One2many('maintenance.equipment', 'overhaul_id', string='检修设备')

View File

@@ -13,7 +13,7 @@ class SfMaintenanceEquipmentCategory(models.Model):
_description = '设备类别'
equipment_type = fields.Selection([('机床', '机床'), ('机器人', '机器人'), ('AGV小车', 'AGV小车'),
('检测设备', '检测设备')], string='类型', default='机床')
('检测设备', '检测设备'), ('其他', '其他')], string='类型', default='机床')
equipment_type_code = fields.Char('简写')
@@ -47,7 +47,7 @@ class SfMaintenanceEquipment(models.Model):
default="", string="轴数")
# 1212新增字段
a_axis = fields.Integer('a轴')
function_type = fields.Selection(
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
default="", string="功能类型")
@@ -73,23 +73,23 @@ class SfMaintenanceEquipment(models.Model):
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
X_precision = fields.Char('X轴定位精度(mm)')
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
Y_precision = fields.Char('Y轴定位精度(mm)')
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
Z_precision = fields.Char('Z轴定位精度(mm)')
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
a_precision = fields.Char('a轴定位精度(mm)')
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
b_precision = fields.Char('b轴定位精度(mm)')
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
c_precision = fields.Char('c轴定位精度(mm)')
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
T_tool_time = fields.Integer('T-T换刀时间(s)')
C_tool_time = fields.Integer('C-C换刀时间(s)')
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
# 待删除字段
precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3))
@@ -104,18 +104,18 @@ class SfMaintenanceEquipment(models.Model):
tool_diameter_max = fields.Char('刀具刀径max(mm)')
tool_diameter_min = fields.Char('刀具刀径min(mm)')
def get_no(self):
partner = self.env['maintenance.equipment'].sudo().search(
[('MTcode', '!=', '')],
limit=1,
order="id desc")
if not partner:
num = "%04d" % 1
else:
m = int(partner.MTcode) + 1
num = "%04d" % m
return num
# def get_no(self):
# partner = self.env['maintenance.equipment'].sudo().search(
# [('MTcode', '!=', '')],
# limit=1,
# order="id desc")
# if not partner:
# num = "%04d" % 1
#
# else:
# m = int(partner.MTcode) + 1
# num = "%04d" % m
# return num
equipment_maintenance_standards_ids = fields.Many2many('equipment.maintenance.standards',
@@ -145,10 +145,10 @@ class SfMaintenanceEquipment(models.Model):
else:
record.equipment_maintenance_standards_ids = False
MTcode = fields.Char("机台编码", default=get_no)
MTcode = fields.Char("机台编码")
created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
equipment_type = fields.Selection([('机床', '机床'), ('机器人', '机器人'), ('AGV小车', 'AGV小车'),
('检测设备', '检测设备')], compute='_compute_category_id')
('检测设备', '检测设备'), ('其他', '其他')], compute='_compute_category_id')
@api.depends('category_id')
def _compute_category_id(self):
@@ -164,11 +164,12 @@ class SfMaintenanceEquipment(models.Model):
number_of_knife_library = fields.Integer('刀库数量(把)')
rotate_speed = fields.Integer('转速')
# 加工进程
a_axis = fields.Char('a轴')
x_axis = fields.Integer('X轴')
y_axis = fields.Integer('Y轴')
z_axis = fields.Integer('Z轴')
b_axis = fields.Integer('B轴')
c_axis = fields.Integer('C轴')
b_axis = fields.Char('B轴')
c_axis = fields.Char('C轴')
remark = fields.Char('备注')
is_binding = fields.Boolean('是否绑定机床', default=False)
control_system_id = fields.Many2one('sf.machine.control_system',
@@ -178,7 +179,7 @@ class SfMaintenanceEquipment(models.Model):
type_id = fields.Many2one('sf.machine_tool.type', '型号')
state = fields.Selection(
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"),("空闲", "空闲"),("封存(报废)", "封存(报废)")],
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"), ("封存(报废)", "封存(报废)")],
default='正常', string="机床状态")
run_time = fields.Char('总运行时长')
# 0606新增字段
@@ -191,6 +192,7 @@ class SfMaintenanceEquipment(models.Model):
workpiece_load = fields.Char('工件最大负载(kg)')
workbench_L = fields.Char('工作台长度(mm)')
workbench_W = fields.Char('工作台宽度(mm)')
workbench_H = fields.Char('工作台高度(mm)')
machine_tool_L = fields.Char('机床长度(mm)')
machine_tool_W = fields.Char('机床宽度(mm)')
machine_tool_H = fields.Char('机床高度(mm)')
@@ -230,7 +232,15 @@ class SfMaintenanceEquipment(models.Model):
equipment = super(SfMaintenanceEquipment, self).create(vals)
if equipment.category_id:
equipment.name = equipment.MTcode + '#' + equipment.category_id.name
equipment.name = "%s%s" % (equipment.MTcode, equipment.category_id.name)
if equipment.category_id.equipment_type == '机床':
equipment_id = self.env['maintenance.equipment.oee'].search([('equipment_id', '=', equipment.id)])
if not equipment_id:
self.env['maintenance.equipment.oee'].sudo().create({
'equipment_id': equipment.id,
'name': equipment.name,
})
# 在创建设备之后执行一些自定义逻辑
# ...
@@ -376,8 +386,8 @@ class SfMaintenanceEquipment(models.Model):
AGV_turning_radius = fields.Char('最小转弯半径')
AGV_gradeability_max = fields.Integer('最大爬坡度')
AGV_parking_accuracy = fields.Char('停车精度')
AGV_load_weight_max = fields.Char('最大负载重量')
AGV_weight = fields.Char('本体总重量')
AGV_load_weight_max = fields.Char('AGV最大负载重量')
AGV_weight = fields.Char('AGV本体总重量')
AGV_job_duration = fields.Char('连续作业时长')
AGV_transfer_mode = fields.Char('移载方式')
AGV_drive_motor_power = fields.Char('驱动电机功率')
@@ -387,11 +397,11 @@ class SfMaintenanceEquipment(models.Model):
AGV_veer_motor_speed_ratio = fields.Char('转向电机速比')
AGV_move_motor_power = fields.Char('前移电机功率')
AGV_move_motor_speed_ratio = fields.Char('前移电机速比')
AGV_drive_mode = fields.Char('驱动方式')
AGV_drive_mode = fields.Char('AGV驱动方式')
AGV_navigation_mode = fields.Char('导航方式')
AGV_communication_mode = fields.Char('通讯方式')
AGV_direction_travel = fields.Char('行走方向')
AGV_power_requirements = fields.Char('电源要求')
AGV_power_requirements = fields.Char('AGV电源要求')
AGV_charge_mode = fields.Selection([('手动', '手动'), ('自动', '自动')], string='充电方式')
AGV_security = fields.Char('安全防护')
AGV_operating_temperature = fields.Char('环境温度')
@@ -408,8 +418,8 @@ class SfMaintenanceEquipment(models.Model):
detect_measurement_mode = fields.Selection([('光栅尺', '光栅尺'), ('容栅', '容栅'), ('磁栅', '磁栅'),
('激光干涉仪', '激光干涉仪')], string='测量方式')
detect_resolution = fields.Char('分辨率')
detect_load_weight_max = fields.Char('最大负载重量')
detect_weight = fields.Char('本体总重量')
detect_load_weight_max = fields.Char('检测设备最大负载重量')
detect_weight = fields.Char('检测设备本体总重量')
detect_measurement_length = fields.Char('深孔测量长度(max)')
detect_control_mode = fields.Char('控制方式')
detect_balance_mode_for_Z = fields.Char('Z轴平衡方式')
@@ -429,11 +439,11 @@ class SfMaintenanceEquipment(models.Model):
robot_gripping_of_workpieces_W = fields.Char('可抓取工件(宽)')
robot_gripping_of_workpieces_H = fields.Char('可抓取工件(高)')
robot_radius_of_the_boom = fields.Char('展臂半径')
robot_load_weight_max = fields.Char('最大负载重量')
robot_weight = fields.Char('本体总重量')
robot_load_weight_max = fields.Char('机械臂最大负载重量')
robot_weight = fields.Char('机械臂本体总重量')
robot_repeatable_positioning_accuracy = fields.Char('重复定位精度')
robot_axis_num = fields.Selection([('2轴', '2轴'), ('3轴', '3轴'), ('4轴', '4轴'), ('5轴', '5轴'), ('6轴', '6轴'),
('7轴', '7轴'), ('8轴', '8轴')], string='轴数')
('7轴', '7轴'), ('8轴', '8轴')], string='机械臂轴数')
axis_ids = fields.One2many('sf.robot.axis.num', 'equipment_id', string='动作范围')
robot_track_dimensions_L = fields.Char('轨道尺寸(长)')
robot_track_dimensions_W = fields.Char('轨道尺寸(宽)')
@@ -510,6 +520,7 @@ class SfMaintenanceEquipment(models.Model):
'lead_screw': item.lead_screw,
'workbench_L': item.workbench_L,
'workbench_W': item.workbench_W,
'workbench_H': item.workbench_H,
'guide_rail': item.guide_rail,
'machine_tool_L': item.machine_tool_L,
'machine_tool_W': item.machine_tool_W,
@@ -566,7 +577,7 @@ class SfMaintenanceEquipment(models.Model):
'tool_perimeter_diameter_max': item.tool_perimeter_diameter_max,
'T_tool_time': item.T_tool_time,
'C_tool_time': item.C_tool_time,
'jiancheng': item.category_id.equipment_type_code
'jiancheng': item.category_id.equipment_type_code,
}
machine_tool_list.append(val)
# kw = machine_tool_list

View File

@@ -1,24 +1,23 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_group_equipment_user,1,1,1,0
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_group_equipment_user,1,0,0,0
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_user,1,0,0,0
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,base.group_user,1,1,1,1
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,base.group_user,1,1,1,1
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_user,1,0,0,0
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_manager,1,1,1,0
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_group_equipment_user,1,0,0,0
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_group_equipment_manager,1,1,1,0
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_group_equipment_user,1,0,0,0
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,base.group_user,1,1,1,1
access_equipment_maintenance_standards_manager,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_maintenance.sf_group_equipment_manager,1,1,1,1
access_equipment_maintenance_standards,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_maintenance_logs_sf_group_equipment_user,sf_maintenance_logs,model_sf_maintenance_logs,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_maintenance_logs_sf_group_equipment_manager,sf_maintenance_logs,model_sf_maintenance_logs,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_sf_group_equipment_user,maintenance_equipment,model_maintenance_equipment,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_oee_sf_group_equipment_user,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_oee_logs_sf_group_equipment_user,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_oee_logs,maintenance_equipment_oee_logs,model_maintenance_equipment_oee_logs,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_standards_sf_group_equipment_user,maintenance_standards,model_maintenance_standards,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_maintenance.sf_group_equipment_manager,1,1,1,1
access_maintenance_standard_image_sf_group_equipment_user,maintenance_standard_image,model_maintenance_standard_image,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_sf_robot_axis_num_sf_group_equipment_user,sf_robot_axis_num,model_sf_robot_axis_num,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_robot_axis_num,sf_robot_axis_num,model_sf_robot_axis_num,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment_agv_log_sf_group_equipment_user,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_maintenance_equipment_agv_log,maintenance_equipment_agv_log,model_maintenance_equipment_agv_log,sf_maintenance.sf_group_equipment_manager,1,1,1,0
access_maintenance_system_user,equipment.request system user,maintenance.model_maintenance_request,base.group_user,1,0,0,0
@@ -29,5 +28,42 @@ access_sf_maintenance_logs_group_plan_dispatch,sf_maintenance_logs,model_sf_main
access_maintenance_standard_image_group_plan_dispatch,maintenance_standard_image,model_maintenance_standard_image,sf_base.group_plan_dispatch,1,0,0,0
access_equipment_maintenance_standards_group_plan_dispatch,equipment_maintenance_standards,model_equipment_maintenance_standards,sf_base.group_plan_dispatch,1,0,0,0
access_maintenance_standards_group_plan_dispatch,maintenance_standards,model_maintenance_standards,sf_base.group_plan_dispatch,1,0,0,0
access_maintenance_equipment_agv_log_group_plan_dispatch,maintenance.equipment.agv.log,model_maintenance_equipment_agv_log,sf_base.group_plan_dispatch,1,0,0,0
access_sf_robot_axis_num_group_plan_dispatch,sf.robot.axis.num,model_sf_robot_axis_num,sf_base.group_plan_dispatch,1,0,0,0
access_sf_robot_axis_num_group_plan_dispatch,sf.robot.axis.num,model_sf_robot_axis_num,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_tool_sf_group_equipment_user,sf_machine_tool,sf_base.model_sf_machine_tool,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_tool_admin_sf_group_equipment_user,sf_machine_tool_admin,sf_base.model_sf_machine_tool,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_tool_type_sf_group_equipment_user,sf_machine_tool_type,sf_base.model_sf_machine_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_tool_type_admin_sf_group_equipment_user,sf_machine_tool_type_admin,sf_base.model_sf_machine_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_brand_sf_group_equipment_user,sf_machine_brand,sf_base.model_sf_machine_brand,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_brand_admin_sf_group_equipment_user,sf_machine_brand_admin,sf_base.model_sf_machine_brand,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_brand_tags_sf_group_equipment_user,sf_machine_brand_tags,sf_base.model_sf_machine_brand_tags,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_brand_tags_admin_sf_group_equipment_user,sf_machine_brand_tags_admin,sf_base.model_sf_machine_brand_tags,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_control_system_sf_group_equipment_user,sf_machine_control_system,sf_base.model_sf_machine_control_system,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_control_system_admin_sf_group_equipment_user,sf_machine_control_system_admin,sf_base.model_sf_machine_control_system,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_sf_group_equipment_user,sf_production_process,sf_base.model_sf_production_process,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_admin_sf_group_equipment_user,sf_production_process_admin,sf_base.model_sf_production_process,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_materials_sf_group_equipment_user,sf_production_materials,sf_base.model_sf_production_materials,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_materials_admin_sf_group_equipment_user,sf_production_materials_admin,sf_base.model_sf_production_materials,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_materials_model_sf_group_equipment_user,sf_materials_model,sf_base.model_sf_materials_model,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_materials_model_admin_sf_group_equipment_user,sf_materials_model_admin,sf_base.model_sf_materials_model,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_supplier_sort_sf_group_equipment_user,sf_supplier_sort,sf_base.model_sf_supplier_sort,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_supplier_sort_admin_sf_group_equipment_user,sf_supplier_sort_admin,sf_base.model_sf_supplier_sort,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_parameter_sf_group_equipment_user,sf_production_process_parameter,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_parameter_group_plan_director_sf_group_equipment_user,sf_production_process_parameter_group_plan_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_parameter_group_purchase_director_sf_group_equipment_user,sf_production_process_parameter_group_purchase_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_parameter_group_sale_director_sf_group_equipment_user,sf_production_process_parameter_group_sale_director,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_parameter_admin_sf_group_equipment_user,sf_production_process_parameter_admin,sf_base.model_sf_production_process_parameter,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_category_sf_group_equipment_user,sf_production_process_category,sf_base.model_sf_production_process_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_production_process_category_admin_sf_group_equipment_user,sf_production_process_category_admin,sf_base.model_sf_production_process_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_tool_category_sf_group_equipment_user,sf_machine_tool_category,sf_base.model_sf_machine_tool_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_machine_tool_category_admin_sf_group_equipment_user,sf_machine_tool_category_admin,sf_base.model_sf_machine_tool_category,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_material_sf_group_equipment_user,sf_cutting_tool_material,sf_base.model_sf_cutting_tool_material,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_material_admin_sf_group_equipment_user,sf_cutting_tool_material_admin,sf_base.model_sf_cutting_tool_material,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_type_sf_group_equipment_user,sf_cutting_tool_type,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_type_admin_sf_group_equipment_user,sf_cutting_tool_type_admin,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_type_group_purchase_director_sf_group_equipment_user,sf_cutting_tool_type_group_purchase_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_type_group_sale_director_sf_group_equipment_user,sf_cutting_tool_type_group_sale_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
access_sf_cutting_tool_type_group_plan_director_sf_group_equipment_user,sf_cutting_tool_type_group_plan_director,sf_base.model_sf_cutting_tool_type,sf_maintenance.sf_group_equipment_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_equipment_maintenance_standards access_equipment_maintenance_standards_manager equipment_maintenance_standards model_equipment_maintenance_standards sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 1 1 0 1
3 access_sf_maintenance_logs access_equipment_maintenance_standards sf_maintenance_logs equipment_maintenance_standards model_sf_maintenance_logs model_equipment_maintenance_standards sf_group_equipment_user sf_maintenance.sf_group_equipment_user 1 0 0 0
4 access_sf_maintenance_logs access_sf_maintenance_logs_sf_group_equipment_user sf_maintenance_logs model_sf_maintenance_logs sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
5 access_maintenance_equipment access_sf_maintenance_logs_sf_group_equipment_manager maintenance_equipment sf_maintenance_logs model_maintenance_equipment model_sf_maintenance_logs sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0
6 access_maintenance_equipment access_maintenance_equipment_sf_group_equipment_user maintenance_equipment model_maintenance_equipment sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
7 access_maintenance_equipment_oee access_maintenance_equipment maintenance_equipment_oee maintenance_equipment model_maintenance_equipment_oee model_maintenance_equipment sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0
8 access_maintenance_equipment_oee access_maintenance_equipment_oee_sf_group_equipment_user maintenance_equipment_oee model_maintenance_equipment_oee sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
9 access_maintenance_equipment_oee maintenance_equipment_oee model_maintenance_equipment_oee base.group_user sf_maintenance.sf_group_equipment_manager 1 1 1 1 0
10 access_maintenance_equipment_oee_logs access_maintenance_equipment_oee_logs_sf_group_equipment_user maintenance_equipment_oee_logs model_maintenance_equipment_oee_logs sf_group_equipment_user sf_maintenance.sf_group_equipment_user 1 0 0 0
11 access_maintenance_equipment_oee_logs maintenance_equipment_oee_logs model_maintenance_equipment_oee_logs sf_group_equipment_manager sf_maintenance.sf_group_equipment_manager 1 1 1 0
12 access_maintenance_equipment_oee_logs access_maintenance_standards_sf_group_equipment_user maintenance_equipment_oee_logs maintenance_standards model_maintenance_equipment_oee_logs model_maintenance_standards base.group_user sf_maintenance.sf_group_equipment_user 1 1 0 1 0 1 0
13 access_maintenance_standards maintenance_standards model_maintenance_standards sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0 1
14 access_maintenance_standards access_maintenance_standard_image_sf_group_equipment_user maintenance_standards maintenance_standard_image model_maintenance_standards model_maintenance_standard_image sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
15 access_maintenance_standard_image maintenance_standard_image model_maintenance_standard_image sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0
16 access_maintenance_standard_image access_sf_robot_axis_num_sf_group_equipment_user maintenance_standard_image sf_robot_axis_num model_maintenance_standard_image model_sf_robot_axis_num sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
17 access_sf_robot_axis_num sf_robot_axis_num model_sf_robot_axis_num sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0
18 access_sf_robot_axis_num access_maintenance_equipment_agv_log_sf_group_equipment_user sf_robot_axis_num maintenance_equipment_agv_log model_sf_robot_axis_num model_maintenance_equipment_agv_log sf_group_equipment_manager sf_maintenance.sf_group_equipment_user 1 1 0 1 0 0
19 access_maintenance_equipment_agv_log maintenance_equipment_agv_log model_maintenance_equipment_agv_log sf_group_equipment_user sf_maintenance.sf_group_equipment_manager 1 0 1 0 1 0
20 access_maintenance_equipment_agv_log access_maintenance_system_user maintenance_equipment_agv_log equipment.request system user model_maintenance_equipment_agv_log maintenance.model_maintenance_request sf_group_equipment_manager base.group_user 1 1 0 1 0 0
access_maintenance_equipment_agv_log maintenance_equipment_agv_log model_maintenance_equipment_agv_log base.group_user 1 1 1 1
21 access_maintenance_system_user access_maintenance_equipment_group_plan_dispatch equipment.request system user maintenance.equipment maintenance.model_maintenance_request maintenance.model_maintenance_equipment base.group_user sf_base.group_plan_dispatch 1 0 0 0
22 access_maintenance_equipment_group_plan_dispatch access_maintenance_equipment_oee_group_plan_dispatch maintenance.equipment maintenance_equipment_oee maintenance.model_maintenance_equipment model_maintenance_equipment_oee sf_base.group_plan_dispatch 1 0 0 0
23 access_maintenance_equipment_oee_group_plan_dispatch access_sf_maintenance_logs_group_plan_dispatch maintenance_equipment_oee sf_maintenance_logs model_maintenance_equipment_oee model_sf_maintenance_logs sf_base.group_plan_dispatch 1 0 0 0
28 access_sf_robot_axis_num_group_plan_dispatch sf.robot.axis.num model_sf_robot_axis_num sf_base.group_plan_dispatch 1 0 0 0
29 access_sf_machine_tool_sf_group_equipment_user sf_machine_tool sf_base.model_sf_machine_tool sf_maintenance.sf_group_equipment_user 1 0 0 0
30 access_sf_machine_tool_admin_sf_group_equipment_user sf_machine_tool_admin sf_base.model_sf_machine_tool sf_maintenance.sf_group_equipment_user 1 0 0 0
31 access_sf_machine_tool_type_sf_group_equipment_user sf_machine_tool_type sf_base.model_sf_machine_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
32 access_sf_machine_tool_type_admin_sf_group_equipment_user sf_machine_tool_type_admin sf_base.model_sf_machine_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
33 access_sf_machine_brand_sf_group_equipment_user sf_machine_brand sf_base.model_sf_machine_brand sf_maintenance.sf_group_equipment_user 1 0 0 0
34 access_sf_machine_brand_admin_sf_group_equipment_user sf_machine_brand_admin sf_base.model_sf_machine_brand sf_maintenance.sf_group_equipment_user 1 0 0 0
35 access_sf_machine_brand_tags_sf_group_equipment_user sf_machine_brand_tags sf_base.model_sf_machine_brand_tags sf_maintenance.sf_group_equipment_user 1 0 0 0
36 access_sf_machine_brand_tags_admin_sf_group_equipment_user sf_machine_brand_tags_admin sf_base.model_sf_machine_brand_tags sf_maintenance.sf_group_equipment_user 1 0 0 0
37 access_sf_machine_control_system_sf_group_equipment_user sf_machine_control_system sf_base.model_sf_machine_control_system sf_maintenance.sf_group_equipment_user 1 0 0 0
38 access_sf_machine_control_system_admin_sf_group_equipment_user sf_machine_control_system_admin sf_base.model_sf_machine_control_system sf_maintenance.sf_group_equipment_user 1 0 0 0
39 access_sf_production_process_sf_group_equipment_user sf_production_process sf_base.model_sf_production_process sf_maintenance.sf_group_equipment_user 1 0 0 0
40 access_sf_production_process_admin_sf_group_equipment_user sf_production_process_admin sf_base.model_sf_production_process sf_maintenance.sf_group_equipment_user 1 0 0 0
41 access_sf_production_materials_sf_group_equipment_user sf_production_materials sf_base.model_sf_production_materials sf_maintenance.sf_group_equipment_user 1 0 0 0
42 access_sf_production_materials_admin_sf_group_equipment_user sf_production_materials_admin sf_base.model_sf_production_materials sf_maintenance.sf_group_equipment_user 1 0 0 0
43 access_sf_materials_model_sf_group_equipment_user sf_materials_model sf_base.model_sf_materials_model sf_maintenance.sf_group_equipment_user 1 0 0 0
44 access_sf_materials_model_admin_sf_group_equipment_user sf_materials_model_admin sf_base.model_sf_materials_model sf_maintenance.sf_group_equipment_user 1 0 0 0
45 access_sf_supplier_sort_sf_group_equipment_user sf_supplier_sort sf_base.model_sf_supplier_sort sf_maintenance.sf_group_equipment_user 1 0 0 0
46 access_sf_supplier_sort_admin_sf_group_equipment_user sf_supplier_sort_admin sf_base.model_sf_supplier_sort sf_maintenance.sf_group_equipment_user 1 0 0 0
47 access_sf_production_process_parameter_sf_group_equipment_user sf_production_process_parameter sf_base.model_sf_production_process_parameter sf_maintenance.sf_group_equipment_user 1 0 0 0
48 access_sf_production_process_parameter_group_plan_director_sf_group_equipment_user sf_production_process_parameter_group_plan_director sf_base.model_sf_production_process_parameter sf_maintenance.sf_group_equipment_user 1 0 0 0
49 access_sf_production_process_parameter_group_purchase_director_sf_group_equipment_user sf_production_process_parameter_group_purchase_director sf_base.model_sf_production_process_parameter sf_maintenance.sf_group_equipment_user 1 0 0 0
50 access_sf_production_process_parameter_group_sale_director_sf_group_equipment_user sf_production_process_parameter_group_sale_director sf_base.model_sf_production_process_parameter sf_maintenance.sf_group_equipment_user 1 0 0 0
51 access_sf_production_process_parameter_admin_sf_group_equipment_user sf_production_process_parameter_admin sf_base.model_sf_production_process_parameter sf_maintenance.sf_group_equipment_user 1 0 0 0
52 access_sf_production_process_category_sf_group_equipment_user sf_production_process_category sf_base.model_sf_production_process_category sf_maintenance.sf_group_equipment_user 1 0 0 0
53 access_sf_production_process_category_admin_sf_group_equipment_user sf_production_process_category_admin sf_base.model_sf_production_process_category sf_maintenance.sf_group_equipment_user 1 0 0 0
54 access_sf_machine_tool_category_sf_group_equipment_user sf_machine_tool_category sf_base.model_sf_machine_tool_category sf_maintenance.sf_group_equipment_user 1 0 0 0
55 access_sf_machine_tool_category_admin_sf_group_equipment_user sf_machine_tool_category_admin sf_base.model_sf_machine_tool_category sf_maintenance.sf_group_equipment_user 1 0 0 0
56 access_sf_cutting_tool_material_sf_group_equipment_user sf_cutting_tool_material sf_base.model_sf_cutting_tool_material sf_maintenance.sf_group_equipment_user 1 0 0 0
57 access_sf_cutting_tool_material_admin_sf_group_equipment_user sf_cutting_tool_material_admin sf_base.model_sf_cutting_tool_material sf_maintenance.sf_group_equipment_user 1 0 0 0
58 access_sf_cutting_tool_type_sf_group_equipment_user sf_cutting_tool_type sf_base.model_sf_cutting_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
59 access_sf_cutting_tool_type_admin_sf_group_equipment_user sf_cutting_tool_type_admin sf_base.model_sf_cutting_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
60 access_sf_cutting_tool_type_group_purchase_director_sf_group_equipment_user sf_cutting_tool_type_group_purchase_director sf_base.model_sf_cutting_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
61 access_sf_cutting_tool_type_group_sale_director_sf_group_equipment_user sf_cutting_tool_type_group_sale_director sf_base.model_sf_cutting_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
62 access_sf_cutting_tool_type_group_plan_director_sf_group_equipment_user sf_cutting_tool_type_group_plan_director sf_base.model_sf_cutting_tool_type sf_maintenance.sf_group_equipment_user 1 0 0 0
63
64
65
66
67
68
69

View File

@@ -12,7 +12,7 @@
<group>
<field name="code" readonly="1" force_save="1"/>
<field name="name" readonly="1" force_save="1"/>
<field name="maintenance_equipment_category_id" required="1"/>
<field name="maintenance_equipment_category_id" required="1" />
<field name="eq_maintenance_ids" invisible='1'/>
<field name="overhaul_ids" invisible='1'/>
@@ -31,12 +31,12 @@
<notebook>
<page string="维保项目">
<field name="maintenance_standards_ids">
<tree editable="bottom">
<field name="name"/>
<field name="fault_type"/>
<field name="maintenance_standards"/>
<field name="Period"/>
<field name="maintenance_standards_ids" delete="1">
<tree editable="bottom" >
<field name="name" />
<field name="fault_type" />
<field name="maintenance_standards" />
<field name="Period" />
</tree>
</field>
</page>

View File

@@ -18,8 +18,8 @@
<field name="inherit_id" ref="maintenance.hr_equipment_category_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='technician_user_id']" position="before">
<field name="equipment_type"/>
<field name="equipment_type_code" required='1'/>
<field name="equipment_type" class="custom_required"/>
<field name="equipment_type_code" required='1' class="custom_required"/>
</xpath>
</field>
</record>

View File

@@ -76,22 +76,30 @@
<field name="equipment_maintenance_id"/>
</xpath>
<xpath expr="//field[@name='user_id']" position="replace">
<field name="user_id" string="维保人"/>
</xpath>
<xpath expr="//field[@name='close_date']" position="replace">
<field name="close_date" attrs="{'invisible': [('done', '!=', True)]}" readonly="True" string="维保日期"/>
</xpath>
<sheet>
<notebook>
<page string="维保标准" attrs="{'invisible': [('equipment_maintenance_id', '=', False)]}" context="{'default_standard_id': 'id'}">
<field name="maintenance_standards" widget="one2many_list">
<tree multi_edit="" editable="">
<field name="name" />
<field name="maintenance_standards"/>
<field name="images" force_save="1" required="1">
<field name="name" class="table_custom_required"/>
<field name="maintenance_standards" class="table_custom_required"/>
<field name="images" force_save="1" required="1" class="table_custom_required">
</field>
<field name="remark"/>
<field name="remark" class="table_custom_required"/>
</tree>
</field>
</page>
</notebook>
</sheet>

View File

@@ -36,8 +36,7 @@
type="action"
class="oe_stat_button"
context="{'search_default_equipment_id': [active_id]}"
icon="fa-exchange"
attrs="{'invisible': [('state_zc', '!=', '已注册')]}">
icon="fa-exchange">
<field string="设备oee" name="equipment_oee_ids" widget="statinfo"/>
</button>
@@ -56,12 +55,14 @@
<field name="MTcode"/>
</xpath>
<xpath expr="//field[@name='category_id']" position="after">
<field name="state_zc" readonly="1"/>
<field name="function_type"/>
<field name="code" readonly="1"/>
<field name="equipment_type" invisible="1"/>
<field name="brand_id" force_save="1"/>
<field name="brand_id" force_save="1" />
<field name="type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
domain="[('brand_id', '=', brand_id)]"/>
domain="[('brand_id', '=', brand_id)]" />
<field name="machine_tool_category" readonly="1" attrs="{'invisible': [('type_id', '=', False)]}"
force_save="1"/>
<field name="run_time" force_save="1"/>
@@ -72,7 +73,7 @@
<group>
<group string="基础参数">
<field name="control_system_id" attrs="{'required': [('equipment_type', '=', '机床')]}"
options="{'no_create': True}"/>
options="{'no_create': True}" />
<label for="workbench_L" string="工作台尺寸(mm)"/>
<div class="test_model">
<label for="workbench_L" string="长"/>
@@ -84,6 +85,11 @@
<field name="workbench_W" class="o_address_zip"
attrs="{'required': [('equipment_type', '=', '机床')]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="workbench_H" string="高"/>
<field name="workbench_H" class="o_address_zip"
attrs="{'required': [('equipment_type', '=', '机床')]}"
options="{'format': false}"/>
</div>
<field name="workpiece_load"/>
<label for="machine_tool_L" string="机床尺寸(mm)"/>
@@ -128,7 +134,7 @@
<!-- <field name="guide_rail" required="1"/>-->
<field name="number_of_axles" attrs="{'required': [('equipment_type', '=', '机床')]}"
widget="radio"
options="{'horizontal': true}"/>
options="{'horizontal': true}" />
<label for="x_axis" string="加工行程(mm)"
attrs="{'invisible': [('number_of_axles', '=', False)]}"/>
<div class="test_model"
@@ -154,21 +160,44 @@
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="b_axis" string="b"
<label for="c_axis" string="c"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
<field name="b_axis" class="o_address_zip"
<field name="c_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="c_axis" string="c"
<label for="b_axis" string="b"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
<field name="c_axis" class="o_address_zip"
<field name="b_axis" class="o_address_zip"
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
options="{'format': false}"/>
</div>
</group>
<group string="主轴">
<field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}"/>
<group string="刀具">
<!-- <field name="knife_type" required="1"/>-->
<field name="number_of_knife_library"
attrs="{'required': [('equipment_type', '=', '机床')]}"/>
<!-- <field name="tool_speed" required="1"/>-->
<field name="tool_full_diameter_max"/>
<field name="tool_perimeter_diameter_max"/>
<field name="tool_long_max"/>
<!-- <label for="tool_diameter_min" string="刀具刀径(mm)"/>-->
<!-- <div class="test_model">-->
<!-- <label for="tool_diameter_min" string="最小(min)"/>-->
<!-- <field name="tool_diameter_min" class="o_address_zip" required="1"-->
<!-- options="{'format': false}"/>-->
<!-- <span>&amp;nbsp;</span>-->
<!-- <label for="tool_diameter_max" string="最大(max)"/>-->
<!-- <field name="tool_diameter_max" class="o_address_zip" required="1"-->
<!-- options="{'format': false}"/>-->
<!-- </div>-->
<field name="tool_quality_max"/>
<field name="T_tool_time"/>
<field name="C_tool_time"/>
</group>
<group string="主轴">
<field name="taper_type_id" attrs="{'required': [('equipment_type', '=', '机床')]}" />
<label for="distance_min" string="主轴端面-工作台距离(mm)"/>
<div class="test_model">
<label for="distance_min" string="最小(min)"/>
@@ -192,40 +221,8 @@
<!-- <field name="distance" required="1"/>-->
</group>
<group string="刀具">
<!-- <field name="knife_type" required="1"/>-->
<field name="number_of_knife_library"
attrs="{'required': [('equipment_type', '=', '机床')]}"
options="{'format': false}"/>
<!-- <field name="tool_speed" required="1"/>-->
<field name="tool_full_diameter_max"/>
<field name="tool_perimeter_diameter_max"/>
<field name="tool_long_max"/>
<!-- <label for="tool_diameter_min" string="刀具刀径(mm)"/>-->
<!-- <div class="test_model">-->
<!-- <label for="tool_diameter_min" string="最小(min)"/>-->
<!-- <field name="tool_diameter_min" class="o_address_zip" required="1"-->
<!-- options="{'format': false}"/>-->
<!-- <span>&amp;nbsp;</span>-->
<!-- <label for="tool_diameter_max" string="最大(max)"/>-->
<!-- <field name="tool_diameter_max" class="o_address_zip" required="1"-->
<!-- options="{'format': false}"/>-->
<!-- </div>-->
<field name="tool_quality_max"/>
<field name="T_tool_time"/>
<field name="C_tool_time"/>
</group>
<group string="进给参数">
<field name="X_axis_rapid_traverse_speed"/>
<field name="Y_axis_rapid_traverse_speed"/>
<field name="Z_axis_rapid_traverse_speed"/>
<field name="a_axis_rapid_traverse_speed"/>
<field name="b_axis_rapid_traverse_speed"/>
<field name="c_axis_rapid_traverse_speed"/>
<field name="straight_cutting_feed_rate"/>
<field name="rotary_cutting_feed_rate"/>
</group>
<group string="精度参数">
<field name="X_precision"/>
<field name="X_precision_repeat"/>
@@ -240,6 +237,16 @@
<field name="c_precision"/>
<field name="c_precision_repeat"/>
</group>
<group string="进给参数">
<field name="X_axis_rapid_traverse_speed"/>
<field name="Y_axis_rapid_traverse_speed"/>
<field name="Z_axis_rapid_traverse_speed"/>
<field name="a_axis_rapid_traverse_speed"/>
<field name="b_axis_rapid_traverse_speed"/>
<field name="c_axis_rapid_traverse_speed"/>
<field name="straight_cutting_feed_rate"/>
<field name="rotary_cutting_feed_rate"/>
</group>
</group>
@@ -1180,7 +1187,7 @@
<field name="name" readonly="1"/>
<field name="type" readonly="1"/>
<field name="image" widget="image" readonly="1"/>
<field name="equipment_id"/>
<!-- <field name="equipment_id"/>-->
<field name="active" invisible="1"/>
</tree>
</field>

View File

@@ -24,6 +24,7 @@
'views/mrp_workcenter_views.xml',
'views/mrp_workorder_view.xml',
'views/model_type_view.xml',
'views/agv_setting_views.xml',
'views/sf_maintenance_equipment.xml',
],

View File

@@ -1 +1,2 @@
from . import controllers
from . import workpiece

View File

@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import logging
import json
from datetime import datetime
from odoo import http
from odoo.http import request
@@ -21,27 +22,32 @@ class Manufacturing_Connect(http.Controller):
datas = request.httprequest.data
ret = json.loads(datas)
logging.info('RfidCode:%s' % ret['RfidCode'])
workorder = request.env['mrp.workorder'].sudo().search(
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', '装夹预调')])
if workorder:
for item in workorder:
res['Datas'].append({
'BillId': item.production_id.name,
'ProductionLine': item.production_line,
'CraftName': item.name,
'Quantity': 1,
'MaterialId': item.product_id.default_code,
'MaterialName': item.product_id.name,
'Spec': '%s×%s×%s' % (item.move_raw_ids.materiel_length, item.move_raw_ids.materiel_width,
item.move_raw_ids.materiel_height),
'Material': item.product_id.materials_type_id.name
})
if 'RfidCode' in ret:
workorder = request.env['mrp.workorder'].sudo().search([('rfid_code', '=', ret['RfidCode'])])
if workorder:
for item in workorder:
res['Datas'].append({
'BillId': item.production_id.name,
'ProductionLine': item.production_id.production_line_id.id,
'SortId': item.sequence,
'CraftName': item.name,
'Quantity': 1,
'MaterialId': item.product_id.default_code,
'MaterialName': item.product_id.name,
'Spec': '%s×%s×%s' % (item.move_raw_ids.materiel_length, item.move_raw_ids.materiel_width,
item.move_raw_ids.materiel_height),
'Material': item.product_id.materials_type_id.name
})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该rfid暂未有对应的工单'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('get_Work_Info error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/GetShiftPlan', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
@http.route('/AutoDeviceApi/GetShiftPlan', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_ShiftPlan(self, **kw):
"""
@@ -54,22 +60,29 @@ class Manufacturing_Connect(http.Controller):
res = {'Succeed': True, 'Datas': []}
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
if 'ProductionLine' in ret:
workorder_ids = request.env['mrp.workorder'].sudo().get_plan_workorder(ret['ProductionLine'])
else:
ProductionLine = False
workorder_ids = request.env['mrp.workorder'].sudo().get_plan_workorder(ProductionLine)
logging.info('RfidCode:%s' % ret)
workorder = request.env['mrp.workorder'].sudo().search([('name', '=', ret['ProductionLine'])])
logging.info('workorder_ids:%s' % workorder_ids)
workorder = request.env['mrp.workorder'].sudo().search(workorder_ids)
if workorder:
for item in workorder:
date_planned_start = ''
date_planned_finished = ''
if item.date_planned_start is not False:
logging.info('date_planned_start:%s' % item.date_planned_start)
planned_start = item.date_planned_start.strftime("%Y-%m-%d %H:%M:%S")
date_planned_start = request.env['sf.sync.common'].sudo().get_add_time(planned_start)
if item.date_planned_finished is not False:
logging.info('date_planned_finished:%s' % item.date_planned_finished)
planned_finished = item.date_planned_finished.strftime("%Y-%m-%d %H:%M:%S")
date_planned_finished = request.env['sf.sync.common'].sudo().get_add_time(planned_finished)
res['Datas'].append({
'BillId': item.production_id.name,
'RfidCode': item.RfidCode,
'RfidCode': item.rfid_code,
'CraftName': item.name,
'Quantity': 1,
'WortkStart': date_planned_start,
@@ -77,7 +90,7 @@ class Manufacturing_Connect(http.Controller):
'MaterialId': item.product_id.default_code,
'MaterialName': item.product_id.name,
# 'Spec':item.mat,
'Material': item.materials_type_id.name
'Material': item.product_id.materials_type_id.name
})
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
@@ -99,17 +112,25 @@ class Manufacturing_Connect(http.Controller):
res = {'Succeed': True, 'Datas': []}
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
logging.info('RfidCode:%s' % ret)
workorder = request.env['mrp.workorder'].sudo().search([('routing_type', '=', '前置三元定位检测')])
if workorder:
for item in workorder:
res['Datas'].append({
'XOffset': item.production_id.name,
'YOffset': item.RfidCode,
'ZOffet': item.name,
'COffset': 1
})
logging.info('RfidCode:%s' % ret['RfidCode'])
if 'RfidCode' in ret:
workorder = request.env['mrp.workorder'].sudo().search(
[('routing_type', '=', '装夹预调'), ('rfid_code', '=', ret['RfidCode'])], limit=1, order='id asc')
if workorder:
for item in workorder:
if item.material_center_point:
offset = item.material_center_point[1:-1].split(",")
res['Datas'].append({
'XOffset': 0 if not item.material_center_point else offset[0],
'YOffset': 0 if not item.material_center_point else offset[1],
'ZOffset': 0 if not item.material_center_point else offset[2],
'COffset': 0,
'Coordinate': 'G54'
})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该rfid暂未有对应的工件预调(前置三元检测)工单'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('get_qcCheck error:%s' % e)
@@ -125,23 +146,34 @@ class Manufacturing_Connect(http.Controller):
"""
logging.info('button_Work_START:%s' % kw)
try:
res = {'Succeed': True, 'Datas': []}
res = {'Succeed': True, 'Datas': ['工单已开始']}
datas = request.httprequest.data
ret = json.loads(datas)
if not ret['BillId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
return json.JSONEncoder().encode(res)
if not ret['CraftId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
return json.JSONEncoder().encode(res)
if not ret['DeviceId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
return json.JSONEncoder().encode(res)
production_id = ret['BillId']
routing_type = ret['CraftId']
equipment_id = ret["DeviceId"]
workorder = request.env['mrp.workorder'].sudo().search(
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
if not workorder:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单不存在'}
return json.JSONEncoder().encode(res)
if workorder.state != 'ready':
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '工单未就绪'}
return json.JSONEncoder().encode(res)
work_equipment_id = request.env['maintenance.equipment'].sudo().search([('name', '=', equipment_id)],
limit=1)
if not work_equipment_id:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有找到该加工设备'}
return json.JSONEncoder().encode(res)
workorder.equipment_id = work_equipment_id
workorder.button_start()
# 根据工单的实际开始时间修改排程单的开始时间、状态
if workorder.date_start:
request.env['sf.production.plan'].sudo().search([('production_id', '=', production_id)]).write(
{'actual_start_time': workorder.date_start,
'state': 'processing'})
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('button_Work_START error:%s' % e)
@@ -157,61 +189,342 @@ class Manufacturing_Connect(http.Controller):
"""
logging.info('button_Work_End:%s' % kw)
try:
res = {'Succeed': True, 'Datas': []}
res = {'Succeed': True, 'Datas': ['工单已结束']}
datas = request.httprequest.data
ret = json.loads(datas)
if not ret['BillId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
return json.JSONEncoder().encode(res)
if not ret['CraftId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
return json.JSONEncoder().encode(res)
if not ret['DeviceId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
return json.JSONEncoder().encode(res)
production_id = ret['BillId']
routing_type = ret['CraftId']
workorder = request.env['mrp.workorder'].sudo().search(
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
if not workorder:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单不存在'}
return json.JSONEncoder().encode(res)
if workorder.state != 'progress':
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '该工单未开始'}
return json.JSONEncoder().encode(res)
workorder.button_finish()
# 根据工单的实际结束时间修改排程单的结束时间、状态,同时修改销售订单的状态
if workorder.date_finished:
request.env['sf.production.plan'].sudo().search([('production_id', '=', production_id)]).write(
{'actual_end_time': workorder.date_finished,
'state': 'finished'})
production_obj = request.env['mrp.production'].sudo().search([('name', '=', production_id)])
if production_obj:
production_obj.sudo().work_order_state = '已完成'
production_obj.write({'state': 'completed'})
request.env['sale.order'].sudo().search(
[('name', '=', production_obj.origin)]).write({'schedule_status': 'to deliver'})
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('button_Work_End error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/QcCheck', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
@http.route('/AutoDeviceApi/PartQualityInspect', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def Workorder_QcCheck(self, **kw):
def PartQualityInspect(self, **kw):
"""
零件质检
:param kw:
:return:
"""
logging.info('Workorder_QcCheck:%s' % kw)
logging.info('PartQualityInspect:%s' % kw)
try:
res = {'Succeed': True}
datas = request.httprequest.data
ret = json.loads(datas)
production_id = ret['BillId']
routing_type = ret['CraftId']
workorder = request.env['mrp.workorder'].sudo().search(
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
if workorder:
# workorder.test_results = ret['Quality']
logging.info('制造订单:%s' % workorder.production_id.name)
if 'ReportPaht' in ret:
download_state = request.env['mrp.workorder'].with_user(
request.env.ref("base.user_admin")).download_reportfile_tmp(workorder,
ret['ReportPaht'])
if download_state == 1:
detection_ret = request.env['mrp.workorder'].with_user(
request.env.ref("base.user_admin")).get_detection_file(workorder, ret['ReportPaht'])
if detection_ret is True:
stock_picking_type = request.env['stock.picking.type'].sudo().search(
[('sequence_code', '=', 'SFP')])
if stock_picking_type:
stock_picking = request.env['stock.picking'].sudo().search(
[('product_id', '=', workorder.product_id.id),
('origin', '=', workorder.production_id.origin),
('picking_type_id', '=', stock_picking_type.id)])
if stock_picking:
quality_check = request.env['quality.check'].sudo().search(
[('product_id', '=', workorder.product_id.id),
('picking_id', '=', stock_picking.id)])
if quality_check:
logging.info('质检单:%s' % quality_check.name)
quality_check.write({'report_pdf': workorder.detection_report})
elif download_state == 2:
res = {'Succeed': False, 'ErrorCode': 205,
'Error': 'ReportPaht中的工件号与制造订单%s不匹配请检查ReportPaht是否正确' % workorder.production_id.name}
else:
res = {'Succeed': False, 'ErrorCode': 204, 'Error': '检测报告文件从FTP拉取失败'}
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传ReportPaht字段'}
else:
res = {'Succeed': False, 'ErrorCode': 206, 'Error': '未查询到工单'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('PartQualityInspect error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/CMMProgDolod', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
cors="*")
def CMMProgDolod(self, **kw):
"""
中控系统传递RFID编号给MES获取测量程序文件。Ftp下载文件
:param kw:
:return:
"""
logging.info('CMMProgDolod:%s' % kw)
try:
res = {'Succeed': True, 'Datas': []}
datas = request.httprequest.data
ret = json.loads(datas)
if not ret['BillId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
return json.JSONEncoder().encode(res)
if not ret['CraftId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
return json.JSONEncoder().encode(res)
if not ret['DeviceId']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
return json.JSONEncoder().encode(res)
if not ret['Quality']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检测结果'}
return json.JSONEncoder().encode(res)
if not ret['ReportPaht']:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检查报告文件(地址)'}
return json.JSONEncoder().encode(res)
production_id = ret['BillId']
routing_type = ret['CraftId']
request.env['mrp.workorder'].sudo().search(
[('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
if 'RfidCode' in ret:
logging.info('RfidCode:%s' % ret['RfidCode'])
workorder = request.env['mrp.workorder'].sudo().search(
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', 'CNC加工')])
if workorder:
for item in workorder.cmm_ids:
if item.program_date is not False:
program_date = item.program_date.strftime("%Y-%m-%d %H:%M:%S")
program_date_str = request.env['sf.sync.common'].sudo().get_add_time(program_date)
res['Datas'].append({
'CraftId': workorder.id,
'CraftKey': workorder.name,
'ProgramDate': '' if not item.program_date else program_date_str,
'ProgramPath': item.program_path,
'PostProcessing': item.post_processing_name,
})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '暂无工单及对应的CNC程序数据'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('Workorder_QcCheck error:%s' % e)
logging.info('CMMProgDolod error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/NCProgDolod', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
cors="*")
def NCProgDolod(self, **kw):
"""
中控系统传递RFID编号给MES获取程序单及程序文件。Ftp下载文件
:param kw:
:return:
"""
logging.info('NCProgDolod:%s' % kw)
try:
res = {'Succeed': True, 'Datas': []}
datas = request.httprequest.data
ret = json.loads(datas)
if 'RfidCode' in ret:
logging.info('RfidCode:%s' % ret['RfidCode'])
workorder = request.env['mrp.workorder'].sudo().search(
[('rfid_code', '=', ret['RfidCode']), ('routing_type', '=', 'CNC加工')])
if workorder:
for item in workorder.cnc_ids:
res['Datas'].append({
'CraftId': workorder.id,
'CraftName': workorder.name,
'SortId': item.sequence_number,
'ProgramName': item.program_name,
'ToolId': item.cutting_tool_no,
'ToolName': item.cutting_tool_name,
'Depth': item.depth_of_processing_z,
'ProgramPath': item.program_path,
'ProgramTime': item.estimated_processing_time,
})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '暂无工单及对应的CNC程序数据'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('NCProgDolod error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/LocationChange', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def LocationChange(self, **kw):
"""
库位变更
:param kw:
:return:
"""
logging.info('LocationChange:%s' % kw)
try:
res = {'Succeed': True, 'Datas': []}
datas = request.httprequest.data
ret = json.loads(datas)
RfidCode = ret['RfidCode']
ChangeType = ret['ChangeType']
OldDeciveId = ret['OldDeciveId']
OldPosition = ret['OldPosition']
NewDeciveId = ret['NewDeciveId']
NewPosition = ret['NewPosition']
OldDeciveStart = ret['OldDeciveStart']
OldDeciveEnd = ret['OldDeciveEnd']
# Part、Tool
if ChangeType == 'Part':
workorder = request.env['mrp.workorder'].sudo().search(
[('rfid_code', '=', RfidCode)], limit=1)
if not workorder:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该工单'}
return json.JSONEncoder().encode(res)
old_localtion = request.env['sf.shelf.location'].sudo().search(
[('barcode', '=', OldPosition)], limit=1)
new_localtion = request.env['sf.shelf.location'].sudo().search(
[('barcode', '=', NewPosition)], limit=1)
if not new_localtion:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
return json.JSONEncoder().encode(res)
if old_localtion:
old_localtion.location_status = '空闲'
old_localtion.production_id = False
new_localtion.location_status = '占用'
new_localtion.production_id = workorder.production_id.id
if ChangeType == 'Tool':
old_localtion = request.env['sf.shelf.location'].sudo().search(
[('barcode', '=', OldPosition)], limit=1)
equipment_id = request.env['maintenance.equipment'].sudo().search(
[('name', '=', NewPosition)], limit=1)
equipment_id.register_equipment_tool()
if not equipment_id:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
return json.JSONEncoder().encode(res)
if old_localtion:
old_localtion.location_status = '空闲'
old_localtion.production_id = False
# return json.JSONEncoder().encode(res)
# else:
# res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传RfidCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('LocationChange error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/AGVToProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def AGVToProduct(self, **kw):
"""
AGV运送上产线完成
:param kw:
:return:
"""
logging.info('AGVToProduct:%s' % kw)
try:
res = {'Succeed': True}
datas = request.httprequest.data
ret = json.loads(datas)
if 'DeviceId' in ret:
logging.info('DeviceId:%s' % ret['DeviceId'])
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
[('feeder_station_start_id.name', '=', ret['DeviceId']),
('status', '=', '待配送')], limit=1, order='id asc')
if workpiece_delivery:
for wd in workpiece_delivery:
logging.info('wd.production_id:%s' % wd.production_id.name)
if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线':
logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state)
wd.production_id.write({'production_line_state': '已上产线'})
wd.write({'production_line_state': '已上产线'})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该DeviceId没有对应的工件配送数据'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('AGVToProduct error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def AGVDownProduct(self, **kw):
"""
MES调度AGV搬运零件AGV托盘到产线接驳站。
生产线接受到零件AGV托盘到位信号后把生产合格或特采的零件机器人搬运零件到AGV接驳站中触发AGV运送下产线接口。
:param kw:
:return:
"""
logging.info('AGVDownProduct:%s' % kw)
try:
res = {'Succeed': True}
datas = request.httprequest.data
ret = json.loads(datas)
if 'DeviceId' in ret:
logging.info('DeviceId:%s' % ret['DeviceId'])
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
[('feeder_station_destination_id.name', '=', ret['DeviceId']),
('status', '=', '待配送')], limit=1, order='id asc')
if workpiece_delivery:
for wd in workpiece_delivery:
logging.info('wd.production_id:%s' % wd.production_id.name)
if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线':
logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state)
workpiece_delivery_off = request.env['sf.workpiece.delivery'].sudo().create({
'production_id': wd.production_id.id,
'feeder_station_start_id': workpiece_delivery.feeder_station_start_id.id,
'feeder_station_destination_id': '',
'workorder_id': workpiece_delivery.workorder_id.id,
'workpiece_code': workpiece_delivery.workpiece_code,
'production_line_id': workpiece_delivery.production_line_id.id,
'task_delivery_time': datetime.now(),
'production_line_state': '已下产线'
})
wd.production_id.write({'production_line_state': '已下产线'})
logging.info('开始向agv下发下产线任务')
workpiece_delivery_off._delivery_avg()
logging.info('agv下发下产线任务已配送')
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该DeviceId没有对应的工件配送数据'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('AGVDownProduct error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/EquipmentBaseCoordinate', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def PutEquipmentBaseCoordinate(self, **kw):
"""
获取机床基坐标
:param kw:
:return:
"""
logging.info('PutEquipmentBaseCoordinate:%s' % kw)
try:
res = {'Succeed': True}
datas = request.httprequest.data
ret = json.loads(datas)
if 'DeviceId' in ret:
equipment = request.env['maintenance.equipment'].sudo().search('name', '=', ret['DeviceId'])
if equipment:
equipment.sudo().write({
'base_coordinate_fixture_model_id': ret['base_coordinate_fixture_model_id'],
'base_coordinate_g_coordinate': ret['base_coordinate_g_coordinate'],
'base_coordinate_x': ret['base_coordinate_x'],
'base_coordinate_y': ret['base_coordinate_y'],
'base_coordinate_z': ret['base_coordinate_z'],
})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': 'DeviceId为%s的设备不存在!' % ret['DeviceId']}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('AGVDownProduct error:%s' % e)
return json.JSONEncoder().encode(res)

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
import logging
import json
from odoo import http
from odoo.http import request
class Workpiece(http.Controller):
@http.route('/agvApi/backfeed', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def backfeed(self, **kw):
"""
agv小车反馈工单(工件)结果
:param kw:
:return:
"""
logging.info('backfeed:%s' % kw)
try:
res = {'Succeed': True}
datas = request.httprequest.data
ret = json.loads(datas)
logging.info('backfeed-ret:%s' % ret)
if 'reqCode' in ret:
if 'method' in ret:
if ret['method'] == 'end':
workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(
[('production_id.name', '=', ret['reqCode']), ('agv_task_code'), '=', ret['taskCode']])
if workpiece_delivery:
workpiece_delivery.write({'status': '已配送', 'task_completion_time': ret['reqTime']})
else:
res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该reqCode暂未查到对应的工件配送记录'}
else:
res = {'Succeed': False, 'ErrorCode': 204, 'Error': '未传method字段'}
else:
res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传reqCode字段'}
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('backfeed error:%s' % e)
return json.JSONEncoder().encode(res)

View File

@@ -67,5 +67,21 @@
search="[('barcode','=','WH-PREPRODUCTION')]"/>
<field name="default_location_dest_id" ref="stock_location_locations_virtual_outcontract"/>
</record>
<record id="route_surface_technology_outsourcing" model="stock.route">
<field name="name">表面工艺外协</field>
<!-- <field name="company_id"></field>-->
<field name="active">True</field>
<field name="sequence">11</field>
</record>
<!-- <record id="route_surface_technology_outsourcing" model="stock.rule">-->
<!-- <field name="name">外协出库单</field>-->
<!-- <field name="action">push</field>-->
<!-- <field name="pick_type_id" ref="outcontract_picking_out"></field>-->
<!-- <field name="location_src_id" ref=""/>-->
<!-- <field name="location_dest_id" ref="stock_location_locations_virtual_outcontract"/>-->
<!-- <field name="active">True</field>-->
<!-- <field name="sequence">11</field>-->
<!-- </record>-->
</data>
</odoo>

View File

@@ -8,3 +8,4 @@ from . import mrp_routing_workcenter
from . import stock
from . import res_user
from . import production_line_base
from . import agv_setting

View File

@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
from odoo import fields, models
class AgvSetting(models.Model):
_name = 'sf.agv.site'
_description = 'agv站点'
number = fields.Integer('序号')
name = fields.Char('位置编号')
owning_region = fields.Char('所属区域')
state = fields.Selection([
('占用', '占用'),
('空闲', '空闲')], string='状态')
divide_the_work = fields.Char('主要分工')
class AgvTaskRoute(models.Model):
_name = 'sf.agv.task.route'
_description = 'agv任务路线'
name = fields.Char('名称')
type = fields.Selection([
('F01', '搬运'), ], string='类型', default="F01")
start_site_id = fields.Many2one('sf.agv.site', '起点接驳站位置编号')
end_site_id = fields.Many2one('sf.agv.site', '终点接驳站位置编号')
destination_production_line_id = fields.Many2one('sf.production.line', '目的生产线')
priority = fields.Selection([
('0', '正常'),
('1', ''),
('2', ''),
('3', ''),
('4', '紧急'),
], string='优先级', default='0')
active = fields.Boolean('有效', default=True)

View File

@@ -20,6 +20,8 @@ class MrpProduction(models.Model):
model_file = fields.Binary('模型文件', related='product_id.model_file')
schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排'), ('已完成', '已完成')],
string='排程状态', default='未排')
work_order_state = fields.Selection([('未排', '未排'), ('已排', '已排'), ('已完成', '已完成')],
string='工单状态', default='未排')
# state = fields.Selection(selection_add=[
# ('pending_scheduling', '待排程'),
@@ -52,7 +54,11 @@ class MrpProduction(models.Model):
glb_file = fields.Binary("glb模型文件")
production_line_id = fields.Many2one('sf.production.line', string='生产线')
plan_start_processing_time = fields.Datetime('计划开始加工时间')
production_line_state = fields.Selection(
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
string='上/下产线', default='待上产线')
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
@api.depends(
'move_raw_ids.state', 'move_raw_ids.quantity_done', 'move_finished_ids.state',
@@ -90,7 +96,11 @@ class MrpProduction(models.Model):
# 新添加的状态逻辑
if production.state == 'progress' and production.schedule_state == '已排':
production.state = 'pending_processing'
elif production.state == 'progress' and production.schedule_state == '已完成':
# elif production.state == 'progress' and production.schedule_state == '已完成':
# production.state = 'completed'
elif production.state == 'pending_processing' and production.work_order_state == '已完成':
production.state = 'completed'
elif production.state == 'progress' and production.work_order_state == '已完成':
production.state = 'completed'
def action_check(self):
@@ -125,6 +135,15 @@ class MrpProduction(models.Model):
# cnc程序获取
def fetchCNC(self):
cnc = self.env['mrp.production'].search([('id', '=', self.id)])
quick_order = self.env['quick.easy.order'].search(
[('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])])
programme_way = False
if cnc.manual_quotation is True:
programme_way = 'manual operation'
else:
programme_way = 'auto'
if quick_order:
programme_way = 'manual operation'
try:
res = {'model_code': '' if not cnc.product_id.model_code else cnc.product_id.model_code,
'production_no': cnc.name,
@@ -139,8 +158,9 @@ class MrpProduction(models.Model):
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width,
'order_no': cnc.origin,
'model_order_no': cnc.product_id.default_code.rsplit(' -', 1)[0],
'model_order_no': cnc.product_id.default_code,
'user': cnc.env.user.name,
'programme_way': programme_way,
'model_file': '' if not cnc.product_id.model_file else base64.b64encode(
cnc.product_id.model_file).decode('utf-8')
}

View File

@@ -22,10 +22,19 @@ class ResMrpRoutingWorkcenter(models.Model):
bom_id = fields.Many2one('mrp.bom', required=False)
surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺")
def generate_code(self):
return self.env['ir.sequence'].next_by_code('mrp.routing.workcenter')
def get_no(self):
international_standards = self.search(
[('code', '!=', ''), ('active', 'in', [True, False])],
limit=1,
order="id desc")
if not international_standards:
num = "%03d" % 1
else:
m = int(international_standards.code) + 1
num = "%03d" % m
return num
code = fields.Char('编码', default=generate_code)
code = fields.Char('编码', default=get_no)
# 获得当前登陆者公司
def get_company_id(self):

View File

@@ -1,9 +1,14 @@
import re
import logging
import base64
from datetime import datetime
import urllib.parse
from datetime import date
from datetime import datetime, timedelta
import requests
import os
import math
from lxml import etree
from dateutil.relativedelta import relativedelta
# import subprocess
from odoo import api, fields, models, SUPERUSER_ID, _
@@ -41,6 +46,8 @@ class ResMrpWorkOrder(models.Model):
], string="工序类型")
results = fields.Char('结果')
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
@api.onchange('users_ids')
def get_user_permissions(self):
uid = self.env.uid
@@ -96,9 +103,10 @@ class ResMrpWorkOrder(models.Model):
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], default='合格',
string="检测结果")
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工")
cnc_ids = fields.One2many("sf.cnc.processing", 'workorder_id', string="CNC加工程序")
cmm_ids = fields.One2many("sf.cmm.program", 'workorder_id', string="CMM程序")
tray_code = fields.Char(string="托盘编码")
glb_file = fields.Binary("glb模型文件")
glb_file = fields.Binary("glb模型文件", related='production_id.model_file')
is_subcontract = fields.Boolean(string='是否外协')
surface_technics_parameters_id = fields.Many2one('sf.production.process.parameter', string="表面工艺可选参数")
picking_in_id = fields.Many2one('stock.picking', string='外协入库单')
@@ -110,6 +118,19 @@ class ResMrpWorkOrder(models.Model):
processing_user_id = fields.Many2one('res.users', string='加工人')
# 检测人
inspection_user_id = fields.Many2one('res.users', string='检测人')
# 保存名称
save_name = fields.Char(string='检测文件保存名称', compute='_compute_save_name')
# 获取数据状态
data_state = fields.Boolean(string='获取数据状态', default=False)
@api.depends('production_id')
def _compute_save_name(self):
"""
保存名称
"""
for record in self:
record.save_name = record.production_id.name.replace('/', '_')
schedule_state = fields.Selection(related='production_id.schedule_state', store=True)
# 工件装夹信息
functional_fixture_code = fields.Char(string="功能夹具编码", readonly=True)
@@ -129,11 +150,37 @@ class ResMrpWorkOrder(models.Model):
total_wight = fields.Float(string="总重量")
maximum_carrying_weight = fields.Char(string="最大承载重量[kg]")
maximum_clamping_force = fields.Char(string="最大夹持力[n]")
production_line = fields.Char(string="生产线")
preset_program_information = fields.Char(string="预调程序信息")
workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'workorder_id', '工件配送')
is_delivery = fields.Boolean('是否配送完成', default=False)
rfid_code = fields.Char('RFID')
rfid_code = fields.Char('RFID')
rfid_code_old = fields.Char('RFID码(已解除)')
production_line_id = fields.Many2one('sf.production.line', related='production_id.production_line_id',
string='生产线', store=True)
production_line_state = fields.Selection(related='production_id.production_line_state',
string='上/下产线', store=True)
detection_report = fields.Binary('检测报告', readonly=True)
is_remanufacture = fields.Boolean(string='是否重新生成制造订单', default=True)
def get_plan_workorder(self, production_line):
tomorrow = (date.today() + timedelta(days=+1)).strftime("%Y-%m-%d")
tomorrow_start = tomorrow + ' 00:00:00'
tomorrow_end = tomorrow + ' 23:59:59'
logging.info('tomorrow:%s' % tomorrow)
sql = """
SELECT *
FROM mrp_workorder
WHERE
to_char(date_planned_start::timestamp + '8 hour','YYYY-MM-DD HH:mm:SS')>= %s
AND to_char(date_planned_finished::timestamp + '8 hour','YYYY-MM-DD HH:mm:SS')<= %s
"""
params = [tomorrow_start, tomorrow_end]
if production_line:
sql += "AND production_line_id = %s"
params.append(production_line)
self.env.cr.execute(sql, params)
ids = [t[0] for t in self.env.cr.fetchall()]
return [('id', 'in', ids)]
@api.onchange('is_ok')
def _onchange_inspection_user_id(self):
@@ -156,6 +203,149 @@ class ResMrpWorkOrder(models.Model):
[('surface_technics_parameters_id', '!=', False), ('production_id', '=', production_id)])
return process_parameter_workorder
# 获取三次元检测点数据
def get_three_check_datas(self):
factory_nick_name = 'XT'
ftp_resconfig = self.env['res.config.settings'].get_values()
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']),
ftp_resconfig['ftp_user'],
ftp_resconfig['ftp_password'])
# ftp.connect()
local_dir_path = '/ftp/before'
os.makedirs(local_dir_path, exist_ok=True)
local_filename = self.save_name + '.xls'
local_file_path = os.path.join(local_dir_path, local_filename)
logging.info('local_file_path:%s' % local_file_path)
remote_path = '/home/ftp/ftp_root/ThreeTest/XT/Before/' + local_filename
logging.info('remote_path:%s' % remote_path)
if not ftp.file_exists(remote_path):
raise UserError(f"文件不存在: {remote_path}")
with open(local_file_path, 'wb') as local_file:
ftp.ftp.retrbinary('RETR ' + remote_path, local_file.write)
logging.info('下载文件成功')
# 解析本地文件
# file_path = 'WH_MO_00099.xls' # 使用下载的实际文件路径
parser = etree.XMLParser(recover=True) # Using recover to handle errors
tree = etree.parse(local_file_path, parser)
logging.info('tree:%s' % tree)
root = tree.getroot()
logging.info('root:%s' % root)
# 准备一个外部字典来存储以PT为键的坐标字典
pt_coordinates = {}
# 遍历每个工作表和行
for worksheet in root.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Worksheet'):
sheet_name = worksheet.attrib.get('{urn:schemas-microsoft-com:office:spreadsheet}Name')
logging.info('sheet_name:%s' % sheet_name)
if sheet_name == "Sheet1": # 确保我们只查看包含数据的工作表
current_pt = None
for row in worksheet.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Row'):
cells = list(row.iterfind('.//{urn:schemas-microsoft-com:office:spreadsheet}Cell'))
for i, cell in enumerate(cells):
data_cell = cell.find('.//{urn:schemas-microsoft-com:office:spreadsheet}Data')
if data_cell is not None and data_cell.text is not None: # 添加检查以确保data_cell.text不为空
# 检查是否是PT标识
logging.info(f"Data in cell: {data_cell.text}") # 输出单元格数据
if "PT" in data_cell.text:
current_pt = data_cell.text
pt_coordinates[current_pt] = []
elif data_cell.text in ["X", "Y", "Z"] and current_pt is not None:
# 确保当前单元格后面还有单元格存在,以获取理论值
if i + 1 < len(cells):
next_cell = cells[i + 1]
theory_value = next_cell.find(
'.//{urn:schemas-microsoft-com:office:spreadsheet}Data')
if theory_value is not None:
# 为当前PT键添加坐标数据
pt_coordinates[current_pt].append({
data_cell.text: float(theory_value.text)
})
logging.info(f"PT: {current_pt} - {data_cell.text}: {theory_value.text}")
logging.info('pt_coordinates=====%s' % pt_coordinates)
# pt_coordinates:{'PT1': [{'X': 38.9221}, {'Y': -18.7304}, {'Z': 128.0783}],
# 'PT2': [{'X': 39.2456}, {'Y': -76.9169}, {'Z': 123.7541}]}
# 检查是否存在PT1等键
if 'PT1' in pt_coordinates and pt_coordinates['PT1']:
self.X1_axis = pt_coordinates['PT3'][0]['X']
self.Y1_axis = pt_coordinates['PT3'][1]['Y']
self.Z1_axis = pt_coordinates['PT3'][2]['Z']
else:
raise UserError('PT1点未测或数据错误')
if 'PT2' in pt_coordinates and pt_coordinates['PT2']:
self.X2_axis = pt_coordinates['PT4'][0]['X']
self.Y2_axis = pt_coordinates['PT4'][1]['Y']
self.Z2_axis = pt_coordinates['PT4'][2]['Z']
else:
raise UserError('PT2点未测或数据错误')
if 'PT3' in pt_coordinates and pt_coordinates['PT3']:
self.X3_axis = pt_coordinates['PT5'][0]['X']
self.Y3_axis = pt_coordinates['PT5'][1]['Y']
self.Z3_axis = pt_coordinates['PT5'][2]['Z']
else:
raise UserError('PT3点未测或数据错误')
if 'PT4' in pt_coordinates and pt_coordinates['PT4']:
self.X4_axis = pt_coordinates['PT6'][0]['X']
self.Y4_axis = pt_coordinates['PT6'][1]['Y']
self.Z4_axis = pt_coordinates['PT6'][2]['Z']
else:
raise UserError('PT4点未测或数据错误')
if 'PT5' in pt_coordinates and pt_coordinates['PT5']:
self.X5_axis = pt_coordinates['PT7'][0]['X']
self.Y5_axis = pt_coordinates['PT7'][1]['Y']
self.Z5_axis = pt_coordinates['PT7'][2]['Z']
else:
raise UserError('PT5点未测或数据错误')
if 'PT6' in pt_coordinates and pt_coordinates['PT6']:
self.X6_axis = pt_coordinates['PT8'][0]['X']
self.Y6_axis = pt_coordinates['PT8'][1]['Y']
self.Z6_axis = pt_coordinates['PT8'][2]['Z']
else:
raise UserError('PT6点未测或数据错误')
if 'PT7' in pt_coordinates and pt_coordinates['PT7']:
self.X7_axis = pt_coordinates['PT9'][0]['X']
self.Y7_axis = pt_coordinates['PT9'][1]['Y']
self.Z7_axis = pt_coordinates['PT9'][2]['Z']
else:
raise UserError('PT7点未测或数据错误')
if 'PT8' in pt_coordinates and pt_coordinates['PT8']:
self.X8_axis = pt_coordinates['PT10'][0]['X']
self.Y8_axis = pt_coordinates['PT10'][1]['Y']
self.Z8_axis = pt_coordinates['PT10'][2]['Z']
else:
raise UserError('PT8点未测或数据错误')
if 'PT9' in pt_coordinates and pt_coordinates['PT9']:
self.X9_axis = pt_coordinates['PT1'][0]['X']
self.Y9_axis = pt_coordinates['PT1'][1]['Y']
self.Z9_axis = pt_coordinates['PT1'][2]['Z']
else:
raise UserError('PT9点未测或数据错误')
if 'PT10' in pt_coordinates and pt_coordinates['PT10']:
self.X10_axis = pt_coordinates['PT2'][0]['X']
self.Y10_axis = pt_coordinates['PT2'][1]['Y']
self.Z10_axis = pt_coordinates['PT2'][2]['Z']
else:
raise UserError('PT10点未测或数据错误')
self.data_state = True
return True
# ftp.download_file('three_check_datas.xls', '/home/ftpuser/three_check_datas.xls')
# ftp.close()
# data = xlrd.open_workbook('/home/ftpuser/three_check_datas.xls')
# table = data.sheets()[0]
# nrows = table.nrows
# # 点坐标列表
# point_list = []
# datas = []
# for i in range(1, nrows):
# datas.append(table.row_values(i))
# return datas
# 计算配料中心点和与x轴倾斜度方法
def getcenter(self):
try:
@@ -176,6 +366,7 @@ class ResMrpWorkOrder(models.Model):
y7 = self.Y7_axis
y8 = self.Y8_axis
z1 = self.Z9_axis
z2 = self.Z10_axis
x0 = ((x3 - x4) * (x2 * y1 - x1 * y2) - (x1 - x2) * (x4 * y3 - x3 * y4)) / (
(x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4))
y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / (
@@ -186,7 +377,7 @@ class ResMrpWorkOrder(models.Model):
(y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8))
x = (x0 + x1) / 2
y = (y0 + y1) / 2
z = z1 / 2
z = (z1 + z2) / 2
jd = math.atan2((x5 - x6), (y5 - y6))
jdz = jd * 180 / math.pi
@@ -199,18 +390,31 @@ class ResMrpWorkOrder(models.Model):
work.compensation_value_x = eval(self.material_center_point)[0]
work.compensation_value_y = eval(self.material_center_point)[1]
workorder.button_finish()
except:
raise UserError("参数计算有误")
except Exception as e:
# 重新抛出捕获到的异常信息
raise UserError(str(e))
def button_workpiece_delivery(self):
if self.routing_type == '装夹预调':
for item in self.workpiece_delivery_ids:
if not item.feeder_station_start:
raise UserError('【工件配送】明细中请输入起点接驳站')
if not item.route_id:
raise UserError('【工件配送】明细中请选择【任务路线】')
# if not item.workpiece_code:
# raise UserError('请对【同运工件】进行扫描')
else:
item.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'})
if self.cnc_program_down_state == '已下发':
if item.status == '待下发':
return {
'name': _('确认'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sf.workpiece.delivery.wizard',
'target': 'new',
'context': {
'default_workorder_id': self.id,
}}
else:
raise UserError(_("该制造订单还未下发CNC程序单无法进行工件配送"))
# 拼接工单对象属性值
def json_workorder_str(self, k, production, route):
@@ -448,47 +652,6 @@ class ResMrpWorkOrder(models.Model):
else:
self.results = '合格'
# cnc程序获取
def fetchCNC(self):
try:
cnc = self.env['mrp.workorder'].search(
[('routing_type', '=', 'CNC加工'), ('production_id', '=', self.production_id.id)], limit=1)
res = {'model_code': '' if not cnc.product_id.model_code else cnc.product_id.model_code,
'production_no': self.production_id.name,
'machine_tool_code': cnc.workcenter_id.equipment_id.code,
'material_code': cnc.env['sf.production.materials'].search(
[('id', '=', cnc.product_id.materials_id.id)]).materials_no,
'material_type_code': cnc.env['sf.materials.model'].search(
[('id', '=', cnc.product_id.materials_type_id.id)]).materials_no,
'machining_processing_panel': cnc.product_id.model_processing_panel,
'machining_precision': cnc.product_id.model_machining_precision,
'embryo_long': cnc.product_id.bom_ids.bom_line_ids.product_id.length,
'embryo_height': cnc.product_id.bom_ids.bom_line_ids.product_id.height,
'embryo_width': cnc.product_id.bom_ids.bom_line_ids.product_id.width,
'order_no': cnc.production_id.origin,
'model_order_no': cnc.product_id.default_code.rsplit(' -', 1)[0],
'user': self.env.user.name,
'model_file': '' if not cnc.product_id.model_file else base64.b64encode(
cnc.product_id.model_file).decode('utf-8')
}
logging.info('res:%s' % res)
configsettings = self.env['res.config.settings'].get_values()
config_header = Common.get_headers(self, configsettings['token'], configsettings['sf_secret_key'])
url = '/api/intelligent_programming/create'
config_url = configsettings['sf_url'] + url
# res_str = json.dumps(res)
ret = requests.post(config_url, json={}, data=res, headers=config_header)
ret = ret.json()
logging.info('fetchCNC-ret:%s' % ret)
if ret['status'] == 1:
self.write(
{'programming_no': ret['programming_no'], 'programming_state': '编程中', 'work_state': '编程中'})
else:
raise UserError(ret['message'])
except Exception as e:
logging.info('fetchCNC error:%s' % e)
raise UserError("cnc程序获取编程单失败,请联系管理员")
def json_workorder_str1(self, k, production, route):
workorders_values_str = [0, '', {
'product_uom_id': production.product_uom_id.id,
@@ -520,6 +683,12 @@ class ResMrpWorkOrder(models.Model):
picking_out.write({'state': 'assigned'})
if self.state == 'waiting' or self.state == 'ready' or self.state == 'progress':
self.move_raw_ids = self.production_id.move_raw_ids
self.move_raw_ids[0].write({
'materiel_length': self.move_raw_ids[0].product_id.length,
'materiel_width': self.move_raw_ids[0].product_id.width,
'materiel_height': self.move_raw_ids[0].product_id.height
})
self.ensure_one()
if any(not time.date_end for time in self.time_ids.filtered(lambda t: t.user_id.id == self.env.user.id)):
return True
@@ -570,6 +739,8 @@ class ResMrpWorkOrder(models.Model):
if self.routing_type == '装夹预调':
if not self.material_center_point and self.X_deviation_angle > 0:
raise UserError("请对前置三元检测定位参数进行计算定位")
if not self.rfid_code:
raise UserError("请扫RFID码进行绑定")
if self.picking_out_id:
picking_out = self.env['stock.picking'].search([('id', '=', self.picking_out_id.id)])
if picking_out.workorder_out_id:
@@ -598,16 +769,56 @@ class ResMrpWorkOrder(models.Model):
if workorder.state != 'done':
is_production_id = False
if is_production_id == True and self.name == '解除装夹':
for workorder in self.production_id.workorder_ids:
workorder.rfid_code_old = workorder.rfid_code
workorder.rfid_code = None
for move_raw_id in self.production_id.move_raw_ids:
move_raw_id.quantity_done = move_raw_id.product_uom_qty
self.production_id.button_mark_done1()
# self.production_id.state = 'done'
# 将FTP的检测报告文件下载到临时目录
def download_reportfile_tmp(self, workorder, reportpath):
logging.info('reportpath:%s' % reportpath)
production_no_ftp = reportpath.split('/')
production_no = workorder.production_id.name.replace('/', '_')
# ftp地址
remotepath = os.path.join('/NC', production_no_ftp[1], 'detection')
logging.info('ftp地址:%s' % remotepath)
if reportpath.find(production_no) != -1:
# 服务器内临时地址
serverdir = os.path.join('/tmp', production_no_ftp[1], 'detection')
ftp_resconfig = self.env['res.config.settings'].get_values()
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']),
ftp_resconfig['ftp_user'],
ftp_resconfig['ftp_password'])
download_state = ftp.download_reportfile_tree(remotepath, serverdir, reportpath)
logging.info('download_state:%s' % download_state)
else:
download_state = 2
return download_state
# 根据中控系统提供的检测文件地址去ftp里对应的制造订单里获取
def get_detection_file(self, workorder, reportPath):
if reportPath.startswith('/'):
reportPath = reportPath[1:]
serverdir = os.path.join('/tmp', reportPath)
logging.info('get_detection_file-serverdir:%s' % serverdir)
serverdir_prefix = os.path.dirname(serverdir)
for root, dirs, files in os.walk(serverdir_prefix):
for filename in files:
if filename == os.path.basename(reportPath):
report_file_path = os.path.join(root, filename)
logging.info('get_detection_file-report_file_path:%s' % report_file_path)
workorder.detection_report = base64.b64encode(open(report_file_path, 'rb').read())
return True
class CNCprocessing(models.Model):
_name = 'sf.cnc.processing'
_description = "CNC加工"
_rec_name = 'program_name'
_order = 'sequence_number,id'
cnc_id = fields.Many2one('ir.attachment')
sequence_number = fields.Char('序号')
@@ -626,57 +837,55 @@ class CNCprocessing(models.Model):
workorder_id = fields.Many2one('mrp.workorder', string="工单")
production_id = fields.Many2one('mrp.production', string="制造订单")
button_state = fields.Boolean(string='是否已经下发')
program_path = fields.Char('程序文件路径')
# mrs下发编程单创建CNC加工
def cnc_processing_create(self, cnc_workorder, ret):
logging.info('ret:%s' % ret)
def cnc_processing_create(self, cnc_workorder, ret, program_path, program_path_tmp):
for obj in ret['programming_list']:
workorder = self.env['mrp.workorder'].search([('production_id.name', '=', ret['production_order_no']),
('processing_panel', '=', obj['processing_panel']),
('routing_type', '=', 'CNC加工')])
logging.info('workorder:%s' % workorder)
logging.info('obj:%s' % obj)
cnc_processing = self.env['sf.cnc.processing'].create({
'workorder_id': workorder.id,
'sequence_number': obj['sequence_number'],
'program_name': obj['program_name'],
'cutting_tool_name': obj['cutting_tool_name'],
'cutting_tool_no': obj['cutting_tool_no'],
'processing_type': obj['processing_type'],
'margin_x_y': obj['margin_x_y'],
'margin_z': obj['margin_z'],
'depth_of_processing_z': obj['depth_of_processing_z'],
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
'estimated_processing_time': obj['estimated_processing_time'],
'remark': obj['remark']
})
cnc_processing.get_cnc_processing_file(ret['folder_name'], cnc_processing, workorder.processing_panel)
logging.info('workorder:%s' % workorder.id)
if obj['program_name'] in program_path:
logging.info('obj:%s' % obj['program_name'])
cnc_processing = self.env['sf.cnc.processing'].create({
'workorder_id': workorder.id,
'sequence_number': obj['sequence_number'],
'program_name': obj['program_name'],
'cutting_tool_name': obj['cutting_tool_name'],
'cutting_tool_no': obj['cutting_tool_no'],
'processing_type': obj['processing_type'],
'margin_x_y': obj['margin_x_y'],
'margin_z': obj['margin_z'],
'depth_of_processing_z': obj['depth_of_processing_z'],
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
'estimated_processing_time': obj['estimated_processing_time'],
'remark': obj['remark'],
'program_path': program_path.replace('/tmp', '/home/ftp/ftp_root/NC')
})
cnc_processing.get_cnc_processing_file(program_path_tmp, cnc_processing, program_path)
# cnc_workorder.state = 'done'
cnc_workorder.work_state = '已编程'
cnc_workorder.programming_state = '已编程'
# cnc_workorder.time_ids.date_end = datetime.now()
# cnc_workorder.button_finish()
# 根据程序名和加工面匹配到ftp里对应的Nc程序名
def get_cnc_processing_file(self, folder_name, cnc_processing, processing_panel):
logging.info('folder_name:%s' % folder_name)
serverdir = os.path.join('/tmp', folder_name, 'return', processing_panel)
# 根据程序名和加工面匹配到ftp里对应的Nc程序名,可优化为根据cnc_processing.program_path进行匹配
def get_cnc_processing_file(self, serverdir, cnc_processing, program_path):
logging.info('serverdir:%s' % serverdir)
for root, dirs, files in os.walk(serverdir):
for f in files:
logging.info('f:%s' % f)
if os.path.splitext(f)[1] == ".pdf":
full_path = os.path.join(serverdir, root, f)
logging.info('pdf:%s' % full_path)
if full_path is not False:
if not cnc_processing.workorder_id.cnc_worksheet:
cnc_processing.workorder_id.cnc_worksheet = base64.b64encode(
open(full_path, 'rb').read())
else:
if cnc_processing.program_name == f.split('.')[0]:
if f in program_path:
# if cnc_processing.program_name == f.split('.')[0]:
cnc_file_path = os.path.join(serverdir, root, f)
logging.info('cnc_file_path:%s' % cnc_file_path)
self.write_file(cnc_file_path, cnc_processing)
# 创建附件(nc文件)
@@ -692,8 +901,8 @@ class CNCprocessing(models.Model):
# 将FTP的nc文件下载到临时目录
def download_file_tmp(self, production_no, processing_panel):
remotepath = os.path.join('/', production_no, 'return', processing_panel)
serverdir = os.path.join('/tmp', production_no, 'return', processing_panel)
remotepath = os.path.join('/NC', production_no, 'return', processing_panel)
serverdir = os.pat.join('/tmp', production_no, 'return', processing_panel)
ftp_resconfig = self.env['res.config.settings'].get_values()
ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']), ftp_resconfig['ftp_user'],
ftp_resconfig['ftp_password'])
@@ -703,10 +912,12 @@ class CNCprocessing(models.Model):
# 将nc文件存到attach的datas里
def write_file(self, nc_file_path, cnc):
nc_file_name = nc_file_path.split('/')
logging.info('file_name:%s' % nc_file_name[-1])
if os.path.exists(nc_file_path):
with open(nc_file_path, 'rb') as file:
data_bytes = file.read()
attachment = self.attachment_create(cnc.program_name + '.NC', data_bytes)
attachment = self.attachment_create(cnc.program_name + nc_file_name[-1], data_bytes)
cnc.write({'cnc_id': attachment.id})
file.close()
else:
@@ -743,25 +954,35 @@ class SfWorkOrderBarcodes(models.Model):
workorder = self.env['mrp.workorder'].browse(self.ids)
# workorder = self.env['mrp.workorder'].search(
# [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)])
workorder_old = self.env['mrp.workorder'].search([('rfid_code', '=', barcode)])
if workorder_old:
raise UserError('该托盘已绑定工件,请先解除绑定!!!')
if workorder:
if workorder.routing_type == '装夹预调':
stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
if stock_move_line.product_id.categ_type == '夹具':
workorder.write({
'tray_serial_number': stock_move_line.lot_name,
'tray_product_id': stock_move_line.product_id.id,
'tray_brand_id': stock_move_line.product_id.brand_id.id,
'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
'tray_model_id': stock_move_line.product_id.fixture_model_id.id
})
workorder.button_start()
# return {
# 'type': 'ir.actions.act_window',
# 'res_model': 'mrp.workorder',
# 'view_mode': 'form',
# 'domain': [('id', 'in', workorder.id)],
# 'target': 'current'
# }
if workorder.state in ['done']:
work_state = {'done': '已完工'}
raise UserError('装夹%s,请勿重复扫码' % work_state.get(workorder.state))
lots = self.env['stock.lot'].sudo().search([('rfid', '=', barcode)])
logging.info("托盘信息:%s" % lots)
if lots:
for lot in lots:
if lot.product_id.categ_type == '夹具':
val = {
'tray_serial_number': lot.name,
'tray_product_id': lot.product_id.id,
'tray_brand_id': lot.product_id.brand_id.id,
'tray_type_id': lot.product_id.fixture_material_id.id,
'tray_model_id': lot.product_id.fixture_model_id.id,
'rfid_code': barcode
}
workorder.write(val)
self.write(val)
workorder_rfid = self.env['mrp.workorder'].search(
[('production_id', '=', workorder.production_id.id)])
if workorder_rfid:
for item in workorder_rfid:
item.write({'rfid_code': barcode})
logging.info("Rfid绑定成功")
else:
embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
if embryo_stock_lot:
@@ -788,6 +1009,63 @@ class SfWorkOrderBarcodes(models.Model):
workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
else:
raise UserError('工件生产线不一致,请重新确认')
else:
workorder_rfid = self.env['mrp.workorder'].search(
[('production_id', '=', workorder.production_id.id)])
if workorder_rfid:
for item in workorder_rfid:
if item.state == "progress":
item.write({'rfid_code': barcode})
raise UserError('该托盘信息不存在!!!')
# stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)])
# if stock_move_line.product_id.categ_type == '夹具':
# workorder.write({
# 'tray_serial_number': stock_move_line.lot_name,
# 'tray_product_id': stock_move_line.product_id.id,
# 'tray_brand_id': stock_move_line.product_id.brand_id.id,
# 'tray_type_id': stock_move_line.product_id.fixture_material_id.id,
# 'tray_model_id': stock_move_line.product_id.fixture_model_id.id
# })
# workorder.button_start()
# # return {
# # 'type': 'ir.actions.act_window',
# # 'res_model': 'mrp.workorder',
# # 'view_mode': 'form',
# # 'domain': [('id', 'in', workorder.id)],
# # 'target': 'current'
# # }
# else:
# embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)])
# if embryo_stock_lot:
# embryo_stock_move_line = self.env['stock.move.line'].search(
# [('product_id', '=', embryo_stock_lot.product_id.id),
# ('reference', '=', workorder.production_id.name),
# ('lot_id', '=', embryo_stock_lot.id),
# ('product_category_name', '=', '坯料')])
# if embryo_stock_move_line:
# bom_production = self.env['mrp.production'].search(
# [('product_id', '=', embryo_stock_lot.product_id.id),
# ('origin', '=', workorder.production_id.name)], limit=1, order='id asc')
# workpiece_delivery = self.env['sf.workpiece.delivery'].search(
# [('workorder_id', '=', workorder.id)], limit=1, order='id asc')
# if workpiece_delivery:
# embryo_workpiece_code = workpiece_delivery.workpiece_code
# if bom_production:
# if workpiece_delivery.workpiece_code and bom_production.name not in \
# workpiece_delivery.workpiece_code:
# embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \
# bom_production.name
# if not workpiece_delivery.workpiece_code:
# embryo_workpiece_code = bom_production.name
# workpiece_delivery.write({'workpiece_code': embryo_workpiece_code})
# else:
# raise UserError('工件生产线不一致,请重新确认')
# else:
# workorder_rfid = self.env['mrp.workorder'].search(
# [('production_id', '=', workorder.production_id.id)])
# if workorder_rfid:
# for item in workorder_rfid:
# item.write({'rfid_code': barcode})
class WorkPieceDelivery(models.Model):
@@ -801,35 +1079,88 @@ class WorkPieceDelivery(models.Model):
store=True)
plan_start_processing_time = fields.Datetime('计划开始加工时间', readonly=True)
workpiece_code = fields.Char('同运工件编码')
feeder_station_start = fields.Char('起点接驳站')
feeder_station_destination = fields.Char('目的接驳站')
route_id = fields.Many2one('sf.agv.task.route', '任务路线')
feeder_station_start_id = fields.Many2one('sf.agv.site', '起点接驳站')
feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站')
task_delivery_time = fields.Datetime('任务下发时间')
task_completion_time = fields.Datetime('任务完成时间')
delivery_duration = fields.Float('配送时长', compute='_compute_delivery_duration')
status = fields.Selection(
[('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态',
default='待下发')
production_line_state = fields.Selection(
[('待上产线', '待上产线'), ('已上产线', '已上产线'), ('已下产线', '已下产线')],
string='上/下产线', default='待上产线')
cnc_program_down_state = fields.Selection([('待下发', '待下发'), ('已下发', '已下发')],
string='CNC程序下发状态', default='待下发')
agv_task_code = fields.Char('agv任务单号')
@api.onchange('route_id')
def onchage_route(self):
if self.route_id:
self.feeder_station_start_id = self.route_id.start_site_id
self.feeder_station_destination_id = self.route_id.end_site_id
# 工件配送
def button_delivery(self):
if self.status == '待下发':
return {
'name': _('确认'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sf.workpiece.delivery.wizard',
'target': 'new',
'context': {
'default_delivery_id': self.id,
}}
if self.cnc_program_down_state == '待下发':
if self.route_id:
if self.status == '待下发':
return {
'name': _('确认'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'sf.workpiece.delivery.wizard',
'target': 'new',
'context': {
'default_delivery_id': self.id,
}}
else:
raise UserError('状态为【待下发】的工件记录可进行配送')
else:
raise UserError('请选择任务路线再进行配送')
else:
raise UserError('状态为【待下发】的工件记录可进行配送')
raise UserError(_("该制造订单还未下发CNC程序单,无法进行工件配送"))
# 配送至avg小车
def _delivery_avg(self):
self.write({'task_delivery_time': fields.Datetime.now(), 'status': '待配送'})
config = self.env['res.config.settings'].get_values()
positionCode_Arr = []
if self.feeder_station_start_id:
positionCode_Arr.append({
'positionCode': self.feeder_station_start_id.name,
'code': '00'
})
if self.feeder_station_destination_id:
positionCode_Arr.append({
'positionCode': self.feeder_station_destination_id.name,
'code': '00'
})
res = {'reqCode': self.production_id.name, 'reqTime': '', 'clientCode': '', 'tokenCode': '',
'taskTyp': 'F01', 'ctnrTyp': '', 'ctnrCode': '', 'wbCode': config['wbcode'],
'positionCodePath': positionCode_Arr,
'podCode': '',
'podDir': '', 'materialLot': '', 'priority': '', 'taskCode': '', 'agvCode': '', 'materialLot': '',
'data': ''}
try:
config['agv_rcs_url'] = 'http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask'
logging.info('AGV请求路径:%s' % config['agv_rcs_url'])
logging.info('AGV-json:%s' % res)
headers = {'Content-Type': 'application/json'}
ret = requests.post((config['agv_rcs_url']), json=res, headers=headers)
ret = ret.json()
logging.info('config-ret:%s' % ret)
if ret['code'] == 0:
if self.production_id.name == ret['reqCode']:
self.write(
{'task_delivery_time': fields.Datetime.now(), 'status': '待配送', 'agv_task_code': ret['data']})
else:
raise UserError(ret['message'])
except Exception as e:
logging.info('config-e:%s' % e)
raise UserError("工件配送请求agv失败")
@api.depends('production_id.production_line_id')
@api.onchange('production_id.production_line_id')
def _compute_production_line_id(self):
if self.production_id.production_line_id:
self.production_line_id = self.production_id.production_line_id.id
@@ -843,3 +1174,83 @@ class WorkPieceDelivery(models.Model):
(obj.task_completion_time - obj.task_delivery_time).total_seconds() / 60.0, 2)
else:
obj.delivery_duration = 0.0
class CMMprogram(models.Model):
_name = 'sf.cmm.program'
_description = "CMM程序"
cmm_id = fields.Many2one('ir.attachment')
sequence_number = fields.Integer('序号')
program_name = fields.Char('程序名')
cutting_tool_name = fields.Char('刀具名称')
cutting_tool_no = fields.Char('刀号')
processing_type = fields.Char('加工类型')
margin_x_y = fields.Char('余量_X/Y')
margin_z = fields.Char('余量_Z')
depth_of_processing_z = fields.Char('加工深度(Z)')
cutting_tool_extension_length = fields.Char('刀具伸出长度')
cutting_tool_handle_type = fields.Char('刀柄型号')
estimated_processing_time = fields.Char('预计加工时间')
remark = fields.Text('备注')
workorder_id = fields.Many2one('mrp.workorder', string="工单")
production_id = fields.Many2one('mrp.production', string="制造订单")
program_path = fields.Char('程序文件路径')
def cmm_program_create(self, ret, program_path, program_path_tmp):
for obj in ret['programming_list']:
workorder = self.env['mrp.workorder'].search([('production_id.name', '=', ret['production_order_no']),
('processing_panel', '=', obj['processing_panel']),
('routing_type', '=', 'CNC加工')])
if obj['program_name'] in program_path:
logging.info('obj:%s' % obj['program_name'])
cmm_program = self.sudo().create({
'workorder_id': workorder.id,
'sequence_number': obj['sequence_number'],
'program_name': obj['program_name'],
'cutting_tool_name': obj['cutting_tool_name'],
'cutting_tool_no': obj['cutting_tool_no'],
'processing_type': obj['processing_type'],
'margin_x_y': obj['margin_x_y'],
'margin_z': obj['margin_z'],
'depth_of_processing_z': obj['depth_of_processing_z'],
'cutting_tool_extension_length': obj['cutting_tool_extension_length'],
'cutting_tool_handle_type': obj['cutting_tool_handle_type'],
'estimated_processing_time': obj['estimated_processing_time'],
'remark': obj['remark'],
'program_path': program_path.replace('/tmp', '')
})
cmm_program.get_cmm_program_file(program_path_tmp, cmm_program, program_path)
# 根据程序名和加工面匹配到ftp里对应的cmm程序名
def get_cmm_program_file(self, serverdir, cmm_program, program_path):
logging.info('cmm-serverdir:%s' % serverdir)
for root, dirs, files in os.walk(serverdir):
for f in files:
if f in program_path:
cmm_program_file_path = os.path.join(serverdir, root, f)
self.write_file_cmm(cmm_program_file_path, cmm_program)
# 创建附件(nc文件)
def attachment_create(self, name, data):
attachment = self.env['ir.attachment'].create({
'datas': base64.b64encode(data),
'type': 'binary',
'public': True,
'description': '程序文件',
'name': name
})
return attachment
# 将cmm文件存到attach的datas里
def write_file_cmm(self, cmm_file_path, cnc):
cmm_file_name = cmm_file_path.split('/')
logging.info('cmm_file_name:%s' % cmm_file_name[-1])
if os.path.exists(cmm_file_path):
with open(cmm_file_path, 'rb') as file:
data_bytes = file.read()
attachment = self.attachment_create(cnc.program_name + cmm_file_name[-1], data_bytes)
cnc.write({'cmm_id': attachment.id})
file.close()
else:
return False

View File

@@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
import logging
import requests
import base64
import hashlib
import os
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.modules import get_resource_path
from OCC.Extend.DataExchange import read_step_file
from OCC.Extend.DataExchange import write_stl_file
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
class ResProductMo(models.Model):
@@ -39,7 +40,8 @@ class ResProductMo(models.Model):
product_model_type_id = fields.Many2one('sf.model.type', string='产品模型类型')
embryo_model_type_id = fields.Many2one('sf.model.type', string='坯料模型类型')
materials_id = fields.Many2one('sf.production.materials', string='材料')
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号')
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号',
domain="[('materials_id', '=', materials_id)]")
server_product_process_parameters_id = fields.Many2one('sf.production.process.parameter',
string='表面工艺参数(服务产品)')
model_process_parameters_ids = fields.Many2many('sf.production.process.parameter', 'process_parameter_rel',
@@ -68,7 +70,8 @@ class ResProductMo(models.Model):
cutting_tool_shank_length = fields.Float('柄部长度(mm)', digits=(6, 1))
cutting_tool_blade_length = fields.Float('刃部长度(mm)')
cutting_tool_blade_number = fields.Selection(
[('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], '刃数(个)')
[('0', '0'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
string='刃数(个)', default='0')
# 整体式刀具新增字段
cutting_tool_neck_length = fields.Float('颈部长度(mm)', digits=(6, 1))
cutting_tool_neck_diameter = fields.Float('颈部直径(mm)', digits=(6, 1))
@@ -101,6 +104,13 @@ class ResProductMo(models.Model):
compaction_way_id = fields.Many2one('maintenance.equipment.image',
'压紧方式', domain=[('type', '=', '压紧方式')])
@api.onchange('cutting_tool_model_id')
def _onchange_cutting_tool_model_id(self):
for item in self:
if item:
item.specification_id = False
item.cutting_tool_chuck_id = item.cutting_tool_model_id.chuck_id
@api.onchange('cutting_tool_material_id')
def _onchange_cutting_tool_material_id(self):
for item in self:
@@ -190,20 +200,24 @@ class ResProductMo(models.Model):
self.cutting_tool_blade_number = self.specification_id.blade_number
self.cutting_tool_blade_type = self.cutting_tool_model_id.blade_type
self.cutting_tool_shank_diameter = self.specification_id.handle_diameter
self.cutting_tool_shank_length = self.specification_id.handle_length
self.cutting_tool_neck_length = self.specification_id.neck_length
self.cutting_tool_neck_diameter = self.specification_id.neck_diameter
self.cutting_tool_blade_tip_diameter = self.specification_id.blade_tip_diameter
self.cutting_tool_blade_tip_taper = self.specification_id.blade_tip_taper
self.cutting_tool_blade_helix_angle = self.specification_id.blade_helix_angle
self.cutting_tool_blade_tip_working_size = self.specification_id.blade_tip_working_size
self.cutting_tool_pitch = self.specification_id.pitch
self.cutting_tool_blade_width = self.specification_id.blade_width
self.cutting_tool_blade_depth = self.specification_id.blade_depth
self.cutting_tool_cut_depth = self.specification_id.cutting_depth
self.cutting_tool_cut_depth_max = self.specification_id.cut_depth_max
self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids
self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids.filtered(
lambda r: int(r.blade_diameter) == int(self.specification_id.blade_diameter))
elif self.cutting_tool_type == '夹头':
self.cutting_tool_clamping_diameter_min = self.specification_id.min_clamping_diameter
self.cutting_tool_clamping_diameter_min = self.specification_id.max_clamping_diameter
self.cutting_tool_clamping_way = self.specification_id.clamping_mode
self.cutting_tool_clamping_diameter_max = self.specification_id.max_clamping_diameter
self.cutting_tool_taper = self.specification_id.taper
self.cutting_tool_top_diameter = self.specification_id.top_diameter
self.cutting_tool_outer_diameter = self.specification_id.outer_diameter
self.cutting_tool_inner_diameter = self.specification_id.inner_diameter
@@ -241,6 +255,7 @@ class ResProductMo(models.Model):
self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids
self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids
elif self.cutting_tool_type in ('刀盘', '刀杆'):
self.cutting_tool_blade_diameter = self.specification_id.blade_diameter
self.cutting_tool_total_length = self.specification_id.total_length
self.tool_length = self.specification_id.length
self.tool_thickness = self.specification_id.thickness
@@ -271,14 +286,19 @@ class ResProductMo(models.Model):
self.cutting_tool_cutter_head_diameter = self.specification_id.cutter_head_diameter
self.cutting_tool_interface_diameter = self.specification_id.interface_diameter
else:
self.cutting_tool_cutter_arbor_diameter = self.specification_id.cutter_arbor_diameter
self.cutting_tool_knife_head_height = self.specification_id.knife_head_height
self.cutting_tool_knife_head_width = self.specification_id.knife_head_width
self.cutting_tool_knife_head_length = self.specification_id.knife_head_length
self.cutting_tool_tool_shim = self.specification_id.tool_shim
self.cutting_tool_cotter_pin = self.specification_id.cotter_pin
self.cutting_tool_pressing_plate = self.specification_id.pressing_plate
self.cutting_tool_min_machining_aperture = self.specification_id.min_machining_aperture
self.cutting_tool_rear_angle = self.specification_id.relief_angle
elif self.cutting_tool_type == '刀柄':
self.cutting_tool_total_length = self.specification_id.total_length
self.cutting_tool_shank_diameter = self.specification_id.shank_diameter
self.cutting_tool_shank_length = self.specification_id.shank_length
self.cutting_tool_speed_max = self.specification_id.max_rotate_speed
self.cutting_tool_change_time = self.specification_id.tool_changing_time
self.cutting_tool_total_length = self.specification_id.total_length
@@ -292,9 +312,10 @@ class ResProductMo(models.Model):
self.cutting_tool_is_safety_lock = self.specification_id.is_safe_lock
self.cutting_tool_fit_nut_model = self.specification_id.nut
self.cutting_tool_wrench = self.specification_id.spanner
self.cutting_tool_chuck_id = self.specification_id.chuck_id.id
self.cutting_tool_jump_accuracy = self.specification_id.diameter_slip_accuracy
self.cutting_tool_taper_shank_model = self.specification_id.taper_shank_model
self.cutting_tool_cooling_type = self.specification_id.cooling_model
self.cutting_tool_clamping_way = self.specification_id.clamping_mode
self.suitable_machining_method_ids = [(6, 0, [])] if not \
self.cutting_tool_model_id.suitable_machining_method_ids \
else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)]
@@ -311,6 +332,7 @@ class ResProductMo(models.Model):
(6, 0, self.cutting_tool_model_id.suitable_coolant_ids.ids)]
self.compaction_way_id = self.cutting_tool_model_id.compaction_way_id.id
self.fit_blade_shape_id = self.cutting_tool_model_id.fit_blade_shape_id.id
self.image_1920 = self.cutting_tool_model_id.image
else:
self.cutting_tool_type_id = False
self.brand_id = False
@@ -350,30 +372,30 @@ class ResProductMo(models.Model):
self.cutting_speed_ids = False
self.feed_per_tooth_ids = False
@api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
'handle_type_id', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_id')
def _check_cutting_tool_ability(self):
if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
if not self.fit_blade_shape_id:
raise ValidationError("请选择适配刀片形状")
if self.cutting_tool_type in ['刀杆', '刀盘']:
if not self.compaction_way_id:
raise ValidationError("请选择压紧方式")
if self.cutting_tool_type == '刀片':
if not self.suitable_coolant_ids:
raise ValidationError("请选择适合冷却方式")
elif self.cutting_tool_type == '整体式刀具':
if not self.handle_type_id:
raise ValidationError("请选择柄部类型")
if not self.suitable_coolant_ids:
raise ValidationError("请选择适合冷却方式")
if not self.suitable_machining_method_ids:
raise ValidationError("请选择适合加工方式")
if not self.blade_tip_characteristics_id:
raise ValidationError("请选择刀尖特征")
if not self.cutting_direction_ids:
raise ValidationError("请选择走刀方向")
# @api.constrains('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id',
# 'handle_type_id', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_id')
# def _check_cutting_tool_ability(self):
# if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']:
# if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']:
# if not self.fit_blade_shape_id:
# raise ValidationError("请选择适配刀片形状")
# if self.cutting_tool_type in ['刀杆', '刀盘']:
# if not self.compaction_way_id:
# raise ValidationError("请选择压紧方式")
# if self.cutting_tool_type == '刀片':
# if not self.suitable_coolant_ids:
# raise ValidationError("请选择适合冷却方式")
# elif self.cutting_tool_type == '整体式刀具':
# if not self.handle_type_id:
# raise ValidationError("请选择柄部类型")
# if not self.suitable_coolant_ids:
# raise ValidationError("请选择适合冷却方式")
# if not self.suitable_machining_method_ids:
# raise ValidationError("请选择适合加工方式")
# if not self.blade_tip_characteristics_id:
# raise ValidationError("请选择刀尖特征")
# if not self.cutting_direction_ids:
# raise ValidationError("请选择走刀方向")
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc')
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz')
@@ -500,6 +522,9 @@ class ResProductMo(models.Model):
string='注册状态', default='未注册')
industry_code = fields.Char('行业编码', readonly=True)
# bfm下单
manual_quotation = fields.Boolean('人工编程', default=False, readonly=True)
@api.constrains('tool_length')
def _check_tool_length_size(self):
if self.tool_length > 1000000:
@@ -594,6 +619,7 @@ class ResProductMo(models.Model):
'process_parameters_code') else self.get_process_parameters_id(item['process_parameters_code']),
'model_remark': item['remark'],
'default_code': '%s-%s' % (order_number, i),
'manual_quotation': item['manual_quotation'] or False,
'active': True,
}
copy_product_id.sudo().write(vals)
@@ -658,11 +684,14 @@ class ResProductMo(models.Model):
# 外协和采购生成的坯料需要根据材料型号绑定供应商
if route_type == 'subcontract' or route_type == 'purchase':
no_bom_copy_product_id.purchase_ok = True
no_bom_copy_product_id.seller_ids = [
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
if route_type == 'subcontract':
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
partner.is_subcontractor = True
if supplier:
no_bom_copy_product_id.seller_ids = [
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
if route_type == 'subcontract':
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
partner.is_subcontractor = True
else:
return -3
no_bom_copy_product_id.write(vals)
return no_bom_copy_product_id
@@ -859,11 +888,38 @@ class SfMaintenanceEquipmentAndProductTemplate(models.Model):
for i in range(1, number + 1):
self.env['maintenance.equipment.tool'].create({
'equipment_id': res.id,
'code': 'T' + str(i)
'code': "T%02d" % i
})
vals.append(res)
return vals[0]
base_coordinate_fixture_model_id = fields.Many2one('sf.fixture.model', '基坐标卡盘型号',
domain=[('fixture_material_id', '=', '零点卡盘')])
base_coordinate_g_coordinate = fields.Char('G坐标')
base_coordinate_x = fields.Float('x轴', digits=(12, 3))
base_coordinate_y = fields.Float('y轴', digits=(12, 3))
base_coordinate_z = fields.Float('z轴', digits=(12, 3))
# ==========获取机床基坐标接口==========
def get_equipment_base_coordinate(self):
headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'}
crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/EquipmentBaseCoordinate"
params = {"DeviceId": self.name}
r = requests.get(crea_url, params=params, headers=headers)
ret = r.json()
logging.info('register_equipment_tool:%s' % ret)
self.write({
'base_coordinate_fixture_model_id': ret['base_coordinate_fixture_model_id'],
'base_coordinate_g_coordinate': ret['base_coordinate_g_coordinate'],
'base_coordinate_x': ret['base_coordinate_x'],
'base_coordinate_y': ret['base_coordinate_y'],
'base_coordinate_z': ret['base_coordinate_z'],
})
if ret['Succeed']:
return "机床基坐标获取成功"
else:
raise ValidationError("机床基坐标获取失败")
class SfMaintenanceEquipmentTool(models.Model):
_name = 'maintenance.equipment.tool'

View File

@@ -14,6 +14,51 @@ from odoo.addons.stock.models.stock_rule import ProcurementException
from odoo.addons.sf_base.commons.common import Common
from odoo.exceptions import UserError
from io import BytesIO
from odoo.exceptions import ValidationError
class stockWarehouse(models.Model):
_inherit = 'stock.warehouse'
subcontracting_surface_technology_pull_out_id = fields.Many2one(
'stock.rule', '表面工艺规则1')
subcontracting_surface_technology_pull_in_id = fields.Many2one(
'stock.rule', '表面工艺规则2'
)
def _get_global_route_rules_values(self):
rules = super(stockWarehouse, self)._get_global_route_rules_values()
location_virtual_id = self.env.ref(
'sf_manufacturing.stock_location_locations_virtual_outcontract').id,
location_pre_id = self.env['stock.location'].search(
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id,
rules.update({
'subcontracting_surface_technology_pull_in_id': {
'create_values': {
'action': 'pull',
'picking_type_id': self.env.ref('sf_manufacturing.outcontract_picking_in').id,
'group_propagation_option': 'none',
'company_id': self.company_id.id,
'location_src_id': location_virtual_id,
'location_dest_id': location_pre_id,
'route_id': self._find_global_route('sf_manufacturing.route_surface_technology_outsourcing',
_('表面工艺外协')).id,
}
},
'subcontracting_surface_technology_pull_out_id': {
'create_values': {
'action': 'pull',
'picking_type_id': self.env.ref('sf_manufacturing.outcontract_picking_out').id,
'group_propagation_option': 'none',
'company_id': self.company_id.id,
'location_src_id': location_pre_id,
'location_dest_id': location_virtual_id,
'route_id': self._find_global_route('sf_manufacturing.route_surface_technology_outsourcing',
_('表面工艺外协')).id,
}
}
})
return rules
class StockRule(models.Model):
@@ -218,7 +263,23 @@ class StockRule(models.Model):
class ProductionLot(models.Model):
_inherit = 'stock.lot'
_name = 'stock.lot'
_inherit = ['stock.lot', 'printing.utils']
rfid = fields.Char('Rfid', readonly=True)
product_specification = fields.Char('规格', compute='_compute_product_specification', store=True)
@api.depends('product_id')
def _compute_product_specification(self):
for stock in self:
if stock:
if stock.product_id:
if stock.product_id.categ_id.name in '刀具':
stock.product_specification = stock.product_id.specification_id.name
elif stock.product_id.categ_id.name in '夹具':
stock.product_specification = stock.product_id.specification_fixture_id.name
else:
stock.product_specification = stock.product_id.default_code
@api.model
def generate_lot_names1(self, display_name, first_lot, count):
@@ -250,6 +311,24 @@ class ProductionLot(models.Model):
))
return lot_names
def get_tool_generate_lot_names1(self, company, product):
"""
采购时生成刀具物料序列号
"""
now = datetime.now().strftime("%Y%m%d")
last_serial = self.env['stock.lot'].search(
[('company_id', '=', company.id), ('product_id', '=', product.id)],
limit=1, order='id DESC')
if product.cutting_tool_model_id:
split_codes = product.cutting_tool_model_id.code.split('-')
if not last_serial:
return "%s-T-%s-%s-%03d" % (split_codes[0], now, product.specification_id.name, 1)
else:
return "%s-T-%s-%s-%03d" % (
split_codes[0], now, product.specification_id.name, int(last_serial.name[-3:]) + 1)
else:
raise ValidationError('该刀具物料产品的型号字段为空,请补充完整!!!')
@api.model
def _get_next_serial(self, company, product):
"""Return the next serial number to be attributed to the product."""
@@ -258,12 +337,14 @@ class ProductionLot(models.Model):
[('company_id', '=', company.id), ('product_id', '=', product.id)],
limit=1, order='id DESC')
if last_serial:
return self.env['stock.lot'].generate_lot_names1(product.name, last_serial.name, 2)[
1]
now = datetime.now().strftime("%Y-%m-%d")
# formatted_date = now.strftime("%Y-%m-%d")
if product.categ_id.name == '刀具':
return self.env['stock.lot'].get_tool_generate_lot_names1(company, product)
else:
return self.env['stock.lot'].generate_lot_names1(product.name, last_serial.name, 2)[1]
now = datetime.now().strftime("%Y%m%d")
if product.cutting_tool_model_id:
return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1)
split_codes = product.cutting_tool_model_id.code.split('-')
return "%s-T-%s-%s-%03d" % (split_codes[0], now, product.specification_id.name, 1)
return "%s-%03d" % (product.name, 1)
qr_code_image = fields.Binary(string='二维码', compute='_generate_qr_code')
@@ -289,36 +370,53 @@ class ProductionLot(models.Model):
record.qr_code_image = encoded_image
def print_qr_code(self):
self.ensure_one() # 确保这个方法只为一个记录调用
# if not self.lot_id:
# raise UserError("没有找到序列号。")
# 假设_lot_qr_code方法已经生成了二维码并保存在字段中
def print_single_method(self):
self.ensure_one()
qr_code_data = self.qr_code_image
if not qr_code_data:
raise UserError("没有找到二维码数据。")
lot_name = self.name
# host = "192.168.50.110" # 可以根据实际情况修改
# port = 9100 # 可以根据实际情况修改
# 生成下载链接或直接触发下载
# 此处的实现依赖于你的具体需求,以下是触发下载的一种示例
attachment = self.env['ir.attachment'].sudo().create({
'datas': self.qr_code_image,
'type': 'binary',
'description': '二维码图片',
'name': self.name + '.png',
# 'res_id': invoice.id,
# 'res_model': 'stock.picking',
'public': True,
'mimetype': 'application/x-png',
# 'model_name': 'stock.picking',
})
# 返回附件的下载链接
download_url = '/web/content/%s?download=true' % attachment.id
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
return {
'type': 'ir.actions.act_url',
'url': str(base_url) + download_url,
'target': 'self',
}
# 获取默认打印机配置
printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1)
if not printer_config:
raise UserError('请先配置打印机')
host = printer_config.printer_id.ip_address
port = printer_config.printer_id.port
self.print_qr_code(lot_name, host, port)
# self.ensure_one() # 确保这个方法只为一个记录调用
# # if not self.lot_id:
# # raise UserError("没有找到序列号。")
# # 假设_lot_qr_code方法已经生成了二维码并保存在字段中
# qr_code_data = self.qr_code_image
# if not qr_code_data:
# raise UserError("没有找到二维码数据。")
#
# # 生成下载链接或直接触发下载
# # 此处的实现依赖于你的具体需求,以下是触发下载的一种示例
# attachment = self.env['ir.attachment'].sudo().create({
# 'datas': self.qr_code_image,
# 'type': 'binary',
# 'description': '二维码图片',
# 'name': self.name + '.png',
# # 'res_id': invoice.id,
# # 'res_model': 'stock.picking',
# 'public': True,
# 'mimetype': 'application/x-png',
# # 'model_name': 'stock.picking',
# })
# # 返回附件的下载链接
# download_url = '/web/content/%s?download=true' % attachment.id
# base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
# return {
# 'type': 'ir.actions.act_url',
# 'url': str(base_url) + download_url,
# 'target': 'self',
# }
class StockPicking(models.Model):
@@ -330,10 +428,10 @@ class StockPicking(models.Model):
# 设置外协出入单的名称
def _get_name_Res(self, rescode):
last_picking = self.sudo().search([('name', 'like', rescode)], order='create_date DESC', limit=1)
logging.info('编号:' + last_picking.name)
if not last_picking:
num = "%04d" % 1
else:
logging.info('编号:' + last_picking.name)
m = int(last_picking.name[-3:]) + 1
num = "%04d" % m
return '%s%s' % (rescode, num)
@@ -383,7 +481,7 @@ class StockPicking(models.Model):
location_id = self.env.ref(
'sf_manufacturing.stock_location_locations_virtual_outcontract').id,
location_dest_id = self.env['stock.location'].search(
[('barcode', '=', 'WH-PREPRODUCTION')]).id,
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id,
outcontract_picking_type_in = self.env.ref(
'sf_manufacturing.outcontract_picking_in').id,
outcontract_picking_type_out = self.env.ref(
@@ -444,6 +542,65 @@ class ReStockMove(models.Model):
else:
raise UserError(_("没有可打印的标签数据"))
def action_show_details(self):
""" Returns an action that will open a form view (in a popup) allowing to work on all the
move lines of a particular move. This form view is used when "show operations" is not
checked on the picking type.
"""
self.ensure_one()
# If "show suggestions" is not checked on the picking type, we have to filter out the
# reserved move lines. We do this by displaying `move_line_nosuggest_ids`. We use
# different views to display one field or another so that the webclient doesn't have to
# fetch both.
if self.picking_type_id.show_reserved:
view = self.env.ref('stock.view_stock_move_operations')
else:
view = self.env.ref('stock.view_stock_move_nosuggest_operations')
if self.product_id.tracking == "serial" and self.state == "assigned":
print(self.origin)
if self.product_id.categ_id.name == '刀具':
self.next_serial = self._get_tool_next_serial(self.company_id, self.product_id, self.origin)
else:
self.next_serial = self.env['stock.lot']._get_next_serial(self.company_id, self.product_id)
return {
'name': _('Detailed Operations'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'stock.move',
'views': [(view.id, 'form')],
'view_id': view.id,
'target': 'new',
'res_id': self.id,
'context': dict(
self.env.context,
show_owner=self.picking_type_id.code != 'incoming',
show_lots_m2o=self.has_tracking != 'none' and (
self.picking_type_id.use_existing_lots or self.state == 'done' or self.origin_returned_move_id.id),
# able to create lots, whatever the value of ` use_create_lots`.
show_lots_text=self.has_tracking != 'none' and self.picking_type_id.use_create_lots and not self.picking_type_id.use_existing_lots and self.state != 'done' and not self.origin_returned_move_id.id,
show_source_location=self.picking_type_id.code != 'incoming',
show_destination_location=self.picking_type_id.code != 'outgoing',
show_package=not self.location_id.usage == 'supplier',
show_reserved_quantity=self.state != 'done' and not self.picking_id.immediate_transfer and self.picking_type_id.code != 'incoming'
),
}
def _get_tool_next_serial(self, company, product, origin):
"""Return the next serial number to be attributed to the product."""
if product.tracking == "serial":
last_serial = self.env['stock.lot'].search(
[('company_id', '=', company.id), ('product_id', '=', product.id), ('name', 'ilike', origin)],
limit=1, order='id DESC')
split_codes = product.cutting_tool_model_id.code.split('-')
if last_serial:
return "%s-T-%s-%s-%03d" % (
split_codes[0], origin, product.specification_id.name, int(last_serial.name[-3:]) + 1)
else:
return "%s-T-%s-%s-%03d" % (split_codes[0], origin, product.specification_id.name, 1)
class ReStockQuant(models.Model):
_inherit = 'stock.quant'

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,29 +1,34 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sf_cnc_processing,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cnc_processing_group_sf_mrp_user,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cnc_processing_manager,sf_cnc_processing,model_sf_cnc_processing,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_model_type,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cmm_program_group_sf_mrp_user_group_sf_mrp_user,sf_cmm_program_group_sf_mrp_user,model_sf_cmm_program,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_cmm_program_group_sf_mrp_manager,sf_cmm_program_group_sf_mrp_manager,model_sf_cmm_program,sf_base.group_sf_mrp_manager,1,0,0,0
access_sf_model_type_group_sf_mrp_user,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_model_type_admin,sf_model_type_admin,model_sf_model_type,base.group_system,1,1,1,0
access_sf_model_type_manager,sf_model_type,model_sf_model_type,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_model_type_group_sale_director,sf_model_type_group_sale_director,model_sf_model_type,sf_base.group_sale_director,1,0,0,0
access_sf_model_type_group_purchase_director,sf_model_type_group_purchase_director,model_sf_model_type,sf_base.group_purchase_director,1,0,0,0
access_sf_model_type_group_plan_director,sf_model_type_group_plan_director,model_sf_model_type,sf_base.group_plan_director,1,0,0,0
access_sf_product_model_type_routing_sort,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_product_model_type_routing_sort_group_sf_mrp_user,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_product_model_type_routing_sort_manager,sf_product_model_type_routing_sort,model_sf_product_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_embryo_model_type_routing_sort,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_embryo_model_type_routing_sort_group_sf_mrp_user,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_embryo_model_type_routing_sort_manager,sf_embryo_model_type_routing_sort,model_sf_embryo_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_sf_mrp_user,1,0,0,0
access_sf_surface_technics_model_type_routing_sort_manager,sf_surface_technics_model_type_routing_sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_production_line,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_user,1,1,1,0
access_sf_production_line_group_sf_mrp_user,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_user,1,1,1,0
access_sf_production_line_manager,sf.production.line,model_sf_production_line,sf_base.group_sf_mrp_manager,1,1,1,0
access_maintenance_equipment_tool,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_user,1,0,0,0
access_maintenance_equipment_tool_group_sf_mrp_user,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_user,1,0,0,0
access_maintenance_equipment_tool_manager,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_base.group_sf_mrp_manager,1,1,1,0
access_maintenance_equipment_tool_equipment_manager,maintenance_equipment_tool,model_maintenance_equipment_tool,sf_maintenance.sf_group_equipment_user,1,1,1,0
access_mrp_production,mrp_production,model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_group_sf_mrp_user,mrp_production,model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_manager,mrp_production,model_mrp_production,sf_base.group_sf_mrp_manager,1,1,1,0
access_mrp_workorder,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_group_quality,mrp_production_group_quality,model_mrp_production,sf_base.group_quality,1,0,0,0
access_mrp_production_group_quality_director,mrp_production_group_quality_director,model_mrp_production,sf_base.group_quality_director,1,0,0,0
access_mrp_workorder_group_sf_mrp_user,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workorder_manager,mrp_workorder,model_mrp_workorder,sf_base.group_sf_mrp_manager,1,1,1,0
access_mrp_workcenter,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_group_sf_mrp_user,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_manager,mrp_workcenter,model_mrp_workcenter,sf_base.group_sf_mrp_manager,1,1,1,0
access_mrp_workcenter_productivity,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity_group_sf_mrp_user,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity_manager,mrp_workcenter_productivity,model_mrp_workcenter_productivity,sf_base.group_sf_mrp_manager,1,1,1,0
access_sf_workpiece_delivery_group_sf_order_user,sf_workpiece_delivery_group_sf_order_user,model_sf_workpiece_delivery,sf_base.group_sf_order_user,1,1,0,0
access_sf_workpiece_delivery_group_sf_equipment_user,sf_workpiece_delivery_group_sf_equipment_user,model_sf_workpiece_delivery,sf_base.group_sf_equipment_user,1,1,0,0
@@ -31,73 +36,72 @@ access_sf_workpiece_delivery_group_sf_equipment_user,sf_workpiece_delivery_group
access_sf_workpiece_delivery_manager,sf_workpiece_delivery,model_sf_workpiece_delivery,sf_base.group_sf_mrp_manager,1,1,0,0
access_sf_workpiece_delivery_admin,sf_workpiece_delivery_admin,model_sf_workpiece_delivery,base.group_system,1,1,1,0
access_sf_workpiece_delivery_wizard_group_sf_order_user,sf_workpiece_delivery_wizard_group_sf_order_user,model_sf_workpiece_delivery_wizard,sf_base.group_sf_order_user,1,1,1,0
access_mrp_workcenter_productivity_loss_manager,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_productivity_loss,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity_loss_type,mrp.workcenter.productivity.loss.type,mrp.model_mrp_workcenter_productivity_loss_type,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter,mrp.workcenter,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_routing_workcenter,mrp.routing.workcenter,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom,mrp.bom,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_line,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_byproduct_user,mrp.bom.byproduct,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production,mrp.production user,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_manager,mrp.workcenter.manager,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_routing_workcenter_manager,mrp.routing.workcenter.manager,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_manager,mrp.bom.manager,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_line_manager,mrp.bom.line.manager,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_productivity_loss_manager_group_sf_mrp_user,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_productivity_loss_group_sf_mrp_user,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity_loss_type_group_sf_mrp_user,mrp.workcenter.productivity.loss.type,mrp.model_mrp_workcenter_productivity_loss_type,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_productivity_group_sf_mrp_user,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_group_sf_mrp_user,mrp.workcenter,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_routing_workcenter_group_sf_mrp_user,mrp.routing.workcenter,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_group_sf_mrp_user,mrp.bom,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_line_group_sf_mrp_user,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_byproduct_user_group_sf_mrp_user,mrp.bom.byproduct,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_group_sf_mrp_user,mrp.production user,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_manager_group_sf_mrp_user,mrp.workcenter.manager,mrp.model_mrp_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_routing_workcenter_manager_group_sf_mrp_user,mrp.routing.workcenter.manager,mrp.model_mrp_routing_workcenter,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_manager_group_sf_mrp_user,mrp.bom.manager,mrp.model_mrp_bom,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_line_manager_group_sf_mrp_user,mrp.bom.line.manager,mrp.model_mrp_bom_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_line_group_plan_director,mrp_bom_line_group_plan_director,mrp.model_mrp_bom_line,sf_base.group_plan_director,1,1,1,0
access_mrp_bom_line_group_sale_director,mrp_bom_line_group_sale_director,mrp.model_mrp_bom_line,sf_base.group_sale_director,1,1,1,0
access_mrp_bom_line_group_purchase_director,mrp_bom_line_group_purchase_director,mrp.model_mrp_bom_line,sf_base.group_purchase_director,1,1,1,0
access_mrp_bom_byproduct_manager,mrp.bom.byproduct manager,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_bom_byproduct_manager_group_sf_mrp_user,mrp.bom.byproduct manager,mrp.model_mrp_bom_byproduct,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_stock_worker,mrp.production stock_worker,mrp.model_mrp_production,stock.group_stock_user,1,0,0,0
access_product_product_user,product.product user,product.model_product_product,sf_base.group_sf_mrp_user,1,0,0,0
access_product_template_user,product.template user,product.model_product_template,sf_base.group_sf_mrp_user,1,0,0,0
access_uom_uom_user,uom.uom user,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,0,0,0
access_product_supplierinfo_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
access_res_partner,res.partner,base.model_res_partner,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workorder_mrp_user,mrp.workorder.user,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workorder_mrp_manager,mrp.workorder,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_leaves_user,mrp.resource.calendar.leaves.user,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_leaves_manager,mrp.resource.calendar.leaves.manager,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_calendar_attendance_mrp_user,mrp.resource.calendar.attendance.mrp.user,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_attendance_manager,mrp.resource.calendar.attendance.manager,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
access_uom_category,uom.category,uom.model_uom_category,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_resource,resource.resource,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_resource_manager,resource.resource.manager,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,1,1,0
access_product_supplierinfo_manager,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_manager,mrp.production manager,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
access_product_product_user_group_sf_mrp_user,product.product user,product.model_product_product,sf_base.group_sf_mrp_user,1,0,0,0
access_product_template_user_group_sf_mrp_user,product.template user,product.model_product_template,sf_base.group_sf_mrp_user,1,0,0,0
access_uom_uom_user,uom.uom user_group_sf_mrp_user,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,0,0,0
access_product_supplierinfo_user_group_sf_mrp_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
access_res_partner_group_sf_mrp_user,res.partner,base.model_res_partner,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workorder_mrp_user_group_sf_mrp_user,mrp.workorder.user,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workorder_mrp_manager_group_sf_mrp_user,mrp.workorder,mrp.model_mrp_workorder,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_leaves_user_group_sf_mrp_user,mrp.resource.calendar.leaves.user,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_leaves_manager_group_sf_mrp_user,mrp.resource.calendar.leaves.manager,resource.model_resource_calendar_leaves,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_calendar_attendance_mrp_user_group_sf_mrp_user,mrp.resource.calendar.attendance.mrp.user,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_attendance_manager_group_sf_mrp_user,mrp.resource.calendar.attendance.manager,resource.model_resource_calendar_attendance,sf_base.group_sf_mrp_user,1,1,1,0
access_uom_category_group_sf_mrp_user,uom.category,uom.model_uom_category,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_resource_group_sf_mrp_user,resource.resource,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,0,0,0
access_resource_resource_manager_group_sf_mrp_user,resource.resource.manager,resource.model_resource_resource,sf_base.group_sf_mrp_user,1,1,1,0
access_product_supplierinfo_manager_group_sf_mrp_user,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_production_manager_group_sf_mrp_user,mrp.production manager,mrp.model_mrp_production,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_bom_stockuser,mrp.bom,mrp.model_mrp_bom,stock.group_stock_user,1,0,0,0
access_mrp_bom_line_stockuser,mrp.bom.line,mrp.model_mrp_bom_line,stock.group_stock_user,1,0,0,0
access_uom_category_mrp_manager,uom.category mrp_manager,uom.model_uom_category,sf_base.group_sf_mrp_user,1,1,1,0
access_uom_uom_mrp_manager,uom.uom mrp_manager,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,1,1,0
access_product_category_mrp_manager,product.category mrp_manager,product.model_product_category,sf_base.group_sf_mrp_user,1,1,1,0
access_product_template_mrp_manager,product.template mrp_manager,product.model_product_template,sf_base.group_sf_mrp_user,1,1,1,0
access_product_product_mrp_manager,product.product mrp_manager,product.model_product_product,sf_base.group_sf_mrp_user,1,1,1,0
access_product_packaging_mrp_manager,product.packaging mrp_manager,product.model_product_packaging,sf_base.group_sf_mrp_user,1,1,1,0
access_product_pricelist_mrp_manager,product.pricelist mrp_manager,product.model_product_pricelist,sf_base.group_sf_mrp_user,1,1,1,0
access_product_group_res_partner_mrp_manager,res_partner sf_base.group_sf_mrp_manager,base.model_res_partner,sf_base.group_sf_mrp_user,1,1,1,0
access_product_pricelist_item_mrp_manager,product.pricelist.item mrp_manager,product.model_product_pricelist_item,sf_base.group_sf_mrp_user,1,1,1,0
access_uom_category_mrp_manager_group_sf_mrp_user,uom.category mrp_manager,uom.model_uom_category,sf_base.group_sf_mrp_user,1,1,1,0
access_uom_uom_mrp_manager_group_sf_mrp_user,uom.uom mrp_manager,uom.model_uom_uom,sf_base.group_sf_mrp_user,1,1,1,0
access_product_category_mrp_manager_group_sf_mrp_user,product.category mrp_manager,product.model_product_category,sf_base.group_sf_mrp_user,1,1,1,0
access_product_template_mrp_manager_group_sf_mrp_user,product.template mrp_manager,product.model_product_template,sf_base.group_sf_mrp_user,1,1,1,0
access_product_product_mrp_manager_group_sf_mrp_user,product.product mrp_manager,product.model_product_product,sf_base.group_sf_mrp_user,1,1,1,0
access_product_packaging_mrp_manager_group_sf_mrp_user,product.packaging mrp_manager,product.model_product_packaging,sf_base.group_sf_mrp_user,1,1,1,0
access_product_pricelist_mrp_manager_group_sf_mrp_user,product.pricelist mrp_manager,product.model_product_pricelist,sf_base.group_sf_mrp_user,1,1,1,0
access_product_group_res_partner_mrp_manager_group_sf_mrp_user,res_partner sf_base.group_sf_mrp_manager,base.model_res_partner,sf_base.group_sf_mrp_user,1,1,1,0
access_product_pricelist_item_mrp_manager_group_sf_mrp_user,product.pricelist.item mrp_manager,product.model_product_pricelist_item,sf_base.group_sf_mrp_user,1,1,1,0
access_product_tag_mrp_manager,product.tag.mrp.manager,product.model_product_tag,sf_base.group_sf_mrp_manager,1,1,1,0
access_resource_calendar_manufacturinguser,resource.calendar manufacturing.user,resource.model_resource_calendar,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_unbuild,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
access_resource_calendar_manufacturinguser_group_sf_mrp_user,resource.calendar manufacturing.user,resource.model_resource_calendar,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_unbuild_group_sf_mrp_user,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_unbuild_manager,mrp.unbuild manager,mrp.model_mrp_unbuild,sf_base.group_sf_mrp_manager,1,1,1,0
access_mrp_document_mrp_manager,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_manager,1,1,1,0
access_mrp_document_mrp_user,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_user,1,1,1,0
access_change_production_qty,access.change.production.qty,mrp.model_change_production_qty,sf_base.group_sf_mrp_user,1,1,1,0
access_stock_warn_insufficient_qty_unbuild,access.stock.warn.insufficient.qty.unbuild,mrp.model_stock_warn_insufficient_qty_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_backorder,access.mrp.production.backorder,mrp.model_mrp_production_backorder,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_backorder_line,access.mrp.production.backorder.line,mrp.model_mrp_production_backorder_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_consumption_warning,access.mrp.consumption.warning,mrp.model_mrp_consumption_warning,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_consumption_warning_line,access.mrp.consumption.warning.line,mrp.model_mrp_consumption_warning_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_immediate_production,access.mrp.immediate.production,mrp.model_mrp_immediate_production,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_immediate_production_line,access.mrp.immediate.production.line,mrp.model_mrp_immediate_production_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_tag_group_user,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,0,0,0
access_mrp_workcenter_tag_manager,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split_multi,access.mrp.production.split.multi,mrp.model_mrp_production_split_multi,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split,access.mrp.production.split,mrp.model_mrp_production_split,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split_line,access.mrp.production.split.line,mrp.model_mrp_production_split_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_capacity_manager,mrp.workcenter.capacity.manager,mrp.model_mrp_workcenter_capacity,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_document_mrp_user_group_sf_mrp_user,mrp.document group_user,mrp.model_mrp_document,sf_base.group_sf_mrp_user,1,1,1,0
access_change_production_qty_group_sf_mrp_user,access.change.production.qty,mrp.model_change_production_qty,sf_base.group_sf_mrp_user,1,1,1,0
access_stock_warn_insufficient_qty_unbuild_group_sf_mrp_user,access.stock.warn.insufficient.qty.unbuild,mrp.model_stock_warn_insufficient_qty_unbuild,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_backorder_group_sf_mrp_user,access.mrp.production.backorder,mrp.model_mrp_production_backorder,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_backorder_line_group_sf_mrp_user,access.mrp.production.backorder.line,mrp.model_mrp_production_backorder_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_consumption_warning_group_sf_mrp_user,access.mrp.consumption.warning,mrp.model_mrp_consumption_warning,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_consumption_warning_line_group_sf_mrp_user,access.mrp.consumption.warning.line,mrp.model_mrp_consumption_warning_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_immediate_production_group_sf_mrp_user,access.mrp.immediate.production,mrp.model_mrp_immediate_production,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_immediate_production_line_group_sf_mrp_user,access.mrp.immediate.production.line,mrp.model_mrp_immediate_production_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_tag_manager_group_sf_mrp_user,access.mrp.workcenter.tag,mrp.model_mrp_workcenter_tag,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split_multi_group_sf_mrp_user,access.mrp.production.split.multi,mrp.model_mrp_production_split_multi,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split_group_sf_mrp_user,access.mrp.production.split,mrp.model_mrp_production_split,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_split_line_group_sf_mrp_user,access.mrp.production.split.line,mrp.model_mrp_production_split_line,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_workcenter_capacity_manager_group_sf_mrp_user,mrp.workcenter.capacity.manager,mrp.model_mrp_workcenter_capacity,sf_base.group_sf_mrp_user,1,1,1,0
access_mrp_production_group_plan_dispatch,mrp_production,model_mrp_production,sf_base.group_plan_dispatch,1,0,0,0
@@ -106,9 +110,9 @@ access_sf_production_line_group_plan_dispatch,sf.production.line,model_sf_produc
access_sf_production_line_group_plan_director,sf.production.line,model_sf_production_line,sf_base.group_plan_director,1,1,1,0
access_sf_production_line,sf.production.line,model_sf_production_line,sf_maintenance.sf_group_equipment_user,1,1,1,0
access_mrp_workcenter,mrp_workcenter,model_mrp_workcenter,sf_base.group_plan_dispatch,1,1,1,0
access_mrp_bom,mrp.bom,mrp.model_mrp_bom,sf_base.group_plan_dispatch,1,1,1,0
access_mrp_bom_group_plan_dispatch,mrp.bom,mrp.model_mrp_bom,sf_base.group_plan_dispatch,1,0,0,0
access_mrp_bom_line,mrp.bom.line,mrp.model_mrp_bom_line,sf_base.group_plan_dispatch,1,0,0,0
access_mrp_unbuild,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_plan_dispatch,1,1,1,0
access_mrp_unbuild_group_plan_dispatch,mrp.unbuild,mrp.model_mrp_unbuild,sf_base.group_plan_dispatch,1,0,0,0
access_stock_scrap_group_plan_dispatch,stock.scrap,stock.model_stock_scrap,sf_base.group_plan_dispatch,1,0,0,0
access_sf_model_type,sf.model.type,model_sf_model_type,sf_base.group_plan_dispatch,1,1,1,0
@@ -119,8 +123,13 @@ access_sf_embryo_model_type_routing_sort,sf.embryo.model.type.routing.sort,model
access_sf_surface_technics_model_type_routing_sort,sf.surface_technics.model.type.routing.sort,model_sf_surface_technics_model_type_routing_sort,sf_base.group_plan_dispatch,1,0,0,0
access_mrp_workcenter_capacity,mrp.workcenter.capacity,mrp.model_mrp_workcenter_capacity,sf_base.group_plan_dispatch,1,0,0,0
access_sf_cnc_processing,sf.cnc.processing,model_sf_cnc_processing,sf_base.group_plan_dispatch,1,0,0,0
access_sf_cmm_program_group_plan_dispatch,sf_cmm_program_group_plan_dispatch,model_sf_cmm_program,sf_base.group_plan_dispatch,1,0,0,0
access_mrp_workcenter_productivity,mrp.workcenter.productivity,mrp.model_mrp_workcenter_productivity,sf_base.group_plan_dispatch,1,0,0,0
access_maintenance_equipment_tool_group_plan_dispatch,maintenance.equipment.tool,sf_manufacturing.model_maintenance_equipment_tool,sf_base.group_plan_dispatch,1,0,0,0
access_sf_workpiece_delivery_group_plan_dispatch,sf.workpiece.delivery,sf_manufacturing.model_sf_workpiece_delivery,sf_base.group_plan_dispatch,1,0,0,0
access_sf_agv_site_group_sf_order_user,sf_agv_site_group_sf_order_user,model_sf_agv_site,sf_base.group_sf_order_user,1,1,1,0
access_sf_agv_task_route_group_sf_order_user,sf_agv_task_route_group_sf_order_user,model_sf_agv_task_route,sf_base.group_sf_order_user,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sf_cnc_processing access_sf_cnc_processing_group_sf_mrp_user sf_cnc_processing model_sf_cnc_processing sf_base.group_sf_mrp_user 1 0 0 0
3 access_sf_cnc_processing_manager sf_cnc_processing model_sf_cnc_processing sf_base.group_sf_mrp_manager 1 1 1 0
4 access_sf_model_type access_sf_cmm_program_group_sf_mrp_user_group_sf_mrp_user sf_model_type sf_cmm_program_group_sf_mrp_user model_sf_model_type model_sf_cmm_program sf_base.group_sf_mrp_user 1 0 0 0
5 access_sf_cmm_program_group_sf_mrp_manager sf_cmm_program_group_sf_mrp_manager model_sf_cmm_program sf_base.group_sf_mrp_manager 1 0 0 0
6 access_sf_model_type_group_sf_mrp_user sf_model_type model_sf_model_type sf_base.group_sf_mrp_user 1 0 0 0
7 access_sf_model_type_admin sf_model_type_admin model_sf_model_type base.group_system 1 1 1 0
8 access_sf_model_type_manager sf_model_type model_sf_model_type sf_base.group_sf_mrp_manager 1 1 1 0
9 access_sf_model_type_group_sale_director sf_model_type_group_sale_director model_sf_model_type sf_base.group_sale_director 1 0 0 0
10 access_sf_model_type_group_purchase_director sf_model_type_group_purchase_director model_sf_model_type sf_base.group_purchase_director 1 0 0 0
11 access_sf_model_type_group_plan_director sf_model_type_group_plan_director model_sf_model_type sf_base.group_plan_director 1 0 0 0
12 access_sf_product_model_type_routing_sort access_sf_product_model_type_routing_sort_group_sf_mrp_user sf_product_model_type_routing_sort model_sf_product_model_type_routing_sort sf_base.group_sf_mrp_user 1 0 0 0
13 access_sf_product_model_type_routing_sort_manager sf_product_model_type_routing_sort model_sf_product_model_type_routing_sort sf_base.group_sf_mrp_manager 1 1 1 0
14 access_sf_embryo_model_type_routing_sort access_sf_embryo_model_type_routing_sort_group_sf_mrp_user sf_embryo_model_type_routing_sort model_sf_embryo_model_type_routing_sort sf_base.group_sf_mrp_user 1 0 0 0
15 access_sf_embryo_model_type_routing_sort_manager sf_embryo_model_type_routing_sort model_sf_embryo_model_type_routing_sort sf_base.group_sf_mrp_manager 1 1 1 0
16 access_sf_surface_technics_model_type_routing_sort sf_surface_technics_model_type_routing_sort model_sf_surface_technics_model_type_routing_sort sf_base.group_sf_mrp_user 1 0 0 0
17 access_sf_surface_technics_model_type_routing_sort_manager sf_surface_technics_model_type_routing_sort model_sf_surface_technics_model_type_routing_sort sf_base.group_sf_mrp_manager 1 1 1 0
18 access_sf_production_line access_sf_production_line_group_sf_mrp_user sf.production.line model_sf_production_line sf_base.group_sf_mrp_user 1 1 1 0
19 access_sf_production_line_manager sf.production.line model_sf_production_line sf_base.group_sf_mrp_manager 1 1 1 0
20 access_maintenance_equipment_tool access_maintenance_equipment_tool_group_sf_mrp_user maintenance_equipment_tool model_maintenance_equipment_tool sf_base.group_sf_mrp_user 1 0 0 0
21 access_maintenance_equipment_tool_manager maintenance_equipment_tool model_maintenance_equipment_tool sf_base.group_sf_mrp_manager 1 1 1 0
22 access_maintenance_equipment_tool_equipment_manager maintenance_equipment_tool model_maintenance_equipment_tool sf_maintenance.sf_group_equipment_user 1 1 1 0
23 access_mrp_production access_mrp_production_group_sf_mrp_user mrp_production model_mrp_production sf_base.group_sf_mrp_user 1 0 0 0
24 access_mrp_production_manager mrp_production model_mrp_production sf_base.group_sf_mrp_manager 1 1 1 0
25 access_mrp_workorder access_mrp_production_group_quality mrp_workorder mrp_production_group_quality model_mrp_workorder model_mrp_production sf_base.group_sf_mrp_user sf_base.group_quality 1 0 0 0
26 access_mrp_production_group_quality_director mrp_production_group_quality_director model_mrp_production sf_base.group_quality_director 1 0 0 0
27 access_mrp_workorder_group_sf_mrp_user mrp_workorder model_mrp_workorder sf_base.group_sf_mrp_user 1 0 0 0
28 access_mrp_workorder_manager mrp_workorder model_mrp_workorder sf_base.group_sf_mrp_manager 1 1 1 0
29 access_mrp_workcenter access_mrp_workcenter_group_sf_mrp_user mrp_workcenter model_mrp_workcenter sf_base.group_sf_mrp_user 1 0 0 0
30 access_mrp_workcenter_manager mrp_workcenter model_mrp_workcenter sf_base.group_sf_mrp_manager 1 1 1 0
31 access_mrp_workcenter_productivity access_mrp_workcenter_productivity_group_sf_mrp_user mrp_workcenter_productivity model_mrp_workcenter_productivity sf_base.group_sf_mrp_user 1 0 0 0
32 access_mrp_workcenter_productivity_manager mrp_workcenter_productivity model_mrp_workcenter_productivity sf_base.group_sf_mrp_manager 1 1 1 0
33 access_sf_workpiece_delivery_group_sf_order_user sf_workpiece_delivery_group_sf_order_user model_sf_workpiece_delivery sf_base.group_sf_order_user 1 1 0 0
34 access_sf_workpiece_delivery_group_sf_equipment_user sf_workpiece_delivery_group_sf_equipment_user model_sf_workpiece_delivery sf_base.group_sf_equipment_user 1 1 0 0
36 access_sf_workpiece_delivery_admin sf_workpiece_delivery_admin model_sf_workpiece_delivery base.group_system 1 1 1 0
37 access_sf_workpiece_delivery_wizard_group_sf_order_user sf_workpiece_delivery_wizard_group_sf_order_user model_sf_workpiece_delivery_wizard sf_base.group_sf_order_user 1 1 1 0
38 access_mrp_workcenter_productivity_loss_manager access_mrp_workcenter_productivity_loss_manager_group_sf_mrp_user mrp.workcenter.productivity.loss mrp.model_mrp_workcenter_productivity_loss sf_base.group_sf_mrp_user 1 1 1 0
39 access_mrp_workcenter_productivity_loss access_mrp_workcenter_productivity_loss_group_sf_mrp_user mrp.workcenter.productivity.loss mrp.model_mrp_workcenter_productivity_loss sf_base.group_sf_mrp_user 1 0 0 0
40 access_mrp_workcenter_productivity_loss_type access_mrp_workcenter_productivity_loss_type_group_sf_mrp_user mrp.workcenter.productivity.loss.type mrp.model_mrp_workcenter_productivity_loss_type sf_base.group_sf_mrp_user 1 0 0 0
41 access_mrp_workcenter_productivity access_mrp_workcenter_productivity_group_sf_mrp_user mrp.workcenter.productivity mrp.model_mrp_workcenter_productivity sf_base.group_sf_mrp_user 1 1 1 0
42 access_mrp_workcenter access_mrp_workcenter_group_sf_mrp_user mrp.workcenter mrp.model_mrp_workcenter sf_base.group_sf_mrp_user 1 0 0 0
43 access_mrp_routing_workcenter access_mrp_routing_workcenter_group_sf_mrp_user mrp.routing.workcenter mrp.model_mrp_routing_workcenter sf_base.group_sf_mrp_user 1 0 0 0
44 access_mrp_bom access_mrp_bom_group_sf_mrp_user mrp.bom mrp.model_mrp_bom sf_base.group_sf_mrp_user 1 0 0 0
45 access_mrp_bom_line access_mrp_bom_line_group_sf_mrp_user mrp.bom.line mrp.model_mrp_bom_line sf_base.group_sf_mrp_user 1 0 0 0
46 access_mrp_bom_byproduct_user access_mrp_bom_byproduct_user_group_sf_mrp_user mrp.bom.byproduct mrp.model_mrp_bom_byproduct sf_base.group_sf_mrp_user 1 0 0 0
47 access_mrp_production access_mrp_production_group_sf_mrp_user mrp.production user mrp.model_mrp_production sf_base.group_sf_mrp_user 1 1 1 0
48 access_mrp_workcenter_manager access_mrp_workcenter_manager_group_sf_mrp_user mrp.workcenter.manager mrp.model_mrp_workcenter sf_base.group_sf_mrp_user 1 1 1 0
49 access_mrp_routing_workcenter_manager access_mrp_routing_workcenter_manager_group_sf_mrp_user mrp.routing.workcenter.manager mrp.model_mrp_routing_workcenter sf_base.group_sf_mrp_user 1 1 1 0
50 access_mrp_bom_manager access_mrp_bom_manager_group_sf_mrp_user mrp.bom.manager mrp.model_mrp_bom sf_base.group_sf_mrp_user 1 1 1 0
51 access_mrp_bom_line_manager access_mrp_bom_line_manager_group_sf_mrp_user mrp.bom.line.manager mrp.model_mrp_bom_line sf_base.group_sf_mrp_user 1 1 1 0
52 access_mrp_bom_line_group_plan_director mrp_bom_line_group_plan_director mrp.model_mrp_bom_line sf_base.group_plan_director 1 1 1 0
53 access_mrp_bom_line_group_sale_director mrp_bom_line_group_sale_director mrp.model_mrp_bom_line sf_base.group_sale_director 1 1 1 0
54 access_mrp_bom_line_group_purchase_director mrp_bom_line_group_purchase_director mrp.model_mrp_bom_line sf_base.group_purchase_director 1 1 1 0
55 access_mrp_bom_byproduct_manager access_mrp_bom_byproduct_manager_group_sf_mrp_user mrp.bom.byproduct manager mrp.model_mrp_bom_byproduct sf_base.group_sf_mrp_user 1 1 1 0
56 access_mrp_production_stock_worker mrp.production stock_worker mrp.model_mrp_production stock.group_stock_user 1 0 0 0
57 access_product_product_user access_product_product_user_group_sf_mrp_user product.product user product.model_product_product sf_base.group_sf_mrp_user 1 0 0 0
58 access_product_template_user access_product_template_user_group_sf_mrp_user product.template user product.model_product_template sf_base.group_sf_mrp_user 1 0 0 0
59 access_uom_uom_user uom.uom user uom.uom user_group_sf_mrp_user uom.model_uom_uom sf_base.group_sf_mrp_user 1 0 0 0
60 access_product_supplierinfo_user access_product_supplierinfo_user_group_sf_mrp_user product.supplierinfo user product.model_product_supplierinfo sf_base.group_sf_mrp_user 1 0 0 0
61 access_res_partner access_res_partner_group_sf_mrp_user res.partner base.model_res_partner sf_base.group_sf_mrp_user 1 0 0 0
62 access_mrp_workorder_mrp_user access_mrp_workorder_mrp_user_group_sf_mrp_user mrp.workorder.user mrp.model_mrp_workorder sf_base.group_sf_mrp_user 1 1 1 0
63 access_mrp_workorder_mrp_manager access_mrp_workorder_mrp_manager_group_sf_mrp_user mrp.workorder mrp.model_mrp_workorder sf_base.group_sf_mrp_user 1 1 1 0
64 access_resource_calendar_leaves_user access_resource_calendar_leaves_user_group_sf_mrp_user mrp.resource.calendar.leaves.user resource.model_resource_calendar_leaves sf_base.group_sf_mrp_user 1 1 1 0
65 access_resource_calendar_leaves_manager access_resource_calendar_leaves_manager_group_sf_mrp_user mrp.resource.calendar.leaves.manager resource.model_resource_calendar_leaves sf_base.group_sf_mrp_user 1 0 0 0
66 access_resource_calendar_attendance_mrp_user access_resource_calendar_attendance_mrp_user_group_sf_mrp_user mrp.resource.calendar.attendance.mrp.user resource.model_resource_calendar_attendance sf_base.group_sf_mrp_user 1 1 1 0
67 access_resource_calendar_attendance_manager access_resource_calendar_attendance_manager_group_sf_mrp_user mrp.resource.calendar.attendance.manager resource.model_resource_calendar_attendance sf_base.group_sf_mrp_user 1 1 1 0
68 access_uom_category access_uom_category_group_sf_mrp_user uom.category uom.model_uom_category sf_base.group_sf_mrp_user 1 0 0 0
69 access_resource_resource access_resource_resource_group_sf_mrp_user resource.resource resource.model_resource_resource sf_base.group_sf_mrp_user 1 0 0 0
70 access_resource_resource_manager access_resource_resource_manager_group_sf_mrp_user resource.resource.manager resource.model_resource_resource sf_base.group_sf_mrp_user 1 1 1 0
71 access_product_supplierinfo_manager access_product_supplierinfo_manager_group_sf_mrp_user product.supplierinfo user product.model_product_supplierinfo sf_base.group_sf_mrp_user 1 0 0 0
72 access_mrp_production_manager access_mrp_production_manager_group_sf_mrp_user mrp.production manager mrp.model_mrp_production sf_base.group_sf_mrp_user 1 0 0 0
73 access_mrp_bom_stockuser mrp.bom mrp.model_mrp_bom stock.group_stock_user 1 0 0 0
74 access_mrp_bom_line_stockuser mrp.bom.line mrp.model_mrp_bom_line stock.group_stock_user 1 0 0 0
75 access_uom_category_mrp_manager access_uom_category_mrp_manager_group_sf_mrp_user uom.category mrp_manager uom.model_uom_category sf_base.group_sf_mrp_user 1 1 1 0
76 access_uom_uom_mrp_manager access_uom_uom_mrp_manager_group_sf_mrp_user uom.uom mrp_manager uom.model_uom_uom sf_base.group_sf_mrp_user 1 1 1 0
77 access_product_category_mrp_manager access_product_category_mrp_manager_group_sf_mrp_user product.category mrp_manager product.model_product_category sf_base.group_sf_mrp_user 1 1 1 0
78 access_product_template_mrp_manager access_product_template_mrp_manager_group_sf_mrp_user product.template mrp_manager product.model_product_template sf_base.group_sf_mrp_user 1 1 1 0
79 access_product_product_mrp_manager access_product_product_mrp_manager_group_sf_mrp_user product.product mrp_manager product.model_product_product sf_base.group_sf_mrp_user 1 1 1 0
80 access_product_packaging_mrp_manager access_product_packaging_mrp_manager_group_sf_mrp_user product.packaging mrp_manager product.model_product_packaging sf_base.group_sf_mrp_user 1 1 1 0
81 access_product_pricelist_mrp_manager access_product_pricelist_mrp_manager_group_sf_mrp_user product.pricelist mrp_manager product.model_product_pricelist sf_base.group_sf_mrp_user 1 1 1 0
82 access_product_group_res_partner_mrp_manager access_product_group_res_partner_mrp_manager_group_sf_mrp_user res_partner sf_base.group_sf_mrp_manager base.model_res_partner sf_base.group_sf_mrp_user 1 1 1 0
83 access_product_pricelist_item_mrp_manager access_product_pricelist_item_mrp_manager_group_sf_mrp_user product.pricelist.item mrp_manager product.model_product_pricelist_item sf_base.group_sf_mrp_user 1 1 1 0
84 access_product_tag_mrp_manager product.tag.mrp.manager product.model_product_tag sf_base.group_sf_mrp_manager 1 1 1 0
85 access_resource_calendar_manufacturinguser access_resource_calendar_manufacturinguser_group_sf_mrp_user resource.calendar manufacturing.user resource.model_resource_calendar sf_base.group_sf_mrp_user 1 0 0 0
86 access_mrp_unbuild access_mrp_unbuild_group_sf_mrp_user mrp.unbuild mrp.model_mrp_unbuild sf_base.group_sf_mrp_user 1 1 1 0
87 access_mrp_unbuild_manager mrp.unbuild manager mrp.model_mrp_unbuild sf_base.group_sf_mrp_manager 1 1 1 0
88 access_mrp_document_mrp_manager mrp.document group_user mrp.model_mrp_document sf_base.group_sf_mrp_manager 1 1 1 0
89 access_mrp_document_mrp_user access_mrp_document_mrp_user_group_sf_mrp_user mrp.document group_user mrp.model_mrp_document sf_base.group_sf_mrp_user 1 1 1 0
90 access_change_production_qty access_change_production_qty_group_sf_mrp_user access.change.production.qty mrp.model_change_production_qty sf_base.group_sf_mrp_user 1 1 1 0
91 access_stock_warn_insufficient_qty_unbuild access_stock_warn_insufficient_qty_unbuild_group_sf_mrp_user access.stock.warn.insufficient.qty.unbuild mrp.model_stock_warn_insufficient_qty_unbuild sf_base.group_sf_mrp_user 1 1 1 0
92 access_mrp_production_backorder access_mrp_production_backorder_group_sf_mrp_user access.mrp.production.backorder mrp.model_mrp_production_backorder sf_base.group_sf_mrp_user 1 1 1 0
93 access_mrp_production_backorder_line access_mrp_production_backorder_line_group_sf_mrp_user access.mrp.production.backorder.line mrp.model_mrp_production_backorder_line sf_base.group_sf_mrp_user 1 1 1 0
94 access_mrp_consumption_warning access_mrp_consumption_warning_group_sf_mrp_user access.mrp.consumption.warning mrp.model_mrp_consumption_warning sf_base.group_sf_mrp_user 1 1 1 0
95 access_mrp_consumption_warning_line access_mrp_consumption_warning_line_group_sf_mrp_user access.mrp.consumption.warning.line mrp.model_mrp_consumption_warning_line sf_base.group_sf_mrp_user 1 1 1 0
96 access_mrp_immediate_production access_mrp_immediate_production_group_sf_mrp_user access.mrp.immediate.production mrp.model_mrp_immediate_production sf_base.group_sf_mrp_user 1 1 1 0
97 access_mrp_immediate_production_line access_mrp_immediate_production_line_group_sf_mrp_user access.mrp.immediate.production.line mrp.model_mrp_immediate_production_line sf_base.group_sf_mrp_user 1 1 1 0
98 access_mrp_workcenter_tag_group_user access_mrp_workcenter_tag_manager_group_sf_mrp_user access.mrp.workcenter.tag mrp.model_mrp_workcenter_tag sf_base.group_sf_mrp_user 1 0 1 0 1 0
99 access_mrp_workcenter_tag_manager access_mrp_production_split_multi_group_sf_mrp_user access.mrp.workcenter.tag access.mrp.production.split.multi mrp.model_mrp_workcenter_tag mrp.model_mrp_production_split_multi sf_base.group_sf_mrp_user 1 1 1 0
100 access_mrp_production_split_multi access_mrp_production_split_group_sf_mrp_user access.mrp.production.split.multi access.mrp.production.split mrp.model_mrp_production_split_multi mrp.model_mrp_production_split sf_base.group_sf_mrp_user 1 1 1 0
101 access_mrp_production_split access_mrp_production_split_line_group_sf_mrp_user access.mrp.production.split access.mrp.production.split.line mrp.model_mrp_production_split mrp.model_mrp_production_split_line sf_base.group_sf_mrp_user 1 1 1 0
102 access_mrp_production_split_line access_mrp_workcenter_capacity_manager_group_sf_mrp_user access.mrp.production.split.line mrp.workcenter.capacity.manager mrp.model_mrp_production_split_line mrp.model_mrp_workcenter_capacity sf_base.group_sf_mrp_user 1 1 1 0
103 access_mrp_workcenter_capacity_manager access_mrp_production_group_plan_dispatch mrp.workcenter.capacity.manager mrp_production mrp.model_mrp_workcenter_capacity model_mrp_production sf_base.group_sf_mrp_user sf_base.group_plan_dispatch 1 1 0 1 0 0
104 access_mrp_production_group_plan_dispatch access_mrp_workorder mrp_production mrp_workorder model_mrp_production model_mrp_workorder sf_base.group_plan_dispatch 1 0 1 0 1 0
access_mrp_workorder mrp_workorder model_mrp_workorder sf_base.group_plan_dispatch 1 1 1 0
105 access_sf_production_line_group_plan_dispatch sf.production.line model_sf_production_line sf_base.group_plan_dispatch 1 0 0 0
106 access_sf_production_line_group_plan_director sf.production.line model_sf_production_line sf_base.group_plan_director 1 1 1 0
107 access_sf_production_line sf.production.line model_sf_production_line sf_maintenance.sf_group_equipment_user 1 1 1 0
110 access_mrp_bom_line mrp.bom.line mrp.model_mrp_bom_line sf_base.group_plan_dispatch 1 0 0 0
111 access_mrp_unbuild access_mrp_unbuild_group_plan_dispatch mrp.unbuild mrp.model_mrp_unbuild sf_base.group_plan_dispatch 1 1 0 1 0 0
112 access_stock_scrap_group_plan_dispatch stock.scrap stock.model_stock_scrap sf_base.group_plan_dispatch 1 0 0 0
113 access_sf_model_type sf.model.type model_sf_model_type sf_base.group_plan_dispatch 1 1 1 0
114 access_mrp_routing_workcenter mrp.routing.workcenter mrp.model_mrp_routing_workcenter sf_base.group_plan_dispatch 1 1 1 0
115 access_mrp_document mrp.document mrp.model_mrp_document sf_base.group_plan_dispatch 1 0 0 0
116 access_sf_product_model_type_routing_sort sf.product.model.type.routing.sort model_sf_product_model_type_routing_sort sf_base.group_plan_dispatch 1 0 0 0
117 access_sf_embryo_model_type_routing_sort sf.embryo.model.type.routing.sort model_sf_embryo_model_type_routing_sort sf_base.group_plan_dispatch 1 0 0 0
118 access_sf_surface_technics_model_type_routing_sort sf.surface_technics.model.type.routing.sort model_sf_surface_technics_model_type_routing_sort sf_base.group_plan_dispatch 1 0 0 0
123 access_maintenance_equipment_tool_group_plan_dispatch maintenance.equipment.tool sf_manufacturing.model_maintenance_equipment_tool sf_base.group_plan_dispatch 1 0 0 0
124 access_sf_workpiece_delivery_group_plan_dispatch sf.workpiece.delivery sf_manufacturing.model_sf_workpiece_delivery sf_base.group_plan_dispatch 1 0 0 0
125 access_sf_agv_site_group_sf_order_user sf_agv_site_group_sf_order_user model_sf_agv_site sf_base.group_sf_order_user 1 1 1 0
126 access_sf_agv_task_route_group_sf_order_user sf_agv_task_route_group_sf_order_user model_sf_agv_task_route sf_base.group_sf_order_user 1 1 1 0
127
128
129
130
131
132
133
134
135

View File

@@ -0,0 +1,17 @@
var RFID = ''
$(document).off('keydown')
console.log(2222)
$(document).on('keydown', '.modal.d-block.o_technical_modal,body.o_web_client', function (e) {
const dom = $('.customRFID')
if(!dom.length) return
setTimeout(() => {
RFID = ''
}, 200)
if(e.key == 'Enter' && e.keyCode == 13 || e.key == 'Tab' && e.keyCode == 9){
if(!RFID || RFID.length <= 3) return;
dom.children('span').text(RFID)
RFID = ''
return;
}
RFID += e.key
})

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- agv站点 -->
<record id="view_agv_site_tree" model="ir.ui.view">
<field name="name">agv站点</field>
<field name="model">sf.agv.site</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="number" required="1"/>
<field name="name" required="1"/>
<field name="owning_region" required="1"/>
<field name="state" required="1"/>
<field name="divide_the_work" required="1"/>
</tree>
</field>
</record>
<record id="action_agv_site_form" model="ir.actions.act_window">
<field name="name">AGV站点</field>
<field name="res_model">sf.agv.site</field>
<field name="view_mode">tree</field>
</record>
<menuitem id="menu_action_agv_site"
parent="sf_base.menu_sf_base"
name="AGV站点"
sequence="12"
action="action_agv_site_form"/>
<!-- agv任务路线 -->
<record id="view_agv_task_route_tree" model="ir.ui.view">
<field name="name">AGV任务路线</field>
<field name="model">sf.agv.task.route</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="name" required="1"/>
<field name="type" readonly="1"/>
<field name="start_site_id" required="1" options="{'no_create': True}" string="起点接驳站"/>
<field name="end_site_id" required="1" options="{'no_create': True}" string="终点接驳站"/>
<field name="destination_production_line_id" required="1" options="{'no_create': True}"/>
<field name="priority" widget="priority"/>
</tree>
</field>
</record>
<record id="action_agv_task_route_form" model="ir.actions.act_window">
<field name="name">AGV任务路线</field>
<field name="res_model">sf.agv.task.route</field>
<field name="view_mode">tree</field>
</record>
<menuitem id="menu_action_agv_task_route"
parent="sf_base.menu_sf_base"
name="AGV任务路线"
sequence="13"
action="action_agv_task_route_form"/>
</data>
</odoo>

View File

@@ -68,9 +68,11 @@
<xpath expr="//field[@name='user_id']" position="after">
<field name="programming_no" readonly="1"/>
<field name="work_state" invisible="1"/>
<field name="schedule_state" invisible='1'/>
<field name="programming_state" readonly="1"/>
<field name="production_line_id" readonly="1"/>
<field name="production_line_id" readonly="1"/>
<field name="plan_start_processing_time" readonly="1"/>
<field name="production_line_state" readonly="1"/>
</xpath>
<xpath expr="//header//button[@name='action_cancel']" position="replace">
<button name="action_cancel" type="object" string="取消" data-hotkey="z"
@@ -234,6 +236,10 @@
attrs="{'invisible': [('state', '!=', 'done')]}" data-hotkey="shift+v"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//sheet//notebook//page[@name='operations']" position="attributes">
<attribute name="attrs">{'invisible': [('schedule_state', '=', '未排')]}</attribute>
</xpath>
</field>
</record>
@@ -244,61 +250,62 @@
<field name="inherit_id" ref="mrp.mrp_production_workorder_tree_editable_view"/>
<field name="arch" type="xml">
<xpath expr="//tree//button[@name='button_start']" position="replace">
<field name="routing_type" invisible="True"/>
<button name="button_start" type="object" string="开始" class="btn-success"
attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"
attrs="{'invisible': ['|', '|', '|','|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='button_pending']" position="replace">
<button name="button_pending" type="object" string="Pause" class="btn-warning"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
attrs="{'invisible': ['|', '|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='button_finish']" position="replace">
<button name="button_finish" type="object" string="Done" class="btn-success"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
attrs="{'invisible': ['|', '|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='%(mrp.act_mrp_block_workcenter_wo)d']" position="replace">
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="Block"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked')]}"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='button_unblock']" position="replace">
<button name="button_unblock" type="object" string="Unblock"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked')]}"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='action_open_wizard']" position="replace">
<button name="action_open_wizard" type="object" icon="fa-external-link" class="oe_edit_only"
title="Open Work Order"
context="{'default_workcenter_id': workcenter_id}" groups="sf_base.group_sf_mrp_user"/>
=======
<button name="button_start" type="object" string="开始" class="btn-success"
attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"
groups="sf_base.group_sf_mrp_user"/>
<!-- ======= -->
<!-- <button name="button_start" type="object" string="开始" class="btn-success" -->
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}" -->
<!-- groups="sf_base.group_sf_mrp_user"/> -->
</xpath>
<xpath expr="//tree//button[@name='button_pending']" position="replace">
<button name="button_pending" type="object" string="暂停" class="btn-warning"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='button_finish']" position="replace">
<button name="button_finish" type="object" string="完成" class="btn-success"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='%(mrp.act_mrp_block_workcenter_wo)d']" position="replace">
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="阻塞"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked')]}"
attrs="{'invisible': ['|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='button_unblock']" position="replace">
<button name="button_unblock" type="object" string="取消阻塞"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked')]}"
attrs="{'invisible': ['|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'), ('routing_type', '=', 'CNC加工')]}"
groups="sf_base.group_sf_mrp_user"/>
</xpath>
<xpath expr="//tree//button[@name='action_open_wizard']" position="replace">
@@ -415,7 +422,8 @@
<div name="product_specification_id" class="mt-1">
规格:
<field name="specification_id"></field>
<field name="specification_id"/>
<field name="specification_fixture_id"/>
</div>
<t t-if="record.default_code.value">[<field name="default_code"/>]
</t>

View File

@@ -46,6 +46,9 @@
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='name']" position="after">
<field name="production_id"/>
</xpath>
<!-- <button name="button_start" type="object" string="Start" class="btn-success"-->
<!-- attrs="{'invisible': ['|', '|', '|', ('production_state','in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), ('is_user_working', '!=', False)]}"/>-->
<!-- <button name="button_pending" type="object" string="Pause" class="btn-warning"-->
@@ -103,23 +106,21 @@
<xpath expr="//field[@name='state']" position="before">
<field name='user_permissions' invisible="1"/>
<field name='name' invisible="1"/>
<field name='routing_type' invisible="1"/>
<field name='is_delivery' invisible="1"/>
<!-- 工单form页面的开始停工按钮等 -->
<button name="button_start" type="object" string="开始" class="btn-success"
attrs="{'invisible': ['|', '|', '|','|',('production_state','in', ('draft', 'done',
'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')),
('is_user_working', '!=', False),('user_permissions','=',False)]}"
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','ready')]}"
groups="sf_base.group_sf_mrp_user"/>
<button name="button_pending" type="object" string="暂停" class="btn-warning"
groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"
groups="sf_base.group_sf_mrp_user"/>
<button name="button_finish" type="object" string="完成" class="btn-success"
groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"
groups="sf_base.group_sf_mrp_user" confirm="是否确认完工"/>
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="停工"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'),('user_permissions','=',False),('state','=','done')]}"/>
attrs="{'invisible': ['|', ('production_state', '!=', 'pending_processing'), ('state','!=','progress')]}"/>
<button name="button_unblock" type="object" string="Unblock"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
groups="sf_base.group_sf_mrp_user"
@@ -144,7 +145,12 @@
</group>
</page>
</xpath>
<xpath expr="//label[1]" position="before">
<field name='routing_type'/>
</xpath>
<xpath expr="//label[1]" position="attributes">
<attribute name="string">计划加工时间</attribute>
</xpath>
<!-- 隐藏物料清单-->
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
<!-- <attribute name="invisible">1</attribute>-->
@@ -166,26 +172,31 @@
<field name="duration" widget="mrp_timer"
attrs="{'invisible': [('production_state','=', 'draft')], 'readonly': [('is_user_working', '=', True)]}"
sum="real duration"/>
<field name="glb_file" readonly="1" widget="Viewer3D" string="加工模型"/>
<field name="processing_panel" readonly="1"
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
<field name="equipment_id"
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
<field name="production_line_state"
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
<field name="functional_fixture_id"
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="functional_fixture_code" force_save="1"
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="functional_fixture_type_id" force_save="1"
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="rfid_code"
<field name="functional_fixture_type_id"
attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
<field name="rfid_code" force_save="1" readonly="1" cache="True"
attrs="{'invisible': [('rfid_code_old', '!=', False)]}"/>
<field name="rfid_code_old" readonly="1" attrs="{'invisible': [('rfid_code_old', '=', False)]}"/>
</group>
<group attrs='{"invisible": [("routing_type","=","获取CNC加工程序")]}'>
<div>
<label for="glb_file" string="加工模型"/>
<field name="glb_file" readonly="1" widget="Viewer3D"/>
</div>
<!-- <field name="glb_file" string="模型" readonly="1" widget="Viewer3D"/>-->
</group>
<!-- <group>-->
<!-- <div>-->
<!-- <label for="glb_file" string="加工模型"/>-->
<!-- <field name="glb_file" readonly="1" widget="Viewer3D"/>-->
<!-- </div>-->
<!-- &lt;!&ndash; <field name="glb_file" string="模型" readonly="1" widget="Viewer3D"/>&ndash;&gt;-->
<!-- </group>-->
<!-- <field name="processing_panel" readonly="1" attrs="{'invisible': [('routing_type', 'in', ('获取CNC加工程序','装夹','解除装夹',-->
<!-- '前置三元定位检测','后置三元质量检测','解除装夹'))]}"/>-->
@@ -199,12 +210,12 @@
<field name="programming_state" readonly="1"
attrs='{"invisible": [("programming_no","=",False)]}'/>
</group>
<group>
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
<button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码"
/>
</div>
</group>
<!-- <group>-->
<!-- <div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">-->
<!-- <button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码"-->
<!-- />-->
<!-- </div>-->
<!-- </group>-->
</page>
</xpath>
<!-- <page string="Components" name="components">-->
@@ -232,6 +243,7 @@
<!-- </page>-->
<page string="工件装夹" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'>
<group>
<field name="_barcode_scanned" widget="barcode_handler"/>
<group string="卡盘">
<field name="chuck_serial_number"/>
<field name="chuck_name"/>
@@ -240,7 +252,6 @@
<field name="chuck_model_id"/>
</group>
<group string="托盘">
<field name="_barcode_scanned" widget="barcode_handler"/>
<field name="tray_serial_number" readonly="1" string="序列号"/>
<field name="tray_product_id" readonly="1" string="名称"/>
<field name="tray_brand_id" readonly="1" string="品牌"/>
@@ -397,8 +408,11 @@
</div>
<div class="col-12 col-lg-6 o_setting_box">
<field name="data_state" invisible="1"/>
<button type="object" class="oe_highlight" name="get_three_check_datas" string="获取数据"
attrs='{"invisible": ["|", "|", "|", ("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False), ("data_state", "=", True)]}'/>
<button type="object" class="oe_highlight" name="getcenter" string="计算定位"
attrs='{"invisible": ["|","|",("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False)]}'/>
attrs='{"invisible": ["|","|", "|",("material_center_point","!=",False),("state","!=","progress"),("user_permissions","=",False), ("data_state", "=", False)]}'/>
</div>
<group>
@@ -411,8 +425,10 @@
<tree editable="bottom">
<field name="production_id" invisible="1"/>
<field name="workpiece_code"/>
<field name="feeder_station_start" force_save="1"/>
<field name="feeder_station_destination"/>
<field name="route_id" options="{'no_create': True}"/>
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
<field name="cnc_program_down_state" readonly="1"/>
<field name="production_line_id"/>
<field name="task_delivery_time" readonly="1"/>
<field name="task_completion_time" readonly="1"/>
@@ -427,19 +443,22 @@
<field name="results" invisible="1"/>
<page string="后置三元检测" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<group>
<field name="test_results" widget="selection" attrs='{"invisible":[("results","!=",False)]}'/>
<field name="test_results" attrs='{"invisible":[("results","!=",False)]}'/>
<field name="is_remanufacture" attrs='{"invisible":[("test_results","=","合格")]}'/>
<field name="results" readonly="1" attrs='{"invisible":[("results","!=","合格")]}'/>
<field name="detection_report" attrs='{"invisible":[("results","!=",False)]}'
widget="pdf_viewer"/>
</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>
<!-- <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>
</xpath>
<xpath expr="//page[1]" position="before">
<page string="CNC程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<field name="cnc_ids" widget="one2many" string="工作程序">
<field name="cnc_ids" widget="one2many" string="工作程序" default_order="sequence_number,id">
<tree decoration-success="button_state" decoration-bf="button_state">
<field name="sequence_number"/>
<field name="program_name"/>
@@ -461,6 +480,25 @@
<field name="cnc_worksheet" string="工作指令" widget="pdf_viewer"/>
</group>
</page>
<page string="CMM程序" attrs='{"invisible": [("routing_type","!=","CNC加工")]}'>
<field name="cmm_ids" widget="one2many" string="CMM程序">
<tree>
<field name="sequence_number"/>
<field name="program_name"/>
<field name="cmm_id" string="文件"/>
<field name="cutting_tool_name"/>
<field name="cutting_tool_no"/>
<field name="processing_type"/>
<field name="margin_x_y"/>
<field name="margin_z"/>
<field name="depth_of_processing_z"/>
<field name="cutting_tool_extension_length"/>
<field name="cutting_tool_handle_type"/>
<field name="estimated_processing_time"/>
<field name="remark"/>
</tree>
</field>
</page>
</xpath>
<xpath expr="//page[1]" position="before">
<page string="解除装夹" attrs='{"invisible": [("routing_type","!=","解除装夹")]}'>
@@ -478,7 +516,7 @@
</page>
</xpath>
<xpath expr="//form//sheet//group//group//div[1]" position="after">
<label for="date_start" string="实际开始时间"/>
<label for="date_start" string="实际加工时间"/>
<div class="oe_inline">
<field name="date_start" class="mr8 oe_inline"/>
<strong class="mr8 oe_inline"></strong>
@@ -489,6 +527,8 @@
<field name="is_ok"/>
<field name="processing_user_id"/>
<field name="inspection_user_id"/>
<field name="save_name" widget="CopyClipboardChar"
attrs="{'invisible':[('routing_type','!=','装夹预调')]}"/>
</xpath>
</field>
</record>
@@ -519,9 +559,9 @@
<field name="name">工件配送</field>
<field name="model">sf.workpiece.delivery</field>
<field name="arch" type="xml">
<tree string="工件配送">
<tree string="工件配送" editable="bottom" class="center" create="0" delete="0">
<header>
<button name="button_delivery" type="object" string="配送"/>
<button name="button_delivery" type="object" string="配送" class="oe_highlight"/>
</header>
<field name="status" widget="badge"
decoration-success="status == '已配送'"
@@ -529,11 +569,13 @@
decoration-danger="status == '待配送'"/>
<field name="production_id" string="工件编码"/>
<field name="workpiece_code"/>
<field name="production_line_id"/>
<field name="feeder_station_start"/>
<field name="feeder_station_destination"/>
<field name="task_delivery_time"/>
<field name="task_completion_time"/>
<field name="production_line_id" options="{'no_create': True}"/>
<field name="route_id" options="{'no_create': True}"/>
<field name="feeder_station_start_id" readonly="1" force_save="1"/>
<field name="feeder_station_destination_id" readonly="1" force_save="1"/>
<field name="cnc_program_down_state" readonly="1"/>
<field name="task_delivery_time" readonly="1"/>
<field name="task_completion_time" readonly="1"/>
<field name="delivery_duration" widget="float_time"/>
</tree>
</field>
@@ -546,16 +588,19 @@
<search string="工件配送">
<field name="production_id"/>
<field name="workpiece_code"/>
<field name="feeder_station_start"/>
<field name="feeder_station_start_id"/>
<field name="production_line_id"/>
<field name="task_delivery_time"/>
<field name="feeder_station_destination"/>
<field name="feeder_station_destination_id"/>
<field name="task_completion_time"/>
<field name="delivery_duration"/>
<field name="status"/>
<searchpanel>
<field name="production_line_id" icon="fa-building" enable_counters="1"/>
<field name="status" icon="fa-building" enable_counters="1"/>
<field name="production_line_state" icon="fa-building" enable_counters="1"/>
<field name="cnc_program_down_state" icon="fa-building" enable_counters="1"/>
</searchpanel>
</search>
</field>

View File

@@ -1,23 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
设备增加刀具库位table
<!-- 设备增加刀具库位table-->
<record id="sf_manufacturing_hr_equipment_view_form" model="ir.ui.view">
<field name="name">sf_manufacturing_equipment.form</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="sf_maintenance.sf_hr_equipment_view_form"/>
<field name="arch" type="xml">
<field name="arch" type="xml">
<xpath expr="//page[@name='sf_equipment']" position="after">
<page string="标准刀库" name="sf_equipment_product_template"
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
<field name = 'product_template_ids' >
<tree editable='bottom'>
<field name="code"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
<page string="机床基坐标" name="sf_equipment_base_coordinate"
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
<button name="get_equipment_base_coordinate" string="获取基坐标数据" type="object"
class="oe_highlight"/>
<separator invisible="0"/>
<group>
<group>
<field name="base_coordinate_fixture_model_id" options="{'no_create': True}"/>
<field name="base_coordinate_g_coordinate"/>
<field name="base_coordinate_x"/>
<field name="base_coordinate_y"/>
<field name="base_coordinate_z"/>
</group>
</group>
</page>
<page string="标准刀库" name="sf_equipment_product_template"
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
<field name='product_template_ids'>
<tree editable='bottom'>
<field name="code"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
</odoo>

View File

@@ -10,9 +10,15 @@
</xpath>
<xpath expr="//sheet" position="before">
<header>
<button string="打印二维码" name="print_qr_code" type="object" class="btn-primary"/>
<button string="打印二维码" name="print_single_method" type="object" class="btn-primary"/>
</header>
</xpath>
<xpath expr="//field[@name='product_id']" position="before">
<field name="rfid" attrs="{'invisible': [('rfid', '=', False)]}"/>
</xpath>
<xpath expr="//field[@name='product_id']" position="after">
<field name="product_specification"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -5,12 +5,18 @@
<field name="model">sf.workpiece.delivery.wizard</field>
<field name="arch" type="xml">
<form>
<field name="delivery_id" invisible="True"/>
<group>
<field name="delivery_id" invisible="True"/>
<field name="workorder_id" invisible="True"/>
<field name="route_id" required="1" options="{'no_create': True}"/>
</group>
<div>
是否确定配送?
<field name="is_ok"/>
确认上述信息正确无误.
</div>
<footer>
<button string="确认" name="confirm" type="object" class="oe_highlight"/>
<button string="确认配送" name="confirm" type="object" class="oe_highlight"
attrs="{'invisible':[('is_ok','=',False)]}"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</form>

View File

@@ -10,7 +10,12 @@ class WorkpieceDeliveryWizard(models.TransientModel):
_description = '工件配送'
delivery_id = fields.Many2one('sf.workpiece.delivery', string='配送')
workorder_id = fields.Many2one('mrp.workorder', string='工单')
route_id = fields.Many2one('sf.agv.task.route', '任务路线')
is_ok = fields.Boolean('确认上述信息正确无误.')
def confirm(self):
self.delivery_id._delivery_avg()
if self.workorder_id:
self.workorder_id.workpiece_delivery_ids._delivery_avg()
else:
self.delivery_id._delivery_avg()

View File

@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
import logging
import os
import json
import base64
from odoo import http
@@ -42,8 +43,19 @@ class Sf_Mrs_Connect(http.Controller):
res['message'] = '制造订单号为%s的CNC程序文件从FTP拉取失败' % (cnc_production.name)
return json.JSONEncoder().encode(res)
logging.info('创建cnc工单')
request.env['sf.cnc.processing'].with_user(
request.env.ref("base.user_admin")).cnc_processing_create(cnc_production, ret)
program_path_tmp = os.path.join('/tmp', ret['folder_name'], 'return', r)
# program_path_tmp = "C://Users//43484//Desktop//机企猫工作文档//其他//model_analysis"
files = os.listdir(program_path_tmp)
for f in files:
program_path = os.path.join(program_path_tmp, f)
logging.info('cnc程序路径 :%s' % program_path)
if f.endswith(".doc"):
# 插入cmm程序数据
request.env['sf.cmm.program'].with_user(
request.env.ref("base.user_admin")).cmm_program_create(ret, program_path, program_path_tmp)
request.env['sf.cnc.processing'].with_user(
request.env.ref("base.user_admin")).cnc_processing_create(cnc_production, ret, program_path,
program_path_tmp)
return json.JSONEncoder().encode(res)
else:
res = {'status': 0, 'message': '该制造订单暂未开始'}

View File

@@ -21,14 +21,32 @@ class FtpController():
except Exception:
logging.info("ftp连接失败")
def file_exists(self, path):
# 检查文件是否存在于FTP服务器上
try:
self.ftp.cwd(os.path.dirname(path))
files = self.ftp.nlst()
return os.path.basename(path) in files
except Exception as e:
logging.error(f"Error checking file: {e}")
return False
# 下载目录下的文件
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)
logging.info('目录:%s' % target_dir)
target_dir1 = target_dir.split('/')
logging.info('目录1:%s' % target_dir1[1])
self.ftp.cwd(target_dir1[1]) # 切换工作路径
logging.info('目录2:%s' % target_dir1[2])
self.ftp.cwd(target_dir1[2]) # 切换工作路径
logging.info('目录3:%s' % target_dir1[3])
self.ftp.cwd(target_dir1[3]) # 切换工作路径
logging.info('目录4:%s' % target_dir1[4])
self.ftp.cwd(target_dir1[4]) # 切换工作路径
remotenames = self.ftp.nlst()
logging.info('FTP目录文件:%s' % remotenames)
for file in remotenames:
@@ -38,6 +56,34 @@ class FtpController():
return 1
except Exception:
return 0
finally:
self.ftp.quit()
logging.info("ftp已关闭")
# 下载目录下的检测文件
def download_reportfile_tree(self, target_dir, serverdir, reportpath):
if not os.path.exists(serverdir):
os.makedirs(serverdir)
try:
logging.info("进入FTP目录-检测文件")
logging.info('serverdir:%s' % serverdir)
target_dir1 = target_dir.split('/')
logging.info('目录1:%s' % target_dir1[1])
self.ftp.cwd(target_dir1[1]) # 切换工作路径
logging.info('目录2:%s' % target_dir1[2])
self.ftp.cwd(target_dir1[2]) # 切换工作路径
logging.info('目录2:%s' % target_dir1[3])
self.ftp.cwd(target_dir1[3]) # 切换工作路径
remotenames = self.ftp.nlst()
logging.info('FTP目录检测报告文件:%s' % remotenames)
for filename in remotenames:
if os.path.basename(filename) == os.path.basename(reportpath):
server = os.path.join(serverdir, filename)
logging.info('server%s' % server)
self.download_file(server, filename)
return 1
except Exception:
return 0
# 下载指定目录下的指定文件
def download_file(self, serverfile, remotefile):

View File

@@ -13,7 +13,13 @@ class ResConfigSettings(models.TransientModel):
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')
agv_url = fields.Char(string='avg访问地址', default='http://IP:PORT/rcms/services/rest')
agv_rcs_url = fields.Char(string='avg_rcs访问地址',
default='http://172.16.10.114:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask')
center_control_url = fields.Char(string='中控访问地址',
default='http://172.16.21.50:8001')
wbcode = fields.Char('地码')
agv_code = fields.Char(string='agv编号')
task_type_no = fields.Char('任务单类型编号')
model_parser_url = fields.Char('特征识别路径')
ftp_host = fields.Char(string='FTP的ip')
ftp_port = fields.Char(string='FTP端口')
@@ -34,8 +40,8 @@ class ResConfigSettings(models.TransientModel):
_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.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()
@@ -58,6 +64,8 @@ class ResConfigSettings(models.TransientModel):
_logger.info("同步联装类型完成")
self.env['sf.fixture.model'].sync_all_fixture_model()
_logger.info("同步夹具型号完成")
self.env['sf.fixture.materials.basic.parameters'].sync_all_fixture_materials_basic_parameters()
_logger.info("同步夹具型号基本信息完成")
self.env['sf.functional.fixture.type'].sync_all_functional_fixture_type()
_logger.info("同步夹具型号类型完成")
self.env['sf.machine_tool.type'].sync_all_machine_tool_type()
@@ -90,7 +98,10 @@ class ResConfigSettings(models.TransientModel):
token = config.get_param('token', default='')
sf_secret_key = config.get_param('sf_secret_key', default='')
sf_url = config.get_param('sf_url', default='')
bfm_url = config.get_param('bfm_url', default='')
agv_rcs_url = config.get_param('agv_rcs_url', default='')
wbcode = config.get_param('wbcode', default='')
agv_code = config.get_param('agv_code', default='')
center_control_url = config.get_param('center_control_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='')
@@ -100,7 +111,10 @@ class ResConfigSettings(models.TransientModel):
token=token,
sf_secret_key=sf_secret_key,
sf_url=sf_url,
bfm_url=bfm_url,
agv_rcs_url=agv_rcs_url,
wbcode=wbcode,
agv_code=agv_code,
center_control_url=center_control_url,
ftp_host=ftp_host,
ftp_port=ftp_port,
ftp_user=ftp_user,
@@ -114,7 +128,10 @@ class ResConfigSettings(models.TransientModel):
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("bfm_url", self.bfm_url or "")
ir_config.set_param("agv_rcs_url", self.agv_rcs_url or "")
ir_config.set_param("wbcode", self.wbcode or "")
ir_config.set_param("agv_code", self.agv_code or "")
ir_config.set_param("center_control_url", self.center_control_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 "")

File diff suppressed because it is too large Load Diff

View File

@@ -74,9 +74,44 @@
</div>
</div>
</div>
<div>
<h2>AGV参数配置</h2>
<div class="row mt16 o_settings_container">
<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="agv_rcs_url" string="访问地址"/>
<field name="agv_rcs_url"/>
</div>
<div class="text-muted">
<label for="agv_code" string="车辆编号"/>
<field name="agv_code"/>
</div>
<div class="text-muted">
<label for="wbcode"/>
<field name="wbcode"/>
</div>
</div>
</div>
</div>
</div>
<div>
<h2>中控参数配置</h2>
<div class="row mt16 o_settings_container">
<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="center_control_url" string="访问地址"/>
<field name="center_control_url"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -44,18 +44,19 @@ class sf_production_plan(models.Model):
production_id = fields.Many2one('mrp.production', '关联制造订单')
product_qty = fields.Float(string='数量', digits='Product Unit of Measure', required=True, default=0.0)
production_line_id = fields.Many2one('sf.production.line', string='生产线')
date_planned_start = fields.Datetime(string='计划开始时间', required=True, index=True, copy=False,
default=fields.Datetime.now)
# date_planned_start = fields.Datetime(string='计划开始时间', required=True, index=True, copy=False,
# default=fields.Datetime.now)
date_planned_start = fields.Datetime(string='计划开始时间')
date_planned_finished = fields.Datetime(string='计划结束时间')
# 排程设置selection(倒排,顺排,默认倒排)
schedule_setting = fields.Selection([
('reverse', '倒排'), ('positive', '顺排')], string='排程设置', default='reverse')
product_id = fields.Many2one('product.product', '关联产品')
origin = fields.Char(string='订单号')
# 加工时长
process_time = fields.Float(string='加工时长', digits=(16, 2))
# # 加工时长
# process_time = fields.Float(string='加工时长', digits=(16, 2))
# 实际加工时长、实际开始时间、实际结束时间
actual_process_time = fields.Float(string='实际加工时长', digits=(16, 2))
actual_process_time = fields.Float(string='实际加工时长(分钟)', digits=(16, 2), compute='_compute_actual_process_time')
actual_start_time = fields.Datetime(string='实际开始时间')
actual_end_time = fields.Datetime(string='实际结束时间')
shift = fields.Char(string='班次')
@@ -67,16 +68,25 @@ class sf_production_plan(models.Model):
sequence = fields.Integer(string='序号', copy=False, readonly=True, index=True)
current_operation_name = fields.Char(string='当前工序名称', size=64, default='生产计划')
# 计算实际加工时长
@api.depends('actual_start_time', 'actual_end_time')
def _compute_actual_process_time(self):
for item in self:
if item.actual_start_time and item.actual_end_time:
item.actual_process_time = (item.actual_end_time - item.actual_start_time).total_seconds() / 60
else:
item.actual_process_time = None
@api.onchange('production_line_id')
def _compute_production_line_id(self):
for item in self:
item.sudo().production_id.production_line_id = item.production_line_id.id
item.sudo().production_id.plan_start_processing_time = item.date_planned_start
# item.sudo().production_id.plan_start_processing_time = item.date_planned_start
@api.onchange('state')
def _onchange_state(self):
if self.state == 'finished':
self.production_id.schedule_state = '已完成'
# @api.onchange('state')
# def _onchange_state(self):
# if self.state == 'finished':
# self.production_id.schedule_state = '已完成'
# @api.model
# def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None):
@@ -189,7 +199,9 @@ class sf_production_plan(models.Model):
for item in record.production_id.workorder_ids:
if item.name == 'CNC加工':
item.date_planned_finished = datetime.now() + timedelta(days=100)
item.date_planned_start = record.date_planned_start
# item.date_planned_start = record.date_planned_start
item.date_planned_start = datetime.now()
record.sudo().production_id.plan_start_processing_time = item.date_planned_start
item.date_planned_finished = item.date_planned_start + timedelta(
minutes=record.env['mrp.routing.workcenter'].sudo().search(
[('name', '=', 'CNC加工')]).time_cycle)
@@ -282,6 +294,7 @@ class sf_production_plan(models.Model):
print('时间设置失败,请检查是否为工序分配工作中心,%s' % e)
def cancel_production_schedule(self):
self.date_planned_start = False
self.date_planned_finished = False
self.state = 'draft'
self.production_line_id = False

View File

@@ -10,7 +10,7 @@
<header>
<!-- <button name="do_production_schedule" type="object" string="批量排程"/> -->
<button string="批量排程" name="%(sf_plan.action_plan_some)d" type="action"
class="btn-primary"/>
class="treeHeaderBtn"/>
</header>
<field name="state" widget="badge" decoration-warning="state == 'draft'"
decoration-success="state == 'done'" decoration-info="state == 'processing'"
@@ -22,12 +22,15 @@
<field name="production_line_id"/>
<field name="date_planned_start"/>
<field name="date_planned_finished"/>
<field name="actual_start_time"/>
<field name="actual_end_time"/>
<field name="actual_process_time"/>
<field name="schedule_setting"/>
<button name="do_production_schedule" class="btn schedule_done" string="生产排程" type="object"
attrs="{'invisible': [('state', 'not in', ['draft'])]}"
attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('actual_start_time', '!=', False)]}"
groups="sf_base.group_plan_dispatch"/>
<button name="cancel_production_schedule" class="btn schedule_cancel" string="取消排程"
type="object" attrs="{'invisible': [('state', 'not in', ['done'])]}"
<button name="cancel_production_schedule" class="btn schedule_cancel" string="取消排程" type="object"
attrs="{'invisible': ['|', ('state', '!=', 'done'), ('actual_start_time', '!=', False)]}"
groups="sf_base.group_plan_dispatch"/>
</tree>
</field>
@@ -42,9 +45,9 @@
<!-- <button string="执行排程" name="do_production_schedule" type="object" class="oe_highlight" icon="fa-step-forward"/> -->
<button string="执行排程" name="do_production_schedule" type="object" class="oe_highlight"
options='{"calendar_view": true, "date_begin": "2020-01-01", "date_end": "2020-12-31"}'
groups="sf_base.group_plan_dispatch" attrs="{'invisible': [('state', '=', 'done')]}"/>
groups="sf_base.group_plan_dispatch" attrs="{'invisible': ['|', ('state', '!=', 'draft'), ('actual_start_time', '!=', False)]}"/>
<button string="取消排程" name="cancel_production_schedule" type="object" class="oe_highlight"
groups="sf_base.group_plan_dispatch" attrs="{'invisible': [('state', '=', 'draft')]}"/>
groups="sf_base.group_plan_dispatch" attrs="{'invisible': ['|', ('state', '!=', 'done'), ('actual_start_time', '!=', False)]}"/>
<!-- <button name="archive" type="object" string="归档" icon="fa-archive" class="oe_highlight" attrs="{'invisible': [('active', '=', False)]}"/> -->
<!-- <button name="unarchive" type="object" string="取消归档" icon="fa-archive" class="oe_highlight" attrs="{'invisible': [('active', '=', True)]}"/> -->
@@ -66,10 +69,26 @@
<field name="origin"/>
<field name="product_qty"/>
<field name="order_deadline"/>
<field name="process_time"/>
<!-- <field name="process_time"/> -->
<field name="schedule_setting"/>
<field name="production_line_id"/>
<field name="date_planned_start"/>
<field name="production_line_id" domain="[('name', 'ilike', 'CNC')]"/>
<!-- Chatter -->
<!-- <div class="oe_chatter"> -->
<!-- <field name="message_follower_ids" widget="mail_followers"/> -->
<!-- <field name="message_ids" widget="mail_thread"/> -->
<!-- <field name="activity_ids"/> -->
<!-- </div> -->
<!-- <div class="oe_chatter"> -->
<!-- <field name="message_follower_ids"/> -->
<!-- <field name="message_ids"/> -->
<!-- </div> -->
</group>
<group string="加工信息">
<field name="date_planned_start" placeholder="如果不选择计划开始时间,会取当前时间来做排程"/>
<field name="date_planned_finished"/>
<field name="actual_process_time"/>
<field name="actual_start_time"/>
@@ -83,10 +102,7 @@
<!-- <field name="message_ids" widget="mail_thread"/> -->
<!-- <field name="activity_ids"/> -->
<!-- </div> -->
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</group>
<!-- <group string="规格信息" col="1"> -->
<!-- <group col="3"> -->
@@ -119,6 +135,10 @@
<!-- <field name="delivery_quantity"/> -->
<!-- <field name="delivery_date"/> -->
<!-- </group> -->
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</group>
</sheet>
</form>

View File

@@ -6,7 +6,7 @@
<field name="arch" type="xml">
<form>
<group>
<field name="production_line_id"/>
<field name="production_line_id" domain="[('name', 'ilike', 'CNC')]"/>
</group>
<footer>
<button string="确认排程" name="action_plan_all" type="object" class="btn-primary"/>

View File

@@ -25699,7 +25699,7 @@ msgstr "控制点"
#. module: quality_control
#: model:ir.ui.menu,name:quality_control.menu_quality_control_points
msgid "Control Points"
msgstr "控制点"
msgstr "质量标准"
#. module: purchase
#: model:ir.model.fields,field_description:purchase.field_product_product__purchase_method
@@ -25719,7 +25719,7 @@ msgstr "控制面板按钮"
#: model:ir.model.fields,field_description:quality_control.field_quality_check_wizard__measure_on
#: model:ir.model.fields,field_description:quality_control.field_quality_point__measure_on
msgid "Control per"
msgstr "每次控制"
msgstr "控制方式"
#. module: base
#: model:ir.module.module,summary:base.module_quality_control
@@ -60648,7 +60648,7 @@ msgstr "质量控制点 数量"
#. module: quality_control
#: model:ir.actions.act_window,name:quality_control.quality_point_action
msgid "Quality Control Points"
msgstr "质量管理点"
msgstr "质量控制标准"
#. module: quality
#: model:ir.model,name:quality.model_quality_point_test_type
@@ -75621,7 +75621,7 @@ msgstr "二氧化钛"
#: model:ir.model.fields,field_description:quality_control.field_quality_check_wizard__title
#: model_terms:ir.ui.view,arch_db:mrp_workorder.add_quality_check_from_tablet
msgid "Title"
msgstr "称"
msgstr "称"
#. modules: account, mail, base, stock, mrp
#: model:ir.model.fields,field_description:account.field_account_automatic_entry_wizard__destination_account_id

View File

@@ -16,7 +16,7 @@
'depends': ['quality_control'],
'data': [
'security/ir.model.access.csv',
# 'views/view.xml'
'views/view.xml'
],
'assets': {

View File

@@ -11,26 +11,3 @@ class SfQualityPoint(models.Model):
"('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", help=
"Quality Point will apply to every selected Products.")
check_state = fields.Selection([
('enable', '启用'),
('close', '关闭')
], string='审核状态', default='close')
# 审核
def action_check(self):
self.check_state = 'enable'
# picking_type_ids = fields.Many2many(
# 'stock.picking.type', string='执行节点', required=True, check_company=True)
class ResQualityAlertTeam(models.Model):
_inherit = 'quality.alert.team'
check_state = fields.Selection([
('enable', '启用'),
('close', '关闭')
], string='审核状态', default='close')
# 审核
def action_check(self):
self.check_state = 'enable'

View File

@@ -1,34 +1,40 @@
import json
import requests
import logging
from odoo import fields, models, api
from odoo.exceptions import ValidationError
from datetime import datetime
from odoo.addons.sf_base.commons.common import Common
class QualityCheck(models.Model):
_inherit = "quality.check"
_description = '零件特采'
# ==========零件特采接口==========
def _register_tool_groups(self):
create_url = '/AutoDeviceApi/ModSpecial'
sf_sync_config = self.env['res.config.settings'].get_values()
token = sf_sync_config['token']
sf_secret_key = sf_sync_config['sf_secret_key']
headers = Common.get_headers(self, token, sf_secret_key)
strurl = sf_sync_config['sf_url'] + create_url
val = {
'RfidCode': None,
}
kw = json.dumps(val, ensure_ascii=False)
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
def _register_quality_check(self):
# create_url = '/AutoDeviceApi/PartSpecProc'
# sf_sync_config = self.env['res.config.settings'].get_values()
# token = sf_sync_config['token']
# sf_secret_key = sf_sync_config['sf_secret_key']
# headers = Common.get_headers(self, token, sf_secret_key)
headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'}
crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/PartSpecProc"
origin = self.picking_id.origin
production_id = self.env['mrp.production'].sudo().search([('name', '=', origin)])
rfid = '' if not production_id.workorder_ids else production_id.workorder_ids[-1].rfid_code or ''
val = [rfid]
r = requests.post(crea_url, json=val, headers=headers)
ret = r.json()
if r == 200:
logging.info('_register_quality_check:%s' % ret)
if ret['Succeed']:
return "零件特采发送成功"
else:
raise ValidationError("零件特采发送失败")
# @api.onchange('quality_state')
# def _onchange_quality_state(self):
# if self.quality_state in ['pass', 'fail']:
# self._register_tool_groups()
def do_fail(self):
self.write({
'quality_state': 'fail',
'user_id': self.env.user.id,
'control_date': datetime.now()})
if self.picking_id and 'WH/MO/' in self.picking_id.origin:
self._register_quality_check()

View File

@@ -43,8 +43,6 @@ access_quality_alert_team_group_sf_mrp_manager,quality_alert_team_group_sf_mrp_m
access_product_template_group_quality,product_template_group_quality,product.model_product_template,sf_base.group_quality,1,0,0,0
access_product_template_group_quality_director,product_template_group_quality_director,product.model_product_template,sf_base.group_quality_director,1,0,0,0
access_product_template_group_plan_dispatch,product_template_group_plan_dispatch,product.model_product_template,sf_base.group_plan_dispatch,1,0,0,0
access_product_template_group_plan_director,product_template_group_plan_director,product.model_product_template,sf_base.group_plan_director,1,0,0,0
access_product_template_group_sf_equipment_user,product_template_group_sf_equipment_user,product.model_product_template,sf_base.group_sf_equipment_user,1,0,0,0
access_product_template_group_sf_tool_user,product_template_group_sf_tool_user,product.model_product_template,sf_base.group_sf_tool_user,1,0,0,0
access_product_template_group_sf_order_user,product_template_group_sf_order_user,product.model_product_template,sf_base.group_sf_order_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
43 access_product_template_group_plan_director access_product_template_group_sf_tool_user product_template_group_plan_director product_template_group_sf_tool_user product.model_product_template sf_base.group_plan_director sf_base.group_sf_tool_user 1 0 0 0
44 access_product_template_group_sf_equipment_user access_product_template_group_sf_order_user product_template_group_sf_equipment_user product_template_group_sf_order_user product.model_product_template sf_base.group_sf_equipment_user sf_base.group_sf_order_user 1 0 0 0
45 access_product_template_group_sf_tool_user access_product_template_group_sf_mrp_manager product_template_group_sf_tool_user product_template_group_sf_mrp_manager product.model_product_template sf_base.group_sf_tool_user sf_base.group_sf_mrp_manager 1 0 0 0
access_product_template_group_sf_order_user product_template_group_sf_order_user product.model_product_template sf_base.group_sf_order_user 1 0 0 0
access_product_template_group_sf_mrp_manager product_template_group_sf_mrp_manager product.model_product_template sf_base.group_sf_mrp_manager 1 0 0 0
46 access_product_template_group_equipment_user product_template_group_equipment_user product.model_product_template sf_maintenance.sf_group_equipment_user 1 0 0 0
47 access_product_template_group_equipment_manager product_template_group_equipment_manager product.model_product_template sf_maintenance.sf_group_equipment_manager 1 0 0 0
48 access_quality_alert_stage_group_quality quality_alert_stage_group_quality quality.model_quality_alert_stage sf_base.group_quality 1 0 0 0

View File

@@ -6,6 +6,8 @@
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<tree sample="1">
<field name="name" decoration-bf="1"/>
<field name="name" decoration-bf="1"/>
<field name="name" decoration-bf="1"/>
<field name="product_tmpl_id" optional="show"/>
<field name="product_id" optional="hide"/>
@@ -37,27 +39,30 @@
<field name="model">quality.point</field>
<field name="inherit_id" ref="quality.quality_point_view_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<field name="check_state" invisible="1"/>
<button name="action_check" string="审核" type="object"
attrs="{'invisible': [('check_state','=', 'enable')]}"
groups="sf_base.group_quality_director"
class="oe_highlight"/>
<!-- <xpath expr="//sheet//group//group//field[@name='title']" position="replace"> -->
<!-- <field name="title" class="custom_required" required="1"/> -->
<!-- </xpath> -->
<xpath expr="//sheet//group//group//field[@name='title']" position="attributes">
<attribute name="class">custom_required</attribute>
<attribute name="required">1</attribute>
</xpath>
<xpath expr="//sheet//group//group//field[@name='picking_type_ids']" position="attributes">
<attribute name="class">custom_required</attribute>
<attribute name="required">1</attribute>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="quality_alert_team_view_form_inherit_sf">
<field name="name">quality.alert.team.form.inherit.sf</field>
<field name="model">quality.alert.team</field>
<field name="inherit_id" ref="quality_control.quality_alert_team_view_form"/>
<record model="ir.ui.view" id="sf_quality_point_view_form_inherit_quality_control">
<field name="name">sf.quality.point.form.inherit.sf</field>
<field name="model">quality.point</field>
<field name="inherit_id" ref="quality_control.quality_point_view_form_inherit_quality_control"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<field name="check_state" invisible="1"/>
<button name="action_check" string="审核" type="object"
attrs="{'invisible': [('check_state','=', 'enable')]}"
groups="sf_base.group_quality_director"
class="oe_highlight"/>
<xpath expr="//field[@name='measure_on']" position="attributes">
<attribute name="class">custom_required</attribute>
</xpath>
<xpath expr="//field[@name='measure_frequency_type']" position="attributes">
<attribute name="class">custom_required</attribute>
</xpath>
</field>
</record>

View File

@@ -10,7 +10,7 @@
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase'],
'depends': ['sale', 'sale_management', 'web_widget_model_viewer', 'sf_base', 'account', 'purchase', 'delivery'],
'data': [
'security/group_security.xml',
'security/ir.model.access.csv',

View File

@@ -1,5 +1,6 @@
from . import sale_order
from . import quick_easy_order
# from . import quick_easy_order
from . import quick_easy_order_old
from . import auto_quatotion_common
from . import parser_and_calculate_work_time
from . import preload_datas_functions

View File

@@ -2,7 +2,7 @@
import logging
from odoo.modules import get_resource_path
from odoo import fields, models, api
from quatotion import readSql, feature_recognize, auto_quatotion
# from quatotion import readSql, feature_recognize, auto_quatotion
__author__ = 'jinling.yang'
_logger = logging.getLogger(__name__)

View File

@@ -0,0 +1,311 @@
import logging
import base64
import hashlib
import requests
import os
from datetime import datetime
from stl import mesh
# from OCC.Core.GProp import GProp_GProps
# from OCC.Extend.DataExchange import read_step_file
# from OCC.Extend.DataExchange import write_stl_file
from odoo.addons.sf_base.commons.common import Common
from odoo import models, fields, api
from odoo.modules import get_resource_path
from odoo.exceptions import ValidationError, UserError
class QuickEasyOrder(models.Model):
_name = 'quick.easy.order'
_description = '简易下单'
_order = 'id desc'
name = fields.Char('订单编号', default=lambda self: self.env['ir.sequence'].next_by_code('quick.easy.order'))
model_length = fields.Float('长(mm)', digits=(16, 3))
model_width = fields.Float('宽(mm)', digits=(16, 3))
model_height = fields.Float('高(mm)', digits=(16, 3))
model_volume = fields.Float('体积(mm³)', digits=(16, 3))
model_processing_side = fields.Char('加工面', default='A')
model_feature = fields.Char('特征')
machining_precision = fields.Selection([
('0.10', '±0.10mm'),
('0.05', '±0.05mm'),
('0.03', '±0.03mm'),
('0.02', '±0.02mm'),
('0.01', '±0.01mm')], string='加工精度', default='0.10')
material_id = fields.Many2one('sf.production.materials', '材料')
material_model_id = fields.Many2one('sf.materials.model', '型号', domain="[('materials_id', '=', material_id)]")
# process_id = fields.Many2one('sf.production.process', string='表面工艺')
parameter_ids = fields.Many2many('sf.production.process.parameter', 'process_item_order_rel', string='可选参数')
quantity = fields.Integer('数量', default=1)
unit_price = fields.Float('单价')
price = fields.Float('总价')
model_file = fields.Binary('glb模型文件')
upload_model_file = fields.Many2many('ir.attachment', 'upload_qf_model_file_attachment_ref', string='上传模型文件')
delivery_time = fields.Date('交货日期')
customer_id = fields.Many2one('res.partner', string='客户', default=lambda self: self.env.user.partner_id.id)
state = fields.Selection([('草稿', '草稿'), ('待派单', '待派单'),
('待接单', '待接单'), ('加工中', '加工中'),
('物流中', '物流中'), ('已交付', '已交付')], string='订单状态', default='草稿',
readonly=True)
model_color_state = fields.Selection([
('success', '成功'),
('fail', '失败')], string='模型上色状态')
processing_time = fields.Integer('加工时长(min)')
@api.depends('unit_price', 'quantity')
def _compute_total_amount(self):
for item in self:
item.price = item.unit_price * item.quantity
@api.depends('material_id', 'material_model_id')
def _compute_material_model(self):
for item in self:
materials = self.env['sf.production.materials'].search([], limit=1, order='id desc')
item.material_id = materials.id
item.material_model_id = self.env['sf.materials.model'].search(
[('materials_id', '=', materials.id)],
limit=1, order='id desc')
@api.model
def create(self, vals):
if vals.get('upload_model_file'):
logging.info('create-attachment:%s' % vals['upload_model_file'][0])
for item in vals['upload_model_file']:
print(len(item[2]))
if len(item[2]) > 0:
logging.info('create-attachment:%s' % int(item[2][0]))
attachment = self.env['ir.attachment'].sudo().search([('id', '=', int(item[2][0]))])
base64_data = base64.b64encode(attachment.datas)
base64_datas = base64_data.decode('utf-8')
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
report_path = attachment._full_path(attachment.store_fname)
vals['model_file'] = self.transition_glb_file(report_path, model_code)
obj = super(QuickEasyOrder, self).create(vals)
logging.info('---------向cloud生成模型库记录-------')
self.model_coloring(obj)
logging.info('---------开始派单到工厂-------')
self.distribute_to_factory(obj)
obj.state = '待接单'
return obj
# 将attach的datas内容转为glb文件
def transition_glb_file(self, report_path, model_code):
shapes = read_step_file(report_path)
output_file = os.path.join('/tmp', str(model_code) + '.stl')
write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
# 转化为glb
output_glb_file = os.path.join('/tmp', str(model_code) + '.glb')
util_path = get_resource_path('sf_base', 'static/util')
cmd = 'python3 %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
os.system(cmd)
# 转base64
with open(output_glb_file, 'rb') as fileObj:
image_data = fileObj.read()
base64_data = base64.b64encode(image_data)
return base64_data
# return False
@api.onchange('upload_model_file')
def onchange_model_file(self):
for item in self:
if len(item.upload_model_file) > 1:
raise ValidationError('只允许上传一个文件')
if item.upload_model_file:
file_attachment_id = item.upload_model_file[0]
# 附件路径
report_path = file_attachment_id._full_path(file_attachment_id.store_fname)
logging.info("模型路径: %s" % report_path)
base64_data = base64.b64encode(file_attachment_id.datas)
base64_datas = base64_data.decode('utf-8')
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
# 读取文件
shapes = read_step_file(report_path)
# # 第一种获取体积方式
# props = GProp_GProps()
# # brepgprop_VolumeProperties(shapes, props)
# volume = props.Mass()
# # print(volume)
# item.model_volume = volume
# # 长宽高/体积
# output_file = os.path.join('C:/Users/43484/Desktop/机企猫工作文档', str(model_code) + '.stl')
output_file = os.path.join('/tmp', str(model_code) + '.stl')
# your_mesh = mesh.Mesh.from_file(output_file)
# volume, cog, inertia = your_mesh.get_mass_properties()
# xyz = (your_mesh.max_ - your_mesh.min_)
# item.model_length = xyz[0] # 长 单位mm
# item.model_width = xyz[1] # 宽
# item.model_height = xyz[2] # 高
# item.model_volume = volume
write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
# 转化为glb
# output_glb_file = os.path.join('C:/Users/43484/Desktop/机企猫工作文档', str(model_code) + '.glb')
output_glb_file = os.path.join('/tmp', str(model_code) + '.glb')
util_path = get_resource_path('sf_base', 'static/util')
cmd = 'python3 %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
os.system(cmd)
# 转base64
with open(output_glb_file, 'rb') as fileObj:
image_data = fileObj.read()
base64_data = base64.b64encode(image_data)
item.model_file = base64_data
else:
item.model_length = False
item.model_width = False
item.model_height = False
item.model_volume = False
item.model_file = False
def distribute_to_factory(self, obj):
"""
派单到工厂
:return:
"""
try:
logging.info('---------派单到工厂-------')
res = {'bfm_process_order_list': []}
for item in obj:
attachment = item.upload_model_file[0]
base64_data = base64.b64encode(attachment.datas)
base64_datas = base64_data.decode('utf-8')
barcode = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
# logging.info('model_file-size: %s' % len(item.model_file))
res['bfm_process_order_list'].append({
'model_long': item.model_length,
'model_width': item.model_width,
'model_height': item.model_height,
'model_volume': item.model_volume,
'model_machining_precision': item.machining_precision,
'model_name': attachment.name,
'model_data': base64_datas,
'model_file': base64.b64encode(item.model_file).decode('utf-8'),
'texture_code': item.material_id.materials_no,
'texture_type_code': item.material_model_id.materials_no,
# 'surface_process_code': self.env['jikimo.surface.process']._json_surface_process_code(item),
'process_parameters_code': self.env[
'sf.production.process.parameter']._json_production_process_item_code(
item),
'price': item.price,
'number': item.quantity,
'total_amount': item.price,
'remark': '',
'manual_quotation': True,
'barcode': barcode
})
# res['bfm_process_order_list'] = json.dumps(res['bfm_process_order_list'])
product_id = self.env.ref('sf_dlm.product_template_sf').sudo()
self_machining_id = self.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo()
outsource_id = self.env.ref('sf_dlm.product_embryo_sf_outsource').sudo()
purchase_id = self.env.ref('sf_dlm.product_embryo_sf_purchase').sudo()
company_id = self.env.ref('base.main_company').sudo()
# user_id = request.env.ref('base.user_admin').sudo()
order_id = self.env['sale.order'].sale_order_create(company_id, 'XXXXX', 'XXXXX', 'XXXXX',
str(datetime.now()), '现结', '支付宝')
i = 1
# 给sale_order的default_code字段赋值
aa = self.env['sale.order'].sudo().search([('name', '=', order_id.name)])
logging.info('---------aa------- %s' % aa.name)
aa.default_code = obj.name
for item in res['bfm_process_order_list']:
product = self.env['product.template'].sudo().product_create(product_id, item, order_id,
obj.name, i)
bom_data = self.env['mrp.bom'].get_bom(product)
logging.info('bom_data:%s' % bom_data)
if bom_data:
bom = self.env['mrp.bom'].bom_create(product, 'normal', False)
bom.bom_create_line_has(bom_data)
else:
if product.materials_type_id.gain_way == '自加工':
# 创建坯料
self_machining_embryo = self.env['product.template'].sudo().no_bom_product_create(
self_machining_id,
item, order_id,
'self_machining',
i)
# 创建坯料的bom
self_machining_bom = self.env['mrp.bom'].bom_create(self_machining_embryo, 'normal', False)
# 创建坯料里bom的组件
self_machining_bom_line = self_machining_bom.bom_create_line(self_machining_embryo)
if not self_machining_bom_line:
self.cr.rollback()
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
# 产品配置bom
product_bom_self_machining = self.env['mrp.bom'].bom_create(product, 'normal', False)
product_bom_self_machining.bom_create_line_has(self_machining_embryo)
elif product.materials_type_id.gain_way == '外协':
# 创建坯料
outsource_embryo = self.env['product.template'].sudo().no_bom_product_create(outsource_id, item,
order_id,
'subcontract', i)
if outsource_embryo == -3:
self.cr.rollback()
return UserError(
'该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配')
# 创建坯料的bom
outsource_bom = self.env['mrp.bom'].bom_create(outsource_embryo, 'subcontract', True)
# 创建坯料的bom的组件
outsource_bom_line = outsource_bom.with_user(
self.env.ref("base.user_admin")).bom_create_line(outsource_embryo)
if not outsource_bom_line:
self.cr.rollback()
return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配')
# 产品配置bom
product_bom_outsource = self.env['mrp.bom'].bom_create(product, 'normal', False)
product_bom_outsource.bom_create_line_has(outsource_embryo)
elif product.materials_type_id.gain_way == '采购':
purchase_embryo = self.env['product.template'].sudo().no_bom_product_create(purchase_id, item,
order_id,
'purchase', i)
if purchase_embryo == -3:
self.cr.rollback()
return UserError(
'该订单模型的材料型号在您分配的工厂里暂未设置获取方式和供应商,请先配置再进行分配')
# 产品配置bom
product_bom_purchase = self.env['mrp.bom'].bom_create(product, 'normal', False)
product_bom_purchase.bom_create_line_has(purchase_embryo)
order_id.with_user(self.env.ref("base.user_admin")).sale_order_create_line(product, item)
except Exception as e:
# self.cr.rollback()
return UserError('工厂创建销售订单和产品失败,请联系管理员')
# 模型上色
def model_coloring(self, order):
url = '/api/library_of_models/create'
config = self.env['res.config.settings'].get_values()
config_header = Common.get_headers(self, config['token'], config['sf_secret_key'])
logging.info('order: %s' % order.name)
if order:
attachment = order.upload_model_file[0]
base64_data = base64.b64encode(attachment.datas)
base64_datas = base64_data.decode('utf-8')
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
logging.info('model_file-size: %s' % len(order.model_file))
logging.info('attachment.datas-size: %s' % len(attachment.datas))
vals = {
'programme_way': 'manual operation',
'model_code': model_code,
'model_data': base64.b64decode(attachment.datas),
'model_color_data': '',
'model_name': attachment.name,
'model_long': order.model_length,
'model_width': order.model_width,
'model_height': order.model_height,
'model_volume': order.model_volume,
'model_color_path': '/tmp/' + str(model_code) + ".step",
'model_order_no': '%s-%s' % (order.name, 1),
'remark': '订单号:%s 客户:%s' % (order.name, order.customer_id.name)
}
try:
ret = requests.post((config['sf_url'] + url), json={}, data=vals, headers=config_header,
timeout=60)
ret = ret.json()
# result = json.loads(ret['result'])
if ret['status'] == 1:
self.model_color_state = 'success'
else:
self.model_color_state = 'fail'
raise UserError(ret['message'])
except Exception as e:
self.model_color_state = 'fail'
raise UserError("模型上色失败")

View File

@@ -1,7 +1,13 @@
import datetime
import base64
from odoo import Command
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from odoo.exceptions import UserError, ValidationError
READONLY_FIELD_STATES = {
state: [('readonly', True)]
for state in {'sale', 'done', 'cancel'}
}
class ReSaleOrder(models.Model):
@@ -39,6 +45,12 @@ class ReSaleOrder(models.Model):
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]")
remark = fields.Text('备注')
validity_date = fields.Date(
string="Expiration",
compute='_compute_validity_date',
store=True, readonly=False, copy=False, precompute=True,
states=READONLY_FIELD_STATES, default=fields.Datetime.now)
# 业务平台分配工厂后在智能工厂先创建销售订单
def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address,
deadline_of_delivery, payments_way, pay_way):
@@ -73,12 +85,19 @@ class ReSaleOrder(models.Model):
self.check_status = 'pending'
def get_customer(self):
partner_tag = self.env['res.partner.category'].search([('name', '=', '业务平台')], limit=1, order='id asc')
if not partner_tag:
partner_tag = self.env['res.partner.category'].create({'name': '平台客户'})
customer = self.env['res.partner'].search([('name', '=', '业务平台')], limit=1, order='id asc')
if customer:
if not customer.vat:
customer.write({'name': '业务平台', 'vat': '91430103MA7BRH9K4M', 'phone': '0731-85115515',
'email': 'jikimo@jikimo.com', 'category_id': [Command.set([partner_tag.id])]})
return customer
else:
partner = self.env['res.partner'].create({'name': '业务平台'})
self.env['res.users'].create({'name': '业务平台', 'partner_id': partner.id})
partner = self.env['res.partner'].create(
{'name': '业务平台', 'vat': '91430103MA7BRH9K4M', 'phone': '0731-85115515',
'email': 'jikimo@jikimo.com', 'category_id': [Command.set([partner_tag.id])]})
return partner
# 业务平台分配工厂时在创建完产品后再创建销售明细信息
@@ -100,7 +119,7 @@ class ReSaleOrder(models.Model):
def check_order_line(self):
for item in self:
if not item.order_line:
raise UserError('请选择【订单行】中的【产品】')
raise ValidationError('请选择【订单行】中的【产品】')
for line in item.order_line:
if not line.product_template_id:
raise UserError('请对【订单行】中的【产品】进行选择')
@@ -123,6 +142,12 @@ class ResaleOrderLine(models.Model):
check_status = fields.Selection(related='order_id.check_status')
class ProductTemplate(models.Model):
_inherit = 'product.template'
manual_quotation = fields.Boolean('人工编程', default=False)
class RePurchaseOrder(models.Model):
_inherit = 'purchase.order'
@@ -187,6 +212,16 @@ class RePurchaseOrder(models.Model):
order.message_subscribe([order.partner_id.id])
return True
@api.onchange('order_line')
def _onchange_order_line(self):
for order in self:
if order.order_line:
line = order.order_line
product = line.product_id
product_id = product.ids
if len(product_id) != len(line):
raise ValidationError('%s】已存在,请勿重复添加' % product[-1].name)
class ResPartnerToSale(models.Model):
_inherit = 'res.partner'

View File

@@ -14,6 +14,8 @@ access_product_product_group_sale_salemanager,product_product_group_sale_saleman
access_product_product_group_sale_director,product_product_group_sale_director,product.model_product_product,sf_base.group_sale_director,1,1,1,0
access_product_product_group_purchase,product_product_group_purchase,product.model_product_product,sf_base.group_purchase,1,0,0,0
access_product_product_group_purchase_director,product_product_group_purchase_director,product.model_product_product,sf_base.group_purchase_director,1,1,1,0
access_product_product_group_plan_dispatch,product_product_group_plan_dispatch,product.model_product_product,sf_base.group_plan_dispatch,1,0,0,0
access_product_product_group_plan_director,product_product_group_plan_director,product.model_product_product,sf_base.group_plan_director,1,1,1,0
access_product_template_group_sale_salemanager,product_template_group_sale_salemanager,product.model_product_template,sf_base.group_sale_salemanager,1,0,0,0
access_product_template_group_sale_director,product_template_group_sale_director,product.model_product_template,sf_base.group_sale_director,1,1,1,0
access_product_template_group_purchase,product_template_group_purchase,product.model_product_template,sf_base.group_purchase,1,0,0,0
@@ -24,6 +26,9 @@ access_stock_picking_group_sale_salemanager,stock_picking_group_sale_salemanager
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_stock_picking_group_purchase,stock_picking_group_purchase,stock.model_stock_picking,sf_base.group_purchase,1,1,1,0
access_stock_picking_group_purchase_director,stock_picking_group_purchase_director,stock.model_stock_picking,sf_base.group_purchase_director,1,1,1,0
access_stock_picking_group_quality,stock_picking_group_quality,stock.model_stock_picking,sf_base.group_quality,1,0,0,0
access_stock_picking_group_quality_director,stock_picking_group_quality_director,stock.model_stock_picking,sf_base.group_quality_director,1,0,0,0
access_account_move_group_sale_salemanager,account_move_group_sale_salemanager,account.model_account_move,sf_base.group_sale_salemanager,1,0,0,0
access_account_move_group_sale_director,account_move_group_sale_director,account.model_account_move,sf_base.group_sale_director,1,0,0,0
access_resource_resource_group_sale_director,resource_resource_group_sale_director,resource.model_resource_resource,sf_base.group_sale_director,1,1,1,0
@@ -87,6 +92,9 @@ access_sale_report_group_sale_director,sale_report_group_sale_director,sale.mode
access_product_supplierinfo_group_purchase_director,product.supplierinfo group_purchase_director,product.model_product_supplierinfo,sf_base.group_purchase_director,1,1,1,0
access_product_category_group_purchase_director,product.category group_purchase_director,product.model_product_category,sf_base.group_purchase_director,1,1,1,0
access_product_supplierinfo_group_plan_director,product.supplierinfo user,product.model_product_supplierinfo,sf_base.group_plan_director,1,1,1,0
access_product_category_group_plan_director,product.category user,product.model_product_category,sf_base.group_plan_director,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
14 access_product_product_group_sale_director product_product_group_sale_director product.model_product_product sf_base.group_sale_director 1 1 1 0
15 access_product_product_group_purchase product_product_group_purchase product.model_product_product sf_base.group_purchase 1 0 0 0
16 access_product_product_group_purchase_director product_product_group_purchase_director product.model_product_product sf_base.group_purchase_director 1 1 1 0
17 access_product_product_group_plan_dispatch product_product_group_plan_dispatch product.model_product_product sf_base.group_plan_dispatch 1 0 0 0
18 access_product_product_group_plan_director product_product_group_plan_director product.model_product_product sf_base.group_plan_director 1 1 1 0
19 access_product_template_group_sale_salemanager product_template_group_sale_salemanager product.model_product_template sf_base.group_sale_salemanager 1 0 0 0
20 access_product_template_group_sale_director product_template_group_sale_director product.model_product_template sf_base.group_sale_director 1 1 1 0
21 access_product_template_group_purchase product_template_group_purchase product.model_product_template sf_base.group_purchase 1 0 0 0
26 access_stock_picking_group_sale_director stock_picking_group_sale_director stock.model_stock_picking sf_base.group_sale_director 1 0 0 0
27 access_stock_picking_group_purchase stock_picking_group_purchase stock.model_stock_picking sf_base.group_purchase 1 1 1 0
28 access_stock_picking_group_purchase_director stock_picking_group_purchase_director stock.model_stock_picking sf_base.group_purchase_director 1 1 1 0
29 access_stock_picking_group_quality stock_picking_group_quality stock.model_stock_picking sf_base.group_quality 1 0 0 0
30 access_stock_picking_group_quality_director stock_picking_group_quality_director stock.model_stock_picking sf_base.group_quality_director 1 0 0 0
31 access_account_move_group_sale_salemanager account_move_group_sale_salemanager account.model_account_move sf_base.group_sale_salemanager 1 0 0 0
32 access_account_move_group_sale_salemanager access_account_move_group_sale_director account_move_group_sale_salemanager account_move_group_sale_director account.model_account_move sf_base.group_sale_salemanager sf_base.group_sale_director 1 0 0 0
33 access_account_move_group_sale_director access_resource_resource_group_sale_director account_move_group_sale_director resource_resource_group_sale_director account.model_account_move resource.model_resource_resource sf_base.group_sale_director 1 0 1 0 1 0
34 access_resource_resource_group_sale_director access_mrp_bom_group_sale_salemanager resource_resource_group_sale_director mrp_bom_group_sale_salemanager resource.model_resource_resource mrp.model_mrp_bom sf_base.group_sale_director sf_base.group_sale_salemanager 1 1 0 1 0 0
92 access_product_supplierinfo_group_purchase_director access_product_category_group_purchase_director product.supplierinfo group_purchase_director product.category group_purchase_director product.model_product_supplierinfo product.model_product_category sf_base.group_purchase_director 1 1 1 0
93 access_product_category_group_purchase_director access_product_supplierinfo_group_plan_director product.category group_purchase_director product.supplierinfo user product.model_product_category product.model_product_supplierinfo sf_base.group_purchase_director sf_base.group_plan_director 1 1 1 0
94 access_product_category_group_plan_director product.category user product.model_product_category sf_base.group_plan_director 1 1 1 0
95
96
97
98
99
100

View File

@@ -24,20 +24,30 @@
<xpath expr="//form/header/button[@name='button_confirm'][2]" position="replace">
<button name="button_confirm" type="object" context="{'validate_analytic': True}"
string="确认订单" id="draft_confirm"
groups="sf_base.group_purchase,sf_base.group_purchase_director"
attrs="{'invisible': ['|','&amp;','&amp;', ('state', 'in', ['purchase','draft']), ('check_status', 'in', ['approved']), ('date_approve', '!=', False),'&amp;', '&amp;',('state', 'in', ['purchase', 'draft']),('check_status', 'in', [False, 'pending', 'fail']),('date_approve', '=', False)]}"
/>
<button name="button_confirming" type="object"
string="确认订单"
string="确认订单" groups="sf_base.group_purchase,sf_base.group_purchase_director"
attrs="{'invisible': ['&amp;',('check_status','!=', False),('state', 'not in', ['draft','send'])]}"
/>
</xpath>
<xpath expr="//form/header/button[@name='action_rfq_send'][1]" position="replace">
<button name="action_rfq_send" states="draft" string="通过Email发送采购单" type="object"
context="{'send_rfq':True}" class="oe_highlight" data-hotkey="g"
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
</xpath>
<xpath expr="//form/header/button[@name='action_rfq_send'][2]" position="replace">
<button name="action_rfq_send" states="sent" string="通过Email重新发送采购单" type="object"
context="{'send_rfq':True}" data-hotkey="g"
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
</xpath>
<xpath expr="//form/header/button[@name='action_rfq_send'][3]" position="replace">
<button name="action_rfq_send" states="purchase" string="通过Email发送订单" type="object"
context="{'send_rfq':False}" data-hotkey="g"
groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
</xpath>
<!-- <xpath expr="//form/header/button[@name='action_rfq_send[1]']" position="attributes">-->
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
<!-- </xpath>-->
<!-- <xpath expr="//form/header/button[@name='action_rfq_send[2]']" position="attributes">-->
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
<!-- </xpath>-->
<!-- <xpath expr="//form/header/button[@name='print_quotation[1]']" position="attributes">-->
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
<!-- </xpath>-->
@@ -48,9 +58,20 @@
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
</xpath>
<!-- <xpath expr="//form/header/button[@name='action_create_invoice[1]']" position="attributes">-->
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
<!-- </xpath>-->
<xpath expr="//form/header/button[@name='action_create_invoice']" position="replace">
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute> -->
<button name="action_create_invoice" string="创建账单" type="object" class="oe_highlight"
context="{'create_bill':True}"
attrs="{'invisible': ['|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'in', ('no', 'invoiced'))]}"
data-hotkey="w" groups="sf_base.group_purchase,sf_base.group_purchase_director"/>
</xpath>
<xpath expr="//form/header/button[@name='action_create_invoice'][2]" position="attributes">
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
</xpath>
<xpath expr="//form/header/button[@name='button_confirm']" position="attributes">
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
<!-- <button name="action_create_invoice" string="创建账单" type="object" class="oe_highlight" context="{'create_bill':True}" attrs="{'invisible': ['|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'in', ('no', 'invoiced'))]}" data-hotkey="w" groups="sf_base.group_purchase,sf_base.group_purchase_director"/> -->
</xpath>
<!-- <xpath expr="//form/header/button[@name='action_create_invoice[2]']" position="attributes">-->
<!-- <attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>-->
<!-- </xpath>-->
@@ -114,6 +135,17 @@
</field>
</record>
<record id="purchase_order_kpis_tree_inherit_sf" model="ir.ui.view">
<field name="name">purchase.stock.order.tree.inherit.sf</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_kpis_tree"/>
<field name="arch" type="xml">
<xpath expr="//tree//header//button[@name='action_create_invoice']" position="attributes">
<attribute name="groups">sf_base.group_purchase,sf_base.group_purchase_director</attribute>
</xpath>
</field>
</record>
<record id="purchase_stock_order_view_form_inherit_sf" model="ir.ui.view">
<field name="name">purchase.stock.order.form.inherit.sf</field>
@@ -149,5 +181,16 @@
</field>
</field>
</record>
<record id="purchase_order_search_inherit_sf" model="ir.ui.view">
<field name="name">purchase.order.list.select.inherit.sf</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.view_purchase_order_filter"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="replace">
<field name="name" string="单据编码" filter_domain="[('name', 'ilike', self)]"/>
</xpath>
</field>
</record>
</data>
</odoo>

View File

@@ -47,17 +47,8 @@
</h1>
<group>
<group>
<field name="customer_id" />
<field name="material_id"/>
<field name="material_model_id"/>
<!-- <field name="process_id"/>-->
<field name="parameter_ids" widget="many2many_tags" string="表面工艺参数"/>
<field name="machining_precision"/>
<field name="quantity"/>
<field name="unit_price"/>
<field name="price"/>
</group>
<group>
<field name="customer_id" context="{'is_customer': True }"
options="{'no_create': True}" required="1"/>
<field name="upload_model_file" widget="many2many_binary"/>
<field name="model_file" widget="Viewer3D" string="模型" readonly="1" force_save="1"
attrs="{'invisible': [('model_file', '=', False)]}"/>
@@ -75,8 +66,18 @@
<field name="model_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="model_volume" attrs="{'invisible': [('model_file', '=', False)]}"/>
<field name="model_volume" attrs="{'invisible': [('model_file', '=', False)]}"
options="{'format': false}"/>
<field name="material_id" options="{'no_create': True}" required="1"/>
<field name="material_model_id" options="{'no_create': True}" required="1"/>
<!-- <field name="process_id"/>-->
<field name="parameter_ids" widget="many2many_tags" string="表面工艺参数"
options="{'no_create': True}" required="1"/>
<field name="machining_precision" required="1"/>
<field name="processing_time"/>
<field name="quantity" options="{'format': false}"/>
<field name="unit_price"/>
<field name="price" options="{'format': false}"/>
</group>
</group>
</sheet>

View File

@@ -26,7 +26,7 @@
</field>
<field name="email" position="replace">
<field name="email"
attrs="{'required' : [('customer_rank','>', 0)],'readonly': [('id','!=', False)]}"/>
attrs="{'readonly': [('id','!=', False)]}"/>
</field>
<field name="mobile" position="attributes">
<attribute name="attrs">{'required': [('phone', '=', False)],'readonly': [('id','!=', False)]}
@@ -37,19 +37,19 @@
</attribute>
</field>
<field name="street" position="attributes">
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
<attribute name="attrs">{'readonly': [('id','!=', False)]}
</attribute>
</field>
<field name="street2" position="attributes">
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
<attribute name="attrs">{'readonly': [('id','!=', False)]}
</attribute>
</field>
<field name="city" position="attributes">
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
<attribute name="attrs">{'readonly': [('id','!=', False)]}
</attribute>
</field>
<field name="country_id" position="attributes">
<attribute name="attrs">{'required': [('supplier_rank','>', 0)],'readonly': [('id','!=', False)]}
<attribute name="attrs">{'readonly': [('id','!=', False)]}
</attribute>
</field>
<xpath expr="//group[@name='sale']/field[@name='user_id']" position="replace">

View File

@@ -73,7 +73,7 @@
<field name="schedule_status" invisible="1"/>
<button name="sf_sale.action_sale_order_check_wizard" string="审核" type="action"
context="{'default_order_id':active_id}" groups="sf_base.group_sale_director"
attrs="{'invisible': ['|',('check_status','in', ['approved',False]),('state', 'in', ['cancel'])]}"
attrs="{'invisible': ['|',('check_status','in', ['approved',False,'fail']),('state', 'in', ['cancel'])]}"
class="oe_highlight"/>
</xpath>
<!-- <xpath expr="//form/header/button[@name='action_confirm'][1]" position="attributes">-->
@@ -103,7 +103,7 @@
<!-- </xpath>-->
<field name="partner_id" position="replace">
<field name="partner_id" widget="res_partner_many2one" context="{'is_customer': True }"
options='{"always_reload": True}'/>
options='{"always_reload": True,"no_create": True}'/>
</field>
<field name="payment_term_id" position="attributes">
<attribute name="attrs">{'readonly': [('state', 'in', ['cancel','sale'])]}</attribute>
@@ -243,6 +243,10 @@
<form position="attributes">
<attribute name="delete">False</attribute>
</form>
<field name="name" position="replace">
<field name='name' placeholder="例如:奶酪汉堡" attrs="{'readonly': [('id', '!=', False)]}"/>
</field>
<field name="categ_id" position="replace">
<field name='categ_id' invisible="1"/>
</field>

View File

@@ -16,10 +16,13 @@
'security/ir.model.access.csv',
'wizard/wizard_view.xml',
'views/tool_base_views.xml',
'views/functional_tool_views.xml',
'views/mrp_workcenter_views.xml',
'views/sf_maintenance_equipment.xml',
'views/menu_view.xml',
'views/tool_material_search.xml',
'views/fixture_material_search_views.xml',
'data/tool_data.xml',
],
'demo': [
],

View File

@@ -8,55 +8,7 @@ from odoo.http import request
class Manufacturing_Connect(http.Controller):
@http.route('/AutoDeviceApi/MachineToolLibrary', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_equipment_tool_Info(self, **kw):
"""
机床刀库实时信息
:param kw:
:return:
"""
logging.info('get_equipment_tool_Info:%s' % kw)
try:
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
logging.info('DeviceId:%s' % ret)
equipment = request.env['maintenance.equipment'].sudo().search([('name', '=', ret['DeviceId'])])
res = {'Succeed': True, 'Datas': []}
if equipment:
for item in equipment:
data = []
for equipment_tool_id in item.product_template_ids:
functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search(
[('code', '=', equipment_tool_id.tool_code)])
alarm_time = None
if functional_tool_id.functional_tool_status == '报警':
alarm_time = self.env['sf.functional.tool.warning'].sudo().search(
[('code', '=', equipment_tool_id.tool_code)]).alarm_time
equipment_tool = {
'RfidCode': None,
'ToolId': equipment_tool_id.code,
'ToolName': equipment_tool_id.functional_tool_name_id.name,
'MaxLife': equipment_tool_id.life_value_max,
'UseLife': equipment_tool_id.used_value,
'AddDatetime': equipment_tool_id.tool_install_time,
'State': functional_tool_id.functional_tool_status,
'WarnDate': alarm_time if alarm_time else False
}
data.append(equipment_tool)
res['Datas'].append({
'DeviceId': item.name,
'Data': data
})
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('get_equipment_tool_Info error:%s' % e)
return json.JSONEncoder().encode(res)
@http.route('/AutoDeviceApi/ToolGroups', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
@http.route('/AutoDeviceApi/ToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
cors="*")
def get_functional_tool_groups_Info(self, **kw):
"""
@@ -68,19 +20,19 @@ class Manufacturing_Connect(http.Controller):
try:
datas = request.httprequest.data
ret = json.loads(datas)
ret = json.loads(ret['result'])
# ret = json.loads(ret['result'])
logging.info('DeviceId:%s' % ret)
functional_tools = request.env['sf.functional.cutting.tool.entity'].sudo().search([])
functional_tools = request.env['sf.tool.inventory'].sudo().search([])
res = {'Succeed': True, 'Datas': []}
if functional_tools:
for item in functional_tools:
res['Datas'].append({
'GroupName': item.tool_groups_id.name,
'ToolId': item.code,
'ToolId': item.functional_cutting_tool_model_id.name,
'ToolName': item.name
})
except Exception as e:
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('get_functional_tool_groups_Info error:%s' % e)
return json.JSONEncoder().encode(res)
return json.JSONEncoder().encode(res)

View File

@@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- <record model="sf.machine.table.tool.changing.apply" id="sf_create_tool_change_application">-->
<!-- </record>-->
</data>
<record model="ir.cron" id="ir_cron_sf_tool_datasync">
<field name="name">定时同步刀具物料、功能刀具信息到cloud</field>
<field name="model_id" ref="model_sf_tool_datasync"/>
<field name="state">code</field>
<field name="code">model._cron_tool_datasync_all()</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
</record>
</odoo>

View File

@@ -1,5 +1,9 @@
from . import base
from . import functional_tool
from . import tool_material_search
from . import maintenance_equipment
from . import mrp_workorder
from . import functional_tool_enroll
from . import fixture_material_search
from . import fixture_enroll

Some files were not shown because too many files have changed in this diff Show More