更新销售合同/提成/业绩、精工工序工价/生产审核/工时统计、仓储盘点/库存/补货/入库/库房管理,新增提成设置/销售业绩/库房管理/入库单移动端等模块及SQL脚本

This commit is contained in:
Developer
2026-08-05 08:13:08 +08:00
parent 33549c3787
commit fd84f9d3ca
94 changed files with 14531 additions and 345 deletions

View File

@@ -0,0 +1,397 @@
# -*- coding: utf-8 -*-
"""修改人:Ld 修改时间:2026-07-31 09:04:47; 生成库房管理实施后说明书与推进方案。"""
from docx import Document
from docx.enum.section import WD_SECTION_START
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Cm, Pt, RGBColor
OUTPUT = r"D:\景耀\JY1.0\docs\库房管理\库房管理方案实施后说明书与推进方案.docx"
MODIFY_TIME = "2026-07-31 09:04:47"
def set_cell_shading(cell, fill):
tc_pr = cell._tc.get_or_add_tcPr()
shd = OxmlElement("w:shd")
shd.set(qn("w:fill"), fill)
tc_pr.append(shd)
def set_cell_width(cell, width_cm):
tc_pr = cell._tc.get_or_add_tcPr()
tc_w = OxmlElement("w:tcW")
tc_w.set(qn("w:w"), str(int(width_cm * 567)))
tc_w.set(qn("w:type"), "dxa")
tc_pr.append(tc_w)
def set_cell_text(cell, text, bold=False, color=None):
cell.text = ""
p = cell.paragraphs[0]
p.paragraph_format.space_after = Pt(0)
run = p.add_run(str(text))
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(9)
run.bold = bold
if color:
run.font.color.rgb = RGBColor.from_string(color)
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
def add_table(doc, headers, rows, widths=None):
table = doc.add_table(rows=1, cols=len(headers))
table.style = "Table Grid"
table.autofit = False
header_cells = table.rows[0].cells
for i, header in enumerate(headers):
set_cell_text(header_cells[i], header, bold=True, color="0B2545")
set_cell_shading(header_cells[i], "E8EEF5")
if widths:
set_cell_width(header_cells[i], widths[i])
for row in rows:
cells = table.add_row().cells
for i, value in enumerate(row):
set_cell_text(cells[i], value)
if widths:
set_cell_width(cells[i], widths[i])
doc.add_paragraph()
return table
def add_heading(doc, text, level=1):
p = doc.add_heading(text, level=level)
for run in p.runs:
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.color.rgb = RGBColor(46, 116, 181) if level <= 2 else RGBColor(31, 77, 120)
return p
def add_para(doc, text, bold_prefix=None):
p = doc.add_paragraph()
p.paragraph_format.space_after = Pt(6)
p.paragraph_format.line_spacing = 1.25
if bold_prefix and text.startswith(bold_prefix):
r1 = p.add_run(bold_prefix)
r1.bold = True
r1.font.name = "微软雅黑"
r1._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
r1.font.size = Pt(10.5)
text = text[len(bold_prefix):]
r = p.add_run(text)
r.font.name = "微软雅黑"
r._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
r.font.size = Pt(10.5)
return p
def add_bullets(doc, items):
for item in items:
p = doc.add_paragraph(style="List Bullet")
p.paragraph_format.space_after = Pt(4)
p.paragraph_format.line_spacing = 1.25
run = p.add_run(item)
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(10.5)
def add_numbered(doc, items):
for item in items:
p = doc.add_paragraph(style="List Number")
p.paragraph_format.space_after = Pt(4)
p.paragraph_format.line_spacing = 1.25
run = p.add_run(item)
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(10.5)
def build_doc():
doc = Document()
section = doc.sections[0]
section.top_margin = Cm(2.2)
section.bottom_margin = Cm(2.0)
section.left_margin = Cm(2.2)
section.right_margin = Cm(2.2)
section.header_distance = Cm(1.25)
section.footer_distance = Cm(1.25)
styles = doc.styles
normal = styles["Normal"]
normal.font.name = "微软雅黑"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
normal.font.size = Pt(10.5)
normal.paragraph_format.space_after = Pt(6)
normal.paragraph_format.line_spacing = 1.25
title = doc.add_paragraph()
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = title.add_run("库房管理方案实施后说明书与推进方案")
run.bold = True
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(20)
run.font.color.rgb = RGBColor(11, 37, 69)
sub = doc.add_paragraph()
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = sub.add_run("适用范围JY1.0 测试库库房管理模块试运行、验收、推广")
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(10.5)
run.font.color.rgb = RGBColor(85, 85, 85)
add_table(
doc,
["项目", "内容"],
[
["当前环境", "测试库 ERPTOOL_JY_20250826Back正式库 ERPTOOL_JY 未修改"],
["前端页面", "src/views/WarehouseManagement/WarehouseRoomManagement/index.vue"],
["菜单路径", "WarehouseManagement/WarehouseRoomManagement菜单标题库房管理"],
["实施原则", "新增隔离模块,复用原组件和稳定接口,不覆盖原仓储页面、原仓储管理过程"],
["文档日期", "2026-07-31"],
],
[3.0, 12.5],
)
add_heading(doc, "1. 实施后总体说明")
add_para(
doc,
"本说明书用于库房管理模块实施后的使用、验收和推广。当前方案已经在测试库完成隔离落地,核心目标是把“库房-库区-库位-物料-库存流水”业务链路先走通,再逐步接入入库、出库、盘点等生产业务。",
)
add_bullets(
doc,
[
"库房被定义为放置库位和物料的区域,库位是具体存放位置。",
"库位归属按已有库位编码规则自动识别,不强制重建原库位数据。",
"三楼仓库提供可点击可视化布局,按 8 排、每排 24 列、3 层展示。",
"物料库位查询复用原稳定接口,并在新页面内补充库房归属,避免影响原物料库位功能。",
"所有落地对象均先在测试库验证,正式库上线前必须完成数据核对和用户验收。",
]
)
add_heading(doc, "2. 已实施内容")
add_heading(doc, "2.1 数据库对象", 2)
add_table(
doc,
["类别", "对象", "实施说明"],
[
["新表", "库房管理_库房主文件", "保存库房编号、名称、类型、地址、状态、排数、列数、层数等信息。"],
["新表", "库房管理_库区主文件", "保存库房下的库区信息,与库房主文件建立外键关系。"],
["新表", "库房管理_业务记录", "保存库房相关业务记录,为后续出入库、盘点、移库追溯预留。"],
["完善表", "库存管理_货位主文件", "补充库房流水号、库区流水号、排号、列号、层号、库位状态、库位容量、是否启用、修改人、修改时间。"],
["索引", "库房库区排列层索引", "支持按库房、库区、排、列、层快速查询可视化库位。"],
["同步过程", "库房管理_库位编码归属_同步", "按库位编码规则把原货位归属同步到二楼隔层、立库、三楼仓库。"],
],
[2.0, 4.3, 9.2],
)
add_heading(doc, "2.2 已建立过程与接口策略", 2)
add_table(
doc,
["过程/接口", "用途", "当前策略"],
[
["库房管理_库房_查询/保存/停用", "库房主数据维护", "测试库新增,前端库房管理页签调用。"],
["库房管理_库区_查询/保存", "库房下库区维护", "测试库新增,前端库区/库位页签调用。"],
["库房管理_库位_查询/保存", "库位列表维护和按布局建库位", "测试库新增,复用原货位表并补充库房字段。"],
["库房管理_可视化库位_查询", "三楼仓库可视化布局", "默认三楼仓库,未建库位按 x-xx-xx-xx 生成预览编码。"],
["仓储管理_物料库位_查询数据", "物料综合/正向/逆向查询", "复用原稳定接口,新页面内按编码规则补充库房归属。"],
["库房管理_库存流水_查询", "出入库/盘点流水查询", "测试库新增,用于后续业务记录和追溯。"],
],
[4.3, 5.3, 5.9],
)
add_heading(doc, "2.3 前端页面功能", 2)
add_table(
doc,
["页签", "主要功能", "当前用途"],
[
["库房管理", "查询、新增、编辑、停用库房;查看库区数、库位数、有库存库位数。", "维护库房基础资料,作为库区和库位的上级。"],
["库区/库位", "按库房、库区、库位名称、状态查询;新增/编辑库区和库位。", "完成库房对应库位维护。"],
["三楼仓库可视化", "按层展示 8 排 x 24 列库位;点击库位查看状态或建库位。", "对照现场三楼仓库布局进行可视化操作。"],
["物料综合查询", "综合、正向、逆向查询;支持全部库房或指定库房过滤。", "查询物料在哪些库位、某库位有哪些物料。"],
["出入库/盘点流水", "按关键字、日期、库房查询业务流水。", "为后续出入库、盘点闭环提供追溯入口。"],
],
[3.0, 6.8, 5.7],
)
add_heading(doc, "3. 库房与库位编码规则")
add_table(
doc,
["库房", "库位编码格式", "示例", "系统处理"],
[
["二楼隔层仓库", "字母数字-数字", "A1-1、K2-18", "归属到二楼隔层库区,不参与三楼可视化网格。"],
["立库仓库", "xx-xx-xx", "01-01-01、06-07-03", "归属到立库库区,可用于立库查询统计。"],
["三楼仓库", "x-xx-xx-xx", "1-01-01-01", "参与三楼可视化布局,排、列、层按编码识别。"],
["未归类库位", "不符合以上规则", "A000、耗材、毛坯库", "在物料综合查询中标识为未归类,后续由仓库确认是否纳入库房体系。"],
],
[3.2, 3.6, 3.0, 5.7],
)
add_heading(doc, "4. 实施后业务操作说明")
add_heading(doc, "4.1 建库房与建库位", 2)
add_numbered(
doc,
[
"进入“库房管理”页签,先维护库房编号、库房名称、库房类型、排数、每排列数、层数和状态。",
"进入“库区/库位”页签,选择库房后维护库区,再维护具体库位。",
"三楼仓库可进入“三楼仓库可视化”页签,点击未建库位,系统带出排、列、层和预览库位编号。",
"已发生库存业务的库位不建议物理删除;如不再使用,应先移库清空,再停用。",
],
)
add_heading(doc, "4.2 物料查询", 2)
add_numbered(
doc,
[
"综合查询:输入物料编码、名称、图号或库位关键字,可选择全部库房或指定库房。",
"正向查询:用于回答“物料在哪个库位”,按物料信息定位所有有库存的库位。",
"逆向查询:用于回答“哪个库位放置哪些物料”,可从三楼可视化库位直接跳转带入库位。",
"查询结果显示物料编码、物料名称、图号或型号、库房、库区、库位、库存数量、批次号和库存状态。",
],
)
add_heading(doc, "4.3 出入库与盘点衔接", 2)
add_para(
doc,
"当前模块已经预留出入库/盘点流水入口。后续推进时,应把现有入库、出库、调拨、盘点业务的库存变动统一写入库房业务记录或可追溯流水,避免只改结果、不留过程。",
)
add_bullets(
doc,
[
"入库:选择物料、数量、库房和库位,库存增加并写入入库流水。",
"出库:校验库位库存充足后扣减,库存减少并写入出库流水。",
"盘点:生成账面数,录入实盘数,差异确认后生成盘盈或盘亏调整流水。",
"移库:原库位扣减、目标库位增加,同一业务写入移出和移入两条流水。",
]
)
add_heading(doc, "5. 数据流说明")
add_table(
doc,
["数据流", "入口", "处理", "输出"],
[
["库房主数据", "库房管理页签", "写入库房主文件,维护状态和布局参数", "库房下拉、统计、库位归属依据"],
["库区/库位数据", "库区/库位页签或可视化点击建库位", "写入原货位表扩展字段,保留原货位主键", "库位列表、可视化单元格、物料查询维度"],
["原库位同步", "库位编码归属同步过程", "按编码规则回填库房、库区、排列层", "二楼、立库、三楼的库位归属清单"],
["物料库位查询", "物料综合查询页签", "调用原稳定接口,再按编码规则补库房归属", "物料在哪、库位放什么的正逆向查询结果"],
["业务流水", "入库、出库、盘点、移库后续接入", "写业务记录并关联物料、库位、数量变化", "出入库/盘点流水和追溯报表"],
],
[3.0, 3.8, 5.2, 3.8],
)
add_heading(doc, "6. 验收标准")
add_table(
doc,
["验收项", "验收方法", "通过标准"],
[
["不影响原功能", "原库位管理、原物料库位页面查询", "页面可正常打开,查询结果与实施前一致。"],
["库房主数据", "新增、编辑、停用测试库房", "数据写入测试库,重复编号有校验,停用状态正确。"],
["库位归属", "抽查 A1-1、01-01-01、1-01-01-01 等编码", "分别归属二楼隔层、立库、三楼仓库。"],
["三楼可视化", "切换层号并点击库位", "展示 8 排、24 列、3 层,点击后显示库位明细。"],
["物料正逆向查询", "按物料查库位、按库位查物料", "能返回库房、库区、库位和库存数量,不再出现 result=0。"],
["构建验证", "执行前端 lint 和 build", "无编译错误;允许已有体积和 Browserslist 警告。"],
],
[3.2, 5.2, 7.1],
)
add_heading(doc, "7. 推进方案")
add_heading(doc, "7.1 推进原则", 2)
add_bullets(
doc,
[
"先测试库、再小范围试点、最后正式库上线。",
"先查清现有库位数据,再让仓库人员确认库房归属。",
"先上线查询和可视化,再逐步接入会改库存的入库、出库、盘点、移库。",
"每一步都保留回退方案,正式库脚本上线前必须备份对象定义和关键数据。",
]
)
add_heading(doc, "7.2 推进计划", 2)
add_table(
doc,
["阶段", "工作内容", "责任角色", "预计工时", "交付物"],
[
["0. 方案确认", "确认库房定义、编码规则、菜单权限、试点范围。", "仓库主管、实施人员、开发", "4 小时", "确认记录和试点名单"],
["1. 测试库核对", "核对三类库房、库区、库位归属;抽样检查物料库位。", "仓库主管、实施人员", "8 小时", "数据核对表"],
["2. 页面试用", "仓库人员按实际业务试用库房、库区/库位、可视化、物料查询。", "仓库操作员、实施人员", "8 小时", "问题清单和优化记录"],
["3. 数据清洗", "处理未归类库位、异常编码、重复或废弃库位。", "仓库主管、开发", "16 小时", "清洗脚本和确认清单"],
["4. 培训与验收", "培训查询、建库位、可视化操作;按验收标准逐项签字。", "实施人员、关键用户", "8 小时", "培训签到和验收单"],
["5. 正式库上线准备", "生成正式库脚本、备份对象、安排低峰上线窗口。", "开发、DBA/管理员", "8 小时", "上线脚本、回退脚本、备份记录"],
["6. 正式上线", "执行正式库脚本、发布前端、验证菜单和查询。", "开发、实施人员", "8 小时", "上线记录和验证结果"],
["7. 运行观察", "连续观察查询性能、用户反馈、出入库/盘点接入需求。", "仓库主管、开发", "16 小时", "试运行报告和二期清单"],
],
[2.2, 5.0, 3.0, 2.0, 3.3],
)
add_heading(doc, "7.3 正式上线前检查清单", 2)
add_bullets(
doc,
[
"确认正式库脚本只包含已验收对象,不包含测试数据。",
"确认原仓储页面和原存储过程未被覆盖。",
"确认 `库存管理_货位主文件` 新增字段为兼容字段,不破坏原字段含义。",
"确认菜单权限只授权给需要使用库房管理的角色。",
"确认可回退:正式库执行前导出相关对象定义和关键表数据备份。",
"确认上线后首日安排仓库关键用户和开发人员共同值守。",
]
)
add_heading(doc, "8. 风险与控制")
add_table(
doc,
["风险", "表现", "控制措施"],
[
["库位编码不规范", "部分库位无法归属到二楼、立库、三楼", "输出未归类清单,由仓库确认后再批量修正。"],
["用户误解默认库房", "综合查询只看到某一库房", "材料查询页提供独立“全部库房/指定库房”筛选。"],
["接口兼容问题", "新建过程经接口返回 result=0", "查询类优先复用原稳定接口;新过程上线前单独做接口验证。"],
["影响原功能", "原库位管理或物料库位页面异常", "原页面不改;新增模块隔离;上线前做原功能回归。"],
["库存变动不可追溯", "只改库存结果,没有业务流水", "出入库、盘点、移库接入时必须同事务写库存变动流水。"],
],
[3.0, 5.0, 7.5],
)
add_heading(doc, "9. 后续二期建议")
add_bullets(
doc,
[
"把采购入库、自制件入库、领料出库、退料、移库、盘点全部接入库房业务记录。",
"为三楼可视化增加库位物料明细弹窗、颜色按库存/容量/异常区分。",
"增加未归类库位治理页面,支持仓库人员批量指定库房和库区。",
"增加库位容量、混放规则、冻结库存、异常库存预警。",
"形成“库存账面数-库位现存-业务流水”三方核对报表。",
]
)
add_heading(doc, "10. 使用责任分工")
add_table(
doc,
["角色", "职责"],
[
["仓库主管", "确认库房和库位规则,审核未归类库位,组织试点和验收。"],
["仓库操作员", "按实际收发料和盘点场景试用页面,反馈无法落地的问题。"],
["实施人员", "组织培训、收集问题、跟踪整改、推进验收。"],
["开发人员", "维护测试库脚本、前端页面、接口兼容和上线回退方案。"],
["系统管理员", "控制菜单权限、安排上线窗口、保存备份和发布记录。"],
],
[3.2, 12.3],
)
add_para(doc, "修改人:Ld 修改时间:" + MODIFY_TIME + ";")
footer = section.footer.paragraphs[0]
footer.alignment = WD_ALIGN_PARAGRAPH.RIGHT
run = footer.add_run("库房管理方案实施后说明书")
run.font.name = "微软雅黑"
run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑")
run.font.size = Pt(9)
run.font.color.rgb = RGBColor(85, 85, 85)
doc.save(OUTPUT)
if __name__ == "__main__":
build_doc()

