Compare commits

...

821 Commits

Author SHA1 Message Date
陈赓
d580f47885 追溯 2025-07-16 14:34:07 +08:00
管欢
7dd44ca12c Accept Merge Request #2288: (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/2288
2025-07-16 09:41:06 +08:00
guanhuan
5a98b20988 下达计划按钮重复点击生成重复数据 2025-07-16 09:32:28 +08:00
李晓斌
2738085a1e Accept Merge Request #2287: (feature/7253 -> develop)
Merge Request: Bug_7276_lxb_commit

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2287?initial=true
2025-07-15 16:56:26 +08:00
lixiaobin@jikimo.com
61c1fdbd05 Bug_7276_lxb_commit 2025-07-15 16:53:52 +08:00
hyyy
7eea5a0ff2 重复点击 2025-07-15 16:25:28 +08:00
李晓斌
714c68c0c1 Accept Merge Request #2286: (feature/7253 -> develop)
Merge Request: BUG_7276_lxb_commit

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2286
2025-07-15 14:35:11 +08:00
lixiaobin@jikimo.com
f3e7ba7f68 BUG_7276_lxb_commit 2025-07-15 14:17:38 +08:00
lixiaobin@jikimo.com
df589b43e7 BUG_7276_lxb_commit 2025-07-15 14:13:01 +08:00
lixiaobin@jikimo.com
8bdc65c626 BUG_7276_lxb_commit 2025-07-15 14:09:14 +08:00
guanhuan
0c3407572f 需求计划详情 2025-07-15 11:51:14 +08:00
hyyy
e5404efb60 批量下达计划禁用 2025-07-15 11:39:20 +08:00
guanhuan
46f60028aa 需求位置修改 2025-07-15 10:40:19 +08:00
guanhuan
bfc071debd 需求位置修改 2025-07-15 10:34:28 +08:00
李晓斌
7fca59322e Accept Merge Request #2285: (feature/7253 -> develop)
Merge Request: BUG_7276_lxb_commit

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2285
2025-07-15 09:42:48 +08:00
lixiaobin@jikimo.com
42694c1ac6 BUG_7276_lxb_commit 2025-07-15 09:39:50 +08:00
管欢
e88fc012ec Accept Merge Request #2284: (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/2284
2025-07-14 16:16:20 +08:00
guanhuan
ff7cd9c927 校验修改 2025-07-14 16:13:49 +08:00
guanhuan
588b7d340f Merge branch 'refs/heads/develop' into feature/物料需求计划管理 2025-07-14 15:52:10 +08:00
guanhuan
5902d61f13 新增单件用量显示 2025-07-14 15:39:37 +08:00
陈烨
8cfad007b9 Accept Merge Request #2283: (feature/7249 -> develop)
Merge Request: 合并 develop 分支到 feature/7249

Created By: @陈烨
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @陈烨
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2283
2025-07-14 14:29:24 +08:00
chenye
5008210176 合并 develop 分支到 feature/7249 2025-07-14 14:21:44 +08:00
chenye
f487ab4cce 提交7268,7271等bug修改 2025-07-14 14:15:28 +08:00
guanhuan
0441f345ef 新增单件用量显示 2025-07-14 14:11:28 +08:00
李晓斌
3527105e83 Accept Merge Request #2282: (feature/7253 -> develop)
Merge Request: Debug-7269_lxb_commit

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2282?initial=true
2025-07-14 11:41:47 +08:00
lixiaobin@jikimo.com
88e4cfb541 Debug-7269_lxb_commit 2025-07-14 11:32:29 +08:00
管欢
5a175c078f Accept Merge Request #2281: (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/2281
2025-07-14 10:55:52 +08:00
guanhuan
20980bed9d 修复客供料产品下达计划,第二个计划下达报错 2025-07-14 10:54:17 +08:00
陈烨
9b94357439 Accept Merge Request #2280: (feature/7249 -> develop)
Merge Request: Merge branch 'develop' into feature/7249

Created By: @陈烨
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @陈烨
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2280
2025-07-14 08:50:26 +08:00
chenye
5ae3c5dd47 Merge branch 'develop' into feature/7249 2025-07-11 17:57:31 +08:00
chenye
60be14dda2 修改bug7264和7265 2025-07-11 17:49:05 +08:00
陈烨
f0ff7c4a74 Accept Merge Request #2279: (feature/7249 -> develop)
Merge Request: Merge branch 'develop' into feature/7249

Created By: @陈烨
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @陈烨
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2279
2025-07-11 17:01:05 +08:00
chenye
2b6e2fe31b Merge branch 'develop' into feature/7249 2025-07-11 16:48:24 +08:00
chenye
f1390e47c9 提交7252bug修改内容 2025-07-11 16:36:18 +08:00
李晓斌
c7cd0a6a69 Accept Merge Request #2278: (feature/7253 -> develop)
Merge Request: 7253_BUG修复

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2278
2025-07-11 11:40:18 +08:00
lixiaobin@jikimo.com
fa5307a2ea 7253_BUG修复 2025-07-11 11:13:08 +08:00
陈烨
07e4cdcaa0 Accept Merge Request #2276: (feature/7249 -> develop)
Merge Request: 提交7249和7246需求

Created By: @陈烨
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @陈烨
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2276
2025-07-11 10:19:58 +08:00
陈烨
ff5925eb06 Merge branch refs/heads/develop into refs/heads/feature/7249 2025-07-11 10:10:56 +08:00
chenye
2a7e07b4c0 提交7249和7246需求 2025-07-10 17:44:10 +08:00
guanhuan
4706bfe85e 计划量字段被修改成了别的字段名 2025-07-10 17:36:37 +08:00
李晓斌
2f21c510bd Accept Merge Request #2274: (feature/7231 -> develop)
Merge Request: 7231_lxb_commit--控制物料需求计划在客户位置的计划量不允许超过需求量

Created By: @李晓斌
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @李晓斌
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2274
2025-07-10 17:01:05 +08:00
lixiaobin@jikimo.com
7adaa7e79b 7231_lxb_commit 2025-07-10 16:33:43 +08:00
禹翔辉
166d10e7d9 Accept Merge Request #2273: (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/2273
2025-07-10 15:24:52 +08:00
管欢
36d6a3ed4c Accept Merge Request #2275: (feature/物料需求计划管理 -> 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/2275
2025-07-10 15:18:35 +08:00
guanhuan
650ff9b3e2 采购申请状态修复 2025-07-10 15:11:32 +08:00
lixiaobin@jikimo.com
559c6bfb1d 7231_lxb_commit 2025-07-10 14:29:06 +08:00
guanhuan
e83d3f8a1c 修复齐套检查产品制造完成,坯料的状态又变成了未齐套 2025-07-10 14:21:10 +08:00
guanhuan
ac0966f3bf 修复齐套检查产品制造完成,坯料的状态又变成了未齐套 2025-07-10 14:20:15 +08:00
guanhuan
1f93ba3b42 修复未保存需求计划删除明细行问题,打印列表显示 2025-07-10 14:11:31 +08:00
guanhuan
4d2ab82645 修复采购类型根据供货方式来赋值 2025-07-10 08:57:38 +08:00
yuxianghui
7b4499184d 添加禁止负库存功能 2025-07-09 16:58:20 +08:00
guanhuan
d02babaf0a 修复需求计划生成的bom编码时间少8小时 2025-07-09 16:57:20 +08:00
guanhuan
acb6fd42ca 采购明细加需求计划明细字段 2025-07-09 16:46:46 +08:00
guanhuan
c2cb24c60b 需求计划优化 2025-07-09 11:38:40 +08:00
管欢
3be1c4c529 Accept Merge Request #2272: (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/2272
2025-07-09 10:26:45 +08:00
guanhuan
60e7415a27 更新报错 2025-07-09 10:25:19 +08:00
管欢
22763903a4 Accept Merge Request #2271: (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/2271
2025-07-09 10:19:50 +08:00
guanhuan
4c6cf0ba5e 更新报错 2025-07-09 09:54:58 +08:00
管欢
02012b2c52 Accept Merge Request #2270: (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/2270
2025-07-09 09:43:44 +08:00
guanhuan
a2b2efed7d 交货数量修改 2025-07-08 15:46:32 +08:00
guanhuan
925c59e1fe 采购申请添加需求明细字段 2025-07-08 11:25:00 +08:00
胡尧
f86e27b45e Accept Merge Request #2269: (feature/新增plm模块 -> develop)
Merge Request: 删除plm模块代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2269?initial=true
2025-07-07 15:00:13 +08:00
胡尧
b704f99a29 删除plm模块代码 2025-07-07 14:59:48 +08:00
胡尧
1ac6314f5f Accept Merge Request #2268: (feature/新增plm模块 -> develop)
Merge Request: 新增

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2268?initial=true
2025-07-07 12:16:56 +08:00
胡尧
8b3eef1256 新增 2025-07-07 11:59:14 +08:00
guanhuan
22ccb095ee 需求计划下达计划 2025-07-07 10:46:27 +08:00
guanhuan
9db4ea745b Merge branch 'refs/heads/develop' into feature/物料需求计划管理 2025-07-04 17:03:23 +08:00
guanhuan
60fd4d4a73 需求计划下达计划 2025-07-04 17:01:56 +08:00
禹翔辉
c6c4331c0b Accept Merge Request #2267: (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/2267
2025-07-04 13:49:35 +08:00
yuxianghui
10c6f59f52 处理 成品出库单创建欠单后生成的调拨单详情页中质量检查智能按钮默认展示为通过状态 问题 2025-07-04 13:48:16 +08:00
guanhuan
df4995fa24 需求计划下达计划 2025-07-04 10:18:28 +08:00
guanhuan
6e877d0449 需求计划下达计划 2025-07-03 17:32:11 +08:00
guanhuan
3822d78f35 需求计划供货方式修改 2025-07-03 14:33:19 +08:00
胡尧
b23e50daa6 Accept Merge Request #2266: (feature/6711 -> develop)
Merge Request: 解决采购申请创建的采购单取消后导致后续单据无法就绪的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2266?initial=true
2025-07-02 17:32:14 +08:00
胡尧
4615f1576f 解决采购申请创建的采购单取消后导致后续单据无法就绪的问题 2025-07-02 17:31:43 +08:00
guanhuan
0350f78710 Merge branch 'refs/heads/develop' into feature/物料需求计划管理
# Conflicts:
#	sf_demand_plan/models/sf_production_demand_plan.py
#	sf_demand_plan/views/demand_plan.xml
2025-07-02 08:57:20 +08:00
胡尧
20df1c0365 Accept Merge Request #2265: (release/release_2.15 -> develop)
Merge Request: 需求计划列表字段位置变动

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2265
2025-07-01 17:57:16 +08:00
胡尧
20069d5336 Merge branch refs/heads/develop into refs/heads/release/release_2.15 2025-07-01 17:57:06 +08:00
胡尧
c8f1676de9 解决采购申请创建的采购单取消后导致调拨单不能就绪的问题 2025-07-01 17:55:07 +08:00
guanhuan
b267f2351d 需求计划开发 2025-07-01 14:34:27 +08:00
guanhuan
fe8df494f9 需求计划列表字段位置变动 2025-06-30 17:13:46 +08:00
guanhuan
c31cc868a9 物料需求计划管理 2025-06-30 17:10:25 +08:00
禹翔辉
0e7d6fac4e Accept Merge Request #2264: (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/2264
2025-06-30 15:20:56 +08:00
guanhuan
32cd68e15f 调拨动作中屏蔽验证 2025-06-30 13:36:04 +08:00
guanhuan
334d406c35 需求计划 2025-06-30 11:29:40 +08:00
yuxianghui
70113cb3c5 采购申请批量转采购按钮显示优化 2025-06-30 09:20:09 +08:00
guanhuan
048f07aba4 新增坯料类型 2025-06-27 17:44:32 +08:00
guanhuan
f0e47371ed 新增坯料类型 2025-06-27 15:29:02 +08:00
guanhuan
c03cda8250 物料需求计划管理 2025-06-27 15:23:05 +08:00
yuxianghui
6dde814acc 产品-form页面加工参数 添加坯料类型字段 2025-06-27 15:17:15 +08:00
yuxianghui
71ab241e94 产品添加坯料类型字段,值来着bfm下单 2025-06-27 15:10:15 +08:00
禹翔辉
272e424975 Accept Merge Request #2263: (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/2263
2025-06-27 10:17:42 +08:00
yuxianghui
1fd9900e41 处理 由采购订单-委外加工类型生成的同一个补货组的坯料采购申请单据没有合并 问题 2025-06-27 09:39:11 +08:00
guanhuan
50a066c23a 物料需求计划管理 2025-06-26 17:52:40 +08:00
guanhuan
fe4659987f 物料需求计划管理 2025-06-26 17:18:03 +08:00
yuxianghui
0a13acbb68 修改 销售订单确认时,生成产品BOM时校验单位用量值的提示信息 2025-06-26 17:04:50 +08:00
yuxianghui
a68d6d4d06 处理 采购订单确认时,一补货组的补货单没有合并问题 2025-06-26 16:55:38 +08:00
guanhuan
c14e2c19bf 物料需求计划管理 2025-06-26 11:13:56 +08:00
胡尧
c630074f4a Accept Merge Request #2262: (feature/根据项目组区分sf代码 -> develop)
Merge Request: 撤回_run_manufacturing方法

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2262?initial=true
2025-06-26 10:27:04 +08:00
胡尧
4bea169327 撤回_run_manufacturing方法 2025-06-26 10:26:39 +08:00
禹翔辉
e2ddac4fb0 Accept Merge Request #2261: (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/2261
2025-06-26 10:24:21 +08:00
yuxianghui
e52ec3982f 调拨单验证时,对没有完成通过的质检单不进行出厂检验报告检测 2025-06-26 10:03:19 +08:00
胡尧
160bd117b7 Accept Merge Request #2260: (feature/根据项目组区分sf代码 -> develop)
Merge Request: 没有model_id的制造订单不请求编程

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2260
2025-06-26 09:35:42 +08:00
胡尧
a19cf5d894 解决冲突 2025-06-26 09:35:26 +08:00
胡尧
885064fb12 没有model_id的制造订单不请求编程 2025-06-26 09:29:02 +08:00
胡尧
8f7e785760 Accept Merge Request #2259: (feature/根据项目组区分sf代码 -> develop)
Merge Request: 修复加工面报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2259?initial=true
2025-06-25 17:36:14 +08:00
胡尧
8123885c71 修复加工面报错的问题 2025-06-25 17:35:18 +08:00
禹翔辉
c2f346571d Accept Merge Request #2258: (feature/委外加工采购订单 -> develop)
Merge Request: 完成 委外加工采购订单增加BOM内物料的采购申请与采购订单 需求

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2258
2025-06-25 16:13:04 +08:00
yuxianghui
e3494ce8b7 完成 委外加工采购订单增加BOM内物料的采购申请与采购订单 需求 2025-06-25 16:09:32 +08:00
guanhuan
413cf43ea0 物料需求计划管理 2025-06-25 15:33:24 +08:00
guanhuan
deda36a0f9 物料需求计划管理 2025-06-25 15:01:02 +08:00
禹翔辉
d75cff0a5d Accept Merge Request #2257: (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/2257
2025-06-25 14:37:28 +08:00
guanhuan
8a953a1417 Merge branch 'refs/heads/feature/库存路线' into feature/物料需求计划管理
# Conflicts:
#	sf_demand_plan/__manifest__.py
#	sf_demand_plan/models/sf_production_demand_plan.py
#	sf_demand_plan/security/ir.model.access.csv
2025-06-25 14:32:18 +08:00
guanhuan
d046fd5298 移除销售订单供货方式确认 2025-06-25 14:22:27 +08:00
hyyy
4b026535f8 修改固定列tree的传参方式 2025-06-25 14:01:34 +08:00
yuxianghui
28ade4ac72 完成 物料需求计划主数据准备:库存路线 需求 2025-06-25 13:57:56 +08:00
guanhuan
9f00fddc09 物料需求计划管理 2025-06-25 09:57:19 +08:00
hyyy
99ac89f995 需求-字段命名调整 2025-06-25 09:54:37 +08:00
胡尧
372f95d812 Accept Merge Request #2256: (feature/6711 -> develop)
Merge Request: 待完工工单明细,控制时间为大于48小时,小于当前时间

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2256?initial=true
2025-06-25 09:43:11 +08:00
胡尧
f165bec662 待完工工单明细,控制时间为大于48小时,小于当前时间 2025-06-25 09:42:53 +08:00
胡尧
4099756d15 Accept Merge Request #2255: (feature/6711 -> develop)
Merge Request: 日计划量对工单id去重

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2255?initial=true
2025-06-25 08:44:32 +08:00
胡尧
133eac4a5c 日计划量对工单id去重 2025-06-25 08:43:59 +08:00
guanhuan
f41d3558d2 物料需求计划管理 2025-06-24 17:46:55 +08:00
禹翔辉
91bad533c3 Accept Merge Request #2254: (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/2254
2025-06-24 17:10:41 +08:00
yuxianghui
f5ed94866b 调拨单需验证质检单数量方法优化 2025-06-24 16:59:38 +08:00
胡尧
b70f280c6e Accept Merge Request #2253: (feature/6711 -> develop)
Merge Request: 修复明细接口bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2253?initial=true
2025-06-24 15:56:52 +08:00
胡尧
9922402b3b 修复明细接口bug 2025-06-24 15:56:33 +08:00
胡尧
152657e41b Accept Merge Request #2252: (feature/6711 -> develop)
Merge Request: 修改未完成订单明细的判断逻辑

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2252?initial=true
2025-06-24 15:51:17 +08:00
胡尧
0a79a4e336 修改未完成订单明细的判断逻辑 2025-06-24 15:50:45 +08:00
yuxianghui
35b1d648c3 产品新增单件用量 unit_number 字段,值由bfm下单同步获得;产品生成的BOM中组件数量的值由unit_number 字段提供。 2025-06-24 15:36:23 +08:00
胡尧
174af13a58 Accept Merge Request #2251: (feature/6711 -> develop)
Merge Request: 修改工单状态对应名字

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2251?initial=true
2025-06-24 15:35:42 +08:00
胡尧
00922e3674 修改工单状态对应名字 2025-06-24 15:35:19 +08:00
胡尧
832b06be1f Merge branch 'develop' into feature/根据项目组区分sf代码 2025-06-24 15:06:31 +08:00
胡尧
3b60db56de Accept Merge Request #2250: (feature/6711 -> develop)
Merge Request: 修改大屏获取订单详情接口

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2250
2025-06-24 14:52:47 +08:00
胡尧
2a330a4bd8 修改大屏获取订单详情接口 2025-06-24 14:52:03 +08:00
yuxianghui
579b7138e7 需求 调拨单关联校验是否完成质量检查时,可先排除欠单量后再校验 开发 2025-06-24 14:41:49 +08:00
yuxianghui
98f8430c45 Revert "需求 调拨单关联校验是否完成质量检查时,可先排除欠单量后再校验 开发"
This reverts commit 912847ae33.
2025-06-24 14:32:40 +08:00
yuxianghui
912847ae33 需求 调拨单关联校验是否完成质量检查时,可先排除欠单量后再校验 开发 2025-06-24 14:32:21 +08:00
胡尧
33647fa3e0 修改明细接口 2025-06-24 14:18:27 +08:00
管欢
d1f9f8cf8c Accept Merge Request #2249: (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/2249
2025-06-24 11:44:41 +08:00
guanhuan
7d1f7b11eb 坯料尺寸显示修改 2025-06-24 11:39:47 +08:00
guanhuan
fe3492ceb5 坯料尺寸显示修改 2025-06-24 11:32:41 +08:00
guanhuan
02b4f76326 物料需求计划 2025-06-24 11:17:41 +08:00
胡尧
72f737c370 Accept Merge Request #2248: (feature/6711 -> develop)
Merge Request: 解决大屏bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2248?initial=true
2025-06-23 17:54:56 +08:00
胡尧
a2a652eea4 解决大屏bug 2025-06-23 17:54:38 +08:00
guanhuan
2f26aee90a 物料需求计划 2025-06-23 17:21:50 +08:00
管欢
98c5b3b013 Accept Merge Request #2247: (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/2247
2025-06-23 14:26:02 +08:00
guanhuan
0d76d1a7d3 需求计划修改 2025-06-23 13:59:37 +08:00
胡尧
b177bd95ff 将fetchCNC移动到sf_mrs_connect模块 2025-06-23 11:04:44 +08:00
胡尧
a5bb686708 Accept Merge Request #2245: (feature/根据项目组区分sf代码 -> develop)
Merge Request: 将sf_manufacturing模块中stock.py的_run_manufacture方法进行拆分

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2245?initial=true
2025-06-23 10:54:27 +08:00
胡尧
c1bafef1aa Merge branch 'develop' into feature/根据项目组区分sf代码 2025-06-23 10:49:47 +08:00
胡尧
46125dc44b Accept Merge Request #2244: (feature/6711 -> develop)
Merge Request: 修复时间显示问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2244?initial=true
2025-06-23 09:22:55 +08:00
胡尧
05c5c0ef81 修复时间显示问题 2025-06-23 09:22:37 +08:00
胡尧
d0d3215bf3 Accept Merge Request #2243: (feature/6711 -> develop)
Merge Request: 修改日产量时间

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2243
2025-06-23 09:11:51 +08:00
胡尧
35e80266d7 修改日产量时间 2025-06-23 08:59:02 +08:00
禹翔辉
92a0c15708 Accept Merge Request #2242: (feature/委外加工bug修复 -> develop)
Merge Request: Merge branch 'feature/委外加工采购订单原生BUG修复' into feature/委外加工bug修复

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2242
2025-06-23 08:50:21 +08:00
yuxianghui
0013f9f8c9 Merge branch 'feature/委外加工采购订单原生BUG修复' into feature/委外加工bug修复 2025-06-23 08:34:14 +08:00
yuxianghui
4274b9fe99 出厂检验报告-页脚修改回退 2025-06-20 17:53:04 +08:00
禹翔辉
149d8e287b Accept Merge Request #2241: (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/2241
2025-06-20 17:44:00 +08:00
yuxianghui
3f65742add 撤销出厂检验报告模版-页脚优化 2025-06-20 17:42:39 +08:00
管欢
b56e3545a1 Accept Merge Request #2239: (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/2239
2025-06-20 17:37:21 +08:00
禹翔辉
fd7080a332 Accept Merge Request #2240: (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/2240
2025-06-20 17:37:12 +08:00
yuxianghui
85fb64ed55 页脚条件判断条件优化 2025-06-20 17:36:12 +08:00
guanhuan
9ad06b4361 需求计划 2025-06-20 17:34:17 +08:00
guanhuan
f9c13341e6 Merge branch 'refs/heads/develop' into feature/齐套检查与下达生产 2025-06-20 17:33:26 +08:00
guanhuan
d2a61c79d0 需求计划 2025-06-20 17:29:41 +08:00
禹翔辉
5f80b377e5 Accept Merge Request #2238: (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/2238
2025-06-20 17:28:20 +08:00
yuxianghui
ab2e685004 添加页脚页码数据测试 2025-06-20 17:24:48 +08:00
guanhuan
dcc5eef006 需求计划 2025-06-20 17:21:06 +08:00
guanhuan
7e8b2adb3d 需求计划 2025-06-20 17:19:33 +08:00
禹翔辉
9aa870065b Accept Merge Request #2237: (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/2237
2025-06-20 17:03:52 +08:00
yuxianghui
60c39929b2 页脚优化 2025-06-20 17:02:31 +08:00
禹翔辉
9a5b8a2627 Accept Merge Request #2236: (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/2236
2025-06-20 16:56:08 +08:00
yuxianghui
73696eb72c 出厂检验报告-页脚优化 2025-06-20 16:50:59 +08:00
禹翔辉
55babb8a35 Accept Merge Request #2235: (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/2235
2025-06-20 16:42:02 +08:00
yuxianghui
6682dbfb7d 出厂检验报告模版-页脚优化 2025-06-20 16:40:38 +08:00
禹翔辉
e0b8e5fe07 Accept Merge Request #2234: (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/2234
2025-06-20 16:19:18 +08:00
yuxianghui
800f2eb6a7 出厂检验报告-页脚优化 2025-06-20 16:03:13 +08:00
禹翔辉
3cc633131e Accept Merge Request #2233: (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/2233
2025-06-20 15:57:55 +08:00
yuxianghui
e3fb266890 出厂检验报告-页脚修改 2025-06-20 15:55:58 +08:00
胡尧
844f7de1ab Accept Merge Request #2232: (feature/6711 -> develop)
Merge Request: 修改计划量字段为–qty_production

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2232?initial=true
2025-06-20 15:39:28 +08:00
胡尧
13d33488dc 修改计划量字段为–qty_production 2025-06-20 15:39:11 +08:00
禹翔辉
266601cf84 Accept Merge Request #2231: (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/2231
2025-06-20 15:36:51 +08:00
yuxianghui
2e168a4ba7 出厂检验报告模版-页脚优化 2025-06-20 15:35:07 +08:00
胡尧
68ba47ed70 Accept Merge Request #2230: (feature/7151 -> develop)
Merge Request: 修改依赖

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2230?initial=true
2025-06-20 15:03:57 +08:00
胡尧
5bb6fcd4f7 修改依赖 2025-06-20 15:03:42 +08:00
胡尧
9a05bbd82c Accept Merge Request #2229: (feature/7151 -> develop)
Merge Request: 修改需求计划,下达生成的方法

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2229?initial=true
2025-06-20 14:52:34 +08:00
胡尧
b33c992b25 修改需求计划,下达生成的方法 2025-06-20 14:51:58 +08:00
yuxianghui
5947b3dfe9 回退出厂检验报告模版 2025-06-20 14:26:29 +08:00
禹翔辉
95e43b0fba Accept Merge Request #2228: (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/2228
2025-06-20 14:07:56 +08:00
yuxianghui
e7afc76753 出厂检验报告模版优化 2025-06-20 14:01:56 +08:00
胡尧
788183e239 修改批量大小 2025-06-20 13:52:37 +08:00
禹翔辉
4ddabdefa1 Accept Merge Request #2227: (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/2227
2025-06-20 13:39:42 +08:00
yuxianghui
364127beb3 1 2025-06-20 13:37:42 +08:00
yuxianghui
109ea8729d 优化出厂检验报告模版 2025-06-20 12:03:17 +08:00
禹翔辉
32de726164 Accept Merge Request #2226: (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/2226
2025-06-20 11:49:32 +08:00
yuxianghui
79f89f068b 修改出厂检验报告模版 2025-06-20 11:47:59 +08:00
禹翔辉
52189cff72 Accept Merge Request #2225: (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/2225
2025-06-20 11:37:18 +08:00
yuxianghui
aadccce47e 修改出厂检验报告生成模版 2025-06-20 11:35:23 +08:00
胡尧
abd88fd721 Accept Merge Request #2224: (feature/6711 -> develop)
Merge Request: 修改产量接口bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2224?initial=true
2025-06-20 11:27:06 +08:00
胡尧
2c2fa87719 修改产量接口bug 2025-06-20 11:26:48 +08:00
胡尧
f38f60a6a8 计划增加队列 2025-06-20 11:24:39 +08:00
胡尧
7d8b7048a8 Accept Merge Request #2223: (feature/6711 -> develop)
Merge Request: 去掉多余代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2223?initial=true
2025-06-20 11:15:58 +08:00
胡尧
e7b312fb22 去掉多余代码 2025-06-20 10:53:31 +08:00
禹翔辉
bc641bde3a Accept Merge Request #2222: (feature/平台下单接口优化 -> develop)
Merge Request: 处理bfm下单报错

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2222
2025-06-20 10:30:25 +08:00
yuxianghui
d73ffab9b5 处理bfm下单报错 2025-06-20 10:28:07 +08:00
黄焱
4b1c0bc3b5 Accept Merge Request #2221: (feature/前端样式修改 -> develop)
Merge Request: 质检PDF预览logo移位

Created By: @黄焱
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2221?initial=true
2025-06-20 09:23:34 +08:00
hyyy
45730e2dd4 质检PDF预览logo移位 2025-06-20 09:09:45 +08:00
禹翔辉
8903f32cf8 Accept Merge Request #2220: (feature/质检按钮隐藏 -> develop)
Merge Request: 处理 bfm内部下单包含坯料尺寸时,生成的产品的加工参数-体积数据不正确问题

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2220
2025-06-19 16:34:32 +08:00
yuxianghui
8bd1c8a095 处理 bfm内部下单包含坯料尺寸时,生成的产品的加工参数-体积数据不正确问题 2025-06-19 16:29:31 +08:00
谷耀东
abf9a0997b Accept Merge Request #2219: (feature/7154 -> 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/2219
2025-06-19 16:28:02 +08:00
guyaodong
aec2d1c516 恢复刀具房样式和编码 2025-06-19 16:18:04 +08:00
禹翔辉
127efb67d7 Accept Merge Request #2218: (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/2218
2025-06-19 15:19:34 +08:00
yuxianghui
78edf1f7eb 质检单按钮隐藏 2025-06-19 15:17:26 +08:00
胡尧
e6e13a5970 Accept Merge Request #2217: (feature/6711 -> develop)
Merge Request: 修改大屏数据接口,日完成量统计,获取产线产量相关,获取工单明细

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2217?initial=true
2025-06-19 15:03:27 +08:00
胡尧
55cc4906ef 修改大屏数据接口,日完成量统计,获取产线产量相关,获取工单明细 2025-06-19 15:02:55 +08:00
黄焱
427b548939 Accept Merge Request #2216: (feature/前端样式修改 -> develop)
Merge Request: 修改合格logo位置

Created By: @黄焱
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2216?initial=true
2025-06-19 14:37:13 +08:00
hyyy
8c9db7e8c8 修改合格logo位置 2025-06-19 14:32:59 +08:00
管欢
990f73ea4e Accept Merge Request #2215: (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/2215
2025-06-19 11:21:12 +08:00
胡尧
d21e0c7fd9 修改大屏数据接口,支持线下数据 2025-06-19 10:54:33 +08:00
guanhuan
b4ed65a75c 物料需求计划增加字段显示 2025-06-19 10:37:35 +08:00
管欢
53ba2ec589 Accept Merge Request #2214: (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/2214
2025-06-19 09:58:10 +08:00
guanhuan
566bc0e1e2 物料需求计划增加字段显示 2025-06-19 09:40:29 +08:00
黄焱
5f216684f0 Accept Merge Request #2213: (feature/前端样式修改 -> develop)
Merge Request: 修改出厂检验报告合格LOGO移位

Created By: @黄焱
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @黄焱
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2213?initial=true
2025-06-18 18:00:26 +08:00
hyyy
e86bd59a43 修改出厂检验报告合格LOGO移位 2025-06-18 17:56:27 +08:00
禹翔辉
e55625e4b6 Accept Merge Request #2212: (feature/处理sf.t更新报错 -> develop)
Merge Request: bfm内部下单新增坯料长宽高同步到sf产品-加工参数-坯料尺寸的长宽高

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2212
2025-06-18 17:02:57 +08:00
yuxianghui
790dd3dd05 销售订单行的交货截止日期改为客户交期 2025-06-18 17:00:16 +08:00
yuxianghui
84846fb3da bfm内部下单新增坯料长宽高同步到sf产品-加工参数-坯料尺寸的长宽高 2025-06-18 16:54:15 +08:00
禹翔辉
f45a46255b Accept Merge Request #2211: (feature/处理sf.t更新报错 -> develop)
Merge Request: 处理sf.t更新报错

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2211
2025-06-18 16:12:12 +08:00
yuxianghui
fe5b005e45 1 2025-06-18 16:11:49 +08:00
yuxianghui
fc33280509 处理sf.t更新报错 2025-06-18 16:09:44 +08:00
黄焱
60ed04cf77 Accept Merge Request #2208: (feature/前端样式修改 -> 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/2208
2025-06-18 15:47:36 +08:00
禹翔辉
3439b47b0c Accept Merge Request #2206: (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/2206
2025-06-18 15:45:32 +08:00
管欢
33c5d648b5 Accept Merge Request #2210: (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/2210
2025-06-18 15:41:54 +08:00
谷耀东
c7b50d9706 Accept Merge Request #2209: (feature/7141 -> develop)
Merge Request: 增加kanban悬停tip

