净菜迭代前半部分
净菜迭代
净菜知识储备
mysql
`processing`.`technic` 工艺信息
包括工艺的基本信息,自定义字段的设置
`processing`.`technic_flow` 工艺流
多个工艺组成的有序的处理过程串,通过sku_id和ingredient_id进行关联,
可以填入工艺的自定义字段的值
`processing`.`order_request` 加工计划|生产计划
根据订单来创建的,订单明细里的每个净菜sku都对应一条生产计划记录,
通过order_id和sku_id进行关联,
生产计划进行发布时会创建对应的(未下达状态)加工单,同时也会创建该sku对应的加工单的工艺任务
`processing`.`process_order` 加工单
具体的某个成品sku的加工计划,包括计划生产数、完成生产数等,
加工单进行下达时会创建对应的领料单,成品sku中的每个物料都会创建一条领料单
`processing`.`process_task` 加工单的工艺任务
绑定在加工单上,版本化的工艺流
`processing`.`ingredient_recv` 物料领取记录
绑定在加工单上,通过加工单id和(物料ID)ingredient_id进行关联
`processing`.`ingredient_return` 物料退料记录
绑定在加工单上,通过加工单id和(物料ID)ingredient_id进行关联
mongodb
InvertoryMongoDB.batch_stock 批次表
数据库变动
mysql
+ `processing`.`ingredient_recv_batch` 领料批次表 # 领料和批次是1对多
+ `processing`.`technic_flow_custom_col` 工艺流自定义字段表 # 关联工艺流表,需要带版本号
+ `processing`.`process_order_code` 加工单条形码
# 目前加工单有三种条形码:
产品加工单条形码, 已有, 格式:<前缀'1' + 加工单id>,一条加工单一个条形码, 可不写入此表
工艺加工单条形码, 新增, 格式:<前缀'GY' +>,多条加工单的某项工艺 对应一个条形码
车间加工单条形码, 新增, 格式:<前缀'CJ' +>,
* `processing`.`process_order` 加工单
+ 损耗录入状态
* `processing`.`process_task` 加工单的工艺任务
+ 工艺领料数量
+ 工艺产出数量
-- --------------sql:
CREATE TABLE `ingredient_recv_batch` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '(领料批次表)自增id',
`recv_id` int(11) NOT NULL DEFAULT 0 COMMENT '领料记录id',
`batch_num` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '批次号',
`recv_amount` decimal(15,4) NOT NULL DEFAULT '0' COMMENT '领料数',
`proc_order_id` int(11) NOT NULL COMMENT '加工单ID',
`station_id` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`group_id` int(11) NOT NULL,
`create_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '修改时间',
`delete_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '删除时间',
`pstatus` int(11) NOT NULL DEFAULT '0' COMMENT '物理状态,0:正常--默认,1:已删除',
`extra1` int(11) NOT NULL DEFAULT '0',
`extra2` int(11) NOT NULL DEFAULT '0',
`extra3` int(11) NOT NULL DEFAULT '0',
`extra4` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra5` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra6` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra7` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra8` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra9` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra10` decimal(15,4) NOT NULL DEFAULT '0.0000',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_recv_batch_num` (`station_id`,`recv_id`,`batch_num`,`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 【工艺加工单】 【车间加工单】可以认为是一个临时的某类工艺任务的合集
-- 一个工艺任务可以属于某个【工艺加工单A】中,也可以属于某个【车间加工单B】
-- 工艺任务和 工艺加工单|车间加工单 是多对多的
-- A和B都有分切工艺任务,第一次只打印【A】一个加工单, 第二次打印【A、B】两个加工单
-- 那这两次打印的<分切_工艺加工单>,条形码是不同的,因为承载的信息不一样了
-- 多次打印【A、B】两个加工单,生成的条形码要相同
CREATE TABLE `process_order_code` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '(加工单条形码表)自增id',
`type` int(11) NOT NULL COMMENT '加工单类型, 0 工艺加工单, 1 车间加工单',
`code` varchar(64) NOT NULL COMMENT '加工单条形码',
`proc_order_id` int(11) NOT NULL COMMENT '加工单ID',
`task_id` int(11) NOT NULL COMMENT '加工单工艺任务ID',
`technic_flow_id` int(11) NOT NULL COMMENT '任务的工艺流ID, type=0时有效',
`workshop_id` int(11) NOT NULL COMMENT '任务的车间id, type=1时有效',
`hash` varchar(32) NOT NULL DEFAULT '' COMMENT '加工单id集合 + type 的hash',
`station_id` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`group_id` int(11) NOT NULL,
`create_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '修改时间',
`delete_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '删除时间',
`pstatus` int(11) NOT NULL DEFAULT '0' COMMENT '物理状态,0:正常--默认,1:已删除',
`extra1` int(11) NOT NULL DEFAULT '0',
`extra2` int(11) NOT NULL DEFAULT '0',
`extra3` int(11) NOT NULL DEFAULT '0',
`extra4` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra5` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra6` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra7` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra8` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra9` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra10` decimal(15,4) NOT NULL DEFAULT '0.0000',
PRIMARY KEY (`id`),
KEY `idx_code` (`code`),
KEY `idx_station_proc_order` (`station_id`, `proc_order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `technic_flow_custom_col` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '(工艺流自定义字段表)自增id',
`technic_flow_id` int(11) NOT NULL COMMENT '工艺流程ID',
`technic_flow_version` int(11) NOT NULL COMMENT '工艺流程版本号',
`col_id` int(11) NOT NULL COMMENT '工艺自定义字段id',
`col_param_id` int(11) NOT NULL COMMENT '工艺自定义字段参数id, -1未设置',
`station_id` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`group_id` int(11) NOT NULL,
`create_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '创建时间',
`modify_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '修改时间',
`delete_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '删除时间',
`pstatus` int(11) NOT NULL DEFAULT '0' COMMENT '物理状态,0:正常--默认,1:已删除',
`extra1` int(11) NOT NULL DEFAULT '0',
`extra2` int(11) NOT NULL DEFAULT '0',
`extra3` int(11) NOT NULL DEFAULT '0',
`extra4` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra5` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra6` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`extra7` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra8` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra9` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`extra10` decimal(15,4) NOT NULL DEFAULT '0.0000',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_recv_batch_num` (`station_id`,`recv_id`,`batch_num`,`delete_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `processing`.`process_task` ADD (
`technic_recv_amount` decimal(15,4) NOT NULL DEFAULT '0' COMMENT '原料在该工艺的领料数量',
`technic_output_amount` decimal(15,4) NOT NULL DEFAULT '0' COMMENT '原料在该工艺的产出数目'
);
接口变动
/process/technic_flow/update_technic [老接口]商品规格信息-sku工艺流更新
接口描述
商品规格信息-工艺设置-sku工艺流更新
改动点描述:
商品工艺添加自定义字段时,由输入方式改为下拉选择自定义的参数设置,
请求参数custom_cols字段格式变更
Method
POST
请求
# 已有参数字段修改
custom_cols M list[dict] 工艺定义的参数, 变更后结构如下:
[
{
col_id M int 工艺自定义字段id
col_param_id O int 工艺自定义字段参数id
}
]
响应
不变
逻辑
参数描述是随着【工艺管理-参数设置】的修改而改变的
technic工艺表中的custom_cols, 自定义字段里不允许有重复的字段
新增technic_flow_custom_col表,需要带工艺流的版本号,存工艺流自定义字段设置
/process/technic/list [老接口]获取工艺详情列表
接口描述
获取工艺详情信息
Method
GET
请求
不变
响应
# custom_cols字段格式变化
[ # 工艺自定义参数列表
{
"col_name": "清洗", # 工艺自定义参数名称
"col_id": 3, # 工艺自定义参数名称的id
"param_list": [ # 工艺自定义字段的参数列表
{
"param_name": "清洗2min", # 工艺自定义字段参数名称
"param_id": 1 # 工艺自定义字段参数的id
}
]
}
]
逻辑
需返回工艺事先定义好的字段和字段参数
/process/process_order/print [老接口]加工单据-打印产品加工单
接口描述
获取产品加工单打印的信息
Method
GET
请求
不变
响应
code M int 返回码,0表示成功,其他表示错误
msg M string 错误信息
data M string 返回json数据
响应示例
├── data list[dict] 加工单信息列表
│ ├── ingredients list[dict] 物料信息列表
│ │ ├── tasks list[dict] 物料加工信息列表
####### ######
{
"code": 0,
"msg": "ok",
"data": [
{
sku_name": "黄焖鸡米饭", # 成品名称
"ratio": 1,
"std_unit_name": "盒",
"finish_amount": null,
"id": 264,
"sale_unit_name": "盒",
"ingredients": [ # 物料信息列表
{
"sku_name": "鸡肉|斤", # 物料名称
"ratio": 0.2, # 需求比例
"std_unit_name": "斤",
"sku_id": "D12155087",
"recv_amount": 3, # 领料数
"output_amount": 2, # 产出数
"tasks": [ # 加工工艺信息列表
{
"technic_recv_amount": 3, # 【新增】工艺领料数
"technic_output_amount": 2, # 【新增】工艺产出数
"technic_flow_desc": "kan ", # 工艺描述
"id": 338,
"technic_flow_name": "打包" # 工艺名称
}
],
"batch_num": "", # 领料批次
"sale_unit_name": "斤",
"type": 7, # 物料类型
"sale_ratio": 1
}
],
"status": 2,
"custom_id": "D12155056-2030", # 计划编号
"std_plan_amount": 100,
"plan_amount": 100, # 计划生产数
"sku_id": "D12155056",
"finish_time": null, # 完成日期
"code": "100000000264", # 条形码
"start_time": null # 开工日期
}
]
}
逻辑
新增 工艺领料数量、工艺产出数量
/process/process_order/print_by_technic [新接口]加工单据-打印工艺加工单
接口描述
获取工艺加工单打印的信息
Method
GET
请求
ids M list[int] 加工单id列表
响应
响应示例
├── data list[dict] 工艺信息列表
│ ├── ingredients list[dict] 工艺的某个物料信息列表
│ │ ├── process_orders list[dict] 物料所在的加工单信息列表
##################
{
"code": 0,
"msg": "ok",
"data": [
{
"technic_flow_name": "打包", # 工艺名称
"technic_flow_desc": "kan", # 工艺描述
"ingredients": [ # 物料信息列表
{
"sku_name": "鸡肉|斤", # 物料名称
"ratio": 0.2,
"process_orders": [ # 加工单信息列表
{
"custom_id": "D12155056-2030", # 加工单计划编号
"recv_amount": 10, # 领料数量
"plan_amount": 10, # 需求数目|计划产出数目
"output_amount": 9, # 产出数目
}
],
"batch_num": "", # 领料批次
"sale_unit_name": "斤",
"type": 7, # 物料类型
"sale_ratio": 1
}
],
}
]
}
逻辑
按照工艺的维度拆分
/process/process_order/print_by_workshop [新接口]加工单据-打印车间加工单
接口描述
获取车间加工单打印的信息
Method
GET
请求
ids M list[int] 加工单id列表
响应
响应示例
├── data list[dict] 车间信息列表
│ ├── technics list[dict] 车间的某个工艺信息列表
│ │ ├── ingredients list[dict] 工艺的某个物料信息列表
│ │ │ ├── process_orders list[dict] 物料所在的加工单信息列表
#########################
{
"code": 0,
"msg": "ok",
"data": [
{
"workshop_name": "打包", # 车间名称
"technics": {
"technic_flow_name": "打包", # 工艺名称
"technic_flow_desc": "kan", # 工艺描述
"ingredients": [ # 物料信息列表
{
"sku_name": "鸡肉|斤", # 物料名称
"ratio": 0.2,
"process_orders": [ # 加工单信息列表
{
"custom_id": "D12155056-2030", # 加工单计划编号
"recv_amount": 10, # 领料数量
"plan_amount": 10, # 需求数目|计划产出数目
"output_amount": 9, # 产出数目
}
],
"batch_num": "", # 领料批次
"sale_unit_name": "斤",
"type": 7, # 物料类型
"sale_ratio": 1
}
],
}
}
]
}
逻辑
按照车间的维度拆分
/process/process_order/get [新接口]加工单据-加工单详情
接口描述
获取加工单详情信息
Method
GET
请求
id M int 加工单id
响应
{
"code": 0,
"msg": "ok",
"data": {
"sku_name": "荷兰土豆丝", # 成品名称
"start_time": "2019-10-28T11:41:06", # 计划开始时间
"plan_finish_time": "2019-10-28T00:00:00", # 计划完成时间
"release_time": "2019-10-28T11:38:51", # 计划发布时间
"custom_id": "D19712893-2020", # 计划编号
"status": 2, # 计划状态
"id": 249, # 加工计划id
"finish_products":[ # 成品明细(应该就一条)
{
"recv_amount": 10, # 领料数量
"output_amount": 10, # 产出数目
"waste_amount": 10, # 损耗数目
"ratio": 1, # 销售比例
"ingredient_id": "D12155087", # 物料id
"remark_type": 7,
"std_unit_name": "斤", # 基本单位
"sale_unit_name": "斤", # 销售单位
"proportion": 0.2, # 物料比例
"ingredient_name": "鸡肉|斤" # 物料名
}
],
"attritions": [ # 工艺损耗明细,一个工艺一个损耗
{
"recv_amount": 10, # 领料数量
"output_amount": 9, # 产出数目
"ingredient_name": "鸡肉|斤" # 物料名
"type": 7, # 物料类型
"technic_flow_name": "打包", # 工艺名称
}
],
}
}
/process/process_order/finish_product_in_stock [新接口]加工单据-产出入库
接口描述
将加工单快速转换成成品待入库单
Method
POST
请求
id M int 加工单id
响应
ok
逻辑
fixme 和已有的入库规则保持一致
对加工单的成品生成入库单
加工单状态变为已完成
/process/process_order/attrition_export [新接口]加工单据-录入损耗模板
接口描述
异步任务方式,导出具体损耗信息列表,生成录入损耗excel模板,用于导入损耗去更新工艺任务的损耗信息
Method
GET
请求
workshop_id O int 车间id
begin_time O date 开始时间,yyyy-mm-dd
end_time O date 结束时间,yyyy-mm-dd
响应
{
"code": 0, # 返回码,0表示成功,其他表示错误
"msg": "ok",
"data": {
"async": 0, # 0:同步,1:异步
"task_url": None, # 异步返回url,同步则为None
}
}
逻辑
根据是否传递workshop_id参数,生成格式不同的excel
/process/process_order/attrition_import [新接口]加工单据-录入损耗保存
接口描述
批量录入损耗模板,先检查参数,如果参数正确则异步任务方式去更新损耗的信息,否则直接返回错误列表
Method
POST
请求
file M file 损耗excel
响应
{
"code": 0, # 返回码,0表示成功,其他表示错误
"msg": "ok",
"data": {
"async": 0, # 0:同步,1:异步
"task_url": None, # 异步返回url,同步则为None
"error_list": $error # 非异步时 返回错误列表
}
}
逻辑
走异步任务,返回异步任务url,失败列表存异步任务结果
效验所有参数,custom_id、sku_id、ingredient_id、technic_flow_id关系是否正确
如果有错误返回所有失败的列表,需要保存
/process/process_order/attrition_import_result [新接口]加工单据-录入损耗结果
接口描述
显示录入损耗错误列表的结果
Method
GET
请求
task_id M int 异步任务id
响应
{
"code": 0,
"msg": "ok",
"data": {
"all_workshop": 1, # 1: 全部车间, 0: 某个车间
"error_list": $error
}
}
$error格式1
[
"error_msg": "xxx" #错误信息
"workshop_name": "车间1", # 车间名称
"custom_id": "D19712893-2020", # 计划编号
"sku_id": "D123", # 商品id
"sku_name": "鸡肉|斤", # 商品名称
"ratio": 1,
"std_unit_name": "斤",
"sale_unit_name": "斤",
"recv_amount": 10, # 原料的领料数量
"output_amount": 10, # 原料的产出数目
"ingredient_id": "D12155087", # 物料id
"ingredient_name": "鸡肉|斤", # 物料名
"technic_flow_name": "打包", # 工艺名称
"technic_flow_desc": "kan", # 工艺描述
"technic_recv_amount": 10, # 原料在该工艺的领料数量
"technic_output_amount": 10, # 原料在该工艺的产出数目
]
$error格式2
todo
逻辑
/process/process_order/attrition_update [新接口]加工单据-损耗保存
接口描述
单个录入损耗,先检查参数,同步方式处理
Method
POST
请求
attrition_finished M int 是否标记损耗已录入完成 ,0 不标记, 1 标记
custom_id M str 计划编号
sku_id M str 商品id
ingredient_id M int 物料id
technic_flow_id M int 工艺id
output_amount M float 原料的产出数目
technic_recv_amount M float 原料在该工艺的领料数量
technic_output_amount M float 原料在该工艺的产出数目
响应
逻辑
效验所有参数,custom_id、sku_id、ingredient_id、technic_flow_id关系是否正确
如果有错误直接返回
/process/process_order/ingredient_recv/batch_update [新接口]领料管理-批量操作
接口描述
批量编辑领取批次、批量设置领料人、批量设置领料状态
先同步方式,观察大数据量的响应时间,再考虑是否异步任务方式
Method
POST
请求
# <1> 和 <2> 的参数必选一项
# <1> 查询条件字段,当有以下四个字段的任何一个时,可认为是全选
begin O date 计划下达开始日期
end O date 计划下达结束日期
q O str 搜索字符串
status O int 领料状态
# <2> 当有ids参数时,可认为是部分勾选
ids O list[int] 领料记录id数组
update_type M str[enum] 值为set_batch_num|set_status|set_recver
set_batch_list O list[dict] 待设置的领料数列表
[
{
"ingredient_id": "D123", 物料id
"amount": 10 此物料id的总共领料数
}
]
set_status O int update_type="status", 待设置的领料状态,1未领料,2已领取,只能1->2
set_recver O int update_type="recver", 待设置的领料人id
响应
ok
逻辑
update_type="set_batch_num"时
默认按批次入库时间顺序选择批次填充领取数为需求数,若某一批次库存不足,
则顺延至下一批次补足剩余数量,直至分配完领料数为止。
/process/process_order/ingredient_recv/last_recver [新接口]领料管理-最近领料人
接口描述
获取最近一次的领料人
Method
GET
todo
/process/process_order/ingredient_recv/update [老接口]领料管理-领料更新
接口描述
单条领料操作领取批次,更改为可多选批次
Method
POST
请求
# 新增字段
batch_list O list[dict] 批次信息列表, 会覆盖更新旧的批次列表
[
{
"batch_num": "T11", # 批次号
"amount": 1 # 领取数目
}
]
响应
不变
/process/process_order/ingredient_recv/list [老接口]领料管理-领料列表
接口描述
领料列表
Method
GET
请求
status(新增) O int 领料状态,0 全部状态、1 未领料、2 已领取, 默认0
code(新增) O str 加工单条形码
响应
{
"code": 0,
"data": [
{
"id": 443,
"spu_name": "荷兰土豆",
"unit_name": "斤",
"ingredient_version": 1,
"recver": "刘",
"ingredient_id": "D19712872",
"shelf_name": null,
"spu_id": "C3536674",
"release_time": "2019-10-28T11:38:51",
"plan_recv_amount": 120,
"create_time": "2019-10-28T11:38:51",
"status": 2,
"ingredient_name": "荷兰土豆|1斤/斤",
"batch_list": [ # 【新增字段】,批次信息列表
{
"batch_num": "T16890-10-28-00001-00003", # 批次号
"amount": 12 # 领取数目
, }
],
"recv_time": "2019-10-28T11:41:06",
"proc_order_id": "D19712893-2020", # 加工计划编号
"real_recv_amount": 120,
"remark_type": 1
}
],
"msg": "ok",
"pagination": {
"page_obj": "(443,)|True+(443,)|False",
"more": false
}
}
逻辑
计划
批量领料、领料筛选 2 11.01-11.04
损耗录入、产出入库 2 11.05-11.07
自定义参数、sku工艺更新 2 11.08-11.11
打印加工单、条形码 2 11.12-11.13
自测、联调 11.13-