@qinsilk/scm-agent-tools 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -2
- package/cli/api.js +114 -0
- package/cli/commands/data.js +112 -0
- package/cli/commands/docs.js +121 -0
- package/cli/commands/log.js +152 -0
- package/cli/commands/query.js +285 -0
- package/cli/commands/report.js +213 -0
- package/cli/commands/staff.js +505 -0
- package/cli/config.js +46 -0
- package/cli/datasets.js +541 -0
- package/cli/scm-agent.js +110 -0
- package/cli/skills.js +89 -0
- package/cli/table.js +43 -0
- package/docs/api.md +2067 -0
- package/docs/cli.md +252 -0
- package/package.json +27 -4
- package/reports/excel.js +107 -0
- package/reports/factoryEvaluation.js +128 -0
- package/reports/goodsBom.js +648 -0
- package/reports/goodsFirstOrder.js +409 -0
- package/reports/goodsInventory.js +220 -0
- package/reports/goodsSize.js +440 -0
- package/reports/image.js +216 -0
- package/reports/leakCheck.js +694 -0
- package/reports/materialPurchaseExport.js +393 -0
- package/reports/materialTransit.js +593 -0
- package/reports/processFollowup.js +312 -0
- package/reports/produceBoard.js +353 -0
- package/reports/produceCost.js +366 -0
- package/reports/produceCostDetail.js +622 -0
- package/reports/produceDaily.js +485 -0
- package/reports/storeInGoods.js +276 -0
- package/reports/supplierBalance.js +671 -0
- package/reports/ticketStatistics.js +289 -0
- package/reports/util.js +83 -0
- package/skills/bom/345/225/206/345/223/201/344/277/241/346/201/257/SKILL.md +40 -0
- package/skills/qinsilk-scm/SKILL.md +126 -0
- package/skills//344/276/233/345/272/224/345/225/206/345/257/271/350/264/246/345/257/274/345/207/272/SKILL.md +38 -0
- package/skills//345/225/206/345/223/201/345/260/272/345/257/270/344/277/241/346/201/257/SKILL.md +40 -0
- package/skills//345/225/206/345/223/201/351/246/226/345/215/225/351/235/242/346/226/231/345/267/245/345/272/217/345/215/225/344/273/267/SKILL.md +39 -0
- package/skills//345/267/245/345/216/202/350/257/204/344/274/260/346/212/245/350/241/250/SKILL.md +39 -0
- package/skills//346/210/220/345/223/201/345/205/245/345/272/223/346/212/245/350/241/250/SKILL.md +40 -0
- package/skills//346/234/215/350/243/205/346/210/220/345/223/201/347/233/230/345/255/230/350/241/250/SKILL.md +39 -0
- package/skills//346/274/217/346/226/231/346/243/200/346/265/213/346/227/245/346/212/245/SKILL.md +40 -0
- package/skills//347/211/251/346/226/231/345/234/250/351/200/224/347/212/266/346/200/201/346/212/245/350/241/250/SKILL.md +40 -0
- package/skills//347/211/251/346/226/231/351/207/207/350/264/255/345/257/274/345/207/272/SKILL.md +39 -0
- package/skills//347/224/237/344/272/247/345/215/225/345/267/245/345/272/217/350/267/237/350/277/233/350/241/250/SKILL.md +39 -0
- package/skills//347/224/237/344/272/247/346/210/220/346/234/254/346/212/245/350/241/250/SKILL.md +41 -0
- package/skills//347/224/237/344/272/247/346/210/220/346/234/254/346/212/245/350/241/250/346/230/216/347/273/206/SKILL.md +40 -0
- package/skills//347/224/237/344/272/247/346/227/245/346/212/245/SKILL.md +42 -0
- package/skills//347/224/237/344/272/247/347/212/266/345/206/265/347/273/237/350/256/241/350/241/250/SKILL.md +39 -0
- package/skills//347/224/237/344/272/247/350/212/202/347/202/271/347/234/213/346/235/277/SKILL.md +39 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// 四组业务命令:商品、物料、生产单、物料采购单。design 命令族查询设计款与 IE 核价,
|
|
2
|
+
// design-order 命令族查询版单(旗舰版功能)。
|
|
3
|
+
// 每个命令默认输出人类可读表格;全局 --json 时输出原始 JSON(供 AI 解析)。
|
|
4
|
+
const { call } = require('../api');
|
|
5
|
+
const { printTable } = require('../table');
|
|
6
|
+
|
|
7
|
+
const goods = {
|
|
8
|
+
command: 'goods',
|
|
9
|
+
describe: '查询商品',
|
|
10
|
+
builder(yargs) {
|
|
11
|
+
return yargs
|
|
12
|
+
.command({
|
|
13
|
+
command: 'search',
|
|
14
|
+
describe: '按款号/名称/条码搜商品',
|
|
15
|
+
builder: (y) => y.option('name', { describe: '搜索关键词(款号、名称或条码)', demandOption: true, type: 'string' }),
|
|
16
|
+
handler: (argv) => run(argv, async () => {
|
|
17
|
+
const data = await call('GET', '/api/agent/v1/goods/search', { searchKey: argv.name, page: argv.page, limit: argv.limit });
|
|
18
|
+
return { list: data.list, total: data.total, columns: [
|
|
19
|
+
{ field: 'goodsSn', label: '款号' },
|
|
20
|
+
{ field: 'name', label: '名称' },
|
|
21
|
+
{ field: 'isOnSale', label: '上架(1是0否)' },
|
|
22
|
+
{ field: 'tagPrice', label: '吊牌价' },
|
|
23
|
+
{ field: 'storedNumber', label: '库存' },
|
|
24
|
+
{ field: 'produceNumber', label: '生产中' },
|
|
25
|
+
{ field: 'produceOrderNumber', label: '生产单数' },
|
|
26
|
+
] };
|
|
27
|
+
}),
|
|
28
|
+
})
|
|
29
|
+
.command({
|
|
30
|
+
command: 'detail',
|
|
31
|
+
describe: '商品详情(颜色尺码与工序)',
|
|
32
|
+
builder: (y) => y.option('id', { describe: '商品id(先用 search 查到)', demandOption: true, type: 'number' }),
|
|
33
|
+
handler: (argv) => run(argv, async () => {
|
|
34
|
+
const data = await call('GET', '/api/agent/v1/goods/detail', { goodsId: argv.id });
|
|
35
|
+
return { data, columns: null };
|
|
36
|
+
}),
|
|
37
|
+
})
|
|
38
|
+
.demandCommand(1, '请指定子命令:search 或 detail');
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const material = {
|
|
43
|
+
command: 'material',
|
|
44
|
+
describe: '查询物料',
|
|
45
|
+
builder(yargs) {
|
|
46
|
+
return yargs
|
|
47
|
+
.command({
|
|
48
|
+
command: 'search',
|
|
49
|
+
describe: '按名称/货号/条码搜物料',
|
|
50
|
+
builder: (y) => y.option('name', { describe: '搜索关键词(物料名称、货号或条码)', demandOption: true, type: 'string' }),
|
|
51
|
+
handler: (argv) => run(argv, async () => {
|
|
52
|
+
const data = await call('GET', '/api/agent/v1/material/search', { searchKey: argv.name, page: argv.page, limit: argv.limit });
|
|
53
|
+
return { list: data.list, total: data.total, columns: [
|
|
54
|
+
{ field: 'sn', label: '货号' },
|
|
55
|
+
{ field: 'name', label: '名称' },
|
|
56
|
+
{ field: 'type', label: '类型(1面料0辅料)' },
|
|
57
|
+
{ field: 'state', label: '状态(1启用)' },
|
|
58
|
+
{ field: 'price', label: '价格' },
|
|
59
|
+
{ field: 'stockNumber', label: '库存' },
|
|
60
|
+
{ field: 'defaultSupplierName', label: '默认供应商' },
|
|
61
|
+
] };
|
|
62
|
+
}),
|
|
63
|
+
})
|
|
64
|
+
.command({
|
|
65
|
+
command: 'detail',
|
|
66
|
+
describe: '物料详情(单品颜色规格)',
|
|
67
|
+
builder: (y) => y.option('id', { describe: '物料id(先用 search 查到)', demandOption: true, type: 'number' }),
|
|
68
|
+
handler: (argv) => run(argv, async () => {
|
|
69
|
+
const data = await call('GET', '/api/agent/v1/material/detail', { id: argv.id });
|
|
70
|
+
return { data, columns: null };
|
|
71
|
+
}),
|
|
72
|
+
})
|
|
73
|
+
.demandCommand(1, '请指定子命令:search 或 detail');
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const produce = {
|
|
78
|
+
command: 'produce',
|
|
79
|
+
describe: '查询生产单',
|
|
80
|
+
builder(yargs) {
|
|
81
|
+
return yargs
|
|
82
|
+
.command({
|
|
83
|
+
command: 'list',
|
|
84
|
+
describe: '生产单列表(至少给一项条件)',
|
|
85
|
+
builder: (y) => y
|
|
86
|
+
.option('sn', { describe: '关键词:单号/款号/商品名', type: 'string' })
|
|
87
|
+
.option('state', { describe: '状态:1草稿 2生产中 3生产完成 4待生产 9已撤销', type: 'number' })
|
|
88
|
+
.option('from', { describe: '业务日期起(yyyy-MM-dd)', type: 'string' })
|
|
89
|
+
.option('to', { describe: '业务日期止(yyyy-MM-dd)', type: 'string' }),
|
|
90
|
+
handler: (argv) => run(argv, async () => {
|
|
91
|
+
const data = await call('GET', '/api/agent/v1/produce/list', { searchKey: argv.sn, state: argv.state, from: argv.from, to: argv.to, page: argv.page, limit: argv.limit });
|
|
92
|
+
return { list: data.list, total: data.total, columns: [
|
|
93
|
+
{ field: 'ordersSn', label: '生产单号' },
|
|
94
|
+
{ field: 'goodsSn', label: '款号' },
|
|
95
|
+
{ field: 'goodsName', label: '商品' },
|
|
96
|
+
{ field: 'stateName', label: '状态' },
|
|
97
|
+
{ field: 'sumNumber', label: '下单数' },
|
|
98
|
+
{ field: 'sumInNumber', label: '入库数' },
|
|
99
|
+
{ field: 'deliveryTime', label: '交期' },
|
|
100
|
+
{ field: 'cutBedState', label: '裁床状态' },
|
|
101
|
+
] };
|
|
102
|
+
}),
|
|
103
|
+
})
|
|
104
|
+
.command({
|
|
105
|
+
command: 'detail',
|
|
106
|
+
describe: '生产单详情(明细与工序进度,裁床工序 core=2)',
|
|
107
|
+
builder: (y) => y.option('sn', { describe: '生产单号', demandOption: true, type: 'string' }),
|
|
108
|
+
handler: (argv) => run(argv, async () => {
|
|
109
|
+
const data = await call('GET', '/api/agent/v1/produce/detail', { sn: argv.sn });
|
|
110
|
+
return { data, columns: null };
|
|
111
|
+
}),
|
|
112
|
+
})
|
|
113
|
+
.demandCommand(1, '请指定子命令:list 或 detail');
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const materialPurchase = {
|
|
118
|
+
command: 'material-purchase',
|
|
119
|
+
describe: '查询物料采购单',
|
|
120
|
+
builder(yargs) {
|
|
121
|
+
return yargs
|
|
122
|
+
.command({
|
|
123
|
+
command: 'list',
|
|
124
|
+
describe: '物料采购单列表(至少给一项条件)',
|
|
125
|
+
builder: (y) => y
|
|
126
|
+
.option('sn', { describe: '关键词:单号/供应商/生产单号/物料', type: 'string' })
|
|
127
|
+
.option('state', { describe: '状态:1草稿 2待入库 3部分入库 4全部入库 9撤销', type: 'number' })
|
|
128
|
+
.option('from', { describe: '业务日期起(yyyy-MM-dd)', type: 'string' })
|
|
129
|
+
.option('to', { describe: '业务日期止(yyyy-MM-dd)', type: 'string' }),
|
|
130
|
+
handler: (argv) => run(argv, async () => {
|
|
131
|
+
const data = await call('GET', '/api/agent/v1/material-purchase/list', { searchKey: argv.sn, state: argv.state, from: argv.from, to: argv.to, page: argv.page, limit: argv.limit });
|
|
132
|
+
return { list: data.list, total: data.total, columns: [
|
|
133
|
+
{ field: 'ordersSn', label: '采购单号' },
|
|
134
|
+
{ field: 'supplierName', label: '供应商' },
|
|
135
|
+
{ field: 'state', label: '状态' },
|
|
136
|
+
{ field: 'sumPurchaseNumber', label: '采购数' },
|
|
137
|
+
{ field: 'amount', label: '金额' },
|
|
138
|
+
{ field: 'expectTime', label: '预计到料' },
|
|
139
|
+
] };
|
|
140
|
+
}),
|
|
141
|
+
})
|
|
142
|
+
.command({
|
|
143
|
+
command: 'detail',
|
|
144
|
+
describe: '物料采购单详情(物料明细)',
|
|
145
|
+
builder: (y) => y.option('sn', { describe: '采购单号', demandOption: true, type: 'string' }),
|
|
146
|
+
handler: (argv) => run(argv, async () => {
|
|
147
|
+
const data = await call('GET', '/api/agent/v1/material-purchase/detail', { sn: argv.sn });
|
|
148
|
+
return { data, columns: null };
|
|
149
|
+
}),
|
|
150
|
+
})
|
|
151
|
+
.demandCommand(1, '请指定子命令:list 或 detail');
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const design = {
|
|
156
|
+
command: 'design',
|
|
157
|
+
describe: '查询设计款与IE核价',
|
|
158
|
+
builder(yargs) {
|
|
159
|
+
return yargs
|
|
160
|
+
.command({
|
|
161
|
+
command: 'list',
|
|
162
|
+
describe: '设计款列表(至少给一项条件)',
|
|
163
|
+
builder: (y) => y
|
|
164
|
+
.option('sn', { describe: '关键词:款号/名称/条码/货号', type: 'string' })
|
|
165
|
+
.option('state', { describe: '状态:2设计中 3待确定 4修改中 5审核通过 6取消 15开发池 16版型资产库', type: 'number' })
|
|
166
|
+
.option('dateType', { describe: '日期字段:update更新 create创建 dev开发(默认 update)', type: 'string', default: 'update' })
|
|
167
|
+
.option('from', { describe: '日期起(yyyy-MM-dd)', type: 'string' })
|
|
168
|
+
.option('to', { describe: '日期止(yyyy-MM-dd)', type: 'string' }),
|
|
169
|
+
handler: (argv) => run(argv, async () => {
|
|
170
|
+
const data = await call('GET', '/api/agent/v1/design/list', { searchKey: argv.sn, designState: argv.state, dateType: argv.dateType, from: argv.from, to: argv.to, page: argv.page, limit: argv.limit });
|
|
171
|
+
return { list: data.list, total: data.total, columns: [
|
|
172
|
+
{ field: 'designSn', label: '款号' },
|
|
173
|
+
{ field: 'name', label: '名称' },
|
|
174
|
+
{ field: 'designState', label: '状态(2设计中3待确定4修改中5审核通过6取消15开发池16版型资产库)' },
|
|
175
|
+
{ field: 'designBrandName', label: '品牌' },
|
|
176
|
+
{ field: 'designCategoryName', label: '分类' },
|
|
177
|
+
{ field: 'designDesignerName', label: '设计师' },
|
|
178
|
+
{ field: 'followerName', label: '跟单员' },
|
|
179
|
+
{ field: 'costPrice', label: '成本价' },
|
|
180
|
+
{ field: 'designStoredNumber', label: '库存' },
|
|
181
|
+
{ field: 'designOrderCount', label: '板单数' },
|
|
182
|
+
] };
|
|
183
|
+
}),
|
|
184
|
+
})
|
|
185
|
+
.command({
|
|
186
|
+
command: 'ie-list',
|
|
187
|
+
describe: 'IE核价报表(设计款×颜色的物料/工序/费用明细)',
|
|
188
|
+
builder: (y) => y
|
|
189
|
+
.option('sn', { describe: '关键词:名称/货号/款号/条码', type: 'string' })
|
|
190
|
+
.option('dateType', { describe: '日期字段:dev开发 create创建(默认 dev)', type: 'string', default: 'dev' })
|
|
191
|
+
.option('from', { describe: '日期起(yyyy-MM-dd)', type: 'string' })
|
|
192
|
+
.option('to', { describe: '日期止(yyyy-MM-dd)', type: 'string' }),
|
|
193
|
+
handler: (argv) => run(argv, async () => {
|
|
194
|
+
const data = await call('GET', '/api/agent/v1/design/ie-list', { searchKey: argv.sn, dateType: argv.dateType, from: argv.from, to: argv.to, page: argv.page, limit: argv.limit });
|
|
195
|
+
return { list: data.list, total: data.total, columns: [
|
|
196
|
+
{ field: 'designSn', label: '款号' },
|
|
197
|
+
{ field: 'name', label: '名称' },
|
|
198
|
+
{ field: 'colorName', label: '颜色' },
|
|
199
|
+
{ field: 'costPrice', label: '成本价' },
|
|
200
|
+
{ field: 'designerName', label: '设计师' },
|
|
201
|
+
] };
|
|
202
|
+
}),
|
|
203
|
+
})
|
|
204
|
+
.demandCommand(1, '请指定子命令:list 或 ie-list');
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const designOrder = {
|
|
209
|
+
command: 'design-order',
|
|
210
|
+
describe: '查询版单(旗舰版功能)',
|
|
211
|
+
builder(yargs) {
|
|
212
|
+
return yargs
|
|
213
|
+
.command({
|
|
214
|
+
command: 'list',
|
|
215
|
+
describe: '版单列表(至少给一项条件)',
|
|
216
|
+
builder: (y) => y
|
|
217
|
+
.option('sn', { describe: '关键词:款号/名称/版单号/备注/货号', type: 'string' })
|
|
218
|
+
.option('states', { describe: '版单状态(逗号分隔):1未开始 2进行中 3已结束 4废版 9撤销 10审批中 12审批拒绝', type: 'string' })
|
|
219
|
+
.option('review-state', { describe: '审版状态:2未设置审版 3待审 4已审', type: 'number' })
|
|
220
|
+
.option('node', { describe: '当前节点名称,如:纸样、车板', type: 'string' })
|
|
221
|
+
.option('overdue', { describe: '逾期筛选:pattern纸样逾期 sweep车版逾期', type: 'string' })
|
|
222
|
+
.option('dateType', { describe: '日期字段:business下版(默认) create创建 update更新 finish预计完成 delivery交付', type: 'string', default: 'business' })
|
|
223
|
+
.option('from', { describe: '日期起(yyyy-MM-dd)', type: 'string' })
|
|
224
|
+
.option('to', { describe: '日期止(yyyy-MM-dd)', type: 'string' }),
|
|
225
|
+
handler: (argv) => run(argv, async () => {
|
|
226
|
+
const data = await call('GET', '/api/agent/v1/design-order/list', {
|
|
227
|
+
searchKey: argv.sn, states: argv.states, reviewState: argv.reviewState,
|
|
228
|
+
node: argv.node, overdue: argv.overdue, dateType: argv.dateType,
|
|
229
|
+
from: argv.from, to: argv.to, page: argv.page, limit: argv.limit,
|
|
230
|
+
});
|
|
231
|
+
return { list: data.list, total: data.total, columns: [
|
|
232
|
+
{ field: 'designOrderSn', label: '版单号' },
|
|
233
|
+
{ field: 'designSn', label: '款号' },
|
|
234
|
+
{ field: 'designName', label: '名称' },
|
|
235
|
+
{ field: 'stateText', label: '状态' },
|
|
236
|
+
{ field: 'currentProgressState', label: '当前节点' },
|
|
237
|
+
{ field: 'designOrderSerialName', label: '版次' },
|
|
238
|
+
{ field: 'businessTime', label: '下版日期' },
|
|
239
|
+
{ field: 'finishTime', label: '预计完成' },
|
|
240
|
+
{ field: 'totalNumber', label: '打版数' },
|
|
241
|
+
{ field: 'supplierName', label: '供应商' },
|
|
242
|
+
] };
|
|
243
|
+
}),
|
|
244
|
+
})
|
|
245
|
+
.command({
|
|
246
|
+
command: 'detail',
|
|
247
|
+
describe: '版单详情(打版数量、节点进度、BOM、工艺要求、同款全部版单)',
|
|
248
|
+
builder: (y) => y
|
|
249
|
+
.option('sn', { describe: '版单号', type: 'string' })
|
|
250
|
+
.option('id', { describe: '版单id(先用 list 查到)', type: 'number' }),
|
|
251
|
+
handler: (argv) => run(argv, async () => {
|
|
252
|
+
if (!argv.sn && !argv.id) {
|
|
253
|
+
throw new Error('请提供版单号 --sn 或版单 id --id(二选一)');
|
|
254
|
+
}
|
|
255
|
+
const data = await call('GET', '/api/agent/v1/design-order/detail', { sn: argv.sn, id: argv.id });
|
|
256
|
+
return { data, columns: null };
|
|
257
|
+
}),
|
|
258
|
+
})
|
|
259
|
+
.demandCommand(1, '请指定子命令:list 或 detail');
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
/** 统一执行:异常输出可读文案并以非 0 退出;--json 输出原始数据 */
|
|
264
|
+
async function run(argv, task) {
|
|
265
|
+
try {
|
|
266
|
+
const { list, total, columns, data } = await task();
|
|
267
|
+
if (argv.json) {
|
|
268
|
+
console.log(JSON.stringify({ total, list, data }, null, 2));
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (columns) {
|
|
272
|
+
if (total !== undefined) {
|
|
273
|
+
console.log(`共 ${total} 条,当前显示 ${list.length} 条`);
|
|
274
|
+
}
|
|
275
|
+
printTable(list, columns);
|
|
276
|
+
} else {
|
|
277
|
+
console.log(JSON.stringify(data, null, 2));
|
|
278
|
+
}
|
|
279
|
+
} catch (e) {
|
|
280
|
+
console.error(`错误:${e.message}`);
|
|
281
|
+
process.exitCode = 1;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
module.exports = { goods, material, produce, materialPurchase, design, designOrder };
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// 官方报表命令族:16 个报表子命令,每个子命令对应 reports/ 下一个生成模块
|
|
2
|
+
// 与一个官方技能(skills/ 下同名中文技能)。命令负责解析参数与输出结果,
|
|
3
|
+
// 数据获取与文件生成全部在 reports/ 模块内完成。
|
|
4
|
+
// 生成逻辑从原 Python 报表脚本逐列移植,列序、列名、标色、文件名保持一致。
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
/** 报表定义清单:命令名、模块名、参数说明。新增报表时在此登记。 */
|
|
8
|
+
const REPORTS = [
|
|
9
|
+
{
|
|
10
|
+
command: 'produce-daily',
|
|
11
|
+
module: 'produceDaily',
|
|
12
|
+
describe: '生成生产日报 HTML(今日入库、计划出货、生产状态、未齐料风险)',
|
|
13
|
+
options: [
|
|
14
|
+
['date', '日报日期 yyyy-MM-dd,默认今天', 'string'],
|
|
15
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
command: 'produce-board',
|
|
20
|
+
module: 'produceBoard',
|
|
21
|
+
describe: '生成生产节点看板 HTML(近 N 天生产单按工序节点排布)',
|
|
22
|
+
options: [
|
|
23
|
+
['days', '统计天数,默认 7', 'number'],
|
|
24
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
command: 'store-in-goods',
|
|
29
|
+
module: 'storeInGoods',
|
|
30
|
+
describe: '生成成品入库报表 Excel(列与页面导出一致,嵌单品图)',
|
|
31
|
+
options: [
|
|
32
|
+
['from', '业务日期起 yyyy-MM-dd', 'string'],
|
|
33
|
+
['to', '业务日期止 yyyy-MM-dd', 'string'],
|
|
34
|
+
['sn', '单号关键词', 'string'],
|
|
35
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
command: 'factory-evaluation',
|
|
40
|
+
module: 'factoryEvaluation',
|
|
41
|
+
describe: '生成工厂评估报表 Excel(按加工厂汇总单数、裁床数、完成件数、按时交货率)',
|
|
42
|
+
options: [
|
|
43
|
+
['from', '日期起 yyyy-MM-dd,默认一个月前', 'string'],
|
|
44
|
+
['to', '日期止 yyyy-MM-dd,默认今天', 'string'],
|
|
45
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
command: 'produce-cost',
|
|
50
|
+
module: 'produceCost',
|
|
51
|
+
describe: '生成生产成本报表 Excel(42 列 + 六类成本差异 + 款式图)',
|
|
52
|
+
options: [
|
|
53
|
+
['from', '日期起 yyyy-MM-dd', 'string'],
|
|
54
|
+
['to', '日期止 yyyy-MM-dd', 'string'],
|
|
55
|
+
['state', '状态筛选,逗号分隔,默认 4,2,3', 'string'],
|
|
56
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
command: 'produce-cost-detail',
|
|
61
|
+
module: 'produceCostDetail',
|
|
62
|
+
describe: '生成生产成本报表明细(每个生产单一个 Excel,含五类成本明细)',
|
|
63
|
+
options: [
|
|
64
|
+
['from', '日期起 yyyy-MM-dd', 'string'],
|
|
65
|
+
['to', '日期止 yyyy-MM-dd', 'string'],
|
|
66
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
command: 'material-transit',
|
|
71
|
+
module: 'materialTransit',
|
|
72
|
+
describe: '生成物料在途状态报表 Excel(采购在途/已入库未发料/物料缺口三 sheet)',
|
|
73
|
+
options: [
|
|
74
|
+
['days', '统计天数,默认 90', 'number'],
|
|
75
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
command: 'material-purchase-export',
|
|
80
|
+
module: 'materialPurchaseExport',
|
|
81
|
+
describe: '生成物料采购导出 Excel(近三个月物料采购子单,39 个业务列)',
|
|
82
|
+
options: [
|
|
83
|
+
['from', '业务日期起 yyyy-MM-dd,默认三个月前', 'string'],
|
|
84
|
+
['to', '业务日期止 yyyy-MM-dd,默认今天', 'string'],
|
|
85
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
command: 'supplier-balance',
|
|
90
|
+
module: 'supplierBalance',
|
|
91
|
+
describe: '生成供应商对账 Excel(11 表对账单,每供应商一个文件)',
|
|
92
|
+
options: [
|
|
93
|
+
['supplier', '供应商名称(不传则全部供应商)', 'string'],
|
|
94
|
+
['from', '对账日期起 yyyy-MM-dd', 'string'],
|
|
95
|
+
['to', '对账日期止 yyyy-MM-dd', 'string'],
|
|
96
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
command: 'leak-check',
|
|
101
|
+
module: 'leakCheck',
|
|
102
|
+
describe: '生成漏料检测日报(每生产单一个「物料数据」Excel,默认隐藏 0 用量行)',
|
|
103
|
+
options: [
|
|
104
|
+
['limit', '最多处理的生产单数,默认 100', 'number'],
|
|
105
|
+
['include-zero', '包含 0 用量行(默认隐藏)', 'boolean'],
|
|
106
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
command: 'process-followup',
|
|
111
|
+
module: 'processFollowup',
|
|
112
|
+
describe: '生成生产单工序跟进表 Excel(需跟进的工序标红)',
|
|
113
|
+
options: [
|
|
114
|
+
['from', '业务日期起 yyyy-MM-dd', 'string'],
|
|
115
|
+
['to', '业务日期止 yyyy-MM-dd', 'string'],
|
|
116
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
command: 'goods-inventory',
|
|
121
|
+
module: 'goodsInventory',
|
|
122
|
+
describe: '生成服装成品盘存表 Excel(商品单品库存,动态尺码列)',
|
|
123
|
+
options: [
|
|
124
|
+
['storehouse', '仓库 id(不传则全部仓库)', 'number'],
|
|
125
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
command: 'ticket-statistics',
|
|
130
|
+
module: 'ticketStatistics',
|
|
131
|
+
describe: '生成生产状况统计表 Excel(按部门与货号汇总领货、交货、裁床开始日期)',
|
|
132
|
+
options: [
|
|
133
|
+
['from', '编菲日期起 yyyy-MM-dd(不传则不限)', 'string'],
|
|
134
|
+
['to', '编菲日期止 yyyy-MM-dd(不传则不限)', 'string'],
|
|
135
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
command: 'goods-bom',
|
|
140
|
+
module: 'goodsBom',
|
|
141
|
+
describe: '生成 BOM 商品信息 Excel(每商品一个文件:商品信息 + BOM + 物料单品)',
|
|
142
|
+
options: [
|
|
143
|
+
['sn', '只导指定款号', 'string'],
|
|
144
|
+
['limit', '最多导出的商品数,默认 100', 'number'],
|
|
145
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
146
|
+
],
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
command: 'goods-size',
|
|
150
|
+
module: 'goodsSize',
|
|
151
|
+
describe: '生成商品尺寸信息 Excel(每商品一个文件,默认部位纵向尺码横向)',
|
|
152
|
+
options: [
|
|
153
|
+
['sn', '只导指定款号', 'string'],
|
|
154
|
+
['limit', '最多导出的商品数,默认 100', 'number'],
|
|
155
|
+
['transpose', '转置为「尺寸纵向」', 'boolean'],
|
|
156
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
command: 'goods-first-order',
|
|
161
|
+
module: 'goodsFirstOrder',
|
|
162
|
+
describe: '生成商品首单面料工序单价 Excel(商品信息 + 首单 BOM 面料 + 工序单价)',
|
|
163
|
+
options: [
|
|
164
|
+
['sn', '只导指定款号', 'string'],
|
|
165
|
+
['limit', '最多导出的商品数,默认 100', 'number'],
|
|
166
|
+
['out', '输出目录,默认当前目录', 'string'],
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* 执行一个报表:调用 reports/<module> 的 generate(argv),输出汇总与文件路径。
|
|
173
|
+
* 报表内部可能分页多次请求(内置节流),因此耗时可能较长。
|
|
174
|
+
*/
|
|
175
|
+
async function runReport(argv, moduleFile) {
|
|
176
|
+
try {
|
|
177
|
+
const mod = require(path.join(__dirname, '..', '..', 'reports', moduleFile));
|
|
178
|
+
const { filePaths, summary } = await mod.generate(argv);
|
|
179
|
+
if (summary) {
|
|
180
|
+
console.log(summary);
|
|
181
|
+
}
|
|
182
|
+
for (const filePath of filePaths || []) {
|
|
183
|
+
console.log(`文件:${filePath}`);
|
|
184
|
+
}
|
|
185
|
+
} catch (e) {
|
|
186
|
+
console.error(`错误:${e.message}`);
|
|
187
|
+
process.exitCode = 1;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const report = {
|
|
192
|
+
command: 'report',
|
|
193
|
+
describe: '生成官方报表(Excel/HTML 文件,对应官方技能库)',
|
|
194
|
+
builder(yargs) {
|
|
195
|
+
let chain = yargs;
|
|
196
|
+
for (const def of REPORTS) {
|
|
197
|
+
chain = chain.command({
|
|
198
|
+
command: def.command,
|
|
199
|
+
describe: def.describe,
|
|
200
|
+
builder: (y) => {
|
|
201
|
+
for (const [name, describe, type] of def.options) {
|
|
202
|
+
y = y.option(name, { describe, type });
|
|
203
|
+
}
|
|
204
|
+
return y;
|
|
205
|
+
},
|
|
206
|
+
handler: (argv) => runReport(argv, def.module),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return chain.demandCommand(1, '请指定报表名。查看全部报表:scm-agent report --help');
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
module.exports = { report, REPORTS };
|