Created By: @谷耀东
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @谷耀东
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2209
2025-06-18 15:41:44 +08:00
guanhuan
05caed1d91 批量排程时间修改 2025-06-18 14:49:35 +08:00
guyaodong
8b66fda899 增加kanban悬停tip 2025-06-18 14:26:53 +08:00
hyyy
1456d4303b 修改需求计划模块需求与bug 2025-06-18 14:18:37 +08:00
guanhuan
9d2f23de7c 批量排程时间修改 2025-06-18 14:05:23 +08:00
yuxianghui
9393a48e70 删除客户交期字段 2025-06-18 11:11:51 +08:00
胡尧
749f44d6df Accept Merge Request #2205: (feature/7134 -> develop)
Merge Request: 修改采购申请相关欠单创建报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2205?initial=true
2025-06-18 10:56:54 +08:00
胡尧
4f000a6be4 修改采购申请相关欠单创建报错的问题 2025-06-18 10:56:22 +08:00
yuxianghui
71a0f39ec9 新增如果采购订单类型为委外加工,则不进行供应商校验直接生成补给单 2025-06-18 10:50:13 +08:00
胡尧
7af7079a5c Accept Merge Request #2204: (feature/7134 -> develop)
Merge Request: 采购申请按钮按照产品以及bom产品过滤

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2204?initial=true
2025-06-18 10:34:57 +08:00
胡尧
376eb9e56f 采购申请按钮按照产品以及bom产品过滤 2025-06-18 10:34:34 +08:00
管欢
531bc2e090 Accept Merge Request #2203: (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/2203
2025-06-18 09:44:16 +08:00
guanhuan
bc3ab21d75 打印列表程序单数据修改 2025-06-18 09:40:12 +08:00
胡尧
92f591c3e7 将sf_manufacturing模块中stock.py的_run_manufacture方法进行拆分 2025-06-18 09:25:44 +08:00
guanhuan
d1811ea24b 需齐套检查修改 2025-06-17 16:33:01 +08:00
guanhuan
b426d5d505 需求计划排序修改 2025-06-17 14:58:27 +08:00
禹翔辉
1dfa22900d Accept Merge Request #2202: (feature/质检样式修改 -> develop)
Merge Request: 1、质检单类型为出厂检测报告时,隐藏通过状态下的不合格按钮;2、功能刀具组装检测BOM物料时过滤产品的追溯类型为不追溯的产品。

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2202
2025-06-17 11:50:01 +08:00
yuxianghui
0eeebf437a 1、质检单类型为出厂检测报告时,隐藏通过状态下的不合格按钮;2、功能刀具组装检测BOM物料时过滤产品的追溯类型为不追溯的产品。 2025-06-17 11:47:26 +08:00
管欢
397d4f29a1 Accept Merge Request #2201: (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/2201
2025-06-17 11:21:00 +08:00
guanhuan
33205c5d29 不同产品调拨单就绪未过滤产品问题 2025-06-17 10:57:13 +08:00
hyyy
568f3e4f30 修改传参,增加提示,默认展示第一个文件 2025-06-17 09:58:53 +08:00
guanhuan
8c43fc2b76 打印方法修改 2025-06-17 09:41:08 +08:00
guanhuan
8960d3d07c Merge remote-tracking branch 'origin/feature/齐套检查与下达生产' into feature/齐套检查与下达生产 2025-06-16 17:42:40 +08:00
guanhuan
95b5c86242 投料齐套检查修改 2025-06-16 17:42:05 +08:00
胡尧
61034c3424 调整数据获取逻辑 2025-06-16 17:33:55 +08:00
hyyy
c2000aa9c5 修改字段名 2025-06-16 17:28:09 +08:00
hyyy
e29456bbf7 选择列表展示图片 2025-06-16 17:25:52 +08:00
胡尧
10e995ec7f 修改获取产量相关接口 2025-06-16 16:25:01 +08:00
禹翔辉
a2f8dc6cec Accept Merge Request #2200: (feature/平台下单优化_1 -> develop)
Merge Request: Merge branch 'feature/平台下单优化' into feature/平台下单优化_1

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2200
2025-06-16 16:06:06 +08:00
yuxianghui
fec095ca6b Merge branch 'feature/平台下单优化' into feature/平台下单优化_1 2025-06-16 16:03:53 +08:00
yuxianghui
aed33dbb35 1、内部下单:行明细增加交期等; 2、处理 bfm平台下单-填写了合同相关字段,未上传合同,合同的相关字段未传到sf销售订单 问题 2025-06-16 16:02:43 +08:00
guanhuan
dbe8c95558 打印页面增加筛选 2025-06-16 15:43:02 +08:00
胡尧
5c7e6e969f Accept Merge Request #2199: (feature/修改产品名称 -> develop)
Merge Request: 客供料的制造订单,不显示采购申请的智能按钮

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2199
2025-06-16 15:00:42 +08:00
胡尧
d70b757487 客供料的制造订单,不显示采购申请的智能按钮 2025-06-16 14:51:07 +08:00
管欢
fb3bb8f1c0 Accept Merge Request #2198: (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/2198
2025-06-16 14:44:40 +08:00
guanhuan
9123aeaee8 人工线下加工最后一个工单完工后未记录时间完工时间 2025-06-16 14:35:28 +08:00
胡尧
e3af0bea3c Accept Merge Request #2197: (feature/修改产品名称 -> develop)
Merge Request: 在调拨单验证前,先进行设置数量

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2197?initial=true
2025-06-16 14:25:27 +08:00
胡尧
af1bc021d6 在调拨单验证前,先进行设置数量 2025-06-16 14:24:50 +08:00
guanhuan
2febc369bb 确认工艺路线新增表面工艺参数需要同步到产品的加工参数中 2025-06-16 13:44:55 +08:00
胡尧
6ee1c5f9a9 Accept Merge Request #2196: (feature/修改产品名称 -> develop)
Merge Request: 修改migrate脚本,解决更新慢的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2196?initial=true
2025-06-16 13:42:42 +08:00
胡尧
5ef8023169 修改migrate脚本,解决更新慢的问题 2025-06-16 13:41:50 +08:00
guanhuan
fa03b562a2 确认工艺路线新增表面工艺参数需要同步到产品的加工参数中 2025-06-16 11:52:22 +08:00
guanhuan
5f55c954d1 确认工艺路线新增表面工艺参数需要同步到产品的加工参数中 2025-06-16 11:42:21 +08:00
胡尧
e0ca13b5b7 Accept Merge Request #2195: (feature/修改产品名称 -> develop)
Merge Request: 修改产品名称

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2195?initial=true
2025-06-16 10:51:28 +08:00
胡尧
dba38f4d37 修改产品名称 2025-06-16 10:50:56 +08:00
胡尧
ceb7a02209 Accept Merge Request #2194: (feature/修改产品名称 -> develop)
Merge Request: 解决修改产品名称带来的影响

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2194?initial=true
2025-06-16 09:36:16 +08:00
胡尧
1811dbf0fd 解决修改产品名称带来的影响 2025-06-16 09:33:52 +08:00
胡尧
1c1d1a74ad Accept Merge Request #2193: (feature/修改产品名称 -> develop)
Merge Request: 修改产品名称生成规则

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2193?initial=true
2025-06-16 09:21:06 +08:00
胡尧
347019d7ee 修改产品名称生成规则 2025-06-16 09:20:32 +08:00
管欢
7d46d00fd7 Accept Merge Request #2192: (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/2192
2025-06-16 08:53:35 +08:00
胡尧
5a22402e7a Accept Merge Request #2191: (feature/修改产品名称 -> develop)
Merge Request: 修改接口授权后,没有赋予用户的bug,导致无法获取公司,增加替换sf销售订单行产品名称的模块

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2191?initial=true
2025-06-13 17:55:13 +08:00
胡尧
f53e34aeb4 修改接口授权后,没有赋予用户的bug,导致无法获取公司,增加替换sf销售订单行产品名称的模块 2025-06-13 17:53:57 +08:00
guanhuan
e145e8a3a4 下发时修改需求计划的总预计加工时间 2025-06-13 15:40:02 +08:00
管欢
0ef6fe73f3 Accept Merge Request #2190: (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/2190
2025-06-13 14:24:29 +08:00
guanhuan
ffad4b7995 修复坯料的采购申请按钮没显示 2025-06-13 14:17:48 +08:00
guanhuan
2c7fbd3aef 修复坯料的采购申请按钮没显示 2025-06-13 10:41:57 +08:00
禹翔辉
72b8d33a3e Accept Merge Request #2189: (feature/功能刀具组装支持搜索更多物料 -> develop)
Merge Request: 功能刀具组装点【更多】按钮弹窗的物料添加【BOM物料】默认筛选,根据BOM筛选出符合条件的物料信息;取消默认筛选后记录按满足BOM的和不满足BOM的顺序排序出现。

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2189
2025-06-13 10:21:32 +08:00
yuxianghui
6517d2bd12 功能刀具组装点【更多】按钮弹窗的物料添加【BOM物料】默认筛选,根据BOM筛选出符合条件的物料信息;取消默认筛选后记录按满足BOM的和不满足BOM的顺序排序出现。 2025-06-13 10:19:11 +08:00
guanhuan
2c97287218 下达生产修改 2025-06-13 10:05:33 +08:00
胡尧
012ff120b4 Accept Merge Request #2188: (hotfix/修复刀具预警没有预警记录和通知 -> develop)
Merge Request: 功能刀具寿命到期消息通知

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2188
2025-06-13 08:41:05 +08:00
胡梓杨
960f05090c Accept Merge Request #2187: (feature/6973 -> 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/2187
2025-06-12 15:48:03 +08:00
huziyang@jikimo.com
6321e7ef23 货位看板详情回退修复,删除幽灵卡片。 2025-06-12 15:38:56 +08:00
管欢
69d200973b Accept Merge Request #2186: (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/2186
2025-06-12 10:57:11 +08:00
guanhuan
448a2cd277 需求计划对应产品的调拨单显示不正确 2025-06-12 10:54:07 +08:00
guanhuan
5a071188cc 需求计划对应产品的调拨单显示不正确 2025-06-12 10:53:46 +08:00
yuxianghui
b8894609a9 功能刀具寿命到期消息通知 2025-06-12 10:10:13 +08:00
yuxianghui
3f8fd6da62 创建刀具拆解单判断条件优化 2025-06-12 09:40:32 +08:00
guanhuan
154a17657c 需求计划材料销售订单行取值问题 2025-06-12 09:35:39 +08:00
yuxianghui
62ead52f00 处理功能刀具预警时没有创建功能刀具预警记录和功能刀具拆解单bug 2025-06-11 17:18:59 +08:00
管欢
23d6e38b24 Accept Merge Request #2185: (hotfix/备注为空 -> 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/2185
2025-06-11 16:02:38 +08:00
管欢
bdc23afc56 Accept Merge Request #2184: (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/2184
2025-06-11 13:51:01 +08:00
guanhuan
b8043b3ad2 修复多条采购申请跳转报错 2025-06-11 11:41:03 +08:00
胡尧
8841d800ea Merge branch 'hotfix/备注为空' into release/release_2.14 2025-06-11 11:28:35 +08:00
guanhuan
920e96ffc6 修复备注为空 2025-06-11 11:19:31 +08:00
yuxianghui
d52f5fa841 修复取消订单时报错bug 2025-06-11 11:15:03 +08:00
guanhuan
37c5c9d498 需求计划列表拖动 2025-06-11 10:40:26 +08:00
guanhuan
6867d7e4ce 需求计划合同号 2025-06-11 09:48:53 +08:00
管欢
9cbd311fec Accept Merge Request #2183: (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/2183
2025-06-11 09:22:25 +08:00
guanhuan
0e753b1c85 命名修改 2025-06-11 08:59:41 +08:00
guanhuan
48316c55b7 命名修改 2025-06-11 08:57:51 +08:00
guanhuan
b33ba9c354 命名修改 2025-06-11 08:56:44 +08:00
胡尧
e0559e9887 Merge branch 'develop' into release/release_2.14 2025-06-10 16:33:57 +08:00
管欢
39a25bb6c8 Accept Merge Request #2180: (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/2180
2025-06-10 16:33:37 +08:00
guanhuan
796e9b0cef 需求计划新增合同日期等字段 2025-06-10 15:49:22 +08:00
禹翔辉
e129c08426 Accept Merge Request #2179: (feature/bfm下单接口优化 -> 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/2179
2025-06-10 15:28:17 +08:00
yuxianghui
c6b47bd68d 销售订单新增合同日期字段 2025-06-10 15:26:32 +08:00
guanhuan
126d60f8d7 Merge branch 'refs/heads/feature/搜索优化' into release/release_2.14 2025-06-10 10:45:52 +08:00
guanhuan
4225a8fe1b 采购申请单完成操作提示调整 2025-06-10 10:45:06 +08:00
guanhuan
a13a79f41f Merge branch 'refs/heads/feature/搜索优化' into release/release_2.14 2025-06-09 17:56:50 +08:00
guanhuan
a828c823dd 采购申请单完成操作修改 2025-06-09 17:55:34 +08:00
guanhuan
9cf2bac9c6 修复返工问题 2025-06-09 17:39:55 +08:00
guanhuan
1926375d58 需求计划文件打印 2025-06-09 10:30:12 +08:00
huziyang@jikimo.com
23dd88b7ba 解决冲突 2025-06-09 10:01:57 +08:00
huziyang@jikimo.com
f164488e48 屏蔽OCC导入 2025-06-09 09:59:47 +08:00
huziyang@jikimo.com
25b53794bb 处理#6973任务:
1货位编码规则简化
2货位看板直观化展示
2025-06-09 09:49:21 +08:00
胡尧
484fab85be Accept Merge Request #2176: (feature/6694 -> develop)
Merge Request: 修改出厂检验报告预览数据

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2176
2025-06-09 09:09:06 +08:00
胡尧
6ed5de6400 修改出厂检验报告预览数据 2025-06-09 09:08:26 +08:00
guanhuan
8224f36567 需求计划页面显示 2025-06-06 15:24:12 +08:00
胡尧
2449b92bc8 Accept Merge Request #2175: (feature/6694 -> develop)
Merge Request: 修复点击智能按钮点击的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2175?initial=true
2025-06-06 09:34:15 +08:00
胡尧
03ec94d223 修复点击智能按钮点击的问题 2025-06-06 09:33:23 +08:00
胡尧
d26e6edd31 Accept Merge Request #2174: (feature/6694 -> develop)
Merge Request: 修改制造订单的采购申请只能按钮判断规则

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2174?initial=true
2025-06-06 09:17:06 +08:00
胡尧
2ea24f2049 修改制造订单的采购申请只能按钮判断规则 2025-06-06 09:16:41 +08:00
guanhuan
b11b6ef283 合同编号显示 2025-06-06 09:11:03 +08:00
胡尧
b1a04f8f44 Accept Merge Request #2173: (feature/6694 -> develop)
Merge Request: 在出厂检验报告验证数量时,增加产品的匹配

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2173?initial=true
2025-06-06 08:37:58 +08:00
胡尧
0b5415dc47 在出厂检验报告验证数量时,增加产品的匹配 2025-06-06 08:37:38 +08:00
胡尧
59569806e6 Accept Merge Request #2172: (feature/6694 -> develop)
Merge Request: 修复二次弹窗不能刷新页面的问题,但是js方法还需要修改

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2172
2025-06-06 08:29:51 +08:00
胡尧
4e1be6f4d5 修复二次弹窗不能刷新页面的问题,但是js方法还需要修改 2025-06-06 08:29:25 +08:00
禹翔辉
cdf8fbb12a Accept Merge Request #2171: (feature/销售合同优化 -> develop)
Merge Request: 1、销售订单添加合同编号字段,bfm下单接口添加合同编号同步;2、优化解除装夹工单完工时解绑rfid逻辑,优化工单返工时新工单绑定rfid逻辑

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2171
2025-06-05 17:03:44 +08:00
yuxianghui
5d0f094da7 1 2025-06-05 17:03:06 +08:00
guanhuan
865d2216af 未齐套提示按钮修改 2025-06-05 17:02:39 +08:00
yuxianghui
95cb5251dc 1、销售订单添加合同编号字段,bfm下单接口添加合同编号同步;2、优化解除装夹工单完工时解绑rfid逻辑,优化工单返工时新工单绑定rfid逻辑 2025-06-05 16:59:33 +08:00
guanhuan
1d01e3ad2e 未齐套提示 2025-06-05 16:17:18 +08:00
禹翔辉
c8fe7504c7 Accept Merge Request #2170: (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/2170
2025-06-05 15:35:03 +08:00
yuxianghui
222efc57c2 返工优化 2025-06-05 15:29:14 +08:00
禹翔辉
735d5c659d Accept Merge Request #2169: (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/2169
2025-06-05 14:53:53 +08:00
yuxianghui
50d188b737 处理自动化产线的确认工艺路线报错 2025-06-05 14:49:09 +08:00
禹翔辉
af3ea0f702 Accept Merge Request #2168: (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/2168
2025-06-05 13:59:35 +08:00
yuxianghui
8bf3b68cee 处理批量修改采购申请报错 2025-06-05 13:52:25 +08:00
禹翔辉
2766bc7d34 Accept Merge Request #2167: (feature/销售合同优化 -> 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/2167
2025-06-05 11:20:09 +08:00
yuxianghui
1082384d00 清除返工工单的rfid,并保留记录 2025-06-05 11:18:47 +08:00
yuxianghui
25aab1576d 返工装夹预调工单时,清除同一个面工单的rfid,并且保留返工工单的rfid记录 2025-06-05 11:11:54 +08:00
禹翔辉
87891b45ef Accept Merge Request #2165: (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/2165
2025-06-05 10:23:23 +08:00
胡尧
b2cfdd8d78 Accept Merge Request #2166: (feature/6694 -> develop)
Merge Request: 修改质检单字段显示

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2166?initial=true
2025-06-05 10:21:11 +08:00
胡尧
540b7bcbea 修改质检单字段显示 2025-06-05 10:19:58 +08:00
yuxianghui
c6cb1d367d 处理返工报错 2025-06-05 10:17:39 +08:00
禹翔辉
001900bd65 Accept Merge Request #2164: (feature/销售合同优化 -> develop)
Merge Request: Merge branch 'feature/采购消息通知' into feature/销售合同优化

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2164
2025-06-05 09:19:28 +08:00
yuxianghui
0204e0e24f Merge branch 'feature/采购消息通知' into feature/销售合同优化 2025-06-05 09:17:26 +08:00
yuxianghui
2b3a2dd21c 1、处理返工报错,2、保存的合同文档添加对应销售订单号 2025-06-05 09:16:02 +08:00
胡尧
57acad4716 Accept Merge Request #2163: (feature/6694 -> develop)
Merge Request: 调整采购申请菜单位置

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2163?initial=true
2025-06-05 09:15:46 +08:00
胡尧
9f97c82a46 调整采购申请菜单位置 2025-06-05 09:15:25 +08:00
胡尧
7cafddd345 Accept Merge Request #2162: (feature/6694 -> develop)
Merge Request: 修改出厂检验报告重新发布按钮,增加确认提示

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2162?initial=true
2025-06-05 08:59:10 +08:00
胡尧
c796697a8e 修改出厂检验报告重新发布按钮,增加确认提示 2025-06-05 08:56:34 +08:00
胡尧
ee523e9aac Accept Merge Request #2161: (feature/6694 -> develop)
Merge Request: 出厂检验报告发布按钮增加判断

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2161?initial=true
2025-06-04 17:36:24 +08:00
胡尧
87fdc7bf74 出厂检验报告发布按钮增加判断 2025-06-04 17:35:57 +08:00
guanhuan
fc41f30244 未齐套提示 2025-06-04 17:31:10 +08:00
guanhuan
fbcd8c57c5 未齐套提示 2025-06-04 16:38:46 +08:00
禹翔辉
e7d84e9df2 Accept Merge Request #2160: (feature/采购消息通知 -> develop)
Merge Request: Merge branch 'feature/销售订单优化' into feature/采购消息通知

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2160
2025-06-04 16:28:15 +08:00
yuxianghui
b7642d1e0f Merge branch 'feature/销售订单优化' into feature/采购消息通知 2025-06-04 16:26:03 +08:00
yuxianghui
05ffbdcc78 采购申请、待质检消息通知优化 2025-06-04 16:24:52 +08:00
胡尧
4b8d00ec1d Accept Merge Request #2159: (feature/6694 -> develop)
Merge Request: 修复质检字段显示错误问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2159?initial=true
2025-06-04 16:06:16 +08:00
胡尧
d2dbf4f986 修复质检字段显示错误问题 2025-06-04 16:05:51 +08:00
guanhuan
b0f2fe6a8e 未齐套提示 2025-06-04 13:38:40 +08:00
禹翔辉
edfd59468f Accept Merge Request #2158: (feature/销售订单优化 -> develop)
Merge Request: Merge branch 'feature/消息通知优化' into feature/销售订单优化

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2158
2025-06-04 11:36:18 +08:00
yuxianghui
d7f04b61b5 Merge branch 'feature/消息通知优化' into feature/销售订单优化 2025-06-04 11:33:04 +08:00
yuxianghui
573b50da68 销售订单添加合同字段,销售订单form页面新增合同page页,优化/api/bfm_process_order/list接口添加合同信息处理。 2025-06-04 11:31:28 +08:00
胡尧
2e0dfc5b02 Accept Merge Request #2157: (feature/6694 -> develop)
Merge Request: 修改没有状态码时默认为200

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2157?initial=true
2025-06-04 09:17:01 +08:00
胡尧
18cdc39719 修改没有状态码时默认为200 2025-06-04 09:16:28 +08:00
guanhuan
de951b1b45 未齐套提示 2025-06-03 16:16:11 +08:00
guanhuan
b8cebe07fe 未齐套提示 2025-05-30 15:06:41 +08:00
胡尧
14fa88da01 Accept Merge Request #2156: (feature/6694 -> develop)
Merge Request: 修改编程返回记录申请人不对的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2156?initial=true
2025-05-30 10:27:10 +08:00
胡尧
162814411f 修改编程返回记录申请人不对的问题 2025-05-30 10:26:34 +08:00
guanhuan
1bdb81f5f7 待下达生产状态修改 2025-05-29 17:05:19 +08:00
胡尧
49e4c88d83 Accept Merge Request #2155: (feature/6694 -> develop)
Merge Request: 解决下发编程单报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2155?initial=true
2025-05-29 16:00:16 +08:00
胡尧
db81114a07 解决下发编程单报错的问题 2025-05-29 15:59:48 +08:00
禹翔辉
e019383187 Accept Merge Request #2154: (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/2154
2025-05-29 14:19:17 +08:00
yuxianghui
4a09148b53 质检消息通知优化 2025-05-29 14:10:36 +08:00
guanhuan
007f39f137 程序工时修改 2025-05-29 11:07:46 +08:00
胡尧
ab139daf02 Accept Merge Request #2153: (feature/6694 -> develop)
Merge Request: 出厂检验报告需求

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2153?initial=true
2025-05-29 10:18:49 +08:00
胡尧
24d83b70d2 出厂检验报告需求 2025-05-29 10:18:18 +08:00
禹翔辉
307510e1ab Accept Merge Request #2152: (feature/消息通知优化 -> develop)
Merge Request: Merge branch 'feature/采购申请消息通知' into feature/消息通知优化

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2152
2025-05-28 16:03:52 +08:00
yuxianghui
9b7222961c Merge branch 'feature/采购申请消息通知' into feature/消息通知优化 2025-05-28 15:58:06 +08:00
yuxianghui
3304398c4c 1、重写待质检提醒消息通知;2、优化采购申请已批准消息通知 2025-05-28 15:56:42 +08:00
胡尧
074e59cee4 Accept Merge Request #2151: (feature/6694 -> develop)
Merge Request: 修改编程下发,修改编程记录

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2151?initial=true
2025-05-28 14:08:43 +08:00
胡尧
7ab8ab47ac 修改编程下发,修改编程记录 2025-05-28 14:08:10 +08:00
guanhuan
9b01254b3c 下达生产 2025-05-28 10:47:03 +08:00
禹翔辉
3a89ebff60 Accept Merge Request #2150: (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/2150
2025-05-28 09:58:22 +08:00
yuxianghui
d0ee2a6564 添加采购申请状态为待批准时的消息通知 2025-05-28 09:54:27 +08:00
黄焱
257d4a3b0a Accept Merge Request #2149: (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/2149?initial=true
2025-05-27 09:13:57 +08:00
guanhuan
53a67d7c76 下达生产 2025-05-26 15:27:07 +08:00
胡尧
40fe1f15a2 Accept Merge Request #2148: (feature/6694 -> develop)
Merge Request: 制造订单的编程记录修改

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2148?initial=true
2025-05-26 09:32:06 +08:00
胡尧
30a6e5bf2e 制造订单的编程记录修改 2025-05-26 09:31:47 +08:00
guanhuan
f4babfcd24 下达生产 2025-05-23 17:26:21 +08:00
禹翔辉
794ea0cbb0 Accept Merge Request #2147: (feature/返工解绑rfid -> develop)
Merge Request: 1、优化返工装夹预调工单时,清理rfid问题;2、优化库位信息接口数据处理方式

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2147
2025-05-23 17:17:06 +08:00
yuxianghui
619285608d 1、优化返工装夹预调工单时,清理rfid问题;2、优化库位信息接口数据处理方式 2025-05-23 17:13:12 +08:00
管欢
433d5d63b7 Accept Merge Request #2146: (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/2146
2025-05-23 15:19:30 +08:00
guanhuan
38109028d4 采购申请关闭修改 2025-05-23 15:13:01 +08:00
guanhuan
cf16a9dd59 采购申请关闭修改 2025-05-23 14:53:34 +08:00
胡尧
4fcbeb30cf Accept Merge Request #2143: (feature/6694 -> develop)
Merge Request: 调整采购单菜单顺序

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2143
2025-05-23 14:47:58 +08:00
胡尧
be8fbca9aa 解决冲突 2025-05-23 14:47:43 +08:00
胡尧
b393951968 去掉采购申请列表默认筛选条件 2025-05-23 14:45:57 +08:00
管欢
6add565a98 Accept Merge Request #2144: (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/2144
2025-05-23 14:22:18 +08:00
guanhuan
1b0dd96b40 采购申请关闭修改 2025-05-23 14:20:48 +08:00
胡尧
89f8718fe1 当询价单确认为采购单时,根据采购申请明细行变为采购单数量来完成采购申请 2025-05-23 14:20:38 +08:00
guanhuan
a5243970d5 需求计划 2025-05-23 14:14:50 +08:00
胡尧
7941c1981c 撤回采购申请视图修改 2025-05-23 11:37:21 +08:00
胡尧
f31e25b3b1 调整采购单菜单顺序 2025-05-23 11:20:17 +08:00
胡尧
ae7e49e307 Accept Merge Request #2142: (feature/6694 -> develop)
Merge Request: 增加分组

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2142?initial=true
2025-05-23 11:11:10 +08:00
胡尧
51c8287bbc 增加分组 2025-05-23 11:10:46 +08:00
胡尧
942d6661f2 修改api接口内容 2025-05-23 10:51:39 +08:00
胡尧
51ae598aac Accept Merge Request #2141: (feature/6694 -> develop)
Merge Request: 取消采购单时,如果该采购单关联的库存移动是由采购申请创建的,则不取消

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2141
2025-05-23 09:43:07 +08:00
胡尧
83229c9ab1 解决冲突 2025-05-23 09:42:52 +08:00
管欢
e62f933ca4 Accept Merge Request #2140: (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/2140
2025-05-23 09:41:03 +08:00
胡尧
1f8e118965 取消采购单时,如果该采购单关联的库存移动是由采购申请创建的,则不取消 2025-05-23 09:39:38 +08:00
guanhuan
e46e6dfc2a 需求计划 2025-05-22 17:40:56 +08:00
guanhuan
2c52372b0a 采购申请隐藏处理中按钮 2025-05-22 11:44:14 +08:00
guanhuan
50f8bf5ab1 需求计划 2025-05-22 11:37:41 +08:00
禹翔辉
5cf3d399f4 Accept Merge Request #2139: (feature/销售订单链接优化 -> develop)
Merge Request: 处理 sf-销售-委外的按钮关联订单数据显示不全 问题

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2139
2025-05-22 11:37:13 +08:00
yuxianghui
e9fc78186e 处理 sf-销售-委外的按钮关联订单数据显示不全 问题 2025-05-22 11:35:53 +08:00
胡尧
a2b2faaa95 Accept Merge Request #2138: (feature/6694 -> develop)
Merge Request: 修改欠单逻辑

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2138?initial=true
2025-05-22 11:10:28 +08:00
禹翔辉
4c7208784f Accept Merge Request #2137: (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/2137
2025-05-22 11:10:12 +08:00
yuxianghui
981569170c Merge branch 'feature/销售委外加工按钮优化_1' into feature/中控接口优化 2025-05-22 11:04:48 +08:00
胡尧
6bf666ac18 修改欠单逻辑 2025-05-22 11:04:12 +08:00
yuxianghui
3a9cd3f39d 1、获取日计划接口优化;2、货位信息接口优化; 2025-05-22 11:04:06 +08:00
胡尧
45b62abcbe Accept Merge Request #2136: (feature/6694 -> develop)
Merge Request: 增加采购申请审批排除字段

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2136?initial=true
2025-05-20 16:51:09 +08:00
胡尧
87740dbee3 增加采购申请审批排除字段 2025-05-20 16:49:08 +08:00
胡尧
a323acf7fc Accept Merge Request #2135: (feature/6694 -> develop)
Merge Request: 取消采购申请部分确认生成的反向单据

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2135?initial=true
2025-05-20 16:09:06 +08:00
胡尧
c23715a1ef 取消采购申请部分确认生成的反向单据 2025-05-20 16:08:03 +08:00
yuxianghui
896c1ad3a7 更新库位信息接口,优化获取到数据后的数据处理逻辑。 2025-05-20 13:46:43 +08:00
管欢
1856a1a4ef Accept Merge Request #2134: (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/2134
2025-05-19 11:04:44 +08:00
guanhuan
8bd09cddf0 采购申请按钮优化 2025-05-19 11:02:43 +08:00
guanhuan
52579673de 采购申请单完成操作优化 2025-05-19 08:54:02 +08:00
胡尧
31cd131993 Accept Merge Request #2133: (feature/6694 -> develop)
Merge Request: 在调拨单确认生成欠单时,修改对应采购申请明细行的目标移动

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2133?initial=true
2025-05-16 11:50:47 +08:00
胡尧
9f94a4e06f 在调拨单确认生成欠单时,修改对应采购申请明细行的目标移动 2025-05-16 11:44:06 +08:00
禹翔辉
e66c6b1e1b Accept Merge Request #2132: (feature/销售委外加工按钮优化_1 -> 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/2132
2025-05-16 09:21:46 +08:00
yuxianghui
e97d0af941 1 2025-05-16 09:18:25 +08:00
yuxianghui
65122d38d5 处理 销售-外购,委外的按钮关联订单数据显示不全 bug 2025-05-16 09:17:13 +08:00
胡尧
b626cbe217 Accept Merge Request #2131: (feature/6694 -> develop)
Merge Request: 解决库存单据零件图号零件名称不对的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2131?initial=true
2025-05-16 09:15:46 +08:00
胡尧
4b443e65f6 解决库存单据零件图号零件名称不对的问题 2025-05-16 09:14:37 +08:00
胡尧
14700d6bf0 Accept Merge Request #2130: (feature/6694 -> develop)
Merge Request: 解决工艺外协采购单不显示的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2130
2025-05-15 16:49:05 +08:00
胡尧
a3c0fd3ccf 解决工艺外协采购单不显示的问题 2025-05-15 16:48:34 +08:00
胡尧
a29265f17d 修改正则匹配成品名字序号 2025-05-15 16:39:57 +08:00
胡尧
0821ed021a Accept Merge Request #2129: (feature/6694 -> develop)
Merge Request: 解决采购申请中零件图号不匹配的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2129?initial=true
2025-05-15 16:30:28 +08:00
胡尧
ac4883db66 解决采购申请中零件图号不匹配的问题 2025-05-15 16:29:33 +08:00
胡尧
5706aa0052 Accept Merge Request #2127: (feature/6694 -> develop)
Merge Request: 增加零件图号

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2127?initial=true
2025-05-15 16:12:18 +08:00
胡尧
f780e4f7ce 增加零件图号 2025-05-15 16:11:31 +08:00
胡尧
e6d8ebb7b3 修改 2025-05-15 14:39:40 +08:00
胡尧
3663e04b34 Accept Merge Request #2126: (feature/6694 -> develop)
Merge Request: 解决产品模板复制的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2126?initial=true
2025-05-15 12:14:51 +08:00
胡尧
c2e4085b50 解决产品模板复制的问题 2025-05-15 12:14:33 +08:00
胡尧
33c881b12f Accept Merge Request #2125: (feature/6694 -> develop)
Merge Request: 回退工艺外协代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2125?initial=true
2025-05-15 11:07:51 +08:00
胡尧
c80e12d731 回退工艺外协代码 2025-05-15 11:07:22 +08:00
胡尧
5446ef18e2 回退代码 2025-05-15 10:36:38 +08:00
胡尧
9c4d545915 Merge branch 'develop' into feature/6694 2025-05-15 10:33:42 +08:00
胡尧
f6d8cb6267 编程单增加零件图号 2025-05-15 08:45:02 +08:00
胡尧
c898e02860 解决制造申请字段未复制到成品中 2025-05-14 17:02:04 +08:00
胡尧
5477582a69 修改中控日志接口授权为none 2025-05-14 16:09:06 +08:00
胡尧
9cb22d810e 增加接口日志 2025-05-12 15:14:04 +08:00
胡尧
cab6b6fa2a 解决代码问题 2025-05-12 14:46:15 +08:00
胡尧
35bf954529 增加中控接口调用日志记录 2025-05-12 11:50:35 +08:00
胡尧
ceb38aa483 Accept Merge Request #2106: (feature/tool_standard_library_process -> develop)
Merge Request: 工艺外协代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2106
2025-05-12 08:41:26 +08:00
胡尧
11ecad5ef2 解决冲突 2025-05-12 08:41:12 +08:00
管欢
8249d1427f Accept Merge Request #2105: (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/2105
2025-05-09 18:28:56 +08:00
guanhuan
94bcfc0543 采购申请数量修改过滤取消 2025-05-09 18:15:40 +08:00
guanhuan
b4d31c7c4b 采购申请数量修改 2025-05-09 17:50:43 +08:00
胡尧
61bcd72a41 表面工艺外协调拨单数量问题 2025-05-09 17:24:24 +08:00
胡尧
d7f7bb9a57 Accept Merge Request #2104: (release/release_2.13 -> develop)
Merge Request: 处理特殊表面工艺采购单确认报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2104?initial=true
2025-05-09 15:26:50 +08:00
胡尧
ee87e1dacf 处理特殊表面工艺采购单确认报错的问题 2025-05-09 15:26:12 +08:00
胡尧
2f6c41c999 Accept Merge Request #2103: (release/release_2.13 -> develop)
Merge Request: 修改制造目录文件结构

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2103?initial=true
2025-05-09 14:58:09 +08:00
胡尧
d0d4db1555 修改制造目录文件结构 2025-05-09 14:57:35 +08:00
胡尧
62cbb4b796 Merge branch 'develop' into release/release_2.13 2025-05-09 14:08:06 +08:00
胡尧
f040406002 Accept Merge Request #2102: (feature/6694 -> develop)
Merge Request: 确认接收时,将不追溯的产品的完成数量自动填上

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2102?initial=true
2025-05-09 13:43:36 +08:00
胡尧
bfff4ac440 确认接收时,将不追溯的产品的完成数量自动填上 2025-05-09 13:43:10 +08:00
胡尧
a97386c37c Accept Merge Request #2101: (feature/6694 -> develop)
Merge Request: 调整质检单字段

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2101?initial=true
2025-05-09 10:34:59 +08:00
胡尧
18ae46207a 调整质检单字段 2025-05-09 10:34:23 +08:00
胡尧
bacddd2ad8 修改字段翻译 2025-05-09 08:47:33 +08:00
胡尧
dd5794899d Accept Merge Request #2100: (feature/6694 -> develop)
Merge Request: 人工线下返工在不选择重新编程时复制加工图纸

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2100?initial=true
2025-05-08 21:22:21 +08:00
胡尧
e5b730b2ef 人工线下返工在不选择重新编程时复制加工图纸 2025-05-08 21:21:51 +08:00
胡尧
aea158de41 质检单数量约束 2025-05-08 20:32:59 +08:00
胡尧
a933a0ffea Accept Merge Request #2099: (feature/6694 -> develop)
Merge Request: 委外加工的入库单增加采购申请按钮

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2099?initial=true
2025-05-08 20:13:20 +08:00
胡尧
7575424760 委外加工的入库单增加采购申请按钮 2025-05-08 20:12:12 +08:00
胡尧
6c2eb40e6a Accept Merge Request #2098: (feature/6694 -> develop)
Merge Request: 解决制造订单不显示采购申请按钮的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2098?initial=true
2025-05-08 17:48:05 +08:00
胡尧
f10f595fa4 解决制造订单不显示采购申请按钮的问题 2025-05-08 17:47:40 +08:00
胡尧
6d1de42d76 Accept Merge Request #2097: (feature/6694 -> develop)
Merge Request: 修复收料入库单明细不对的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2097?initial=true
2025-05-08 17:30:19 +08:00
胡尧
5dc16c039c 修复收料入库单明细不对的问题 2025-05-08 17:29:41 +08:00
胡尧
c416cdbeed Accept Merge Request #2096: (feature/6694 -> develop)
Merge Request: 取消采购申请合并明细行的代码,会导致其他后续单据的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2096?initial=true
2025-05-08 16:47:22 +08:00
胡尧
18c7b22319 取消采购申请合并明细行的代码,会导致其他后续单据的问题 2025-05-08 16:47:01 +08:00
liaodanlong
b5339046b9 工艺外协代码 2025-05-08 16:42:18 +08:00
胡尧
e0ba222382 Accept Merge Request #2095: (feature/6694 -> develop)
Merge Request: 解决计算字段报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2095?initial=true
2025-05-08 15:57:52 +08:00
胡尧
58b00e6442 解决计算字段报错的问题 2025-05-08 15:57:16 +08:00
胡尧
9182dbfb5d Accept Merge Request #2094: (feature/6694 -> develop)
Merge Request: 修复质检的bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2094?initial=true
2025-05-08 15:20:48 +08:00
胡尧
27516844af 修复质检的bug 2025-05-08 15:20:08 +08:00
胡尧
99237445ac 修复质检的bug 2025-05-08 15:17:01 +08:00
管欢
9349ca91d3 Accept Merge Request #2093: (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/2093
2025-05-08 09:18:28 +08:00
liaodanlong
51c517145b 工艺外协代码 2025-05-07 17:17:41 +08:00
guanhuan
c55f3d77bf Merge branch 'refs/heads/feature/采购申请优化' into release/release_2.13 2025-05-07 16:45:18 +08:00
guanhuan
95716c2e3e 采购申请明细优化 2025-05-07 16:44:48 +08:00
胡尧
5f72519dc2 Accept Merge Request #2092: (feature/6694 -> develop)
Merge Request: 增加采购申请对于单件制造非首个制造订单的显示,修改采购申请对于同一个补货组同一个产品的合并

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2092?initial=true
2025-05-07 16:35:22 +08:00
胡尧
c24bba3137 增加采购申请对于单件制造非首个制造订单的显示,修改采购申请对于同一个补货组同一个产品的合并 2025-05-07 16:34:45 +08:00
guanhuan
01bb6fd0aa Merge branch 'refs/heads/feature/采购申请优化' into release/release_2.13 2025-05-07 16:04:47 +08:00
guanhuan
bf4add6b78 采购申请明细优化 2025-05-07 16:02:39 +08:00
hyyy
51a8964b89 修复出厂检验质检单详情手动新增明细行后右边的【删除】按钮显示不全 2025-05-07 15:48:05 +08:00
胡尧
7d986fe139 Accept Merge Request #2091: (feature/6694 -> develop)
Merge Request: 表面工艺外协工单流程数量按照制造订单的product_uom_qty设置

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2091?initial=true
2025-05-07 13:02:51 +08:00
胡尧
fffbfc21c2 表面工艺外协工单流程数量按照制造订单的product_uom_qty设置 2025-05-07 13:02:13 +08:00
胡尧
6451bfbc42 Accept Merge Request #2090: (feature/6694 -> develop)
Merge Request: 修改判断坯料序列号的逻辑

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2090?initial=true
2025-05-07 11:01:51 +08:00
胡尧
5aa848de53 修改判断坯料序列号的逻辑 2025-05-07 11:01:01 +08:00
liaodanlong
efc4ae31c9 工艺外协代码 2025-05-07 11:00:32 +08:00
liaodanlong
0863238819 Merge branch 'refs/heads/develop' into feature/tool_standard_library_process 2025-05-07 11:00:24 +08:00
胡尧
4f181e5eba Accept Merge Request #2089: (feature/6694 -> develop)
Merge Request: 将成品的追溯复制到product上,将坯料的追溯同成品的追组

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2089
2025-05-07 08:52:19 +08:00
胡尧
2bf43ae9a1 将成品的追溯复制到product上,将坯料的追溯同成品的追组 2025-05-07 08:47:33 +08:00
胡尧
d98d04d4ed Accept Merge Request #2088: (feature/6694 -> develop)
Merge Request: Merge branch 'develop' into feature/6694

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2088
2025-05-06 15:23:05 +08:00
胡尧
602d6678bc Merge branch 'develop' into feature/6694 2025-05-06 15:22:08 +08:00
胡尧
8fd0c4e1f1 修复计算当前货位的逻辑,减少循环次数 2025-05-06 15:21:45 +08:00
管欢
514fd79c3e Accept Merge Request #2087: (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/2087
2025-04-29 13:58:19 +08:00
liaodanlong
95c25ac7b8 工艺外协代码 2025-04-29 13:39:36 +08:00
guanhuan
21d052e222 采购申请明细优化 2025-04-29 10:40:19 +08:00
胡尧
95e2c2db0d Accept Merge Request #2086: (feature/6694 -> develop)
Merge Request: 修改打印逻辑,先找默认打印机,未找到则直接返回

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2086?initial=true
2025-04-29 10:11:16 +08:00
胡尧
17a29b7b29 修改打印逻辑,先找默认打印机,未找到则直接返回 2025-04-29 10:09:41 +08:00
胡尧
dd745423a1 修改打印逻辑,先找默认打印机,未找到则直接返回 2025-04-29 10:03:09 +08:00
胡尧
a534e5f400 Accept Merge Request #2085: (feature/6694 -> develop)
Merge Request: 删除多余的打印代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2085?initial=true
2025-04-28 19:29:01 +08:00
胡尧
4dc7b5857e 删除多余的打印代码 2025-04-28 19:28:31 +08:00
胡尧
dc679c46cc Accept Merge Request #2084: (feature/6694 -> develop)
Merge Request: 简化打印代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2084?initial=true
2025-04-28 19:18:26 +08:00
胡尧
8ccf6cc365 简化打印代码 2025-04-28 19:18:02 +08:00
胡尧
f8457ae66b Accept Merge Request #2083: (feature/6694 -> develop)
Merge Request: 简化打印代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2083?initial=true
2025-04-28 19:12:31 +08:00
胡尧
12c8641f2e 简化打印代码 2025-04-28 19:12:08 +08:00
胡尧
f42938f668 Accept Merge Request #2082: (feature/6694 -> develop)
Merge Request: 增加打印日志

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2082?initial=true
2025-04-28 18:28:49 +08:00
胡尧
a856c5cbf7 增加打印日志 2025-04-28 18:28:21 +08:00
胡尧
6411e79904 Accept Merge Request #2081: (feature/6694 -> develop)
Merge Request: 增加日志

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2081?initial=true
2025-04-28 16:42:39 +08:00
胡尧
946f08c479 增加日志 2025-04-28 16:42:20 +08:00
胡尧
4a198639ec Accept Merge Request #2080: (feature/6694 -> develop)
Merge Request: Merge branch 'develop' into feature/6694

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2080?initial=true
2025-04-28 15:47:42 +08:00
胡尧
234812bb40 Merge branch 'develop' into feature/6694 2025-04-28 15:47:15 +08:00
胡尧
dd43e31c3c 修改打印pdf数据 2025-04-28 15:46:35 +08:00
廖丹龙
2f5b0281c3 Accept Merge Request #2079: (feature/process_outsourcing_code_stripping -> develop)
Merge Request: Merge remote-tracking branch 'origin/release/release_2.12' into release/release_2.12