View File

@@ -0,0 +1,321 @@
# 修改人:Ld 修改时间:2026-08-03 14:07:13; 生成排产优化方案 Word 文档。
from docx import Document
from docx.enum.section import WD_SECTION
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
OUTPUT = r"D:\景耀\JY1.0\docs\排产优化方案.docx"
MOD_TIME = "2026-08-03 14:07:13"
def set_run_font(run, size=11, bold=False, color=None, name="Calibri"):
run.font.name = name
run._element.rPr.rFonts.set(qn("w:ascii"), name)
run._element.rPr.rFonts.set(qn("w:hAnsi"), name)
run._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
run.font.size = Pt(size)
run.bold = bold
if color:
run.font.color.rgb = RGBColor.from_string(color)
def set_para_format(paragraph, before=0, after=6, line=1.10):
paragraph.paragraph_format.space_before = Pt(before)
paragraph.paragraph_format.space_after = Pt(after)
paragraph.paragraph_format.line_spacing = line
def add_heading(doc, text, level=1):
p = doc.add_paragraph()
set_para_format(p, before=16 if level == 1 else 10, after=8 if level == 1 else 5)
r = p.add_run(text)
if level == 1:
set_run_font(r, size=16, bold=True, color="2E74B5")
else:
set_run_font(r, size=13, bold=True, color="2E74B5")
return p
def add_para(doc, text, bold_prefix=None):
p = doc.add_paragraph()
set_para_format(p)
if bold_prefix and text.startswith(bold_prefix):
r1 = p.add_run(bold_prefix)
set_run_font(r1, bold=True)
r2 = p.add_run(text[len(bold_prefix):])
set_run_font(r2)
else:
r = p.add_run(text)
set_run_font(r)
return p
def add_bullet(doc, text):
p = doc.add_paragraph(style="List Bullet")
set_para_format(p, after=4, line=1.167)
r = p.add_run(text)
set_run_font(r)
return p
def add_number(doc, text):
p = doc.add_paragraph(style="List Number")
set_para_format(p, after=4, line=1.167)
r = p.add_run(text)
set_run_font(r)
return p
def shade_cell(cell, fill):
tc_pr = cell._tc.get_or_add_tcPr()
shd = OxmlElement("w:shd")
shd.set(qn("w:fill"), fill)
tc_pr.append(shd)
def set_cell_text(cell, text, bold=False, align=WD_ALIGN_PARAGRAPH.LEFT):
cell.text = ""
p = cell.paragraphs[0]
p.alignment = align
set_para_format(p, after=0, line=1.10)
r = p.add_run(text)
set_run_font(r, size=10.5, bold=bold)
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
def add_table(doc, headers, rows, widths):
table = doc.add_table(rows=1, cols=len(headers))
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.style = "Table Grid"
for i, header in enumerate(headers):
set_cell_text(table.rows[0].cells[i], header, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER)
shade_cell(table.rows[0].cells[i], "F2F4F7")
table.rows[0].cells[i].width = Inches(widths[i])
for row in rows:
cells = table.add_row().cells
for i, value in enumerate(row):
set_cell_text(cells[i], str(value), align=WD_ALIGN_PARAGRAPH.LEFT if i > 0 else WD_ALIGN_PARAGRAPH.CENTER)
cells[i].width = Inches(widths[i])
doc.add_paragraph()
return table
def add_callout(doc, title, body):
table = doc.add_table(rows=1, cols=1)
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.style = "Table Grid"
cell = table.rows[0].cells[0]
shade_cell(cell, "F4F6F9")
p = cell.paragraphs[0]
set_para_format(p, after=3)
r = p.add_run(title)
set_run_font(r, size=11, bold=True, color="1F4D78")
p2 = cell.add_paragraph()
set_para_format(p2, after=0)
r2 = p2.add_run(body)
set_run_font(r2, size=10.5)
doc.add_paragraph()
def main():
doc = Document()
section = doc.sections[0]
section.top_margin = Inches(1)
section.bottom_margin = Inches(1)
section.left_margin = Inches(1)
section.right_margin = Inches(1)
section.header_distance = Inches(0.492)
section.footer_distance = Inches(0.492)
styles = doc.styles
normal = styles["Normal"]
normal.font.name = "Calibri"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Microsoft YaHei")
normal.font.size = Pt(11)
normal.paragraph_format.space_after = Pt(6)
normal.paragraph_format.line_spacing = 1.10
header = section.header.paragraphs[0]
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
set_para_format(header, after=0)
rh = header.add_run("景耀 JY1.0 MES | 排产优化方案")
set_run_font(rh, size=9, color="555555")
footer = section.footer.paragraphs[0]
footer.alignment = WD_ALIGN_PARAGRAPH.CENTER
rf = footer.add_run("内部方案讨论稿")
set_run_font(rf, size=9, color="555555")
title = doc.add_paragraph()
set_para_format(title, before=10, after=4)
tr = title.add_run("排产优化方案")
set_run_font(tr, size=24, bold=True, color="0B2545")
subtitle = doc.add_paragraph()
set_para_format(subtitle, after=14)
sr = subtitle.add_run("结合 JY1.0 现有销售合同、补货、生产计划、工序派工与设备任务链路")
set_run_font(sr, size=12, color="555555")
meta = [
["适用系统", "景耀 JY1.0 MES 前端Vue 2 + Element UI及 ASP.NET .ashx 后端"],
["数据库范围", "测试库 ERPTOOL_JY_20250826Back正式库 ERPTOOL_JY 上线前同步评审"],
["方案版本", "V1.0"],
["生成时间", MOD_TIME],
]
add_table(doc, ["项目", "说明"], meta, [1.5, 5.0])
add_callout(
doc,
"核心结论",
"建议采用“两步走”:第一阶段先做订单补货可溯源、当前工序高亮、机台任务看板三项可视化闭环;第二阶段在数据稳定后接入有限产能、交期、设备状态、工序前后置约束的自动排产建议。这样能最大限度复用现有页面和 MESCommonBase.ashx 通信模式,避免一次性重构带来的风险。",
)
add_heading(doc, "一、现有系统依据")
add_para(doc, "本次方案基于代码结构和现有业务链路梳理,重点参考以下模块:")
for item in [
"仓储补货src/views/WarehouseManagement/Replenishment/index.vue已具备报缺补货、外购/自制补货中间表、提交补货、补货期限、补货图片、打回通知等能力。",
"销售订单src/views/SalesManagement/OrderInquiry/index.vue 与 OrderRelease/index.vue已具备订单编号、合同类型、补货明细查询/修改、订单投产、订单分配等能力。",
"销售合同src/views/SalesManagement/SalesContractNew/index.vue 与 ContractSearchNew/index.vue已具备合同编号、项目流水号、客户、合同状态和资料留存等合同主数据能力。",
"生产计划src/views/SeikoWorkshop/ProductionPlan/index.vue已具备月度计划、状态、完成率、OP010-OP110 工序列和可视化看板雏形。",
"生产任务查询与追溯src/views/SeikoWorkshop/ProductionTaskQuery/index.vue已具备任务状态、派工、零件追溯、工序明细、加工设备和工序状态变色能力。",
"生产执行/派工src/views/SeikoWorkshop/ProductionExecution/index.vue已具备设备查询、工序信息查询、工序编辑及派工、上移/下移/插入/删除工序、工艺保存派工等能力。",
"设备监控src/views/SeikoWorkshop/EquipmentMonitoringNew/index.vue 与 ManufacturingCenter/EquipmentMonitoringNew/index.vue已具备设备状态展示和设备状态分布图基础。",
]:
add_bullet(doc, item)
add_heading(doc, "二、目标与边界")
add_para(doc, "本方案优先解决“计划看得见、任务找得到、来源追得回”的排产基础问题,再逐步进入算法优化。")
add_table(
doc,
["目标", "说明", "优先级"],
[
["补货订单可溯源", "创建补货订单时必须关联销售合同或销售订单,后续可从补货单反查合同、客户、订单、零件、需求来源。", "P0"],
["当前工序凸显", "生产计划和任务查询中对正在加工/待处理的当前工序做高亮、标签和进度提示,减少人工查找。", "P0"],
["机台任务显示", "按设备/工位展示当前任务、下一任务、排队任务、预计开完工、异常状态,为排产调整提供现场视角。", "P1"],
["排产算法建议", "在数据字段稳定后,按交期、工序顺序、设备能力、在制数量、设备状态给出推荐排产。", "P2"],
],
[1.25, 4.2, 1.05],
)
add_heading(doc, "三、方案一:补货订单关联销售合同")
add_para(doc, "现状:补货页面已能按物料选择补货并提交,但补货提交参数当前主要围绕“是否外购、操作者、补货期限、订单备注”;需求明细弹窗已能展示订单编号、需求量、客户。建议在补货创建时把合同/订单来源显式固化。")
add_number(doc, "在补货单提交弹窗中增加“关联销售合同”选择框,支持合同编号、客户、订单编号模糊查询。")
add_number(doc, "选择合同后,联动显示该合同下未完成订单;如用户从需求量明细进入,可自动带入订单编号和合同编号。")
add_number(doc, "补货中间表增加合同与订单字段,选入物料时即记录来源;提交生成补货单时把来源写入补货单主表和明细表。")
add_number(doc, "补货查询、新补货查询、销售订单补货明细中增加合同编号、客户名称、来源订单编号列,并提供跳转到合同查询/订单查询的入口。")
add_table(
doc,
["位置", "建议字段/控件", "处理逻辑"],
[
["补货创建弹窗", "关联销售合同、来源订单编号、客户名称", "提交前必填;若为安全库存补货可选择“库存备货”,但需填写备货原因。"],
["补货中间表", "项目流水号、合同编号、订单流水号、订单编号、来源类型", "选入物料时写入,选出时同步清理。"],
["补货单主表/明细表", "补货单号、合同编号、订单编号、客户名称、补货原因", "生成正式补货单后用于追溯、看板统计和报表导出。"],
["订单查询", "补货明细关联合同", "现有“订单信息_补货明细_查询/修改”扩展返回字段。"],
],
[1.35, 2.0, 3.15],
)
add_heading(doc, "四、方案二:生产计划当前工序高亮")
add_para(doc, "现状:生产计划已有 OP010-OP110 横向工序列,生产任务查询的工序明细已有 tableRowClassName1 变色逻辑,完成工序会显示为蓝色背景。建议扩展为“已完成、正在进行、待开始、异常/超期”四类视觉状态。")
add_table(
doc,
["状态", "判断规则", "前端表现"],
[
["已完成", "工序状态大于完成阈值、存在加工完成时间或完成状态=1", "浅蓝底 + 完成标签"],
["正在进行", "存在开始加工时间且无完成时间;或工序状态=加工中", "绿色高亮边框/底色 + “当前”标签"],
["待开始", "前序已完成、本工序未开始", "淡黄底 + “待加工”标签"],
["异常/超期", "超过精工期限、设备停机、暂停时间过长、质检不良待处理", "红色文字/标签 + 置顶或筛选项"],
],
[1.2, 3.2, 2.1],
)
add_para(doc, "前端建议:在 ProductionPlan 的 OP 列中增加 scoped-slot根据后端返回的“当前工序顺序/当前工序状态/当前设备”或前端解析后的状态决定 class在 ProductionTaskQuery 的工序追溯弹窗中把“当前工序”与“已完成工序”区分开。")
add_para(doc, "后端建议:生产计划查询过程返回 当前工序顺序、当前工序名称、当前工序状态、当前设备、当前操作者、计划开始、计划完成、实际开始、实际完成、是否超期。前端只负责展示,不在页面内重复推导复杂状态。")
add_heading(doc, "五、方案三:机台生产任务显示")
add_para(doc, "现状:生产执行已有设备下拉和工序派工,设备监控已有设备状态分布图,但缺少按机台汇总的“当前正在做什么、后面排了什么”。建议新增“机台任务看板”,可挂在精工车间或设备监控模块下。")
add_table(
doc,
["看板区块", "显示内容", "数据来源建议"],
[
["机台卡片", "设备名称/工位号、设备状态、当前订单、零件、图号、当前工序、操作者、已完成/计划数量", "基础数据_设备工位点检表 + 车间生产管理_零件工序_视图 + 完成过程情况"],
["当前任务", "正在加工任务、开始时间、已用时、预计剩余、是否超期", "工序完成过程情况、工序状态、设备状态"],
["排队任务", "下一道/后续任务,按交期、优先级、工序顺序排序", "派工表/工艺计划表/生产计划查询过程"],
["异常提示", "停机、暂停、质检不良、缺料、未派设备、超期", "设备状态、质检、仓储需求、任务状态"],
["操作入口", "跳转生产任务查询、工序追溯、生产执行派工", "保持现有路由跳转方式"],
],
[1.25, 2.75, 2.5],
)
add_para(doc, "第一版建议只做展示和筛选,不直接在看板上拖拽改排产;待现场认可数据准确性后,再开放“调整设备/调整顺序/插单”的受控操作。")
add_heading(doc, "六、数据库与接口改造建议")
add_table(
doc,
["类型", "名称建议", "用途"],
[
["查询", "仓储管理_补货关联合同_查询数据", "按合同编号、客户、订单编号查询可关联的销售合同/订单。"],
["编辑", "报缺补货_选入_带来源", "在选入补货物料时同步写入项目流水号、合同编号、订单流水号、订单编号。"],
["编辑", "报缺补货_提交_带来源", "提交补货单时校验合同/订单来源并写入正式单据。"],
["查询", "车间生产管理_生产计划_查询数据", "扩展返回当前工序、当前设备、工序状态码、计划/实际时间等字段。"],
["查询", "精工车间_机台任务看板_查询数据", "按设备/工位汇总当前任务和排队任务。"],
],
[1.1, 2.4, 3.0],
)
add_para(doc, "所有接口继续走 MESCommonBase.ashx前端仍使用 this.CreateData 和 this.ExecDatabase参数仍按 key=value 字符串规则由全局方法生成,避免新增 Axios 封装。")
add_heading(doc, "七、前端改造建议")
add_bullet(doc, "WarehouseManagement/Replenishment提交弹窗增加合同选择、来源订单选择、备货原因表格右侧补货单增加合同编号/订单编号隐藏列或 tooltip。")
add_bullet(doc, "WarehouseManagement/NewReplenishmentQuery增加合同编号、订单编号、客户名称列和筛选条件补货单号点击可查看来源。")
add_bullet(doc, "SalesManagement/OrderInquiry补货明细弹窗增加合同关联和修改记录展示补货订单可反跳补货查询。")
add_bullet(doc, "SeikoWorkshop/ProductionPlanOP 列改为状态单元格,增加当前工序高亮;看板图表增加按设备、按当前工序、按超期统计。")
add_bullet(doc, "SeikoWorkshop/ProductionTaskQuery工序追溯弹窗区分当前工序、已完成工序、待开始工序、异常工序。")
add_bullet(doc, "SeikoWorkshop 或 DeviceManagement新增机台任务看板页面沿用 app-container > el-card > 搜索栏 + 表格/卡片布局。")
add_heading(doc, "八、实施阶段")
add_table(
doc,
["阶段", "范围", "交付物", "建议周期"],
[
["阶段1", "补货订单关联合同/订单;补货查询追溯字段", "数据库字段、接口、补货页面、查询页面", "2-4天"],
["阶段2", "生产计划当前工序高亮;任务查询工序状态优化", "生产计划 OP 状态单元格、工序追溯弹窗优化", "2-3天"],
["阶段3", "机台任务看板", "设备筛选、当前任务、排队任务、异常提示、跳转入口", "4-6天"],
["阶段4", "排产算法建议", "规则配置、推荐顺序、人工确认、调整记录", "视规则复杂度评估"],
],
[1.0, 2.35, 2.2, 0.95],
)
add_heading(doc, "九、验收标准")
for item in [
"创建补货订单时,除库存备货场景外,必须能看到并保存销售合同/订单来源。",
"从补货查询能反查到合同编号、客户、订单编号、物料、补货数量、补货人、补货期限和当前状态。",
"生产计划列表中当前工序一眼可识别,且已完成、待开始、异常状态不会混淆。",
"机台任务看板能按设备查看当前任务和后续任务,当前任务字段与生产任务查询一致。",
"所有新增接口均遵循 MESCommonBase.ashx + CreateData/ExecDatabase 模式,正式库上线前在测试库完成验证。",
"所有新增代码注释和文档末尾记录满足“修改人:Ld 修改时间”规则。",
]:
add_bullet(doc, item)
add_heading(doc, "十、需要业务补充确认的问题")
for item in [
"补货订单是否必须关联“销售合同”,还是关联到“销售订单/订单编号”即可,合同通过订单反推?建议两者都保存,页面主选订单、自动带出合同。",
"安全库存补货、备品备件补货是否允许没有销售合同?如果允许,需要定义来源类型和审批/备注要求。",
"当前工序的业务定义:以“已开始未完成”为准,还是以前序完成后下一道未开始为准?建议同时显示“正在加工”和“下一待加工”。",
"机台任务看板需要显示哪些设备范围:仅精工车间设备,还是包含装配/外协/仓储相关工位?",
"是否需要在第一版支持手动调整机台任务顺序?建议第一版只展示,第二版再加受控调整和操作日志。",
"排产优先级规则:交期优先、客户优先、订单加急、设备能力、换型成本、工序等待时间,各项权重需业务确认。",
]:
add_bullet(doc, item)
add_heading(doc, "十一、推荐落地口径")
add_para(doc, "建议第一版不要直接宣传为“自动排产”,而定义为“排产可视化与任务追溯增强”。先把补货来源、当前工序、机台任务三块数据打通,现场使用一周后再根据实际反馈调整排产规则。这样既能快速解决当前痛点,也能为后续真正的排产优化算法沉淀可靠数据。")
add_para(doc, f"修改人:Ld 修改时间:{MOD_TIME};")
doc.save(OUTPUT)
if __name__ == "__main__":
main()