Created By: @廖丹龙
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @廖丹龙
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2079
2025-04-28 15:26:22 +08:00
liaodanlong
d4cf2a9d17 Merge remote-tracking branch 'origin/release/release_2.12' into release/release_2.12 2025-04-28 09:43:49 +08:00
liaodanlong
ecf5dcf2f2 sf .r-采购-采购订单-坯料委外加工生成的采购申请创建采购订单的类型不正确 2025-04-28 09:43:25 +08:00
胡尧
848e8a5fa8 merge branch 'develop' into release/release_2.12 2025-04-28 09:12:50 +08:00
胡尧
cc38383e32 Accept Merge Request #2078: (feature/6694 -> develop)
Merge Request: 修复bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2078?initial=true
2025-04-28 09:12:31 +08:00
胡尧
39de4e5ea1 修复bug 2025-04-28 09:12:09 +08:00
胡尧
8b6c904dae Merge branch 'develop' into release/release_2.12 2025-04-28 08:57:10 +08:00
胡尧
a63f2d28f6 Accept Merge Request #2077: (feature/6694 -> develop)
Merge Request: 修改字体获取目录

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2077?initial=true
2025-04-28 08:56:49 +08:00
liaodanlong
08812f169e Merge remote-tracking branch 'origin/release/release_2.12' into release/release_2.12 2025-04-27 17:20:40 +08:00
liaodanlong
ce79016bef 返工未申请重新编程,新工单复制程序文件问题处理 2025-04-27 17:20:15 +08:00
胡尧
fef960f7e8 修改字体获取目录 2025-04-27 16:29:39 +08:00
胡尧
425c9fb64b Merge branch 'develop' into release/release_2.12 2025-04-27 15:32:52 +08:00
胡尧
fc9a58c0c3 Accept Merge Request #2076: (feature/6694 -> develop)
Merge Request: 退回字体处理

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2076?initial=true
2025-04-27 15:32:31 +08:00
胡尧
ed90ad34e6 退回字体处理 2025-04-27 15:32:08 +08:00
胡尧
5662094ec4 Accept Merge Request #2075: (feature/6694 -> develop)
Merge Request: 屏蔽删除文件代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2075?initial=true
2025-04-27 15:25:42 +08:00
胡尧
404c56e134 屏蔽删除文件代码 2025-04-27 15:24:28 +08:00
胡尧
9ee614aa10 Accept Merge Request #2074: (feature/6694 -> develop)
Merge Request: 修改上传ftp代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2074?initial=true
2025-04-27 15:11:46 +08:00
胡尧
57789dc5a5 修改上传ftp代码 2025-04-27 15:10:22 +08:00
胡尧
52d436909b Merge branch 'develop' into release/release_2.12 2025-04-27 14:37:18 +08:00
胡尧
3a760a66e1 Accept Merge Request #2073: (feature/6694 -> develop)
Merge Request: 退回字体修改

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2073
2025-04-27 14:36:57 +08:00
胡尧
72415d633c 退回字体修改 2025-04-27 14:36:13 +08:00
胡尧
5c67a8c190 Accept Merge Request #2072: (feature/6694 -> develop)
Merge Request: 修改验证规则

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2072?initial=true
2025-04-27 14:27:08 +08:00
胡尧
46ba682848 修改验证规则 2025-04-27 14:26:31 +08:00
胡尧
6b38062e87 解决冲突 2025-04-27 14:15:26 +08:00
胡尧
0945754736 Accept Merge Request #2071: (feature/6694 -> develop)
Merge Request: 解决pdf上数字乱码的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2071?initial=true
2025-04-27 14:13:45 +08:00
胡尧
644ff967e5 解决pdf上数字乱码的问题 2025-04-27 14:10:29 +08:00
liaodanlong
5f79d2038c 工艺外协采购单展示问题 2025-04-27 11:49:56 +08:00
liaodanlong
defd779279 返工 不重新编程 cnc加工工单没有数据问题 2025-04-27 11:35:29 +08:00
liaodanlong
e2e820267e 字符串拼接问题处理 2025-04-27 11:04:09 +08:00
liaodanlong
94f179a6d6 工艺外协代码回退 2025-04-27 10:46:48 +08:00
liaodanlong
bf9f4c1276 工艺外协代码回退 2025-04-27 10:20:45 +08:00
liaodanlong
51a633594f 工艺外协代码回退 2025-04-27 09:24:39 +08:00
liaodanlong
7d7c7b0fcf 工艺外协代码回退 2025-04-27 09:09:48 +08:00
liaodanlong
d88ac22b7c Merge branch 'refs/heads/develop' into release/release_2.12 2025-04-27 09:02:27 +08:00
廖丹龙
1f4e1c11c8 Accept Merge Request #2070: (feature/process_outsourcing_code_stripping -> develop)
Merge Request: Merge remote-tracking branch 'origin/develop' into develop

Created By: @廖丹龙
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @廖丹龙
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2070
2025-04-27 09:00:49 +08:00
liaodanlong
9f1beb4013 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	sf_manufacturing/models/mrp_production.py
#	sf_manufacturing/models/purchase_order.py
#	sf_sale/models/sale_order.py
2025-04-27 08:50:45 +08:00
liaodanlong
f864466987 Merge branch 'refs/heads/feature/process_outsourcing_code_stripping' into develop 2025-04-27 08:49:13 +08:00
liaodanlong
9cf70cc54c 工艺外协代码回退 2025-04-26 14:42:38 +08:00
胡尧
82bd50cb97 修改文件传输规则 2025-04-25 17:30:51 +08:00
胡尧
4bce26721d Merge branch 'develop' into release/release_2.12 2025-04-25 16:41:08 +08:00
胡尧
3fb4e7c413 Accept Merge Request #2069: (feature/6694 -> develop)
Merge Request: 调整字体大小

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2069?initial=true
2025-04-25 16:40:24 +08:00
胡尧
a7ab8679f4 调整字体大小 2025-04-25 16:39:51 +08:00
胡尧
ca9a91e30a 修改程序单二维码下方文字 2025-04-25 16:07:34 +08:00
胡尧
314d738412 接口授权 2025-04-25 15:59:11 +08:00
胡尧
699e03ccda Accept Merge Request #2068: (release/release_2.12 -> develop)
Merge Request: 解决冲突

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2068?initial=true
2025-04-25 15:58:27 +08:00
管欢
8f0ade7b43 Accept Merge Request #2067: (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/2067
2025-04-25 15:55:38 +08:00
胡尧
50bc8786e8 解决冲突 2025-04-25 15:50:40 +08:00
胡尧
0777e63bc7 修复字符集出错的问题 2025-04-25 15:49:41 +08:00
guanhuan
128bebf338 紧急采购默认为是 2025-04-25 14:57:56 +08:00
廖丹龙
7a71077aa7 Accept Merge Request #2066: (feature/tool_standard_library_process -> 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/2066
2025-04-25 14:41:01 +08:00
liaodanlong
10a1d43a17 排程 2025-04-25 14:39:58 +08:00
胡尧
87d351e9e9 Accept Merge Request #2065: (feature/6694 -> develop)
Merge Request: 增加接口授权

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2065?initial=true
2025-04-25 14:09:36 +08:00
胡尧
d2daae1a8f 增加接口授权 2025-04-25 14:09:13 +08:00
胡尧
5997c24895 Accept Merge Request #2064: (feature/6694 -> develop)
Merge Request: 增加传输文件列表返回

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2064?initial=true
2025-04-25 14:05:10 +08:00
胡尧
df53989f22 增加传输文件列表返回 2025-04-25 14:04:48 +08:00
胡尧
9bab687080 Accept Merge Request #2063: (feature/6609 -> develop)
Merge Request: 修改机台二维码为机台编码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2063?initial=true
2025-04-25 13:45:29 +08:00
胡尧
a5ac8b8b84 修改机台二维码为机台编码 2025-04-25 13:40:18 +08:00
胡尧
2cde398e11 Accept Merge Request #2062: (feature/6609 -> develop)
Merge Request: 修改机台二维码为机台编码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2062?initial=true
2025-04-25 13:38:29 +08:00
胡尧
88026fea5d 修改机台二维码为机台编码 2025-04-25 13:37:12 +08:00
liaodanlong
443a21a0cc 工序外协需求 2025-04-25 11:46:05 +08:00
马广威
e14646a6fc Accept Merge Request #2061: (feature/制造功能优化 -> develop)
Merge Request: 调整dashboard取值

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2061?initial=true
2025-04-25 11:35:31 +08:00
mgw
6a920be6d1 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-25 11:34:51 +08:00
mgw
3811079a7f 调整alarm_start_time为时间戳 2025-04-25 11:34:34 +08:00
mgw
ad8e0b6af0 调整当日故障时长取值 2025-04-25 11:25:38 +08:00
廖丹龙
04cb910803 Accept Merge Request #2060: (feature/tool_standard_library_process -> develop)
Merge Request: 【sf.t-计划】在排程单详情页选择时间段进行排程时未校验日历有效工作时间

Created By: @廖丹龙
Reviewed By: @马广威
Approved By: @马广威 
Accepted By: @廖丹龙
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2060
2025-04-25 11:18:43 +08:00
liaodanlong
42292818af Merge branch 'refs/heads/develop' into feature/tool_standard_library_process
# Conflicts:
#	sf_plan/models/custom_plan.py
2025-04-25 11:17:48 +08:00
liaodanlong
bcafd9cf38 【sf.t-计划】在排程单详情页选择时间段进行排程时未校验日历有效工作时间 2025-04-25 11:16:23 +08:00
mgw
12ebd87f1d Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-25 10:14:00 +08:00
mgw
bdef852b98 调整当日在线时长取值为今天之前最后一次开机时长 2025-04-25 10:13:42 +08:00
胡尧
1d5fb747d4 Accept Merge Request #2059: (feature/6609 -> develop)
Merge Request: 解决更新出现字段未找到的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2059?initial=true
2025-04-25 10:09:21 +08:00
胡尧
8116e4f97d 解决更新出现字段未找到的问题 2025-04-25 10:08:03 +08:00
mgw
e3e5fcc378 调整当日故障时长 2025-04-25 09:42:45 +08:00
胡尧
879b5492db Accept Merge Request #2058: (feature/6609 -> develop)
Merge Request: 产品详情增加只有成品类型才显示模型ID

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2058
2025-04-25 09:19:17 +08:00
胡尧
27b9a4f982 解决冲突 2025-04-25 09:19:00 +08:00
胡尧
94007bae2b 产品详情增加只有成品类型才显示模型ID 2025-04-25 09:16:40 +08:00
mgw
bf92028027 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-24 17:27:40 +08:00
mgw
2b47e566d3 调整周期字段为当日0时间 2025-04-24 17:27:20 +08:00
胡尧
5aa2f1aa18 Accept Merge Request #2057: (feature/6694 -> develop)
Merge Request: 解决排程报错的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2057?initial=true
2025-04-24 17:08:10 +08:00
胡尧
b7128ba81a 解决排程报错的问题 2025-04-24 17:07:30 +08:00
胡尧
49546f9d08 Accept Merge Request #2056: (feature/6694 -> develop)
Merge Request: 修改参数类型判断

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2056?initial=true
2025-04-24 15:13:40 +08:00
胡尧
6959bd9a09 修改参数类型判断 2025-04-24 15:13:21 +08:00
禹翔辉
3a2babf2d5 Accept Merge Request #2055: (feature/工单排序_1 -> develop)
Merge Request: Merge branch 'feature/工单排序' into feature/工单排序_1

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2055
2025-04-24 15:11:23 +08:00
yuxianghui
d7d094c84d Merge branch 'feature/工单排序' into feature/工单排序_1 2025-04-24 15:05:57 +08:00
yuxianghui
a06e24583d 添加工单先按工序排序,再按创建时间排序 2025-04-24 15:04:04 +08:00
胡尧
0cbd830901 Accept Merge Request #2053: (feature/6694 -> develop)
Merge Request: 修改模型id为模型ID,增加机台判断

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2053?initial=true
2025-04-24 14:59:12 +08:00
胡尧
4b29def105 修改模型id为模型ID,增加机台判断 2025-04-24 14:58:50 +08:00
胡尧
582abb3f2e Accept Merge Request #2052: (feature/6694 -> develop)
Merge Request: 去掉产品form重复的字段

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2052?initial=true
2025-04-24 14:38:07 +08:00
胡尧
40137ba69c 去掉产品form重复的字段 2025-04-24 14:31:22 +08:00
胡尧
804f6a82b4 Accept Merge Request #2051: (feature/6694 -> develop)
Merge Request: 销售订单,制造订单视图中加入模型id

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2051?initial=true
2025-04-24 14:15:58 +08:00
胡尧
d16d47dfbe 销售订单,制造订单视图中加入模型id 2025-04-24 14:13:10 +08:00
胡尧
41cf9d5474 Accept Merge Request #2050: (feature/6694 -> develop)
Merge Request: 修改扫码报错信息

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2050?initial=true
2025-04-24 11:42:52 +08:00
胡尧
59aa6b4f10 修改扫码报错信息 2025-04-24 11:42:16 +08:00
胡尧
a759106fdc Accept Merge Request #2049: (feature/6694 -> develop)
Merge Request: 调整打印代码结构

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2049?initial=true
2025-04-24 11:08:45 +08:00
胡尧
8bb101c6b2 调整打印代码结构 2025-04-24 11:08:02 +08:00
胡尧
f02044b513 Accept Merge Request #2048: (feature/6694 -> develop)
Merge Request: 调整机台二维码使用A4打印机

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2048?initial=true
2025-04-24 09:59:29 +08:00
胡尧
3d937b85c9 调整机台二维码使用A4打印机 2025-04-24 09:59:05 +08:00
胡尧
5a61b3b459 调整机台二维码使用A4打印机 2025-04-24 09:58:27 +08:00
胡尧
afccb5ee6a Accept Merge Request #2047: (feature/6694 -> develop)
Merge Request: 修改机台二维码为ID

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2047?initial=true
2025-04-24 09:19:13 +08:00
胡尧
2b0648d9bc 修改机台二维码为ID 2025-04-24 09:18:49 +08:00
胡尧
8ea3487044 Accept Merge Request #2046: (feature/6694 -> develop)
Merge Request: 增加import

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2046?initial=true
2025-04-24 08:59:38 +08:00
胡尧
b24ed5fe4c 增加import 2025-04-24 08:59:07 +08:00
胡尧
b801b265c3 Accept Merge Request #2045: (feature/6694 -> develop)
Merge Request: 增加日志界面

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2045?initial=true
2025-04-23 17:51:41 +08:00
胡尧
27a67167fe 增加日志界面 2025-04-23 17:51:09 +08:00
胡尧
8fa9534b4e 增加接口请求日志,修改报工接口获取机台id 2025-04-23 17:39:42 +08:00
胡尧
db745e46b6 Accept Merge Request #2044: (feature/6609 -> develop)
Merge Request: 解决从制造订单跳转到产品无法显示模型id的问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2044?initial=true
2025-04-23 16:59:51 +08:00
胡尧
f598b6c71c 解决从制造订单跳转到产品无法显示模型id的问题 2025-04-23 16:58:59 +08:00
胡尧
dccb0b3fb0 Accept Merge Request #2043: (feature/6763 -> develop)
Merge Request: 修改机台二维码为机台ID

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2043?initial=true
2025-04-23 16:16:50 +08:00
胡尧
83feb78f43 修改机台二维码为机台ID 2025-04-23 16:16:25 +08:00
胡尧
ac09794b10 Accept Merge Request #2042: (feature/6763 -> develop)
Merge Request: 解决模块更新报错问题

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2042?initial=true
2025-04-23 16:00:13 +08:00
胡尧
3f88b11a18 解决模块更新报错问题 2025-04-23 15:59:37 +08:00
胡尧
b97acfb181 Accept Merge Request #2041: (feature/6684 -> develop)
Merge Request: 取消线上解决bug的改动

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2041?initial=true
2025-04-23 14:24:00 +08:00
胡尧
6767b693f5 取消线上解决bug的改动 2025-04-23 14:22:50 +08:00
胡尧
7b77d846c3 Accept Merge Request #2040: (hotfix/解决采购申请bug -> develop)
Merge Request: 解决创建采购申请报错

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2040?initial=true
2025-04-23 14:21:27 +08:00
廖丹龙
5e3bce1931 Accept Merge Request #2038: (feature/tool_standard_library_process -> 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/2038
2025-04-23 11:25:04 +08:00
liaodanlong
ef5c2649c9 【sf.t-计划】在排程单详情页选择时间段进行排程时未校验日历有效工作时间 2025-04-23 11:24:38 +08:00
禹翔辉
5400c9ec69 Accept Merge Request #2039: (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/2039
2025-04-23 11:22:47 +08:00
yuxianghui
7c7876e96f 工单添加默认按工序排序 2025-04-23 11:19:08 +08:00
liaodanlong
5438ff6df1 排程产能限制问题 2025-04-23 11:06:03 +08:00
胡尧
05b5e9cfd9 解决创建采购申请报错 2025-04-23 10:32:39 +08:00
胡尧
86dfd437cc 解决创建采购申请报错 2025-04-23 10:31:30 +08:00
胡尧
3a92e4cfd8 解决创建采购申请报错 2025-04-23 10:22:20 +08:00
胡尧
bff0ff9401 增加日志 2025-04-23 10:18:49 +08:00
管欢
9b3fe5c070 Accept Merge Request #2036: (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/2036
2025-04-23 09:48:26 +08:00
廖丹龙
92d593bf24 Accept Merge Request #2037: (feature/tool_standard_library_process -> 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/2037
2025-04-23 09:38:27 +08:00
liaodanlong
dc6fb4ddda 采购申请单查询条件同一 2025-04-23 09:34:02 +08:00
廖丹龙
a84f8636a4 Accept Merge Request #2035: (feature/tool_standard_library_process -> 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/2035
2025-04-23 09:12:59 +08:00
liaodanlong
7c26045377 工艺确认报错问题处理 2025-04-23 09:12:20 +08:00
胡尧
da579a15b3 Accept Merge Request #2034: (feature/6694 -> develop)
Merge Request: 修复bug

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2034?initial=true
2025-04-23 08:53:23 +08:00
胡尧
c9ee0af25a 修复bug 2025-04-23 08:52:49 +08:00
guanhuan
151bc5da4f 报价菜单修改 2025-04-22 15:43:14 +08:00
胡尧
1015af483c Accept Merge Request #2033: (feature/6694 -> develop)
Merge Request: 修改ftp传输代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2033?initial=true
2025-04-22 15:23:29 +08:00
胡尧
bb3971c93e 修改ftp传输代码 2025-04-22 15:23:02 +08:00
马广威
aa9efe932e Accept Merge Request #2032: (feature/制造功能优化 -> develop)
Merge Request: 处理浮点型增0问题

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2032
2025-04-22 15:13:28 +08:00
廖丹龙
8e09e9715c Accept Merge Request #2031: (feature/tool_standard_library_process -> 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/2031
2025-04-22 15:05:42 +08:00
mgw
30a55658de 处理浮点型增0问题 2025-04-22 15:02:38 +08:00
liaodanlong
7ecdc31db4 空值处理 2025-04-22 15:00:54 +08:00
廖丹龙
4234a6bbd9 Accept Merge Request #2030: (feature/tool_standard_library_process -> 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/2030
2025-04-22 14:28:29 +08:00
liaodanlong
8fcc436ce5 设置字段必填 2025-04-22 14:24:10 +08:00
liaodanlong
53a676bc93 查询条件修改 2025-04-22 14:22:31 +08:00
廖丹龙
c6f625fe44 Accept Merge Request #2027: (feature/tool_standard_library_process -> 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/2027
2025-04-22 13:49:59 +08:00
liaodanlong
397c35867b 产品设置默认供应商数据 2025-04-22 13:41:22 +08:00
liaodanlong
f843610872 采购申请处理 2025-04-22 13:40:15 +08:00
liaodanlong
41e4d2656a 采购申请单 2025-04-22 13:39:57 +08:00
liaodanlong
4272d2855f 坯料自动勾选工艺路线 2025-04-22 13:38:50 +08:00
马广威
e63a12cbc1 Accept Merge Request #2029: (feature/制造功能优化 -> develop)
Merge Request: 调整上传文件名

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2029?initial=true
2025-04-22 13:17:03 +08:00
mgw
2867264e88 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-22 13:16:34 +08:00
mgw
7c2ddd8a0c 调整上传文件名 2025-04-22 13:16:15 +08:00
马广威
4daddcff61 Accept Merge Request #2028: (feature/制造功能优化 -> develop)
Merge Request: 调整适配零件图号为数字

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2028?initial=true
2025-04-22 11:51:29 +08:00
mgw
666c0167d7 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-22 11:50:33 +08:00
mgw
6b7f1aedbe 调整适配零件图号为数字 2025-04-22 11:50:15 +08:00
mgw
4234494f08 调整可用率 2025-04-22 10:55:21 +08:00
liaodanlong
cbc73ee8e3 工艺相关展示调整 2025-04-21 16:04:36 +08:00
黄焱
ec3d2a9239 Accept Merge Request #2026: (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/2026?initial=true
2025-04-21 16:04:32 +08:00
hyyy
a55da93dc4 修复样式问题 2025-04-21 16:01:04 +08:00
廖丹龙
73dce5e75e Accept Merge Request #2025: (feature/tool_standard_library_process -> 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/2025
2025-04-21 15:00:30 +08:00
liaodanlong
9b009ec5a3 外协工单采购申请查询问题 2025-04-21 14:55:52 +08:00
liaodanlong
7d70184a5d 外协工单采购申请查询问题 2025-04-21 14:55:20 +08:00
liaodanlong
9f9c08b1f0 制造订单采购申请查询问题 2025-04-21 14:35:57 +08:00
廖丹龙
5886b4e132 Accept Merge Request #2024: (feature/tool_standard_library_process -> 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/2024
2025-04-21 13:18:49 +08:00
liaodanlong
77478fd173 制造订单报错问题 2025-04-21 13:16:15 +08:00
胡尧
2154533ad5 Accept Merge Request #2023: (feature/6694 -> develop)
Merge Request: 去掉打印模块的type字段

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2023?initial=true
2025-04-21 13:15:22 +08:00
胡尧
eab7bf04c3 去掉打印模块的type字段 2025-04-21 13:15:02 +08:00
马广威
ba910f011e Accept Merge Request #2022: (feature/制造功能优化 -> develop)
Merge Request: sf-质量检查-上传报告校验必填,及上传时检查图号跟产品的零件图号是否一致

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2022?initial=true
2025-04-21 12:22:20 +08:00
mgw
c43d8ee280 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-21 12:20:56 +08:00
mgw
acc04f396d sf-质量检查-上传报告校验必填,及上传时检查图号跟产品的零件图号是否一致 2025-04-21 12:20:37 +08:00
胡尧
3425376705 Accept Merge Request #2021: (feature/6763 -> develop)
Merge Request: 工单列表增加模型ID搜索

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2021?initial=true
2025-04-21 11:26:29 +08:00
胡尧
7849ce6342 工单列表增加模型ID搜索 2025-04-21 11:25:37 +08:00
liaodanlong
69e8bf67d1 sf-制造-表面工艺可选参数-从cloud同步过来的数据,获取方式方式=外协 2025-04-21 10:04:59 +08:00
廖丹龙
722bdc251d Accept Merge Request #2020: (feature/tool_standard_library_process -> 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/2020
2025-04-21 09:53:27 +08:00
liaodanlong
0403a2d223 开放分组类型限制工艺参数字段显示 2025-04-21 09:52:52 +08:00
liaodanlong
7a4c3f155c 开放分组类型限制工艺参数字段显示 2025-04-21 09:52:24 +08:00
胡尧
acd8d9c758 Accept Merge Request #2019: (feature/6694 -> develop)
Merge Request: 去掉多余的代码

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2019?initial=true
2025-04-21 09:23:48 +08:00
廖丹龙
d33a801f89 Accept Merge Request #2018: (feature/tool_standard_library_process -> 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/2018
2025-04-21 09:20:29 +08:00
liaodanlong
a74c07f0bb 字段名写错 2025-04-21 09:19:36 +08:00
胡尧
9f1cac0789 去掉多余的代码 2025-04-21 09:10:20 +08:00
廖丹龙
fcd0319a9c Accept Merge Request #2017: (feature/tool_standard_library_process -> 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/2017
2025-04-18 17:29:28 +08:00
liaodanlong
ed2c76adf1 工厂日历独立菜单到计划模块 2025-04-18 17:24:41 +08:00
廖丹龙
1d45486e20 Accept Merge Request #2016: (feature/tool_standard_library_process -> develop)
Merge Request: sf-制造-表面工艺-菜单名称修改

Created By: @廖丹龙
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @廖丹龙
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2016
2025-04-18 16:46:38 +08:00
liaodanlong
d209d40356 sf-制造-表面工艺-菜单名称修改 2025-04-18 16:39:09 +08:00
胡尧
3355731632 Accept Merge Request #2015: (feature/6694 -> develop)
Merge Request: 增加打印模块,增加工单下发后打印程序单

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2015?initial=true
2025-04-18 16:07:01 +08:00
liaodanlong
ddd902cad8 修改创建表面工艺产品时表面工艺参数不能为空的问题 2025-04-18 16:06:08 +08:00
liaodanlong
e5566edd7c sf_同步cloud表面工艺可选参数创建产品,修改产品名命名规则 2025-04-18 15:45:32 +08:00
liaodanlong
ea0f9d6ee2 sf-制造-作业-表单详情内,可选工艺参数手动新增编码规则跟外协服务产品名称不正确 2025-04-18 15:45:00 +08:00
liaodanlong
79006e062a 1.限制工序-作业配置 产品只能选中一个
2.添加产品下拉框查询过滤
3.产品选择框可以跳转到产品页面
2025-04-18 15:44:13 +08:00
胡尧
ee9783d4a6 增加打印模块,增加工单下发后打印程序单 2025-04-18 14:50:03 +08:00
马广威
ff7c4a9ce7 Accept Merge Request #2014: (feature/制造功能优化 -> develop)
Merge Request: 调整设备可用率接口

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2014?initial=true
2025-04-18 14:40:31 +08:00
mgw
48b94e8d84 Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-18 14:39:11 +08:00
mgw
a395994a1c 调整设备可用率接口 2025-04-18 14:38:39 +08:00
mgw
43c29e30b0 暂时注释稼动率接口 2025-04-18 14:18:41 +08:00
管欢
be639d7631 Accept Merge Request #2013: (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/2013
2025-04-18 14:08:29 +08:00
guanhuan
66c745af3c 排序优化 2025-04-18 13:22:25 +08:00
mgw
29ee275840 增加上传支持格式 2025-04-18 13:00:45 +08:00
管欢
f92b844c16 Accept Merge Request #2012: (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/2012
2025-04-18 09:50:58 +08:00
廖丹龙
63870ed7a9 Accept Merge Request #2011: (feature/tool_standard_library_process -> 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/2011
2025-04-18 09:07:24 +08:00
liaodanlong
558c99f48b 产品表面工艺参数更名为工艺参数 2025-04-18 09:00:06 +08:00
廖丹龙
1264a4305e Accept Merge Request #2010: (feature/tool_standard_library_process -> 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/2010
2025-04-17 17:13:54 +08:00
liaodanlong
a4f8183654 更新工艺外协流程的采购单查询逻辑 2025-04-17 17:02:43 +08:00
廖丹龙
3ea8e9d35f Accept Merge Request #2009: (feature/tool_standard_library_process -> 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/2009
2025-04-17 16:34:27 +08:00
liaodanlong
3fb2890bf1 更新工艺外协流程的报错问题 2025-04-17 16:32:18 +08:00
廖丹龙
0c3ba5c172 Accept Merge Request #2008: (feature/tool_standard_library_process -> 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/2008
2025-04-17 14:39:18 +08:00
liaodanlong
1b22d02700 Merge branch 'refs/heads/develop' into feature/tool_standard_library_process
# Conflicts:
#	sf_manufacturing/models/__init__.py
2025-04-17 14:35:24 +08:00
liaodanlong
962931bc9d 外协流程更改 2025-04-17 14:29:06 +08:00
guanhuan
9cfc8418ec 优化库存排序 2025-04-17 13:44:25 +08:00
胡尧
e4af2aacb8 Accept Merge Request #2007: (feature/6694 -> develop)
Merge Request: 增加工单下发时打印编程文件pdf的功能

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2007?initial=true
2025-04-17 13:18:03 +08:00
胡尧
c67944f689 增加工单下发时打印编程文件pdf的功能 2025-04-17 13:15:48 +08:00
胡尧
9c713c2a37 设备增加网络配置,增加编程文件传输接口 2025-04-16 17:21:36 +08:00
mgw
53d4be596f 调整日志 2025-04-16 11:26:21 +08:00
mgw
195302b67f 调整月合格率 2025-04-16 11:20:35 +08:00
mgw
6cb5e909d4 调整稼动率 2025-04-16 11:12:04 +08:00
胡尧
cb98f5cf25 Accept Merge Request #2006: (feature/6609 -> develop)
Merge Request: 产品主数据【条码】存储模型ID

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2006?initial=true
2025-04-16 09:30:28 +08:00
胡尧
f87a6690fe Accept Merge Request #2005: (feature/6684 -> develop)
Merge Request: 修改sf定时任务不在部署时更新配置

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2005?initial=true
2025-04-16 09:29:59 +08:00
胡尧
b041feb297 Merge branch 'release/release_2.11' 2025-04-15 20:54:53 +08:00
禹翔辉
06e9d5a538 Accept Merge Request #2004: (feature/功能刀具拆解单优化_1 -> develop)
Merge Request: Merge branch 'feature/功能刀具拆解单优化' into feature/功能刀具拆解单优化_1

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2004
2025-04-15 17:22:50 +08:00
yuxianghui
b9aac6c558 Merge branch 'feature/功能刀具拆解单优化' into feature/功能刀具拆解单优化_1 2025-04-15 17:21:31 +08:00
yuxianghui
2de0e9f02f 处理功能刀具预警没有自动创建预警记录和拆解单问题 2025-04-15 17:20:16 +08:00
胡尧
722b601890 Accept Merge Request #2003: (release/release_2.11 -> develop)
Merge Request: 修改质检单的质检员字段

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/2003?initial=true
2025-04-15 17:14:51 +08:00
胡尧
20722c12b8 修改质检单的质检员字段 2025-04-15 17:08:43 +08:00
胡尧
2100ee9590 增加备注 2025-04-15 17:08:17 +08:00
禹翔辉
56f2ea0356 Accept Merge Request #2002: (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/2002
2025-04-15 16:58:28 +08:00
胡尧
6ff8395916 增加向pdf中添加二维码的功能 2025-04-15 16:57:32 +08:00
yuxianghui
bc85c457ad 功能刀具添加状态变更跟踪 2025-04-15 16:46:49 +08:00
胡尧
085e6359ce 编程单增加二维码 2025-04-15 15:47:35 +08:00
禹翔辉
7eeea92a3e Accept Merge Request #2001: (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/2001
2025-04-15 15:09:36 +08:00
yuxianghui
d672f3f4d7 功能刀具拆解单添加可以选择线边刀库的功能刀具进行拆解 2025-04-15 15:05:23 +08:00
黄焱
c79cf2e5ad Accept Merge Request #2000: (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/2000?initial=true
2025-04-15 11:26:42 +08:00
hyyy
33a5fc0ff4 删除多余字段 2025-04-15 11:24:45 +08:00
黄焱
2dcaa25952 Accept Merge Request #1999: (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/1999
2025-04-15 09:43:20 +08:00
hyyy
ba88070fad 修改刀片刀杆样式 2025-04-15 09:31:42 +08:00
马广威
3f940992be Accept Merge Request #1998: (feature/制造功能优化 -> develop)
Merge Request: 调整报告,增加稼动率接口(暂未调用)

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1998?initial=true
2025-04-14 17:24:04 +08:00
mgw
197ae6bc01 去掉基础数据 2025-04-14 17:22:27 +08:00
mgw
07336326ce 优化稼动率接口 2025-04-14 17:16:38 +08:00
mgw
c93553e78e 增加稼动率接口 2025-04-14 16:42:33 +08:00
liaodanlong
0db31f7936 Merge branch 'refs/heads/develop' into feature/tool_standard_library_process 2025-04-14 15:24:22 +08:00
liaodanlong
61a3cf606e 表面工艺数据内置与数据同步调整 2025-04-14 15:23:47 +08:00
mgw
91d79008e1 故障时长提取 2025-04-14 11:21:24 +08:00
禹翔辉
8cdf77f609 Accept Merge Request #1997: (feature/功能刀具组装初始化优化 -> develop)
Merge Request: 功能刀具组装自动根据BOM配置初始物料信息优化

Created By: @禹翔辉
Reviewed By: @胡尧
Approved By: @胡尧 
Accepted By: @禹翔辉
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1997
2025-04-14 10:34:47 +08:00
yuxianghui
37edc858c2 1 2025-04-14 10:32:26 +08:00
yuxianghui
17fdf20e03 功能刀具组装自动根据BOM配置初始物料信息优化 2025-04-14 10:30:51 +08:00
胡尧
a896108638 产品主数据【条码】存储模型ID 2025-04-11 16:49:18 +08:00
胡尧
026697f363 修改sf定时任务不在部署时更新配置 2025-04-11 16:12:58 +08:00
胡尧
ec934abc42 Accept Merge Request #1996: (feature/6679 -> develop)
Merge Request: 给仓储岗增加修改工单的权限

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1996
2025-04-11 16:04:02 +08:00
胡尧
cc030957fb 给仓储岗增加修改工单的权限 2025-04-11 16:02:24 +08:00
mgw
87786dbd80 调整故障时长 2025-04-11 14:16:18 +08:00
禹翔辉
9d0ffd23b2 Accept Merge Request #1995: (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/1995
2025-04-10 14:27:04 +08:00
yuxianghui
3fb56f15c8 处理功能刀具组装时,有时扫描货位编码验证刀具信息扫不到货位的问题 2025-04-10 14:24:25 +08:00
mgw
bdf4696c08 调整待完成工单明细 2025-04-09 16:56:53 +08:00
mgw
6c926bf081 调整质检取值 2025-04-09 16:39:21 +08:00
mgw
ddb0c304b9 修改字段路径 2025-04-09 15:57:13 +08:00
mgw
cf8c14e738 调整查询范围 2025-04-09 15:22:41 +08:00
黄焱
6bd6816495 Accept Merge Request #1994: (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/1994?initial=true
2025-04-09 14:03:06 +08:00
hyyy
2bae98950e 功能刀具组装优化需求 2025-04-09 13:57:48 +08:00
胡尧
ec379a7541 Accept Merge Request #1993: (feature/6679 -> develop)
Merge Request: 增加不同工作中心配置相同接驳站的功能

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1993?initial=true
2025-04-08 17:08:20 +08:00
胡尧
119acf1543 Accept Merge Request #1992: (feature/6686 -> develop)
Merge Request: agv配置不可修改

Created By: @胡尧
Accepted By: @胡尧
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1992
2025-04-08 17:07:57 +08:00
禹翔辉
0f6f1aae24 Accept Merge Request #1991: (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/1991
2025-04-08 17:01:56 +08:00
yuxianghui
c40ecfb6ce 将寿命到期拆解创建的组装单添加到对应安全库存组装单列表 2025-04-08 17:00:00 +08:00
禹翔辉
a51a4c2fbb Accept Merge Request #1990: (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/1990?initial=true
2025-04-08 15:59:04 +08:00
yuxianghui
315e2aa03d 功能刀具拆解寿命到期刀具创建新的组装单时,添加几个参数的值。 2025-04-08 15:56:08 +08:00
胡尧
10bea40159 增加不同工作中心配置相同接驳站的功能 2025-04-08 10:29:29 +08:00
马广威
78ba8d0ead Accept Merge Request #1989: (feature/制造功能优化 -> develop)
Merge Request: 调整报告页码

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1989
2025-04-08 10:11:41 +08:00
mgw
e61742cc5b Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化 2025-04-08 10:11:05 +08:00
mgw
d0d1a640d9 调整报告页码 2025-04-08 10:10:36 +08:00
禹翔辉
e613a2f283 Accept Merge Request #1987: (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/1987
2025-04-08 09:59:09 +08:00
马广威
88e83c0e14 Accept Merge Request #1988: (feature/制造功能优化 -> develop)
Merge Request: 调整报告产品取值

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1988
2025-04-08 09:48:48 +08:00
mgw
f912a81e7b 调整报告产品取值 2025-04-08 09:48:05 +08:00
yuxianghui
e09226e966 新增对寿命未到期且位置在线边刀库的功能刀具进行拆解时,不直接报错,而是进行二次确认是否进行拆除。 2025-04-08 09:44:46 +08:00
胡尧
8a7a90ff0d agv配置不可修改 2025-04-07 17:04:34 +08:00
胡尧
d05a3606c3 Merge branch 'release/release_2.10' 2025-04-02 11:50:07 +08:00
yuxianghui
4b5c3b383b 对工单的page页进行调整 2025-04-02 10:58:25 +08:00
胡尧
1c34f2f15c Merge branch 'release/release_2.10' 2025-04-02 09:08:47 +08:00
胡尧
fd5ff0904e Merge branch 'release/release_2.10' 2025-04-01 20:43:29 +08:00
胡尧
3d355ec303 Merge branch 'release/release_2.9' 2025-03-04 09:16:48 +08:00
胡尧
d3a1e9b341 Merge branch 'release/release_2.8' 2025-01-21 10:43:09 +08:00
胡尧
8db80e1ed6 Merge branch 'release/release_2.7' 2025-01-07 20:16:29 +08:00
胡尧
fc378df597 Merge branch 'release/release_2.6' 2024-12-08 19:56:05 +08:00
胡尧
0575d89227 Merge branch 'release/release_2.5' 2024-11-04 19:49:05 +08:00
胡尧
39afc99b8f Merge branch 'release/release_2.4' 2024-10-11 09:29:34 +08:00
杨金灵
f230ad55fb Accept Merge Request #1284: (hotfix/修复报废-外协入库验证 -> master)
Merge Request: 修复报废-外协入库验证

Created By: @杨金灵
Accepted By: @杨金灵
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1284
2024-09-06 13:47:55 +08:00
215 changed files with 10377 additions and 2876 deletions

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
{
'name': '机企猫 需求计划排程队列',
'version': '1.0',
'summary': """ 使用队列进行排程 """,
'author': 'fox',
'website': '',
'category': '',
'depends': ['queue_job_batch', 'sf_demand_plan'],
'data': [
],
'application': True,
'installable': True,
'auto_install': False,
'license': 'LGPL-3',
}

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import production_demand_plan

View File

@@ -0,0 +1,20 @@
from odoo import models, fields
class ProductionDemandPlan(models.Model):
_inherit = 'sf.production.demand.plan'
def _do_production_schedule(self, pro_plan_list):
"""使用队列进行排程"""
batch_size = 10
current_time = fields.Datetime.now().strftime('%Y%m%d%H%M%S')
index = 1
for i in range(0, len(pro_plan_list), batch_size):
batch = self.env['queue.job.batch'].get_new_batch('plan-%s-%s' % (current_time, index))
pro_plans = pro_plan_list[i:i+batch_size]
pro_plans.with_context(
job_batch=batch
).with_delay().do_production_schedule()
index += 1
batch.enqueue()

View File

@@ -119,13 +119,24 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
this.listherHeaderBodyNum()
})
const treeModifiers = this.getFieldModifiers(this.props.archInfo.__rawArch);
if(treeModifiers) {
this.props.merge_key = treeModifiers.merge_key;
this.props.merge_fields = treeModifiers.merge_fields.split(',');
const data = this.setColumns(this.props.merge_key);
owl.onMounted(() => {
this.mergeColumns(this.props.merge_fields, data)
})
if(treeModifiers.merge_fields) {
this.props.merge_key = treeModifiers.merge_key;
this.props.merge_fields = treeModifiers.merge_fields.split(',');
const data = this.setColumns(this.props.merge_key);
owl.onMounted(() => {
this.mergeColumns(this.props.merge_fields, data)
})
}
if(treeModifiers.pacthResize) {
owl.onPatched(() => {
this.columnWidths = null;
this.freezeColumnWidths();
})
}
}
return this._super(...arguments);
},

View File

@@ -157,11 +157,11 @@ td.o_required_modifier {
color: #aaa;
}
.o_kanban_primary_left {
display: flex;
flex-direction: row-reverse;
justify-content: flex-start;
}
// .o_kanban_primary_left {
// display: flex;
// flex-direction: row-reverse;
// justify-content: flex-start;
// }
.o_list_view .o_list_table thead {
position: sticky;
@@ -521,11 +521,6 @@ div:has(.o_required_modifier) > label::before {
}
}
// 设置表格横向滚动
.o_list_renderer.o_renderer {
max-width: 100%;
overflow-x: auto;
}
// 设置表单页面label文本不换行
.o_form_view .o_group .o_wrap_label .o_form_label {

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
{
'name': '机企猫 打印模块',
'version': '1.0',
'summary': """ 包含机台二维码,程序单打印等 """,
'author': '机企猫',
'website': 'https://www.jikimo.com',
'category': '机企猫',
'depends': ['sf_manufacturing', 'sf_maintenance', 'base_report_to_printer'],
'data': [
'views/maintenance_views.xml',
],
'application': True,
'installable': True,
'auto_install': False,
'license': 'LGPL-3',
}

View File

@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import jikimo_printing
from . import maintenance_printing
from . import workorder_printing

View File

@@ -0,0 +1,87 @@
from io import BytesIO
import qrcode
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from PIL import Image
import logging
from reportlab.lib.utils import ImageReader
from odoo import models, fields, api
import base64
_logger = logging.getLogger(__name__)
class JikimoPrinting(models.AbstractModel):
_name = 'jikimo.printing'
def print_qr_code(self, data):
"""
打印二维码
"""
printer = self.env['printing.printer'].get_default()
if not printer:
_logger.error("未找到默认打印机")
return False
# 生成二维码
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(data)
qr.make(fit=True)
qr_image = qr.make_image(fill_color="black", back_color="white")
# 将PIL Image转换为reportlab可用的格式
temp_image = BytesIO()
qr_image.save(temp_image, format="PNG")
temp_image.seek(0)
# 创建PDF
pdf_buffer = BytesIO()
c = canvas.Canvas(pdf_buffer, pagesize=A4)
# 计算位置
a4_width, a4_height = A4
qr_width = 200
qr_height = 200
x = (a4_width - qr_width) / 2
y = (a4_height - qr_height) / 2
# 直接从BytesIO绘制图片
c.drawImage(ImageReader(Image.open(temp_image)), x, y, width=qr_width, height=qr_height)
c.save()
# 获取PDF内容并打印
pdf_content = pdf_buffer.getvalue()
# _logger.info(f"打印内容: {pdf_content}")
printer.print_document(report=None, content=pdf_content, doc_format='pdf')
# 清理资源
pdf_buffer.close()
temp_image.close()
return True
def print_pdf(self, pdf_data):
"""
打印PDF
"""
printer = self.env['printing.printer'].get_default()
if not printer:
_logger.error("未找到默认打印机")
return False
pdf_data_str = pdf_data.decode('ascii', errors='ignore')
decoded_data = base64.b64decode(pdf_data_str)
# 处理二进制数据
pdf_buffer = BytesIO()
pdf_buffer.write(decoded_data)
pdf_buffer.seek(0)
# 获取PDF内容
pdf_content = pdf_buffer.getvalue()
printer.print_document(report=None, content=pdf_content, doc_format='pdf')
# 清理资源
pdf_buffer.close()
_logger.info("成功打印PDF")
return True

View File

@@ -0,0 +1,69 @@
from odoo import models, fields, api
class MaintenancePrinting(models.Model):
_inherit = 'maintenance.equipment'
def print_single_method(self):
print('self.name========== %s' % self.name)
self.ensure_one()
# maintenance_equipment_id = self.id
# # host = "192.168.50.110" # 可以根据实际情况修改
# # port = 9100 # 可以根据实际情况修改
# # 获取默认打印机配置
# 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(maintenance_equipment_id, host, port)
# 切换成A4打印机
try:
self.env['jikimo.printing'].print_qr_code(self.MTcode)
except Exception as e:
raise UserError(f"打印失败: {str(e)}")
# def generate_zpl_code(self, code):
# """生成ZPL代码用于打印二维码标签
# Args:
# code: 需要编码的内容
# Returns:
# str: ZPL指令字符串
# """
# zpl_code = "^XA\n" # 开始ZPL格式
# # 设置打印参数
# zpl_code += "^LH0,0\n" # 设置标签起始位置
# zpl_code += "^CI28\n" # 设置中文编码
# zpl_code += "^PW400\n" # 设置打印宽度为400点
# zpl_code += "^LL300\n" # 设置标签长度为300点
# # 打印标题
# zpl_code += "^FO10,20\n" # 设置标题位置
# zpl_code += "^A0N,30,30\n" # 设置字体大小
# zpl_code += "^FD机床二维码^FS\n" # 打印标题文本
# # 打印二维码
# zpl_code += "^FO50,60\n" # 设置二维码位置
# zpl_code += f"^BQN,2,8\n" # 设置二维码参数:模式2,放大倍数8
# zpl_code += f"^FDLA,{code}^FS\n" # 二维码内容
# # 打印编码文本
# zpl_code += "^FO50,220\n" # 设置编码文本位置
# zpl_code += "^A0N,25,25\n" # 设置字体大小
# zpl_code += f"^FD编码: {code}^FS\n" # 打印编码文本
# # 打印日期
# zpl_code += "^FO50,260\n"
# zpl_code += "^A0N,20,20\n"
# zpl_code += f"^FD打印日期: {fields.Date.today()}^FS\n"
# zpl_code += "^PQ1\n" # 打印1份
# zpl_code += "^XZ\n" # 结束ZPL格式
# return zpl_code

View File

@@ -0,0 +1,31 @@
import logging
from odoo import models, fields, api
_logger = logging.getLogger(__name__)
class MrpWorkorder(models.Model):
_name = 'mrp.workorder'
_inherit = ['mrp.workorder']
def _compute_state(self):
super(MrpWorkorder, self)._compute_state()
for workorder in self:
work_ids = workorder.production_id.workorder_ids.filtered(lambda w: w.routing_type == '装夹预调' or w.routing_type == '人工线下加工')
for wo in work_ids:
if wo.state == 'ready' and not wo.production_id.product_id.is_print_program:
# 触发打印程序
pdf_data = workorder.processing_drawing
if pdf_data:
try:
# 执行打印
self.env['jikimo.printing'].print_pdf(pdf_data)
wo.production_id.product_id.is_print_program = True
except Exception as e:
_logger.error(f"工单 {wo.name} 的PDF打印失败: {str(e)}")
class ProductTemplate(models.Model):
_inherit = 'product.template'
is_print_program = fields.Boolean(string='是否打印程序', default=False)

View File

@@ -0,0 +1,19 @@
<?xml version="1.0"?>
<odoo>
<record id="sf_maintenance_equipment_view_form_qrcode_print" model="ir.ui.view">
<field name="name">sf_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">
<xpath expr="//field[@name='qr_code_image']" position="after">
<label for="print_single_method"/>
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
<button type="object" class="oe_highlight" name='print_single_method' string="打印机床二维码"
attrs="{'invisible': [('equipment_type', '!=', '机床')]}"/>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -8,16 +8,22 @@
'category': 'purchase',
'depends': ['sf_manufacturing', 'purchase_request'],
'data': [
'security/ir.model.access.csv',
'views/sale_order_view.xml',
'views/purchase_order.xml',
'views/mrp_production.xml',
'views/purchase_request_view.xml',
'wizard/purchase_request_line_make_purchase_order_view.xml',
'views/purchase_request_line_view.xml',
'views/stock_picking_views.xml',
'wizard/purchase_request_wizard_views.xml',
'views/purchase_request_menu_views.xml',
],
# 'assets': {
# 'web.assets_backend': [
# 'jikimo_purchase_request/static/src/**/*'
# ],
# },
'assets': {
'web.assets_backend': [
'jikimo_purchase_request/static/src/**/*'
],
},
'application': True,
'installable': True,
'auto_install': False,

View File

@@ -410,7 +410,7 @@ msgstr "显示名称"
#: model_terms:ir.ui.view,arch_db:purchase_request.view_purchase_request_form
#: model_terms:ir.ui.view,arch_db:purchase_request.view_purchase_request_search
msgid "Done"
msgstr "完成"
msgstr "关闭"
#. module: purchase_request
#: model:ir.model.fields,field_description:purchase_request.field_purchase_request_line__move_dest_ids
@@ -1043,7 +1043,7 @@ msgstr "询价单"
#. module: purchase_request
#: model:ir.model.fields,field_description:purchase_request.field_purchase_request_line__purchased_qty
msgid "RFQ/PO Qty"
msgstr ""
msgstr "已订购数"
#. module: purchase_request
#. odoo-python

View File

@@ -5,3 +5,5 @@ from . import sale_order
from . import mrp_production
from . import purchase_order
from . import stock_rule
from . import stock_picking
from . import product_product

View File

@@ -9,18 +9,22 @@ class MrpProduction(models.Model):
@api.depends('state')
def _compute_pr_mp_count(self):
for item in self:
pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', item.name)])
if pr_ids:
item.pr_mp_count = len(pr_ids)
else:
if item.product_id.is_customer_provided:
item.pr_mp_count = 0
else:
pr_ids = item._get_purchase_request()
item.pr_mp_count = len(pr_ids)
# pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', item.name), ('is_subcontract', '!=', 'True')])
def action_view_pr_mp(self):
"""
采购请求
"""
self.ensure_one()
pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', self.name)])
# 由于采购申请合并了所有销售订单行的采购,所以不区分产品
pr_ids = self._get_purchase_request()
action = {
'res_model': 'purchase.request',
'type': 'ir.actions.act_window',
@@ -33,7 +37,16 @@ class MrpProduction(models.Model):
else:
action.update({
'name': _("%s生成采购请求单", self.name),
'domain': [('id', 'in', pr_ids)],
'domain': [('id', 'in', pr_ids.ids)],
'view_mode': 'tree,form',
})
return action
def _get_purchase_request(self):
"""获取跟制造订单相关的采购申请单(根据采购申请单行项目的产品匹配)"""
mrp_names = self.env['mrp.production'].search([('origin', '=', self.origin)]).mapped('name')
pr_ids = self.env['purchase.request'].sudo().search([('origin', 'in', mrp_names)])
product_list = self.product_id._get_product_include_bom()
pr_line_ids = pr_ids.line_ids.filtered(lambda l: l.product_id in product_list)
return pr_line_ids.mapped('request_id')

View File

@@ -0,0 +1,17 @@
from odoo import models
class ProductProduct(models.Model):
_inherit = 'product.product'
def _get_product_include_bom(self):
"""获取产品列表包括所有bom"""
self.ensure_one()
product_list = [self]
bom_ids = self.bom_ids
while (bom_ids):
bom_product_ids = bom_ids.bom_line_ids.mapped('product_id')
product_list.append(bom_product_ids)
bom_ids = bom_product_ids.bom_ids
return product_list

View File

@@ -1,4 +1,5 @@
from odoo import api, fields, models, _
from odoo.tools import float_compare
class PurchaseOrder(models.Model):
@@ -13,4 +14,114 @@ class PurchaseOrder(models.Model):
('done', '完成'),
('cancel', '取消'),
('rejected', '已驳回')
], string='Status', readonly=True, index=True, copy=False, default='draft', tracking=True)
], string='Status', readonly=True, index=True, copy=False, default='draft', tracking=True)
# 成品采购订单对应的坯料采购申请单和采购订单数量
purchase_request_count = fields.Integer('子·采购申请数量', compute='_compute_purchase_request')
purchase_order_count = fields.Integer('子·采购订单数量', compute='_compute_purchase_request')
@api.depends('state')
def _compute_purchase_request(self):
for record in self:
purchase_request_ids, purchase_order_ids = record.get_purchase_request_order()
record.purchase_request_count = len(purchase_request_ids)
record.purchase_order_count = len(purchase_order_ids)
def action_view_preform_body_purchase_request(self):
self.ensure_one()
name_list = self._get_pinking_name()
purchase_request_ids = self.env['purchase.request'].search([('origin', 'in', name_list)])
action = {
'res_model': 'purchase.request',
'type': 'ir.actions.act_window',
}
if len(purchase_request_ids) == 1:
action.update({
'view_mode': 'form',
'res_id': purchase_request_ids[0].id,
})
else:
action.update({
'name': _("子·采购申请"),
'domain': [('id', 'in', purchase_request_ids.ids)],
'view_mode': 'tree,form',
})
return action
def action_view_preform_body_purchase_order(self):
self.ensure_one()
name_list = self._get_pinking_name()
purchase_order_ids = self.env['purchase.order'].search([('origin', 'in', name_list)])
action = {
'res_model': 'purchase.order',
'type': 'ir.actions.act_window',
}
if len(purchase_order_ids) == 1:
action.update({
'view_mode': 'form',
'res_id': purchase_order_ids[0].id,
})
else:
action.update({
'name': _("子·采购订单"),
'domain': [('id', 'in', purchase_order_ids.ids)],
'view_mode': 'tree,form',
})
return action
def get_purchase_request_order(self):
name_list = self._get_pinking_name()
purchase_request_ids = self.env['purchase.request'].search([('origin', 'in', name_list)])
purchase_order_ids = self.env['purchase.order'].search([('origin', 'in', name_list)])
return purchase_request_ids, purchase_order_ids
def _get_pinking_name(self):
return [picking_id.name for picking_id in self.picking_ids if picking_id.name]
def button_confirm(self):
res = super(PurchaseOrder, self).button_confirm()
# 取消反向调拨单
reverse_move_ids = self.env['stock.move'].search([
('origin', '=', self.name),
('purchase_line_id', '=', False),
('state', '!=', 'done')
])
if reverse_move_ids:
reverse_move_ids.picking_id.action_cancel()
return res
def button_cancel(self):
"""
1. 先将采购订单行与目标库存移动断开链接避免采购单取消后调拨单被调整为mts的问题
2. 取消采购订单
3. 将采购订单行与目标库存移动重新建立链接
"""
created_purchase_request_line_ids = {}
if self.order_line.move_dest_ids.created_purchase_request_line_id:
move_ids = self.order_line.move_dest_ids.filtered(lambda move: move.state != 'done' and not move.scrapped)
created_purchase_request_line_ids = {move.id: move.created_purchase_request_line_id for move in move_ids}
self.order_line.write({'move_dest_ids': [(5, 0, 0)]})
res =super(PurchaseOrder, self).button_cancel()
for move_id, created_purchase_request_line_id in created_purchase_request_line_ids.items():
self.env['stock.move'].browse(move_id).created_purchase_request_line_id = created_purchase_request_line_id
# if move_ids.mapped('created_purchase_request_line_id'):
# move_ids.write({'state': 'waiting', 'is_done': False})
return res
def write(self, vals):
res = super(PurchaseOrder, self).write(vals)
if 'state' in vals and vals['state'] == 'purchase':
purchase_request = self.order_line.purchase_request_lines.request_id
if purchase_request:
finished = True
# 判断该采购申请所有明细行是否都完成
for purchase_request_line in purchase_request.line_ids:
finished_qty = sum(purchase_request_line.purchase_lines.filtered(lambda line: line.state == 'purchase').mapped('product_qty'))
if float_compare(finished_qty ,purchase_request_line.product_qty, precision_rounding=purchase_request_line.product_id.uom_id.rounding) < 0:
finished = False
break
if finished:
purchase_request.button_done()
return res

View File

@@ -1,19 +1,22 @@
import re
import ast
from odoo import models, fields, api
from odoo import models, fields, api, _
from itertools import groupby
from odoo.tools import float_compare
class PurchaseRequest(models.Model):
_inherit = 'purchase.request'
_description = '采购申请'
# 为state添加取消状态
# 为state添加取消状态
state = fields.Selection(
selection_add=[('cancel', '已取消')],
ondelete={'cancel': 'set default'} # 添加 ondelete 策略
)
rule_new_add = fields.Boolean('采购请求为规则创建', default=False, compute='_compute_state', store=True)
rule_purchase_to_request = fields.Boolean('采购单根据规则创建坯料采购申请', default=False)
@api.depends('state')
def _compute_state(self):
@@ -29,6 +32,57 @@ class PurchaseRequest(models.Model):
action['context'] = origin_context
return action
def button_done(self):
product_qty_map = {key: sum(line.product_qty for line in group) for key, group in
groupby(self.line_ids, key=lambda x: x.product_id.id)}
lines = self.mapped("line_ids.purchase_lines.order_id")
# 采购单产品和数量
product_summary = {}
product_rounding = {}
if lines:
for line in lines:
for line_item in line.order_line:
if line_item.state == 'purchase':
product_id = line_item.product_id.id
qty = line_item.product_qty
product_rounding[product_id] = line_item.product_id.uom_id.rounding
if product_id in product_summary:
product_summary[product_id] += qty
else:
product_summary[product_id] = qty
# 校验产品数量
discrepancies = []
for product_id, qty in product_qty_map.items():
if product_id in product_summary:
if float_compare(product_summary[product_id], qty, precision_rounding=product_rounding[product_id]) < 0:
discrepancies.append((product_id, qty, product_summary[product_id]))
else:
discrepancies.append((product_id, qty, 0))
if discrepancies:
# 弹出提示框
message = "产品与采购数量不一致:\n"
for product_id, required_qty, order_qty in discrepancies:
product_name = self.env['product.product'].browse(product_id).display_name # 获取产品名称
message += f"产品 {product_name},需求数量 {required_qty},关联采购订单确认的数量 {order_qty}\n"
# 添加确认框
message += "确认关闭?"
return {
'name': _('采购申请'),
'type': 'ir.actions.act_window',
'views': [(self.env.ref(
'jikimo_purchase_request.purchase_request_wizard_wizard_form_view').id,
'form')],
'res_model': 'purchase.request.wizard',
'target': 'new',
'context': {
'default_purchase_request_id': self.id,
'default_message': message,
}}
return super(PurchaseRequest, self).button_done()
class PurchaseRequestLine(models.Model):
_inherit = 'purchase.request.line'
_description = '采购申请明细'
@@ -47,6 +101,20 @@ class PurchaseRequestLine(models.Model):
('outsourcing', "委外加工"),
], string='供货方式', compute='_compute_supply_method', store=True)
purchase_request_count = fields.Integer(string='采购申请数量', compute='_compute_purchase_request_count',
readonly=True)
purchase_count = fields.Integer(string="采购订单数量", compute="_compute_purchase_count", readonly=True)
@api.depends("purchase_lines")
def _compute_purchase_count(self):
for rec in self:
rec.purchase_count = len(rec.mapped("purchase_lines.order_id"))
@api.depends('request_id')
def _compute_purchase_request_count(self):
for order in self:
order.purchase_request_count = len(order.request_id)
@api.depends('origin')
def _compute_supply_method(self):
for prl in self:
@@ -79,10 +147,12 @@ class PurchaseRequestLine(models.Model):
continue
if record.product_id.categ_id.name == '坯料':
product_name = ''
match = re.search(r'(S\d{5}-\d)', record.product_id.name)
match = re.search(r'(S\d{5}-\d+)', record.product_id.name)
# 如果匹配成功,提取结果
if match:
product_name = match.group(0)
else:
product_name = record.product_id.name
sale_order_name = ''
match_sale = re.search(r'S(\d+)', record.product_id.name)
if match_sale:
@@ -98,3 +168,36 @@ class PurchaseRequestLine(models.Model):
else:
record.part_number = record.product_id.part_number
record.part_name = record.product_id.part_name
def _compute_qty_to_buy(self):
for pr in self:
qty_to_buy = sum(pr.mapped("product_qty"))
if pr.purchase_count > 0:
qty_to_buy -= sum(pr.mapped("purchase_lines").filtered(lambda po: po.state != 'cancel').mapped(
"product_qty"))
pr.qty_to_buy = qty_to_buy > 0.0
pr.pending_qty_to_receive = qty_to_buy
def action_view_purchase_request(self):
action = self.env["ir.actions.actions"]._for_xml_id("purchase_request.purchase_request_form_action")
action.update({
'res_id': self.request_id.id,
'views': [[False, 'form']],
})
return action
def action_view_purchase_order(self):
action = self.env["ir.actions.actions"]._for_xml_id("purchase.purchase_rfq")
lines = self.mapped("purchase_lines.order_id")
if len(lines) > 1:
action["domain"] = [("id", "in", lines.ids)]
elif lines:
action["views"] = [
(self.env.ref("purchase.purchase_order_form").id, "form")
]
action["res_id"] = lines.id
origin_context = ast.literal_eval(action['context'])
if 'search_default_draft' in origin_context:
origin_context.pop('search_default_draft')
action['context'] = origin_context
return action

View File

@@ -44,7 +44,7 @@ class StatusChange(models.Model):
else:
action.update({
'name': _("%s生成采购请求单", self.name),
'domain': [('id', 'in', pr_ids)],
'domain': [('id', 'in', pr_ids.ids)],
'view_mode': 'tree,form',
})
return action

View File

@@ -0,0 +1,60 @@
from odoo import fields, api, models, _
class StockPicking(models.Model):
_inherit = "stock.picking"
purchase_request_count = fields.Integer('采购订单数量', compute='_compute_purchase_request')
@api.depends('name')
def _compute_purchase_request(self):
for record in self:
purchase_request_ids = self.env['purchase.request'].search([('origin', '=', record.name)])
record.purchase_request_count = len(purchase_request_ids)
def action_view_purchase_request(self):
self.ensure_one()
purchase_request_ids = self.env['purchase.request'].search([('origin', '=', self.name)])
action = {
'res_model': 'purchase.request',
'type': 'ir.actions.act_window',
}
if len(purchase_request_ids) == 1:
action.update({
'view_mode': 'form',
'res_id': purchase_request_ids[0].id,
})
else:
action.update({
'name': _("%s生成采购请求单", self.name),
'domain': [('id', 'in', purchase_request_ids.ids)],
'view_mode': 'tree,form',
})
return action
def _action_done(self):
res = super(StockPicking, self)._action_done()
# 将新产生的backorder对应上原来的采购申请明细行
backorder_ids = self.backorder_ids
if backorder_ids:
purchase_request_lines = self.move_ids.move_orig_ids.purchase_line_id.purchase_request_lines
if purchase_request_lines:
purchase_request_lines.move_dest_ids = [
(4, x.id) for x in backorder_ids.move_ids if
x.product_id.id in purchase_request_lines.mapped('product_id.id') and \
not x.created_purchase_request_line_id
]
return res
def _subcontracted_produce(self, subcontract_details):
super()._subcontracted_produce(subcontract_details)
# 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved
if self:
pr_ids = self.env["purchase.request"].sudo().search(
[('origin', 'like', self.name), ('rule_purchase_to_request', '=', True), ('state', '=', 'draft')])
if pr_ids:
pr_ids.write({'need_validation': False})
pr_ids.write({"state": "approved", 'need_validation': True, 'rule_new_add': False})

View File

@@ -1,4 +1,5 @@
from odoo import api, fields, models
from collections import defaultdict
class StockRule(models.Model):
@@ -25,7 +26,7 @@ class StockRule(models.Model):
request_data = rule._prepare_purchase_request(
procurement.origin, procurement.values
)
request_data.update({'rule_new_add': True})
request_data = self._update_request_data(procurement, request_data)
pr = purchase_request_model.create(request_data)
cache[domain] = pr
elif (
@@ -43,14 +44,51 @@ class StockRule(models.Model):
request_line_data.update({'origin': procurement.origin})
purchase_request_line_model.create(request_line_data)
def _update_request_data(self, procurement, request_data):
sp = self.env['stock.picking'].sudo().search([('name', '=', procurement.origin)])
if len(sp) == 1:
po = self.env['purchase.order'].sudo().search(
[('name', '=', sp.origin), ('purchase_type', '=', 'outsourcing')])
if po:
request_data.update({'rule_purchase_to_request': True})
else:
request_data.update({'rule_new_add': True})
return request_data
def _run_buy(self, procurements):
res = super(StockRule, self)._run_buy(procurements)
# 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved
origins = list(set([procurement[0].origin for procurement in procurements]))
for origin in origins:
pr_ids = self.env["purchase.request"].sudo().search(
[('origin', 'like', origin), ('rule_new_add', '=', True), ('state', '=', 'draft')])
if pr_ids:
pr_ids.write({'need_validation': False})
pr_ids.write({"state": "approved", 'need_validation': True, 'rule_new_add': False})
# 如果补货组相同,并且产品相同,则合并
procurements_dict = defaultdict()
for procurement, rule in procurements:
if (procurement.product_id.id, procurement.values['group_id'], rule.id) not in procurements_dict:
procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)] = {
'product_id': procurement.product_id,
'product_qty': procurement.product_qty,
'product_uom': procurement.product_uom,
'location_id': procurement.location_id,
'name': procurement.name,
'origin': procurement.origin,
'company_id': procurement.company_id,
'values': procurement.values,
'rule': rule
}
else:
procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)]['product_qty'] += procurement.product_qty
procurements_dict[(procurement.product_id.id, procurement.values['group_id'], rule.id)]['values']['move_dest_ids'] |= procurement.values['move_dest_ids']
new_procurements = []
for k, p in procurements_dict.items():
new_procurements.append((
self.env['procurement.group'].Procurement(
product_id=p['product_id'],
product_qty=p['product_qty'],
product_uom=p['product_uom'],
location_id=p['location_id'],
name=p['name'],
origin=p['origin'],
company_id=p['company_id'],
values=p['values']
), p['rule'])
)
res = super(StockRule, self)._run_buy(new_procurements)
return res

View File

@@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_purchase_request_wizard_group_user,purchase.request.wizard,model_purchase_request_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_purchase_request_wizard_group_user purchase.request.wizard model_purchase_request_wizard base.group_user 1 1 1 1

View File

@@ -0,0 +1,3 @@
th[data-name=keep_description] {
min-width: 220px;
}

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="purchase_order_form_jikimo_purchase_request" model="ir.ui.view">
<field name="name">purchase.order.inherited.form.jikimo.purchase.request</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="mrp_subcontracting_purchase.purchase_order_form_mrp_subcontracting_purchase"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_button_box')]/button[@name='action_view_subcontracting_resupply']" position="before">
<button
class="oe_stat_button" name="action_view_preform_body_purchase_order"
type="object" icon="fa-truck" attrs="{'invisible': [('purchase_order_count', '=', 0)]}" groups="stock.group_stock_user">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="purchase_order_count"/></span>
<span class="o_stat_text">子·采购订单</span>
</div>
</button>
<button
class="oe_stat_button" name="action_view_preform_body_purchase_request"
type="object" icon="fa-truck" attrs="{'invisible': [('purchase_request_count', '=', 0)]}" groups="stock.group_stock_user">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="purchase_request_count"/></span>
<span class="o_stat_text">子·采购申请</span>
</div>
</button>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,22 @@
<odoo>
<record id="purchase_request_line_form_sf" model="ir.ui.view">
<field name="name">purchase.request.line.sf.form</field>
<field name="model">purchase.request.line</field>
<field name="inherit_id" ref="purchase_request.purchase_request_line_form"/>
<field name="arch" type="xml">
<xpath expr="//h1" position="before">
<div class="oe_button_box" name="button_box">
<button type="object" name="action_view_purchase_request" class="oe_stat_button"
icon="fa-file">
<field name="purchase_request_count" widget="statinfo" string="采购申请"/>
</button>
<button type="object" name="action_view_purchase_order" class="oe_stat_button"
attrs="{'invisible': [('purchase_count', '=', 0)]}" icon="fa-shopping-cart">
<field name="purchase_count" widget="statinfo" string="采购订单"/>
</button>
</div>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="menu_purhcase_request" model="ir.ui.menu">
<field name="name">采购申请</field>
<field name="parent_id" ref="purchase.menu_purchase_root" />
<field name="sequence">2</field>
</record>
<record id="purchase_request.menu_purchase_request_pro_mgt" model="ir.ui.menu">
<field name="sequence">1</field>
<field name="parent_id" ref="jikimo_purchase_request.menu_purhcase_request"/>
</record>
<record id="purchase_request.menu_purchase_request_line" model="ir.ui.menu">
<field name="sequence">10</field>
<field name="parent_id" ref="jikimo_purchase_request.menu_purhcase_request"/>
</record>
</data>
</odoo>

View File

@@ -15,6 +15,26 @@
<field name="part_number"/>
<field name="part_name"/>
</xpath>
<xpath expr="//button[@name='button_done']" position="attributes">
<attribute name="class"/>
</xpath>
<xpath expr="//button[@name='button_in_progress']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//button[@name='%(purchase_request.action_purchase_request_line_make_purchase_order)d']" position="attributes">
<attribute name="class">oe_highlight</attribute>
</xpath>
</field>
</record>
<record id="view_purchase_request_tree_sf" model="ir.ui.view">
<field name="name">purchase.request.sf.tree</field>
<field name="model">purchase.request</field>
<field name="inherit_id" ref="purchase_request.view_purchase_request_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='activity_ids']" position="attributes">
<attribute name="optional">hide</attribute>
</xpath>
</field>
</record>
@@ -47,6 +67,16 @@
<field name="part_number"/>
<field name="part_name" invisible="1"/>
</xpath>
<xpath expr="//tree" position="inside">
<header>
<button
name="%(purchase_request.action_purchase_request_line_make_purchase_order)d"
string="创建询价单"
type="action"
class="btn-primary"
/>
</header>
</xpath>
</field>
</record>
@@ -63,4 +93,9 @@
</xpath>
</field>
</record>
<record model="ir.actions.act_window" id="purchase_request.purchase_request_form_action">
<field name="name">Purchase Requests</field>
<field name="context"></field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="stock_pikcing_inherited_form_jikimo_purchase_request" model="ir.ui.view">
<field name="name">stock.pikcing.inherited.form.jikimo.purchase.request</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']/button" position="before">
<button class="oe_stat_button" name="action_view_purchase_request" type="object" icon="fa-credit-card"
attrs="{'invisible': [('purchase_request_count', '=', 0)]}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="purchase_request_count"/>
</span>
<span class="o_stat_text">采购申请</span>
</div>
</button>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,3 +1,4 @@
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0)
from . import purchase_request_line_make_purchase_order
from . import purchase_request_wizard

View File

@@ -32,6 +32,7 @@ class PurchaseRequestLineMakePurchaseOrder(models.TransientModel):
line.company_id,
line.request_id.origin,
)
# po_data.update({'related_product':line.related_product.id})
purchase = purchase_obj.create(po_data)
# Look for any other PO line in the selected PO with same
@@ -63,6 +64,8 @@ class PurchaseRequestLineMakePurchaseOrder(models.TransientModel):
po_line_data = self._prepare_purchase_order_line(purchase, item)
if item.keep_description:
po_line_data["name"] = item.name
if line.related_product:
po_line_data.update({'related_product': line.related_product.id})
po_line = po_line_obj.create(po_line_data)
po_line_product_uom_qty = po_line.product_uom._compute_quantity(
po_line.product_uom_qty, alloc_uom
@@ -100,9 +103,27 @@ class PurchaseRequestLineMakePurchaseOrder(models.TransientModel):
def check_group(self, request_lines):
# 去掉合并必须同一采购组的限制
pass
def get_items(self, request_line_ids):
request_line_obj = self.env["purchase.request.line"]
items = []
request_lines = request_line_obj.browse(request_line_ids).filtered(lambda line: line.pending_qty_to_receive > 0)
self._check_valid_request_line(request_line_ids)
self.check_group(request_lines)
for line in request_lines:
items.append([0, 0, self._prepare_item(line)])
return items
class PurchaseRequestLineMakePurchaseOrderItem(models.TransientModel):
_inherit = "purchase.request.line.make.purchase.order.item"
supply_method = fields.Selection(related='line_id.supply_method', string='供货方式')
wiz_id = fields.Many2one(
comodel_name="purchase.request.line.make.purchase.order",
string="Wizard",
required=False,
ondelete="cascade",
readonly=True,
)

View File

@@ -0,0 +1,12 @@
from odoo import models, fields, api
class PurchaseRequestWizard(models.TransientModel):
_name = 'purchase.request.wizard'
_description = '采购申请向导'
purchase_request_id = fields.Many2one('purchase.request', string='采购申请')
message = fields.Char(string='提示', readonly=True)
def confirm(self):
return self.purchase_request_id.write({"state": "done"})

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="purchase_request_wizard_wizard_form_view">
<field name="name">purchase.request.wizard.form.view</field>
<field name="model">purchase.request.wizard</field>
<field name="arch" type="xml">
<form>
<sheet>
<div>
<div style="white-space: pre-wrap;">
<field name="message"/>
</div>
</div>
<footer>
<button string="确认" name="confirm" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@@ -1,10 +1,9 @@
# -*- coding: utf-8 -*-
{
'name': "机企猫 采购审批流程",
'name': "机企猫 采购申请审批流程",
'summary': """
Short (1 phrase/line) summary of the module's purpose, used as
subtitle on modules listing or apps.openerp.com""",
采购申请审批流程""",
'description': """
Long description of module's purpose

View File

@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from . import models
from . import models
from . import stock_rule

View File

@@ -22,3 +22,9 @@ class PurchaseRequest(models.Model):
self.state = 'approved'
return res
@api.model
def _get_under_validation_exceptions(self):
res = super(PurchaseRequest, self)._get_under_validation_exceptions()
res.append("state")
return res

View File

@@ -0,0 +1,17 @@
from odoo import models, api
class StockRule(models.Model):
_inherit = 'stock.rule'
def _run_buy(self, procurements):
# 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved
origins = list(set([procurement[0].origin for procurement in procurements]))
res = super(StockRule, self)._run_buy(procurements)
# origins = list(set([procurement[0].origin for procurement in procurements]))
for origin in origins:
pr_ids = self.env["purchase.request"].sudo().search(
[('origin', 'like', origin), ('rule_new_add', '=', True), ('state', '=', 'draft')])
if pr_ids:
pr_ids.write({'need_validation': False})
pr_ids.write({"state": "approved", 'need_validation': True, 'rule_new_add': False})
return res

View File

@@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
{
'name': "机企猫 采购申请审批流程",
'name': "机企猫 采购审批流程",
'summary': """
采购申请审批流程""",
采购审批流程""",
'description': """
采购申请审批流程""",
采购审批流程""",
'author': "My Company",
'website': "https://www.yourcompany.com",

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
{
'name': 'Jikimo_test_generate_product_name',
'version': '',
'summary': """ Jikimo_test_generate_product_name Summary """,
'author': '',
'website': '',
'category': '',
'depends': ['sf_manufacturing'],
'data': [
],
'application': True,
'installable': True,
'auto_install': False,
'license': 'LGPL-3',
}

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import product_template

View File

@@ -0,0 +1,21 @@
from odoo import models
class ProductTemplate(models.Model):
_inherit = 'product.template'
def generate_product_name(self, order_id, item, i):
"""生成成品名称"""
# 3D文件名去掉后缀截取前40个字符+“-”+模型ID
product_name = '%s-%s' % ('.'.join(item['model_name'].split('.')[:-1])[:40], item['model_id'])
return product_name
def generate_embryo_name(self, order_id, item, materials_id, materials_type_id, embryo_redundancy_id, i):
"""生成坯料名称"""
embryo_name = '%s-%s[%s * %s * %s]%s' % (materials_id.name, materials_type_id.name,
self.format_float(item['model_long'] + embryo_redundancy_id.long),
self.format_float(item['model_width'] + embryo_redundancy_id.width),
self.format_float(item['model_height'] + embryo_redundancy_id.height),
item['model_id'])
return embryo_name

View File

@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models

View File

@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
{
'name': '机企猫 报工系统API',
'version': '1.0.0',
'summary': """ 机企猫 报工系统API """,
'author': '机企猫',
'website': 'https://xt.sf.jikimo.com',
'category': 'sf',
'depends': ['base', 'sf_maintenance', 'jikimo_mini_program'],
'data': [
],
'application': True,
'installable': True,
'auto_install': False,
'license': 'LGPL-3',
}

View File

@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import main

View File

@@ -0,0 +1,69 @@
import json
from odoo import http
from odoo.http import request
from odoo.addons.sf_machine_connect.models.ftp_operate import transfer_files
from odoo.addons.sf_base.decorators.api_log import api_log
class MainController(http.Controller):
@http.route('/api/manual_download_program', type='json', methods=['POST'], auth='wechat_token', cors='*')
@api_log('人工线下加工编程文件传输', requester='报工系统')
def manual_download_program(self):
"""
人工线下加工传输编程文件
"""
data = json.loads(request.httprequest.data)
maintenance_equipment_id = data.get('maintenance_equipment_id')
model_id = data.get('model_id')
if not maintenance_equipment_id or not model_id:
return {'code': 400, 'message': '参数错误'}
try:
model_id = int(model_id)
except Exception as e:
return {'code': 400, 'message': '参数类型错误'}
maintenance_equipment = request.env['maintenance.equipment'].sudo().search(
[('MTcode', '=', maintenance_equipment_id), ('category_id.equipment_type', '=', '机床')],
limit=1
)
if not maintenance_equipment:
return {'code': 400, 'message': '机台不存在,请扫描正确的机台二维码'}
product = request.env['product.template'].sudo().search([('model_id', '=', model_id)], limit=1)
if not product:
return {'code': 400, 'message': '请扫描正确的图纸'}
# 获取刀具组
tool_groups_id = request.env['sf.tool.groups'].sudo().search([('equipment_ids', 'in', maintenance_equipment.id)], limit=1)
if not tool_groups_id:
return {'code': 400, 'message': '刀具组不存在'}
ftp_resconfig = request.env['res.config.settings'].sudo().get_values()
if not ftp_resconfig['ftp_host'] or not ftp_resconfig['ftp_port'] or not ftp_resconfig['ftp_user'] or not ftp_resconfig['ftp_password']:
return {'code': 400, 'message': '编程文件FTP配置错误'}
source_ftp_info = {
'host': ftp_resconfig['ftp_host'],
'port': int(ftp_resconfig['ftp_port']),
'username': ftp_resconfig['ftp_user'],
'password': ftp_resconfig['ftp_password']
}
if not maintenance_equipment.ftp_host or not maintenance_equipment.ftp_port or not maintenance_equipment.ftp_username or not maintenance_equipment.ftp_password:
return {'code': 400, 'message': '机台FTP配置错误'}
target_ftp_info = {
'host': maintenance_equipment.ftp_host,
'port': int(maintenance_equipment.ftp_port),
'username': maintenance_equipment.ftp_username,
'password': maintenance_equipment.ftp_password
}
# 传输nc文件
try:
result = transfer_files(
source_ftp_info,
target_ftp_info,
'/' + str(model_id),
'/',
match_str=r'^\d*-' + tool_groups_id.name + r'-\w{2}-all\.nc$'
)
if len(result) > 0:
return {'code': 200, 'message': '传输成功', 'file_list': result}
else:
return {'code': 404, 'message': '未找到编程文件'}
except Exception as e:
return {'code': 500, 'message': str(e)}

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@@ -4,6 +4,7 @@ import json
import logging
from odoo.addons.sf_mrs_connect.controllers.controllers import Sf_Mrs_Connect
from odoo.addons.sf_manufacturing.controllers.controllers import Manufacturing_Connect
from odoo.addons.sf_base.decorators.api_log import api_log
from datetime import datetime
_logger = logging.getLogger(__name__)
@@ -12,6 +13,7 @@ class WorkorderExceptionConroller(http.Controller):
@http.route('/AutoDeviceApi/BillError', type='json', auth='public', methods=['GET', 'POST'], csrf=False,
cors="*")
@api_log('工单对接错误', requester='中控系统')
def workder_exception(self, **kw):
"""
记录工单异常

View File

@@ -52,10 +52,10 @@ class JikimoWorkorderException(models.Model):
def _get_message(self, message_queue_ids):
contents, _ = super(JikimoWorkorderException, self)._get_message(message_queue_ids)
url = self.env['ir.config_parameter'].get_param('web.base.url')
base_url = self.env['ir.config_parameter'].get_param('web.base.url')
action_id = self.env.ref('mrp.mrp_production_action').id
for index, content in enumerate(contents):
exception_id = self.env['jikimo.workorder.exception'].browse(message_queue_ids[index].res_id)
url = url + '/web#id=%s&view_type=form&action=%s' % (exception_id.workorder_id.production_id.id, action_id)
url = base_url + '/web#id=%s&view_type=form&action=%s' % (exception_id.workorder_id.production_id.id, action_id)
contents[index] = content.replace('{{url}}', url)
return contents, message_queue_ids

View File

@@ -133,6 +133,7 @@ class QualityCheck(models.Model):
part_name = fields.Char('零件名称', related='product_id.part_name', readonly=False, store=True)
part_number = fields.Char('零件图号', related='product_id.part_number', readonly=False, store=True)
material_name = fields.Char('材料名称', compute='_compute_material_name')
model_id = fields.Char('模型ID', related='product_id.model_id')
# # 总数量值为调拨单_产品明细_数量
# total_qty = fields.Float('总数量', compute='_compute_total_qty', readonly=True)
@@ -141,7 +142,7 @@ class QualityCheck(models.Model):
# # 出厂检验报告编号
# report_number = fields.Char('出厂检验报告编号', compute='_compute_report_number', readonly=True)
# 总数量值为调拨单_产品明细_数量
total_qty = fields.Char('总数量', compute='_compute_total_qty')
total_qty = fields.Char('总数量', compute='_compute_total_qty', store=True)
column_nums = fields.Integer('测量值列数', default=1)
@@ -153,9 +154,9 @@ class QualityCheck(models.Model):
for move in record.picking_id.move_ids_without_package:
if move.product_id == record.product_id:
total_qty = int(move.product_uom_qty)
record.total_qty = total_qty if total_qty > 0 else ''
record.total_qty = total_qty if total_qty > 0 else 0
else:
record.total_qty = ''
record.total_qty = 0
# 检验数
check_qty = fields.Integer('检验数', default=lambda self: self._get_default_check_qty())
@@ -206,7 +207,7 @@ class QualityCheck(models.Model):
('NG', 'NG')
], string='出厂检验报告结果', default='OK')
measure_operator = fields.Many2one('res.users', string='操机员')
quality_manager = fields.Many2one('res.users', string='质检员', compute='_compute_quality_manager', store=True)
quality_manager = fields.Many2one('res.users', string='质检员', compute='_compute_quality_manager')
@api.depends('measure_line_ids')
def _compute_quality_manager(self):
@@ -258,6 +259,23 @@ class QualityCheck(models.Model):
line[field_name] = False
self.column_nums = self.column_nums - 1
def upload_measure_line(self):
"""
上传测量值
"""
for record in self:
if not record.part_name or not record.part_number:
raise UserError(_('零件名称和零件图号均不能为空'))
# 如果验证通过,返回原动作
action = self.env.ref('quality_control.import_complex_model_wizard').read()[0]
action['context'] = {
'default_model_name': 'quality.check.measure.line',
'default_check_id': self.id,
}
return action
def do_preview(self):
"""
预览出厂检验报告
@@ -321,7 +339,7 @@ class QualityCheck(models.Model):
# 4. 获取报告动作并生成PDF此时二维码将包含正确的文档ID
report_action = self.env.ref('sf_quality.action_report_quality_inspection')
pdf_content, _ = report_action._render_qweb_pdf(
pdf_content, v = report_action._render_qweb_pdf(
report_ref=report_action.report_name,
res_ids=self.ids
)
@@ -718,8 +736,9 @@ class QualityCheck(models.Model):
def _compute_qty_to_test(self):
for qc in self:
if qc.is_lot_tested_fractionally:
rounding = qc.product_id.uom_id.rounding if qc.product_id.uom_id else 0.01
qc.qty_to_test = float_round(qc.qty_line * qc.testing_percentage_within_lot / 100,
precision_rounding=self.product_id.uom_id.rounding, rounding_method="UP")
precision_rounding=rounding, rounding_method="UP")
else:
qc.qty_to_test = qc.qty_line

View File

@@ -267,7 +267,7 @@
<field name="company_id" invisible="1"/>
<field name="categ_type" invisible="1"/>
<field name="product_id" attrs="{'invisible' : [('measure_on', '=', 'operation')]}"/>
<field name="part_name" attrs="{'invisible': [('categ_type', '!=', '成品')]}"/>
<field name="part_name" attrs="{'invisible': [('categ_type', '!=', '成品')], 'readonly': [('publish_status', '=', 'published')]}"/>
<field name="part_number" attrs="{'invisible': [('categ_type', '!=', '成品')], 'readonly': [('publish_status', '=', 'published')]}"/>
<field name="material_name" attrs="{'invisible': [('categ_type', '!=', '成品')]}"/>
<field name="total_qty" attrs="{'invisible': ['|', ('measure_on', '!=', 'product'), ('is_out_check', '=', False)]}"/>
@@ -334,11 +334,15 @@
<div class="o_row">
<button name="add_measure_line" type="object" class="btn-primary" string="添加测量值" attrs="{'invisible': [('publish_status', '=', 'published')]}"/>
<button name="remove_measure_line" type="object" class="btn-primary" string="删除测量值" attrs="{'invisible': [('publish_status', '=', 'published')]}"/>
<button name="%(quality_control.import_complex_model_wizard)d" string="上传"
type="action"
<!-- <button name="%(quality_control.import_complex_model_wizard)d" string="上传111" -->
<!-- type="action" -->
<!-- class="btn-primary" -->
<!-- attrs="{'force_show':1, 'invisible': [('publish_status', '=', 'published')]}" -->
<!-- context="{'default_model_name': 'quality.check.measure.line', 'default_check_id': id}"/> -->
<button name="upload_measure_line" string="上传"
type="object"
class="btn-primary"
attrs="{'force_show':1, 'invisible': [('publish_status', '=', 'published')]}"
context="{'default_model_name': 'quality.check.measure.line', 'default_check_id': id}"/>
attrs="{'force_show':1, 'invisible': [('publish_status', '=', 'published')]}"/>
</div>
<br/>
<div class="o_row">
@@ -489,6 +493,9 @@
<field name="picking_id"/>
<field name="lot_id"/>
<field name="team_id"/>
<field name="part_number"/>
<field name="part_name"/>
<field name="model_id"/>
<filter string="In Progress" name="progress" domain="[('quality_state', '=', 'none')]"/>
<filter string="Passed" name="passed" domain="[('quality_state', '=', 'pass')]"/>
<filter string="Failed" name="failed" domain="[('quality_state', '=', 'fail')]"/>

View File

@@ -22,6 +22,7 @@ _logger = logging.getLogger(__name__)
class ImportComplexModelWizard(models.TransientModel):
_name = 'quality.check.import.complex.model.wizard'
file_data = fields.Binary("数据文件")
filename = fields.Char(string='文件名')
model_name = fields.Char(string='Model Name')
field_basis = fields.Char(string='Field Basis')
check_id = fields.Many2one(string='质检单', comodel_name='quality.check')
@@ -93,11 +94,16 @@ class ImportComplexModelWizard(models.TransientModel):
return repeats
def convert_float(self, value):
if isinstance(value, float) and value.is_integer():
return int(value)
return value
def import_data(self):
"""导入Excel数据"""
if not self.file_data:
raise UserError(_('请先上传Excel文件'))
if self.check_id.measure_line_ids:
self.sudo().check_id.measure_line_ids.unlink()
@@ -161,6 +167,20 @@ class ImportComplexModelWizard(models.TransientModel):
# 从第二行开始读取数据(跳过表头)
max_columns = 1
for row_index in range(1, sheet.nrows):
row = sheet.row_values(row_index)
# 检查行是否有数据
if not any(row):
continue
if row[2] == '':
continue
logging.info('================%s, %s==' % (row[1], type(row[1])))
compare_value = self.convert_float(row[1])
if str(compare_value) != quality_check.part_number:
print(sheet.row_values(row_index))
raise UserError(_('上传内容图号错误,请修改'))
for row_index in range(1, sheet.nrows):
row = sheet.row_values(row_index)
@@ -177,14 +197,14 @@ class ImportComplexModelWizard(models.TransientModel):
'sequence': len(quality_check.measure_line_ids) + 1,
'product_name': str(row[0]) if row[0] else '', # 产品名称列
'drawing_no': str(row[1]) if row[1] else '', # 图号列
'measure_item': row[2] or '', # 检测项目列
'measure_value1': str(row[4]) if row[4] else '', # 测量值1
'measure_value2': str(row[5]) if row[5] else '', # 测量值2
'measure_value3': str(row[6]) if len(row) > 6 and row[6] else '', # 测量值3
'measure_value4': str(row[7]) if len(row) > 7 and row[7] else '', # 测量值4
'measure_value5': str(row[8]) if len(row) > 8 and row[8] else '', # 测量值5
'measure_item': str(self.convert_float(row[2])) or '', # 检测项目列
'measure_value1': str(self.convert_float(row[4])) if row[4] else '', # 测量值1
'measure_value2': str(self.convert_float(row[5])) if row[5] else '', # 测量值2
'measure_value3': str(self.convert_float(row[6])) if len(row) > 6 and row[6] else '', # 测量值3
'measure_value4': str(self.convert_float(row[7])) if len(row) > 7 and row[7] else '', # 测量值4
'measure_value5': str(self.convert_float(row[8])) if len(row) > 8 and row[8] else '', # 测量值5
'measure_result': 'NG' if row[9] == 'NG' else 'OK', # 判定列
'remark': row[10] if len(row) > 10 and row[10] else '', # 备注列
'remark': self.convert_float(row[10]) if len(row) > 10 and row[10] else '', # 备注列
}
for i in range(1, 6):
@@ -194,7 +214,7 @@ class ImportComplexModelWizard(models.TransientModel):
self.env['quality.check.measure.line'].create(measure_line_vals)
valid_data_imported = True
quality_check.column_nums = max_columns
# 检查是否有有效数据被导入
@@ -424,7 +444,8 @@ class ImportComplexModelWizard(models.TransientModel):
# )
def download_excel_template(self):
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + '/quality_control/static/src/binary/出厂检验报告上传模版.xlsx'
base_url = self.env['ir.config_parameter'].sudo().get_param(
'web.base.url') + '/quality_control/static/src/binary/出厂检验报告上传模版.xlsx'
# 只有当原始 URL 使用 http 时才替换为 https
if base_url.startswith("http://"):

View File

@@ -6,7 +6,8 @@
<field name="arch" type="xml">
<form>
<group>
<field name="file_data" widget="binary" options="{'accepted_file_extensions': '.xlsx'}"/>
<field name="file_data" widget="binary" filename="filename" options="{'accepted_file_extensions': '.xls,.xlsx'}"/>
<field name="filename" invisible="1"/>
</group>
<footer>
<button string="确认导入" name="import_data" type="object" class="btn-primary"/>

View File

@@ -23,8 +23,8 @@ class QualityCheckWizard(models.TransientModel):
lot_name = fields.Char(related='current_check_id.lot_name')
lot_line_id = fields.Many2one(related='current_check_id.lot_line_id')
qty_line = fields.Float(related='current_check_id.qty_line')
qty_to_test = fields.Float(related='current_check_id.qty_to_test')
qty_tested = fields.Float(related='current_check_id.qty_tested', readonly=False)
qty_to_test = fields.Float(related='current_check_id.qty_to_test', string='待检')
qty_tested = fields.Float(related='current_check_id.qty_tested', string='已检', readonly=False)
measure = fields.Float(related='current_check_id.measure', readonly=False)
measure_on = fields.Selection(related='current_check_id.measure_on')
quality_state = fields.Selection(related='current_check_id.quality_state')

View File

@@ -1,3 +1,7 @@
pystrich
cpca
pycryptodome==3.20
cpca==0.5.5
wechatpy==1.8.18
pycryptodome==3.22.0
openupgradelib==3.10.0
opcua==0.98.13
openpyxl

View File

@@ -1,3 +1,4 @@
from . import models
from . import commons
from . import controllers
from . import decorators

View File

@@ -25,7 +25,7 @@
'views/menu_fixture_view.xml',
'views/change_base_view.xml',
'views/Printer.xml',
'views/api_log_views.xml',
],
'demo': [
],

View File

@@ -9,7 +9,6 @@ class Printer(models.Model):
ip_address = fields.Char(string='IP 地址', required=True)
port = fields.Integer(string='端口', default=9100)
class TableStyle(models.Model):
_name = 'table.style'
_description = '标签样式'

View File

@@ -2,7 +2,16 @@
import time, datetime
import hashlib
from odoo import models
from typing import Optional
import socket
import os
import logging
import qrcode
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
class Common(models.Model):
_name = 'sf.sync.common'
@@ -92,3 +101,145 @@ class PrintingUtils(models.AbstractModel):
# host = "192.168.50.110" # 可以作为参数传入,或者在此配置
# port = 9100 # 可以作为参数传入,或者在此配置
self.send_to_printer(host, port, zpl_code)
def add_qr_code_to_pdf(
self,
pdf_path:str,
content:str,
qr_code_buttom_text:Optional[str]=False,
buttom_text:Optional[str]=False,
):
"""
在PDF文件中添加二维码
:param pdf_path: PDF文件路径
:param content: 二维码内容
:param qr_code_buttom_text: 二维码下方文字
:param buttom_text: 正文下方文字
:return: 是否成功
"""
if not os.path.exists(pdf_path):
logging.warning(f'PDF文件不存在: {pdf_path}')
return False
# 生成二维码
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(str(content))
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white")
# 保存二维码为临时文件
qr_temp_path = '/tmp/qr_temp.png'
qr_img.save(qr_temp_path)
# 创建一个临时PDF文件路径
output_temp_path = '/tmp/output_temp.pdf'
try:
# 使用reportlab创建一个新的PDF
# 注册中文字体
font_paths = [
"/usr/share/fonts/chinese/simsun.ttc", # Windows系统宋体
"c:/windows/fonts/simsun.ttc", # Windows系统宋体另一个位置
"/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf", # Linux Droid字体
"/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", # 文泉驿正黑
"/usr/share/fonts/chinese/TrueType/simsun.ttc", # 某些Linux发行版位置
]
font_found = False
for font_path in font_paths:
if os.path.exists(font_path):
try:
pdfmetrics.registerFont(TTFont('SimSun', font_path))
font_found = True
break
except:
continue
# 读取原始PDF
with open(pdf_path, "rb") as original_file:
existing_pdf = PdfFileReader(original_file)
output = PdfFileWriter()
# 处理最后一页
last_page = existing_pdf.getNumPages() - 1
page = existing_pdf.getPage(last_page)
# 获取页面尺寸
page_width = float(page.mediaBox.getWidth())
page_height = float(page.mediaBox.getHeight())
# 创建一个新的PDF页面用于放置二维码
c = canvas.Canvas(output_temp_path, pagesize=(page_width, page_height))
# 设置字体
if font_found:
c.setFont('SimSun', 10) # 增大字体大小到14pt
else:
# 如果没有找到中文字体,使用默认字体
c.setFont('Helvetica', 10)
logging.warning("未找到中文字体,将使用默认字体")
# 在右下角绘制二维码,预留边距
qr_size = 1.5 * inch # 二维码大小为2英寸
margin = 0.1 * inch # 边距为0.4英寸
qr_y = margin + 20 # 将二维码向上移动一点,为文字留出空间
c.drawImage(qr_temp_path, page_width - qr_size - margin, qr_y, width=qr_size, height=qr_size)
if qr_code_buttom_text:
# 在二维码下方绘制文字
text = qr_code_buttom_text
text_width = c.stringWidth(text, "SimSun" if font_found else "Helvetica", 10) # 准确计算文字宽度
text_x = page_width - qr_size - margin + (qr_size - text_width) / 2 # 文字居中对齐
text_y = margin + 20 # 文字位置靠近底部
c.drawString(text_x, text_y, text)
# 设置字体
if font_found:
c.setFont('SimSun', 12) # 增大字体大小到14pt
else:
# 如果没有找到中文字体,使用默认字体
c.setFont('Helvetica', 120)
logging.warning("未找到中文字体,将使用默认字体")
if buttom_text:
# 在下方中间添加文字
text = buttom_text
text_width = c.stringWidth(text, "SimSun" if font_found else "Helvetica", 12) # 准确计算文字宽度
text_x = (page_width - text_width) / 2 # 文字居中对齐
text_y = margin + 20 # 文字位置靠近底部
c.drawString(text_x, text_y, text)
c.save()
# 读取带有二维码的临时PDF
with open(output_temp_path, "rb") as qr_file:
qr_pdf = PdfFileReader(qr_file)
qr_page = qr_pdf.getPage(0)
# 合并原始页面和二维码页面
page.mergePage(qr_page)
# 添加剩余的页面
for i in range(0, last_page):
output.addPage(existing_pdf.getPage(i))
output.addPage(page)
# 保存最终的PDF到一个临时文件
final_temp_path = pdf_path + '.tmp'
with open(final_temp_path, "wb") as output_file:
output.write(output_file)
# 替换原始文件
os.replace(final_temp_path, pdf_path)
return True
finally:
# 清理临时文件
if os.path.exists(qr_temp_path):
os.remove(qr_temp_path)
if os.path.exists(output_temp_path):
os.remove(output_temp_path)

View File

@@ -1,15 +1,18 @@
# -*- coding: utf-8 -*-
import logging
import json
import base64
import logging
from odoo import http
from odoo.http import request
from odoo.addons.sf_base.decorators.api_log import api_log
_logger = logging.getLogger(__name__)
class Manufacturing_Connect(http.Controller):
@http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
cors="*")
@api_log('机床刀具组', requester='中控系统')
def get_maintenance_tool_groups_Info(self, **kw):
"""
机床刀具组接口

View File

@@ -0,0 +1 @@
from . import api_log

View File

@@ -0,0 +1,65 @@
import functools
import json
import logging
from datetime import datetime
from odoo.http import request
_logger = logging.getLogger(__name__)
def api_log(name=None, requester=None):
"""记录API请求日志的装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = datetime.now()
# 获取请求信息
try:
# 获取请求数据
request_data = json.loads(request.httprequest.data) if request.httprequest.data else {}
# 获取请求路径
path = request.httprequest.path
# 获取请求方法
method = request.httprequest.method
# 获取客户端IP
remote_addr = request.httprequest.remote_addr
# 执行原始函数
result = func(*args, **kwargs)
origin_result = result
if isinstance(result, str):
result = json.loads(result)
# 计算响应时间
end_time = datetime.now()
response_time = (end_time - start_time).total_seconds()
# 获取响应状态
status = result.get('code') if 'code' in result else result.get('ErrorCode') if 'ErrorCode' in result else 200
# 创建日志记录
log_vals = {
'name': name or func.__name__,
'path': path,
'method': method.upper(),
'request_data': json.dumps(request_data, ensure_ascii=False),
'response_data': json.dumps(result, ensure_ascii=False),
'remote_addr': remote_addr,
'response_time': response_time,
'status': 200 if status == 0 else status,
'requester': requester,
'responser': '智能工厂'
}
# 异步创建日志记录
request.env['api.request.log'].sudo().with_context(tracking_disable=True).create(log_vals)
return origin_result
except Exception as e:
_logger.error(f"API日志记录失败: {str(e)}")
# 即使日志记录失败,也要返回原始结果
return func(*args, **kwargs)
return wrapper
return decorator

View File

@@ -6,3 +6,4 @@ from . import functional_fixture
from . import tool_other_features
from . import basic_parameters_fixture
from . import ir_sequence
from . import api_log

72
sf_base/models/api_log.py Normal file
View File

@@ -0,0 +1,72 @@
from odoo import models, fields, api
import json, ast
import logging
import requests
_logger = logging.getLogger(__name__)
class ApiRequestLog(models.Model):
_name = 'api.request.log'
_description = '接口请求日志'
_order = 'id desc'
name = fields.Char('接口名称')
path = fields.Char('请求路径')
method = fields.Char('请求方法')
request_data = fields.Text('请求数据')
response_data = fields.Text('响应数据')
remote_addr = fields.Char('客户端IP')
response_time = fields.Float('响应时间(秒)', digits=(16, 6))
status = fields.Integer('状态码')
requester = fields.Char('请求方')
responser = fields.Char('响应方')
@api.model
def log_request(self, method, url, name=None, responser=None, **kwargs):
# Log the request
request_headers = kwargs.get('headers', {})
request_body = kwargs.get('json') or kwargs.get('params') or {}
_logger.info(f"Request: {method} {url} Headers: {request_headers} Body: {request_body}")
# Make the actual request
response = requests.request(method, url, **kwargs)
# Log the response
response_status = response.status_code
response_headers = response.headers
response_body = response.text
response_time = response.elapsed.total_seconds()
_logger.info(f"Response: Status: {response_status} Headers: {response_headers} Body: {response_body}")
try:
# 如果是字符串,先尝试用 ast.literal_eval 安全地转换成 Python 对象
if isinstance(response_body, str):
response_body_obj = json.loads(response_body)
else:
response_body_obj = response_body
# 再使用 json.dumps 转换成标准的 JSON 字符串
response_body = json.dumps(response_body_obj, ensure_ascii=False)
except Exception as e:
_logger.warning(f"转换 response_body 到标准 JSON 失败: {str(e)}")
# 如果转换失败,保持原样
# Save to database
self.sudo().create({
'name': name,
'path': url,
'method': method.upper(),
'request_data': request_body,
'response_data': response_body,
'remote_addr': None,
'response_time': response_time,
'status': response_status,
'requester': '智能工厂',
'responser': responser
})
return response

View File

@@ -254,3 +254,6 @@ access_sf_machining_accuracy_admin,sf_machining_accuracy_admin,model_sf_machinin
access_sf_embryo_redundancy,sf_embryo_redundancy,model_sf_embryo_redundancy,base.group_user,1,0,0,0
access_sf_embryo_redundancy_admin,sf_embryo_redundancy_admin,model_sf_embryo_redundancy,base.group_system,1,0,0,0
access_api_request_log_user,api.request.log.user,model_api_request_log,base.group_user,1,0,0,0
access_api_request_log_admin,api.request.log.admin,model_api_request_log,base.group_system,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
254
255
256
257
258
259

View File

@@ -148,12 +148,17 @@ td.o_required_modifier {
color: #aaa;
}
.o_kanban_primary_left {
display: flex;
flex-direction: row-reverse;
justify-content: flex-start;
// .o_kanban_primary_left {
// display: flex;
// flex-direction: row-reverse;
// justify-content: flex-start;
// }
.o_list_button {
min-width: 32px;
}
.o_list_record_remove {
padding-left: 0px !important;
}
.diameter:before {
content:"Ф";
display:inline;

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_api_request_log_tree" model="ir.ui.view">
<field name="name">api.request.log.tree</field>
<field name="model">api.request.log</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="path"/>
<field name="method"/>
<field name="remote_addr"/>
<field name="response_time" sum="0"/>
<field name="requester"/>
<field name="responser"/>
<field name="create_date" string="请求时间"/>
<field name="status" sum="0"/>
</tree>
</field>
</record>
<record id="view_api_request_log_form" model="ir.ui.view">
<field name="name">api.request.log.form</field>
<field name="model">api.request.log</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="path"/>
<field name="method"/>
<field name="remote_addr"/>
</group>
<group>
<field name="response_time"/>
<field name="status"/>
<field name="requester"/>
<field name="responser"/>
<field name="create_date" string="请求时间"/>
</group>
</group>
<notebook>
<page string="请求数据">
<field name="request_data"/>
</page>
<page string="响应数据">
<field name="response_data"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_api_request_log_search">
<field name="name">api.request.log.search</field>
<field name="model">api.request.log</field>
<field name="arch" type="xml">
<search string="API请求日志">
<field name="name"/>
<field name="requester"/>
<field name="responser"/>
<group>
<filter name="name" context="{'group_by':'name'}"/>
<filter name="requester" context="{'group_by':'requester'}"/>
<filter name="responser" context="{'group_by':'responser'}"/>
</group>
</search>
</field>
</record>
<record id="action_api_request_log" model="ir.actions.act_window">
<field name="name">API请求日志</field>
<field name="res_model">api.request.log</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_api_request_log"
name="API请求日志"
parent="base.next_id_9"
action="action_api_request_log"
sequence="100"/>
</odoo>

View File

@@ -5,7 +5,7 @@
<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">
<tree string="工艺可选参数" create="0" delete="0">
<field name="code"/>
<field name="name"/>
<field name="gain_way"/>
@@ -15,7 +15,7 @@
<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" >
<form string="工艺可选参数" create="0" delete="0" >
<sheet>
<div class="oe_title">
<h1>
@@ -104,7 +104,7 @@
<record model="ir.ui.view" id="sf_production_process_category_form">
<field name="model">sf.production.process.category</field>
<field name="arch" type="xml">
<form string="表面工艺类别" create="0" edit="0" delete="1">
<form string="工艺类别" create="0" edit="0" delete="1">
<sheet>
<div class="oe_title">
<h1>
@@ -120,7 +120,7 @@
</group>
</group>
<notebook>
<page string="表面工艺">
<page string="工艺">
<field name='production_process_ids' widget="ony2many">
<tree editable="bottom">
<field name="code" string="编码号" readonly="1" force_save="1"/>
@@ -139,7 +139,7 @@
<record model="ir.ui.view" id="sf_production_process_category_tree">
<field name="model">sf.production.process.category</field>
<field name="arch" type="xml">
<tree string="表面工艺类别" default_order="sequence, id" create="0" edit="0" delete="1">
<tree string="工艺类别" default_order="sequence, id" create="0" edit="0" delete="1">
<field name="sequence" widget="handle" string="序号" readonly="1"/>
<field name="code"/>
<field name="name" string="名称"/>
@@ -163,7 +163,7 @@
<record model="ir.ui.view" id="sf_production_process_tree">
<field name="model">sf.production.process</field>
<field name="arch" type="xml">
<tree string="表面工艺" create="0" edit="0" delete="0">
<tree string="工艺" create="0" edit="0" delete="0">
<field name="sequence" string="加工顺序" readonly="1"/>
<field name="code"/>
<field name="name" string="名称"/>
@@ -175,7 +175,7 @@
<record model="ir.ui.view" id="sf_production_process_form">
<field name="model">sf.production.process</field>
<field name="arch" type="xml">
<form string="表面工艺" create="0" delete="0">
<form string="工艺" create="0" delete="0">
<sheet>
<div class="oe_title">
<h1>
@@ -395,7 +395,7 @@
<field name="view_mode">tree,form</field>
</record>
<record id="sf_production_process" model="ir.actions.act_window">
<field name="name">表面工艺</field>
<field name="name">工艺</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.production.process</field>
<field name="view_mode">tree,form</field>
@@ -414,13 +414,13 @@
<!-- </record>-->
<record id="sf_production_process_category" model="ir.actions.act_window">
<field name="name">表面工艺类别</field>
<field name="name">工艺类别</field>
<field name="type">ir.actions.act_window</field>
<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="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>

View File

@@ -78,7 +78,7 @@
<menuitem
id="menu_sf_production_process"
name="表面工艺"
name="工艺"
parent="menu_sf_production_process_1"
sequence="2"
action="sf_production_process"
@@ -86,7 +86,7 @@
<menuitem
id="menu_sf_production_process_category"
name="表面工艺类别"
name="工艺类别"
parent="menu_sf_production_process_1"
sequence="1"
action="sf_production_process_category"
@@ -113,7 +113,7 @@
<menuitem
id="mrs_production_process_parameter_view"
name="表面工艺可选参数"
name="工艺可选参数"
parent="menu_sf_production_process_1"
sequence="2"
action="mrs_production_process_parameter_action"

View File

@@ -2,7 +2,7 @@
import logging
from datetime import datetime, timedelta
import hashlib
from odoo import models
from odoo import models, SUPERUSER_ID
from odoo.http import request
__author__ = 'jinling.yang'
@@ -48,5 +48,7 @@ class Http(models.AbstractModel):
_logger.info('sf_secret_key:%s' % factory_secret.sf_secret_key)
if check_sf_str != datas['HTTP_CHECKSTR']:
raise AuthenticationError('数据校验不通过')
# 设置管理员用户
request.update_env(user=SUPERUSER_ID)
else:
raise AuthenticationError('请求参数中无token')

View File

@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models
from . import wizard

View File

@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': '机企猫智能工厂 需求计划',
'version': '1.1',
'summary': '智能工厂计划管理',
'sequence': 1,
'description': """
在本模块,支持齐套检查与下达生产
""",
'category': 'sf',
'website': 'https://www.sf.jikimo.com',
'depends': ['sf_plan','jikimo_printing'],
'data': [
'security/ir.model.access.csv',
'data/stock_route_group.xml',
'views/demand_plan_info.xml',
'views/demand_plan.xml',
'views/stock_route.xml',
'views/sale_order_views.xml',
'wizard/sf_demand_plan_print_wizard_view.xml',
'wizard/sf_release_plan_wizard_views.xml',
'views/menu_view.xml',
],
'demo': [
],
'assets': {
'web.assets_qweb': [
],
'web.assets_backend': [
'sf_demand_plan/static/src/scss/style.css',
'sf_demand_plan/static/src/js/print_demand.js',
'sf_demand_plan/static/src/js/custom_button.js',
]
},
'license': 'LGPL-3',
'installable': True,
'application': False,
'auto_install': False,
}

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="0">
<record id="stock_route_group_automation_sf" model="stock.route.group">
<field name="name">自动化产线加工</field>
<field name="code">automation</field>
</record>
<record id="stock_route_group_manual_sf" model="stock.route.group">
<field name="name">人工线下加工</field>
<field name="code">manual</field>
</record>
<record id="stock_route_group_purchase_sf" model="stock.route.group">
<field name="name">外购</field>
<field name="code">purchase</field>
</record>
<record id="stock_route_group_outsourcing_sf" model="stock.route.group">
<field name="name">委外加工</field>
<field name="code">outsourcing</field>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,25 @@
# migrations/1.1.0/post-migrate.py
import os
import csv
import logging
from odoo import api, SUPERUSER_ID
_logger = logging.getLogger(__name__)
def migrate(cr, version):
# 获取环境
env = api.Environment(cr, SUPERUSER_ID, {})
ProductionLine = env['sf.production.demand.plan']
DemandPlan = env['sf.demand.plan']
lines = ProductionLine.search([('demand_plan_id', '=', False)])
for line in lines:
vals = {
'sale_order_id': line.sale_order_id.id,
'sale_order_line_id': line.sale_order_line_id.id,
'line_ids': line.ids
}
new_plan = DemandPlan.create(vals)
line.write({'demand_plan_id': new_plan.id})

View File

@@ -0,0 +1,11 @@
# -*- coding: utf-8 -*-
from . import sf_demand_plan
from . import sf_production_demand_plan
from . import sale_order
from . import stock_route
from . import mrp_bom
from . import mrp_production
from . import stock_rule
from . import purchase_request
from . import purchase_order

View File

@@ -0,0 +1,29 @@
from odoo import models, fields
class MrpBom(models.Model):
_inherit = 'mrp.bom'
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
def bom_create(self, product, bom_type, product_type, code=None):
bom_id = self.env['mrp.bom'].create({
'product_tmpl_id': product.product_tmpl_id.id,
'type': bom_type,
# 'subcontractor_id': '' or subcontract.partner_id.id,
'product_qty': 1,
'product_uom_id': 1,
'code': code
})
if bom_type == 'subcontract' and product_type is not False:
subcontract = self.get_supplier(product.materials_type_id)
bom_id.subcontractor_id = subcontract.partner_id.id
return bom_id
def name_get(self):
"""重写name_get方法只显示BOM编码"""
result = []
for record in self:
# 只显示BOM编码如果编码为空则显示产品名称
display_name = record.code or record.product_tmpl_id.name or f'BOM-{record.id}'
result.append((record.id, display_name))
return result

View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api
class MrpProduction(models.Model):
_inherit = 'mrp.production'
demand_plan_line_id = fields.Many2one(comodel_name="sf.production.demand.plan",
string="需求计划明细", readonly=True)
@api.depends('demand_plan_line_id')
def _compute_production_type(self):
for production in self:
if production.demand_plan_line_id.supply_method == 'automation':
production.production_type = '自动化产线加工'
elif production.demand_plan_line_id.supply_method == 'manual':
production.production_type = '人工线下加工'
else:
production.production_type = None
def _get_purchase_request(self):
"""获取跟制造订单相关的采购申请单(根据采购申请单行项目的产品匹配)"""
pr_ids = self.env['purchase.request'].sudo().search(
[('line_ids.demand_plan_line_id', 'in', self.demand_plan_line_id.ids)])
return pr_ids
@api.depends('procurement_group_id', 'procurement_group_id.stock_move_ids.group_id')
def _compute_picking_ids(self):
for order in self:
if order.product_id.product_tmpl_id.single_manufacturing == True and not order.is_remanufacture:
first_order = self.env['mrp.production'].search(
[('demand_plan_line_id', '=', order.demand_plan_line_id.id), ('product_id', '=', order.product_id.id)], limit=1, order='id asc')
order.picking_ids = self.env['stock.picking'].search([
('group_id', '=', first_order.procurement_group_id.id), ('group_id', '!=', False),
])
order.delivery_count = len(first_order.picking_ids)
else:
order.picking_ids = self.env['stock.picking'].search([
('group_id', '=', order.procurement_group_id.id), ('group_id', '!=', False),
])
order.delivery_count = len(order.picking_ids)

View File

@@ -0,0 +1,48 @@
from odoo import api, fields, models, _
from odoo.tools import float_compare
class PurchaseOrder(models.Model):
_inherit = 'purchase.order'
def button_confirm(self):
if self.order_line[0].demand_plan_line_id:
self = self.with_context(
demand_plan_line_id=self.order_line[0].demand_plan_line_id.id
)
res = super(PurchaseOrder, self).button_confirm()
return res
@api.depends('origin')
def _compute_purchase_type(self):
for purchase in self:
if purchase.order_line[0].product_id.categ_id.name == '坯料':
if purchase.order_line[0].product_id.materials_type_id.gain_way == '外协':
purchase.purchase_type = 'outsourcing'
else:
if purchase.order_line[0].demand_plan_line_id.supply_method == 'outsourcing':
purchase.purchase_type = 'outsourcing'
elif purchase.order_line[0].demand_plan_line_id.supply_method == 'purchase':
purchase.purchase_type = 'outside'
class PurchaseOrderLine(models.Model):
_inherit = 'purchase.order.line'
demand_plan_line_id = fields.Many2one(comodel_name="sf.production.demand.plan",
string="需求计划明细", readonly=True)
@api.model
def create(self, vals):
res = super(PurchaseOrderLine, self).create(vals)
if not res.demand_plan_line_id and res.order_id.origin:
origin = [origin.replace(' ', '') for origin in res.order_id.origin.split(',')]
if self.env.context.get('demand_plan_line_id'):
res.demand_plan_line_id = self.env.context.get('demand_plan_line_id')
elif 'MO' in res.order_id.origin:
# 原单据是制造订单
mp_ids = self.env['mrp.production'].sudo().search([('name', 'in', origin)])
if mp_ids:
res.demand_plan_line_id = mp_ids[0].demand_plan_line_id.id
return res

View File

@@ -0,0 +1,35 @@
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
class PurchaseRequestLine(models.Model):
_inherit = 'purchase.request.line'
_description = '采购申请明细'
supply_method = fields.Selection([
('automation', "自动化产线加工"),
('manual', "人工线下加工"),
('purchase', "外购"),
('outsourcing', "委外加工"),
], string='供货方式', readonly=True)
demand_plan_line_id = fields.Many2one(comodel_name="sf.production.demand.plan",
string="需求计划明细", readonly=True)
@api.depends('demand_plan_line_id')
def _compute_supply_method(self):
for prl in self:
if prl.demand_plan_line_id:
prl.supply_method = prl.demand_plan_line_id.supply_method
else:
prl.supply_method = None
class PurchaseRequestLineMakePurchaseOrder(models.TransientModel):
_inherit = "purchase.request.line.make.purchase.order"
@api.model
def _prepare_purchase_order_line(self, po, item):
ret = super(PurchaseRequestLineMakePurchaseOrder, self)._prepare_purchase_order_line(po, item)
ret['demand_plan_line_id'] = item.line_id.demand_plan_line_id.id
return ret

View File

@@ -0,0 +1,74 @@
from odoo import models, fields, api, _
class ReSaleOrder(models.Model):
_inherit = 'sale.order'
mrp_production_ids = fields.Many2many(
'mrp.production',
compute='_compute_mrp_production_ids',
string='与此销售订单相关联的制造订单',
groups='mrp.group_mrp_user', store=True)
demand_plan_ids = fields.Many2many(comodel_name="sf.demand.plan",
string="需求计划", readonly=True)
demand_plan_count = fields.Integer(
string="需求计划生成计数",
compute='_compute_demand_plan_count'
)
@api.depends('demand_plan_ids.line_ids.status')
def _compute_purchase_request_count(self):
for so in self:
pr_ids = self.env['purchase.request'].sudo().search([('origin', 'like', so.name)])
if pr_ids:
so.purchase_request_purchase_order_count = len(pr_ids)
else:
so.purchase_request_purchase_order_count = 0
@api.depends('demand_plan_ids.line_ids')
def _compute_demand_plan_count(self):
for line in self:
demand_plan = self.env['sf.production.demand.plan'].sudo().search([('sale_order_id', '=', line.id)])
line.demand_plan_count = len(demand_plan)
def sale_order_create_line(self, product, item):
ret = super(ReSaleOrder, self).sale_order_create_line(product, item)
vals = {
'sale_order_id': ret.order_id.id,
'sale_order_line_id': ret.id,
}
demand_plan_info = self.env['sf.demand.plan'].sudo().create(vals)
vals.update({'demand_plan_id': demand_plan_info.id, 'plan_uom_qty': ret.product_uom_qty,
'new_supply_method': 'custom_made', 'custom_made_type': 'manual'})
demand_plan = self.env['sf.production.demand.plan'].sudo().create(vals)
demand_plan_info.write({'line_ids': demand_plan.ids})
if demand_plan.product_id.machining_drawings_name:
filename_url = demand_plan.product_id.machining_drawings_name.rsplit('.', 1)[0]
wizard_vals = {
'model_id': demand_plan.model_id,
'filename_url': filename_url,
'machining_drawings': product.machining_drawings,
'type': '1',
}
self.env['sf.demand.plan.print.wizard'].sudo().create(wizard_vals)
ret.order_id.demand_plan_ids = [(4, demand_plan_info.id)]
return ret
def confirm_to_supply_method(self):
self.state = 'sale'
for line in self.order_line:
if line.product_id.auto_machining:
line.supply_method = 'automation'
def action_view_demand_plan(self):
self.ensure_one()
demand_plan_ids = self.env['sf.production.demand.plan'].sudo().search([('sale_order_id', '=', self.id)]).ids
return {
'res_model': 'sf.production.demand.plan',
'type': 'ir.actions.act_window',
'name': _("需求计划"),
'domain': [('id', 'in', demand_plan_ids)],
'view_mode': 'tree',
}

View File

@@ -0,0 +1,260 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.tools import float_compare
from odoo.exceptions import ValidationError
import re
class SfDemandPlan(models.Model):
_name = 'sf.demand.plan'
_description = 'sf_demand_plan'
state = fields.Selection([
('10', '待工艺设计'),
('30', '部分下达'),
('40', '已下达'),
('50', '取消'),
], string='状态', default='10', compute='_compute_state', store=True)
line_ids = fields.One2many(comodel_name='sf.production.demand.plan',
inverse_name='demand_plan_id', string="需求计划", copy=True)
sale_order_id = fields.Many2one(comodel_name="sale.order",
string="销售订单", readonly=True)
sale_order_line_id = fields.Many2one(comodel_name="sale.order.line",
string="销售订单明细", readonly=True)
product_id = fields.Many2one(
comodel_name='product.product',
related='sale_order_line_id.product_id',
string='产品', store=True, index=True)
part_name = fields.Char('零件名称', related='product_id.part_name')
part_number = fields.Char('零件图号', compute='_compute_part_number', store=True)
materials_id = fields.Char('材料', compute='_compute_materials_id', store=True)
blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类',
related='product_id.blank_type')
blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型',
related='product_id.blank_precision')
manual_quotation = fields.Boolean('人工编程', related='product_id.manual_quotation', default=False)
embryo_long = fields.Char('坯料尺寸(mm)', compute='_compute_embryo_long', store=True)
is_incoming_material = fields.Boolean('客供料', related='sale_order_line_id.is_incoming_material', store=True)
pending_qty = fields.Float(
string="待计划",
compute='_compute_pending_qty', store=True)
planned_qty = fields.Float(
string="已计划",
compute='_compute_planned_qty', store=True)
model_id = fields.Char('模型ID', related='product_id.model_id')
customer_name = fields.Char('客户', related='sale_order_id.customer_name')
product_uom_qty = fields.Float(
string="需求数量",
related='sale_order_line_id.product_uom_qty', store=True)
deadline_of_delivery = fields.Date('客户交期', related='sale_order_line_id.delivery_end_date', store=True)
contract_date = fields.Date('合同日期', related='sale_order_id.contract_date')
contract_code = fields.Char('合同号', related='sale_order_id.contract_code', store=True)
model_process_parameters_ids = fields.Many2many('sf.production.process.parameter',
'demand_plan_process_parameter_rel',
string='表面工艺',
compute='_compute_model_process_parameters_ids'
, store=True
)
model_machining_precision = fields.Selection(related='product_id.model_machining_precision', string='精度')
inventory_quantity_auto_apply = fields.Float(
string="成品库存",
compute='_compute_inventory_quantity_auto_apply'
)
priority = fields.Selection([
('1', '紧急'),
('2', ''),
('3', ''),
('4', ''),
], string='优先级', default='3')
overdelivery_allowed = fields.Boolean('可超量发货', default=False)
hide_button_release_plan = fields.Boolean(
string='显示下达计划按钮',
compute='_compute_hide_button_release_plan',
default=False
)
readonly_custom_made_type = fields.Boolean(
string='字段自制类型只读',
compute='_compute_readonly_custom_made_type',
default=False
)
demand_plan_number = fields.Char('需求计划号', compute='_compute_demand_plan_number', readonly=True, store=True)
origin = fields.Char('来源', related='sale_order_id.name', readonly=True, store=True)
@api.depends('product_id.part_number', 'product_id.model_name')
def _compute_part_number(self):
for line in self:
if line.product_id:
if line.product_id.part_number:
line.part_number = line.product_id.part_number
else:
if line.product_id.model_name:
line.part_number = line.product_id.model_name.rsplit('.', 1)[0]
else:
line.part_number = None
@api.depends('product_id.materials_id')
def _compute_materials_id(self):
for line in self:
if line.product_id:
line.materials_id = f"{line.product_id.materials_id.name}/{line.product_id.materials_type_id.name}"
else:
line.materials_id = None
@api.depends('product_id.model_long', 'product_id.model_width', 'product_id.model_height')
def _compute_embryo_long(self):
for line in self:
if line.product_id:
if line.product_id.blank_type == '圆料':
line.embryo_long = f"Ø{round(line.product_id.model_width, 3)}*{round(line.product_id.model_long, 3)}"
else:
line.embryo_long = f"{round(line.product_id.model_long, 3)}*{round(line.product_id.model_width, 3)}*{round(line.product_id.model_height, 3)}"
else:
line.embryo_long = None
@api.depends('product_id.model_process_parameters_ids')
def _compute_model_process_parameters_ids(self):
for line in self:
if line.product_id and line.product_id.model_process_parameters_ids:
line.model_process_parameters_ids = [(6, 0, line.product_id.model_process_parameters_ids.ids)]
else:
line.model_process_parameters_ids = [(5, 0, 0)]
def _compute_inventory_quantity_auto_apply(self):
location_id = self.env['stock.location'].search([('name', '=', '成品存货区')], limit=1).id
product_ids = self.mapped('product_id').ids
if product_ids:
quant_data = self.env['stock.quant'].read_group(
domain=[
('product_id', 'in', product_ids),
('location_id', '=', location_id)
],
fields=['product_id', 'inventory_quantity_auto_apply'],
groupby=['product_id']
)
quantity_map = {item['product_id'][0]: item['inventory_quantity_auto_apply'] for item in quant_data}
else:
quantity_map = {}
for line in self:
if line.product_id:
line.inventory_quantity_auto_apply = quantity_map.get(line.product_id.id, 0.0)
else:
line.inventory_quantity_auto_apply = 0.0
@api.depends('product_uom_qty', 'line_ids.plan_uom_qty')
def _compute_pending_qty(self):
for line in self:
sum_plan_uom_qty = sum(line.line_ids.mapped('plan_uom_qty'))
pending_qty = line.product_uom_qty - sum_plan_uom_qty
if float_compare(pending_qty, 0,
precision_rounding=line.product_id.uom_id.rounding) == -1:
line.pending_qty = 0
else:
line.pending_qty = pending_qty
@api.depends('line_ids.plan_uom_qty')
def _compute_planned_qty(self):
for line in self:
line.planned_qty = sum(line.line_ids.mapped('plan_uom_qty'))
@api.depends('line_ids.status')
def _compute_hide_button_release_plan(self):
for line in self:
line.hide_button_release_plan = bool(line.line_ids.filtered(
lambda p: p.status == '30'))
@api.depends('line_ids.status', 'sale_order_id.state')
def _compute_state(self):
for line in self:
status_line = line.line_ids.filtered(lambda p: p.status == '60')
if not line.line_ids:
line.state = '10'
elif line.sale_order_id.state == 'cancel':
line.state = '50'
line.line_ids.status = '100'
elif len(line.line_ids) == len(status_line):
line.state = '40'
elif bool(status_line):
line.state = '30'
else:
line.state = '10'
@api.depends('line_ids.status')
def _compute_readonly_custom_made_type(self):
for line in self:
production_demand_plan = line.line_ids.filtered(
lambda p: p.status in ('50', '60') and p.new_supply_method == 'custom_made')
line.readonly_custom_made_type = bool(production_demand_plan)
@api.constrains('line_ids')
def check_line_ids(self):
for item in self:
if not item.line_ids:
raise ValidationError('计划不能为空!')
def write(self, vals):
res = super(SfDemandPlan, self).write(vals)
if 'line_ids' in vals:
for line in self.line_ids:
if not line.sale_order_id:
line.sale_order_id = self.sale_order_id
if not line.sale_order_line_id:
line.sale_order_line_id = self.sale_order_line_id
return res
def name_get(self):
result = []
for plan in self:
result.append((plan.id, plan.demand_plan_number))
return result
def button_production_release_plan(self):
line_ids = self.line_ids.filtered(lambda p: p.status == '30')
sum_product_uom_qty = sum(line_ids.mapped('plan_uom_qty'))
customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
if not self.overdelivery_allowed and line_ids.filtered(lambda p: p.location_id.id == customer_location_id):
if float_compare(sum_product_uom_qty, self.product_uom_qty,
precision_rounding=self.product_id.uom_id.rounding) == 1:
raise ValidationError(f"已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
elif float_compare(sum_product_uom_qty, self.product_uom_qty,
precision_rounding=self.product_id.uom_id.rounding) == 1:
return {
'name': _('需求计划'),
'type': 'ir.actions.act_window',
'views': [(self.env.ref(
'sf_demand_plan.sf_release_plan_wizard_form').id,
'form')],
'res_model': 'sf.release.plan.wizard',
'target': 'new',
'context': {
'default_demand_plan_line_id': line_ids.ids,
'default_release_message': f"您正在下达计划量 {sum_product_uom_qty},需求数量为 {self.product_uom_qty},已超过需求数量,是否继续?",
}}
else:
for demand_plan_line_id in line_ids:
demand_plan_line_id.action_confirm()
# 需求要求取值格式是来源+来源明细行ID,但是来源明细行ID取得就是product_id.name得最后一位所以这里也直接截取product_id.name
@api.depends('product_id.name')
def _compute_demand_plan_number(self):
for line in self:
product_name = line.product_id.name or ''
plan_no = None
if line.product_id:
# 使用正则表达式匹配P-后面的所有字符
match = re.search(r'P-(.*)', product_name)
if match:
plan_no = match.group(1)
line.demand_plan_number = plan_no
else:
line.demand_plan_number = None

View File

@@ -0,0 +1,963 @@
# -*- coding: utf-8 -*-
import ast
import json
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.tools import float_compare
from datetime import datetime, timedelta
from odoo.exceptions import UserError
import re
#本地环境问题 不加报错
class ProductCategory(models.Model):
_inherit = 'product.category'
negative_inventory_allowed = fields.Boolean(string="允许负库存", default=False)
class StockPicking(models.Model):
_inherit = 'stock.picking'
whether_show_quality_check = fields.Boolean(string="是否显示质检")
class ProductTemplate(models.Model):
_inherit = 'product.template'
blank_type = fields.Selection([
('圆料', '圆料'),
('方料', '方料'),
], string='坯料分类')
blank_precision = fields.Selection([
('精坯', '精坯'),
('粗坯', '粗坯'),
], string='坯料类型')
class SfProductionDemandPlan(models.Model):
_name = 'sf.production.demand.plan'
_description = 'sf_production_demand_plan'
def get_location_id(self):
stock_location = self.env['stock.location'].sudo().search([('name', '=', '客户')], limit=1)
return stock_location.id
priority = fields.Selection(related='demand_plan_id.priority', string='优先级')
status = fields.Selection([
('10', '草稿'),
('20', '待确认'),
('30', '待工艺设计'),
('50', '待下达生产'),
('60', '已下达'),
('100', '取消'),
], string='状态', default='30', readonly=True)
demand_plan_id = fields.Many2one(comodel_name="sf.demand.plan",
string="物料需求", readonly=True)
sale_order_id = fields.Many2one(comodel_name="sale.order", string="销售订单", readonly=True)
sale_order_line_id = fields.Many2one(comodel_name="sale.order.line", string="销售订单明细", readonly=True)
sale_order_line_number = fields.Char(string='销售订单行', compute='_compute_sale_order_line_number', store=True)
company_id = fields.Many2one(
related='sale_order_id.company_id',
store=True, index=True, precompute=True)
customer_name = fields.Char('客户', related='sale_order_id.customer_name')
order_remark = fields.Text(related='sale_order_id.remark',
string="订单备注", store=True)
glb_url = fields.Char(related='sale_order_line_id.glb_url', string='glb文件地址')
product_id = fields.Many2one(
comodel_name='product.product',
related='sale_order_line_id.product_id',
string='产品', store=True, index=True)
model_id = fields.Char('模型ID', related='product_id.model_id')
part_name = fields.Char('零件名称', related='product_id.part_name')
part_number = fields.Char('零件图号', related='demand_plan_id.part_number')
is_incoming_material = fields.Boolean('客供料', related='sale_order_line_id.is_incoming_material', store=True)
new_supply_method = fields.Selection([
('custom_made', "自制"),
('purchase', "外购"),
('outsourcing', "委外加工"),
], string='供货方式', required=True)
custom_made_type = fields.Selection([
('automation', "自动化产线加工"),
('manual', "人工线下加工"),
], string='产线类型', compute='_compute_custom_made_type', store=True)
supply_method = fields.Selection([
('automation', "自动化产线加工"),
('manual', "人工线下加工"),
('purchase', "外购"),
('outsourcing', "委外加工"),
], string='供货方式', compute='_compute_supply_method', store=True, readonly=True)
product_uom_qty = fields.Float(
string="需求数量",
related='sale_order_line_id.product_uom_qty', store=True)
deadline_of_delivery = fields.Date('客户交期', related='sale_order_line_id.delivery_end_date', store=True)
inventory_quantity_auto_apply = fields.Float(
string="成品库存",
related='demand_plan_id.inventory_quantity_auto_apply'
)
qty_delivered = fields.Float(
"交货数量", related='sale_order_line_id.qty_delivered')
qty_to_deliver = fields.Float(
"待交货数量", compute='_compute_qty_to_deliver', store=True)
model_long = fields.Char('尺寸(mm)', compute='_compute_model_long')
blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类',
related='product_id.blank_type')
blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型',
related='product_id.blank_precision')
unit_number = fields.Float('单件用量', digits=(16, 3), related='product_id.unit_number')
embryo_long = fields.Char('坯料尺寸(mm)', related='demand_plan_id.embryo_long')
materials_id = fields.Char('材料', related='demand_plan_id.materials_id')
model_machining_precision = fields.Selection(related='product_id.model_machining_precision', string='精度')
model_process_parameters_ids = fields.Many2many(related='demand_plan_id.model_process_parameters_ids',
string='表面工艺', )
product_remark = fields.Char("产品备注", related='product_id.model_remark')
order_code = fields.Char('E-SHOP订单号', related='sale_order_id.order_code')
order_state = fields.Selection(
string='订单状态',
related='sale_order_line_id.state')
route_ids = fields.Many2many('stock.route', 'stock_route_demand_plan', 'demand_plan_id', 'route_id', '库存路线',
domain=[('demand_plan_selectable', '=', True)], compute='_compute_route_ids',
store=True)
contract_date = fields.Date('合同日期', related='sale_order_id.contract_date')
date_order = fields.Datetime('下单日期', related='sale_order_id.date_order')
contract_code = fields.Char('合同号', related='sale_order_id.contract_code', store=True)
plan_remark = fields.Text("计划备注")
material_check = fields.Selection([
('0', "未齐套"),
('1', "已齐套"),
], string='投料齐套检查', compute='_compute_material_check', store=True)
processing_time = fields.Char('程序工时', readonly=True)
planned_start_date = fields.Date('计划开工日期')
actual_start_date = fields.Datetime('实际开工日期', compute='_compute_actual_start_date', store=True)
actual_end_date = fields.Datetime('实际完工日期', compute='_compute_actual_end_date', store=True)
print_count = fields.Char('打印次数', default='T0C0', readonly=True)
sequence = fields.Integer('序号')
mrp_production_ids = fields.Many2many(
'mrp.production',
compute='_compute_mrp_production_ids',
string='与此相需求计划关联的制造订单',
store=True)
hide_release_production_order = fields.Boolean(
string='显示下发生产按钮',
compute='_compute_hide_release_production_order',
default=False
)
readonly_custom_made_type = fields.Boolean(
related='demand_plan_id.readonly_custom_made_type',
string='字段自制类型只读'
)
# hide_action_open_mrp_production = fields.Boolean(
# string='显示待工艺确认按钮',
# compute='_compute_hid_button',
# default=False
# )
#
# hide_action_purchase_orders = fields.Boolean(
# string='显示采购按钮',
# compute='_compute_hide_action_purchase_orders',
# default=False
# )
#
# hide_action_stock_picking = fields.Boolean(
# string='显示调拨单按钮',
# compute='_compute_hide_action_stock_picking',
# default=False
# )
#
# hide_action_outsourcing_stock_picking = fields.Boolean(
# string='委外显示调拨单按钮',
# compute='_compute_hide_action_stock_picking',
# default=False
# )
#
# hide_action_view_programming = fields.Boolean(
# string='显示编程单按钮',
# compute='_compute_hid_button',
# default=False
# )
#
# outsourcing_purchase_request = fields.Char('委外采购申请单')
plan_uom_qty = fields.Float(string="计划量", required=True)
procurement_reason = fields.Selection([
('销售订单', "销售订单"),
('需求预测', "需求预测"),
('生产报废', "生产报废"),
], string='补货原因', default='销售订单', readonly=True)
blank_arrival_date = fields.Date('采购计划到货(坯料)')
finished_product_arrival_date = fields.Date('采购计划到货(成品)')
bom_id = fields.Many2one('mrp.bom', string="BOM", readonly=True)
location_id = fields.Many2one('stock.location', string='需求位置', default=get_location_id, readonly=True)
manual_quotation = fields.Boolean('人工编程', related='product_id.manual_quotation', default=False)
@api.constrains('plan_uom_qty')
def _check_plan_uom_qty(self):
line_ids = self.filtered(lambda p: p.plan_uom_qty == 0 or p.plan_uom_qty < 0)
if line_ids:
raise ValidationError(_("计划量不能小于等于0"))
@api.constrains('supply_method')
def _check_supply_method(self):
product_name = []
product = []
for line in self:
if line.supply_method == 'purchase' and line.is_incoming_material:
product_name.append(line.product_id.display_name)
if line.supply_method == 'automation' and line.manual_quotation:
product.append(line.product_id.display_name)
if product_name:
unique_product_names = list(set(product_name))
raise UserError('当前(%s)产品为客供料,不能选择外购' % ','.join(unique_product_names))
if product:
unique_product = list(set(product))
raise UserError('当前(%s)产品为人工编程,不能选择自动化产线加工' % ','.join(unique_product))
@api.depends('new_supply_method')
def _compute_custom_made_type(self):
DemandPlan = self.env['sf.production.demand.plan'].sudo()
for line in self:
if line.new_supply_method != "custom_made":
line.custom_made_type = False
else:
demand_plan_id = line.demand_plan_id._origin.id
demand_plan = DemandPlan.search([
('demand_plan_id', '=', demand_plan_id),
('new_supply_method', '=', 'custom_made'),
('status', 'in', ('50', '60'))
], limit=1)
if demand_plan:
line.custom_made_type = demand_plan.custom_made_type
@api.depends('new_supply_method', 'custom_made_type')
def _compute_supply_method(self):
for line in self:
if line.new_supply_method == 'custom_made':
line.supply_method = line.custom_made_type
else:
line.supply_method = line.new_supply_method
@api.depends('sale_order_line_id.qty_to_deliver')
def _compute_qty_to_deliver(self):
for line in self:
if float_compare(line.sale_order_line_id.qty_to_deliver, 0,
precision_rounding=line.product_id.uom_id.rounding) == -1:
line.qty_to_deliver = 0
else:
line.qty_to_deliver = line.sale_order_line_id.qty_to_deliver
@api.depends('supply_method')
def _compute_route_ids(self):
for pdp in self:
if pdp.supply_method:
group_id = self.env['stock.route.group'].sudo().search([('code', '=', pdp.supply_method)])
route_ids = self.env['stock.route'].sudo().search(
[('demand_plan_selectable', '=', True), ('stock_route_group_ids', '=', group_id.id)])
if route_ids:
pdp.route_ids = route_ids.ids
continue
pdp.route_ids = None
@api.depends('sale_order_line_id.product_id.name')
def _compute_sale_order_line_number(self):
for line in self:
if line.product_id:
line.sale_order_line_number = line.sale_order_line_id.product_id.name[-1]
else:
line.sale_order_line_number = None
@api.depends('product_id.length', 'product_id.width', 'product_id.height')
def _compute_model_long(self):
for line in self:
if line.product_id:
line.model_long = f"{line.product_id.length}*{line.product_id.width}*{line.product_id.height}"
else:
line.model_long = None
@api.depends('mrp_production_ids.workorder_ids.date_start')
def _compute_actual_start_date(self):
for record in self:
if record.mrp_production_ids:
start_dates = [
workorder.date_start for mo in record.mrp_production_ids
for workorder in mo.workorder_ids if workorder.date_start
]
record.actual_start_date = min(start_dates) if start_dates else None
else:
record.actual_start_date = None
@api.depends('mrp_production_ids.workorder_ids.state',
'mrp_production_ids.workorder_ids.date_finished')
def _compute_actual_end_date(self):
for record in self:
if record.mrp_production_ids:
finished_orders = record.mrp_production_ids.filtered(lambda mo: mo.state == 'done')
sum_product_qty = sum(finished_orders.mapped('product_qty'))
if finished_orders and float_compare(sum_product_qty, record.plan_uom_qty,
precision_rounding=record.product_id.uom_id.rounding) >= 0:
end_dates = [
workorder.date_finished for mo in finished_orders
for workorder in mo.workorder_ids if workorder.date_finished
]
record.actual_end_date = max(end_dates) if end_dates else None
else:
record.actual_end_date = None
else:
record.actual_end_date = None
@api.depends('mrp_production_ids.move_raw_ids.reserved_availability')
def _compute_material_check(self):
for record in self:
if record.mrp_production_ids and record.mrp_production_ids.move_raw_ids:
# 获取完成的制造订单
done_manufacturing = record.mrp_production_ids.filtered(lambda mo: mo.state == 'done')
product_qty = sum(done_manufacturing.mapped('product_qty'))
# 需求数量-完成数量
product_uom_qty = record.plan_uom_qty - product_qty
total_reserved_availability = sum(
record.mrp_production_ids.mapped('move_raw_ids.reserved_availability'))
if float_compare(total_reserved_availability, product_uom_qty,
precision_rounding=record.product_id.uom_id.rounding) >= 0:
record.material_check = '1' # 已齐套
else:
record.material_check = '0' # 未齐套
else:
record.material_check = None
@api.depends('status')
def _compute_mrp_production_ids(self):
for record in self:
if record.status in ('50', '60'):
record.mrp_production_ids = self.env['mrp.production'].sudo().search(
[('demand_plan_line_id', '=', record.id)]).ids
else:
record.mrp_production_ids = None
@api.depends('mrp_production_ids.state')
def _compute_hide_release_production_order(self):
for record in self:
# 检查这条需求计划所有制造订单的排程单状态,有一个为待排程状态,就显示改按钮
record.hide_release_production_order = bool(record.mrp_production_ids.filtered(
lambda p: p.state == 'confirmed'
))
@api.constrains('planned_start_date')
def _check_planned_start_date(self):
for record in self:
if record.planned_start_date and record.planned_start_date < fields.Date.today():
raise ValidationError("计划开工日期必须大于或等于今天。")
def button_release_production(self):
self.ensure_one()
if not self.planned_start_date:
raise ValidationError("请先填写计划开工日期")
pro_plan_list = self.env['sf.production.plan'].sudo().search(
[('production_id', 'in', self.mrp_production_ids.ids), ('state', '=', 'draft')])
sf_production_line = self.env['sf.production.line'].sudo().search(
[('name', '=', '1#CNC自动生产线')], limit=1)
if sf_production_line:
now = datetime.now()
time_part = (now + timedelta(hours=2)).time()
date_part = fields.Date.from_string(self.planned_start_date)
date_planned_start = datetime.combine(date_part, time_part)
pro_plan_list.production_line_id = sf_production_line.id
pro_plan_list.date_planned_start = date_planned_start
self._do_production_schedule(pro_plan_list)
self.status = '60'
self.update_sale_order_state()
def _do_production_schedule(self, pro_plan_list):
for pro_plan in pro_plan_list:
pro_plan.do_production_schedule()
def update_sale_order_state(self):
# demand_plan = self.env['sf.demand.plan'].sudo().search([('sale_order_id', '=', self.sale_order_id.id)])
# demand_plan_state = demand_plan.filtered(lambda line: line.state != '40')
production_demand_plan = self.env['sf.production.demand.plan'].sudo().search(
[('sale_order_id', '=', self.sale_order_id.id)])
production_demand_plan_state = production_demand_plan.filtered(lambda line: line.status in ('10', '20', '30'))
if not production_demand_plan_state:
# 修改销售订单为加工中
self.sale_order_id.state = 'processing'
def edit_button(self):
self.ensure_one()
action = {
'name': _("需求计划"),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'views': [[self.env.ref('sf_demand_plan.view_sf_demand_plan_form').id, 'form']],
'res_model': 'sf.demand.plan',
'res_id': self.demand_plan_id.id,
}
if self.demand_plan_id.state == '40':
action.update({'flags': {'mode': 'readonly'}})
return action
def button_action_print(self):
model_id = self.mapped('model_id')
return {
'res_model': 'sf.demand.plan.print.wizard',
'type': 'ir.actions.act_window',
'name': _("打印"),
'domain': [('model_id', 'in', model_id)],
'views': [[self.env.ref('sf_demand_plan.action_plan_print_tree').id, 'list']],
'target': 'new',
}
# @api.depends('sale_order_id.mrp_production_ids.state', 'sale_order_id.mrp_production_ids.programming_state')
# def _compute_hid_button(self):
# for record in self:
# mrp_production_ids = record.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.state == 'technology_to_confirmed' and p.product_id.id == record.product_id.id
# )
# record.hide_action_open_mrp_production = bool(mrp_production_ids) and record.supply_method in (
# 'automation', 'manual')
# programming_mrp_production_ids = record.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.programming_state == '编程中' and p.product_id.id == record.product_id.id
# )
# record.hide_action_view_programming = bool(programming_mrp_production_ids)
#
# def _compute_hide_action_purchase_orders(self):
# for record in self:
# record.hide_action_purchase_orders = False
# outsourcing_purchase_request = []
# if record.supply_method in ('automation',
# 'manual') and record.material_check == '0' and not record.sale_order_line_id.is_incoming_material:
# mrp_production = record.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.product_id.id == record.product_id.id
# ).sorted(key=lambda p: p.id)
# if mrp_production:
# raw_materials = mrp_production.mapped('move_raw_ids.product_id')
# if raw_materials:
# purchase_orders = self.env['purchase.order'].sudo().search([
# ('state', '=', 'purchase'),
# ('order_line.product_id', 'in', raw_materials.ids)
# ])
# total_purchase_quantity = sum(
# sum(
# order.order_line.filtered(
# lambda line: line.product_id in raw_materials
# ).mapped('product_qty')
# )
# for order in purchase_orders
# )
# if float_compare(total_purchase_quantity, record.product_uom_qty,
# precision_rounding=record.product_id.uom_id.rounding) == -1:
# pr_ids = self.env['purchase.request'].sudo().search(
# [('line_ids.product_id', 'in', raw_materials.ids), ('state', '!=', 'done')])
# outsourcing_purchase_request.extend(pr_ids.ids)
# elif record.supply_method in ('purchase', 'outsourcing'):
# purchase_orders = self.env['purchase.order'].sudo().search([
# ('state', 'in', ('purchase', 'done')),
# ('order_line.product_id', '=', record.product_id.id)
# ])
# total_purchase_quantity = sum(
# sum(
# order.order_line.filtered(
# lambda line: line.product_id in record.product_id
# ).mapped('product_qty')
# )
# for order in purchase_orders
# )
#
# if float_compare(total_purchase_quantity, record.product_uom_qty,
# precision_rounding=record.product_id.uom_id.rounding) == -1:
# pr_ids = self.env['purchase.request'].sudo().search(
# [('origin', 'like', record.sale_order_id.name), ('state', '!=', 'done')])
# outsourcing_purchase_request.extend(pr_ids.ids)
# if record.supply_method == 'outsourcing' and not record.sale_order_line_id.is_incoming_material:
# bom_line_ids = record.product_id.bom_ids.bom_line_ids
# if bom_line_ids:
# # BOM_数量
# total_product_qty = sum(line.product_qty for line in bom_line_ids)
# bom_product_ids = bom_line_ids.mapped('product_id')
# product_purchase_orders = self.env['purchase.order'].sudo().search([
# ('state', 'in', ('purchase', 'done')),
# ('order_line.product_id', 'in', bom_product_ids.ids)
# ])
# # 购订单_数量
# total_outsourcing_purchase_quantity = sum(
# sum(
# order.order_line.filtered(
# lambda line: line.product_id in bom_product_ids
# ).mapped('product_qty')
# )
# for order in product_purchase_orders
# )
# quantity = total_outsourcing_purchase_quantity / total_product_qty
# if float_compare(quantity, record.product_uom_qty,
# precision_rounding=record.product_id.uom_id.rounding) == -1:
# purchase_request = self.env['purchase.request'].sudo().search(
# [('line_ids.product_id', 'in', bom_product_ids.ids),
# ('line_ids.purchase_state', 'not in', ('purchase', 'done')), ('state', '!=', 'done')])
# outsourcing_purchase_request.extend(purchase_request.ids)
# record.outsourcing_purchase_request = json.dumps(outsourcing_purchase_request)
# if outsourcing_purchase_request:
# record.hide_action_purchase_orders = True
#
# @api.depends('sale_order_id.mrp_production_ids.picking_ids.state', 'sale_order_id.picking_ids.state')
# def _compute_hide_action_stock_picking(self):
# for record in self:
# record.hide_action_stock_picking = False
# record.hide_action_outsourcing_stock_picking = False
# if record.supply_method in ('automation', 'manual'):
# manufacturing_orders = record.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.product_id.id == record.product_id.id
# )
# record.hide_action_stock_picking = bool(manufacturing_orders.mapped('picking_ids').filtered(
# lambda p: p.state == 'assigned'))
# elif record.supply_method in ('purchase', 'outsourcing'):
# assigned_picking_ids = record.sale_order_id.picking_ids.filtered(
# lambda
# p: p.state == 'assigned' and p.picking_type_id.name != '发料出库' and p.move_line_ids.product_id in record.product_id)
# if record.supply_method == 'outsourcing':
# outsourcing_assigned_picking_ids = record.get_outsourcing_picking_ids()
# record.hide_action_outsourcing_stock_picking = outsourcing_assigned_picking_ids
# record.hide_action_stock_picking = assigned_picking_ids or outsourcing_assigned_picking_ids
# else:
# record.hide_action_stock_picking = assigned_picking_ids
#
# def get_outsourcing_picking_ids(self):
# order_ids = self.env['purchase.order'].sudo().search(
# [('order_line.product_id', 'in', self.product_id.ids),
# ('purchase_type', '=', 'outsourcing')])
# outsourcing_picking_ids = order_ids._get_subcontracting_resupplies()
# outsourcing_assigned_picking_ids = outsourcing_picking_ids.filtered(lambda p: p.state == 'assigned')
# return outsourcing_assigned_picking_ids
# def action_open_sale_order(self):
# self.ensure_one()
# return {
# 'type': 'ir.actions.act_window',
# 'res_model': 'sale.order',
# 'res_id': self.sale_order_id.id,
# 'view_mode': 'form',
# }
# def action_open_mrp_production(self):
# self.ensure_one()
# mrp_production_ids = self.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.state == 'technology_to_confirmed' and p.product_id.id == self.product_id.id
# )
# action = {
# 'res_model': 'mrp.production',
# 'type': 'ir.actions.act_window',
# }
# if len(mrp_production_ids) == 1:
# action.update({
# 'view_mode': 'form',
# 'res_id': mrp_production_ids.id,
# })
# else:
# action.update({
# 'name': _("制造订单列表"),
# 'domain': [('id', 'in', mrp_production_ids.ids)],
# 'view_mode': 'tree,form',
# })
# return action
# def action_view_purchase_request(self):
# self.ensure_one()
# pr_ids = self.env['purchase.request'].sudo().search(
# [('id', 'in', ast.literal_eval(self.outsourcing_purchase_request))])
# action = {
# 'res_model': 'purchase.request',
# 'type': 'ir.actions.act_window',
# }
# if len(pr_ids) == 1:
# action.update({
# 'view_mode': 'form',
# 'res_id': pr_ids[0].id,
# })
# else:
# action.update({
# 'name': _("采购申请"),
# 'domain': [('id', 'in', pr_ids.ids)],
# 'view_mode': 'tree,form',
# })
# return action
# def action_view_stock_picking(self):
# self.ensure_one()
# action = self.env["ir.actions.actions"]._for_xml_id("stock.action_picking_tree_all")
# picking_ids = None
# if self.supply_method in ('automation', 'manual'):
# mrp_production_ids = self.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.product_id.id == self.product_id.id
# )
# picking_ids = mrp_production_ids.mapped('picking_ids').filtered(
# lambda p: p.state == 'assigned')
# elif self.supply_method in ('purchase', 'outsourcing'):
# picking_ids = self.sale_order_id.picking_ids.filtered(
# lambda
# p: p.state == 'assigned' and p.picking_type_id.name != '发料出库' and p.move_line_ids.product_id in self.product_id)
# if self.supply_method == 'outsourcing' and self.hide_action_outsourcing_stock_picking:
# picking_ids = picking_ids.union(self.get_outsourcing_picking_ids())
# if picking_ids:
# if len(picking_ids) > 1:
# action['domain'] = [('id', 'in', picking_ids.ids)]
# elif picking_ids:
# action['res_id'] = picking_ids.id
# action['views'] = [(self.env.ref('stock.view_picking_form').id, 'form')]
# if 'views' in action:
# action['views'] += [(state, view) for state, view in action['views'] if view != 'form']
# return action
# def action_view_programming(self):
# self.ensure_one()
# programming_mrp_production_ids = self.sale_order_id.mrp_production_ids.filtered(
# lambda p: p.programming_state == '编程中' and p.product_id.id == self.product_id.id
# ).mapped('programming_no')
# if programming_mrp_production_ids:
# programming_no = list(set(programming_mrp_production_ids))
# numbers_str = "、".join(programming_no)
# raise ValidationError(f"编程单号:{numbers_str},请去云平台处理")
@api.model
def unlink(self):
for item in self:
if item.status not in ('10', '20', '30'):
raise ValidationError(u'只能删除状态为【草稿,待确认,待工艺设计】的需求计划。')
else:
super(SfProductionDemandPlan, item).unlink()
def button_batch_release_plan(self):
filtered_plan = self.filtered(lambda mo: mo.status == '30')
if not filtered_plan:
raise UserError(_("没有需要下达的计划!"))
check_overdelivery_allowed = False
if not self.demand_plan_id.overdelivery_allowed:
customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
if self.location_id.id == customer_location_id:
check_overdelivery_allowed = True
# 按产品分组并计算总数
product_data = {}
for plan in filtered_plan:
check_overdelivery_allowed = False
if not plan.demand_plan_id.overdelivery_allowed:
customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
if plan.location_id.id == customer_location_id:
check_overdelivery_allowed = True
if plan.product_id not in product_data:
# 初始化产品数据,从产品上获取需求量
product_data[plan.product_id] = {
'plan_uom_qty': 0.0,
'product_uom_qty': plan.product_uom_qty
}
# 累加计划数量
product_data[plan.product_id]['plan_uom_qty'] += plan.plan_uom_qty
product_data[plan.product_id]['overdelivery_allowed'] = check_overdelivery_allowed
# 检查需求超过计划数量的产品
warning_messages = []
error_messages = []
for product, data in product_data.items():
if data['overdelivery_allowed'] and float_compare(data['plan_uom_qty'], data['product_uom_qty'],precision_rounding=product.uom_id.rounding) == 1:
error_messages.append(f"您正在下达的产品 {product.display_name},已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
elif float_compare(data['plan_uom_qty'], data['product_uom_qty'],
precision_rounding=product.uom_id.rounding) == 1:
warning_messages.append(
_("您正在下达的产品 %s,计划量%s,需求数量为%s,已超过需求数量") %
(product.display_name, data['plan_uom_qty'], data['product_uom_qty'])
)
if error_messages:
error_message = "\n".join(error_messages)
raise ValidationError(error_message)
elif warning_messages:
warning_message = "\n".join(warning_messages)
return {
'name': _('需求计划'),
'type': 'ir.actions.act_window',
'views': [(self.env.ref(
'sf_demand_plan.sf_release_plan_wizard_form').id,
'form')],
'res_model': 'sf.release.plan.wizard',
'target': 'new',
'context': {
'default_demand_plan_line_id': self.ids,
'default_release_message': warning_message,
}}
def button_release_plan(self):
self.ensure_one()
check_overdelivery_allowed = False
if not self.demand_plan_id.overdelivery_allowed:
customer_location_id = self.env['ir.model.data']._xmlid_to_res_id('stock.stock_location_customers')
if self.location_id.id == customer_location_id:
check_overdelivery_allowed = True
if check_overdelivery_allowed:
if float_compare(self.plan_uom_qty, self.product_uom_qty,
precision_rounding=self.product_id.uom_id.rounding) == 1:
raise ValidationError(f"已禁止向合作伙伴/客户超量发货,请更换“补货原因”或将“可超量发货”设置为“是”。")
elif float_compare(self.plan_uom_qty, self.product_uom_qty,
precision_rounding=self.product_id.uom_id.rounding) == 1:
return {
'name': _('需求计划'),
'type': 'ir.actions.act_window',
'views': [(self.env.ref(
'sf_demand_plan.sf_release_plan_wizard_form').id,
'form')],
'res_model': 'sf.release.plan.wizard',
'target': 'new',
'context': {
'default_demand_plan_line_id': self.ids,
'default_release_message': f"您正在下达计划量 {self.plan_uom_qty},需求数量为 {self.product_uom_qty},已超过需求数量,是否继续?",
}}
self.action_confirm()
def action_confirm(self):
"""
确认需求计划行,创建 BOM、触发库存规则并更新状态。
"""
# 将当前需求计划行 ID 写入上下文,便于后续方法使用
self = self.with_context(demand_plan_line_id=self.id)
# 创建物料清单BOM根据供货方式进行不同的处理
self.mrp_bom_create()
# 启动库存规则(创建采购、生产等)
self._action_launch_stock_rule()
# 根据供货方式设置状态字段
if self.supply_method in ('automation', 'manual'):
self.write({'status': '50'}) # 自动/手工 供货:待排产
self.update_sale_order_state()
else:
self.write({'status': '60'}) # 外购/外协/客户自供:无需排产
self.update_sale_order_state()
def _get_embryo_template_by_supply_method(self):
"""
根据供货方式返回对应的胚料模板 product.template 记录。
"""
supply_map = {
'automation': self.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo(),
'outsourcing': self.env.ref('sf_dlm.product_embryo_sf_outsource').sudo(),
'purchase': self.env.ref('sf_dlm.product_embryo_sf_purchase').sudo(),
'manual': self.env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').sudo(),
'material_customer_provided': self.env.ref('jikimo_sale_multiple_supply_methods.product_template_embryo_customer_provided').sudo(),
}
template = supply_map.get(self.supply_method)
if not template:
raise UserError(f"未配置供货方式 {self.supply_method} 对应的胚料模板")
return template
def mrp_bom_create(self):
"""
创建 BOM包含胚料与成品 BOM用于后续生产或采购流程。
"""
# 如果同一计划中已有对应的 BOM 可复用,则直接使用
if self.supply_method in ('automation', 'manual'):
line_ids = self.demand_plan_id.line_ids.filtered(
lambda p: p.supply_method in ('automation', 'manual') and p.status in ('50', '60'))
if line_ids:
self.bom_id = line_ids[0].bom_id.id
return
elif self.supply_method == 'outsourcing':
line_ids = self.demand_plan_id.line_ids.filtered(
lambda p: p.supply_method == 'outsourcing' and p.status == '60')
if line_ids:
self.bom_id = line_ids[0].bom_id.id
return
# 根据供货方式选择模板和 BOM 类型
bom_type = ''
if self.supply_method == 'automation':
bom_type = 'normal'
product_template_id = self.env.ref('sf_dlm.product_template_sf').sudo().product_tmpl_id
elif self.supply_method == 'outsourcing':
bom_type = 'subcontract'
product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_outsourcing').sudo()
elif self.supply_method == 'purchase':
product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_purchase').sudo()
elif self.supply_method == 'manual':
bom_type = 'normal'
product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').sudo()
# 使用模板复制内容到当前产品
self.product_id.product_tmpl_id.copy_template(product_template_id)
# 构造 BOM 编码(包含时间戳)
future_time = datetime.now() + timedelta(hours=8)
code = f"{self.product_id.default_code}-{bom_type}-{future_time.strftime('%Y%m%d%H%M%S')}"
order_id = self.sale_order_id
product = self.product_id
# 构造胚料产品的参数
item = {
'texture_code': product.materials_id.materials_no,
'texture_type_code': product.materials_type_id.materials_no,
'model_long': product.length,
'model_width': product.width,
'model_height': product.height,
'blank_volume': product.model_volume,
'blank_area': product.model_area,
'price': product.list_price,
'embryo_redundancy_id': self.sale_order_line_id.embryo_redundancy_id,
'model_id': self.model_id
}
# 从产品名中提取编号(如 S12345-3
product_name = ''
match = re.search(r'(S\d{5}-\d+)', product.name)
product_seria = 0
if match:
product_name = match.group(0)
product_seria = int(product_name.split('-')[-1])
# 如果供货方式不是采购,则需要先创建胚料产品
if self.supply_method != 'purchase':
# 判断是否为客户自供
if self.sale_order_line_id.embryo_redundancy_id:
embryo_template = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_embryo_customer_provided').sudo()
embryo_key = 'material_customer_provided'
else:
embryo_template = self._get_embryo_template_by_supply_method()
embryo_key = self.supply_method
# 获取批次追踪方式 依据模版
tracking_method = embryo_template.tracking
# 创建胚料产品(无 BOM 产品)
embryo_product = self.env['product.template'].sudo().no_bom_product_create(
embryo_template.with_context(active_test=False).product_variant_id,
item,
order_id,
embryo_key,
product_seria,
product
)
if isinstance(embryo_product, models.Model): # 确保返回的是记录而非错误码
embryo_product.write({'tracking': tracking_method})
if embryo_product == -3:
raise UserError('该订单模型的材料型号暂未设置获取方式和供应商,请先配置再进行分配')
# 设置胚料 BOM 类型
if embryo_key in ('automation', 'manual', 'material_customer_provided'):
embryo_bom_type = 'normal'
elif embryo_key == 'outsourcing':
embryo_bom_type = 'subcontract'
elif embryo_key == 'purchase':
embryo_bom_type = 'purchase'
else:
embryo_bom_type = 'normal'
# 创建胚料 BOM 及 BOM 行
embryo_bom = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).bom_create(
embryo_product, embryo_bom_type, True, tracking=tracking_method)
embryo_bom_line = embryo_bom.with_user(self.env.ref("base.user_admin")).bom_create_line(embryo_product)
if not embryo_bom_line:
raise UserError('该订单模型的材料型号暂未有原材料,请先配置再进行分配')
# 创建成品 BOM包含胚料
product_bom = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).bom_create(
product, bom_type, 'product', code, tracking=tracking_method)
product_bom.with_user(self.env.ref("base.user_admin")).bom_create_line_has(embryo_product)
# 赋值 BOM ID
self.bom_id = product_bom.id
def _action_launch_stock_rule(self):
"""
触发库存规则(如采购、生产),并确认相关拣货单。
"""
procurements = []
group_id = self.sale_order_id.procurement_group_id
if not group_id:
# 没有分组则创建
group_id = self.env['procurement.group'].create(self._prepare_procurement_group_vals())
self.sale_order_id.procurement_group_id = group_id
else:
# 若已有分组但字段有变动则更新
updated_vals = {}
if group_id.partner_id != self.sale_order_id.partner_shipping_id:
updated_vals.update({'partner_id': self.sale_order_id.partner_shipping_id.id})
if group_id.move_type != self.sale_order_id.picking_policy:
updated_vals.update({'move_type': self.sale_order_id.picking_policy})
if updated_vals:
group_id.write(updated_vals)
# 构造 procurement 所需的字段
values = self._prepare_procurement_values(group_id=group_id)
# 单位换算
line_uom = self.sale_order_line_id.product_uom
quant_uom = self.product_id.uom_id
plan_uom_qty, procurement_uom = line_uom._adjust_uom_quantities(self.plan_uom_qty, quant_uom)
# 创建 procurement 请求
procurements.append(self.env['procurement.group'].Procurement(
self.product_id, plan_uom_qty, procurement_uom,
self.sale_order_id.partner_shipping_id.property_stock_customer,
self.product_id.display_name, self.sale_order_id.name, self.sale_order_id.company_id, values))
# 执行调度
if procurements:
procurement_group = self.env['procurement.group']
if self.env.context.get('import_file'):
procurement_group = procurement_group.with_context(import_file=False)
procurement_group.run(procurements)
# 确认相关的拣货单
orders = self.mapped('sale_order_id')
for order in orders:
pickings_to_confirm = order.picking_ids.filtered(lambda p: p.state not in ['cancel', 'done'])
if pickings_to_confirm:
pickings_to_confirm.action_confirm()
return True
def _prepare_procurement_group_vals(self):
"""
构造创建 procurement group 所需的字段。
"""
return {
'name': self.sale_order_id.name,
'move_type': self.sale_order_id.picking_policy,
'sale_id': self.sale_order_id.id,
'partner_id': self.sale_order_id.partner_shipping_id.id,
}
def _prepare_procurement_values(self, group_id=False):
"""
构造单个 procurement 请求所需的字段字典。
"""
self.ensure_one()
# 交货日期与计划日期
date_deadline = self.sale_order_id.commitment_date or (
self.sale_order_id.date_order + timedelta(days=self.sale_order_line_id.customer_lead or 0.0))
date_planned = date_deadline - timedelta(days=self.sale_order_id.company_id.security_lead)
values = {
'group_id': group_id,
'sale_line_id': self.sale_order_line_id.id,
'date_planned': date_planned,
'date_deadline': date_deadline,
'route_ids': self.route_ids,
'warehouse_id': self.sale_order_id.warehouse_id or False,
'partner_id': self.sale_order_id.partner_shipping_id.id,
'product_description_variants': self.sale_order_line_id.with_context(
lang=self.sale_order_id.partner_id.lang)._get_sale_order_line_multiline_description_variants(),
'company_id': self.sale_order_id.company_id,
'product_packaging_id': self.sale_order_line_id.product_packaging_id,
'sequence': self.sale_order_line_id.sequence,
'demand_plan_line_id': self.id
}
return values

View File

@@ -0,0 +1,49 @@
from odoo import models, fields, api, _
class SfStockRoute(models.Model):
_inherit = 'stock.route'
demand_plan_selectable = fields.Boolean("需求计划行")
stock_route_group_ids = fields.Many2many('stock.route.group', 'route_to_group', string='路线组')
demand_plan_ids = fields.Many2many('sf.production.demand.plan', 'stock_route_demand_plan', 'route_id',
'demand_plan_id', '需求计划', copy=False, compute='_compute_demand_plan_ids',
store=True)
@api.depends('demand_plan_selectable', 'stock_route_group_ids')
def _compute_demand_plan_ids(self):
for sr in self:
if sr.demand_plan_selectable:
stock_route_group = [srg.code for srg in sr.stock_route_group_ids]
demand_plan_ids = self.env['sf.production.demand.plan'].sudo().search(
[('supply_method', 'in', stock_route_group)])
if demand_plan_ids:
sr.demand_plan_ids = demand_plan_ids.ids
continue
sr.demand_plan_ids = None
# def name_get(self):
# res = super().name_get()
# if self.env.context.get('demand_plan_search_stock_route_id'):
# demand_plan_id = self.env['sf.production.demand.plan'].sudo().browse(
# int(self.env.context.get('demand_plan_search_stock_route_id')))
# if demand_plan_id and demand_plan_id.supply_method:
# supply_method = self._set_supply_method(demand_plan_id.supply_method)
# res = [(item[0], f'{item[1]}-{supply_method}') for item in res if len(item) == 2]
# return res
#
# def _set_supply_method(self, supply_method):
# return {
# 'automation': "自动化产线加工",
# 'manual': "人工线下加工",
# 'purchase': "外购",
# 'outsourcing': "委外加工"
# }.get(supply_method)
class SfStockRouteGroup(models.Model):
_name = 'stock.route.group'
_description = '路线组'
name = fields.Char('名称')
code = fields.Char('编码')

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class StockRule(models.Model):
_inherit = 'stock.rule'
def _prepare_mo_vals(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values,
bom):
res = super()._prepare_mo_vals(product_id, product_qty, product_uom, location_id, name, origin, company_id,
values, bom)
if self.env.context.get('demand_plan_line_id'):
res['demand_plan_line_id'] = self.env.context.get('demand_plan_line_id')
return res
@api.model
def _prepare_purchase_request_line(self, request_id, procurement):
res = super()._prepare_purchase_request_line(request_id, procurement)
if self.env.context.get('demand_plan_line_id'):
res['demand_plan_line_id'] = self.env.context.get('demand_plan_line_id')
return res

View File

@@ -0,0 +1,16 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sf_production_demand_plan,sf.production.demand.plan,model_sf_production_demand_plan,base.group_user,1,0,0,0
access_sf_production_demand_plan_for_dispatch,sf.production.demand.plan for dispatch,model_sf_production_demand_plan,sf_base.group_plan_dispatch,1,1,1,1
access_sf_demand_plan_print_wizard,sf.demand.plan.print.wizard,model_sf_demand_plan_print_wizard,base.group_user,1,0,0,0
access_sf_demand_plan_print_wizard_for_dispatch,sf.demand.plan.print.wizard for dispatch,model_sf_demand_plan_print_wizard,sf_base.group_plan_dispatch,1,1,0,0
access_sf_demand_plan,sf.demand.plan,model_sf_demand_plan,base.group_user,1,0,0,0
access_sf_demand_plan_for_dispatch,sf.demand.plan for dispatch,model_sf_demand_plan,sf_base.group_plan_dispatch,1,1,0,0
access_stock_route_group,stock.route.group,model_stock_route_group,base.group_user,1,0,0,0
access_stock_route_group_dispatch,stock.route.group.dispatch,model_stock_route_group,sf_base.group_plan_dispatch,1,1,0,0
access_sf_release_plan_wizard,sf.release.plan.wizard,model_sf_release_plan_wizard,base.group_user,1,0,0,0
access_sf_release_plan_wizard_for_dispatch,sf.release.plan.wizard for dispatch,model_sf_release_plan_wizard,sf_base.group_plan_dispatch,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sf_production_demand_plan sf.production.demand.plan model_sf_production_demand_plan base.group_user 1 0 0 0
3 access_sf_production_demand_plan_for_dispatch sf.production.demand.plan for dispatch model_sf_production_demand_plan sf_base.group_plan_dispatch 1 1 1 1
4 access_sf_demand_plan_print_wizard sf.demand.plan.print.wizard model_sf_demand_plan_print_wizard base.group_user 1 0 0 0
5 access_sf_demand_plan_print_wizard_for_dispatch sf.demand.plan.print.wizard for dispatch model_sf_demand_plan_print_wizard sf_base.group_plan_dispatch 1 1 0 0
6 access_sf_demand_plan sf.demand.plan model_sf_demand_plan base.group_user 1 0 0 0
7 access_sf_demand_plan_for_dispatch sf.demand.plan for dispatch model_sf_demand_plan sf_base.group_plan_dispatch 1 1 0 0
8 access_stock_route_group stock.route.group model_stock_route_group base.group_user 1 0 0 0
9 access_stock_route_group_dispatch stock.route.group.dispatch model_stock_route_group sf_base.group_plan_dispatch 1 1 0 0
10 access_sf_release_plan_wizard sf.release.plan.wizard model_sf_release_plan_wizard base.group_user 1 0 0 0
11 access_sf_release_plan_wizard_for_dispatch sf.release.plan.wizard for dispatch model_sf_release_plan_wizard sf_base.group_plan_dispatch 1 1 1 1

View File

@@ -0,0 +1,59 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { ListRenderer } from "@web/views/list/list_renderer";
import { useService } from "@web/core/utils/hooks";
import { useEffect } from "@odoo/owl";
export class CustomDemandPlanListRenderer extends ListRenderer {
setup() {
super.setup();
this.orm = useService("orm");
this.notification = useService("notification");
console.log('setup', this.props);
// 监听selection属性的变化
useEffect(() => {
this.updateButtonState();
}, () => [this.props.list.selection]);
}
/**
* 更新按钮状态
*/
async updateButtonState() {
const selectedRecords = this.props.list.selection;
const isStatus30 = selectedRecords.some(record => record.data.status != "30");
const button = $(this.__owl__.parent.bdom.parentEl).find('button[name="button_batch_release_plan"]');
console.log('isStatus30', isStatus30, button);
if (isStatus30) {
// 禁用按钮
button.attr('disabled', true);
} else {
button.attr('disabled', false);
}
}
}
// 使用setTimeout延迟注册避免在模块加载时立即执行
setTimeout(() => {
const registerCustomRenderer = () => {
try {
const listView = registry.category("views").get("list");
if (listView) {
registry.category("views").add("custom_demand_plan_list", {
...listView,
Renderer: CustomDemandPlanListRenderer,
});
console.log("Custom demand plan list renderer registered successfully");
} else {
console.warn("List view not found, retrying...");
// 如果还没找到,再等一段时间
setTimeout(registerCustomRenderer, 1000);
}
} catch (error) {
console.error("Error registering custom renderer:", error);
}
};
registerCustomRenderer();
}, 1000);

View File

@@ -0,0 +1,256 @@
odoo.define('sf_demand.print_demand', function (require) {
"use strict";
var ListController = require('web.ListController');
var ListRenderer = require('web.ListRenderer');
var ListView = require('web.ListView');
var viewRegistry = require('web.view_registry');
var { url } = require("@web/core/utils/urls")
var CustomListRenderer = ListRenderer.extend({
_render: function () {
var self = this;
this.getParent()?.$buttons.hide();
return this._super.apply(this, arguments).then(function () {
if(!self.state.data || !self.state.data.length) return
// 添加图片预览容器到页面左侧
if (!$('.table-image-preview-container').length) {
self.$el.parent().addClass('custom-table-image-container')
self.$el.before(
`<div class="custom-preview-container">
<img class="table-image-preview-container" src="" />
<iframe class="table-image-preview-container" src=""/>
</div>`
);
}
if(!$('.denmand_set').length) {
const checked = self.getParent().radioCheck || 'all'
self.$el.prepend(`
<form class="denmand_set">
<span>更多设置:</span>
<input type="radio" id="male" name="set" value="图纸">
<label for="male">图纸</label>
<input type="radio" id="female" name="set" value="程序单">
<label for="female">程序单</label>
<input type="radio" id="other" name="set" value="all" >
<label for="other">图纸/程序单</label>
</form>
`)
setTimeout(() => {
$(`input[name=set][value=${checked}]`).prop('checked', true)
$('.denmand_set').trigger('click')
}, 100);
self.$el.prepend(`
<div class="print-button-container" style="margin-bottom:10px;">
<button class="btn btn-primary o_print_custom">
<i class="fa fa-print"></i> 打印
</button>
<button class="btn btn-secondary o_cancel_custom">
取消
</button>
</div>
`);
}
});
},
start: function() {
setTimeout(() => {
this.$el.find('.o_data_row').eq(0).trigger('click')
this.getParent().$el?.find('.o_cp_top_right,.o_cp_bottom').hide()
}, 500);
return this._super();
},
events: _.extend({}, ListRenderer.prototype.events, {
'click .o_data_row': '_onCustomRowClick',
'click .o_print_custom': '_onPrintClick',
'click .o_cancel_custom': '_onCancelClick',
'click .denmand_set': '_onDenmandChange',
}),
_onCancelClick() {
this.getParent()?.getParent()?.dialogs.closeAll()
},
_onCustomRowClick: async function (ev) {
var self = this;
var $row = $(ev.currentTarget);
var index = $row.index();
var data = this.state.data[index];
if(data.fileData?.fileUrl) {
} else {
data.fileData = { }
if(data.res_id) {
// 正确获取 ORM 服务的方式
// var orm = this.getParent().getParent().env.services
const key = data.data.type == 1 ? 'machining_drawings' : 'cnc_worksheet'
const attachment = await this._rpc({
model: 'ir.binary',
method: 'attachment_info',
args: [
data.model,
data.res_id,
key
],
})
if (attachment) {
Object.assign(data.fileData, attachment)
this._getTypeInfo(attachment.mimetype, data.fileData)
}
const fileUrl = this.getFileUrl(data.fileData.attachment_type, data, key)
data.fileData.fileUrl = fileUrl
}
}
$('.table-image-preview-container').hide()
if(data.fileData.attachment_type == 'iframe') {
$('iframe.table-image-preview-container').attr('src', decodeURIComponent(data.fileData.fileUrl) ).show()
} else {
$('img.table-image-preview-container').attr('src', data.fileData.fileUrl).show()
}
},
getSelectedIds: function() {
return this.state.data.filter(_ => !_.hide).map(_ => {
return _.data.id
})
},
_onPrintClick(e) {
var print_ids = this.getSelectedIds();
this._rpc({
model: 'sf.demand.plan.print.wizard',
method: 'demand_plan_print',
args: [ print_ids ] ,
// context: this.state.getContext()
}).then((e) => {
this.getParent()?.getParent()?.env.services?.notification.notify( {
type: 'info',
message: e.message,
})
// self.do_notify("成功", "打印任务已发送到打印机");
}).catch(function(error) {
console.error("打印错误:", error);
// self.do_warn("打印失败", error.data.message || "未知错误");
}).finally(e => {
this.getParent().reload()
})
},
_onDenmandChange(e) {
const isChecked = $(e.currentTarget).find('input:checked').val()
this.getParent().radioCheck = isChecked
this.$el.find('tbody').find('.o_data_row').show()
this.state.data.forEach(_ => {
_.hide = false
})
const self = this
if(!isChecked || isChecked == 'all') return
this.$el.find('tbody').children('.o_data_row').each(function() {
if($(this).find('td[name=type]').text() != isChecked) {
const i = $(this).index()
self.state.data[i].hide = true
$(this).hide()
}
})
},
getFileUrl(attachment_type, data, key) {
let fileUrl
switch (attachment_type) {
case 'image':
const timer = +new Date()
fileUrl = url("/web/image", {
model: data.model,
id: data.res_id,
field: key,
unique: '',
timer
});
break;
case 'iframe':
const iframe_file_url = encodeURIComponent(
url("/web/content", {
model: data.model,
id: data.res_id,
field: key,
})
);
fileUrl = `${this.state.attachment_base}?file=${iframe_file_url}`;
case 'unknown':
fileUrl = encodeURIComponent(
url("/web/content", {
model: data.model,
id: data.res_id,
field: key,
})
);
}
return fileUrl
},
_getTypeInfo(type, data) {
switch (type) {
case 'application/pdf':
data.attachment_base = `/web/static/lib/pdfjs/web/viewer.html`;
data.attachment_type = 'iframe'
break;
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
data.attachment_base = `/jikimo_attachment_viewer/static/lib/docxjs/viewer.html`;
data.attachment_type = 'iframe'
break;
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
data.attachment_base = `/jikimo_attachment_viewer/static/lib/exceljs/viewer.html`;
data.attachment_type = 'iframe'
break;
case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
data.attachment_base = '';
data.attachment_type = 'unknown'
break;
case 'image/png':
case 'image/jpeg':
case 'image/jpg':
data.attachment_base = ''
data.attachment_type = 'image'
break;
default:
data.attachment_base = ''
data.attachment_type = 'unknown'
break;
}
}
});
var CustomListController = ListController.extend({
// 可以保留或移除,根据是否需要处理自定义事件
// 处理打印操作
// rpc.query({
// model: 'sf.demand.plan.print.wizard',
// method: 'demand_plan_print',
// args: [recordIds]
// }).then(function(result) {
// self.do_notify("成功", "打印任务已发送到打印机");
// // 刷新视图显示最新状态
// self.reload();
// }).catch(function(error) {
// self.do_warn("打印失败", error.data.message || "发生未知错误");
// });
});
var PrintDemand = ListView.extend({
config: _.extend({}, ListView.prototype.config, {
Renderer: CustomListRenderer,
Controller: CustomListController,
}),
});
viewRegistry.add('print_demand', PrintDemand);
return PrintDemand;
});

View File

@@ -0,0 +1,89 @@
.demand_plan_tree .o_list_table_ungrouped th:not(.o_list_record_selector,.row_no,[data-name=sequence]) {
min-width: 98px !important;
}
.demand_plan_tree .o_list_table_grouped th:not(.o_list_record_selector,.row_no,[data-name=sequence]) {
width: 98px !important;
}
.demand_plan_tree .o_list_table_ungrouped {
min-width: 1900px;
}
.o_selected_row {
background-color: #e6f7ff !important;
font-weight: bold;
}
.custom-table-image-container {
display: flex;
height: calc(95vh - 254px);
gap: 20px;
position: relative;
th.o_list_record_selector, td.o_list_record_selector{
display: none;
}
.custom-preview-container, .print_demand {
flex: 1;
max-width: 49%;
tbody {
tr:not(.o_data_row) {
display: none;
}
}
tfoot {
display: none;
}
}
.print_demand {
.table-responsive {
width: 100%;
overflow-x: auto!important;
}
}
.custom-preview-container {
background-color: #dadce0;
padding: 20px;
img {
max-width: 100%;
max-height: 100%;
}
iframe {
width: 100%;
height: 100%;
}
}
.o_print_custom, .o_cancel_custom {
position: absolute;
bottom: 20px;
right: 20px;
}
.o_print_custom {
right: 66px;
}
}
.denmand_set {
display: flex;
align-items: center;
height: 50px;
> span {
font-weight: bold;
}
input {
margin-left: 30px;
}
label {
margin-left: 5px;
}
input,label {
cursor: pointer;
}
}
/*.demand_plan_tree th[data-name=planned_start_date] + th::before{*/
/* content: '待执行单据';*/
/* line-height: 38px;*/
/*}*/

View File

@@ -0,0 +1,141 @@
<odoo>
<record id="view_sf_production_demand_plan_tree" model="ir.ui.view">
<field name="name">sf.production.demand.plan.tree</field>
<field name="model">sf.production.demand.plan</field>
<field name="arch" type="xml">
<tree string="需求计划" default_order="sequence desc,id desc" editable="bottom"
class="demand_plan_tree freeze-columns-before-part_number" create="false" delete="false"
js_class="custom_demand_plan_list">
<header>
<button string="打印" name="button_action_print" type="object"
class="btn-primary"/>
<button string="下达计划" name="button_batch_release_plan" type="object"
class="btn-primary"
/>
</header>
<field name="sequence" widget="handle"/>
<field name="id" optional="hide"/>
<field name="status"/>
<field name="customer_name"/>
<field name="order_remark"/>
<field name="glb_url" optional="hide"/>
<field name="product_id"/>
<field name="model_id" optional="hide"/>
<field name="part_name"/>
<field name="part_number"/>
<field name="manual_quotation" optional="hide"/>
<field name="is_incoming_material"/>
<field name="new_supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="readonly_custom_made_type" invisible="1"/>
<field name="custom_made_type"
attrs="{'readonly': ['|',('status', '!=', '30'),('readonly_custom_made_type', '=', True)],
'required': [('new_supply_method', '=', 'custom_made')]}"/>
<field name="product_uom_qty"/>
<field name="plan_uom_qty" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="deadline_of_delivery"/>
<field name="inventory_quantity_auto_apply" optional="hide"/>
<field name="qty_delivered" optional="hide"/>
<field name="qty_to_deliver" optional="hide"/>
<field name="model_long"/>
<field name="blank_type" optional="hide"/>
<field name="blank_precision"/>
<field name="embryo_long"/>
<field name="unit_number" optional="hide"/>
<field name="materials_id"/>
<field name="model_machining_precision"/>
<field name="model_process_parameters_ids" widget="many2many_tags"/>
<field name="product_remark" optional="hide"/>
<field name="order_code" optional="hide"/>
<field name="sale_order_id" optional="hide"/>
<field name="sale_order_line_number" optional="hide"/>
<field name="order_state"/>
<field name="route_ids" widget="many2many_tags" optional="hide"
context="{'demand_plan_search_stock_route_id': id}"/>
<field name="contract_date"/>
<field name="date_order"/>
<field name="contract_code"/>
<field name="plan_remark" attrs="{'readonly': [('status', 'in', ('60','100'))]}"/>
<field name="priority" decoration-danger="priority == '1'"
decoration-warning="priority == '2'"
decoration-info="priority == '3'"
decoration-success="priority == '4'"/>
<field name="material_check" optional="hide"/>
<!-- <field name="hide_action_open_mrp_production" invisible="1"/>-->
<!-- <field name="hide_action_purchase_orders" invisible="1"/>-->
<!-- <field name="hide_action_stock_picking" invisible="1"/>-->
<!-- <field name="hide_action_view_programming" invisible="1"/>-->
<!-- <button name="action_open_sale_order" type="object" string="供货方式待确认" class="btn-secondary"-->
<!-- attrs="{'invisible': [('supply_method', '!=', False)]}"/>-->
<!-- <button name="action_open_mrp_production" type="object" string="待工艺确认" class="btn-secondary"-->
<!-- attrs="{'invisible': [('hide_action_open_mrp_production', '=', False)]}"/>-->
<!-- <button name="action_view_purchase_request" type="object" string="采购申请" class="btn-secondary"-->
<!-- attrs="{'invisible': [('hide_action_purchase_orders', '=', False)]}"/>-->
<!-- <button name="action_view_stock_picking" type="object" string="调拨单" class="btn-secondary"-->
<!-- attrs="{'invisible': [('hide_action_stock_picking', '=', False)]}"/>-->
<!-- <button name="action_view_programming" type="object" string="编程单" class="btn-secondary"-->
<!-- attrs="{'invisible': [('hide_action_view_programming', '=', False)]}"/>-->
<field name="planned_start_date" attrs="{'readonly': [('status', 'in', ('60','100'))]}"/>
<field name="actual_start_date"/>
<field name="actual_end_date"/>
<field name="processing_time"/>
<field name="create_date" optional="hide" string="创建时间"/>
<field name="create_uid" optional="hide" string="创建人"/>
<field name="write_date" string="更新时间"/>
<field name="write_uid" optional="hide" string="更新人"/>
<field name="print_count"/>
<field name="hide_release_production_order" invisible="1"/>
<button string="下达计划" name="button_release_plan" type="object"
class="btn-primary"
attrs="{'invisible': [('status', 'in', ('50','60','100'))]}"
/>
<button name="button_release_production" type="object" string="下发生产" class="btn-primary"
attrs="{'invisible': [('hide_release_production_order', '=', False)]}"
/>
<button name="edit_button" type="object" string="拆分" class="btn-primary"/>
</tree>
</field>
</record>
<record id="view_sf_production_demand_plan_search" model="ir.ui.view">
<field name="name">sf.production.demand.plan.search</field>
<field name="model">sf.production.demand.plan</field>
<field name="arch" type="xml">
<search>
<field name="order_remark"/>
<field name="product_id"/>
<field name="part_name"/>
<field name="part_number"/>
<field name="customer_name"/>
<field name="supply_method"/>
<field name="materials_id"/>
<field name="model_process_parameters_ids"/>
<field name="plan_remark"/>
<field name="contract_code"/>
<group expand="0" string="Group By">
<filter name="group_by_priority" string="优先级" domain="[]" context="{'group_by': 'priority'}"/>
<filter name="group_by_status" string="状态" domain="[]" context="{'group_by': 'status'}"/>
<filter name="group_by_customer_name" string="客户" domain="[]"
context="{'group_by': 'customer_name'}"/>
<filter name="group_by_is_incoming_material" string="客供料" domain="[]"
context="{'group_by': 'is_incoming_material'}"/>
<filter name="group_by_supply_method" string="供货方式" domain="[]"
context="{'group_by': 'supply_method'}"/>
<filter name="group_by_deadline_of_delivery" string="客户交期" domain="[]"
context="{'group_by': 'deadline_of_delivery'}"/>
<filter name="group_by_materials_id" string="材料" domain="[]"
context="{'group_by': 'materials_id'}"/>
<filter name="group_by_contract_code" string="合同号" domain="[]"
context="{'group_by': 'contract_code'}"/>
</group>
</search>
</field>
</record>
<record id="sf_production_demand_plan_action" model="ir.actions.act_window">
<field name="name">需求计划</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sf.production.demand.plan</field>
<field name="view_mode">tree</field>
</record>
</odoo>

View File

@@ -0,0 +1,123 @@
<odoo>
<record id="view_sf_demand_plan_form" model="ir.ui.view">
<field name="name">sf.demand.plan.form</field>
<field name="model">sf.demand.plan</field>
<field name="arch" type="xml">
<form>
<header>
<field name="state" widget="statusbar"/>
<field name="hide_button_release_plan" invisible="1"/>
<button string="下达计划" name="button_production_release_plan" type="object"
class="btn-primary"
attrs="{'invisible': [('hide_button_release_plan', '=', False)]}"/>
</header>
<sheet>
<group>
<group>
<field name="demand_plan_number"/>
<field name="product_id"/>
<field name="part_name"/>
<field name="part_number"/>
<field name="materials_id"/>
<field name="blank_type"/>
<field name="blank_precision"/>
<field name="embryo_long"/>
<field name="manual_quotation"/>
<field name="is_incoming_material"/>
<field name="pending_qty"/>
<field name="planned_qty"/>
<field name="model_id"/>
</group>
<group>
<field name="customer_name"/>
<field name="product_uom_qty"/>
<field name="deadline_of_delivery"/>
<field name="contract_date"/>
<field name="contract_code"/>
<field name="model_process_parameters_ids" widget="many2many_tags"/>
<field name="model_machining_precision"/>
<field name="inventory_quantity_auto_apply"/>
<field name="priority" attrs="{'readonly': [('state', 'in', ('40','50'))]}"/>
<field name="overdelivery_allowed"/>
<field name="origin"/>
</group>
</group>
<notebook>
<page string="计划">
<field name="line_ids" attrs="{'invisible': [('state', 'in', ('40','50'))]}">
<tree editable="bottom" create="false" delete="false">
<field name="status"/>
<field name="readonly_custom_made_type" invisible="1"/>
<field name="new_supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="custom_made_type"
attrs="{
'readonly': ['|', '|', ('new_supply_method', '!=', 'custom_made'), ('status', '!=', '30'), ('readonly_custom_made_type', '=', True)],
'required': [('new_supply_method', '=', 'custom_made')]}"/>
<field name="route_ids" widget="many2many_tags" optional="hide"/>
<field name="location_id" optional="hide"/>
<field name="bom_id" optional="hide"/>
<field name="processing_time" optional="hide"/>
<field name="plan_uom_qty" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="blank_arrival_date"/>
<field name="finished_product_arrival_date"/>
<field name="planned_start_date"/>
<field name="actual_start_date"/>
<field name="actual_end_date"/>
<field name="plan_remark"/>
<field name="procurement_reason"/>
<field name="write_date" string="更新时间"/>
<field name="hide_release_production_order" invisible="1"/>
<button string="下达计划" name="button_release_plan" type="object"
class="btn-primary"
attrs="{'invisible': [('status', 'in', ('50','60','100'))]}"
/>
<button name="button_release_production" type="object" string="下发生产"
class="btn-primary"
attrs="{'invisible': [('hide_release_production_order', '=', False)]}"
/>
</tree>
</field>
<field name="line_ids" attrs="{'invisible': [('state', 'not in', ('40','50'))]}">
<tree editable="bottom">
<field name="status"/>
<field name="readonly_custom_made_type" invisible="1"/>
<field name="new_supply_method" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="custom_made_type"
attrs="{
'readonly': ['|', '|', ('new_supply_method', '!=', 'custom_made'), ('status', '!=', '30'), ('readonly_custom_made_type', '=', True)],
'required': [('new_supply_method', '=', 'custom_made')]}"/>
<field name="route_ids" widget="many2many_tags" optional="hide"/>
<field name="location_id" optional="hide"/>
<field name="bom_id" optional="hide" readonly="1" options="{'no_create': True}"/>
<field name="processing_time" optional="hide"/>
<field name="plan_uom_qty" attrs="{'readonly': [('status', '!=', '30')]}"/>
<field name="blank_arrival_date"/>
<field name="finished_product_arrival_date"/>
<field name="planned_start_date"/>
<field name="actual_start_date"/>
<field name="actual_end_date"/>
<field name="plan_remark"/>
<field name="procurement_reason"/>
<field name="write_date" string="更新时间"/>
<field name="hide_release_production_order" invisible="1"/>
<button string="下达计划" name="button_release_plan" type="object"
class="btn-primary"
attrs="{'invisible': [('status', 'in', ('50','60','100'))]}"
/>
<button name="button_release_production" type="object" string="下发生产"
class="btn-primary"
attrs="{'invisible': [('hide_release_production_order', '=', False)]}"
/>
<button string="详情" name="button_plan_detail" type="object"
class="btn-primary"
/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<menuitem
id="demand_plan_menu"
name="需求计划"
sequence="140"
action="sf_demand_plan.sf_production_demand_plan_action"
parent="sf_plan.sf_production_plan_menu"
/>
<!-- 调拨动作中屏蔽验证-->
<record id="stock.action_validate_picking" model="ir.actions.server">
<field name="binding_model_id" eval="False"/>
</record>
</data>
</odoo>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_order_form_inherit_plan" model="ir.ui.view">
<field name="name">view.sale.order.form.inherit.plan</field>
<field name="inherit_id" ref="sf_manufacturing.view_order_form_inherit_supply_method"/>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<xpath expr="//header/button[@name='action_confirm'][last()]" position="attributes">
<attribute name="invisible">True</attribute>
</xpath>
<xpath expr="//page/field[@name='order_line']/tree/field[@name='supply_method']" position="attributes">
<attribute name="invisible">True</attribute>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button class="oe_stat_button" name="action_view_demand_plan" type="object" icon="fa-pencil-square-o"
attrs="{'invisible': [('demand_plan_count', '=', 0)]}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="demand_plan_count"/>
</span>
<span class="o_stat_text">需求计划</span>
</div>
</button>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="sf_stock_location_route_form_view" model="ir.ui.view">
<field name="name">stock.route.form</field>
<field name="model">stock.route</field>
<field name="inherit_id" ref="stock.stock_location_route_form_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='packaging_selectable']" position="after">
<field name="demand_plan_selectable"/>
</xpath>
<xpath expr="//group[@name='route_selector']" position="after">
<group name="group_category" string="组类">
<group>
<field name="stock_route_group_ids" options="{'no_create': True}" widget="many2many_tags"/>
<field name="demand_plan_ids" invisible="1" options="{'no_create': True}" widget="many2many_tags"/>
</group>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,2 @@
from . import sf_demand_plan_print_wizard
from . import sf_release_plan_wizard

View File

@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
import logging
from odoo import models, fields, api, _
_logger = logging.getLogger(__name__)
class SfDemandPlanPrintWizard(models.TransientModel):
_name = 'sf.demand.plan.print.wizard'
_description = u'打印向导'
model_id = fields.Char('模型ID')
filename_url = fields.Char('文件名/URL')
type = fields.Selection([
('1', '图纸'),
('2', '程序单'),
], string='类型')
status = fields.Selection([
('not_start', '未开始'),
('success', '成功'),
('fail', '失败'),
], string='状态', default='not_start')
machining_drawings = fields.Binary('2D加工图纸')
cnc_worksheet = fields.Binary('程序单')
@api.model
def demand_plan_print(self, print_ids):
plan_print_ids = self.env['sf.demand.plan.print.wizard'].sudo().search(
[('id', 'in', print_ids)])
if not plan_print_ids:
return {'message': '记录不存在'}
success_records = []
failed_records = []
for record in plan_print_ids:
pdf_data = record.machining_drawings if record.type == '1' else record.cnc_worksheet
if pdf_data:
try:
# 执行打印
# self.env['jikimo.printing'].sudo().print_pdf(pdf_data)
record.status = 'success'
production_demand_plan_id = self.env['sf.production.demand.plan'].sudo().search(
[('model_id', '=', record.model_id)])
for production_demand_plan in production_demand_plan_id:
t_part, c_part = production_demand_plan.print_count.split('C')
t_num = int(t_part[1:])
c_num = int(c_part)
if record.type == '1':
t_num += 1
elif record.type == '2':
c_num += 1
production_demand_plan.print_count = f"T{t_num}C{c_num}"
success_records.append({
'filename_url': record.filename_url,
})
except Exception as e:
record.status = 'fail'
_logger.error(f"文件{record.filename_url}打印失败: {str(e)}")
failed_records.append({
'filename_url': record.filename_url,
})
if failed_records:
message = f"成功打印 {len(success_records)} 个文件,失败 {len(failed_records)}"
else:
message = f"所有 {len(success_records)} 个文件打印成功"
return {'message': message}
class MrpWorkorder(models.Model):
_inherit = 'mrp.workorder'
def write(self, vals):
res = super(MrpWorkorder, self).write(vals)
for record in self:
if 'cnc_worksheet' in vals:
demand_plan_print = self.env['sf.demand.plan.print.wizard'].sudo().search(
[('model_id', '=', record.model_id), ('type', '=', '2')])
if demand_plan_print:
demand_plan_print.write(
{'cnc_worksheet': record.cnc_worksheet, 'filename_url': record.cnc_worksheet_name})
else:
wizard_vals = {
'model_id': record.model_id,
'type': '2',
'cnc_worksheet': record.cnc_worksheet,
'filename_url': record.cnc_worksheet_name
}
self.env['sf.demand.plan.print.wizard'].sudo().create(wizard_vals)
return res

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="action_plan_print_tree" model="ir.ui.view">
<field name="name">sf.demand.plan.print.wizard.tree</field>
<field name="model">sf.demand.plan.print.wizard</field>
<field name="arch" type="xml">
<tree string="打印" class="print_demand" js_class="print_demand">
<field name="model_id"/>
<field name="filename_url"/>
<field name="type"/>
<field name="machining_drawings" attrs="{'column_invisible': True }"/>
<field name="cnc_worksheet" attrs="{'column_invisible': True }"/>
<field name="status"/>
</tree>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
import logging
from odoo import models, fields, api, _
from werkzeug.exceptions import InternalServerError
_logger = logging.getLogger(__name__)
class SfReleasePlanWizard(models.TransientModel):
_name = 'sf.release.plan.wizard'
_description = u'下达计划向导'
demand_plan_line_id = fields.Many2many(comodel_name="sf.production.demand.plan",
string="需求计划明细", readonly=True)
release_message = fields.Char(string='提示', readonly=True)
def confirm(self):
if self.demand_plan_line_id:
for demand_plan_line_id in self.demand_plan_line_id:
try:
demand_plan_line_id.action_confirm()
except Exception as e:
self.env.cr.rollback()
demand_plan_line_id.write({'is_processing': False})
self.env.cr.commit()
raise InternalServerError('操作失败', e)

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="sf_release_plan_wizard_form">
<field name="name">sf.release.plan.wizard.form</field>
<field name="model">sf.release.plan.wizard</field>
<field name="arch" type="xml">
<form>
<sheet>
<div>
<div style="white-space: pre-wrap;">
<field name="release_message"/>
</div>
</div>
<footer>
<button string="确认" name="confirm" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@@ -14,10 +14,12 @@
<field name="name">原材料</field>
<field name="type">原材料</field>
</record>
<record id="product_category_surface_technics_sf" model="product.category">
<field name="name">表面工艺</field>
<field name="type">表面工艺</field>
<field name="parent_id" ref="sf_manufacturing.product_category_outsource_process"/>
<field name="property_cost_method">fifo</field>
<field name="property_valuation">manual_periodic</field>
</record>
<record id="product_category_cutting_tool_sf" model="product.category">
@@ -40,10 +42,10 @@
<!-- <field name="company_id" ref="base.main_company"/>-->
</record>
<!-- <record id="res_users_bfm" model="res.users">-->
<!-- <field name="name">业务平台</field>-->
<!--&lt;!&ndash; <field name="partner_id" ref="res_partner_bfm"/>&ndash;&gt;-->
<!-- </record>-->
<!-- <record id="res_users_bfm" model="res.users">-->
<!-- <field name="name">业务平台</field>-->
<!--&lt;!&ndash; <field name="partner_id" ref="res_partner_bfm"/>&ndash;&gt;-->
<!-- </record>-->
<record id="product_functional_tool_sf" model="product.product">
<field name="name">功能刀具</field>

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