From 6315055c0826120634e3e7894530af69b57e9bd7 Mon Sep 17 00:00:00 2001 From: XuZhiqiang Date: Thu, 4 Jun 2026 16:08:03 +0800 Subject: [PATCH] feat(web-antdv-next): migrate MES module --- apps/web-antdv-next/package.json | 2 + .../src/api/mes/cal/calendar/index.ts | 27 + .../src/api/mes/cal/holiday/index.ts | 39 + .../src/api/mes/cal/plan/index.ts | 59 ++ .../src/api/mes/cal/plan/shift/index.ts | 36 + .../src/api/mes/cal/plan/team/index.ts | 30 + .../src/api/mes/cal/team/index.ts | 53 ++ .../src/api/mes/cal/team/member/index.ts | 51 ++ .../src/api/mes/dv/checkplan/index.ts | 65 ++ .../api/mes/dv/checkplan/machinery/index.ts | 34 + .../src/api/mes/dv/checkplan/subject/index.ts | 35 + .../src/api/mes/dv/checkrecord/index.ts | 65 ++ .../src/api/mes/dv/checkrecord/line/index.ts | 53 ++ .../src/api/mes/dv/machinery/index.ts | 85 ++ .../src/api/mes/dv/machinery/type/index.ts | 53 ++ .../src/api/mes/dv/maintenrecord/index.ts | 65 ++ .../api/mes/dv/maintenrecord/line/index.ts | 51 ++ .../src/api/mes/dv/repair/index.ts | 81 ++ .../src/api/mes/dv/repair/line/index.ts | 49 ++ .../src/api/mes/dv/subject/index.ts | 60 ++ apps/web-antdv-next/src/api/mes/home/index.ts | 55 ++ .../src/api/mes/md/autocode/part/index.ts | 49 ++ .../src/api/mes/md/autocode/record/index.ts | 9 + .../src/api/mes/md/autocode/rule/index.ts | 55 ++ .../src/api/mes/md/client/index.ts | 86 ++ .../src/api/mes/md/item/batchConfig/index.ts | 35 + .../src/api/mes/md/item/index.ts | 83 ++ .../src/api/mes/md/item/productBom/index.ts | 58 ++ .../src/api/mes/md/item/productSip/index.ts | 57 ++ .../src/api/mes/md/item/productSop/index.ts | 57 ++ .../src/api/mes/md/item/type/index.ts | 54 ++ .../src/api/mes/md/unitmeasure/index.ts | 62 ++ .../src/api/mes/md/vendor/index.ts | 87 +++ .../src/api/mes/md/workstation/index.ts | 58 ++ .../api/mes/md/workstation/machine/index.ts | 35 + .../src/api/mes/md/workstation/tool/index.ts | 41 + .../api/mes/md/workstation/worker/index.ts | 41 + .../api/mes/md/workstation/workshop/index.ts | 60 ++ .../src/api/mes/pro/andon/config/index.ts | 54 ++ .../src/api/mes/pro/andon/record/index.ts | 76 ++ .../src/api/mes/pro/card/index.ts | 79 ++ .../src/api/mes/pro/card/process/index.ts | 62 ++ .../src/api/mes/pro/feedback/index.ts | 113 +++ .../src/api/mes/pro/process/content/index.ts | 49 ++ .../src/api/mes/pro/process/index.ts | 58 ++ .../src/api/mes/pro/route/index.ts | 65 ++ .../src/api/mes/pro/route/process/index.ts | 70 ++ .../src/api/mes/pro/route/product/index.ts | 48 ++ .../src/api/mes/pro/route/productbom/index.ts | 57 ++ .../src/api/mes/pro/task/index.ts | 95 +++ .../src/api/mes/pro/task/issue/index.ts | 73 ++ .../src/api/mes/pro/workorder/bom/index.ts | 62 ++ .../src/api/mes/pro/workorder/index.ts | 101 +++ .../src/api/mes/pro/workrecord/index.ts | 71 ++ .../src/api/mes/qc/defect/index.ts | 54 ++ .../src/api/mes/qc/defectrecord/index.ts | 49 ++ .../src/api/mes/qc/indicator/index.ts | 53 ++ .../src/api/mes/qc/indicatorresult/index.ts | 73 ++ .../src/api/mes/qc/ipqc/index.ts | 87 +++ .../src/api/mes/qc/ipqc/line/index.ts | 42 + .../src/api/mes/qc/iqc/index.ts | 80 ++ .../src/api/mes/qc/iqc/line/index.ts | 41 + .../src/api/mes/qc/oqc/index.ts | 81 ++ .../src/api/mes/qc/oqc/line/index.ts | 41 + .../src/api/mes/qc/pendinginspect/index.ts | 41 + .../src/api/mes/qc/rqc/index.ts | 77 ++ .../src/api/mes/qc/rqc/line/index.ts | 41 + .../src/api/mes/qc/template/index.ts | 51 ++ .../api/mes/qc/template/indicator/index.ts | 57 ++ .../src/api/mes/qc/template/item/index.ts | 52 ++ .../src/api/mes/tm/tool/index.ts | 61 ++ .../src/api/mes/tm/tool/type/index.ts | 59 ++ .../src/api/mes/wm/arrivalnotice/index.ts | 68 ++ .../api/mes/wm/arrivalnotice/line/index.ts | 58 ++ .../src/api/mes/wm/barcode/config/index.ts | 49 ++ .../src/api/mes/wm/barcode/index.ts | 70 ++ .../src/api/mes/wm/batch/index.ts | 87 +++ .../src/api/mes/wm/itemconsume/line/index.ts | 37 + .../api/mes/wm/itemreceipt/detail/index.ts | 58 ++ .../src/api/mes/wm/itemreceipt/index.ts | 86 ++ .../src/api/mes/wm/itemreceipt/line/index.ts | 63 ++ .../src/api/mes/wm/materialstock/index.ts | 61 ++ .../src/api/mes/wm/miscissue/index.ts | 70 ++ .../src/api/mes/wm/miscissue/line/index.ts | 70 ++ .../src/api/mes/wm/miscreceipt/index.ts | 70 ++ .../src/api/mes/wm/miscreceipt/line/index.ts | 57 ++ .../api/mes/wm/outsourceissue/detail/index.ts | 60 ++ .../src/api/mes/wm/outsourceissue/index.ts | 90 +++ .../api/mes/wm/outsourceissue/line/index.ts | 55 ++ .../mes/wm/outsourcereceipt/detail/index.ts | 61 ++ .../src/api/mes/wm/outsourcereceipt/index.ts | 81 ++ .../api/mes/wm/outsourcereceipt/line/index.ts | 59 ++ .../src/api/mes/wm/packages/index.ts | 83 ++ .../src/api/mes/wm/packages/line/index.ts | 54 ++ .../api/mes/wm/productissue/detail/index.ts | 56 ++ .../src/api/mes/wm/productissue/index.ts | 87 +++ .../src/api/mes/wm/productissue/line/index.ts | 53 ++ .../api/mes/wm/productproduce/line/index.ts | 37 + .../api/mes/wm/productreceipt/detail/index.ts | 58 ++ .../src/api/mes/wm/productreceipt/index.ts | 91 +++ .../api/mes/wm/productreceipt/line/index.ts | 57 ++ .../api/mes/wm/productsales/detail/index.ts | 58 ++ .../src/api/mes/wm/productsales/index.ts | 96 +++ .../src/api/mes/wm/productsales/line/index.ts | 56 ++ .../api/mes/wm/returnissue/detail/index.ts | 56 ++ .../src/api/mes/wm/returnissue/index.ts | 78 ++ .../src/api/mes/wm/returnissue/line/index.ts | 58 ++ .../api/mes/wm/returnsales/detail/index.ts | 55 ++ .../src/api/mes/wm/returnsales/index.ts | 78 ++ .../src/api/mes/wm/returnsales/line/index.ts | 57 ++ .../api/mes/wm/returnvendor/detail/index.ts | 56 ++ .../src/api/mes/wm/returnvendor/index.ts | 88 +++ .../src/api/mes/wm/returnvendor/line/index.ts | 54 ++ .../src/api/mes/wm/salesnotice/index.ts | 65 ++ .../src/api/mes/wm/salesnotice/line/index.ts | 55 ++ .../web-antdv-next/src/api/mes/wm/sn/index.ts | 68 ++ .../src/api/mes/wm/stocktaking/plan/index.ts | 68 ++ .../mes/wm/stocktaking/plan/param/index.ts | 49 ++ .../src/api/mes/wm/stocktaking/task/index.ts | 86 ++ .../api/mes/wm/stocktaking/task/line/index.ts | 72 ++ .../mes/wm/stocktaking/task/result/index.ts | 64 ++ .../src/api/mes/wm/transfer/detail/index.ts | 59 ++ .../src/api/mes/wm/transfer/index.ts | 92 +++ .../src/api/mes/wm/transfer/line/index.ts | 55 ++ .../src/api/mes/wm/warehouse/area/index.ts | 65 ++ .../src/api/mes/wm/warehouse/index.ts | 55 ++ .../api/mes/wm/warehouse/location/index.ts | 72 ++ .../src/router/routes/modules/mes.ts | 55 ++ .../mes/cal/calendar/components/date-cell.vue | 135 ++++ .../mes/cal/calendar/components/index.ts | 4 + .../mes/cal/calendar/components/legend.vue | 38 + .../mes/cal/calendar/components/panel.vue | 106 +++ .../cal/calendar/components/use-calendar.ts | 100 +++ .../src/views/mes/cal/calendar/index.vue | 42 + .../mes/cal/calendar/modules/team-view.vue | 83 ++ .../mes/cal/calendar/modules/type-view.vue | 84 ++ .../mes/cal/calendar/modules/user-view.vue | 92 +++ .../src/views/mes/cal/holiday/data.ts | 48 ++ .../src/views/mes/cal/holiday/index.vue | 235 ++++++ .../views/mes/cal/holiday/modules/form.vue | 84 ++ .../src/views/mes/cal/plan/data.ts | 279 +++++++ .../src/views/mes/cal/plan/index.vue | 150 ++++ .../src/views/mes/cal/plan/modules/form.vue | 155 ++++ .../views/mes/cal/plan/modules/shift-list.vue | 238 ++++++ .../views/mes/cal/plan/modules/team-list.vue | 209 +++++ .../views/mes/cal/team/components/index.ts | 2 + .../mes/cal/team/components/select-dialog.vue | 141 ++++ .../views/mes/cal/team/components/select.vue | 84 ++ .../src/views/mes/cal/team/data.ts | 192 +++++ .../src/views/mes/cal/team/index.vue | 153 ++++ .../src/views/mes/cal/team/modules/form.vue | 117 +++ .../mes/cal/team/modules/member-list.vue | 196 +++++ .../mes/dv/checkplan/components/index.ts | 2 + .../dv/checkplan/components/select-dialog.vue | 215 +++++ .../mes/dv/checkplan/components/select.vue | 152 ++++ .../src/views/mes/dv/checkplan/data.ts | 312 ++++++++ .../src/views/mes/dv/checkplan/index.vue | 201 +++++ .../views/mes/dv/checkplan/modules/form.vue | 118 +++ .../dv/checkplan/modules/machinery-list.vue | 191 +++++ .../mes/dv/checkplan/modules/subject-list.vue | 203 +++++ .../src/views/mes/dv/checkrecord/data.ts | 161 ++++ .../src/views/mes/dv/checkrecord/index.vue | 161 ++++ .../views/mes/dv/checkrecord/modules/form.vue | 141 ++++ .../mes/dv/checkrecord/modules/line-list.vue | 231 ++++++ .../mes/dv/machinery/components/index.ts | 2 + .../dv/machinery/components/select-dialog.vue | 225 ++++++ .../mes/dv/machinery/components/select.vue | 138 ++++ .../src/views/mes/dv/machinery/data.ts | 340 ++++++++ .../src/views/mes/dv/machinery/index.vue | 197 +++++ .../machinery/modules/check-record-list.vue | 73 ++ .../views/mes/dv/machinery/modules/form.vue | 140 ++++ .../mes/dv/machinery/modules/import-form.vue | 88 +++ .../machinery/modules/mainten-record-list.vue | 73 ++ .../mes/dv/machinery/modules/repair-list.vue | 74 ++ .../mes/dv/machinery/type/components/index.ts | 2 + .../dv/machinery/type/components/select.vue | 112 +++ .../mes/dv/machinery/type/components/tree.vue | 94 +++ .../src/views/mes/dv/machinery/type/data.ts | 178 +++++ .../src/views/mes/dv/machinery/type/index.vue | 161 ++++ .../mes/dv/machinery/type/modules/form.vue | 96 +++ .../src/views/mes/dv/maintenrecord/data.ts | 161 ++++ .../src/views/mes/dv/maintenrecord/index.vue | 165 ++++ .../mes/dv/maintenrecord/modules/form.vue | 149 ++++ .../dv/maintenrecord/modules/line-list.vue | 234 ++++++ .../src/views/mes/dv/repair/data.ts | 321 ++++++++ .../src/views/mes/dv/repair/index.vue | 181 +++++ .../src/views/mes/dv/repair/modules/form.vue | 230 ++++++ .../views/mes/dv/repair/modules/line-list.vue | 233 ++++++ .../views/mes/dv/subject/components/index.ts | 1 + .../mes/dv/subject/components/select.vue | 86 ++ .../src/views/mes/dv/subject/data.ts | 208 +++++ .../src/views/mes/dv/subject/index.vue | 152 ++++ .../src/views/mes/dv/subject/modules/form.vue | 92 +++ .../src/views/mes/home/chart-options.ts | 62 ++ .../web-antdv-next/src/views/mes/home/data.ts | 28 + .../src/views/mes/home/index.vue | 70 ++ .../views/mes/home/modules/alert-panel.vue | 72 ++ .../src/views/mes/home/modules/kpi-cards.vue | 174 +++++ .../mes/home/modules/production-trend.vue | 56 ++ .../src/views/mes/home/modules/shortcuts.vue | 90 +++ .../mes/home/modules/work-order-chart.vue | 40 + .../src/views/mes/md/autocode/data.ts | 465 +++++++++++ .../src/views/mes/md/autocode/index.vue | 150 ++++ .../views/mes/md/autocode/modules/form.vue | 105 +++ .../mes/md/autocode/modules/part-form.vue | 118 +++ .../mes/md/autocode/modules/part-list.vue | 140 ++++ .../views/mes/md/client/components/index.ts | 2 + .../md/client/components/select-dialog.vue | 212 +++++ .../views/mes/md/client/components/select.vue | 136 ++++ .../src/views/mes/md/client/data.ts | 479 ++++++++++++ .../src/views/mes/md/client/index.vue | 176 +++++ .../src/views/mes/md/client/modules/form.vue | 113 +++ .../mes/md/client/modules/import-form.vue | 101 +++ .../modules/product-sales-line-list.vue | 95 +++ .../md/client/modules/product-sales-list.vue | 98 +++ .../src/views/mes/md/item/components/index.ts | 4 + .../components/product-bom-select-dialog.vue | 116 +++ .../md/item/components/product-bom-select.vue | 144 ++++ .../mes/md/item/components/select-dialog.vue | 228 ++++++ .../views/mes/md/item/components/select.vue | 136 ++++ .../src/views/mes/md/item/data.ts | 484 ++++++++++++ .../src/views/mes/md/item/index.vue | 228 ++++++ .../src/views/mes/md/item/modules/form.vue | 166 ++++ .../views/mes/md/item/modules/import-form.vue | 101 +++ .../item/modules/item-batch-config-form.vue | 181 +++++ .../mes/md/item/modules/product-bom-form.vue | 274 +++++++ .../md/item/modules/product-media-list.vue | 273 +++++++ .../mes/md/item/modules/product-sip-form.vue | 14 + .../mes/md/item/modules/product-sop-form.vue | 14 + .../mes/md/item/type/components/index.ts | 2 + .../mes/md/item/type/components/select.vue | 125 +++ .../mes/md/item/type/components/tree.vue | 128 +++ .../src/views/mes/md/item/type/data.ts | 225 ++++++ .../src/views/mes/md/item/type/index.vue | 165 ++++ .../views/mes/md/item/type/modules/form.vue | 94 +++ .../mes/md/unitmeasure/components/index.ts | 1 + .../mes/md/unitmeasure/components/select.vue | 122 +++ .../src/views/mes/md/unitmeasure/data.ts | 196 +++++ .../src/views/mes/md/unitmeasure/index.vue | 150 ++++ .../views/mes/md/unitmeasure/modules/form.vue | 92 +++ .../views/mes/md/vendor/components/index.ts | 2 + .../md/vendor/components/select-dialog.vue | 208 +++++ .../views/mes/md/vendor/components/select.vue | 136 ++++ .../src/views/mes/md/vendor/data.ts | 473 +++++++++++ .../src/views/mes/md/vendor/index.vue | 176 +++++ .../src/views/mes/md/vendor/modules/form.vue | 115 +++ .../mes/md/vendor/modules/import-form.vue | 101 +++ .../md/vendor/modules/item-receipt-detail.vue | 162 ++++ .../vendor/modules/item-receipt-line-list.vue | 95 +++ .../md/vendor/modules/item-receipt-list.vue | 103 +++ .../mes/md/workstation/components/index.ts | 3 + .../workstation/components/select-dialog.vue | 197 +++++ .../mes/md/workstation/components/select.vue | 143 ++++ .../components/workshop-select.vue | 117 +++ .../src/views/mes/md/workstation/data.ts | 353 +++++++++ .../src/views/mes/md/workstation/index.vue | 187 +++++ .../views/mes/md/workstation/modules/form.vue | 155 ++++ .../md/workstation/modules/machine-list.vue | 238 ++++++ .../mes/md/workstation/modules/tool-list.vue | 258 ++++++ .../md/workstation/modules/worker-list.vue | 254 ++++++ .../views/mes/md/workstation/workshop/data.ts | 199 +++++ .../mes/md/workstation/workshop/index.vue | 145 ++++ .../md/workstation/workshop/modules/form.vue | 123 +++ .../mes/pro/andon/config/components/index.ts | 1 + .../pro/andon/config/components/select.vue | 88 +++ .../src/views/mes/pro/andon/config/data.ts | 100 +++ .../mes/pro/andon/config/modules/form.vue | 94 +++ .../mes/pro/andon/config/modules/list.vue | 129 +++ .../src/views/mes/pro/andon/record/data.ts | 318 ++++++++ .../src/views/mes/pro/andon/record/index.vue | 174 +++++ .../mes/pro/andon/record/modules/form.vue | 180 +++++ .../views/mes/pro/card/components/index.ts | 2 + .../mes/pro/card/components/select-dialog.vue | 198 +++++ .../views/mes/pro/card/components/select.vue | 133 ++++ .../src/views/mes/pro/card/data.ts | 512 ++++++++++++ .../src/views/mes/pro/card/index.vue | 197 +++++ .../src/views/mes/pro/card/modules/form.vue | 214 +++++ .../mes/pro/card/modules/process-form.vue | 94 +++ .../mes/pro/card/modules/process-list.vue | 133 ++++ .../src/views/mes/pro/feedback/data.ts | 585 ++++++++++++++ .../src/views/mes/pro/feedback/index.vue | 182 +++++ .../views/mes/pro/feedback/modules/form.vue | 313 ++++++++ .../feedback/modules/item-consume-list.vue | 61 ++ .../feedback/modules/product-produce-list.vue | 72 ++ .../views/mes/pro/process/components/index.ts | 1 + .../mes/pro/process/components/select.vue | 114 +++ .../src/views/mes/pro/process/data.ts | 270 +++++++ .../src/views/mes/pro/process/index.vue | 158 ++++ .../mes/pro/process/modules/content-form.vue | 98 +++ .../mes/pro/process/modules/content-list.vue | 132 ++++ .../views/mes/pro/process/modules/form.vue | 114 +++ .../mes/pro/route/components/color-picker.vue | 66 ++ .../views/mes/pro/route/components/index.ts | 1 + .../src/views/mes/pro/route/data.ts | 514 ++++++++++++ .../src/views/mes/pro/route/index.vue | 188 +++++ .../views/mes/pro/route/modules/bom-form.vue | 118 +++ .../src/views/mes/pro/route/modules/form.vue | 121 +++ .../mes/pro/route/modules/process-form.vue | 121 +++ .../mes/pro/route/modules/process-list.vue | 136 ++++ .../pro/route/modules/product-bom-list.vue | 171 ++++ .../mes/pro/route/modules/product-form.vue | 125 +++ .../mes/pro/route/modules/product-list.vue | 134 ++++ .../mes/pro/task/components/gantt-chart.vue | 239 ++++++ .../views/mes/pro/task/components/index.ts | 3 + .../mes/pro/task/components/select-dialog.vue | 245 ++++++ .../views/mes/pro/task/components/select.vue | 151 ++++ .../src/views/mes/pro/task/data.ts | 570 ++++++++++++++ .../src/views/mes/pro/task/edit/index.vue | 98 +++ .../src/views/mes/pro/task/index.vue | 151 ++++ .../mes/pro/task/modules/schedule-form.vue | 148 ++++ .../views/mes/pro/task/modules/task-form.vue | 113 +++ .../views/mes/pro/task/modules/task-list.vue | 162 ++++ .../mes/pro/workorder/components/index.ts | 2 + .../workorder/components/select-dialog.vue | 232 ++++++ .../mes/pro/workorder/components/select.vue | 140 ++++ .../src/views/mes/pro/workorder/data.ts | 728 +++++++++++++++++ .../src/views/mes/pro/workorder/index.vue | 242 ++++++ .../mes/pro/workorder/modules/bom-form.vue | 101 +++ .../mes/pro/workorder/modules/bom-list.vue | 181 +++++ .../views/mes/pro/workorder/modules/form.vue | 295 +++++++ .../mes/pro/workorder/modules/item-list.vue | 45 ++ .../src/views/mes/pro/workrecord/data.ts | 107 +++ .../src/views/mes/pro/workrecord/index.vue | 87 +++ .../mes/pro/workrecord/modules/status-bar.vue | 115 +++ .../src/views/mes/qc/batchtrace/data.ts | 229 ++++++ .../src/views/mes/qc/batchtrace/index.vue | 81 ++ .../qc/batchtrace/modules/trace-detail.vue | 58 ++ .../mes/qc/batchtrace/modules/trace-list.vue | 67 ++ .../src/views/mes/qc/defect/data.ts | 185 +++++ .../src/views/mes/qc/defect/index.vue | 147 ++++ .../src/views/mes/qc/defect/modules/form.vue | 83 ++ .../mes/qc/defectrecord/components/data.ts | 93 +++ .../mes/qc/defectrecord/components/index.ts | 2 + .../defectrecord/components/inline-form.vue | 124 +++ .../defectrecord/components/inline-list.vue | 184 +++++ .../mes/qc/indicator/components/index.ts | 3 + .../components/result-specification-input.vue | 76 ++ .../qc/indicator/components/select-dialog.vue | 201 +++++ .../mes/qc/indicator/components/select.vue | 130 +++ .../src/views/mes/qc/indicator/data.ts | 288 +++++++ .../src/views/mes/qc/indicator/index.vue | 151 ++++ .../views/mes/qc/indicator/modules/form.vue | 89 +++ .../mes/qc/indicatorresult/components/data.ts | 98 +++ .../qc/indicatorresult/components/form.vue | 218 ++++++ .../qc/indicatorresult/components/index.ts | 2 + .../qc/indicatorresult/components/list.vue | 145 ++++ .../src/views/mes/qc/ipqc/data.ts | 564 +++++++++++++ .../src/views/mes/qc/ipqc/index.vue | 167 ++++ .../src/views/mes/qc/ipqc/modules/form.vue | 239 ++++++ .../views/mes/qc/ipqc/modules/line-list.vue | 97 +++ .../src/views/mes/qc/iqc/data.ts | 507 ++++++++++++ .../src/views/mes/qc/iqc/index.vue | 167 ++++ .../src/views/mes/qc/iqc/modules/form.vue | 245 ++++++ .../views/mes/qc/iqc/modules/line-list.vue | 97 +++ .../src/views/mes/qc/oqc/data.ts | 517 ++++++++++++ .../src/views/mes/qc/oqc/index.vue | 167 ++++ .../src/views/mes/qc/oqc/modules/form.vue | 243 ++++++ .../views/mes/qc/oqc/modules/line-list.vue | 97 +++ .../src/views/mes/qc/pendinginspect/data.ts | 103 +++ .../src/views/mes/qc/pendinginspect/index.vue | 193 +++++ .../src/views/mes/qc/rqc/data.ts | 491 ++++++++++++ .../src/views/mes/qc/rqc/index.vue | 167 ++++ .../src/views/mes/qc/rqc/modules/form.vue | 239 ++++++ .../views/mes/qc/rqc/modules/line-list.vue | 97 +++ .../src/views/mes/qc/template/data.ts | 502 ++++++++++++ .../src/views/mes/qc/template/index.vue | 172 ++++ .../views/mes/qc/template/modules/form.vue | 124 +++ .../qc/template/modules/indicator-form.vue | 96 +++ .../qc/template/modules/indicator-list.vue | 137 ++++ .../mes/qc/template/modules/item-form.vue | 95 +++ .../mes/qc/template/modules/item-list.vue | 131 ++++ .../src/views/mes/tm/tool/components/index.ts | 2 + .../mes/tm/tool/components/select-dialog.vue | 206 +++++ .../views/mes/tm/tool/components/select.vue | 141 ++++ .../src/views/mes/tm/tool/data.ts | 409 ++++++++++ .../src/views/mes/tm/tool/index.vue | 174 +++++ .../src/views/mes/tm/tool/modules/form.vue | 123 +++ .../mes/tm/tool/type/components/index.ts | 2 + .../mes/tm/tool/type/components/list.vue | 106 +++ .../mes/tm/tool/type/components/select.vue | 55 ++ .../src/views/mes/tm/tool/type/data.ts | 217 +++++ .../src/views/mes/tm/tool/type/index.vue | 153 ++++ .../views/mes/tm/tool/type/modules/form.vue | 99 +++ .../mes/wm/arrivalnotice/components/index.ts | 2 + .../components/line-select-dialog.vue | 203 +++++ .../arrivalnotice/components/line-select.vue | 151 ++++ .../components/select-dialog.vue | 262 +++++++ .../wm/arrivalnotice/components/select.vue | 138 ++++ .../src/views/mes/wm/arrivalnotice/data.ts | 352 +++++++++ .../src/views/mes/wm/arrivalnotice/index.vue | 187 +++++ .../mes/wm/arrivalnotice/modules/form.vue | 168 ++++ .../wm/arrivalnotice/modules/line-form.vue | 94 +++ .../wm/arrivalnotice/modules/line-list.vue | 139 ++++ .../mes/wm/barcode/components/barcode.vue | 51 ++ .../mes/wm/barcode/components/detail.vue | 169 ++++ .../views/mes/wm/barcode/components/index.ts | 3 + .../wm/barcode/components/printer-label.vue | 30 + .../src/views/mes/wm/barcode/config/data.ts | 113 +++ .../src/views/mes/wm/barcode/config/index.vue | 156 ++++ .../mes/wm/barcode/config/modules/form.vue | 89 +++ .../src/views/mes/wm/barcode/data.ts | 738 ++++++++++++++++++ .../src/views/mes/wm/barcode/index.vue | 240 ++++++ .../src/views/mes/wm/barcode/modules/form.vue | 115 +++ .../views/mes/wm/batch/components/detail.vue | 52 ++ .../views/mes/wm/batch/components/index.ts | 3 + .../mes/wm/batch/components/select-dialog.vue | 248 ++++++ .../views/mes/wm/batch/components/select.vue | 147 ++++ .../src/views/mes/wm/batch/data.ts | 372 +++++++++ .../src/views/mes/wm/itemreceipt/data.ts | 525 +++++++++++++ .../src/views/mes/wm/itemreceipt/index.vue | 209 +++++ .../wm/itemreceipt/modules/detail-form.vue | 104 +++ .../wm/itemreceipt/modules/detail-list.vue | 103 +++ .../views/mes/wm/itemreceipt/modules/form.vue | 238 ++++++ .../mes/wm/itemreceipt/modules/line-form.vue | 104 +++ .../mes/wm/itemreceipt/modules/line-list.vue | 238 ++++++ .../mes/wm/materialstock/components/index.ts | 2 + .../components/select-dialog.vue | 264 +++++++ .../wm/materialstock/components/select.vue | 156 ++++ .../src/views/mes/wm/materialstock/data.ts | 306 ++++++++ .../src/views/mes/wm/materialstock/index.vue | 183 +++++ .../src/views/mes/wm/miscissue/data.ts | 452 +++++++++++ .../src/views/mes/wm/miscissue/index.vue | 195 +++++ .../views/mes/wm/miscissue/modules/form.vue | 194 +++++ .../mes/wm/miscissue/modules/line-form.vue | 97 +++ .../mes/wm/miscissue/modules/line-list.vue | 137 ++++ .../src/views/mes/wm/miscreceipt/data.ts | 422 ++++++++++ .../src/views/mes/wm/miscreceipt/index.vue | 195 +++++ .../views/mes/wm/miscreceipt/modules/form.vue | 194 +++++ .../mes/wm/miscreceipt/modules/line-form.vue | 98 +++ .../mes/wm/miscreceipt/modules/line-list.vue | 137 ++++ .../src/views/mes/wm/outsourceissue/data.ts | 484 ++++++++++++ .../src/views/mes/wm/outsourceissue/index.vue | 209 +++++ .../wm/outsourceissue/modules/detail-form.vue | 104 +++ .../wm/outsourceissue/modules/detail-list.vue | 103 +++ .../mes/wm/outsourceissue/modules/form.vue | 233 ++++++ .../wm/outsourceissue/modules/line-form.vue | 97 +++ .../wm/outsourceissue/modules/line-list.vue | 222 ++++++ .../src/views/mes/wm/outsourcereceipt/data.ts | 537 +++++++++++++ .../views/mes/wm/outsourcereceipt/index.vue | 209 +++++ .../outsourcereceipt/modules/detail-form.vue | 103 +++ .../outsourcereceipt/modules/detail-list.vue | 122 +++ .../mes/wm/outsourcereceipt/modules/form.vue | 224 ++++++ .../wm/outsourcereceipt/modules/line-form.vue | 98 +++ .../wm/outsourcereceipt/modules/line-list.vue | 233 ++++++ .../views/mes/wm/packages/components/index.ts | 2 + .../wm/packages/components/select-dialog.vue | 227 ++++++ .../mes/wm/packages/components/select.vue | 141 ++++ .../src/views/mes/wm/packages/data.ts | 637 +++++++++++++++ .../src/views/mes/wm/packages/index.vue | 168 ++++ .../views/mes/wm/packages/modules/form.vue | 193 +++++ .../mes/wm/packages/modules/line-form.vue | 92 +++ .../wm/packages/modules/package-line-list.vue | 132 ++++ .../wm/packages/modules/sub-package-list.vue | 126 +++ .../src/views/mes/wm/productissue/data.ts | 470 +++++++++++ .../src/views/mes/wm/productissue/index.vue | 227 ++++++ .../wm/productissue/modules/detail-form.vue | 104 +++ .../wm/productissue/modules/detail-list.vue | 103 +++ .../mes/wm/productissue/modules/form.vue | 229 ++++++ .../mes/wm/productissue/modules/line-form.vue | 94 +++ .../mes/wm/productissue/modules/line-list.vue | 220 ++++++ .../src/views/mes/wm/productreceipt/data.ts | 450 +++++++++++ .../src/views/mes/wm/productreceipt/index.vue | 209 +++++ .../wm/productreceipt/modules/detail-form.vue | 104 +++ .../wm/productreceipt/modules/detail-list.vue | 103 +++ .../mes/wm/productreceipt/modules/form.vue | 240 ++++++ .../wm/productreceipt/modules/line-form.vue | 95 +++ .../wm/productreceipt/modules/line-list.vue | 249 ++++++ .../src/views/mes/wm/productsales/data.ts | 694 ++++++++++++++++ .../src/views/mes/wm/productsales/index.vue | 223 ++++++ .../wm/productsales/modules/detail-form.vue | 110 +++ .../wm/productsales/modules/detail-list.vue | 103 +++ .../mes/wm/productsales/modules/form.vue | 266 +++++++ .../mes/wm/productsales/modules/line-form.vue | 104 +++ .../mes/wm/productsales/modules/line-list.vue | 233 ++++++ .../src/views/mes/wm/returnissue/data.ts | 565 ++++++++++++++ .../src/views/mes/wm/returnissue/index.vue | 221 ++++++ .../wm/returnissue/modules/detail-form.vue | 104 +++ .../wm/returnissue/modules/detail-list.vue | 103 +++ .../views/mes/wm/returnissue/modules/form.vue | 219 ++++++ .../mes/wm/returnissue/modules/line-form.vue | 95 +++ .../mes/wm/returnissue/modules/line-list.vue | 247 ++++++ .../src/views/mes/wm/returnsales/data.ts | 517 ++++++++++++ .../src/views/mes/wm/returnsales/index.vue | 221 ++++++ .../wm/returnsales/modules/detail-form.vue | 104 +++ .../wm/returnsales/modules/detail-list.vue | 103 +++ .../views/mes/wm/returnsales/modules/form.vue | 228 ++++++ .../mes/wm/returnsales/modules/line-form.vue | 102 +++ .../mes/wm/returnsales/modules/line-list.vue | 244 ++++++ .../src/views/mes/wm/returnvendor/data.ts | 532 +++++++++++++ .../src/views/mes/wm/returnvendor/index.vue | 209 +++++ .../wm/returnvendor/modules/detail-form.vue | 104 +++ .../wm/returnvendor/modules/detail-list.vue | 103 +++ .../mes/wm/returnvendor/modules/form.vue | 233 ++++++ .../mes/wm/returnvendor/modules/line-form.vue | 99 +++ .../mes/wm/returnvendor/modules/line-list.vue | 234 ++++++ .../mes/wm/salesnotice/components/index.ts | 2 + .../components/line-select-dialog.vue | 198 +++++ .../wm/salesnotice/components/line-select.vue | 151 ++++ .../salesnotice/components/select-dialog.vue | 294 +++++++ .../mes/wm/salesnotice/components/select.vue | 138 ++++ .../src/views/mes/wm/salesnotice/data.ts | 362 +++++++++ .../src/views/mes/wm/salesnotice/index.vue | 176 +++++ .../views/mes/wm/salesnotice/modules/form.vue | 179 +++++ .../mes/wm/salesnotice/modules/line-form.vue | 94 +++ .../mes/wm/salesnotice/modules/line-list.vue | 137 ++++ .../src/views/mes/wm/sn/data.ts | 134 ++++ .../src/views/mes/wm/sn/index.vue | 153 ++++ .../src/views/mes/wm/sn/modules/form.vue | 62 ++ .../plan/components/condition-value-input.vue | 204 +++++ .../wm/stocktaking/plan/components/index.ts | 3 + .../plan/components/select-dialog.vue | 210 +++++ .../wm/stocktaking/plan/components/select.vue | 133 ++++ .../src/views/mes/wm/stocktaking/plan/data.ts | 472 +++++++++++ .../views/mes/wm/stocktaking/plan/index.vue | 184 +++++ .../mes/wm/stocktaking/plan/modules/form.vue | 126 +++ .../stocktaking/plan/modules/param-form.vue | 108 +++ .../stocktaking/plan/modules/param-list.vue | 131 ++++ .../src/views/mes/wm/stocktaking/task/data.ts | 598 ++++++++++++++ .../views/mes/wm/stocktaking/task/index.vue | 209 +++++ .../mes/wm/stocktaking/task/modules/form.vue | 226 ++++++ .../wm/stocktaking/task/modules/line-list.vue | 147 ++++ .../stocktaking/task/modules/result-form.vue | 106 +++ .../stocktaking/task/modules/result-list.vue | 140 ++++ .../src/views/mes/wm/transfer/data.ts | 643 +++++++++++++++ .../src/views/mes/wm/transfer/index.vue | 222 ++++++ .../mes/wm/transfer/modules/detail-form.vue | 103 +++ .../mes/wm/transfer/modules/detail-list.vue | 101 +++ .../views/mes/wm/transfer/modules/form.vue | 255 ++++++ .../mes/wm/transfer/modules/line-form.vue | 102 +++ .../mes/wm/transfer/modules/line-list.vue | 226 ++++++ .../src/views/mes/wm/warehouse/area/data.ts | 334 ++++++++ .../src/views/mes/wm/warehouse/area/index.vue | 219 ++++++ .../mes/wm/warehouse/area/modules/form.vue | 149 ++++ .../wm/warehouse/components/area-select.vue | 114 +++ .../mes/wm/warehouse/components/index.ts | 3 + .../warehouse/components/location-select.vue | 113 +++ .../mes/wm/warehouse/components/select.vue | 110 +++ .../src/views/mes/wm/warehouse/data.ts | 221 ++++++ .../src/views/mes/wm/warehouse/index.vue | 183 +++++ .../views/mes/wm/warehouse/location/data.ts | 193 +++++ .../views/mes/wm/warehouse/location/index.vue | 226 ++++++ .../wm/warehouse/location/modules/form.vue | 180 +++++ .../views/mes/wm/warehouse/modules/form.vue | 122 +++ .../src/views/system/dept/components/index.ts | 1 + .../system/dept/components/tree-select.vue | 96 +++ .../src/views/system/user/components/index.ts | 2 + .../system/user/components/select-dialog.vue | 305 ++++++++ .../views/system/user/components/select.vue | 134 ++++ pnpm-lock.yaml | 6 + pnpm-workspace.yaml | 1 + 550 files changed, 80294 insertions(+) create mode 100644 apps/web-antdv-next/src/api/mes/cal/calendar/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/holiday/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/plan/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/plan/shift/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/plan/team/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/team/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/cal/team/member/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/checkplan/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/checkplan/machinery/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/checkplan/subject/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/checkrecord/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/checkrecord/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/machinery/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/machinery/type/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/maintenrecord/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/maintenrecord/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/repair/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/repair/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/dv/subject/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/home/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/autocode/part/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/autocode/record/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/autocode/rule/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/client/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/batchConfig/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/productBom/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/productSip/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/productSop/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/item/type/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/unitmeasure/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/vendor/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/workstation/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/workstation/machine/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/workstation/tool/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/workstation/worker/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/md/workstation/workshop/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/andon/config/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/andon/record/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/card/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/card/process/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/feedback/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/process/content/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/process/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/route/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/route/process/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/route/product/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/route/productbom/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/task/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/task/issue/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/workorder/bom/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/workorder/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/pro/workrecord/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/defect/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/defectrecord/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/indicator/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/indicatorresult/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/ipqc/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/ipqc/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/iqc/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/iqc/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/oqc/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/oqc/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/pendinginspect/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/rqc/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/rqc/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/template/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/template/indicator/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/qc/template/item/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/tm/tool/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/tm/tool/type/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/arrivalnotice/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/arrivalnotice/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/barcode/config/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/barcode/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/batch/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/itemconsume/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/itemreceipt/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/itemreceipt/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/itemreceipt/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/materialstock/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/miscissue/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/miscissue/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/miscreceipt/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/miscreceipt/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourceissue/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourceissue/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourceissue/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/packages/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/packages/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productissue/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productissue/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productissue/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productproduce/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productreceipt/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productreceipt/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productreceipt/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productsales/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productsales/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/productsales/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnissue/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnissue/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnissue/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnsales/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnsales/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnsales/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnvendor/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnvendor/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/returnvendor/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/salesnotice/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/salesnotice/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/sn/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/param/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/stocktaking/task/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/stocktaking/task/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/stocktaking/task/result/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/transfer/detail/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/transfer/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/transfer/line/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/warehouse/area/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/warehouse/index.ts create mode 100644 apps/web-antdv-next/src/api/mes/wm/warehouse/location/index.ts create mode 100644 apps/web-antdv-next/src/router/routes/modules/mes.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/components/date-cell.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/components/legend.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/components/panel.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/components/use-calendar.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/modules/team-view.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/modules/type-view.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/calendar/modules/user-view.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/holiday/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/holiday/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/holiday/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/plan/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/plan/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/plan/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/plan/modules/shift-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/plan/modules/team-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/cal/team/modules/member-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/modules/machinery-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkplan/modules/subject-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkrecord/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkrecord/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/modules/check-record-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/modules/import-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/modules/mainten-record-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/modules/repair-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/components/tree.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/machinery/type/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/maintenrecord/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/maintenrecord/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/repair/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/repair/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/repair/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/repair/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/subject/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/subject/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/subject/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/dv/subject/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/dv/subject/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/chart-options.ts create mode 100644 apps/web-antdv-next/src/views/mes/home/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/home/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/modules/alert-panel.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/modules/kpi-cards.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/modules/production-trend.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/modules/shortcuts.vue create mode 100644 apps/web-antdv-next/src/views/mes/home/modules/work-order-chart.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/autocode/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/autocode/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/autocode/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/autocode/modules/part-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/autocode/modules/part-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/client/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/client/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/modules/import-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/item/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/import-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/item-batch-config-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/product-bom-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/product-media-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/product-sip-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/modules/product-sop-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/components/tree.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/item/type/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/unitmeasure/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/unitmeasure/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/unitmeasure/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/unitmeasure/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/unitmeasure/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/modules/import-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-detail.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/components/workshop-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/modules/machine-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/modules/tool-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/modules/worker-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/workshop/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/workshop/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/md/workstation/workshop/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/config/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/config/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/config/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/config/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/config/modules/list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/record/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/record/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/andon/record/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/modules/process-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/card/modules/process-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/feedback/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/feedback/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/feedback/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/feedback/modules/item-consume-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/feedback/modules/product-produce-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/modules/content-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/modules/content-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/process/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/components/color-picker.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/bom-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/process-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/process-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/product-bom-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/product-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/route/modules/product-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/components/gantt-chart.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/edit/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/modules/schedule-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/modules/task-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/task/modules/task-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workorder/modules/item-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workrecord/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/pro/workrecord/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/pro/workrecord/modules/status-bar.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/batchtrace/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/batchtrace/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-detail.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/defect/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/defect/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/defect/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/defectrecord/components/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/defectrecord/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/components/result-specification-input.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicator/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/ipqc/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/ipqc/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/ipqc/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/ipqc/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/iqc/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/iqc/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/iqc/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/iqc/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/oqc/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/oqc/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/oqc/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/oqc/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/pendinginspect/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/pendinginspect/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/rqc/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/rqc/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/rqc/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/rqc/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/modules/indicator-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/modules/indicator-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/modules/item-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/qc/template/modules/item-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/components/list.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/tm/tool/type/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/components/line-select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/components/line-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/arrivalnotice/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/components/barcode.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/components/detail.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/components/printer-label.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/config/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/config/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/config/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/barcode/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/batch/components/detail.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/batch/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/batch/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/batch/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/batch/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/itemreceipt/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/materialstock/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/materialstock/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/materialstock/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/materialstock/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/materialstock/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscissue/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscissue/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscissue/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscissue/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscissue/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscreceipt/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscreceipt/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscreceipt/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscreceipt/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/miscreceipt/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourceissue/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/outsourcereceipt/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/modules/package-line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/packages/modules/sub-package-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productissue/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productreceipt/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/productsales/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnissue/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnsales/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/returnvendor/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/components/line-select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/components/line-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/salesnotice/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/sn/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/sn/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/sn/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/components/condition-value-input.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/modules/param-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/plan/modules/param-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/modules/result-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/stocktaking/task/modules/result-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/modules/detail-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/modules/detail-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/modules/line-form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/transfer/modules/line-list.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/area/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/area/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/area/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/components/area-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/components/index.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/components/location-select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/components/select.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/location/data.ts create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/location/index.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/location/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/mes/wm/warehouse/modules/form.vue create mode 100644 apps/web-antdv-next/src/views/system/dept/components/tree-select.vue create mode 100644 apps/web-antdv-next/src/views/system/user/components/select-dialog.vue create mode 100644 apps/web-antdv-next/src/views/system/user/components/select.vue diff --git a/apps/web-antdv-next/package.json b/apps/web-antdv-next/package.json index cb6a4aa60..b9539e99d 100644 --- a/apps/web-antdv-next/package.json +++ b/apps/web-antdv-next/package.json @@ -54,12 +54,14 @@ "camunda-bpmn-moddle": "catalog:", "cropperjs": "catalog:", "dayjs": "catalog:", + "dhtmlx-gantt": "catalog:", "diagram-js": "catalog:", "fast-xml-parser": "catalog:", "highlight.js": "catalog:", "pinia": "catalog:", "steady-xml": "catalog:", "tinymce": "catalog:", + "tyme4ts": "catalog:", "video.js": "catalog:", "vue": "catalog:", "vue-dompurify-html": "catalog:", diff --git a/apps/web-antdv-next/src/api/mes/cal/calendar/index.ts b/apps/web-antdv-next/src/api/mes/cal/calendar/index.ts new file mode 100644 index 000000000..817fce27e --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/calendar/index.ts @@ -0,0 +1,27 @@ +import { requestClient } from '#/api/request'; + +export namespace MesCalCalendarApi { + /** 排班日历班组排班项 */ + export interface CalendarTeamShiftItem { + teamId?: number; // 班组编号 + teamName?: string; // 班组名称 + shiftId?: number; // 班次编号 + shiftName?: string; // 班次名称 + sort?: number; // 排序 + } + + /** 排班日历天 */ + export interface CalendarDay { + day?: string; // 日期 + shiftType?: number; // 轮班方式 + teamShifts?: CalendarTeamShiftItem[]; // 班组班次 + } +} + +/** 查询排班日历列表 */ +export function getCalendarList(params: any) { + return requestClient.get( + '/mes/cal/calendar/list', + { params }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/holiday/index.ts b/apps/web-antdv-next/src/api/mes/cal/holiday/index.ts new file mode 100644 index 000000000..79657487a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/holiday/index.ts @@ -0,0 +1,39 @@ +import { requestClient } from '#/api/request'; + +export namespace MesCalHolidayApi { + /** MES 假期设置 */ + export interface Holiday { + id?: number; // 编号 + day?: number | string; // 日期 + type?: number; // 日期类型 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** 假期查询参数 */ + export interface HolidayQuery { + startDay?: string; + endDay?: string; + } +} + +/** 查询假期设置列表 */ +export function getHolidayList(params?: MesCalHolidayApi.HolidayQuery) { + return requestClient.get( + '/mes/cal/holiday/list', + { params }, + ); +} + +/** 根据日期查询假期设置 */ +export function getHolidayByDay(day: string) { + return requestClient.get( + '/mes/cal/holiday/get-by-day', + { params: { day } }, + ); +} + +/** 保存假期设置 */ +export function saveHoliday(data: MesCalHolidayApi.Holiday) { + return requestClient.post('/mes/cal/holiday/save', data); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/plan/index.ts b/apps/web-antdv-next/src/api/mes/cal/plan/index.ts new file mode 100644 index 000000000..f52a6ba16 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/plan/index.ts @@ -0,0 +1,59 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesCalPlanApi { + /** MES 排班计划 */ + export interface Plan { + id?: number; // 计划编号 + code?: string; // 计划编码 + name?: string; // 计划名称 + calendarType?: number; // 班组类型 + startDate?: number; // 开始日期 + endDate?: number; // 结束日期 + shiftType?: number; // 轮班方式 + shiftMethod?: number; // 倒班方式 + shiftCount?: number; // 倒班天数 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询排班计划分页 */ +export function getPlanPage(params: PageParam) { + return requestClient.get>( + '/mes/cal/plan/page', + { params }, + ); +} + +/** 查询排班计划详情 */ +export function getPlan(id: number) { + return requestClient.get(`/mes/cal/plan/get?id=${id}`); +} + +/** 新增排班计划 */ +export function createPlan(data: MesCalPlanApi.Plan) { + return requestClient.post('/mes/cal/plan/create', data); +} + +/** 修改排班计划 */ +export function updatePlan(data: MesCalPlanApi.Plan) { + return requestClient.put('/mes/cal/plan/update', data); +} + +/** 确认排班计划 */ +export function confirmPlan(id: number) { + return requestClient.put(`/mes/cal/plan/confirm?id=${id}`); +} + +/** 删除排班计划 */ +export function deletePlan(id: number) { + return requestClient.delete(`/mes/cal/plan/delete?id=${id}`); +} + +/** 导出排班计划 */ +export function exportPlan(params: any) { + return requestClient.download('/mes/cal/plan/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/plan/shift/index.ts b/apps/web-antdv-next/src/api/mes/cal/plan/shift/index.ts new file mode 100644 index 000000000..f7828ab51 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/plan/shift/index.ts @@ -0,0 +1,36 @@ +import { requestClient } from '#/api/request'; + +export namespace MesCalPlanShiftApi { + /** MES 计划班次 */ + export interface PlanShift { + id?: number; // 班次编号 + planId?: number; // 排班计划编号 + sort?: number; // 显示顺序 + name?: string; // 班次名称 + startTime?: string; // 开始时间 + endTime?: string; // 结束时间 + remark?: string; // 备注 + } +} + +/** 查询指定排班计划的班次列表 */ +export function getPlanShiftListByPlan(planId: number) { + return requestClient.get( + `/mes/cal/plan-shift/list-by-plan?planId=${planId}`, + ); +} + +/** 新增计划班次 */ +export function createPlanShift(data: MesCalPlanShiftApi.PlanShift) { + return requestClient.post('/mes/cal/plan-shift/create', data); +} + +/** 修改计划班次 */ +export function updatePlanShift(data: MesCalPlanShiftApi.PlanShift) { + return requestClient.put('/mes/cal/plan-shift/update', data); +} + +/** 删除计划班次 */ +export function deletePlanShift(id: number) { + return requestClient.delete(`/mes/cal/plan-shift/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/plan/team/index.ts b/apps/web-antdv-next/src/api/mes/cal/plan/team/index.ts new file mode 100644 index 000000000..a513312c3 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/plan/team/index.ts @@ -0,0 +1,30 @@ +import { requestClient } from '#/api/request'; + +export namespace MesCalPlanTeamApi { + /** MES 计划班组关联 */ + export interface PlanTeam { + id?: number; // 关联编号 + planId?: number; // 排班计划编号 + teamId?: number; // 班组编号 + teamCode?: string; // 班组编码 + teamName?: string; // 班组名称 + remark?: string; // 备注 + } +} + +/** 查询指定排班计划的班组列表 */ +export function getPlanTeamListByPlan(planId: number) { + return requestClient.get( + `/mes/cal/plan-team/list-by-plan?planId=${planId}`, + ); +} + +/** 新增计划班组关联 */ +export function createPlanTeam(data: MesCalPlanTeamApi.PlanTeam) { + return requestClient.post('/mes/cal/plan-team/create', data); +} + +/** 删除计划班组关联 */ +export function deletePlanTeam(id: number) { + return requestClient.delete(`/mes/cal/plan-team/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/team/index.ts b/apps/web-antdv-next/src/api/mes/cal/team/index.ts new file mode 100644 index 000000000..b3a125d83 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/team/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesCalTeamApi { + /** MES 班组 */ + export interface Team { + id?: number; // 班组编号 + code?: string; // 班组编码 + name?: string; // 班组名称 + calendarType?: number; // 班组类型 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询班组分页 */ +export function getTeamPage(params: PageParam) { + return requestClient.get>( + '/mes/cal/team/page', + { params }, + ); +} + +/** 查询班组列表 */ +export function getTeamList() { + return requestClient.get('/mes/cal/team/list'); +} + +/** 查询班组详情 */ +export function getTeam(id: number) { + return requestClient.get(`/mes/cal/team/get?id=${id}`); +} + +/** 新增班组 */ +export function createTeam(data: MesCalTeamApi.Team) { + return requestClient.post('/mes/cal/team/create', data); +} + +/** 修改班组 */ +export function updateTeam(data: MesCalTeamApi.Team) { + return requestClient.put('/mes/cal/team/update', data); +} + +/** 删除班组 */ +export function deleteTeam(id: number) { + return requestClient.delete(`/mes/cal/team/delete?id=${id}`); +} + +/** 导出班组 */ +export function exportTeam(params: any) { + return requestClient.download('/mes/cal/team/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/cal/team/member/index.ts b/apps/web-antdv-next/src/api/mes/cal/team/member/index.ts new file mode 100644 index 000000000..2608f67c3 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/cal/team/member/index.ts @@ -0,0 +1,51 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesCalTeamMemberApi { + /** MES 班组成员 */ + export interface TeamMember { + id?: number; // 成员编号 + teamId?: number; // 班组编号 + userId?: number; // 用户编号 + nickname?: string; // 用户昵称 + telephone?: string; // 用户手机号 + remark?: string; // 备注 + } +} + +/** 创建班组成员 */ +export function createTeamMember(data: MesCalTeamMemberApi.TeamMember) { + return requestClient.post('/mes/cal/team-member/create', data); +} + +/** 删除班组成员 */ +export function deleteTeamMember(id: number) { + return requestClient.delete(`/mes/cal/team-member/delete?id=${id}`); +} + +/** 查询班组成员分页 */ +export function getTeamMemberPage(params: PageParam) { + return requestClient.get>( + '/mes/cal/team-member/page', + { params }, + ); +} + +/** 查询指定班组的成员列表 */ +export function getTeamMemberListByTeam(teamId: number) { + return requestClient.get( + '/mes/cal/team-member/list-by-team', + { params: { teamId } }, + ); +} + +/** 查询多个班组的成员列表 */ +export function getTeamMemberListByTeamIds(teamIds: number[]) { + return requestClient.get( + '/mes/cal/team-member/list-by-team', + { + params: { teamIds: teamIds.join(',') }, + }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/checkplan/index.ts b/apps/web-antdv-next/src/api/mes/dv/checkplan/index.ts new file mode 100644 index 000000000..feeac8a58 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/checkplan/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvCheckPlanApi { + /** MES 点检保养方案 */ + export interface CheckPlan { + id?: number; // 方案编号 + code?: string; // 方案编码 + name?: string; // 方案名称 + type?: number; // 方案类型 + startDate?: Date | number; // 开始日期 + endDate?: Date | number; // 结束日期 + cycleType?: number; // 周期类型 + cycleCount?: number; // 周期数量 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询点检保养方案分页 */ +export function getCheckPlanPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/check-plan/page', + { params }, + ); +} + +/** 查询点检保养方案详情 */ +export function getCheckPlan(id: number) { + return requestClient.get( + `/mes/dv/check-plan/get?id=${id}`, + ); +} + +/** 新增点检保养方案 */ +export function createCheckPlan(data: MesDvCheckPlanApi.CheckPlan) { + return requestClient.post('/mes/dv/check-plan/create', data); +} + +/** 修改点检保养方案 */ +export function updateCheckPlan(data: MesDvCheckPlanApi.CheckPlan) { + return requestClient.put('/mes/dv/check-plan/update', data); +} + +/** 启用点检保养方案 */ +export function enableCheckPlan(id: number) { + return requestClient.put(`/mes/dv/check-plan/enable?id=${id}`); +} + +/** 停用点检保养方案 */ +export function disableCheckPlan(id: number) { + return requestClient.put(`/mes/dv/check-plan/disable?id=${id}`); +} + +/** 删除点检保养方案 */ +export function deleteCheckPlan(id: number) { + return requestClient.delete(`/mes/dv/check-plan/delete?id=${id}`); +} + +/** 导出点检保养方案 */ +export function exportCheckPlan(params: any) { + return requestClient.download('/mes/dv/check-plan/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/checkplan/machinery/index.ts b/apps/web-antdv-next/src/api/mes/dv/checkplan/machinery/index.ts new file mode 100644 index 000000000..ad79aad23 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/checkplan/machinery/index.ts @@ -0,0 +1,34 @@ +import { requestClient } from '#/api/request'; + +export namespace MesDvCheckPlanMachineryApi { + /** MES 点检保养方案设备 */ + export interface CheckPlanMachinery { + id?: number; // 关联编号 + planId?: number; // 方案编号 + machineryId?: number; // 设备编号 + machineryCode?: string; // 设备编码 + machineryName?: string; // 设备名称 + machineryBrand?: string; // 品牌 + machinerySpecification?: string; // 规格型号 + remark?: string; // 备注 + } +} + +/** 查询指定方案的设备列表 */ +export function getCheckPlanMachineryListByPlan(planId: number) { + return requestClient.get( + `/mes/dv/check-plan-machinery/list-by-plan?planId=${planId}`, + ); +} + +/** 新增方案设备关联 */ +export function createCheckPlanMachinery( + data: MesDvCheckPlanMachineryApi.CheckPlanMachinery, +) { + return requestClient.post('/mes/dv/check-plan-machinery/create', data); +} + +/** 删除方案设备关联 */ +export function deleteCheckPlanMachinery(id: number) { + return requestClient.delete(`/mes/dv/check-plan-machinery/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/checkplan/subject/index.ts b/apps/web-antdv-next/src/api/mes/dv/checkplan/subject/index.ts new file mode 100644 index 000000000..6d60b4a67 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/checkplan/subject/index.ts @@ -0,0 +1,35 @@ +import { requestClient } from '#/api/request'; + +export namespace MesDvCheckPlanSubjectApi { + /** MES 点检保养方案项目 */ + export interface CheckPlanSubject { + id?: number; // 关联编号 + planId?: number; // 方案编号 + subjectId?: number; // 项目编号 + subjectCode?: string; // 项目编码 + subjectName?: string; // 项目名称 + subjectType?: number; // 项目类型 + subjectContent?: string; // 项目内容 + subjectStandard?: string; // 标准 + remark?: string; // 备注 + } +} + +/** 查询指定方案的项目列表 */ +export function getCheckPlanSubjectListByPlan(planId: number) { + return requestClient.get( + `/mes/dv/check-plan-subject/list-by-plan?planId=${planId}`, + ); +} + +/** 新增方案项目关联 */ +export function createCheckPlanSubject( + data: MesDvCheckPlanSubjectApi.CheckPlanSubject, +) { + return requestClient.post('/mes/dv/check-plan-subject/create', data); +} + +/** 删除方案项目关联 */ +export function deleteCheckPlanSubject(id: number) { + return requestClient.delete(`/mes/dv/check-plan-subject/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/checkrecord/index.ts b/apps/web-antdv-next/src/api/mes/dv/checkrecord/index.ts new file mode 100644 index 000000000..4edd79ca2 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/checkrecord/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvCheckRecordApi { + /** MES 设备点检记录 */ + export interface CheckRecord { + id?: number; // 记录编号 + planId?: number; // 点检计划编号 + planName?: string; // 计划名称 + machineryId?: number; // 设备编号 + machineryCode?: string; // 设备编码 + machineryName?: string; // 设备名称 + machineryBrand?: string; // 品牌 + machinerySpecification?: string; // 规格型号 + checkTime?: Date | number; // 点检时间 + userId?: number; // 点检人编号 + nickname?: string; // 点检人名称 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询设备点检记录分页 */ +export function getCheckRecordPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/check-record/page', + { params }, + ); +} + +/** 查询设备点检记录详情 */ +export function getCheckRecord(id: number) { + return requestClient.get( + `/mes/dv/check-record/get?id=${id}`, + ); +} + +/** 新增设备点检记录 */ +export function createCheckRecord(data: MesDvCheckRecordApi.CheckRecord) { + return requestClient.post('/mes/dv/check-record/create', data); +} + +/** 修改设备点检记录 */ +export function updateCheckRecord(data: MesDvCheckRecordApi.CheckRecord) { + return requestClient.put('/mes/dv/check-record/update', data); +} + +/** 提交设备点检记录 */ +export function submitCheckRecord(id: number) { + return requestClient.put(`/mes/dv/check-record/submit?id=${id}`); +} + +/** 删除设备点检记录 */ +export function deleteCheckRecord(id: number) { + return requestClient.delete(`/mes/dv/check-record/delete?id=${id}`); +} + +/** 导出设备点检记录 */ +export function exportCheckRecord(params: any) { + return requestClient.download('/mes/dv/check-record/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/checkrecord/line/index.ts b/apps/web-antdv-next/src/api/mes/dv/checkrecord/line/index.ts new file mode 100644 index 000000000..aae27a596 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/checkrecord/line/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvCheckRecordLineApi { + /** MES 设备点检记录明细 */ + export interface CheckRecordLine { + id?: number; // 明细编号 + recordId?: number; // 点检记录编号 + subjectId?: number; // 点检项目编号 + subjectCode?: string; // 项目编码 + subjectName?: string; // 项目名称 + subjectContent?: string; // 检查内容 + subjectStandard?: string; // 检查标准 + checkStatus?: number; // 点检结果 + checkResult?: string; // 异常描述 + remark?: string; // 备注 + } +} + +/** 查询设备点检记录明细分页 */ +export function getCheckRecordLinePage(params: PageParam) { + return requestClient.get>( + '/mes/dv/check-record-line/page', + { params }, + ); +} + +/** 查询设备点检记录明细详情 */ +export function getCheckRecordLine(id: number) { + return requestClient.get( + `/mes/dv/check-record-line/get?id=${id}`, + ); +} + +/** 新增设备点检记录明细 */ +export function createCheckRecordLine( + data: MesDvCheckRecordLineApi.CheckRecordLine, +) { + return requestClient.post('/mes/dv/check-record-line/create', data); +} + +/** 修改设备点检记录明细 */ +export function updateCheckRecordLine( + data: MesDvCheckRecordLineApi.CheckRecordLine, +) { + return requestClient.put('/mes/dv/check-record-line/update', data); +} + +/** 删除设备点检记录明细 */ +export function deleteCheckRecordLine(id: number) { + return requestClient.delete(`/mes/dv/check-record-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/machinery/index.ts b/apps/web-antdv-next/src/api/mes/dv/machinery/index.ts new file mode 100644 index 000000000..f57a77299 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/machinery/index.ts @@ -0,0 +1,85 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvMachineryApi { + /** MES 设备台账 */ + export interface Machinery { + id?: number; // 设备编号 + code?: string; // 设备编码 + name?: string; // 设备名称 + brand?: string; // 品牌 + specification?: string; // 规格型号 + machineryTypeId?: number; // 设备类型编号 + machineryTypeName?: string; // 设备类型名称 + workshopId?: number; // 所属车间编号 + workshopName?: string; // 所属车间名称 + status?: number; // 设备状态 + lastMaintenTime?: Date; // 最近保养时间 + lastCheckTime?: Date; // 最近点检时间 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** 设备导入结果 */ + export interface MachineryImportRespVO { + createCodes?: string[]; // 新增成功的设备编码 + updateCodes?: string[]; // 更新成功的设备编码 + failureCodes?: Record; // 导入失败的设备编码及原因 + } +} + +/** 查询设备分页 */ +export function getMachineryPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/machinery/page', + { params }, + ); +} + +/** 查询设备精简列表 */ +export function getMachinerySimpleList() { + return requestClient.get( + '/mes/dv/machinery/simple-list', + ); +} + +/** 查询设备详情 */ +export function getMachinery(id: number) { + return requestClient.get( + `/mes/dv/machinery/get?id=${id}`, + ); +} + +/** 新增设备 */ +export function createMachinery(data: MesDvMachineryApi.Machinery) { + return requestClient.post('/mes/dv/machinery/create', data); +} + +/** 修改设备 */ +export function updateMachinery(data: MesDvMachineryApi.Machinery) { + return requestClient.put('/mes/dv/machinery/update', data); +} + +/** 删除设备 */ +export function deleteMachinery(id: number) { + return requestClient.delete(`/mes/dv/machinery/delete?id=${id}`); +} + +/** 导出设备 */ +export function exportMachinery(params: any) { + return requestClient.download('/mes/dv/machinery/export-excel', { params }); +} + +/** 下载设备导入模板 */ +export function importMachineryTemplate() { + return requestClient.download('/mes/dv/machinery/get-import-template'); +} + +/** 导入设备 */ +export function importMachinery(file: File, updateSupport: boolean) { + return requestClient.upload( + `/mes/dv/machinery/import?updateSupport=${updateSupport}`, + { file }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/machinery/type/index.ts b/apps/web-antdv-next/src/api/mes/dv/machinery/type/index.ts new file mode 100644 index 000000000..eddc2caa8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/machinery/type/index.ts @@ -0,0 +1,53 @@ +import { requestClient } from '#/api/request'; + +export namespace MesDvMachineryTypeApi { + /** MES 设备类型 */ + export interface MachineryType { + id?: number; // 设备类型编号 + parentId?: number; // 父类型编号 + code?: string; // 类型编码 + name?: string; // 类型名称 + sort?: number; // 显示排序 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + children?: MachineryType[]; // 子类型 + } +} + +/** 查询设备类型列表 */ +export function getMachineryTypeList(params?: any) { + return requestClient.get( + '/mes/dv/machinery-type/list', + { params }, + ); +} + +/** 查询设备类型精简列表 */ +export function getMachineryTypeSimpleList() { + return requestClient.get( + '/mes/dv/machinery-type/simple-list', + ); +} + +/** 查询设备类型详情 */ +export function getMachineryType(id: number) { + return requestClient.get( + `/mes/dv/machinery-type/get?id=${id}`, + ); +} + +/** 新增设备类型 */ +export function createMachineryType(data: MesDvMachineryTypeApi.MachineryType) { + return requestClient.post('/mes/dv/machinery-type/create', data); +} + +/** 修改设备类型 */ +export function updateMachineryType(data: MesDvMachineryTypeApi.MachineryType) { + return requestClient.put('/mes/dv/machinery-type/update', data); +} + +/** 删除设备类型 */ +export function deleteMachineryType(id: number) { + return requestClient.delete(`/mes/dv/machinery-type/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/maintenrecord/index.ts b/apps/web-antdv-next/src/api/mes/dv/maintenrecord/index.ts new file mode 100644 index 000000000..3ebf305f8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/maintenrecord/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvMaintenRecordApi { + /** MES 设备保养记录 */ + export interface MaintenRecord { + id?: number; // 记录编号 + planId?: number; // 计划编号 + planName?: string; // 计划名称 + machineryId?: number; // 设备编号 + machineryCode?: string; // 设备编码 + machineryName?: string; // 设备名称 + machineryBrand?: string; // 品牌 + machinerySpecification?: string; // 规格型号 + maintenTime?: Date | number; // 保养时间 + userId?: number; // 用户编号 + nickname?: string; // 保养人名称 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询设备保养记录分页 */ +export function getMaintenRecordPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/mainten-record/page', + { params }, + ); +} + +/** 查询设备保养记录详情 */ +export function getMaintenRecord(id: number) { + return requestClient.get( + `/mes/dv/mainten-record/get?id=${id}`, + ); +} + +/** 新增设备保养记录 */ +export function createMaintenRecord(data: MesDvMaintenRecordApi.MaintenRecord) { + return requestClient.post('/mes/dv/mainten-record/create', data); +} + +/** 修改设备保养记录 */ +export function updateMaintenRecord(data: MesDvMaintenRecordApi.MaintenRecord) { + return requestClient.put('/mes/dv/mainten-record/update', data); +} + +/** 提交设备保养记录 */ +export function submitMaintenRecord(id: number) { + return requestClient.put(`/mes/dv/mainten-record/submit?id=${id}`); +} + +/** 删除设备保养记录 */ +export function deleteMaintenRecord(id: number) { + return requestClient.delete(`/mes/dv/mainten-record/delete?id=${id}`); +} + +/** 导出设备保养记录 */ +export function exportMaintenRecord(params: any) { + return requestClient.download('/mes/dv/mainten-record/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/maintenrecord/line/index.ts b/apps/web-antdv-next/src/api/mes/dv/maintenrecord/line/index.ts new file mode 100644 index 000000000..fa67f638a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/maintenrecord/line/index.ts @@ -0,0 +1,51 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvMaintenRecordLineApi { + /** MES 设备保养记录明细 */ + export interface MaintenRecordLine { + id?: number; // 明细编号 + recordId?: number; // 保养记录编号 + subjectId?: number; // 项目编号 + subjectName?: string; // 项目名称 + subjectContent?: string; // 项目内容 + subjectStandard?: string; // 项目标准 + status?: number; // 保养结果 + result?: string; // 异常描述 + remark?: string; // 备注 + } +} + +/** 查询设备保养记录明细分页 */ +export function getMaintenRecordLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/dv/mainten-record-line/page', { params }); +} + +/** 查询设备保养记录明细详情 */ +export function getMaintenRecordLine(id: number) { + return requestClient.get( + `/mes/dv/mainten-record-line/get?id=${id}`, + ); +} + +/** 新增设备保养记录明细 */ +export function createMaintenRecordLine( + data: MesDvMaintenRecordLineApi.MaintenRecordLine, +) { + return requestClient.post('/mes/dv/mainten-record-line/create', data); +} + +/** 修改设备保养记录明细 */ +export function updateMaintenRecordLine( + data: MesDvMaintenRecordLineApi.MaintenRecordLine, +) { + return requestClient.put('/mes/dv/mainten-record-line/update', data); +} + +/** 删除设备保养记录明细 */ +export function deleteMaintenRecordLine(id: number) { + return requestClient.delete(`/mes/dv/mainten-record-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/repair/index.ts b/apps/web-antdv-next/src/api/mes/dv/repair/index.ts new file mode 100644 index 000000000..45a69fcfe --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/repair/index.ts @@ -0,0 +1,81 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvRepairApi { + /** MES 维修工单 */ + export interface Repair { + id?: number; // 工单编号 + code?: string; // 维修工单编码 + name?: string; // 维修工单名称 + machineryId?: number; // 设备编号 + machineryCode?: string; // 设备编码 + machineryName?: string; // 设备名称 + machineryBrand?: string; // 品牌 + machinerySpecification?: string; // 规格型号 + requireDate?: Date | number; // 报修日期 + finishDate?: Date | number; // 维修完成日期 + confirmDate?: Date | number; // 验收日期 + result?: number; // 维修结果 + acceptedUserId?: number; // 维修人编号 + acceptedUserNickname?: string; // 维修人名称 + confirmUserId?: number; // 验收人编号 + confirmUserNickname?: string; // 验收人名称 + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据编号 + sourceDocCode?: string; // 来源单据编码 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询维修工单分页 */ +export function getRepairPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/repair/page', + { params }, + ); +} + +/** 查询维修工单详情 */ +export function getRepair(id: number) { + return requestClient.get( + `/mes/dv/repair/get?id=${id}`, + ); +} + +/** 新增维修工单 */ +export function createRepair(data: MesDvRepairApi.Repair) { + return requestClient.post('/mes/dv/repair/create', data); +} + +/** 修改维修工单 */ +export function updateRepair(data: MesDvRepairApi.Repair) { + return requestClient.put('/mes/dv/repair/update', data); +} + +/** 删除维修工单 */ +export function deleteRepair(id: number) { + return requestClient.delete(`/mes/dv/repair/delete?id=${id}`); +} + +/** 导出维修工单 */ +export function exportRepair(params: any) { + return requestClient.download('/mes/dv/repair/export-excel', { params }); +} + +/** 提交维修工单 */ +export function submitRepair(id: number) { + return requestClient.put(`/mes/dv/repair/submit?id=${id}`); +} + +/** 确认维修完成 */ +export function confirmRepair(data: MesDvRepairApi.Repair) { + return requestClient.put('/mes/dv/repair/confirm', data); +} + +/** 完成验收 */ +export function finishRepair(id: number, result: number) { + return requestClient.put(`/mes/dv/repair/finish?id=${id}&result=${result}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/repair/line/index.ts b/apps/web-antdv-next/src/api/mes/dv/repair/line/index.ts new file mode 100644 index 000000000..cf951c5dd --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/repair/line/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvRepairLineApi { + /** MES 维修工单行 */ + export interface RepairLine { + id?: number; // 明细编号 + repairId?: number; // 维修工单编号 + subjectId?: number; // 项目编号 + subjectName?: string; // 项目名称 + subjectContent?: string; // 项目内容 + subjectStandard?: string; // 项目标准 + malfunction?: string; // 故障描述 + malfunctionUrl?: string; // 故障图片 URL + description?: string; // 维修描述 + remark?: string; // 备注 + } +} + +/** 查询维修工单行分页 */ +export function getRepairLinePage(params: PageParam) { + return requestClient.get>( + '/mes/dv/repair-line/page', + { params }, + ); +} + +/** 查询维修工单行详情 */ +export function getRepairLine(id: number) { + return requestClient.get( + `/mes/dv/repair-line/get?id=${id}`, + ); +} + +/** 新增维修工单行 */ +export function createRepairLine(data: MesDvRepairLineApi.RepairLine) { + return requestClient.post('/mes/dv/repair-line/create', data); +} + +/** 修改维修工单行 */ +export function updateRepairLine(data: MesDvRepairLineApi.RepairLine) { + return requestClient.put('/mes/dv/repair-line/update', data); +} + +/** 删除维修工单行 */ +export function deleteRepairLine(id: number) { + return requestClient.delete(`/mes/dv/repair-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/dv/subject/index.ts b/apps/web-antdv-next/src/api/mes/dv/subject/index.ts new file mode 100644 index 000000000..b74ba0ad4 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/dv/subject/index.ts @@ -0,0 +1,60 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesDvSubjectApi { + /** MES 点检保养项目 */ + export interface Subject { + id?: number; // 项目编号 + code?: string; // 项目编码 + name?: string; // 项目名称 + type?: number; // 项目类型 + content?: string; // 项目内容 + standard?: string; // 标准 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询点检保养项目分页 */ +export function getSubjectPage(params: PageParam) { + return requestClient.get>( + '/mes/dv/subject/page', + { params }, + ); +} + +/** 查询点检保养项目精简列表 */ +export function getSubjectSimpleList() { + return requestClient.get( + '/mes/dv/subject/simple-list', + ); +} + +/** 查询点检保养项目详情 */ +export function getSubject(id: number) { + return requestClient.get( + `/mes/dv/subject/get?id=${id}`, + ); +} + +/** 新增点检保养项目 */ +export function createSubject(data: MesDvSubjectApi.Subject) { + return requestClient.post('/mes/dv/subject/create', data); +} + +/** 修改点检保养项目 */ +export function updateSubject(data: MesDvSubjectApi.Subject) { + return requestClient.put('/mes/dv/subject/update', data); +} + +/** 删除点检保养项目 */ +export function deleteSubject(id: number) { + return requestClient.delete(`/mes/dv/subject/delete?id=${id}`); +} + +/** 导出点检保养项目 */ +export function exportSubject(params: any) { + return requestClient.download('/mes/dv/subject/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/home/index.ts b/apps/web-antdv-next/src/api/mes/home/index.ts new file mode 100644 index 000000000..cf1aa9953 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/home/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesHomeApi { + /** MES 首页汇总统计 */ + export interface Summary { + workOrderActiveCount: number; // 进行中工单数 + workOrderPrepareCount: number; // 待排产工单数 + workOrderFinishedCount: number; // 已完成工单数 + todayOutput: number; // 今日产量 + yesterdayOutput: number; // 昨日产量 + todayQualifiedQuantity: number; // 今日合格品数 + todayUnqualifiedQuantity: number; // 今日不良品数 + machineryTotal: number; // 设备总数 + machineryProducing: number; // 生产中设备数 + machineryStop: number; // 停机设备数 + machineryMaintenance: number; // 维护中设备数 + andonActiveCount: number; // 未处置安灯呼叫数 + repairActiveCount: number; // 待处理维修工单数 + } + + /** MES 工单状态分布 */ + export interface WorkOrderStatus { + status: number; // 工单状态 + statusName: string; // 工单状态名称 + count: number; // 数量 + } + + /** MES 生产趋势 */ + export interface ProductionTrend { + date: string; // 日期 + quantity: number; // 产量 + qualifiedQuantity: number; // 合格品数 + unqualifiedQuantity: number; // 不良品数 + } +} + +/** 获得首页汇总统计 */ +export function getHomeSummary() { + return requestClient.get('/mes/home-statistics/summary'); +} + +/** 获得工单状态分布 */ +export function getWorkOrderStatusDistribution() { + return requestClient.get( + '/mes/home-statistics/work-order-status', + ); +} + +/** 获得生产趋势 */ +export function getProductionTrend(days?: number) { + return requestClient.get( + '/mes/home-statistics/production-trend', + { params: { days } }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/autocode/part/index.ts b/apps/web-antdv-next/src/api/mes/md/autocode/part/index.ts new file mode 100644 index 000000000..c64684c9b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/autocode/part/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdAutoCodePartApi { + /** MES 编码规则分段 */ + export interface AutoCodePart { + id?: number; // 分段编号 + ruleId?: number; // 规则编号 + sort?: number; // 排序 + type?: number; // 分段类型 + length?: number; // 长度 + dateFormat?: string; // 日期格式 + fixCharacter?: string; // 固定字符 + serialStartNo?: number; // 流水号起始值 + serialStep?: number; // 流水号步长 + cycleFlag?: boolean; // 是否循环 + cycleMethod?: number; // 循环方式 + remark?: string; // 备注 + } +} + +/** 查询编码规则分段详情 */ +export function getAutoCodePart(id: number) { + return requestClient.get( + `/mes/md/auto-code-part/get?id=${id}`, + ); +} + +/** 查询编码规则分段列表 */ +export function getAutoCodePartListByRuleId(ruleId: number) { + return requestClient.get( + '/mes/md/auto-code-part/list-by-rule-id', + { params: { ruleId } }, + ); +} + +/** 新增编码规则分段 */ +export function createAutoCodePart(data: MesMdAutoCodePartApi.AutoCodePart) { + return requestClient.post('/mes/md/auto-code-part/create', data); +} + +/** 修改编码规则分段 */ +export function updateAutoCodePart(data: MesMdAutoCodePartApi.AutoCodePart) { + return requestClient.put('/mes/md/auto-code-part/update', data); +} + +/** 删除编码规则分段 */ +export function deleteAutoCodePart(id: number) { + return requestClient.delete(`/mes/md/auto-code-part/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/md/autocode/record/index.ts b/apps/web-antdv-next/src/api/mes/md/autocode/record/index.ts new file mode 100644 index 000000000..6110249ee --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/autocode/record/index.ts @@ -0,0 +1,9 @@ +import { requestClient } from '#/api/request'; + +/** 生成 MES 编码 */ +export function generateAutoCode(ruleCode: string, inputChar?: string) { + return requestClient.post('/mes/md/auto-code-record/generate', { + inputChar, + ruleCode, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/md/autocode/rule/index.ts b/apps/web-antdv-next/src/api/mes/md/autocode/rule/index.ts new file mode 100644 index 000000000..6955e7304 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/autocode/rule/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdAutoCodeRuleApi { + /** MES 编码规则 */ + export interface AutoCodeRule { + id?: number; // 规则编号 + code?: string; // 规则编码 + name?: string; // 规则名称 + description?: string; // 规则描述 + maxLength?: number; // 最大长度 + padded?: boolean; // 是否补齐 + paddedChar?: string; // 补齐字符 + paddedMethod?: number; // 补齐方式 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询编码规则分页 */ +export function getAutoCodeRulePage(params: PageParam) { + return requestClient.get>( + '/mes/md/auto-code-rule/page', + { params }, + ); +} + +/** 查询编码规则详情 */ +export function getAutoCodeRule(id: number) { + return requestClient.get( + `/mes/md/auto-code-rule/get?id=${id}`, + ); +} + +/** 新增编码规则 */ +export function createAutoCodeRule(data: MesMdAutoCodeRuleApi.AutoCodeRule) { + return requestClient.post('/mes/md/auto-code-rule/create', data); +} + +/** 修改编码规则 */ +export function updateAutoCodeRule(data: MesMdAutoCodeRuleApi.AutoCodeRule) { + return requestClient.put('/mes/md/auto-code-rule/update', data); +} + +/** 删除编码规则 */ +export function deleteAutoCodeRule(id: number) { + return requestClient.delete(`/mes/md/auto-code-rule/delete?id=${id}`); +} + +/** 导出编码规则 */ +export function exportAutoCodeRule(params: PageParam) { + return requestClient.download('/mes/md/auto-code-rule/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/md/client/index.ts b/apps/web-antdv-next/src/api/mes/md/client/index.ts new file mode 100644 index 000000000..9be868d69 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/client/index.ts @@ -0,0 +1,86 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdClientApi { + /** MES 客户 */ + export interface Client { + id?: number; // 客户编号 + code?: string; // 客户编码 + name?: string; // 客户名称 + nickname?: string; // 客户简称 + englishName?: string; // 客户英文名称 + description?: string; // 客户简介 + logo?: string; // 客户 LOGO 地址 + type?: number; // 客户类型 + address?: string; // 客户地址 + website?: string; // 客户官网地址 + email?: string; // 客户邮箱地址 + telephone?: string; // 客户电话 + contact1Name?: string; // 联系人1 + contact1Telephone?: string; // 联系人1电话 + contact1Email?: string; // 联系人1邮箱 + contact2Name?: string; // 联系人2 + contact2Telephone?: string; // 联系人2电话 + contact2Email?: string; // 联系人2邮箱 + creditCode?: string; // 统一社会信用代码 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** 客户导入结果 */ + export interface ClientImportRespVO { + createCodes?: string[]; // 新增成功的客户编码 + updateCodes?: string[]; // 更新成功的客户编码 + failureCodes?: Record; // 导入失败的客户编码及原因 + } +} + +/** 查询客户分页 */ +export function getClientPage(params: PageParam) { + return requestClient.get>( + '/mes/md-client/page', + { params }, + ); +} + +/** 查询客户详情 */ +export function getClient(id: number) { + return requestClient.get( + `/mes/md-client/get?id=${id}`, + ); +} + +/** 新增客户 */ +export function createClient(data: MesMdClientApi.Client) { + return requestClient.post('/mes/md-client/create', data); +} + +/** 修改客户 */ +export function updateClient(data: MesMdClientApi.Client) { + return requestClient.put('/mes/md-client/update', data); +} + +/** 删除客户 */ +export function deleteClient(id: number) { + return requestClient.delete(`/mes/md-client/delete?id=${id}`); +} + +/** 导出客户 */ +export function exportClient(params: any) { + return requestClient.download('/mes/md-client/export-excel', { params }); +} + +/** 下载客户导入模板 */ +export function importClientTemplate() { + return requestClient.download('/mes/md-client/get-import-template'); +} + +/** 导入客户 */ +export function importClient(file: File, updateSupport: boolean) { + return requestClient.upload( + `/mes/md-client/import?updateSupport=${updateSupport}`, + { file }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/batchConfig/index.ts b/apps/web-antdv-next/src/api/mes/md/item/batchConfig/index.ts new file mode 100644 index 000000000..676f02f75 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/batchConfig/index.ts @@ -0,0 +1,35 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdItemBatchConfigApi { + /** MES 物料批次属性配置 */ + export interface BatchConfig { + id?: number; // 编号 + itemId?: number; // 物料编号 + produceDateFlag?: boolean; // 批次属性-生产日期 + expireDateFlag?: boolean; // 批次属性-有效期 + receiptDateFlag?: boolean; // 批次属性-入库日期 + vendorFlag?: boolean; // 批次属性-供应商 + clientFlag?: boolean; // 批次属性-客户 + salesOrderCodeFlag?: boolean; // 批次属性-销售订单编号 + purchaseOrderCodeFlag?: boolean; // 批次属性-采购订单编号 + workorderFlag?: boolean; // 批次属性-生产工单 + taskFlag?: boolean; // 批次属性-生产任务 + workstationFlag?: boolean; // 批次属性-工作站 + toolFlag?: boolean; // 批次属性-工具 + moldFlag?: boolean; // 批次属性-模具 + lotNumberFlag?: boolean; // 批次属性-生产批号 + qualityStatusFlag?: boolean; // 批次属性-质量状态 + } +} + +/** 根据物料编号获取批次属性配置 */ +export function getBatchConfigByItemId(itemId: number) { + return requestClient.get( + `/mes/md/item-batch-config/get-by-item-id?itemId=${itemId}`, + ); +} + +/** 保存批次属性配置 */ +export function saveBatchConfig(data: MesMdItemBatchConfigApi.BatchConfig) { + return requestClient.post('/mes/md/item-batch-config/save', data); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/index.ts b/apps/web-antdv-next/src/api/mes/md/item/index.ts new file mode 100644 index 000000000..9d3b107f8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/index.ts @@ -0,0 +1,83 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdItemApi { + /** MES 物料产品 */ + export interface Item { + id?: number; // 物料编号 + code?: string; // 物料编码 + name?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureId?: number; // 计量单位编号 + unitMeasureName?: string; // 计量单位名称 + itemTypeId?: number; // 物料分类编号 + itemTypeName?: string; // 物料分类名称 + itemOrProduct?: string; // 物料/产品标识 + status?: number; // 状态 + safeStockFlag?: boolean; // 是否启用安全库存 + minStock?: number; // 最低库存量 + maxStock?: number; // 最高库存量 + highValue?: boolean; // 是否高值物料 + batchFlag?: boolean; // 是否启用批次管理 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** 物料导入结果 */ + export interface ItemImportRespVO { + createCodes?: string[]; // 新增成功的物料编码 + updateCodes?: string[]; // 更新成功的物料编码 + failureCodes?: Record; // 导入失败的物料编码及原因 + } +} + +/** 查询物料产品分页 */ +export function getItemPage(params: PageParam) { + return requestClient.get>('/mes/md/item/page', { params }); +} + +/** 查询物料产品详情 */ +export function getItem(id: number) { + return requestClient.get(`/mes/md/item/get?id=${id}`); +} + +/** 新增物料产品 */ +export function createItem(data: MesMdItemApi.Item) { + return requestClient.post('/mes/md/item/create', data); +} + +/** 修改物料产品 */ +export function updateItem(data: MesMdItemApi.Item) { + return requestClient.put('/mes/md/item/update', data); +} + +/** 修改物料产品状态 */ +export function updateItemStatus(id: number, status: number) { + return requestClient.put('/mes/md/item/update-status', undefined, { + params: { id, status }, + }); +} + +/** 删除物料产品 */ +export function deleteItem(id: number) { + return requestClient.delete(`/mes/md/item/delete?id=${id}`); +} + +/** 导出物料产品 */ +export function exportItem(params: any) { + return requestClient.download('/mes/md/item/export-excel', { params }); +} + +/** 下载物料导入模板 */ +export function importItemTemplate() { + return requestClient.download('/mes/md/item/get-import-template'); +} + +/** 导入物料产品 */ +export function importItem(file: File, updateSupport: boolean) { + return requestClient.upload( + `/mes/md/item/import?updateSupport=${updateSupport}`, + { file }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/productBom/index.ts b/apps/web-antdv-next/src/api/mes/md/item/productBom/index.ts new file mode 100644 index 000000000..27176a60a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/productBom/index.ts @@ -0,0 +1,58 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdProductBomApi { + /** MES 产品 BOM */ + export interface ProductBom { + id?: number; // BOM 编号 + itemId?: number; // 物料产品编号 + bomItemId?: number; // BOM 物料编号 + quantity?: number; // 物料使用比例 + status?: number; // 是否启用 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + bomItemCode?: string; // BOM 物料编码 + bomItemName?: string; // BOM 物料名称 + bomItemSpecification?: string; // BOM 物料规格 + unitMeasureName?: string; // 计量单位名称 + itemOrProduct?: string; // 物料/产品标识 + } +} + +/** 新增产品 BOM */ +export function createProductBom(data: MesMdProductBomApi.ProductBom) { + return requestClient.post('/mes/md/product-bom/create', data); +} + +/** 修改产品 BOM */ +export function updateProductBom(data: MesMdProductBomApi.ProductBom) { + return requestClient.put('/mes/md/product-bom/update', data); +} + +/** 删除产品 BOM */ +export function deleteProductBom(id: number) { + return requestClient.delete(`/mes/md/product-bom/delete?id=${id}`); +} + +/** 查询产品 BOM 详情 */ +export function getProductBom(id: number) { + return requestClient.get( + `/mes/md/product-bom/get?id=${id}`, + ); +} + +/** 查询产品 BOM 分页 */ +export function getProductBomPage(params: PageParam) { + return requestClient.get>( + '/mes/md/product-bom/page', + { params }, + ); +} + +/** 根据物料产品编号查询产品 BOM 列表 */ +export function getProductBomListByItemId(itemId: number) { + return requestClient.get( + `/mes/md/product-bom/list-by-item-id?itemId=${itemId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/productSip/index.ts b/apps/web-antdv-next/src/api/mes/md/item/productSip/index.ts new file mode 100644 index 000000000..eac5599d7 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/productSip/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdProductSipApi { + /** MES 产品 SIP */ + export interface ProductSip { + id?: number; // SIP 编号 + itemId?: number; // 物料产品编号 + sort?: number; // 排列顺序 + processId?: number; // 工序编号 + title?: string; // 标题 + description?: string; // 详细描述 + url?: string; // 图片地址 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + processCode?: string; // 工序编码 + processName?: string; // 工序名称 + } +} + +/** 新增产品 SIP */ +export function createProductSip(data: MesMdProductSipApi.ProductSip) { + return requestClient.post('/mes/md/product-sip/create', data); +} + +/** 修改产品 SIP */ +export function updateProductSip(data: MesMdProductSipApi.ProductSip) { + return requestClient.put('/mes/md/product-sip/update', data); +} + +/** 删除产品 SIP */ +export function deleteProductSip(id: number) { + return requestClient.delete(`/mes/md/product-sip/delete?id=${id}`); +} + +/** 查询产品 SIP 详情 */ +export function getProductSip(id: number) { + return requestClient.get( + `/mes/md/product-sip/get?id=${id}`, + ); +} + +/** 查询产品 SIP 分页 */ +export function getProductSipPage(params: PageParam) { + return requestClient.get>( + '/mes/md/product-sip/page', + { params }, + ); +} + +/** 根据物料产品编号查询产品 SIP 列表 */ +export function getProductSipListByItemId(itemId: number) { + return requestClient.get( + `/mes/md/product-sip/list-by-item-id?itemId=${itemId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/productSop/index.ts b/apps/web-antdv-next/src/api/mes/md/item/productSop/index.ts new file mode 100644 index 000000000..554869a41 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/productSop/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdProductSopApi { + /** MES 产品 SOP */ + export interface ProductSop { + id?: number; // SOP 编号 + itemId?: number; // 物料产品编号 + sort?: number; // 排列顺序 + processId?: number; // 工序编号 + title?: string; // 标题 + description?: string; // 详细描述 + url?: string; // 图片地址 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + processCode?: string; // 工序编码 + processName?: string; // 工序名称 + } +} + +/** 新增产品 SOP */ +export function createProductSop(data: MesMdProductSopApi.ProductSop) { + return requestClient.post('/mes/md/product-sop/create', data); +} + +/** 修改产品 SOP */ +export function updateProductSop(data: MesMdProductSopApi.ProductSop) { + return requestClient.put('/mes/md/product-sop/update', data); +} + +/** 删除产品 SOP */ +export function deleteProductSop(id: number) { + return requestClient.delete(`/mes/md/product-sop/delete?id=${id}`); +} + +/** 查询产品 SOP 详情 */ +export function getProductSop(id: number) { + return requestClient.get( + `/mes/md/product-sop/get?id=${id}`, + ); +} + +/** 查询产品 SOP 分页 */ +export function getProductSopPage(params: PageParam) { + return requestClient.get>( + '/mes/md/product-sop/page', + { params }, + ); +} + +/** 根据物料产品编号查询产品 SOP 列表 */ +export function getProductSopListByItemId(itemId: number) { + return requestClient.get( + `/mes/md/product-sop/list-by-item-id?itemId=${itemId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/item/type/index.ts b/apps/web-antdv-next/src/api/mes/md/item/type/index.ts new file mode 100644 index 000000000..e9367ee1f --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/item/type/index.ts @@ -0,0 +1,54 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdItemTypeApi { + /** MES 物料产品分类 */ + export interface ItemType { + id?: number; // 分类编号 + parentId?: number; // 父分类编号 + code?: string; // 分类编码 + name?: string; // 分类名称 + itemOrProduct?: string; // 物料/产品标识 + sort?: number; // 显示排序 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + children?: ItemType[]; // 子分类 + } +} + +/** 查询物料产品分类列表 */ +export function getItemTypeList(params?: any) { + return requestClient.get( + '/mes/md/item-type/list', + { params }, + ); +} + +/** 查询物料产品分类精简列表 */ +export function getItemTypeSimpleList() { + return requestClient.get( + '/mes/md/item-type/simple-list', + ); +} + +/** 查询物料产品分类详情 */ +export function getItemType(id: number) { + return requestClient.get( + `/mes/md/item-type/get?id=${id}`, + ); +} + +/** 新增物料产品分类 */ +export function createItemType(data: MesMdItemTypeApi.ItemType) { + return requestClient.post('/mes/md/item-type/create', data); +} + +/** 修改物料产品分类 */ +export function updateItemType(data: MesMdItemTypeApi.ItemType) { + return requestClient.put('/mes/md/item-type/update', data); +} + +/** 删除物料产品分类 */ +export function deleteItemType(id: number) { + return requestClient.delete(`/mes/md/item-type/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/md/unitmeasure/index.ts b/apps/web-antdv-next/src/api/mes/md/unitmeasure/index.ts new file mode 100644 index 000000000..d90cc19c3 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/unitmeasure/index.ts @@ -0,0 +1,62 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdUnitMeasureApi { + /** MES 计量单位 */ + export interface UnitMeasure { + id?: number; // 单位编号 + code?: string; // 单位编码 + name?: string; // 单位名称 + primaryFlag?: boolean; // 是否主单位 + primaryId?: number; // 主单位编号 + changeRate?: number; // 与主单位换算比例 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询计量单位分页 */ +export function getUnitMeasurePage(params: PageParam) { + return requestClient.get>( + '/mes/md/unit-measure/page', + { params }, + ); +} + +/** 查询计量单位精简列表 */ +export function getUnitMeasureSimpleList() { + return requestClient.get( + '/mes/md/unit-measure/simple-list', + ); +} + +/** 查询计量单位详情 */ +export function getUnitMeasure(id: number) { + return requestClient.get( + `/mes/md/unit-measure/get?id=${id}`, + ); +} + +/** 新增计量单位 */ +export function createUnitMeasure(data: MesMdUnitMeasureApi.UnitMeasure) { + return requestClient.post('/mes/md/unit-measure/create', data); +} + +/** 修改计量单位 */ +export function updateUnitMeasure(data: MesMdUnitMeasureApi.UnitMeasure) { + return requestClient.put('/mes/md/unit-measure/update', data); +} + +/** 删除计量单位 */ +export function deleteUnitMeasure(id: number) { + return requestClient.delete(`/mes/md/unit-measure/delete?id=${id}`); +} + +/** 导出计量单位 */ +export function exportUnitMeasure(params: PageParam) { + return requestClient.download('/mes/md/unit-measure/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/md/vendor/index.ts b/apps/web-antdv-next/src/api/mes/md/vendor/index.ts new file mode 100644 index 000000000..e64845f53 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/vendor/index.ts @@ -0,0 +1,87 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdVendorApi { + /** MES 供应商 */ + export interface Vendor { + id?: number; // 供应商编号 + code?: string; // 供应商编码 + name?: string; // 供应商名称 + nickname?: string; // 供应商简称 + englishName?: string; // 供应商英文名称 + description?: string; // 供应商简介 + logo?: string; // 供应商 LOGO 地址 + level?: string; // 供应商等级 + score?: number; // 供应商评分 + address?: string; // 供应商地址 + website?: string; // 供应商官网地址 + email?: string; // 供应商邮箱地址 + telephone?: string; // 供应商电话 + contact1Name?: string; // 联系人1 + contact1Telephone?: string; // 联系人1电话 + contact1Email?: string; // 联系人1邮箱 + contact2Name?: string; // 联系人2 + contact2Telephone?: string; // 联系人2电话 + contact2Email?: string; // 联系人2邮箱 + creditCode?: string; // 统一社会信用代码 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** 供应商导入结果 */ + export interface VendorImportRespVO { + createCodes?: string[]; // 新增成功的供应商编码 + updateCodes?: string[]; // 更新成功的供应商编码 + failureCodes?: Record; // 导入失败的供应商编码及原因 + } +} + +/** 查询供应商分页 */ +export function getVendorPage(params: PageParam) { + return requestClient.get>( + '/mes/md-vendor/page', + { params }, + ); +} + +/** 查询供应商详情 */ +export function getVendor(id: number) { + return requestClient.get( + `/mes/md-vendor/get?id=${id}`, + ); +} + +/** 新增供应商 */ +export function createVendor(data: MesMdVendorApi.Vendor) { + return requestClient.post('/mes/md-vendor/create', data); +} + +/** 修改供应商 */ +export function updateVendor(data: MesMdVendorApi.Vendor) { + return requestClient.put('/mes/md-vendor/update', data); +} + +/** 删除供应商 */ +export function deleteVendor(id: number) { + return requestClient.delete(`/mes/md-vendor/delete?id=${id}`); +} + +/** 导出供应商 */ +export function exportVendor(params: any) { + return requestClient.download('/mes/md-vendor/export-excel', { params }); +} + +/** 下载供应商导入模板 */ +export function importVendorTemplate() { + return requestClient.download('/mes/md-vendor/get-import-template'); +} + +/** 导入供应商 */ +export function importVendor(file: File, updateSupport: boolean) { + return requestClient.upload( + `/mes/md-vendor/import?updateSupport=${updateSupport}`, + { file }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/md/workstation/index.ts b/apps/web-antdv-next/src/api/mes/md/workstation/index.ts new file mode 100644 index 000000000..4880f3bbe --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/workstation/index.ts @@ -0,0 +1,58 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdWorkstationApi { + /** MES 工作站 */ + export interface Workstation { + id?: number; // 工作站编号 + code?: string; // 工作站编码 + name?: string; // 工作站名称 + address?: string; // 工作站地点 + workshopId?: number; // 所在车间编号 + workshopName?: string; // 所在车间名称 + processId?: number; // 工序编号 + processName?: string; // 工序名称 + warehouseId?: number; // 线边库编号 + locationId?: number; // 库区编号 + areaId?: number; // 库位编号 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工作站分页 */ +export function getWorkstationPage(params: PageParam) { + return requestClient.get>( + '/mes/md-workstation/page', + { params }, + ); +} + +/** 查询工作站详情 */ +export function getWorkstation(id: number) { + return requestClient.get( + `/mes/md-workstation/get?id=${id}`, + ); +} + +/** 新增工作站 */ +export function createWorkstation(data: MesMdWorkstationApi.Workstation) { + return requestClient.post('/mes/md-workstation/create', data); +} + +/** 修改工作站 */ +export function updateWorkstation(data: MesMdWorkstationApi.Workstation) { + return requestClient.put('/mes/md-workstation/update', data); +} + +/** 删除工作站 */ +export function deleteWorkstation(id: number) { + return requestClient.delete(`/mes/md-workstation/delete?id=${id}`); +} + +/** 导出工作站 */ +export function exportWorkstation(params: any) { + return requestClient.download('/mes/md-workstation/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/md/workstation/machine/index.ts b/apps/web-antdv-next/src/api/mes/md/workstation/machine/index.ts new file mode 100644 index 000000000..40dd8692b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/workstation/machine/index.ts @@ -0,0 +1,35 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdWorkstationMachineApi { + /** MES 工作站设备资源 */ + export interface WorkstationMachine { + id?: number; // 资源编号 + workstationId?: number; // 工作站编号 + machineryId?: number; // 设备编号 + machineryCode?: string; // 设备编码 + machineryName?: string; // 设备名称 + quantity?: number; // 数量 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工作站设备资源列表 */ +export function getWorkstationMachineList(workstationId: number) { + return requestClient.get( + '/mes/md-workstation-machine/list-by-workstation', + { params: { workstationId } }, + ); +} + +/** 新增工作站设备资源 */ +export function createWorkstationMachine( + data: MesMdWorkstationMachineApi.WorkstationMachine, +) { + return requestClient.post('/mes/md-workstation-machine/create', data); +} + +/** 删除工作站设备资源 */ +export function deleteWorkstationMachine(id: number) { + return requestClient.delete(`/mes/md-workstation-machine/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/md/workstation/tool/index.ts b/apps/web-antdv-next/src/api/mes/md/workstation/tool/index.ts new file mode 100644 index 000000000..d98e5f122 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/workstation/tool/index.ts @@ -0,0 +1,41 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdWorkstationToolApi { + /** MES 工作站工装夹具资源 */ + export interface WorkstationTool { + id?: number; // 资源编号 + workstationId?: number; // 工作站编号 + toolTypeId?: number; // 工具类型编号 + toolTypeName?: string; // 工具类型名称 + quantity?: number; // 数量 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工作站工装夹具资源列表 */ +export function getWorkstationToolList(workstationId: number) { + return requestClient.get( + '/mes/md-workstation-tool/list-by-workstation', + { params: { workstationId } }, + ); +} + +/** 新增工作站工装夹具资源 */ +export function createWorkstationTool( + data: MesMdWorkstationToolApi.WorkstationTool, +) { + return requestClient.post('/mes/md-workstation-tool/create', data); +} + +/** 修改工作站工装夹具资源 */ +export function updateWorkstationTool( + data: MesMdWorkstationToolApi.WorkstationTool, +) { + return requestClient.put('/mes/md-workstation-tool/update', data); +} + +/** 删除工作站工装夹具资源 */ +export function deleteWorkstationTool(id: number) { + return requestClient.delete(`/mes/md-workstation-tool/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/md/workstation/worker/index.ts b/apps/web-antdv-next/src/api/mes/md/workstation/worker/index.ts new file mode 100644 index 000000000..3bd4ab9ad --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/workstation/worker/index.ts @@ -0,0 +1,41 @@ +import { requestClient } from '#/api/request'; + +export namespace MesMdWorkstationWorkerApi { + /** MES 工作站人力资源 */ + export interface WorkstationWorker { + id?: number; // 资源编号 + workstationId?: number; // 工作站编号 + postId?: number; // 岗位编号 + postName?: string; // 岗位名称 + quantity?: number; // 数量 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工作站人力资源列表 */ +export function getWorkstationWorkerList(workstationId: number) { + return requestClient.get( + '/mes/md-workstation-worker/list-by-workstation', + { params: { workstationId } }, + ); +} + +/** 新增工作站人力资源 */ +export function createWorkstationWorker( + data: MesMdWorkstationWorkerApi.WorkstationWorker, +) { + return requestClient.post('/mes/md-workstation-worker/create', data); +} + +/** 修改工作站人力资源 */ +export function updateWorkstationWorker( + data: MesMdWorkstationWorkerApi.WorkstationWorker, +) { + return requestClient.put('/mes/md-workstation-worker/update', data); +} + +/** 删除工作站人力资源 */ +export function deleteWorkstationWorker(id: number) { + return requestClient.delete(`/mes/md-workstation-worker/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/md/workstation/workshop/index.ts b/apps/web-antdv-next/src/api/mes/md/workstation/workshop/index.ts new file mode 100644 index 000000000..5a96399c9 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/md/workstation/workshop/index.ts @@ -0,0 +1,60 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesMdWorkshopApi { + /** MES 车间 */ + export interface Workshop { + id?: number; // 车间编号 + code?: string; // 车间编码 + name?: string; // 车间名称 + area?: number; // 面积 + chargeUserId?: number; // 负责人用户编号 + chargeUserName?: string; // 负责人名称 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询车间分页 */ +export function getWorkshopPage(params: PageParam) { + return requestClient.get>( + '/mes/md-workshop/page', + { params }, + ); +} + +/** 查询车间精简列表 */ +export function getWorkshopSimpleList() { + return requestClient.get( + '/mes/md-workshop/simple-list', + ); +} + +/** 查询车间详情 */ +export function getWorkshop(id: number) { + return requestClient.get( + `/mes/md-workshop/get?id=${id}`, + ); +} + +/** 新增车间 */ +export function createWorkshop(data: MesMdWorkshopApi.Workshop) { + return requestClient.post('/mes/md-workshop/create', data); +} + +/** 修改车间 */ +export function updateWorkshop(data: MesMdWorkshopApi.Workshop) { + return requestClient.put('/mes/md-workshop/update', data); +} + +/** 删除车间 */ +export function deleteWorkshop(id: number) { + return requestClient.delete(`/mes/md-workshop/delete?id=${id}`); +} + +/** 导出车间 */ +export function exportWorkshop(params: any) { + return requestClient.download('/mes/md-workshop/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/andon/config/index.ts b/apps/web-antdv-next/src/api/mes/pro/andon/config/index.ts new file mode 100644 index 000000000..9309a0c8c --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/andon/config/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProAndonConfigApi { + /** MES 安灯配置 */ + export interface AndonConfig { + id?: number; // 编号 + reason?: string; // 呼叫原因 + level?: number; // 级别 + handlerRoleId?: number; // 处置角色编号 + handlerRoleName?: string; // 处置角色名称 + handlerUserId?: number; // 处置人编号 + handlerUserNickname?: string; // 处置人昵称 + remark?: string; // 备注 + } +} + +/** 查询安灯配置分页 */ +export function getAndonConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/andon-config/page', + { params }, + ); +} + +/** 查询安灯配置列表 */ +export function getAndonConfigList() { + return requestClient.get( + '/mes/pro/andon-config/list', + ); +} + +/** 查询安灯配置详情 */ +export function getAndonConfig(id: number) { + return requestClient.get( + `/mes/pro/andon-config/get?id=${id}`, + ); +} + +/** 新增安灯配置 */ +export function createAndonConfig(data: MesProAndonConfigApi.AndonConfig) { + return requestClient.post('/mes/pro/andon-config/create', data); +} + +/** 修改安灯配置 */ +export function updateAndonConfig(data: MesProAndonConfigApi.AndonConfig) { + return requestClient.put('/mes/pro/andon-config/update', data); +} + +/** 删除安灯配置 */ +export function deleteAndonConfig(id: number) { + return requestClient.delete(`/mes/pro/andon-config/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/andon/record/index.ts b/apps/web-antdv-next/src/api/mes/pro/andon/record/index.ts new file mode 100644 index 000000000..b8cf4349b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/andon/record/index.ts @@ -0,0 +1,76 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProAndonRecordApi { + /** MES 安灯记录 */ + export interface AndonRecord { + id?: number; + configId?: number; // 安灯配置编号 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + processId?: number; // 工序编号 + processName?: string; // 工序名称 + userId?: number; // 发起用户编号 + userNickname?: string; // 发起人昵称 + reason?: string; // 呼叫原因 + level?: number; // 级别 + status?: number; // 处置状态 + handleTime?: number; // 处置时间(毫秒时间戳) + handlerUserId?: number; // 处置人编号 + handlerUserNickname?: string; // 处置人昵称 + remark?: string; // 备注 + createTime?: number; // 发起时间 + } + + /** MES 安灯记录分页查询参数 */ + export interface PageParams extends PageParam { + workstationId?: number; // 工作站编号 + userId?: number; // 发起用户编号 + handlerUserId?: number; // 处置人编号 + status?: number; // 处置状态 + createTime?: string[]; // 发起时间区间 + } +} + +/** 查询安灯记录分页 */ +export function getAndonRecordPage(params: MesProAndonRecordApi.PageParams) { + return requestClient.get>( + '/mes/pro/andon-record/page', + { params }, + ); +} + +/** 查询安灯记录详情 */ +export function getAndonRecord(id: number) { + return requestClient.get( + `/mes/pro/andon-record/get?id=${id}`, + ); +} + +/** 新增安灯记录 */ +export function createAndonRecord(data: MesProAndonRecordApi.AndonRecord) { + return requestClient.post('/mes/pro/andon-record/create', data); +} + +/** 删除安灯记录 */ +export function deleteAndonRecord(id: number) { + return requestClient.delete(`/mes/pro/andon-record/delete?id=${id}`); +} + +/** 更新安灯记录(保存/已处置) */ +export function updateAndonRecord(data: MesProAndonRecordApi.AndonRecord) { + return requestClient.put('/mes/pro/andon-record/update', data); +} + +/** 导出安灯记录 Excel */ +export function exportAndonRecord( + params: Partial, +) { + return requestClient.download('/mes/pro/andon-record/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/card/index.ts b/apps/web-antdv-next/src/api/mes/pro/card/index.ts new file mode 100644 index 000000000..a9d123cc3 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/card/index.ts @@ -0,0 +1,79 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProCardApi { + /** MES 生产流转卡 */ + export interface Card { + id?: number; // 编号 + code?: string; // 流转卡编码 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + workOrderName?: string; // 工单名称 + batchCode?: string; // 批次号 + itemId?: number; // 产品物料编号 + itemCode?: string; // 产品编码 + itemName?: string; // 产品名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + transferedQuantity?: number; // 流转数量 + status?: number; // 状态 + remark?: string; // 备注 + } + + /** MES 生产流转卡分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + workOrderId?: number; + itemId?: number; + batchCode?: string; + } +} + +/** 查询生产流转卡分页 */ +export function getCardPage(params: MesProCardApi.PageParams) { + return requestClient.get>( + '/mes/pro/card/page', + { params }, + ); +} + +/** 查询生产流转卡详情 */ +export function getCard(id: number) { + return requestClient.get(`/mes/pro/card/get?id=${id}`); +} + +/** 新增生产流转卡 */ +export function createCard(data: MesProCardApi.Card) { + return requestClient.post('/mes/pro/card/create', data); +} + +/** 修改生产流转卡 */ +export function updateCard(data: MesProCardApi.Card) { + return requestClient.put('/mes/pro/card/update', data); +} + +/** 删除生产流转卡 */ +export function deleteCard(id: number) { + return requestClient.delete(`/mes/pro/card/delete?id=${id}`); +} + +/** 导出生产流转卡 */ +export function exportCard(params: any) { + return requestClient.download('/mes/pro/card/export-excel', { params }); +} + +/** 提交生产流转卡 */ +export function submitCard(id: number) { + return requestClient.put(`/mes/pro/card/submit?id=${id}`); +} + +/** 完成生产流转卡 */ +export function finishCard(id: number) { + return requestClient.put(`/mes/pro/card/finish?id=${id}`); +} + +/** 取消生产流转卡 */ +export function cancelCard(id: number) { + return requestClient.put(`/mes/pro/card/cancel?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/card/process/index.ts b/apps/web-antdv-next/src/api/mes/pro/card/process/index.ts new file mode 100644 index 000000000..a6f372fe2 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/card/process/index.ts @@ -0,0 +1,62 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProCardProcessApi { + /** MES 流转卡工序记录 */ + export interface CardProcess { + id?: number; // 编号 + cardId?: number; // 流转卡编号 + sort?: number; // 序号 + processId?: number; // 工序编号 + processCode?: string; // 工序编码 + processName?: string; // 工序名称 + inputTime?: number; // 进入工序时间 + outputTime?: number; // 出工序时间 + inputQuantity?: number; // 投入数量 + outputQuantity?: number; // 产出数量 + unqualifiedQuantity?: number; // 不合格品数量 + workstationId?: number; // 工位编号 + workstationCode?: string; // 工位编码 + workstationName?: string; // 工位名称 + userId?: number; // 操作人编号 + nickname?: string; // 操作人名称 + ipqcId?: number; // 过程检验单编号 + remark?: string; // 备注 + } + + /** MES 流转卡工序记录分页查询参数 */ + export interface PageParams extends PageParam { + cardId?: number; + } +} + +/** 查询流转卡工序记录分页 */ +export function getCardProcessPage(params: MesProCardProcessApi.PageParams) { + return requestClient.get>( + '/mes/pro/card-process/page', + { params }, + ); +} + +/** 查询流转卡工序记录详情 */ +export function getCardProcess(id: number) { + return requestClient.get( + `/mes/pro/card-process/get?id=${id}`, + ); +} + +/** 新增流转卡工序记录 */ +export function createCardProcess(data: MesProCardProcessApi.CardProcess) { + return requestClient.post('/mes/pro/card-process/create', data); +} + +/** 修改流转卡工序记录 */ +export function updateCardProcess(data: MesProCardProcessApi.CardProcess) { + return requestClient.put('/mes/pro/card-process/update', data); +} + +/** 删除流转卡工序记录 */ +export function deleteCardProcess(id: number) { + return requestClient.delete(`/mes/pro/card-process/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/feedback/index.ts b/apps/web-antdv-next/src/api/mes/pro/feedback/index.ts new file mode 100644 index 000000000..21a988ba8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/feedback/index.ts @@ -0,0 +1,113 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProFeedbackApi { + /** MES 生产报工 */ + export interface Feedback { + id?: number; + code?: string; // 报工单编号 + type?: number; // 报工类型 + channel?: string; // 报工途径 + feedbackTime?: number; // 报工时间 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + routeId?: number; // 工艺路线编号 + routeCode?: string; // 工艺路线编码 + processId?: number; // 工序编号 + processCode?: string; // 工序编码 + processName?: string; // 工序名称 + checkFlag?: boolean; // 是否需要检验 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + workOrderName?: string; // 工单名称 + taskId?: number; // 生产任务编号 + taskCode?: string; // 任务编码 + itemId?: number; // 产品物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + expireDate?: number; // 过期日期 + scheduledQuantity?: number; // 排产数量 + feedbackQuantity?: number; // 本次报工数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不良品数量 + uncheckQuantity?: number; // 待检测数量 + laborScrapQuantity?: number; // 工废数量 + materialScrapQuantity?: number; // 料废数量 + otherScrapQuantity?: number; // 其他废品数量 + feedbackUserId?: number; // 报工用户编号 + feedbackUserNickname?: string; // 报工人昵称 + approveUserId?: number; // 审核用户编号 + approveUserNickname?: string; // 审核人昵称 + status?: number; // 状态 + remark?: string; // 备注 + creator?: string; // 创建人 + createTime?: number; // 创建时间 + } + + /** MES 生产报工分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + type?: number; + workOrderId?: number; + itemId?: number; + feedbackUserId?: number; + creator?: string; + status?: number; + feedbackTime?: string[]; + } +} + +/** 查询生产报工分页 */ +export function getFeedbackPage(params: MesProFeedbackApi.PageParams) { + return requestClient.get>( + '/mes/pro/feedback/page', + { params }, + ); +} + +/** 查询生产报工详情 */ +export function getFeedback(id: number) { + return requestClient.get( + `/mes/pro/feedback/get?id=${id}`, + ); +} + +/** 新增生产报工 */ +export function createFeedback(data: MesProFeedbackApi.Feedback) { + return requestClient.post('/mes/pro/feedback/create', data); +} + +/** 修改生产报工 */ +export function updateFeedback(data: MesProFeedbackApi.Feedback) { + return requestClient.put('/mes/pro/feedback/update', data); +} + +/** 删除生产报工 */ +export function deleteFeedback(id: number) { + return requestClient.delete(`/mes/pro/feedback/delete?id=${id}`); +} + +/** 导出生产报工 Excel */ +export function exportFeedback(params: Partial) { + return requestClient.download('/mes/pro/feedback/export-excel', { params }); +} + +/** 提交生产报工 */ +export function submitFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/submit?id=${id}`); +} + +/** 驳回生产报工 */ +export function rejectFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/reject?id=${id}`); +} + +/** 审批生产报工(返回是否已审批完成) */ +export function approveFeedback(id: number) { + return requestClient.put(`/mes/pro/feedback/approve?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/process/content/index.ts b/apps/web-antdv-next/src/api/mes/pro/process/content/index.ts new file mode 100644 index 000000000..8a4c15e59 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/process/content/index.ts @@ -0,0 +1,49 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProProcessContentApi { + /** MES 生产工序内容(操作步骤) */ + export interface ProcessContent { + id?: number; + processId?: number; + sort?: number; + content?: string; + device?: string; + material?: string; + docUrl?: string; + remark?: string; + createTime?: Date; + } +} + +/** 按工序编号查询工序内容列表 */ +export function getProcessContentListByProcessId(processId: number) { + return requestClient.get( + `/mes/pro/process-content/list-by-process?processId=${processId}`, + ); +} + +/** 查询工序内容详情 */ +export function getProcessContent(id: number) { + return requestClient.get( + `/mes/pro/process-content/get?id=${id}`, + ); +} + +/** 新增工序内容 */ +export function createProcessContent( + data: MesProProcessContentApi.ProcessContent, +) { + return requestClient.post('/mes/pro/process-content/create', data); +} + +/** 修改工序内容 */ +export function updateProcessContent( + data: MesProProcessContentApi.ProcessContent, +) { + return requestClient.put('/mes/pro/process-content/update', data); +} + +/** 删除工序内容 */ +export function deleteProcessContent(id: number) { + return requestClient.delete(`/mes/pro/process-content/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/process/index.ts b/apps/web-antdv-next/src/api/mes/pro/process/index.ts new file mode 100644 index 000000000..a4ff1ea64 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/process/index.ts @@ -0,0 +1,58 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProProcessApi { + /** MES 生产工序 */ + export interface Process { + id?: number; + code?: string; + name?: string; + attention?: string; + status?: number; + remark?: string; + createTime?: Date; + } +} + +/** 查询生产工序分页 */ +export function getProcessPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/process/page', + { params }, + ); +} + +/** 查询生产工序精简列表 */ +export function getProcessSimpleList() { + return requestClient.get( + '/mes/pro/process/simple-list', + ); +} + +/** 查询生产工序详情 */ +export function getProcess(id: number) { + return requestClient.get( + `/mes/pro/process/get?id=${id}`, + ); +} + +/** 新增生产工序 */ +export function createProcess(data: MesProProcessApi.Process) { + return requestClient.post('/mes/pro/process/create', data); +} + +/** 修改生产工序 */ +export function updateProcess(data: MesProProcessApi.Process) { + return requestClient.put('/mes/pro/process/update', data); +} + +/** 删除生产工序 */ +export function deleteProcess(id: number) { + return requestClient.delete(`/mes/pro/process/delete?id=${id}`); +} + +/** 导出生产工序 Excel */ +export function exportProcess(params: any) { + return requestClient.download('/mes/pro/process/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/route/index.ts b/apps/web-antdv-next/src/api/mes/pro/route/index.ts new file mode 100644 index 000000000..56baff6b5 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/route/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProRouteApi { + /** MES 工艺路线 */ + export interface Route { + id?: number; + code?: string; + name?: string; + description?: string; + status?: number; + remark?: string; + createTime?: Date; + } +} + +/** 查询工艺路线分页 */ +export function getRoutePage(params: PageParam) { + return requestClient.get>( + '/mes/pro/route/page', + { params }, + ); +} + +/** 查询工艺路线精简列表 */ +export function getRouteSimpleList() { + return requestClient.get( + '/mes/pro/route/simple-list', + ); +} + +/** 查询工艺路线详情 */ +export function getRoute(id: number) { + return requestClient.get( + `/mes/pro/route/get?id=${id}`, + ); +} + +/** 新增工艺路线 */ +export function createRoute(data: MesProRouteApi.Route) { + return requestClient.post('/mes/pro/route/create', data); +} + +/** 修改工艺路线 */ +export function updateRoute(data: MesProRouteApi.Route) { + return requestClient.put('/mes/pro/route/update', data); +} + +/** 修改工艺路线状态 */ +export function updateRouteStatus(id: number, status: number) { + return requestClient.put( + `/mes/pro/route/update-status?id=${id}&status=${status}`, + ); +} + +/** 删除工艺路线 */ +export function deleteRoute(id: number) { + return requestClient.delete(`/mes/pro/route/delete?id=${id}`); +} + +/** 导出工艺路线 Excel */ +export function exportRoute(params: any) { + return requestClient.download('/mes/pro/route/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/route/process/index.ts b/apps/web-antdv-next/src/api/mes/pro/route/process/index.ts new file mode 100644 index 000000000..fee0ce9c4 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/route/process/index.ts @@ -0,0 +1,70 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProcessApi { + /** MES 工艺路线工序 */ + export interface RouteProcess { + id?: number; + routeId?: number; + processId?: number; + processCode?: string; + processName?: string; + sort?: number; + nextProcessId?: number; + nextProcessName?: string; + linkType?: number; + prepareTime?: number; + waitTime?: number; + colorCode?: string; + keyFlag?: boolean; + checkFlag?: boolean; + remark?: string; + createTime?: Date; + } +} + +/** 按工艺路线查询工序列表 */ +export function getRouteProcessListByRoute(routeId: number) { + return requestClient.get( + `/mes/pro/route-process/list-by-route?routeId=${routeId}`, + ); +} + +/** 按产品查询工序列表(自动查找关联的工艺路线) */ +export function getRouteProcessListByProduct(productId: number) { + return requestClient.get( + `/mes/pro/route-process/list-by-product?productId=${productId}`, + ); +} + +/** 查询工艺路线工序详情 */ +export function getRouteProcess(id: number) { + return requestClient.get( + `/mes/pro/route-process/get?id=${id}`, + ); +} + +/** 按工艺路线 + 工序精确查询工序配置 */ +export function getRouteProcessByRouteAndProcess( + routeId: number, + processId: number, +) { + return requestClient.get( + '/mes/pro/route-process/get-by-route-and-process', + { params: { processId, routeId } }, + ); +} + +/** 新增工艺路线工序 */ +export function createRouteProcess(data: MesProRouteProcessApi.RouteProcess) { + return requestClient.post('/mes/pro/route-process/create', data); +} + +/** 修改工艺路线工序 */ +export function updateRouteProcess(data: MesProRouteProcessApi.RouteProcess) { + return requestClient.put('/mes/pro/route-process/update', data); +} + +/** 删除工艺路线工序 */ +export function deleteRouteProcess(id: number) { + return requestClient.delete(`/mes/pro/route-process/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/route/product/index.ts b/apps/web-antdv-next/src/api/mes/pro/route/product/index.ts new file mode 100644 index 000000000..2312f688c --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/route/product/index.ts @@ -0,0 +1,48 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProductApi { + /** MES 工艺路线产品 */ + export interface RouteProduct { + id?: number; + routeId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + specification?: string; + unitName?: string; + quantity?: number; + productionTime?: number; + timeUnitType?: string; + remark?: string; + createTime?: Date; + } +} + +/** 按工艺路线查询产品列表 */ +export function getRouteProductListByRoute(routeId: number) { + return requestClient.get( + `/mes/pro/route-product/list-by-route?routeId=${routeId}`, + ); +} + +/** 查询工艺路线产品详情 */ +export function getRouteProduct(id: number) { + return requestClient.get( + `/mes/pro/route-product/get?id=${id}`, + ); +} + +/** 新增工艺路线产品 */ +export function createRouteProduct(data: MesProRouteProductApi.RouteProduct) { + return requestClient.post('/mes/pro/route-product/create', data); +} + +/** 修改工艺路线产品 */ +export function updateRouteProduct(data: MesProRouteProductApi.RouteProduct) { + return requestClient.put('/mes/pro/route-product/update', data); +} + +/** 删除工艺路线产品 */ +export function deleteRouteProduct(id: number) { + return requestClient.delete(`/mes/pro/route-product/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/route/productbom/index.ts b/apps/web-antdv-next/src/api/mes/pro/route/productbom/index.ts new file mode 100644 index 000000000..7cfcbcc85 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/route/productbom/index.ts @@ -0,0 +1,57 @@ +import { requestClient } from '#/api/request'; + +export namespace MesProRouteProductBomApi { + /** MES 工艺路线产品 BOM */ + export interface RouteProductBom { + id?: number; + routeId?: number; + processId?: number; + productId?: number; + itemId?: number; + itemCode?: string; + itemName?: string; + specification?: string; + unitName?: string; + quantity?: number; + remark?: string; + createTime?: Date; + } +} + +/** 查询工艺路线产品 BOM 列表 */ +export function getRouteProductBomList(params: { + processId?: number; + productId?: number; + routeId: number; +}) { + return requestClient.get( + '/mes/pro/route-product-bom/list', + { params }, + ); +} + +/** 查询工艺路线产品 BOM 详情 */ +export function getRouteProductBom(id: number) { + return requestClient.get( + `/mes/pro/route-product-bom/get?id=${id}`, + ); +} + +/** 新增工艺路线产品 BOM */ +export function createRouteProductBom( + data: MesProRouteProductBomApi.RouteProductBom, +) { + return requestClient.post('/mes/pro/route-product-bom/create', data); +} + +/** 修改工艺路线产品 BOM */ +export function updateRouteProductBom( + data: MesProRouteProductBomApi.RouteProductBom, +) { + return requestClient.put('/mes/pro/route-product-bom/update', data); +} + +/** 删除工艺路线产品 BOM */ +export function deleteRouteProductBom(id: number) { + return requestClient.delete(`/mes/pro/route-product-bom/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/task/index.ts b/apps/web-antdv-next/src/api/mes/pro/task/index.ts new file mode 100644 index 000000000..5e160c840 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/task/index.ts @@ -0,0 +1,95 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProTaskApi { + /** MES 生产任务 */ + export interface Task { + id?: number; + code?: string; // 任务编码 + name?: string; // 任务名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 工单编码 + workOrderName?: string; // 工单名称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + routeId?: number; // 工艺路线编号 + processId?: number; // 工序编号 + processName?: string; // 工序名称 + itemId?: number; // 产品物料编号 + itemCode?: string; // 产品编码 + itemName?: string; // 产品名称 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 排产数量 + producedQuantity?: number; // 已生产数量 + qualifyQuantity?: number; // 合格品数量 + unqualifyQuantity?: number; // 不良品数量 + changedQuantity?: number; // 调整数量 + clientId?: number; // 客户编号 + clientName?: string; // 客户名称 + startTime?: number; // 开始生产时间 + endTime?: number; // 结束生产时间 + duration?: number; // 生产时长(工作日,1=8小时) + requestDate?: number; // 需求日期(从工单查) + finishDate?: number; // 完成日期 + cancelDate?: number; // 取消日期 + colorCode?: string; // 甘特图显示颜色 + status?: number; // 任务状态 + checkFlag?: boolean; // 是否质检(派生自工艺路线工序) + remark?: string; // 备注 + } + + /** MES 生产任务分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + workOrderId?: number; + workstationId?: number; + routeId?: number; + processId?: number; + itemId?: number; + statuses?: number[]; + status?: number; + } +} + +/** 查询生产任务分页 */ +export function getTaskPage(params: MesProTaskApi.PageParams) { + return requestClient.get>( + '/mes/pro/task/page', + { params }, + ); +} + +/** 查询生产任务详情 */ +export function getTask(id: number) { + return requestClient.get(`/mes/pro/task/get?id=${id}`); +} + +/** 新增生产任务 */ +export function createTask(data: MesProTaskApi.Task) { + return requestClient.post('/mes/pro/task/create', data); +} + +/** 修改生产任务 */ +export function updateTask(data: MesProTaskApi.Task) { + return requestClient.put('/mes/pro/task/update', data); +} + +/** 删除生产任务 */ +export function deleteTask(id: number) { + return requestClient.delete(`/mes/pro/task/delete?id=${id}`); +} + +/** 导出生产任务 */ +export function exportTask(params: any) { + return requestClient.download('/mes/pro/task/export-excel', { params }); +} + +/** 查询甘特图任务列表(非分页) */ +export function getGanttTaskList(params: any) { + return requestClient.get('/mes/pro/task/gantt-list', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/task/issue/index.ts b/apps/web-antdv-next/src/api/mes/pro/task/issue/index.ts new file mode 100644 index 000000000..b3ccf956b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/task/issue/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProTaskIssueApi { + /** MES 生产任务投料 */ + export interface TaskIssue { + id?: number; // 编号 + taskId?: number; // 生产任务编号 + workOrderId?: number; // 生产工单编号 + workstationId?: number; // 工作站编号 + sourceDocType?: string; // 来源单据类型 + sourceDocId?: number; // 来源单据编号 + sourceLineId?: number; // 来源单据行编号 + sourceDocCode?: string; // 来源单据编码 + batchCode?: string; // 投料批次 + itemId?: number; // 产品物料编号 + itemName?: string; // 产品名称 + itemCode?: string; // 产品编码 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + issuedQuantity?: number; // 总投料数量 + availableQuantity?: number; // 当前可用数量 + usedQuantity?: number; // 当前使用数量 + remark?: string; // 备注 + } + + /** MES 生产任务投料分页查询参数 */ + export interface PageParams extends PageParam { + taskId?: number; // 生产任务编号 + workOrderId?: number; // 生产工单编号 + workstationId?: number; // 工作站编号 + itemId?: number; // 产品物料编号 + } +} + +/** 查询生产任务投料分页 */ +export function getTaskIssuePage(params: MesProTaskIssueApi.PageParams) { + return requestClient.get>( + '/mes/pro/task-issue/page', + { params }, + ); +} + +/** 查询生产任务投料详情 */ +export function getTaskIssue(id: number) { + return requestClient.get( + `/mes/pro/task-issue/get?id=${id}`, + ); +} + +/** 新增生产任务投料 */ +export function createTaskIssue(data: MesProTaskIssueApi.TaskIssue) { + return requestClient.post('/mes/pro/task-issue/create', data); +} + +/** 修改生产任务投料 */ +export function updateTaskIssue(data: MesProTaskIssueApi.TaskIssue) { + return requestClient.put('/mes/pro/task-issue/update', data); +} + +/** 删除生产任务投料 */ +export function deleteTaskIssue(id: number) { + return requestClient.delete(`/mes/pro/task-issue/delete?id=${id}`); +} + +/** 按生产任务查询投料列表 */ +export function getTaskIssueListByTask(taskId: number) { + return requestClient.get( + `/mes/pro/task-issue/list-by-task?taskId=${taskId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/workorder/bom/index.ts b/apps/web-antdv-next/src/api/mes/pro/workorder/bom/index.ts new file mode 100644 index 000000000..f04ef761c --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/workorder/bom/index.ts @@ -0,0 +1,62 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkOrderBomApi { + /** MES 生产工单 BOM */ + export interface WorkOrderBom { + id?: number; // 编号 + workOrderId?: number; // 生产工单编号 + itemId?: number; // BOM 物料编号 + itemName?: string; // 物料名称 + itemCode?: string; // 物料编码 + itemSpecification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 预计使用量 + remark?: string; // 备注 + itemOrProduct?: string; // 物料产品标识 + } + + /** MES 生产工单 BOM 分页查询参数 */ + export interface PageParams extends PageParam { + workOrderId?: number; + } +} + +/** 查询工单 BOM 分页 */ +export function getWorkOrderBomPage(params: MesProWorkOrderBomApi.PageParams) { + return requestClient.get>( + '/mes/pro/work-order-bom/page', + { params }, + ); +} + +/** 查询工单 BOM 详情 */ +export function getWorkOrderBom(id: number) { + return requestClient.get( + `/mes/pro/work-order-bom/get?id=${id}`, + ); +} + +/** 新增工单 BOM */ +export function createWorkOrderBom(data: MesProWorkOrderBomApi.WorkOrderBom) { + return requestClient.post('/mes/pro/work-order-bom/create', data); +} + +/** 修改工单 BOM */ +export function updateWorkOrderBom(data: MesProWorkOrderBomApi.WorkOrderBom) { + return requestClient.put('/mes/pro/work-order-bom/update', data); +} + +/** 删除工单 BOM */ +export function deleteWorkOrderBom(id: number) { + return requestClient.delete(`/mes/pro/work-order-bom/delete?id=${id}`); +} + +/** 查询工单物料需求列表 */ +export function getWorkOrderBomItemListByWorkOrderId(workOrderId: number) { + return requestClient.get( + `/mes/pro/work-order-bom/item-list-by-work-order-id?workOrderId=${workOrderId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/workorder/index.ts b/apps/web-antdv-next/src/api/mes/pro/workorder/index.ts new file mode 100644 index 000000000..c4c0a152a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/workorder/index.ts @@ -0,0 +1,101 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkOrderApi { + /** MES 生产工单 */ + export interface WorkOrder { + id?: number; // 编号 + code?: string; // 工单编码 + name?: string; // 工单名称 + type?: number; // 工单类型 + orderSourceType?: number; // 来源类型 + orderSourceCode?: string; // 来源单据编号 + productId?: number; // 产品编号 + productName?: string; // 产品名称 + productCode?: string; // 产品编码 + productSpecification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 生产数量 + quantityProduced?: number; // 已生产数量 + quantityChanged?: number; // 调整数量 + quantityScheduled?: number; // 已排产数量 + clientId?: number; // 客户编号 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + vendorCode?: string; // 供应商编码 + batchCode?: string; // 批次号 + requestDate?: number; // 需求日期 + parentId?: number; // 父工单编号 + parentCode?: string; // 父工单编码 + finishDate?: number; // 完成时间 + cancelDate?: number; // 取消时间 + status?: number; // 工单状态 + remark?: string; // 备注 + createTime?: number; // 创建时间 + } + + /** MES 生产工单分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + orderSourceCode?: string; + productId?: number; + clientId?: number; + status?: number; + type?: number; + requestDate?: number[]; + } +} + +/** 查询生产工单分页 */ +export function getWorkOrderPage(params: MesProWorkOrderApi.PageParams) { + return requestClient.get>( + '/mes/pro/work-order/page', + { params }, + ); +} + +/** 查询生产工单详情 */ +export function getWorkOrder(id: number) { + return requestClient.get( + `/mes/pro/work-order/get?id=${id}`, + ); +} + +/** 新增生产工单 */ +export function createWorkOrder(data: MesProWorkOrderApi.WorkOrder) { + return requestClient.post('/mes/pro/work-order/create', data); +} + +/** 修改生产工单 */ +export function updateWorkOrder(data: MesProWorkOrderApi.WorkOrder) { + return requestClient.put('/mes/pro/work-order/update', data); +} + +/** 删除生产工单 */ +export function deleteWorkOrder(id: number) { + return requestClient.delete(`/mes/pro/work-order/delete?id=${id}`); +} + +/** 导出生产工单 */ +export function exportWorkOrder(params: any) { + return requestClient.download('/mes/pro/work-order/export-excel', { params }); +} + +/** 完成工单 */ +export function finishWorkOrder(id: number) { + return requestClient.put(`/mes/pro/work-order/finish?id=${id}`); +} + +/** 取消工单 */ +export function cancelWorkOrder(id: number) { + return requestClient.put(`/mes/pro/work-order/cancel?id=${id}`); +} + +/** 确认工单 */ +export function confirmWorkOrder(id: number) { + return requestClient.put(`/mes/pro/work-order/confirm?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/pro/workrecord/index.ts b/apps/web-antdv-next/src/api/mes/pro/workrecord/index.ts new file mode 100644 index 000000000..08950365c --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/pro/workrecord/index.ts @@ -0,0 +1,71 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesProWorkRecordApi { + /** MES 工作记录流水 */ + export interface WorkRecordLog { + id?: number; // 编号 + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } + + /** MES 当前用户工作站绑定状态 */ + export interface MyWorkRecord { + userId?: number; // 用户编号 + userNickname?: string; // 用户昵称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + type?: number; // 1=上工 2=下工 + clockInTime?: Date; // 上工时间 + clockOutTime?: Date; // 下工时间 + } +} + +/** 查询工作记录分页 */ +export function getWorkRecordLogPage(params: PageParam) { + return requestClient.get>( + '/mes/pro/workrecord/log/page', + { params }, + ); +} + +/** 查询工作记录详情 */ +export function getWorkRecordLog(id: number) { + return requestClient.get( + `/mes/pro/workrecord/log/get?id=${id}`, + ); +} + +/** 导出工作记录 */ +export function exportWorkRecordLog(params: any) { + return requestClient.download('/mes/pro/workrecord/log/export-excel', { + params, + }); +} + +/** 上工(绑定工作站) */ +export function clockInWorkRecord(workstationId: number) { + return requestClient.put('/mes/pro/workrecord/clock-in', null, { + params: { workstationId }, + }); +} + +/** 下工(解绑工作站) */ +export function clockOutWorkRecord() { + return requestClient.put('/mes/pro/workrecord/clock-out'); +} + +/** 查询当前用户绑定的工作站 */ +export function getMyWorkRecord() { + return requestClient.get( + '/mes/pro/workrecord/get-my', + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/defect/index.ts b/apps/web-antdv-next/src/api/mes/qc/defect/index.ts new file mode 100644 index 000000000..0b46d3581 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/defect/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectApi { + /** MES 缺陷类型 */ + export interface Defect { + id?: number; // 编号 + code?: string; // 缺陷编码 + name?: string; // 缺陷描述 + type?: number; // 检测项类型 + level?: number; // 缺陷等级 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询缺陷类型分页 */ +export function getDefectPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/defect/page', + { params }, + ); +} + +/** 查询缺陷类型精简列表 */ +export function getDefectSimpleList() { + return requestClient.get('/mes/qc/defect/simple-list'); +} + +/** 查询缺陷类型详情 */ +export function getDefect(id: number) { + return requestClient.get(`/mes/qc/defect/get?id=${id}`); +} + +/** 新增缺陷类型 */ +export function createDefect(data: MesQcDefectApi.Defect) { + return requestClient.post('/mes/qc/defect/create', data); +} + +/** 修改缺陷类型 */ +export function updateDefect(data: MesQcDefectApi.Defect) { + return requestClient.put('/mes/qc/defect/update', data); +} + +/** 删除缺陷类型 */ +export function deleteDefect(id: number) { + return requestClient.delete(`/mes/qc/defect/delete?id=${id}`); +} + +/** 导出缺陷类型 */ +export function exportDefect(params: any) { + return requestClient.download('/mes/qc/defect/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/defectrecord/index.ts b/apps/web-antdv-next/src/api/mes/qc/defectrecord/index.ts new file mode 100644 index 000000000..a434a29b6 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/defectrecord/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcDefectRecordApi { + /** MES 质检缺陷记录 */ + export interface DefectRecord { + id?: number; // 编号 + qcType?: number; // 检验类型 + qcId?: number; // 检验单 ID + lineId?: number; // 检验行 ID + name?: string; // 缺陷描述 + level?: number; // 缺陷等级 + quantity?: number; // 缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询质检缺陷记录 */ +export function getDefectRecord(id: number) { + return requestClient.get( + `/mes/qc/defect-record/get?id=${id}`, + ); +} + +/** 查询质检缺陷记录分页 */ +export function getDefectRecordPage( + params: PageParam & { lineId?: number; qcId?: number; qcType?: number; }, +) { + return requestClient.get>( + '/mes/qc/defect-record/page', + { params }, + ); +} + +/** 新增质检缺陷记录 */ +export function createDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.post('/mes/qc/defect-record/create', data); +} + +/** 修改质检缺陷记录 */ +export function updateDefectRecord(data: MesQcDefectRecordApi.DefectRecord) { + return requestClient.put('/mes/qc/defect-record/update', data); +} + +/** 删除质检缺陷记录 */ +export function deleteDefectRecord(id: number) { + return requestClient.delete(`/mes/qc/defect-record/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/indicator/index.ts b/apps/web-antdv-next/src/api/mes/qc/indicator/index.ts new file mode 100644 index 000000000..163f11d89 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/indicator/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorApi { + /** MES 质检指标 */ + export interface Indicator { + id?: number; // 编号 + code?: string; // 检测项编码 + name?: string; // 检测项名称 + type?: number; // 检测项类型 + tool?: string; // 检测工具 + resultType?: number; // 结果值类型 + resultSpecification?: string; // 结果值属性 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检指标分页 */ +export function getIndicatorPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/indicator/page', + { params }, + ); +} + +/** 查询质检指标详情 */ +export function getIndicator(id: number) { + return requestClient.get( + `/mes/qc/indicator/get?id=${id}`, + ); +} + +/** 新增质检指标 */ +export function createIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.post('/mes/qc/indicator/create', data); +} + +/** 修改质检指标 */ +export function updateIndicator(data: MesQcIndicatorApi.Indicator) { + return requestClient.put('/mes/qc/indicator/update', data); +} + +/** 删除质检指标 */ +export function deleteIndicator(id: number) { + return requestClient.delete(`/mes/qc/indicator/delete?id=${id}`); +} + +/** 导出质检指标 */ +export function exportIndicator(params: any) { + return requestClient.download('/mes/qc/indicator/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/indicatorresult/index.ts b/apps/web-antdv-next/src/api/mes/qc/indicatorresult/index.ts new file mode 100644 index 000000000..dfa8a7f93 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/indicatorresult/index.ts @@ -0,0 +1,73 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIndicatorResultApi { + /** MES 检验结果明细 */ + export interface IndicatorResultDetail { + id?: number; // 编号 + resultId?: number; // 关联检验结果 ID + indicatorId?: number; // 检测指标 ID + value?: string; // 检测值(统一存为字符串) + valueNumber?: number; // UI 数值绑定(提交前转字符串) + remark?: string; // 备注 + // 关联查询字段(来自 indicator) + indicatorName?: string; // 检测指标名称 + valueType?: number; // 质检值类型 + valueSpecification?: string; // 值属性 + } + + /** MES 检验结果 */ + export interface IndicatorResult { + id?: number; // 编号 + code?: string; // 样品编号 + qcId?: number; // 关联质检单 ID + qcType?: number; // 质检类型 + itemId?: number; // 产品物料 ID + sn?: string; // 物资 SN + remark?: string; // 备注 + createTime?: Date; // 创建时间 + items?: IndicatorResultDetail[]; // 检验结果明细列表 + } +} + +/** 查询检验结果分页 */ +export function getIndicatorResultPage( + params: PageParam & { qcId?: number; qcType?: number }, +) { + return requestClient.get>( + '/mes/qc/indicator-result/page', + { params }, + ); +} + +/** 查询检验结果明细(含检测项模板):编辑传 id,新增不传 */ +export function getIndicatorResultDetail( + qcId: number, + qcType: number, + id?: number, +) { + return requestClient.get( + '/mes/qc/indicator-result/get-detail', + { params: { id, qcId, qcType } }, + ); +} + +/** 新增检验结果 */ +export function createIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.post('/mes/qc/indicator-result/create', data); +} + +/** 修改检验结果 */ +export function updateIndicatorResult( + data: MesQcIndicatorResultApi.IndicatorResult, +) { + return requestClient.put('/mes/qc/indicator-result/update', data); +} + +/** 删除检验结果 */ +export function deleteIndicatorResult(id: number) { + return requestClient.delete(`/mes/qc/indicator-result/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/ipqc/index.ts b/apps/web-antdv-next/src/api/mes/qc/ipqc/index.ts new file mode 100644 index 000000000..9c885bedb --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/ipqc/index.ts @@ -0,0 +1,87 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIpqcApi { + /** MES 过程检验单 */ + export interface Ipqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + type?: number; // IPQC 检验类型 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + workOrderId?: number; // 生产工单 ID + workOrderCode?: string; // 工单编号(关联查询) + workOrderName?: string; // 工单名称(关联查询) + taskId?: number; // 生产任务 ID + workstationId?: number; // 工位 ID + workstationName?: string; // 工位名称(关联查询) + processId?: number; // 工序 ID + processName?: string; // 工序名称(关联查询) + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + checkQuantity?: number; // 检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格品数量 + laborScrapQuantity?: number; // 工废数量 + materialScrapQuantity?: number; // 料废数量 + otherScrapQuantity?: number; // 其他废品数量 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + checkResult?: number; // 检测结果 + inspectDate?: number; // 检测日期 + inspectorUserId?: number; // 检测人员用户 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询过程检验单分页 */ +export function getIpqcPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/ipqc/page', + { params }, + ); +} + +/** 查询过程检验单详情 */ +export function getIpqc(id: number) { + return requestClient.get(`/mes/qc/ipqc/get?id=${id}`); +} + +/** 新增过程检验单 */ +export function createIpqc(data: MesQcIpqcApi.Ipqc) { + return requestClient.post('/mes/qc/ipqc/create', data); +} + +/** 修改过程检验单 */ +export function updateIpqc(data: MesQcIpqcApi.Ipqc) { + return requestClient.put('/mes/qc/ipqc/update', data); +} + +/** 完成过程检验单 */ +export function finishIpqc(id: number) { + return requestClient.put(`/mes/qc/ipqc/finish?id=${id}`); +} + +/** 删除过程检验单 */ +export function deleteIpqc(id: number) { + return requestClient.delete(`/mes/qc/ipqc/delete?id=${id}`); +} + +/** 导出过程检验单 */ +export function exportIpqc(params: any) { + return requestClient.download('/mes/qc/ipqc/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/ipqc/line/index.ts b/apps/web-antdv-next/src/api/mes/qc/ipqc/line/index.ts new file mode 100644 index 000000000..4f114c845 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/ipqc/line/index.ts @@ -0,0 +1,42 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIpqcLineApi { + /** MES 过程检验单行 */ + export interface IpqcLine { + id?: number; // 编号 + ipqcId?: number; // 过程检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + toolId?: number; // 检测工具 ID + toolName?: string; // 检测工具名称(关联查询) + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询过程检验单行分页 */ +export function getIpqcLinePage(params: PageParam & { ipqcId?: number }) { + return requestClient.get>( + '/mes/qc/ipqc/line/page', + { params }, + ); +} + +/** 查询过程检验单行详情 */ +export function getIpqcLine(id: number) { + return requestClient.get( + `/mes/qc/ipqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/iqc/index.ts b/apps/web-antdv-next/src/api/mes/qc/iqc/index.ts new file mode 100644 index 000000000..cdb04cb6a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/iqc/index.ts @@ -0,0 +1,80 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcApi { + /** MES 来料检验单 */ + export interface Iqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + vendorId?: number; // 供应商 ID + vendorNickname?: string; // 供应商简称(关联查询) + vendorBatch?: string; // 供应商批次号 + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + receivedQuantity?: number; // 本次接收数量 + checkQuantity?: number; // 本次检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格品数量 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + checkResult?: number; // 检测结果 + receiveDate?: number; // 来料日期 + inspectDate?: number; // 检测日期 + inspector?: string; // 检测人员(昵称) + inspectorUserId?: number; // 检测人员 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询来料检验单分页 */ +export function getIqcPage(params: PageParam) { + return requestClient.get>('/mes/qc/iqc/page', { + params, + }); +} + +/** 查询来料检验单详情 */ +export function getIqc(id: number) { + return requestClient.get(`/mes/qc/iqc/get?id=${id}`); +} + +/** 新增来料检验单 */ +export function createIqc(data: MesQcIqcApi.Iqc) { + return requestClient.post('/mes/qc/iqc/create', data); +} + +/** 修改来料检验单 */ +export function updateIqc(data: MesQcIqcApi.Iqc) { + return requestClient.put('/mes/qc/iqc/update', data); +} + +/** 完成来料检验单 */ +export function finishIqc(id: number) { + return requestClient.put(`/mes/qc/iqc/finish?id=${id}`); +} + +/** 删除来料检验单 */ +export function deleteIqc(id: number) { + return requestClient.delete(`/mes/qc/iqc/delete?id=${id}`); +} + +/** 导出来料检验单 */ +export function exportIqc(params: any) { + return requestClient.download('/mes/qc/iqc/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/iqc/line/index.ts b/apps/web-antdv-next/src/api/mes/qc/iqc/line/index.ts new file mode 100644 index 000000000..dc37aa99b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/iqc/line/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcIqcLineApi { + /** MES 来料检验单行 */ + export interface IqcLine { + id?: number; // 编号 + iqcId?: number; // 来料检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + tool?: string; // 检测工具 + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询来料检验单行分页 */ +export function getIqcLinePage(params: PageParam & { iqcId?: number }) { + return requestClient.get>( + '/mes/qc/iqc/line/page', + { params }, + ); +} + +/** 查询来料检验单行详情 */ +export function getIqcLine(id: number) { + return requestClient.get( + `/mes/qc/iqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/oqc/index.ts b/apps/web-antdv-next/src/api/mes/qc/oqc/index.ts new file mode 100644 index 000000000..793f6db43 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/oqc/index.ts @@ -0,0 +1,81 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcOqcApi { + /** MES 出货检验单 */ + export interface Oqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + clientId?: number; // 客户 ID + clientNickname?: string; // 客户简称(关联查询) + batchCode?: string; // 批次号 + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + minCheckQuantity?: number; // 最低检测数 + maxUnqualifiedQuantity?: number; // 最大不合格数 + outQuantity?: number; // 本次出货数量 + checkQuantity?: number; // 本次检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格品数量 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + checkResult?: number; // 检测结果 + outDate?: number; // 出货日期 + inspectDate?: number; // 检测日期 + inspectorUserId?: number; // 检测人员用户 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询出货检验单分页 */ +export function getOqcPage(params: PageParam) { + return requestClient.get>('/mes/qc/oqc/page', { + params, + }); +} + +/** 查询出货检验单详情 */ +export function getOqc(id: number) { + return requestClient.get(`/mes/qc/oqc/get?id=${id}`); +} + +/** 新增出货检验单 */ +export function createOqc(data: MesQcOqcApi.Oqc) { + return requestClient.post('/mes/qc/oqc/create', data); +} + +/** 修改出货检验单 */ +export function updateOqc(data: MesQcOqcApi.Oqc) { + return requestClient.put('/mes/qc/oqc/update', data); +} + +/** 完成出货检验单 */ +export function finishOqc(id: number) { + return requestClient.put(`/mes/qc/oqc/finish?id=${id}`); +} + +/** 删除出货检验单 */ +export function deleteOqc(id: number) { + return requestClient.delete(`/mes/qc/oqc/delete?id=${id}`); +} + +/** 导出出货检验单 */ +export function exportOqc(params: any) { + return requestClient.download('/mes/qc/oqc/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/oqc/line/index.ts b/apps/web-antdv-next/src/api/mes/qc/oqc/line/index.ts new file mode 100644 index 000000000..aa7deb59a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/oqc/line/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcOqcLineApi { + /** MES 出货检验单行 */ + export interface OqcLine { + id?: number; // 编号 + oqcId?: number; // 出货检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + tool?: string; // 检测工具 + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询出货检验单行分页 */ +export function getOqcLinePage(params: PageParam & { oqcId?: number }) { + return requestClient.get>( + '/mes/qc/oqc/line/page', + { params }, + ); +} + +/** 查询出货检验单行详情 */ +export function getOqcLine(id: number) { + return requestClient.get( + `/mes/qc/oqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/pendinginspect/index.ts b/apps/web-antdv-next/src/api/mes/qc/pendinginspect/index.ts new file mode 100644 index 000000000..dceda8213 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/pendinginspect/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcPendingInspectApi { + /** MES 待检任务 */ + export interface PendingInspect { + sourceDocType?: number; // 来源单据类型(MesBizTypeConstants) + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号 + qcType?: number; // 检验类型(MesQcTypeEnum) + itemId?: number; // 物料 ID + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitName?: string; // 单位名称 + quantity?: number; // 待检数量 + // 供应商(IQC 场景) + vendorId?: number; // 供应商 ID + vendorName?: string; // 供应商名称 + // 工单/工作站/任务(IPQC/RQC 场景) + workOrderId?: number; // 生产工单 ID + workstationId?: number; // 工作站 ID + workstationName?: string; // 工作站名称 + taskId?: number; // 生产任务 ID + taskCode?: string; // 生产任务编码 + // 客户(OQC/RQC 场景) + clientId?: number; // 客户 ID + clientName?: string; // 客户名称 + recordTime?: number; // 记录时间(epoch ms) + } +} + +/** 查询待检任务分页 */ +export function getPendingInspectPage(params: PageParam) { + return requestClient.get>( + '/mes/qc/pending-inspect/page', + { params }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/rqc/index.ts b/apps/web-antdv-next/src/api/mes/qc/rqc/index.ts new file mode 100644 index 000000000..60b54da15 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/rqc/index.ts @@ -0,0 +1,77 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcRqcApi { + /** MES 退货检验单 */ + export interface Rqc { + id?: number; // 编号 + code?: string; // 检验单编号 + name?: string; // 检验单名称 + templateId?: number; // 检验模板 ID + sourceDocType?: number; // 来源单据类型 + sourceDocId?: number; // 来源单据 ID + sourceLineId?: number; // 来源单据行 ID + sourceDocCode?: string; // 来源单据编号(关联查询) + type?: number; // 检验类型 + itemId?: number; // 产品物料 ID + itemCode?: string; // 产品物料编码(关联查询) + itemName?: string; // 产品物料名称(关联查询) + itemSpecification?: string; // 规格型号(关联查询) + unitName?: string; // 单位名称(关联查询) + batchCode?: string; // 批次号 + checkQuantity?: number; // 检测数量 + qualifiedQuantity?: number; // 合格品数量 + unqualifiedQuantity?: number; // 不合格数量 + checkResult?: number; // 检测结果 + inspectDate?: number; // 检测日期 + inspectorUserId?: number; // 检测人员用户 ID + inspectorNickname?: string; // 检测人员昵称(关联查询) + status?: number; // 状态 + remark?: string; // 备注 + // 缺陷统计 + criticalRate?: number; // 致命缺陷率(%) + majorRate?: number; // 严重缺陷率(%) + minorRate?: number; // 轻微缺陷率(%) + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + } +} + +/** 查询退货检验单分页 */ +export function getRqcPage(params: PageParam) { + return requestClient.get>('/mes/qc/rqc/page', { + params, + }); +} + +/** 查询退货检验单详情 */ +export function getRqc(id: number) { + return requestClient.get(`/mes/qc/rqc/get?id=${id}`); +} + +/** 新增退货检验单 */ +export function createRqc(data: MesQcRqcApi.Rqc) { + return requestClient.post('/mes/qc/rqc/create', data); +} + +/** 修改退货检验单 */ +export function updateRqc(data: MesQcRqcApi.Rqc) { + return requestClient.put('/mes/qc/rqc/update', data); +} + +/** 完成退货检验单 */ +export function finishRqc(id: number) { + return requestClient.put(`/mes/qc/rqc/finish?id=${id}`); +} + +/** 删除退货检验单 */ +export function deleteRqc(id: number) { + return requestClient.delete(`/mes/qc/rqc/delete?id=${id}`); +} + +/** 导出退货检验单 */ +export function exportRqc(params: any) { + return requestClient.download('/mes/qc/rqc/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/rqc/line/index.ts b/apps/web-antdv-next/src/api/mes/qc/rqc/line/index.ts new file mode 100644 index 000000000..abb44a758 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/rqc/line/index.ts @@ -0,0 +1,41 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcRqcLineApi { + /** MES 退货检验单行 */ + export interface RqcLine { + id?: number; // 编号 + rqcId?: number; // 退货检验单 ID + indicatorId?: number; // 检测指标 ID + indicatorCode?: string; // 检测指标编码(关联查询) + indicatorName?: string; // 检测指标名称(关联查询) + indicatorType?: number; // 检测指标类型(关联查询) + tool?: string; // 检测工具 + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位 ID + unitMeasureName?: string; // 计量单位名称(关联查询) + maxThreshold?: number; // 误差上限 + minThreshold?: number; // 误差下限 + criticalQuantity?: number; // 致命缺陷数量 + majorQuantity?: number; // 严重缺陷数量 + minorQuantity?: number; // 轻微缺陷数量 + remark?: string; // 备注 + } +} + +/** 查询退货检验单行分页 */ +export function getRqcLinePage(params: PageParam & { rqcId?: number }) { + return requestClient.get>( + '/mes/qc/rqc/line/page', + { params }, + ); +} + +/** 查询退货检验单行详情 */ +export function getRqcLine(id: number) { + return requestClient.get( + `/mes/qc/rqc/line/get?id=${id}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/template/index.ts b/apps/web-antdv-next/src/api/mes/qc/template/index.ts new file mode 100644 index 000000000..768864482 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/template/index.ts @@ -0,0 +1,51 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateApi { + /** MES 质检方案 */ + export interface Template { + id?: number; // 编号 + code?: string; // 方案编号 + name?: string; // 方案名称 + types?: number[]; // 检测种类 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询质检方案分页 */ +export function getTemplatePage(params: PageParam) { + return requestClient.get>( + '/mes/qc/template/page', + { params }, + ); +} + +/** 查询质检方案详情 */ +export function getTemplate(id: number) { + return requestClient.get( + `/mes/qc/template/get?id=${id}`, + ); +} + +/** 新增质检方案 */ +export function createTemplate(data: MesQcTemplateApi.Template) { + return requestClient.post('/mes/qc/template/create', data); +} + +/** 修改质检方案 */ +export function updateTemplate(data: MesQcTemplateApi.Template) { + return requestClient.put('/mes/qc/template/update', data); +} + +/** 删除质检方案 */ +export function deleteTemplate(id: number) { + return requestClient.delete(`/mes/qc/template/delete?id=${id}`); +} + +/** 导出质检方案 */ +export function exportTemplate(params: any) { + return requestClient.download('/mes/qc/template/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/template/indicator/index.ts b/apps/web-antdv-next/src/api/mes/qc/template/indicator/index.ts new file mode 100644 index 000000000..8fa8119e6 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/template/indicator/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateIndicatorApi { + /** MES 质检方案-检测指标项 */ + export interface TemplateIndicator { + id?: number; // 编号 + templateId?: number; // 质检方案ID + indicatorId?: number; // 质检指标ID + checkMethod?: string; // 检测方法 + standardValue?: number; // 标准值 + unitMeasureId?: number; // 计量单位ID + thresholdMax?: number; // 误差上限 + thresholdMin?: number; // 误差下限 + docUrl?: string; // 说明图URL + remark?: string; // 备注 + indicatorCode?: string; // 检测项编码(JOIN) + indicatorName?: string; // 检测项名称(JOIN) + indicatorType?: number; // 检测项类型(JOIN) + indicatorTool?: string; // 检测工具(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询检测指标项分页 */ +export function getTemplateIndicatorPage(params: PageParam & { templateId?: number }) { + return requestClient.get< + PageResult + >('/mes/qc/template/indicator/page', { params }); +} + +/** 查询检测指标项详情 */ +export function getTemplateIndicator(id: number) { + return requestClient.get( + `/mes/qc/template/indicator/get?id=${id}`, + ); +} + +/** 新增检测指标项 */ +export function createTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.post('/mes/qc/template/indicator/create', data); +} + +/** 修改检测指标项 */ +export function updateTemplateIndicator( + data: MesQcTemplateIndicatorApi.TemplateIndicator, +) { + return requestClient.put('/mes/qc/template/indicator/update', data); +} + +/** 删除检测指标项 */ +export function deleteTemplateIndicator(id: number) { + return requestClient.delete(`/mes/qc/template/indicator/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/qc/template/item/index.ts b/apps/web-antdv-next/src/api/mes/qc/template/item/index.ts new file mode 100644 index 000000000..b1d5b1e6b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/qc/template/item/index.ts @@ -0,0 +1,52 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesQcTemplateItemApi { + /** MES 质检方案-产品关联 */ + export interface TemplateItem { + id?: number; // 编号 + templateId?: number; // 质检方案ID + itemId?: number; // 产品物料ID + quantityCheck?: number; // 最低检测数 + quantityUnqualified?: number; // 最大不合格数 + criticalRate?: number; // 最大致命缺陷率(%) + majorRate?: number; // 最大严重缺陷率(%) + minorRate?: number; // 最大轻微缺陷率(%) + remark?: string; // 备注 + itemCode?: string; // 物料编码(JOIN) + itemName?: string; // 物料名称(JOIN) + specification?: string; // 规格型号(JOIN) + unitMeasureName?: string; // 计量单位名称(JOIN) + } +} + +/** 查询产品关联分页 */ +export function getTemplateItemPage(params: PageParam & { templateId?: number }) { + return requestClient.get>( + '/mes/qc/template/item/page', + { params }, + ); +} + +/** 查询产品关联详情 */ +export function getTemplateItem(id: number) { + return requestClient.get( + `/mes/qc/template/item/get?id=${id}`, + ); +} + +/** 新增产品关联 */ +export function createTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.post('/mes/qc/template/item/create', data); +} + +/** 修改产品关联 */ +export function updateTemplateItem(data: MesQcTemplateItemApi.TemplateItem) { + return requestClient.put('/mes/qc/template/item/update', data); +} + +/** 删除产品关联 */ +export function deleteTemplateItem(id: number) { + return requestClient.delete(`/mes/qc/template/item/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/tm/tool/index.ts b/apps/web-antdv-next/src/api/mes/tm/tool/index.ts new file mode 100644 index 000000000..05bed4940 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/tm/tool/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesTmToolApi { + /** MES 工具台账 */ + export interface Tool { + id?: number; // 工具编号 + code?: string; // 工具编码 + name?: string; // 工具名称 + brand?: string; // 品牌 + specification?: string; // 型号规格 + toolTypeId?: number; // 工具类型编号 + toolTypeName?: string; // 工具类型名称 + quantity?: number; // 数量 + availableQuantity?: number; // 可用数量 + maintenType?: number; // 保养维护类型 + nextMaintenPeriod?: number; // 下次保养周期 + nextMaintenDate?: Date | number; // 下次保养日期 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工具台账分页 */ +export function getToolPage(params: PageParam) { + return requestClient.get>('/mes/tm/tool/page', { + params, + }); +} + +/** 查询工具精简列表 */ +export function getToolSimpleList() { + return requestClient.get('/mes/tm/tool/simple-list'); +} + +/** 查询工具台账详情 */ +export function getTool(id: number) { + return requestClient.get(`/mes/tm/tool/get?id=${id}`); +} + +/** 新增工具台账 */ +export function createTool(data: MesTmToolApi.Tool) { + return requestClient.post('/mes/tm/tool/create', data); +} + +/** 修改工具台账 */ +export function updateTool(data: MesTmToolApi.Tool) { + return requestClient.put('/mes/tm/tool/update', data); +} + +/** 删除工具台账 */ +export function deleteTool(id: number) { + return requestClient.delete(`/mes/tm/tool/delete?id=${id}`); +} + +/** 导出工具台账 */ +export function exportTool(params: any) { + return requestClient.download('/mes/tm/tool/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/tm/tool/type/index.ts b/apps/web-antdv-next/src/api/mes/tm/tool/type/index.ts new file mode 100644 index 000000000..319f85f03 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/tm/tool/type/index.ts @@ -0,0 +1,59 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesTmToolTypeApi { + /** MES 工具类型 */ + export interface ToolType { + id?: number; // 工具类型编号 + code?: string; // 类型编码 + name?: string; // 类型名称 + codeFlag?: boolean; // 是否编码管理 + maintenType?: number; // 保养维护类型 + maintenPeriod?: number; // 保养周期 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询工具类型分页 */ +export function getToolTypePage(params: PageParam) { + return requestClient.get>( + '/mes/tm/tool-type/page', + { params }, + ); +} + +/** 查询工具类型精简列表 */ +export function getToolTypeSimpleList() { + return requestClient.get( + '/mes/tm/tool-type/simple-list', + ); +} + +/** 查询工具类型详情 */ +export function getToolType(id: number) { + return requestClient.get( + `/mes/tm/tool-type/get?id=${id}`, + ); +} + +/** 新增工具类型 */ +export function createToolType(data: MesTmToolTypeApi.ToolType) { + return requestClient.post('/mes/tm/tool-type/create', data); +} + +/** 修改工具类型 */ +export function updateToolType(data: MesTmToolTypeApi.ToolType) { + return requestClient.put('/mes/tm/tool-type/update', data); +} + +/** 删除工具类型 */ +export function deleteToolType(id: number) { + return requestClient.delete(`/mes/tm/tool-type/delete?id=${id}`); +} + +/** 导出工具类型 */ +export function exportToolType(params: any) { + return requestClient.download('/mes/tm/tool-type/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/index.ts b/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/index.ts new file mode 100644 index 000000000..73e8eb849 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmArrivalNoticeApi { + /** MES 到货通知单 */ + export interface ArrivalNotice { + id?: number; // 通知单编号 + code?: string; // 通知单编号 + name?: string; // 通知单名称 + purchaseOrderCode?: string; // 采购订单编号 + vendorId?: number; // 供应商编号 + vendorCode?: string; // 供应商编码 + vendorName?: string; // 供应商名称 + arrivalDate?: number; // 到货日期 + contactName?: string; // 联系人 + contactTelephone?: string; // 联系方式 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询到货通知单分页 */ +export function getArrivalNoticePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/arrival-notice/page', + { params }, + ); +} + +/** 查询到货通知单详情 */ +export function getArrivalNotice(id: number) { + return requestClient.get( + `/mes/wm/arrival-notice/get?id=${id}`, + ); +} + +/** 新增到货通知单 */ +export function createArrivalNotice( + data: MesWmArrivalNoticeApi.ArrivalNotice, +) { + return requestClient.post('/mes/wm/arrival-notice/create', data); +} + +/** 修改到货通知单 */ +export function updateArrivalNotice( + data: MesWmArrivalNoticeApi.ArrivalNotice, +) { + return requestClient.put('/mes/wm/arrival-notice/update', data); +} + +/** 删除到货通知单 */ +export function deleteArrivalNotice(id: number) { + return requestClient.delete(`/mes/wm/arrival-notice/delete?id=${id}`); +} + +/** 提交到货通知单 */ +export function submitArrivalNotice(id: number) { + return requestClient.put(`/mes/wm/arrival-notice/submit?id=${id}`); +} + +/** 导出到货通知单 */ +export function exportArrivalNotice(params: any) { + return requestClient.download('/mes/wm/arrival-notice/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/line/index.ts new file mode 100644 index 000000000..b763b2ad5 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/arrivalnotice/line/index.ts @@ -0,0 +1,58 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmArrivalNoticeLineApi { + /** MES 到货通知单行 */ + export interface ArrivalNoticeLine { + id?: number; // 行编号 + noticeId?: number; // 到货通知单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + arrivalQuantity?: number; // 到货数量 + qualifiedQuantity?: number; // 合格数量 + iqcCheckFlag?: boolean; // 是否检验 + iqcId?: number; // 来料检验单编号 + iqcCode?: string; // 来料检验单编码 + remark?: string; // 备注 + } +} + +/** 查询到货通知单行分页 */ +export function getArrivalNoticeLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/arrival-notice-line/page', { params }); +} + +/** 查询到货通知单行详情 */ +export function getArrivalNoticeLine(id: number) { + return requestClient.get( + `/mes/wm/arrival-notice-line/get?id=${id}`, + ); +} + +/** 新增到货通知单行 */ +export function createArrivalNoticeLine( + data: MesWmArrivalNoticeLineApi.ArrivalNoticeLine, +) { + return requestClient.post( + '/mes/wm/arrival-notice-line/create', + data, + ); +} + +/** 修改到货通知单行 */ +export function updateArrivalNoticeLine( + data: MesWmArrivalNoticeLineApi.ArrivalNoticeLine, +) { + return requestClient.put('/mes/wm/arrival-notice-line/update', data); +} + +/** 删除到货通知单行 */ +export function deleteArrivalNoticeLine(id: number) { + return requestClient.delete(`/mes/wm/arrival-notice-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/barcode/config/index.ts b/apps/web-antdv-next/src/api/mes/wm/barcode/config/index.ts new file mode 100644 index 000000000..862da4fbb --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/barcode/config/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmBarcodeConfigApi { + /** MES 条码配置 */ + export interface BarcodeConfig { + id?: number; // 编号 + format?: number; // 条码格式 + bizType?: number; // 业务类型 + contentFormat?: string; // 内容格式模板 + contentExample?: string; // 内容样例 + autoGenerateFlag?: boolean; // 是否自动生成 + defaultTemplate?: string; // 默认打印模板 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询条码配置分页 */ +export function getBarcodeConfigPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/barcode-config/page', + { params }, + ); +} + +/** 查询条码配置详情 */ +export function getBarcodeConfig(id: number) { + return requestClient.get( + `/mes/wm/barcode-config/get?id=${id}`, + ); +} + +/** 新增条码配置 */ +export function createBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.post('/mes/wm/barcode-config/create', data); +} + +/** 修改条码配置 */ +export function updateBarcodeConfig(data: MesWmBarcodeConfigApi.BarcodeConfig) { + return requestClient.put('/mes/wm/barcode-config/update', data); +} + +/** 删除条码配置 */ +export function deleteBarcodeConfig(id: number) { + return requestClient.delete(`/mes/wm/barcode-config/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/barcode/index.ts b/apps/web-antdv-next/src/api/mes/wm/barcode/index.ts new file mode 100644 index 000000000..39673a3ae --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/barcode/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmBarcodeApi { + /** MES 条码清单 */ + export interface Barcode { + id?: number; // 条码编号 + configId?: number; // 条码配置编号 + format?: number; // 条码格式 + bizType?: number; // 业务类型 + content?: string; // 条码内容 + bizId?: number; // 业务对象编号 + bizCode?: string; // 业务对象编码 + bizName?: string; // 业务对象名称 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询条码分页 */ +export function getBarcodePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/barcode/page', + { params }, + ); +} + +/** 查询条码详情 */ +export function getBarcode(id: number) { + return requestClient.get( + `/mes/wm/barcode/get?id=${id}`, + ); +} + +/** 根据业务对象获取条码 */ +export function getBarcodeByBusiness(bizType: number, bizId: number) { + return requestClient.get( + '/mes/wm/barcode/get-by-business', + { params: { bizId, bizType } }, + ); +} + +/** 新增条码 */ +export function createBarcode(data: MesWmBarcodeApi.Barcode) { + return requestClient.post('/mes/wm/barcode/create', data); +} + +/** 修改条码 */ +export function updateBarcode(data: MesWmBarcodeApi.Barcode) { + return requestClient.put('/mes/wm/barcode/update', data); +} + +/** 删除条码 */ +export function deleteBarcode(id: number) { + return requestClient.delete(`/mes/wm/barcode/delete?id=${id}`); +} + +/** 导出条码 */ +export function exportBarcode(params: any) { + return requestClient.download('/mes/wm/barcode/export-excel', { params }); +} + +/** 生成条码内容 */ +export function generateBarcodeContent(bizType: number, bizCode: string) { + return requestClient.get('/mes/wm/barcode/generate-content', { + params: { bizCode, bizType }, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/batch/index.ts b/apps/web-antdv-next/src/api/mes/wm/batch/index.ts new file mode 100644 index 000000000..14d5fa1bd --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/batch/index.ts @@ -0,0 +1,87 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmBatchApi { + /** MES 批次 */ + export interface Batch { + id?: number; // 批次 ID + code?: string; // 批次编码 + itemId?: number; // 物料 ID + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + itemSpecification?: string; // 规格型号 + unitName?: string; // 单位名称 + produceDate?: Date; // 生产日期 + expireDate?: Date; // 有效期 + receiptDate?: Date; // 入库日期 + vendorId?: number; // 供应商 ID + vendorCode?: string; // 供应商编码 + vendorName?: string; // 供应商名称 + clientId?: number; // 客户 ID + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + purchaseOrderCode?: string; // 采购订单编号 + salesOrderCode?: string; // 销售订单编号 + workOrderId?: number; // 生产工单 ID + workOrderCode?: string; // 生产工单编号 + taskId?: number; // 生产任务 ID + taskCode?: string; // 生产任务编号 + workstationId?: number; // 工作站 ID + workstationCode?: string; // 工作站编码 + toolId?: number; // 工具 ID + toolCode?: string; // 工具编号 + moldId?: number; // 模具 ID + lotNumber?: string; // 生产批号 + qualityStatus?: number; // 质量状态 + remark?: string; // 备注 + } + + /** MES 批次分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; // 批次号 + itemId?: number; // 物料编号 + vendorId?: number; // 供应商编号 + clientId?: number; // 客户编号 + workOrderId?: number; // 工单编号 + taskId?: number; // 生产任务编号 + workstationId?: number; // 工作站编号 + toolId?: number; // 工具编号 + moldId?: number; // 模具编号 + salesOrderCode?: string; // 销售订单号 + purchaseOrderCode?: string; // 采购订单号 + lotNumber?: string; // 批号 + qualityStatus?: number; // 质量状态 + produceDate?: string[]; // 生产日期 + expireDate?: string[]; // 过期日期 + receiptDate?: string[]; // 入库日期 + } +} + +/** 查询批次详情 */ +export function getBatch(id: number) { + return requestClient.get(`/mes/wm/batch/get?id=${id}`); +} + +/** 查询批次分页 */ +export function getBatchPage(params: MesWmBatchApi.PageParams) { + return requestClient.get>( + '/mes/wm/batch/page', + { params }, + ); +} + +/** 批次向前追溯 */ +export function getForwardBatchList(code: string) { + return requestClient.get('/mes/wm/batch/forward-list', { + params: { code }, + }); +} + +/** 批次向后追溯 */ +export function getBackwardBatchList(code: string) { + return requestClient.get( + '/mes/wm/batch/backward-list', + { params: { code } }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/itemconsume/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/itemconsume/line/index.ts new file mode 100644 index 000000000..2a353b766 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/itemconsume/line/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmItemConsumeLineApi { + /** MES 物料消耗行 */ + export interface ItemConsumeLine { + id?: number; + feedbackId?: number; // 报工编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物资编码 + itemName?: string; // 物资名称 + specification?: string; // 规格型号 + unitId?: number; // 单位编号 + unitName?: string; // 单位 + quantity?: number; // 消耗数量 + batchCode?: string; // 批次号 + locationId?: number; // 库位编号 + locationName?: string; // 库位名称 + remark?: string; // 备注 + } + + /** MES 物料消耗行分页查询参数 */ + export interface PageParams extends PageParam { + feedbackId?: number; + } +} + +/** 查询物料消耗行分页 */ +export function getItemConsumeLinePage( + params: MesWmItemConsumeLineApi.PageParams, +) { + return requestClient.get>( + '/mes/wm/item-consume-line/page', + { params }, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/itemreceipt/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/detail/index.ts new file mode 100644 index 000000000..b147288ed --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/detail/index.ts @@ -0,0 +1,58 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmItemReceiptDetailApi { + /** MES 采购入库明细 */ + export interface ItemReceiptDetail { + id?: number; // 明细编号 + lineId?: number; // 入库单行编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询采购入库明细列表(按行编号) */ +export function getItemReceiptDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/item-receipt-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询采购入库明细详情 */ +export function getItemReceiptDetail(id: number) { + return requestClient.get( + `/mes/wm/item-receipt-detail/get?id=${id}`, + ); +} + +/** 新增采购入库明细 */ +export function createItemReceiptDetail( + data: MesWmItemReceiptDetailApi.ItemReceiptDetail, +) { + return requestClient.post('/mes/wm/item-receipt-detail/create', data); +} + +/** 修改采购入库明细 */ +export function updateItemReceiptDetail( + data: MesWmItemReceiptDetailApi.ItemReceiptDetail, +) { + return requestClient.put('/mes/wm/item-receipt-detail/update', data); +} + +/** 删除采购入库明细 */ +export function deleteItemReceiptDetail(id: number) { + return requestClient.delete(`/mes/wm/item-receipt-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/itemreceipt/index.ts b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/index.ts new file mode 100644 index 000000000..c1a77cd98 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/index.ts @@ -0,0 +1,86 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmItemReceiptApi { + /** MES 采购入库单 */ + export interface ItemReceipt { + id?: number; // 入库单编号 + code?: string; // 入库单编码 + name?: string; // 入库单名称 + iqcId?: number; // 来料检验单编号 + iqcCode?: string; // 来料检验单编码 + noticeId?: number; // 到货通知单编号 + noticeCode?: string; // 到货通知单编码 + purchaseOrderCode?: string; // 采购订单号 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + receiptDate?: number; // 入库日期 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询采购入库单分页 */ +export function getItemReceiptPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/item-receipt/page', + { params }, + ); +} + +/** 查询采购入库单详情 */ +export function getItemReceipt(id: number) { + return requestClient.get( + `/mes/wm/item-receipt/get?id=${id}`, + ); +} + +/** 新增采购入库单 */ +export function createItemReceipt(data: MesWmItemReceiptApi.ItemReceipt) { + return requestClient.post('/mes/wm/item-receipt/create', data); +} + +/** 修改采购入库单 */ +export function updateItemReceipt(data: MesWmItemReceiptApi.ItemReceipt) { + return requestClient.put('/mes/wm/item-receipt/update', data); +} + +/** 删除采购入库单 */ +export function deleteItemReceipt(id: number) { + return requestClient.delete(`/mes/wm/item-receipt/delete?id=${id}`); +} + +/** 提交采购入库单 */ +export function submitItemReceipt(id: number) { + return requestClient.put(`/mes/wm/item-receipt/submit?id=${id}`); +} + +/** 执行上架 */ +export function stockItemReceipt(id: number) { + return requestClient.put(`/mes/wm/item-receipt/stock?id=${id}`); +} + +/** 执行入库 */ +export function finishItemReceipt(id: number) { + return requestClient.put(`/mes/wm/item-receipt/finish?id=${id}`); +} + +/** 取消采购入库单 */ +export function cancelItemReceipt(id: number) { + return requestClient.put(`/mes/wm/item-receipt/cancel?id=${id}`); +} + +/** 导出采购入库单 */ +export function exportItemReceipt(params: any) { + return requestClient.download('/mes/wm/item-receipt/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/itemreceipt/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/line/index.ts new file mode 100644 index 000000000..8ce7236c1 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/itemreceipt/line/index.ts @@ -0,0 +1,63 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmItemReceiptLineApi { + /** MES 采购入库单行 */ + export interface ItemReceiptLine { + id?: number; // 行编号 + receiptId?: number; // 入库单编号 + receiptCode?: string; // 入库单编码 + arrivalNoticeLineId?: number; // 到货通知单行编号 + purchaseOrderCode?: string; // 采购订单号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + receivedQuantity?: number; // 入库数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + productionDate?: number; // 生产日期 + expireDate?: number; // 有效期 + lotNumber?: string; // 生产批号 + iqcCheckFlag?: boolean; // 是否检验 + iqcId?: number; // 来料检验单编号 + iqcCode?: string; // 来料检验单编码 + remark?: string; // 备注 + } +} + +/** 查询采购入库单行分页 */ +export function getItemReceiptLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/item-receipt-line/page', + { params }, + ); +} + +/** 查询采购入库单行详情 */ +export function getItemReceiptLine(id: number) { + return requestClient.get( + `/mes/wm/item-receipt-line/get?id=${id}`, + ); +} + +/** 新增采购入库单行 */ +export function createItemReceiptLine( + data: MesWmItemReceiptLineApi.ItemReceiptLine, +) { + return requestClient.post('/mes/wm/item-receipt-line/create', data); +} + +/** 修改采购入库单行 */ +export function updateItemReceiptLine( + data: MesWmItemReceiptLineApi.ItemReceiptLine, +) { + return requestClient.put('/mes/wm/item-receipt-line/update', data); +} + +/** 删除采购入库单行 */ +export function deleteItemReceiptLine(id: number) { + return requestClient.delete(`/mes/wm/item-receipt-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/materialstock/index.ts b/apps/web-antdv-next/src/api/mes/wm/materialstock/index.ts new file mode 100644 index 000000000..49aab9620 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/materialstock/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMaterialStockApi { + /** MES 库存台账 */ + export interface MaterialStock { + id?: number; // 编号 + itemTypeId?: number; // 物料分类编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseCode?: string; // 仓库编码 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + quantity?: number; // 在库数量 + receiptTime?: string; // 入库日期 + frozen?: boolean; // 是否冻结 + createTime?: Date; // 创建时间 + } +} + +/** 查询库存台账分页 */ +export function getMaterialStockPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/material-stock/page', + { params }, + ); +} + +/** 查询库存台账详情 */ +export function getMaterialStock(id: number) { + return requestClient.get( + `/mes/wm/material-stock/get?id=${id}`, + ); +} + +/** 更新库存冻结状态 */ +export function updateMaterialStockFrozen(data: { + frozen: boolean; + id: number; +}) { + return requestClient.put('/mes/wm/material-stock/update-frozen', data); +} + +/** 导出库存台账 */ +export function exportMaterialStock(params: any) { + return requestClient.download('/mes/wm/material-stock/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/miscissue/index.ts b/apps/web-antdv-next/src/api/mes/wm/miscissue/index.ts new file mode 100644 index 000000000..1a54df4f4 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/miscissue/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMiscIssueApi { + /** MES 杂项出库单 */ + export interface MiscIssue { + id?: number; // 编号 + code?: string; // 出库单编号 + name?: string; // 出库单名称 + type?: number; // 业务类型 + sourceDocType?: string; // 来源单据类型 + sourceDocId?: number; // 来源单据编号 + sourceDocCode?: string; // 来源单据编码 + issueDate?: number; // 出库日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询杂项出库单分页 */ +export function getMiscIssuePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/misc-issue/page', + { params }, + ); +} + +/** 查询杂项出库单详情 */ +export function getMiscIssue(id: number) { + return requestClient.get( + `/mes/wm/misc-issue/get?id=${id}`, + ); +} + +/** 新增杂项出库单 */ +export function createMiscIssue(data: MesWmMiscIssueApi.MiscIssue) { + return requestClient.post('/mes/wm/misc-issue/create', data); +} + +/** 修改杂项出库单 */ +export function updateMiscIssue(data: MesWmMiscIssueApi.MiscIssue) { + return requestClient.put('/mes/wm/misc-issue/update', data); +} + +/** 删除杂项出库单 */ +export function deleteMiscIssue(id: number) { + return requestClient.delete(`/mes/wm/misc-issue/delete?id=${id}`); +} + +/** 提交杂项出库单 */ +export function submitMiscIssue(id: number) { + return requestClient.put(`/mes/wm/misc-issue/submit?id=${id}`); +} + +/** 执行出库 */ +export function finishMiscIssue(id: number) { + return requestClient.put(`/mes/wm/misc-issue/finish?id=${id}`); +} + +/** 取消杂项出库单 */ +export function cancelMiscIssue(id: number) { + return requestClient.put(`/mes/wm/misc-issue/cancel?id=${id}`); +} + +/** 导出杂项出库单 */ +export function exportMiscIssue(params: any) { + return requestClient.download('/mes/wm/misc-issue/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/miscissue/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/miscissue/line/index.ts new file mode 100644 index 000000000..56f4d8950 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/miscissue/line/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMiscIssueLineApi { + /** MES 杂项出库单行 */ + export interface MiscIssueLine { + id?: number; // 编号 + issueId?: number; // 出库单编号 + sourceDocLineId?: number; // 来源单据行编号 + materialStockId?: number; // 库存编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasure?: string; // 计量单位 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 出库数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseCode?: string; // 仓库编码 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationCode?: string; // 库区编码 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaCode?: string; // 库位编码 + areaName?: string; // 库位名称 + remark?: string; // 备注 + quantityMax?: number; // 可出库最大数量(前端用于限制出库数量,取自库存在库数量) + } +} + +/** 查询杂项出库单行分页 */ +export function getMiscIssueLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/misc-issue-line/page', + { params }, + ); +} + +/** 查询杂项出库单行列表 */ +export function getMiscIssueLineListByIssueId(issueId: number) { + return requestClient.get( + `/mes/wm/misc-issue-line/list-by-issue-id?issueId=${issueId}`, + ); +} + +/** 查询杂项出库单行详情 */ +export function getMiscIssueLine(id: number) { + return requestClient.get( + `/mes/wm/misc-issue-line/get?id=${id}`, + ); +} + +/** 新增杂项出库单行 */ +export function createMiscIssueLine(data: MesWmMiscIssueLineApi.MiscIssueLine) { + return requestClient.post('/mes/wm/misc-issue-line/create', data); +} + +/** 修改杂项出库单行 */ +export function updateMiscIssueLine(data: MesWmMiscIssueLineApi.MiscIssueLine) { + return requestClient.put('/mes/wm/misc-issue-line/update', data); +} + +/** 删除杂项出库单行 */ +export function deleteMiscIssueLine(id: number) { + return requestClient.delete(`/mes/wm/misc-issue-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/miscreceipt/index.ts b/apps/web-antdv-next/src/api/mes/wm/miscreceipt/index.ts new file mode 100644 index 000000000..112cb4aac --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/miscreceipt/index.ts @@ -0,0 +1,70 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmMiscReceiptApi { + /** MES 杂项入库单 */ + export interface MiscReceipt { + id?: number; // 编号 + code?: string; // 入库单编号 + name?: string; // 入库单名称 + type?: number; // 杂项类型 + sourceDocType?: string; // 来源单据类型 + sourceDocId?: number; // 来源单据编号 + sourceDocCode?: string; // 来源单据编码 + receiptDate?: number; // 入库日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询杂项入库单分页 */ +export function getMiscReceiptPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/misc-receipt/page', + { params }, + ); +} + +/** 查询杂项入库单详情 */ +export function getMiscReceipt(id: number) { + return requestClient.get( + `/mes/wm/misc-receipt/get?id=${id}`, + ); +} + +/** 新增杂项入库单 */ +export function createMiscReceipt(data: MesWmMiscReceiptApi.MiscReceipt) { + return requestClient.post('/mes/wm/misc-receipt/create', data); +} + +/** 修改杂项入库单 */ +export function updateMiscReceipt(data: MesWmMiscReceiptApi.MiscReceipt) { + return requestClient.put('/mes/wm/misc-receipt/update', data); +} + +/** 删除杂项入库单 */ +export function deleteMiscReceipt(id: number) { + return requestClient.delete(`/mes/wm/misc-receipt/delete?id=${id}`); +} + +/** 提交杂项入库单 */ +export function submitMiscReceipt(id: number) { + return requestClient.put(`/mes/wm/misc-receipt/submit?id=${id}`); +} + +/** 执行入库 */ +export function finishMiscReceipt(id: number) { + return requestClient.put(`/mes/wm/misc-receipt/finish?id=${id}`); +} + +/** 取消杂项入库单 */ +export function cancelMiscReceipt(id: number) { + return requestClient.put(`/mes/wm/misc-receipt/cancel?id=${id}`); +} + +/** 导出杂项入库单 */ +export function exportMiscReceipt(params: any) { + return requestClient.download('/mes/wm/misc-receipt/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/miscreceipt/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/miscreceipt/line/index.ts new file mode 100644 index 000000000..4ff66e549 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/miscreceipt/line/index.ts @@ -0,0 +1,57 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmMiscReceiptLineApi { + /** MES 杂项入库单行 */ + export interface MiscReceiptLine { + id?: number; // 编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 入库数量 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询杂项入库单行列表 */ +export function getMiscReceiptLineListByReceiptId(receiptId: number) { + return requestClient.get( + `/mes/wm/misc-receipt-line/list-by-receipt-id?receiptId=${receiptId}`, + ); +} + +/** 查询杂项入库单行详情 */ +export function getMiscReceiptLine(id: number) { + return requestClient.get( + `/mes/wm/misc-receipt-line/get?id=${id}`, + ); +} + +/** 新增杂项入库单行 */ +export function createMiscReceiptLine( + data: MesWmMiscReceiptLineApi.MiscReceiptLine, +) { + return requestClient.post('/mes/wm/misc-receipt-line/create', data); +} + +/** 修改杂项入库单行 */ +export function updateMiscReceiptLine( + data: MesWmMiscReceiptLineApi.MiscReceiptLine, +) { + return requestClient.put('/mes/wm/misc-receipt-line/update', data); +} + +/** 删除杂项入库单行 */ +export function deleteMiscReceiptLine(id: number) { + return requestClient.delete(`/mes/wm/misc-receipt-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourceissue/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/detail/index.ts new file mode 100644 index 000000000..15b50b6a6 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/detail/index.ts @@ -0,0 +1,60 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceIssueDetailApi { + /** MES 外协发料单明细 */ + export interface OutsourceIssueDetail { + id?: number; // 明细编号 + lineId?: number; // 行编号 + issueId?: number; // 发料单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 数量 + materialStockId?: number; // 库存编号 + batchId?: number; // 批次编号 + batchCode?: string; // 批次编码 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协发料单明细列表 */ +export function getOutsourceIssueDetailListByLineId(lineId: number) { + return requestClient.get< + MesWmOutsourceIssueDetailApi.OutsourceIssueDetail[] + >('/mes/wm/outsource-issue-detail/list-by-line', { params: { lineId } }); +} + +/** 查询外协发料单明细详情 */ +export function getOutsourceIssueDetail(id: number) { + return requestClient.get( + `/mes/wm/outsource-issue-detail/get?id=${id}`, + ); +} + +/** 新增外协发料单明细 */ +export function createOutsourceIssueDetail( + data: MesWmOutsourceIssueDetailApi.OutsourceIssueDetail, +) { + return requestClient.post('/mes/wm/outsource-issue-detail/create', data); +} + +/** 修改外协发料单明细 */ +export function updateOutsourceIssueDetail( + data: MesWmOutsourceIssueDetailApi.OutsourceIssueDetail, +) { + return requestClient.put('/mes/wm/outsource-issue-detail/update', data); +} + +/** 删除外协发料单明细 */ +export function deleteOutsourceIssueDetail(id: number) { + return requestClient.delete(`/mes/wm/outsource-issue-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourceissue/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/index.ts new file mode 100644 index 000000000..8b3b94b75 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/index.ts @@ -0,0 +1,90 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceIssueApi { + /** MES 外协发料单 */ + export interface OutsourceIssue { + id?: number; // 发料单编号 + code?: string; // 发料单编号 + name?: string; // 发料单名称 + vendorId?: number; // 供应商编号 + vendorCode?: string; // 供应商编码 + vendorName?: string; // 供应商名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 生产工单编码 + workOrderName?: string; // 生产工单名称 + issueDate?: number; // 发料日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协发料单分页 */ +export function getOutsourceIssuePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/outsource-issue/page', + { params }, + ); +} + +/** 查询外协发料单详情 */ +export function getOutsourceIssue(id: number) { + return requestClient.get( + `/mes/wm/outsource-issue/get?id=${id}`, + ); +} + +/** 新增外协发料单 */ +export function createOutsourceIssue( + data: MesWmOutsourceIssueApi.OutsourceIssue, +) { + return requestClient.post('/mes/wm/outsource-issue/create', data); +} + +/** 修改外协发料单 */ +export function updateOutsourceIssue( + data: MesWmOutsourceIssueApi.OutsourceIssue, +) { + return requestClient.put('/mes/wm/outsource-issue/update', data); +} + +/** 删除外协发料单 */ +export function deleteOutsourceIssue(id: number) { + return requestClient.delete(`/mes/wm/outsource-issue/delete?id=${id}`); +} + +/** 提交外协发料单 */ +export function submitOutsourceIssue(id: number) { + return requestClient.put(`/mes/wm/outsource-issue/submit?id=${id}`); +} + +/** 执行拣货 */ +export function stockOutsourceIssue(id: number) { + return requestClient.put(`/mes/wm/outsource-issue/stock?id=${id}`); +} + +/** 执行领出 */ +export function finishOutsourceIssue(id: number) { + return requestClient.put(`/mes/wm/outsource-issue/finish?id=${id}`); +} + +/** 取消外协发料单 */ +export function cancelOutsourceIssue(id: number) { + return requestClient.put(`/mes/wm/outsource-issue/cancel?id=${id}`); +} + +/** 校验外协发料单拣货数量是否与发料数量一致 */ +export function checkOutsourceIssueQuantity(id: number) { + return requestClient.get( + `/mes/wm/outsource-issue/check-quantity?id=${id}`, + ); +} + +/** 导出外协发料单 */ +export function exportOutsourceIssue(params: any) { + return requestClient.download('/mes/wm/outsource-issue/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourceissue/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/line/index.ts new file mode 100644 index 000000000..68fae8f95 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourceissue/line/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceIssueLineApi { + /** MES 外协发料单行 */ + export interface OutsourceIssueLine { + id?: number; // 行编号 + issueId?: number; // 发料单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 发料数量 + materialStockId?: number; // 库存编号 + batchId?: number; // 批次编号 + batchCode?: string; // 批次编码 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协发料单行分页 */ +export function getOutsourceIssueLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/outsource-issue-line/page', { params }); +} + +/** 查询外协发料单行详情 */ +export function getOutsourceIssueLine(id: number) { + return requestClient.get( + `/mes/wm/outsource-issue-line/get?id=${id}`, + ); +} + +/** 新增外协发料单行 */ +export function createOutsourceIssueLine( + data: MesWmOutsourceIssueLineApi.OutsourceIssueLine, +) { + return requestClient.post('/mes/wm/outsource-issue-line/create', data); +} + +/** 修改外协发料单行 */ +export function updateOutsourceIssueLine( + data: MesWmOutsourceIssueLineApi.OutsourceIssueLine, +) { + return requestClient.put('/mes/wm/outsource-issue-line/update', data); +} + +/** 删除外协发料单行 */ +export function deleteOutsourceIssueLine(id: number) { + return requestClient.delete(`/mes/wm/outsource-issue-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/detail/index.ts new file mode 100644 index 000000000..645fa7ad3 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/detail/index.ts @@ -0,0 +1,61 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceReceiptDetailApi { + /** MES 外协入库单明细 */ + export interface OutsourceReceiptDetail { + id?: number; // 明细编号 + lineId?: number; // 行编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 上架数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次编码 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协入库单明细列表 */ +export function getOutsourceReceiptDetailListByLineId(lineId: number) { + return requestClient.get< + MesWmOutsourceReceiptDetailApi.OutsourceReceiptDetail[] + >('/mes/wm/outsource-receipt-detail/list-by-line', { params: { lineId } }); +} + +/** 查询外协入库单明细详情 */ +export function getOutsourceReceiptDetail(id: number) { + return requestClient.get( + `/mes/wm/outsource-receipt-detail/get?id=${id}`, + ); +} + +/** 新增外协入库单明细 */ +export function createOutsourceReceiptDetail( + data: MesWmOutsourceReceiptDetailApi.OutsourceReceiptDetail, +) { + return requestClient.post('/mes/wm/outsource-receipt-detail/create', data); +} + +/** 修改外协入库单明细 */ +export function updateOutsourceReceiptDetail( + data: MesWmOutsourceReceiptDetailApi.OutsourceReceiptDetail, +) { + return requestClient.put('/mes/wm/outsource-receipt-detail/update', data); +} + +/** 删除外协入库单明细 */ +export function deleteOutsourceReceiptDetail(id: number) { + return requestClient.delete( + `/mes/wm/outsource-receipt-detail/delete?id=${id}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/index.ts new file mode 100644 index 000000000..730b2f8b9 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/index.ts @@ -0,0 +1,81 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceReceiptApi { + /** MES 外协入库单 */ + export interface OutsourceReceipt { + id?: number; // 入库单编号 + code?: string; // 入库单编码 + name?: string; // 入库单名称 + workOrderId?: number; // 外协工单编号 + workOrderCode?: string; // 外协工单编码 + vendorId?: number; // 供应商编号 + vendorName?: string; // 供应商名称 + receiptDate?: number; // 入库日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协入库单分页 */ +export function getOutsourceReceiptPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/outsource-receipt/page', + { params }, + ); +} + +/** 查询外协入库单详情 */ +export function getOutsourceReceipt(id: number) { + return requestClient.get( + `/mes/wm/outsource-receipt/get?id=${id}`, + ); +} + +/** 新增外协入库单 */ +export function createOutsourceReceipt( + data: MesWmOutsourceReceiptApi.OutsourceReceipt, +) { + return requestClient.post('/mes/wm/outsource-receipt/create', data); +} + +/** 修改外协入库单 */ +export function updateOutsourceReceipt( + data: MesWmOutsourceReceiptApi.OutsourceReceipt, +) { + return requestClient.put('/mes/wm/outsource-receipt/update', data); +} + +/** 删除外协入库单 */ +export function deleteOutsourceReceipt(id: number) { + return requestClient.delete(`/mes/wm/outsource-receipt/delete?id=${id}`); +} + +/** 提交外协入库单 */ +export function submitOutsourceReceipt(id: number) { + return requestClient.put(`/mes/wm/outsource-receipt/submit?id=${id}`); +} + +/** 执行上架 */ +export function stockOutsourceReceipt(id: number) { + return requestClient.put(`/mes/wm/outsource-receipt/stock?id=${id}`); +} + +/** 完成入库 */ +export function finishOutsourceReceipt(id: number) { + return requestClient.put(`/mes/wm/outsource-receipt/finish?id=${id}`); +} + +/** 取消外协入库单 */ +export function cancelOutsourceReceipt(id: number) { + return requestClient.put(`/mes/wm/outsource-receipt/cancel?id=${id}`); +} + +/** 导出外协入库单 */ +export function exportOutsourceReceipt(params: any) { + return requestClient.download('/mes/wm/outsource-receipt/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/line/index.ts new file mode 100644 index 000000000..d28412a5b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/outsourcereceipt/line/index.ts @@ -0,0 +1,59 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmOutsourceReceiptLineApi { + /** MES 外协入库单行 */ + export interface OutsourceReceiptLine { + id?: number; // 行编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 入库数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次编码 + productionDate?: number; // 生产日期 + expireDate?: number; // 有效期 + lotNumber?: string; // 生产批号 + iqcCheckFlag?: boolean; // 是否需要质检 + qualityStatus?: number; // 质量状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询外协入库单行分页 */ +export function getOutsourceReceiptLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/outsource-receipt-line/page', { params }); +} + +/** 查询外协入库单行详情 */ +export function getOutsourceReceiptLine(id: number) { + return requestClient.get( + `/mes/wm/outsource-receipt-line/get?id=${id}`, + ); +} + +/** 新增外协入库单行 */ +export function createOutsourceReceiptLine( + data: MesWmOutsourceReceiptLineApi.OutsourceReceiptLine, +) { + return requestClient.post('/mes/wm/outsource-receipt-line/create', data); +} + +/** 修改外协入库单行 */ +export function updateOutsourceReceiptLine( + data: MesWmOutsourceReceiptLineApi.OutsourceReceiptLine, +) { + return requestClient.put('/mes/wm/outsource-receipt-line/update', data); +} + +/** 删除外协入库单行 */ +export function deleteOutsourceReceiptLine(id: number) { + return requestClient.delete(`/mes/wm/outsource-receipt-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/packages/index.ts b/apps/web-antdv-next/src/api/mes/wm/packages/index.ts new file mode 100644 index 000000000..cdbe51cf0 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/packages/index.ts @@ -0,0 +1,83 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmPackageApi { + /** 装箱单 */ + export interface Package { + id?: number; // 装箱单编号 + code?: string; // 装箱单编码 + parentId?: number; // 父箱编号 + packageDate?: number; // 装箱日期 + salesOrderCode?: string; // 销售订单编号 + invoiceCode?: string; // 发票编号 + clientId?: number; // 客户编号 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + clientNickname?: string; // 客户简称 + length?: number; // 箱长度 + width?: number; // 箱宽度 + height?: number; // 箱高度 + sizeUnitId?: number; // 尺寸单位编号 + sizeUnitName?: string; // 尺寸单位名称 + netWeight?: number; // 净重 + grossWeight?: number; // 毛重 + weightUnitId?: number; // 重量单位编号 + weightUnitName?: string; // 重量单位名称 + inspectorUserId?: number; // 检查员用户编号 + inspectorName?: string; // 检查员名称 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: string; // 创建时间 + children?: Package[]; // 子箱列表 + } +} + +/** 查询装箱单分页 */ +export function getPackagePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/package/page', + { params }, + ); +} + +/** 查询装箱单详情 */ +export function getPackage(id: number) { + return requestClient.get( + `/mes/wm/package/get?id=${id}`, + ); +} + +/** 新增装箱单 */ +export function createPackage(data: MesWmPackageApi.Package) { + return requestClient.post('/mes/wm/package/create', data); +} + +/** 修改装箱单 */ +export function updatePackage(data: MesWmPackageApi.Package) { + return requestClient.put('/mes/wm/package/update', data); +} + +/** 删除装箱单 */ +export function deletePackage(id: number) { + return requestClient.delete(`/mes/wm/package/delete?id=${id}`); +} + +/** 完成装箱单 */ +export function finishPackage(id: number) { + return requestClient.put(`/mes/wm/package/finish?id=${id}`); +} + +/** 添加子箱 */ +export function addChildPackage(parentId: number, childId: number) { + return requestClient.put('/mes/wm/package/add-child-package', null, { + params: { childId, parentId }, + }); +} + +/** 移除子箱 */ +export function removeChildPackage(childId: number) { + return requestClient.put( + `/mes/wm/package/remove-child-package?childId=${childId}`, + ); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/packages/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/packages/line/index.ts new file mode 100644 index 000000000..0f8e77b4e --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/packages/line/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmPackageLineApi { + /** 装箱明细 */ + export interface PackageLine { + id?: number; // 装箱明细编号 + packageId?: number; // 装箱单编号 + materialStockId?: number; // 库存编号 + itemId?: number; // 产品物料编号 + itemCode?: string; // 产品物料编码 + itemName?: string; // 产品物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + quantity?: number; // 装箱数量 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 生产工单编号 + batchCode?: string; // 批次号 + expireDate?: number; // 有效期 + remark?: string; // 备注 + createTime?: string; // 创建时间 + } +} + +/** 查询装箱明细分页 */ +export function getPackageLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/package-line/page', + { params }, + ); +} + +/** 查询装箱明细详情 */ +export function getPackageLine(id: number) { + return requestClient.get( + `/mes/wm/package-line/get?id=${id}`, + ); +} + +/** 新增装箱明细 */ +export function createPackageLine(data: MesWmPackageLineApi.PackageLine) { + return requestClient.post('/mes/wm/package-line/create', data); +} + +/** 修改装箱明细 */ +export function updatePackageLine(data: MesWmPackageLineApi.PackageLine) { + return requestClient.put('/mes/wm/package-line/update', data); +} + +/** 删除装箱明细 */ +export function deletePackageLine(id: number) { + return requestClient.delete(`/mes/wm/package-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productissue/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/productissue/detail/index.ts new file mode 100644 index 000000000..96def9c44 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productissue/detail/index.ts @@ -0,0 +1,56 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmProductIssueDetailApi { + /** MES 领料出库明细 */ + export interface ProductIssueDetail { + id?: number; // 明细编号 + issueId?: number; // 领料单编号 + lineId?: number; // 领料单行编号 + materialStockId?: number; // 库存记录编号 + itemId?: number; // 物料编号 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询领料出库明细列表(按行编号) */ +export function getProductIssueDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/product-issue-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询领料出库明细详情 */ +export function getProductIssueDetail(id: number) { + return requestClient.get( + `/mes/wm/product-issue-detail/get?id=${id}`, + ); +} + +/** 新增领料出库明细 */ +export function createProductIssueDetail( + data: MesWmProductIssueDetailApi.ProductIssueDetail, +) { + return requestClient.post('/mes/wm/product-issue-detail/create', data); +} + +/** 修改领料出库明细 */ +export function updateProductIssueDetail( + data: MesWmProductIssueDetailApi.ProductIssueDetail, +) { + return requestClient.put('/mes/wm/product-issue-detail/update', data); +} + +/** 删除领料出库明细 */ +export function deleteProductIssueDetail(id: number) { + return requestClient.delete(`/mes/wm/product-issue-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productissue/index.ts b/apps/web-antdv-next/src/api/mes/wm/productissue/index.ts new file mode 100644 index 000000000..78e792289 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productissue/index.ts @@ -0,0 +1,87 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductIssueApi { + /** MES 领料出库单 */ + export interface ProductIssue { + id?: number; // 领料单编号 + code?: string; // 领料单编号 + name?: string; // 领料单名称 + workstationId?: number; // 工作站编号 + workstationCode?: string; // 工作站编码 + workstationName?: string; // 工作站名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 生产工单编码 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + requiredTime?: number; // 需求时间 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询领料出库单分页 */ +export function getProductIssuePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/product-issue/page', + { params }, + ); +} + +/** 查询领料出库单详情 */ +export function getProductIssue(id: number) { + return requestClient.get( + `/mes/wm/product-issue/get?id=${id}`, + ); +} + +/** 新增领料出库单 */ +export function createProductIssue(data: MesWmProductIssueApi.ProductIssue) { + return requestClient.post('/mes/wm/product-issue/create', data); +} + +/** 修改领料出库单 */ +export function updateProductIssue(data: MesWmProductIssueApi.ProductIssue) { + return requestClient.put('/mes/wm/product-issue/update', data); +} + +/** 删除领料出库单 */ +export function deleteProductIssue(id: number) { + return requestClient.delete(`/mes/wm/product-issue/delete?id=${id}`); +} + +/** 提交领料出库单 */ +export function submitProductIssue(id: number) { + return requestClient.put(`/mes/wm/product-issue/submit?id=${id}`); +} + +/** 执行拣货 */ +export function stockProductIssue(id: number) { + return requestClient.put(`/mes/wm/product-issue/stock?id=${id}`); +} + +/** 完成领料出库单 */ +export function finishProductIssue(id: number) { + return requestClient.put(`/mes/wm/product-issue/finish?id=${id}`); +} + +/** 取消领料出库单 */ +export function cancelProductIssue(id: number) { + return requestClient.put(`/mes/wm/product-issue/cancel?id=${id}`); +} + +/** 校验领料出库单拣货数量是否与领料数量一致 */ +export function checkProductIssueQuantity(id: number) { + return requestClient.get( + `/mes/wm/product-issue/check-quantity?id=${id}`, + ); +} + +/** 导出领料出库单 */ +export function exportProductIssue(params: any) { + return requestClient.download('/mes/wm/product-issue/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productissue/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/productissue/line/index.ts new file mode 100644 index 000000000..65ae7a187 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productissue/line/index.ts @@ -0,0 +1,53 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductIssueLineApi { + /** MES 领料出库单行 */ + export interface ProductIssueLine { + id?: number; // 行编号 + issueId?: number; // 领料单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 领料数量 + batchId?: number; // 批次编号 + remark?: string; // 备注 + } +} + +/** 查询领料出库单行分页 */ +export function getProductIssueLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/product-issue-line/page', + { params }, + ); +} + +/** 查询领料出库单行详情 */ +export function getProductIssueLine(id: number) { + return requestClient.get( + `/mes/wm/product-issue-line/get?id=${id}`, + ); +} + +/** 新增领料出库单行 */ +export function createProductIssueLine( + data: MesWmProductIssueLineApi.ProductIssueLine, +) { + return requestClient.post('/mes/wm/product-issue-line/create', data); +} + +/** 修改领料出库单行 */ +export function updateProductIssueLine( + data: MesWmProductIssueLineApi.ProductIssueLine, +) { + return requestClient.put('/mes/wm/product-issue-line/update', data); +} + +/** 删除领料出库单行 */ +export function deleteProductIssueLine(id: number) { + return requestClient.delete(`/mes/wm/product-issue-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productproduce/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/productproduce/line/index.ts new file mode 100644 index 000000000..ab3f49f29 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productproduce/line/index.ts @@ -0,0 +1,37 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductProduceLineApi { + /** MES 产品产出行 */ + export interface ProductProduceLine { + id?: number; + feedbackId?: number; // 报工编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物资编码 + itemName?: string; // 物资名称 + specification?: string; // 规格型号 + unitMeasureId?: number; // 单位编号 + unitMeasureName?: string; // 单位 + quantity?: number; // 产出数量 + batchCode?: string; // 批次号 + qualityStatus?: number; // 质量状态 + locationId?: number; // 库位编号 + locationName?: string; // 库位名称 + remark?: string; // 备注 + } + + /** MES 产品产出行分页查询参数 */ + export interface PageParams extends PageParam { + feedbackId?: number; + } +} + +/** 查询产品产出行分页 */ +export function getProductProduceLinePage( + params: MesWmProductProduceLineApi.PageParams, +) { + return requestClient.get< + PageResult + >('/mes/wm/product-produce-line/page', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productreceipt/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/productreceipt/detail/index.ts new file mode 100644 index 000000000..8e371a4d9 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productreceipt/detail/index.ts @@ -0,0 +1,58 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmProductReceiptDetailApi { + /** MES 产品入库明细 */ + export interface ProductReceiptDetail { + id?: number; // 明细编号 + lineId?: number; // 入库单行编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询产品入库明细列表(按行编号) */ +export function getProductReceiptDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/product-receipt-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询产品入库明细详情 */ +export function getProductReceiptDetail(id: number) { + return requestClient.get( + `/mes/wm/product-receipt-detail/get?id=${id}`, + ); +} + +/** 新增产品入库明细 */ +export function createProductReceiptDetail( + data: MesWmProductReceiptDetailApi.ProductReceiptDetail, +) { + return requestClient.post( + '/mes/wm/product-receipt-detail/create', + data, + ); +} + +/** 修改产品入库明细 */ +export function updateProductReceiptDetail( + data: MesWmProductReceiptDetailApi.ProductReceiptDetail, +) { + return requestClient.put('/mes/wm/product-receipt-detail/update', data); +} + +/** 删除产品入库明细 */ +export function deleteProductReceiptDetail(id: number) { + return requestClient.delete(`/mes/wm/product-receipt-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productreceipt/index.ts b/apps/web-antdv-next/src/api/mes/wm/productreceipt/index.ts new file mode 100644 index 000000000..73e30a178 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productreceipt/index.ts @@ -0,0 +1,91 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductReceiptApi { + /** MES 产品入库单 */ + export interface ProductReceipt { + id?: number; // 入库单编号 + code?: string; // 入库单编码 + name?: string; // 入库单名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 生产工单编码 + itemId?: number; // 产品物料编号 + itemCode?: string; // 产品物料编码 + itemName?: string; // 产品物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + receiptDate?: number; // 入库日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询产品入库单分页 */ +export function getProductReceiptPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/product-receipt/page', + { params }, + ); +} + +/** 查询产品入库单详情 */ +export function getProductReceipt(id: number) { + return requestClient.get( + `/mes/wm/product-receipt/get?id=${id}`, + ); +} + +/** 新增产品入库单 */ +export function createProductReceipt( + data: MesWmProductReceiptApi.ProductReceipt, +) { + return requestClient.post('/mes/wm/product-receipt/create', data); +} + +/** 修改产品入库单 */ +export function updateProductReceipt( + data: MesWmProductReceiptApi.ProductReceipt, +) { + return requestClient.put('/mes/wm/product-receipt/update', data); +} + +/** 删除产品入库单 */ +export function deleteProductReceipt(id: number) { + return requestClient.delete(`/mes/wm/product-receipt/delete?id=${id}`); +} + +/** 提交产品入库单 */ +export function submitProductReceipt(id: number) { + return requestClient.put(`/mes/wm/product-receipt/submit?id=${id}`); +} + +/** 执行上架 */ +export function stockProductReceipt(id: number) { + return requestClient.put(`/mes/wm/product-receipt/stock?id=${id}`); +} + +/** 执行入库 */ +export function finishProductReceipt(id: number) { + return requestClient.put(`/mes/wm/product-receipt/finish?id=${id}`); +} + +/** 取消产品入库单 */ +export function cancelProductReceipt(id: number) { + return requestClient.put(`/mes/wm/product-receipt/cancel?id=${id}`); +} + +/** 校验产品入库单明细数量是否与行收货数量一致 */ +export function checkProductReceiptQuantity(id: number) { + return requestClient.get( + `/mes/wm/product-receipt/check-quantity?id=${id}`, + ); +} + +/** 导出产品入库单 */ +export function exportProductReceipt(params: any) { + return requestClient.download('/mes/wm/product-receipt/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productreceipt/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/productreceipt/line/index.ts new file mode 100644 index 000000000..04e113b3b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productreceipt/line/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductReceiptLineApi { + /** MES 产品入库单行 */ + export interface ProductReceiptLine { + id?: number; // 行编号 + receiptId?: number; // 入库单编号 + itemId?: number; // 物料编号 + materialStockId?: number; // 库存记录编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 入库数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + remark?: string; // 备注 + } +} + +/** 查询产品入库单行分页 */ +export function getProductReceiptLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/product-receipt-line/page', { params }); +} + +/** 查询产品入库单行详情 */ +export function getProductReceiptLine(id: number) { + return requestClient.get( + `/mes/wm/product-receipt-line/get?id=${id}`, + ); +} + +/** 新增产品入库单行 */ +export function createProductReceiptLine( + data: MesWmProductReceiptLineApi.ProductReceiptLine, +) { + return requestClient.post( + '/mes/wm/product-receipt-line/create', + data, + ); +} + +/** 修改产品入库单行 */ +export function updateProductReceiptLine( + data: MesWmProductReceiptLineApi.ProductReceiptLine, +) { + return requestClient.put('/mes/wm/product-receipt-line/update', data); +} + +/** 删除产品入库单行 */ +export function deleteProductReceiptLine(id: number) { + return requestClient.delete(`/mes/wm/product-receipt-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productsales/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/productsales/detail/index.ts new file mode 100644 index 000000000..34aa22d5b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productsales/detail/index.ts @@ -0,0 +1,58 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmProductSalesDetailApi { + /** MES 销售出库明细 */ + export interface ProductSalesDetail { + id?: number; // 明细编号 + lineId?: number; // 出库单行编号 + salesId?: number; // 出库单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + quantity?: number; // 数量 + materialStockId?: number; // 库存记录编号 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询销售出库明细列表(按行编号) */ +export function getProductSalesDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/product-sales-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询销售出库明细详情 */ +export function getProductSalesDetail(id: number) { + return requestClient.get( + `/mes/wm/product-sales-detail/get?id=${id}`, + ); +} + +/** 新增销售出库明细 */ +export function createProductSalesDetail( + data: MesWmProductSalesDetailApi.ProductSalesDetail, +) { + return requestClient.post('/mes/wm/product-sales-detail/create', data); +} + +/** 修改销售出库明细 */ +export function updateProductSalesDetail( + data: MesWmProductSalesDetailApi.ProductSalesDetail, +) { + return requestClient.put('/mes/wm/product-sales-detail/update', data); +} + +/** 删除销售出库明细 */ +export function deleteProductSalesDetail(id: number) { + return requestClient.delete(`/mes/wm/product-sales-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productsales/index.ts b/apps/web-antdv-next/src/api/mes/wm/productsales/index.ts new file mode 100644 index 000000000..b0fddcfe4 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productsales/index.ts @@ -0,0 +1,96 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductSalesApi { + /** MES 销售出库单 */ + export interface ProductSales { + id?: number; // 出库单编号 + code?: string; // 出库单编号 + name?: string; // 出库单名称 + noticeId?: number; // 发货通知单编号 + noticeCode?: string; // 发货通知单编码 + clientId?: number; // 客户编号 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + salesOrderCode?: string; // 销售订单编号 + salesDate?: number; // 出库日期 + contactName?: string; // 收货人 + contactTelephone?: string; // 联系方式 + contactAddress?: string; // 收货地址 + carrier?: string; // 承运商 + shippingNumber?: string; // 运输单号 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询销售出库单分页 */ +export function getProductSalesPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/product-sales/page', + { params }, + ); +} + +/** 查询销售出库单详情 */ +export function getProductSales(id: number) { + return requestClient.get( + `/mes/wm/product-sales/get?id=${id}`, + ); +} + +/** 新增销售出库单 */ +export function createProductSales(data: MesWmProductSalesApi.ProductSales) { + return requestClient.post('/mes/wm/product-sales/create', data); +} + +/** 修改销售出库单 */ +export function updateProductSales(data: MesWmProductSalesApi.ProductSales) { + return requestClient.put('/mes/wm/product-sales/update', data); +} + +/** 删除销售出库单 */ +export function deleteProductSales(id: number) { + return requestClient.delete(`/mes/wm/product-sales/delete?id=${id}`); +} + +/** 提交销售出库单 */ +export function submitProductSales(id: number) { + return requestClient.put(`/mes/wm/product-sales/submit?id=${id}`); +} + +/** 执行拣货 */ +export function stockProductSales(id: number) { + return requestClient.put(`/mes/wm/product-sales/stock?id=${id}`); +} + +/** 填写运单 */ +export function shippingProductSales(data: MesWmProductSalesApi.ProductSales) { + return requestClient.put('/mes/wm/product-sales/shipping', data); +} + +/** 执行出库 */ +export function finishProductSales(id: number) { + return requestClient.put(`/mes/wm/product-sales/finish?id=${id}`); +} + +/** 取消销售出库单 */ +export function cancelProductSales(id: number) { + return requestClient.put(`/mes/wm/product-sales/cancel?id=${id}`); +} + +/** 校验销售出库单拣货数量是否与出库数量一致 */ +export function checkProductSalesQuantity(id: number) { + return requestClient.get( + `/mes/wm/product-sales/check-quantity?id=${id}`, + ); +} + +/** 导出销售出库单 */ +export function exportProductSales(params: any) { + return requestClient.download('/mes/wm/product-sales/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/productsales/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/productsales/line/index.ts new file mode 100644 index 000000000..f1d4ff57b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/productsales/line/index.ts @@ -0,0 +1,56 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmProductSalesLineApi { + /** MES 销售出库单行 */ + export interface ProductSalesLine { + id?: number; // 行编号 + salesId?: number; // 出库单编号 + noticeLineId?: number; // 发货通知单行编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 出库数量 + pickedQuantity?: number; // 已拣货数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + oqcCheckFlag?: boolean; // 是否检验 + remark?: string; // 备注 + } +} + +/** 查询销售出库单行分页 */ +export function getProductSalesLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/product-sales-line/page', { params }); +} + +/** 查询销售出库单行详情 */ +export function getProductSalesLine(id: number) { + return requestClient.get( + `/mes/wm/product-sales-line/get?id=${id}`, + ); +} + +/** 新增销售出库单行 */ +export function createProductSalesLine( + data: MesWmProductSalesLineApi.ProductSalesLine, +) { + return requestClient.post('/mes/wm/product-sales-line/create', data); +} + +/** 修改销售出库单行 */ +export function updateProductSalesLine( + data: MesWmProductSalesLineApi.ProductSalesLine, +) { + return requestClient.put('/mes/wm/product-sales-line/update', data); +} + +/** 删除销售出库单行 */ +export function deleteProductSalesLine(id: number) { + return requestClient.delete(`/mes/wm/product-sales-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnissue/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnissue/detail/index.ts new file mode 100644 index 000000000..7c878bb15 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnissue/detail/index.ts @@ -0,0 +1,56 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnIssueDetailApi { + /** MES 生产退料明细 */ + export interface ReturnIssueDetail { + id?: number; // 明细编号 + issueId?: number; // 退料单编号 + lineId?: number; // 退料单行编号 + materialStockId?: number; // 库存记录编号 + itemId?: number; // 物料编号 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询生产退料明细列表(按行编号) */ +export function getReturnIssueDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/return-issue-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询生产退料明细详情 */ +export function getReturnIssueDetail(id: number) { + return requestClient.get( + `/mes/wm/return-issue-detail/get?id=${id}`, + ); +} + +/** 新增生产退料明细 */ +export function createReturnIssueDetail( + data: MesWmReturnIssueDetailApi.ReturnIssueDetail, +) { + return requestClient.post('/mes/wm/return-issue-detail/create', data); +} + +/** 修改生产退料明细 */ +export function updateReturnIssueDetail( + data: MesWmReturnIssueDetailApi.ReturnIssueDetail, +) { + return requestClient.put('/mes/wm/return-issue-detail/update', data); +} + +/** 删除生产退料明细 */ +export function deleteReturnIssueDetail(id: number) { + return requestClient.delete(`/mes/wm/return-issue-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnissue/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnissue/index.ts new file mode 100644 index 000000000..c2a10b099 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnissue/index.ts @@ -0,0 +1,78 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnIssueApi { + /** MES 生产退料单 */ + export interface ReturnIssue { + id?: number; // 退料单编号 + code?: string; // 退料单编号 + name?: string; // 退料单名称 + workstationId?: number; // 工作站编号 + workstationName?: string; // 工作站名称 + workOrderId?: number; // 生产工单编号 + workOrderCode?: string; // 生产工单编码 + type?: number; // 退料类型 + returnDate?: number; // 退料日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询生产退料单分页 */ +export function getReturnIssuePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-issue/page', + { params }, + ); +} + +/** 查询生产退料单详情 */ +export function getReturnIssue(id: number) { + return requestClient.get( + `/mes/wm/return-issue/get?id=${id}`, + ); +} + +/** 新增生产退料单 */ +export function createReturnIssue(data: MesWmReturnIssueApi.ReturnIssue) { + return requestClient.post('/mes/wm/return-issue/create', data); +} + +/** 修改生产退料单 */ +export function updateReturnIssue(data: MesWmReturnIssueApi.ReturnIssue) { + return requestClient.put('/mes/wm/return-issue/update', data); +} + +/** 删除生产退料单 */ +export function deleteReturnIssue(id: number) { + return requestClient.delete(`/mes/wm/return-issue/delete?id=${id}`); +} + +/** 提交生产退料单 */ +export function submitReturnIssue(id: number) { + return requestClient.put(`/mes/wm/return-issue/submit?id=${id}`); +} + +/** 入库上架 */ +export function stockReturnIssue(id: number) { + return requestClient.put(`/mes/wm/return-issue/stock?id=${id}`); +} + +/** 完成生产退料单 */ +export function finishReturnIssue(id: number) { + return requestClient.put(`/mes/wm/return-issue/finish?id=${id}`); +} + +/** 取消生产退料单 */ +export function cancelReturnIssue(id: number) { + return requestClient.put(`/mes/wm/return-issue/cancel?id=${id}`); +} + +/** 导出生产退料单 */ +export function exportReturnIssue(params: any) { + return requestClient.download('/mes/wm/return-issue/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnissue/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnissue/line/index.ts new file mode 100644 index 000000000..05bef0792 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnissue/line/index.ts @@ -0,0 +1,58 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnIssueLineApi { + /** MES 生产退料单行 */ + export interface ReturnIssueLine { + id?: number; // 行编号 + issueId?: number; // 退料单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + materialStockId?: number; // 库存记录编号 + quantity?: number; // 退料数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + rqcCheckFlag?: boolean; // 是否检测 + qualityStatus?: number; // 质量状态 + rqcId?: number; // 退货检验单编号 + remark?: string; // 备注 + } +} + +/** 查询生产退料单行分页 */ +export function getReturnIssueLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-issue-line/page', + { params }, + ); +} + +/** 查询生产退料单行详情 */ +export function getReturnIssueLine(id: number) { + return requestClient.get( + `/mes/wm/return-issue-line/get?id=${id}`, + ); +} + +/** 新增生产退料单行 */ +export function createReturnIssueLine( + data: MesWmReturnIssueLineApi.ReturnIssueLine, +) { + return requestClient.post('/mes/wm/return-issue-line/create', data); +} + +/** 修改生产退料单行 */ +export function updateReturnIssueLine( + data: MesWmReturnIssueLineApi.ReturnIssueLine, +) { + return requestClient.put('/mes/wm/return-issue-line/update', data); +} + +/** 删除生产退料单行 */ +export function deleteReturnIssueLine(id: number) { + return requestClient.delete(`/mes/wm/return-issue-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnsales/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnsales/detail/index.ts new file mode 100644 index 000000000..dfba83fa7 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnsales/detail/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnSalesDetailApi { + /** MES 销售退货明细 */ + export interface ReturnSalesDetail { + id?: number; // 明细编号 + returnId?: number; // 退货单编号 + lineId?: number; // 退货单行编号 + itemId?: number; // 物料编号 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询销售退货明细列表(按行编号) */ +export function getReturnSalesDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/return-sales-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询销售退货明细详情 */ +export function getReturnSalesDetail(id: number) { + return requestClient.get( + `/mes/wm/return-sales-detail/get?id=${id}`, + ); +} + +/** 新增销售退货明细 */ +export function createReturnSalesDetail( + data: MesWmReturnSalesDetailApi.ReturnSalesDetail, +) { + return requestClient.post('/mes/wm/return-sales-detail/create', data); +} + +/** 修改销售退货明细 */ +export function updateReturnSalesDetail( + data: MesWmReturnSalesDetailApi.ReturnSalesDetail, +) { + return requestClient.put('/mes/wm/return-sales-detail/update', data); +} + +/** 删除销售退货明细 */ +export function deleteReturnSalesDetail(id: number) { + return requestClient.delete(`/mes/wm/return-sales-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnsales/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnsales/index.ts new file mode 100644 index 000000000..8ad32ce0e --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnsales/index.ts @@ -0,0 +1,78 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnSalesApi { + /** MES 销售退货单 */ + export interface ReturnSales { + id?: number; // 退货单编号 + code?: string; // 退货单编号 + name?: string; // 退货单名称 + salesOrderCode?: string; // 销售订单号 + clientId?: number; // 客户编号 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + returnDate?: number; // 退货日期 + returnReason?: string; // 退货原因 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询销售退货单分页 */ +export function getReturnSalesPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-sales/page', + { params }, + ); +} + +/** 查询销售退货单详情 */ +export function getReturnSales(id: number) { + return requestClient.get( + `/mes/wm/return-sales/get?id=${id}`, + ); +} + +/** 新增销售退货单 */ +export function createReturnSales(data: MesWmReturnSalesApi.ReturnSales) { + return requestClient.post('/mes/wm/return-sales/create', data); +} + +/** 修改销售退货单 */ +export function updateReturnSales(data: MesWmReturnSalesApi.ReturnSales) { + return requestClient.put('/mes/wm/return-sales/update', data); +} + +/** 删除销售退货单 */ +export function deleteReturnSales(id: number) { + return requestClient.delete(`/mes/wm/return-sales/delete?id=${id}`); +} + +/** 提交销售退货单 */ +export function submitReturnSales(id: number) { + return requestClient.put(`/mes/wm/return-sales/submit?id=${id}`); +} + +/** 执行退货 */ +export function finishReturnSales(id: number) { + return requestClient.put(`/mes/wm/return-sales/finish?id=${id}`); +} + +/** 执行上架 */ +export function stockReturnSales(id: number) { + return requestClient.put(`/mes/wm/return-sales/stock?id=${id}`); +} + +/** 取消销售退货单 */ +export function cancelReturnSales(id: number) { + return requestClient.put(`/mes/wm/return-sales/cancel?id=${id}`); +} + +/** 导出销售退货单 */ +export function exportReturnSales(params: any) { + return requestClient.download('/mes/wm/return-sales/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnsales/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnsales/line/index.ts new file mode 100644 index 000000000..f08ce776b --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnsales/line/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnSalesLineApi { + /** MES 销售退货单行 */ + export interface ReturnSalesLine { + id?: number; // 行编号 + returnId?: number; // 退货单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 退货数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + rqcCheckFlag?: boolean; // 是否需要质检 + rqcId?: number; // 退货检验单编号 + qualityStatus?: number; // 质量状态 + remark?: string; // 备注 + } +} + +/** 查询销售退货单行分页 */ +export function getReturnSalesLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-sales-line/page', + { params }, + ); +} + +/** 查询销售退货单行详情 */ +export function getReturnSalesLine(id: number) { + return requestClient.get( + `/mes/wm/return-sales-line/get?id=${id}`, + ); +} + +/** 新增销售退货单行 */ +export function createReturnSalesLine( + data: MesWmReturnSalesLineApi.ReturnSalesLine, +) { + return requestClient.post('/mes/wm/return-sales-line/create', data); +} + +/** 修改销售退货单行 */ +export function updateReturnSalesLine( + data: MesWmReturnSalesLineApi.ReturnSalesLine, +) { + return requestClient.put('/mes/wm/return-sales-line/update', data); +} + +/** 删除销售退货单行 */ +export function deleteReturnSalesLine(id: number) { + return requestClient.delete(`/mes/wm/return-sales-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnvendor/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnvendor/detail/index.ts new file mode 100644 index 000000000..92bb049f1 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnvendor/detail/index.ts @@ -0,0 +1,56 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnVendorDetailApi { + /** MES 供应商退货明细 */ + export interface ReturnVendorDetail { + id?: number; // 明细编号 + returnId?: number; // 退货单编号 + lineId?: number; // 退货单行编号 + materialStockId?: number; // 库存记录编号 + itemId?: number; // 物料编号 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + remark?: string; // 备注 + } +} + +/** 查询供应商退货明细列表(按行编号) */ +export function getReturnVendorDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/return-vendor-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询供应商退货明细详情 */ +export function getReturnVendorDetail(id: number) { + return requestClient.get( + `/mes/wm/return-vendor-detail/get?id=${id}`, + ); +} + +/** 新增供应商退货明细 */ +export function createReturnVendorDetail( + data: MesWmReturnVendorDetailApi.ReturnVendorDetail, +) { + return requestClient.post('/mes/wm/return-vendor-detail/create', data); +} + +/** 修改供应商退货明细 */ +export function updateReturnVendorDetail( + data: MesWmReturnVendorDetailApi.ReturnVendorDetail, +) { + return requestClient.put('/mes/wm/return-vendor-detail/update', data); +} + +/** 删除供应商退货明细 */ +export function deleteReturnVendorDetail(id: number) { + return requestClient.delete(`/mes/wm/return-vendor-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnvendor/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnvendor/index.ts new file mode 100644 index 000000000..fdb5bbe6d --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnvendor/index.ts @@ -0,0 +1,88 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnVendorApi { + /** MES 供应商退货单 */ + export interface ReturnVendor { + id?: number; // 退货单编号 + code?: string; // 退货单编号 + name?: string; // 退货单名称 + purchaseOrderCode?: string; // 采购订单号 + vendorId?: number; // 供应商编号 + vendorCode?: string; // 供应商编码 + vendorName?: string; // 供应商名称 + vendorNickname?: string; // 供应商简称 + returnDate?: number; // 退货日期 + returnReason?: string; // 退货原因 + transportCode?: string; // 运单号 + transportTelephone?: string; // 联系电话 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询供应商退货单分页 */ +export function getReturnVendorPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-vendor/page', + { params }, + ); +} + +/** 查询供应商退货单详情 */ +export function getReturnVendor(id: number) { + return requestClient.get( + `/mes/wm/return-vendor/get?id=${id}`, + ); +} + +/** 新增供应商退货单 */ +export function createReturnVendor(data: MesWmReturnVendorApi.ReturnVendor) { + return requestClient.post('/mes/wm/return-vendor/create', data); +} + +/** 修改供应商退货单 */ +export function updateReturnVendor(data: MesWmReturnVendorApi.ReturnVendor) { + return requestClient.put('/mes/wm/return-vendor/update', data); +} + +/** 删除供应商退货单 */ +export function deleteReturnVendor(id: number) { + return requestClient.delete(`/mes/wm/return-vendor/delete?id=${id}`); +} + +/** 提交供应商退货单 */ +export function submitReturnVendor(id: number) { + return requestClient.put(`/mes/wm/return-vendor/submit?id=${id}`); +} + +/** 执行拣货 */ +export function stockReturnVendor(id: number) { + return requestClient.put(`/mes/wm/return-vendor/stock?id=${id}`); +} + +/** 完成供应商退货单 */ +export function finishReturnVendor(id: number) { + return requestClient.put(`/mes/wm/return-vendor/finish?id=${id}`); +} + +/** 取消供应商退货单 */ +export function cancelReturnVendor(id: number) { + return requestClient.put(`/mes/wm/return-vendor/cancel?id=${id}`); +} + +/** 校验供应商退货单拣货数量是否与退货数量一致 */ +export function checkReturnVendorQuantity(id: number) { + return requestClient.get( + `/mes/wm/return-vendor/check-quantity?id=${id}`, + ); +} + +/** 导出供应商退货单 */ +export function exportReturnVendor(params: any) { + return requestClient.download('/mes/wm/return-vendor/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/returnvendor/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/returnvendor/line/index.ts new file mode 100644 index 000000000..c2ff06c62 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/returnvendor/line/index.ts @@ -0,0 +1,54 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmReturnVendorLineApi { + /** MES 供应商退货单行 */ + export interface ReturnVendorLine { + id?: number; // 行编号 + returnId?: number; // 退货单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + quantity?: number; // 退货数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + remark?: string; // 备注 + } +} + +/** 查询供应商退货单行分页 */ +export function getReturnVendorLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/return-vendor-line/page', + { params }, + ); +} + +/** 查询供应商退货单行详情 */ +export function getReturnVendorLine(id: number) { + return requestClient.get( + `/mes/wm/return-vendor-line/get?id=${id}`, + ); +} + +/** 新增供应商退货单行 */ +export function createReturnVendorLine( + data: MesWmReturnVendorLineApi.ReturnVendorLine, +) { + return requestClient.post('/mes/wm/return-vendor-line/create', data); +} + +/** 修改供应商退货单行 */ +export function updateReturnVendorLine( + data: MesWmReturnVendorLineApi.ReturnVendorLine, +) { + return requestClient.put('/mes/wm/return-vendor-line/update', data); +} + +/** 删除供应商退货单行 */ +export function deleteReturnVendorLine(id: number) { + return requestClient.delete(`/mes/wm/return-vendor-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/salesnotice/index.ts b/apps/web-antdv-next/src/api/mes/wm/salesnotice/index.ts new file mode 100644 index 000000000..c053f69c7 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/salesnotice/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmSalesNoticeApi { + /** MES 发货通知单 */ + export interface SalesNotice { + id?: number; // 通知单编号 + code?: string; // 通知单编号 + name?: string; // 通知单名称 + salesOrderCode?: string; // 销售订单编号 + clientId?: number; // 客户编号 + clientCode?: string; // 客户编码 + clientName?: string; // 客户名称 + salesDate?: number; // 发货日期 + recipientName?: string; // 收货人 + recipientTelephone?: string; // 联系方式 + recipientAddress?: string; // 收货地址 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询发货通知单分页 */ +export function getSalesNoticePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/sales-notice/page', + { params }, + ); +} + +/** 查询发货通知单详情 */ +export function getSalesNotice(id: number) { + return requestClient.get( + `/mes/wm/sales-notice/get?id=${id}`, + ); +} + +/** 新增发货通知单 */ +export function createSalesNotice(data: MesWmSalesNoticeApi.SalesNotice) { + return requestClient.post('/mes/wm/sales-notice/create', data); +} + +/** 修改发货通知单 */ +export function updateSalesNotice(data: MesWmSalesNoticeApi.SalesNotice) { + return requestClient.put('/mes/wm/sales-notice/update', data); +} + +/** 删除发货通知单 */ +export function deleteSalesNotice(id: number) { + return requestClient.delete(`/mes/wm/sales-notice/delete?id=${id}`); +} + +/** 提交发货通知单 */ +export function submitSalesNotice(id: number) { + return requestClient.put(`/mes/wm/sales-notice/submit?id=${id}`); +} + +/** 导出发货通知单 */ +export function exportSalesNotice(params: any) { + return requestClient.download('/mes/wm/sales-notice/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/salesnotice/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/salesnotice/line/index.ts new file mode 100644 index 000000000..948d1bc63 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/salesnotice/line/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmSalesNoticeLineApi { + /** MES 发货通知单行 */ + export interface SalesNoticeLine { + id?: number; // 行编号 + noticeId?: number; // 发货通知单编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + quantity?: number; // 发货数量 + oqcCheckFlag?: boolean; // 是否检验 + remark?: string; // 备注 + } +} + +/** 查询发货通知单行分页 */ +export function getSalesNoticeLinePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/sales-notice-line/page', + { params }, + ); +} + +/** 查询发货通知单行详情 */ +export function getSalesNoticeLine(id: number) { + return requestClient.get( + `/mes/wm/sales-notice-line/get?id=${id}`, + ); +} + +/** 新增发货通知单行 */ +export function createSalesNoticeLine( + data: MesWmSalesNoticeLineApi.SalesNoticeLine, +) { + return requestClient.post('/mes/wm/sales-notice-line/create', data); +} + +/** 修改发货通知单行 */ +export function updateSalesNoticeLine( + data: MesWmSalesNoticeLineApi.SalesNoticeLine, +) { + return requestClient.put('/mes/wm/sales-notice-line/update', data); +} + +/** 删除发货通知单行 */ +export function deleteSalesNoticeLine(id: number) { + return requestClient.delete(`/mes/wm/sales-notice-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/sn/index.ts b/apps/web-antdv-next/src/api/mes/wm/sn/index.ts new file mode 100644 index 000000000..6970a796a --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/sn/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmSnApi { + /** MES SN 码分组 */ + export interface SnGroup { + uuid?: string; // 批次 UUID + count?: number; // SN 码数量 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitName?: string; // 单位名称 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + createTime?: Date; // 生成时间 + } + + /** MES SN 码生成参数 */ + export interface SnGenerate { + itemId?: number; // 物料编号 + batchCode?: string; // 批次号 + workOrderId?: number; // 生产工单编号 + count?: number; // 生成数量 + } + + /** MES SN 码分组分页查询参数 */ + export interface PageParams extends PageParam { + uuid?: string; // 分组 UUID + code?: string; // SN 码 + itemId?: number; // 物料编号 + batchCode?: string; // 批次号 + createTime?: string[]; // 创建时间 + } +} + +/** 生成 SN 码 */ +export function generateSnCodes(data: MesWmSnApi.SnGenerate) { + return requestClient.post('/mes/wm/sn/generate', data); +} + +/** 查询 SN 码分组分页 */ +export function getSnGroupPage(params: MesWmSnApi.PageParams) { + return requestClient.get>( + '/mes/wm/sn/group-page', + { params }, + ); +} + +/** 批量删除 SN 码(按批次 UUID) */ +export function deleteSnBatch(uuid: string) { + return requestClient.delete('/mes/wm/sn/delete-batch', { + params: { uuid }, + }); +} + +/** 导出 SN 码分组 Excel */ +export function exportSnGroupExcel(params: MesWmSnApi.PageParams) { + return requestClient.download('/mes/wm/sn/group-export-excel', { params }); +} + +/** 导出批次 SN 码明细 Excel */ +export function exportSnDetailExcel(uuid: string) { + return requestClient.download('/mes/wm/sn/export-excel', { + params: { uuid }, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/index.ts b/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/index.ts new file mode 100644 index 000000000..c6f29f092 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/index.ts @@ -0,0 +1,68 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmStockTakingPlanApi { + /** 盘点方案 */ + export interface StockTakingPlan { + id?: number; // 方案编号 + code?: string; // 方案编码 + name?: string; // 方案名称 + type?: number; // 盘点类型 + startTime?: number; // 开始时间 + endTime?: number; // 结束时间 + blindFlag?: boolean; // 是否盲盘 + frozen?: boolean; // 是否冻结库存 + status?: number; // 状态 + remark?: string; // 备注 + createTime?: string; // 创建时间 + } +} + +/** 查询盘点方案分页 */ +export function getStockTakingPlanPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/stocktaking-plan/page', + { params }, + ); +} + +/** 查询盘点方案详情 */ +export function getStockTakingPlan(id: number) { + return requestClient.get( + `/mes/wm/stocktaking-plan/get?id=${id}`, + ); +} + +/** 新增盘点方案 */ +export function createStockTakingPlan( + data: MesWmStockTakingPlanApi.StockTakingPlan, +) { + return requestClient.post('/mes/wm/stocktaking-plan/create', data); +} + +/** 修改盘点方案 */ +export function updateStockTakingPlan( + data: MesWmStockTakingPlanApi.StockTakingPlan, +) { + return requestClient.put('/mes/wm/stocktaking-plan/update', data); +} + +/** 修改盘点方案状态 */ +export function updateStockTakingPlanStatus(id: number, status: number) { + return requestClient.put('/mes/wm/stocktaking-plan/update-status', null, { + params: { id, status }, + }); +} + +/** 删除盘点方案 */ +export function deleteStockTakingPlan(id: number) { + return requestClient.delete(`/mes/wm/stocktaking-plan/delete?id=${id}`); +} + +/** 导出盘点方案 */ +export function exportStockTakingPlan(params: any) { + return requestClient.download('/mes/wm/stocktaking-plan/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/param/index.ts b/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/param/index.ts new file mode 100644 index 000000000..b6eb6e09e --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/stocktaking/plan/param/index.ts @@ -0,0 +1,49 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmStockTakingPlanParamApi { + /** 盘点方案条件 */ + export interface StockTakingPlanParam { + id?: number; // 条件编号 + planId?: number; // 方案编号 + type?: number; // 条件类型 + valueId?: number; // 条件值编号 + valueCode?: string; // 条件值编码 + valueName?: string; // 条件值名称 + remark?: string; // 备注 + } +} + +/** 查询盘点方案条件分页 */ +export function getStockTakingPlanParamPage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/stocktaking-plan-param/page', { params }); +} + +/** 查询盘点方案条件详情 */ +export function getStockTakingPlanParam(id: number) { + return requestClient.get( + `/mes/wm/stocktaking-plan-param/get?id=${id}`, + ); +} + +/** 新增盘点方案条件 */ +export function createStockTakingPlanParam( + data: MesWmStockTakingPlanParamApi.StockTakingPlanParam, +) { + return requestClient.post('/mes/wm/stocktaking-plan-param/create', data); +} + +/** 修改盘点方案条件 */ +export function updateStockTakingPlanParam( + data: MesWmStockTakingPlanParamApi.StockTakingPlanParam, +) { + return requestClient.put('/mes/wm/stocktaking-plan-param/update', data); +} + +/** 删除盘点方案条件 */ +export function deleteStockTakingPlanParam(id: number) { + return requestClient.delete(`/mes/wm/stocktaking-plan-param/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/index.ts b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/index.ts new file mode 100644 index 000000000..77622f351 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/index.ts @@ -0,0 +1,86 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmStockTakingTaskApi { + /** 盘点任务 */ + export interface StockTakingTask { + id?: number; // 任务编号 + code?: string; // 任务编码 + name?: string; // 任务名称 + takingDate?: string; // 盘点日期 + type?: number; // 盘点类型 + userId?: number; // 盘点人用户编号 + userNickname?: string; // 盘点人名称 + planId?: number; // 盘点方案编号 + planCode?: string; // 盘点方案编码 + planName?: string; // 盘点方案名称 + blindFlag?: boolean; // 是否盲盘 + frozen?: boolean; // 是否冻结库存 + startTime?: number; // 开始时间 + endTime?: number; // 结束时间 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: string; // 创建时间 + } +} + +/** 查询盘点任务分页 */ +export function getStockTakingPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/stocktaking-task/page', + { params }, + ); +} + +/** 查询盘点任务详情 */ +export function getStockTaking(id: number) { + return requestClient.get( + `/mes/wm/stocktaking-task/get?id=${id}`, + ); +} + +/** 新增盘点任务 */ +export function createStockTaking( + data: MesWmStockTakingTaskApi.StockTakingTask, +) { + return requestClient.post('/mes/wm/stocktaking-task/create', data); +} + +/** 修改盘点任务 */ +export function updateStockTaking( + data: MesWmStockTakingTaskApi.StockTakingTask, +) { + return requestClient.put('/mes/wm/stocktaking-task/update', data); +} + +/** 删除盘点任务 */ +export function deleteStockTaking(id: number) { + return requestClient.delete(`/mes/wm/stocktaking-task/delete?id=${id}`); +} + +/** 提交盘点任务 */ +export function submitStockTaking(id: number) { + return requestClient.put('/mes/wm/stocktaking-task/submit', null, { + params: { id }, + }); +} + +/** 取消盘点任务 */ +export function cancelStockTaking(id: number) { + return requestClient.put('/mes/wm/stocktaking-task/cancel', null, { + params: { id }, + }); +} + +/** 执行盘点任务 */ +export function finishStockTaking(id: number) { + return requestClient.put('/mes/wm/stocktaking-task/finish', { id }); +} + +/** 导出盘点任务 */ +export function exportStockTaking(params: any) { + return requestClient.download('/mes/wm/stocktaking-task/export-excel', { + params, + }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/line/index.ts new file mode 100644 index 000000000..804483ec7 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/line/index.ts @@ -0,0 +1,72 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmStockTakingTaskLineApi { + /** 盘点任务行 */ + export interface StockTakingTaskLine { + id?: number; // 盘点行编号 + taskId?: number; // 任务编号 + materialStockId?: number; // 库存编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + quantity?: number; // 在库数量 + takingQuantity?: number; // 盘点数量 + differenceQuantity?: number; // 差异数量 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + status?: number; // 状态 + remark?: string; // 备注 + } +} + +/** 查询盘点任务行分页 */ +export function getStockTakingTaskLinePage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/stocktaking-task-line/page', { params }); +} + +/** 查询盘点任务行精简列表 */ +export function getStockTakingTaskLineSimpleList(taskId: number) { + return requestClient.get( + '/mes/wm/stocktaking-task-line/simple-list', + { params: { taskId } }, + ); +} + +/** 查询盘点任务行详情 */ +export function getStockTakingTaskLine(id: number) { + return requestClient.get( + '/mes/wm/stocktaking-task-line/get', + { params: { id } }, + ); +} + +/** 新增盘点任务行 */ +export function createStockTakingTaskLine( + data: MesWmStockTakingTaskLineApi.StockTakingTaskLine, +) { + return requestClient.post('/mes/wm/stocktaking-task-line/create', data); +} + +/** 修改盘点任务行 */ +export function updateStockTakingTaskLine( + data: MesWmStockTakingTaskLineApi.StockTakingTaskLine, +) { + return requestClient.put('/mes/wm/stocktaking-task-line/update', data); +} + +/** 删除盘点任务行 */ +export function deleteStockTakingTaskLine(id: number) { + return requestClient.delete(`/mes/wm/stocktaking-task-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/result/index.ts b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/result/index.ts new file mode 100644 index 000000000..acd9a5f64 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/stocktaking/task/result/index.ts @@ -0,0 +1,64 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmStockTakingResultApi { + /** 盘点结果 */ + export interface StockTakingResult { + id?: number; // 结果编号 + taskId?: number; // 任务编号 + lineId?: number; // 盘点行编号 + materialStockId?: number; // 库存编号 + itemId?: number; // 物料编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 计量单位名称 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + areaId?: number; // 库位编号 + areaName?: string; // 库位名称 + quantity?: number; // 在库数量 + takingQuantity?: number; // 盘点数量 + remark?: string; // 备注 + createTime?: string; // 创建时间 + } +} + +/** 查询盘点结果分页 */ +export function getStockTakingResultPage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/stocktaking-task-result/page', { params }); +} + +/** 查询盘点结果详情 */ +export function getStockTakingResult(id: number) { + return requestClient.get( + '/mes/wm/stocktaking-task-result/get', + { params: { id } }, + ); +} + +/** 新增盘点结果 */ +export function createStockTakingResult( + data: MesWmStockTakingResultApi.StockTakingResult, +) { + return requestClient.post('/mes/wm/stocktaking-task-result/create', data); +} + +/** 修改盘点结果 */ +export function updateStockTakingResult( + data: MesWmStockTakingResultApi.StockTakingResult, +) { + return requestClient.put('/mes/wm/stocktaking-task-result/update', data); +} + +/** 删除盘点结果 */ +export function deleteStockTakingResult(id: number) { + return requestClient.delete(`/mes/wm/stocktaking-task-result/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/transfer/detail/index.ts b/apps/web-antdv-next/src/api/mes/wm/transfer/detail/index.ts new file mode 100644 index 000000000..ff215d92c --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/transfer/detail/index.ts @@ -0,0 +1,59 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferDetailApi { + /** MES 调拨明细 */ + export interface TransferDetail { + id?: number; // 编号 + lineId?: number; // 转移单行编号 + transferId?: number; // 转移单编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + toWarehouseId?: number; // 移入仓库编号 + toWarehouseName?: string; // 移入仓库名称 + toLocationId?: number; // 移入库区编号 + toLocationName?: string; // 移入库区名称 + toAreaId?: number; // 移入库位编号 + toAreaName?: string; // 移入库位名称 + remark?: string; // 备注 + } +} + +/** 查询调拨明细列表(按行编号) */ +export function getTransferDetailListByLineId(lineId: number) { + return requestClient.get( + '/mes/wm/transfer-detail/list-by-line', + { params: { lineId } }, + ); +} + +/** 查询调拨明细详情 */ +export function getTransferDetail(id: number) { + return requestClient.get( + `/mes/wm/transfer-detail/get?id=${id}`, + ); +} + +/** 新增调拨明细 */ +export function createTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.post('/mes/wm/transfer-detail/create', data); +} + +/** 修改调拨明细 */ +export function updateTransferDetail( + data: MesWmTransferDetailApi.TransferDetail, +) { + return requestClient.put('/mes/wm/transfer-detail/update', data); +} + +/** 删除调拨明细 */ +export function deleteTransferDetail(id: number) { + return requestClient.delete(`/mes/wm/transfer-detail/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/transfer/index.ts b/apps/web-antdv-next/src/api/mes/wm/transfer/index.ts new file mode 100644 index 000000000..14d9b860f --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/transfer/index.ts @@ -0,0 +1,92 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferApi { + /** MES 转移单 */ + export interface Transfer { + id?: number; // 编号 + code?: string; // 转移单编号 + name?: string; // 转移单名称 + type?: number; // 转移单类型 + deliveryFlag?: boolean; // 是否配送 + recipientName?: string; // 收货人 + recipientTelephone?: string; // 联系电话 + destinationAddress?: string; // 目的地 + carrier?: string; // 承运商 + shippingNumber?: string; // 运输单号 + confirmFlag?: boolean; // 是否确认 + transferDate?: string; // 转移日期 + status?: number; // 单据状态 + remark?: string; // 备注 + createTime?: number; // 创建时间 + } + + /** MES 转移单分页查询参数 */ + export interface PageParams extends PageParam { + code?: string; + name?: string; + type?: number; + status?: number; + } +} + +/** 查询转移单分页 */ +export function getTransferPage(params: MesWmTransferApi.PageParams) { + return requestClient.get>( + '/mes/wm/transfer/page', + { params }, + ); +} + +/** 查询转移单详情 */ +export function getTransfer(id: number) { + return requestClient.get( + `/mes/wm/transfer/get?id=${id}`, + ); +} + +/** 新增转移单 */ +export function createTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.post('/mes/wm/transfer/create', data); +} + +/** 修改转移单 */ +export function updateTransfer(data: MesWmTransferApi.Transfer) { + return requestClient.put('/mes/wm/transfer/update', data); +} + +/** 删除转移单 */ +export function deleteTransfer(id: number) { + return requestClient.delete(`/mes/wm/transfer/delete?id=${id}`); +} + +/** 提交转移单 */ +export function submitTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/submit?id=${id}`); +} + +/** 到货确认 */ +export function confirmTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/confirm?id=${id}`); +} + +/** 执行上架 */ +export function stockTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/stock?id=${id}`); +} + +/** 完成转移 */ +export function finishTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/finish?id=${id}`); +} + +/** 取消转移单 */ +export function cancelTransfer(id: number) { + return requestClient.put(`/mes/wm/transfer/cancel?id=${id}`); +} + +/** 导出转移单 */ +export function exportTransfer(params: any) { + return requestClient.download('/mes/wm/transfer/export-excel', { params }); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/transfer/line/index.ts b/apps/web-antdv-next/src/api/mes/wm/transfer/line/index.ts new file mode 100644 index 000000000..9ec7b5ea9 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/transfer/line/index.ts @@ -0,0 +1,55 @@ +import { requestClient } from '#/api/request'; + +export namespace MesWmTransferLineApi { + /** MES 转移单行 */ + export interface TransferLine { + id?: number; // 编号 + transferId?: number; // 转移单编号 + materialStockId?: number; // 库存台账编号 + itemId?: number; // 物料产品编号 + itemCode?: string; // 物料编码 + itemName?: string; // 物料名称 + specification?: string; // 规格型号 + unitMeasureName?: string; // 单位名称 + quantity?: number; // 转移数量 + batchId?: number; // 批次编号 + batchCode?: string; // 批次号 + fromWarehouseId?: number; // 移出仓库编号 + fromWarehouseName?: string; // 移出仓库名称 + fromLocationId?: number; // 移出库区编号 + fromLocationName?: string; // 移出库区名称 + fromAreaId?: number; // 移出库位编号 + fromAreaName?: string; // 移出库位名称 + remark?: string; // 备注 + } +} + +/** 查询转移单行列表 */ +export function getTransferLineList(transferId: number) { + return requestClient.get( + '/mes/wm/transfer-line/list', + { params: { transferId } }, + ); +} + +/** 查询转移单行详情 */ +export function getTransferLine(id: number) { + return requestClient.get( + `/mes/wm/transfer-line/get?id=${id}`, + ); +} + +/** 新增转移单行 */ +export function createTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.post('/mes/wm/transfer-line/create', data); +} + +/** 修改转移单行 */ +export function updateTransferLine(data: MesWmTransferLineApi.TransferLine) { + return requestClient.put('/mes/wm/transfer-line/update', data); +} + +/** 删除转移单行 */ +export function deleteTransferLine(id: number) { + return requestClient.delete(`/mes/wm/transfer-line/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/warehouse/area/index.ts b/apps/web-antdv-next/src/api/mes/wm/warehouse/area/index.ts new file mode 100644 index 000000000..ca67789d8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/warehouse/area/index.ts @@ -0,0 +1,65 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmWarehouseAreaApi { + /** MES 库位 */ + export interface WarehouseArea { + id?: number; // 库位编号 + code?: string; // 库位编码 + name?: string; // 库位名称 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + locationId?: number; // 库区编号 + locationName?: string; // 库区名称 + area?: number; // 面积 + maxLoad?: number; // 最大载荷 + positionX?: number; // X 坐标 + positionY?: number; // Y 坐标 + positionZ?: number; // Z 坐标 + status?: number; // 状态 + frozen?: boolean; // 是否冻结 + allowItemMixing?: boolean; // 是否允许物料混放 + allowBatchMixing?: boolean; // 是否允许批次混放 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询库位分页 */ +export function getWarehouseAreaPage(params: PageParam) { + return requestClient.get>( + '/mes/wm/warehouse-area/page', + { params }, + ); +} + +/** 查询库位精简列表 */ +export function getWarehouseAreaSimpleList(locationId?: number) { + return requestClient.get( + '/mes/wm/warehouse-area/simple-list', + { params: { locationId } }, + ); +} + +/** 查询库位详情 */ +export function getWarehouseArea(id: number) { + return requestClient.get( + `/mes/wm/warehouse-area/get?id=${id}`, + ); +} + +/** 新增库位 */ +export function createWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.post('/mes/wm/warehouse-area/create', data); +} + +/** 修改库位 */ +export function updateWarehouseArea(data: MesWmWarehouseAreaApi.WarehouseArea) { + return requestClient.put('/mes/wm/warehouse-area/update', data); +} + +/** 删除库位 */ +export function deleteWarehouseArea(id: number) { + return requestClient.delete(`/mes/wm/warehouse-area/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/warehouse/index.ts b/apps/web-antdv-next/src/api/mes/wm/warehouse/index.ts new file mode 100644 index 000000000..661b62ee4 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/warehouse/index.ts @@ -0,0 +1,55 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmWarehouseApi { + /** MES 仓库 */ + export interface Warehouse { + id?: number; // 仓库编号 + code?: string; // 仓库编码 + name?: string; // 仓库名称 + address?: string; // 地址 + area?: number; // 面积 + chargeUserId?: number; // 负责人 + frozen?: boolean; // 是否冻结 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询仓库分页 */ +export function getWarehousePage(params: PageParam) { + return requestClient.get>( + '/mes/wm/warehouse/page', + { params }, + ); +} + +/** 查询仓库精简列表 */ +export function getWarehouseSimpleList() { + return requestClient.get( + '/mes/wm/warehouse/simple-list', + ); +} + +/** 查询仓库详情 */ +export function getWarehouse(id: number) { + return requestClient.get( + `/mes/wm/warehouse/get?id=${id}`, + ); +} + +/** 新增仓库 */ +export function createWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.post('/mes/wm/warehouse/create', data); +} + +/** 修改仓库 */ +export function updateWarehouse(data: MesWmWarehouseApi.Warehouse) { + return requestClient.put('/mes/wm/warehouse/update', data); +} + +/** 删除仓库 */ +export function deleteWarehouse(id: number) { + return requestClient.delete(`/mes/wm/warehouse/delete?id=${id}`); +} diff --git a/apps/web-antdv-next/src/api/mes/wm/warehouse/location/index.ts b/apps/web-antdv-next/src/api/mes/wm/warehouse/location/index.ts new file mode 100644 index 000000000..4211f73c8 --- /dev/null +++ b/apps/web-antdv-next/src/api/mes/wm/warehouse/location/index.ts @@ -0,0 +1,72 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace MesWmWarehouseLocationApi { + /** MES 库区 */ + export interface WarehouseLocation { + id?: number; // 库区编号 + code?: string; // 库区编码 + name?: string; // 库区名称 + warehouseId?: number; // 仓库编号 + warehouseName?: string; // 仓库名称 + area?: number; // 面积 + frozen?: boolean; // 是否冻结 + remark?: string; // 备注 + createTime?: Date; // 创建时间 + } +} + +/** 查询库区分页 */ +export function getWarehouseLocationPage(params: PageParam) { + return requestClient.get< + PageResult + >('/mes/wm/warehouse-location/page', { params }); +} + +/** 查询库区精简列表 */ +export function getWarehouseLocationSimpleList(warehouseId?: number) { + return requestClient.get( + '/mes/wm/warehouse-location/simple-list', + { params: { warehouseId } }, + ); +} + +/** 查询库区详情 */ +export function getWarehouseLocation(id: number) { + return requestClient.get( + `/mes/wm/warehouse-location/get?id=${id}`, + ); +} + +/** 新增库区 */ +export function createWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.post('/mes/wm/warehouse-location/create', data); +} + +/** 修改库区 */ +export function updateWarehouseLocation( + data: MesWmWarehouseLocationApi.WarehouseLocation, +) { + return requestClient.put('/mes/wm/warehouse-location/update', data); +} + +/** 删除库区 */ +export function deleteWarehouseLocation(id: number) { + return requestClient.delete(`/mes/wm/warehouse-location/delete?id=${id}`); +} + +/** 批量设置库区下所有库位的混放规则 */ +export function updateAreaByLocationId( + locationId: number, + allowItemMixing?: boolean, + allowBatchMixing?: boolean, +) { + return requestClient.put( + '/mes/wm/warehouse-location/update-by-location-id', + null, + { params: { allowBatchMixing, allowItemMixing, locationId } }, + ); +} diff --git a/apps/web-antdv-next/src/router/routes/modules/mes.ts b/apps/web-antdv-next/src/router/routes/modules/mes.ts new file mode 100644 index 000000000..cf0d1c418 --- /dev/null +++ b/apps/web-antdv-next/src/router/routes/modules/mes.ts @@ -0,0 +1,55 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/mes', + name: 'MesCenter', + meta: { + title: 'MES 制造执行', + icon: 'lucide:factory', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: 'wm/warehouse/location', + name: 'MesWmLocation', + meta: { + title: '库区设置', + activePath: '/mes/wm/warehouse', + }, + component: () => + import('#/views/mes/wm/warehouse/location/index.vue'), + }, + { + path: 'wm/warehouse/area', + name: 'MesWmArea', + meta: { + title: '库位设置', + activePath: '/mes/wm/warehouse', + }, + component: () => import('#/views/mes/wm/warehouse/area/index.vue'), + }, + { + path: 'wm/barcode/config', + name: 'MesWmBarcodeConfig', + meta: { + title: '条码配置', + activePath: '/mes/wm/barcode', + }, + component: () => import('#/views/mes/wm/barcode/config/index.vue'), + }, + { + path: 'pro/task/gantt-edit', + name: 'MesProTaskGanttEdit', + meta: { + title: '甘特图编辑', + activePath: '/mes/pro/task', + }, + component: () => import('#/views/mes/pro/task/edit/index.vue'), + }, + ], + }, +]; + +export default routes; diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/components/date-cell.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/components/date-cell.vue new file mode 100644 index 000000000..5def825d5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/components/date-cell.vue @@ -0,0 +1,135 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/components/index.ts b/apps/web-antdv-next/src/views/mes/cal/calendar/components/index.ts new file mode 100644 index 000000000..e347f44b7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/components/index.ts @@ -0,0 +1,4 @@ +export { default as CalendarDateCell } from './date-cell.vue'; +export { default as CalendarLegend } from './legend.vue'; +export { default as CalendarPanel } from './panel.vue'; +export { useCalendar } from './use-calendar'; diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/components/legend.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/components/legend.vue new file mode 100644 index 000000000..cb820640b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/components/legend.vue @@ -0,0 +1,38 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/components/panel.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/components/panel.vue new file mode 100644 index 000000000..5d745d108 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/components/panel.vue @@ -0,0 +1,106 @@ + + + + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/components/use-calendar.ts b/apps/web-antdv-next/src/views/mes/cal/calendar/components/use-calendar.ts new file mode 100644 index 000000000..860c48a1b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/components/use-calendar.ts @@ -0,0 +1,100 @@ +import type { Dayjs } from 'dayjs'; + +import type { MesCalCalendarApi } from '#/api/mes/cal/calendar'; + +import { ref, watch } from 'vue'; + +import { HolidayType } from '@vben/constants'; + +import dayjs from 'dayjs'; + +import { getCalendarList } from '#/api/mes/cal/calendar'; +import { getHolidayList } from '#/api/mes/cal/holiday'; + +/** + * 排班日历通用 composable + * + * 封装日历组件中通用的响应式状态、假期加载、排班查询、月份切换逻辑 + */ +export function useCalendar() { + const loading = ref(false); + const currentDate = ref(dayjs()); + const calendarDayMap = ref>( + new Map(), + ); + const holidaySet = ref(new Set()); + + /** 计算当前月份的起止时间 */ + function getMonthRange() { + const startDay = currentDate.value + .startOf('month') + .format('YYYY-MM-DD 00:00:00'); + const endDay = currentDate.value + .endOf('month') + .format('YYYY-MM-DD 23:59:59'); + return { endDay, startDay }; + } + + /** + * 获取节假日列表,按当前月份范围加载 + * + * 失败(无权限 / 接口异常)时不抛出,仅清空当月假期标记, + * 避免阻断使用方的主数据初始化 + */ + async function loadHolidays() { + const { endDay, startDay } = getMonthRange(); + const days = new Set(); + try { + const list = await getHolidayList({ endDay, startDay }); + for (const item of list || []) { + const day = item.day ? dayjs(item.day).format('YYYY-MM-DD') : ''; + if (day && item.type === HolidayType.HOLIDAY) { + days.add(day); + } + } + } catch { + // 没有 mes:cal-holiday:query 权限或接口异常时,仅忽略假期标记 + } + holidaySet.value = days; + } + + /** 查询排班日历,params 由调用方提供 queryType 相关参数 */ + async function fetchCalendar(params: Record) { + loading.value = true; + try { + const { endDay, startDay } = getMonthRange(); + const list = await getCalendarList({ ...params, endDay, startDay }); + const map = new Map(); + for (const item of list || []) { + const day = item.day ? dayjs(item.day).format('YYYY-MM-DD') : ''; + if (day) { + map.set(day, { ...item, day }); + } + } + calendarDayMap.value = map; + } finally { + loading.value = false; + } + } + + /** 监听月份切换,调用回调刷新数据 */ + function watchMonth(callback: () => void) { + watch( + () => currentDate.value.format('YYYY-MM'), + () => { + void loadHolidays(); + callback(); + }, + ); + } + + return { + calendarDayMap, + currentDate, + fetchCalendar, + holidaySet, + loadHolidays, + loading, + watchMonth, + }; +} diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/index.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/index.vue new file mode 100644 index 000000000..643b890cc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/index.vue @@ -0,0 +1,42 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/modules/team-view.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/team-view.vue new file mode 100644 index 000000000..5a0527a03 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/team-view.vue @@ -0,0 +1,83 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/modules/type-view.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/type-view.vue new file mode 100644 index 000000000..74274f62c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/type-view.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/calendar/modules/user-view.vue b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/user-view.vue new file mode 100644 index 000000000..1975792e7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/calendar/modules/user-view.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/holiday/data.ts b/apps/web-antdv-next/src/views/mes/cal/holiday/data.ts new file mode 100644 index 000000000..a63e9d8aa --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/holiday/data.ts @@ -0,0 +1,48 @@ +import type { VbenFormSchema } from '#/adapter/form'; + +import { DICT_TYPE, HolidayType } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; + +/** 假期设置表单 */ +export function useHolidayFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'day', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'dayDisplay', + label: '日期', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'type', + label: '类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_CAL_HOLIDAY_TYPE, 'number'), + }, + rules: z.number().default(HolidayType.WORKDAY), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/cal/holiday/index.vue b/apps/web-antdv-next/src/views/mes/cal/holiday/index.vue new file mode 100644 index 000000000..03e575aab --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/holiday/index.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/holiday/modules/form.vue b/apps/web-antdv-next/src/views/mes/cal/holiday/modules/form.vue new file mode 100644 index 000000000..a11d93ef4 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/holiday/modules/form.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/plan/data.ts b/apps/web-antdv-next/src/views/mes/cal/plan/data.ts new file mode 100644 index 000000000..5c558ef06 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/plan/data.ts @@ -0,0 +1,279 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesCalPlanApi } from '#/api/mes/cal/plan'; + +import { h } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesCalPlanStatusEnum, MesCalShiftMethodEnum, MesCalShiftTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改排班计划的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesCalPlanStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '计划编码', + component: 'Input', + componentProps: { + placeholder: '请输入计划编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.CAL_PLAN_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '计划名称', + component: 'Input', + componentProps: { + placeholder: '请输入计划名称', + }, + rules: 'required', + }, + { + fieldName: 'calendarType', + label: '班组类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_CALENDAR_TYPE, 'number'), + placeholder: '请选择班组类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择开始日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择结束日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'shiftType', + label: '轮班方式', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_TYPE, 'number'), + placeholder: '请选择轮班方式', + }, + rules: 'selectRequired', + }, + { + fieldName: 'shiftMethod', + label: '倒班方式', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_METHOD, 'number'), + placeholder: '请选择倒班方式', + }, + dependencies: { + triggerFields: ['shiftType'], + show: (values) => !!values.shiftType && values.shiftType !== MesCalShiftTypeEnum.SINGLE, + }, + }, + { + fieldName: 'shiftCount', + label: '倒班天数', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + dependencies: { + triggerFields: ['shiftMethod'], + show: (values) => values.shiftMethod === MesCalShiftMethodEnum.DAY, + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '计划编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入计划编码', + }, + }, + { + fieldName: 'name', + label: '计划名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入计划名称', + }, + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'shiftType', + label: '轮班方式', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_SHIFT_TYPE, 'number'), + placeholder: '请选择轮班方式', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_PLAN_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '计划编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '计划名称', minWidth: 150 }, + { + field: 'calendarType', + title: '班组类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_CALENDAR_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 150, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 150, formatter: 'formatDate' }, + { + field: 'shiftType', + title: '轮班方式', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_SHIFT_TYPE }, + }, + }, + { + field: 'shiftMethod', + title: '倒班方式', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_SHIFT_METHOD }, + }, + }, + { + field: 'status', + title: '单据状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_PLAN_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/cal/plan/index.vue b/apps/web-antdv-next/src/views/mes/cal/plan/index.vue new file mode 100644 index 000000000..aeca54d7e --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/plan/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/plan/modules/form.vue b/apps/web-antdv-next/src/views/mes/cal/plan/modules/form.vue new file mode 100644 index 000000000..37e8d1174 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/plan/modules/form.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/plan/modules/shift-list.vue b/apps/web-antdv-next/src/views/mes/cal/plan/modules/shift-list.vue new file mode 100644 index 000000000..577780ce7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/plan/modules/shift-list.vue @@ -0,0 +1,238 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/plan/modules/team-list.vue b/apps/web-antdv-next/src/views/mes/cal/plan/modules/team-list.vue new file mode 100644 index 000000000..88110ce17 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/plan/modules/team-list.vue @@ -0,0 +1,209 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/team/components/index.ts b/apps/web-antdv-next/src/views/mes/cal/team/components/index.ts new file mode 100644 index 000000000..e40fc9490 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/components/index.ts @@ -0,0 +1,2 @@ +export { default as CalTeamSelectDialog } from './select-dialog.vue'; +export { default as CalTeamSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/cal/team/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/cal/team/components/select-dialog.vue new file mode 100644 index 000000000..bed342adb --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/components/select-dialog.vue @@ -0,0 +1,141 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/team/components/select.vue b/apps/web-antdv-next/src/views/mes/cal/team/components/select.vue new file mode 100644 index 000000000..95e80f014 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/components/select.vue @@ -0,0 +1,84 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/team/data.ts b/apps/web-antdv-next/src/views/mes/cal/team/data.ts new file mode 100644 index 000000000..5f41f3cc2 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/data.ts @@ -0,0 +1,192 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesCalTeamApi } from '#/api/mes/cal/team'; + +import { h } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改班组的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '班组编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入班组编码', + }, + rules: z.string().min(1, '班组编码不能为空').max(64), + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.CAL_TEAM_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '班组名称', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入班组名称', + }, + rules: z.string().min(1, '班组名称不能为空').max(100), + }, + { + fieldName: 'calendarType', + label: '班组类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_CAL_CALENDAR_TYPE, 'number'), + }, + rules: 'selectRequired', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '班组编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入班组编码', + }, + }, + { + fieldName: 'name', + label: '班组名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入班组名称', + }, + }, + { + fieldName: 'calendarType', + label: '班组类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CAL_CALENDAR_TYPE, 'number'), + placeholder: '请选择班组类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '班组编码', + minWidth: 150, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '班组名称', minWidth: 150 }, + { + field: 'calendarType', + title: '班组类型', + width: 140, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CAL_CALENDAR_TYPE }, + }, + }, + { field: 'remark', title: '备注', minWidth: 180 }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 班组选择弹窗搜索表单 */ +export function useTeamSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '班组编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入班组编码', + }, + }, + { + fieldName: 'name', + label: '班组名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入班组名称', + }, + }, + ]; +} + +/** 班组选择弹窗字段 */ +export function useTeamSelectGridColumns(): VxeTableGridOptions['columns'] { + return [ + { type: 'checkbox', width: 50 }, + { field: 'code', title: '班组编码', minWidth: 140 }, + { field: 'name', title: '班组名称', minWidth: 140 }, + { field: 'remark', title: '备注', minWidth: 160 }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/cal/team/index.vue b/apps/web-antdv-next/src/views/mes/cal/team/index.vue new file mode 100644 index 000000000..944c3aeca --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/index.vue @@ -0,0 +1,153 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/team/modules/form.vue b/apps/web-antdv-next/src/views/mes/cal/team/modules/form.vue new file mode 100644 index 000000000..eb8959106 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/modules/form.vue @@ -0,0 +1,117 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/cal/team/modules/member-list.vue b/apps/web-antdv-next/src/views/mes/cal/team/modules/member-list.vue new file mode 100644 index 000000000..cca1528b8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/cal/team/modules/member-list.vue @@ -0,0 +1,196 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/components/index.ts b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/index.ts new file mode 100644 index 000000000..87010bda0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/index.ts @@ -0,0 +1,2 @@ +export { default as DvCheckPlanSelectDialog } from './select-dialog.vue'; +export { default as DvCheckPlanSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select-dialog.vue new file mode 100644 index 000000000..0c163e10b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select-dialog.vue @@ -0,0 +1,215 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select.vue new file mode 100644 index 000000000..1aaf3c1d3 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/components/select.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/data.ts b/apps/web-antdv-next/src/views/mes/dv/checkplan/data.ts new file mode 100644 index 000000000..92f1020c6 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/data.ts @@ -0,0 +1,312 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckPlanApi } from '#/api/mes/dv/checkplan'; + +import { h } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesDvCheckPlanStatusEnum, MesDvSubjectTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改点检保养方案的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckPlanStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + placeholder: '请输入方案编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_CHECK_PLAN_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + placeholder: '请输入方案名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '方案类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择开始日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'endDate', + label: '结束日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD', + placeholder: '请选择结束日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'cycleType', + label: '周期类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CYCLE_TYPE, 'number'), + placeholder: '请选择周期类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'cycleCount', + label: '周期数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '方案编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案编码', + }, + }, + { + fieldName: 'name', + label: '方案名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入方案名称', + }, + }, + { + fieldName: 'type', + label: '方案类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择方案类型', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_PLAN_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + { + fieldName: 'startDate', + label: '开始日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '方案编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '方案名称', minWidth: 150 }, + { + field: 'type', + title: '方案类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 150, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 150, formatter: 'formatDate' }, + { + field: 'cycleType', + title: '周期类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CYCLE_TYPE }, + }, + }, + { field: 'cycleCount', title: '周期数量', width: 100 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_PLAN_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 点检方案选择弹窗的搜索表单 */ +export function useCheckPlanSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '计划编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入计划编号', + }, + }, + { + fieldName: 'name', + label: '计划名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入计划名称', + }, + }, + ]; +} + +/** 点检方案选择弹窗的字段 */ +export function useCheckPlanSelectGridColumns( + multiple = false, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { field: 'code', title: '计划编码', minWidth: 180 }, + { field: 'name', title: '计划名称', minWidth: 150 }, + { + field: 'type', + title: '计划类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'startDate', title: '开始日期', width: 120, formatter: 'formatDate' }, + { field: 'endDate', title: '结束日期', width: 120, formatter: 'formatDate' }, + { field: 'cycleCount', title: '频率', width: 100 }, + { + field: 'cycleType', + title: '周期类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CYCLE_TYPE }, + }, + }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_PLAN_STATUS }, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/index.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/index.vue new file mode 100644 index 000000000..d775a9107 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/index.vue @@ -0,0 +1,201 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/form.vue new file mode 100644 index 000000000..16ede736f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/form.vue @@ -0,0 +1,118 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/machinery-list.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/machinery-list.vue new file mode 100644 index 000000000..41abea013 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/machinery-list.vue @@ -0,0 +1,191 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/subject-list.vue b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/subject-list.vue new file mode 100644 index 000000000..f87cc30c5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkplan/modules/subject-list.vue @@ -0,0 +1,203 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkrecord/data.ts b/apps/web-antdv-next/src/views/mes/dv/checkrecord/data.ts new file mode 100644 index 000000000..abb9ac626 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkrecord/data.ts @@ -0,0 +1,161 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvCheckRecordApi } from '#/api/mes/dv/checkrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE, MesDvCheckPlanStatusEnum, MesDvCheckRecordStatusEnum, MesDvSubjectTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改点检记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvCheckRecordStatusEnum.DRAFT, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '点检计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.CHECK, + placeholder: '请选择计划', + }, + }, + { + fieldName: 'userId', + label: '点检人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择点检人', + valueField: 'id', + }, + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择点检时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'checkTime', + label: '点检时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_CHECK_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'checkTime', title: '点检时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '点检人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_CHECK_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/checkrecord/index.vue b/apps/web-antdv-next/src/views/mes/dv/checkrecord/index.vue new file mode 100644 index 000000000..2ae93ccc8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkrecord/index.vue @@ -0,0 +1,161 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/form.vue new file mode 100644 index 000000000..d932e4642 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/form.vue @@ -0,0 +1,141 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/line-list.vue b/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/line-list.vue new file mode 100644 index 000000000..62b719a6b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/checkrecord/modules/line-list.vue @@ -0,0 +1,231 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/components/index.ts b/apps/web-antdv-next/src/views/mes/dv/machinery/components/index.ts new file mode 100644 index 000000000..b3d061fac --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/components/index.ts @@ -0,0 +1,2 @@ +export { default as DvMachinerySelectDialog } from './select-dialog.vue'; +export { default as DvMachinerySelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/components/select-dialog.vue new file mode 100644 index 000000000..8b4fb08ea --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/components/select-dialog.vue @@ -0,0 +1,225 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/components/select.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/components/select.vue new file mode 100644 index 000000000..c7c0cbe4c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/components/select.vue @@ -0,0 +1,138 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/data.ts b/apps/web-antdv-next/src/views/mes/dv/machinery/data.ts new file mode 100644 index 000000000..b9dc69160 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/data.ts @@ -0,0 +1,340 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryApi } from '#/api/mes/dv/machinery'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesDvMachineryStatusEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MdWorkshopSelect } from '#/views/mes/md/workstation/components'; + +import { DvMachineryTypeSelect } from './type/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改设备的表单 */ +export function useFormSchema(formType: FormType, formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + placeholder: '请输入设备编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: !!values.id }), + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_MACHINERY_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + placeholder: '请输入设备名称', + }, + rules: 'required', + }, + { + fieldName: 'brand', + label: '品牌', + component: 'Input', + componentProps: { + placeholder: '请输入品牌', + }, + }, + { + fieldName: 'machineryTypeId', + label: '设备类型', + component: markRaw(DvMachineryTypeSelect), + componentProps: { + placeholder: '请选择设备类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + placeholder: '请选择所属车间', + }, + rules: 'selectRequired', + }, + { + fieldName: 'status', + label: '设备状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + }, + rules: z.number().default(MesDvMachineryStatusEnum.STOP), + }, + { + fieldName: 'specification', + label: '规格型号', + component: 'Input', + componentProps: { + placeholder: '请输入规格型号', + }, + }, + { + fieldName: 'lastCheckTime', + label: '最近点检时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + }, + dependencies: { + triggerFields: ['id'], + show: () => formType === 'detail', + }, + }, + { + fieldName: 'lastMaintenTime', + label: '最近保养时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + showTime: true, + valueFormat: 'x', + }, + dependencies: { + triggerFields: ['id'], + show: () => formType === 'detail', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备编码', + }, + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + allowClear: true, + placeholder: '请选择所属车间', + }, + }, + { + fieldName: 'status', + label: '设备状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_MACHINERY_STATUS, 'number'), + placeholder: '请选择设备状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '设备编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '设备名称', minWidth: 140 }, + { field: 'brand', title: '品牌', minWidth: 120 }, + { field: 'specification', title: '规格型号', minWidth: 140 }, + { field: 'machineryTypeName', title: '设备类型', minWidth: 140 }, + { field: 'workshopName', title: '所属车间', minWidth: 140 }, + { + field: 'status', + title: '设备状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_MACHINERY_STATUS }, + }, + }, + { + field: 'lastCheckTime', + title: '最近点检时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'lastMaintenTime', + title: '最近保养时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 220, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 导入表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '设备数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的设备数据', + }, + ]; +} + +/** 设备选择弹窗的搜索表单 */ +export function useMachinerySelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '设备编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备编码', + }, + }, + { + fieldName: 'name', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'workshopId', + label: '所属车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + allowClear: true, + placeholder: '请选择所属车间', + }, + }, + ]; +} + +/** 设备选择弹窗的字段 */ +export function useMachinerySelectGridColumns( + multiple = false, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { field: 'code', title: '设备编码', width: 120 }, + { field: 'name', title: '设备名称', minWidth: 120 }, + { field: 'brand', title: '品牌', minWidth: 120 }, + { field: 'specification', title: '规格型号', minWidth: 120 }, + { field: 'workshopName', title: '所属车间', width: 120 }, + { + field: 'status', + title: '设备状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_MACHINERY_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 160, + formatter: 'formatDateTime', + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/index.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/index.vue new file mode 100644 index 000000000..3a632ff58 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/index.vue @@ -0,0 +1,197 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/modules/check-record-list.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/check-record-list.vue new file mode 100644 index 000000000..aa486cf05 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/check-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/form.vue new file mode 100644 index 000000000..acee35717 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/form.vue @@ -0,0 +1,140 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/modules/import-form.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/import-form.vue new file mode 100644 index 000000000..ff00f13ea --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/import-form.vue @@ -0,0 +1,88 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/modules/mainten-record-list.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/mainten-record-list.vue new file mode 100644 index 000000000..3a8f2e656 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/mainten-record-list.vue @@ -0,0 +1,73 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/modules/repair-list.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/repair-list.vue new file mode 100644 index 000000000..efed48449 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/modules/repair-list.vue @@ -0,0 +1,74 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/index.ts b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/index.ts new file mode 100644 index 000000000..eab3ca005 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/index.ts @@ -0,0 +1,2 @@ +export { default as DvMachineryTypeSelect } from './select.vue'; +export { default as MachineryTypeTree } from './tree.vue'; diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/select.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/select.vue new file mode 100644 index 000000000..ee61fd091 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/select.vue @@ -0,0 +1,112 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/tree.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/tree.vue new file mode 100644 index 000000000..0d95b0d3a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/components/tree.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/data.ts b/apps/web-antdv-next/src/views/mes/dv/machinery/type/data.ts new file mode 100644 index 000000000..bdde1b7a7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/data.ts @@ -0,0 +1,178 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMachineryTypeApi } from '#/api/mes/dv/machinery/type'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { getMachineryTypeList } from '#/api/mes/dv/machinery/type'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改设备类型的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级类型', + component: 'ApiTreeSelect', + componentProps: { + allowClear: true, + api: async () => [ + { id: 0, name: '顶级类型', children: handleTree(await getMachineryTypeList()) }, + ], + childrenField: 'children', + labelField: 'name', + placeholder: '请选择上级类型', + treeDefaultExpandAll: true, + treeNodeFilterProp: 'name', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '类型编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入类型编码', + }, + rules: z.string().min(1, '类型编码不能为空').max(64), + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.DV_MACHINERY_TYPE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + placeholder: '请输入类型名称', + }, + rules: 'required', + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '类型名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入类型名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'name', title: '类型名称', minWidth: 200, align: 'left', treeNode: true }, + { field: 'code', title: '类型编码', width: 160, align: 'center' }, + { field: 'sort', title: '排序', width: 100, align: 'center' }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/index.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/type/index.vue new file mode 100644 index 000000000..61020ab3f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/index.vue @@ -0,0 +1,161 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/machinery/type/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/machinery/type/modules/form.vue new file mode 100644 index 000000000..b6b99ebf0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/machinery/type/modules/form.vue @@ -0,0 +1,96 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/maintenrecord/data.ts b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/data.ts new file mode 100644 index 000000000..4a9fbeb42 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/data.ts @@ -0,0 +1,161 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvMaintenRecordApi } from '#/api/mes/dv/maintenrecord'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE, MesDvCheckPlanStatusEnum, MesDvMaintenRecordStatusEnum, MesDvSubjectTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvCheckPlanSelect } from '#/views/mes/dv/checkplan/components'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改保养记录的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvMaintenRecordStatusEnum.PREPARE, + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'planId', + label: '保养计划', + component: markRaw(DvCheckPlanSelect), + componentProps: { + status: MesDvCheckPlanStatusEnum.ENABLED, + type: MesDvSubjectTypeEnum.MAINTENANCE, + placeholder: '请选择计划', + }, + }, + { + fieldName: 'userId', + label: '保养人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择保养人', + valueField: 'id', + }, + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择保养时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'maintenTime', + label: '保养时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_MAINTEN_RECORD_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'machineryCode', title: '设备编码', minWidth: 140 }, + { + field: 'machineryName', + title: '设备名称', + minWidth: 150, + slots: { + default: 'machineryName', + }, + }, + { field: 'planName', title: '计划名称', minWidth: 150 }, + { field: 'maintenTime', title: '保养时间', width: 180, formatter: 'formatDateTime' }, + { field: 'nickname', title: '保养人', minWidth: 120 }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MAINTEN_RECORD_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/maintenrecord/index.vue b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/index.vue new file mode 100644 index 000000000..aad48ccdb --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/index.vue @@ -0,0 +1,165 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/form.vue new file mode 100644 index 000000000..f713cc96b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/form.vue @@ -0,0 +1,149 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/line-list.vue b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/line-list.vue new file mode 100644 index 000000000..334518ffe --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/maintenrecord/modules/line-list.vue @@ -0,0 +1,234 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/repair/data.ts b/apps/web-antdv-next/src/views/mes/dv/repair/data.ts new file mode 100644 index 000000000..f6caa4364 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/repair/data.ts @@ -0,0 +1,321 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvRepairApi } from '#/api/mes/dv/repair'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesDvRepairStatusEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { DvMachinerySelect } from '#/views/mes/dv/machinery/components'; +/** 表单类型 */ +export type FormType = 'confirm' | 'create' | 'detail' | 'finish' | 'update'; + +/** 表头是否只读(完成维修、验收、详情态;finishDate 在 confirm 单独放开) */ +function isHeaderReadonly(formType: FormType): boolean { + return ['confirm', 'detail', 'finish'].includes(formType); +} + +/** 新增/修改维修工单的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + const headerReadonly = isHeaderReadonly(formType); + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + defaultValue: MesDvRepairStatusEnum.PREPARE, + }, + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + placeholder: '请输入维修单编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ disabled: headerReadonly || !!values.id }), + }, + rules: 'required', + suffix: headerReadonly + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_REPAIR_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入维修单名称', + }, + rules: 'required', + }, + { + fieldName: 'machineryId', + label: '设备', + component: markRaw(DvMachinerySelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择设备', + }, + rules: 'selectRequired', + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'DatePicker', + componentProps: { + disabled: headerReadonly, + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择报修日期', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'acceptedUserId', + label: '维修人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + disabled: true, + labelField: 'nickname', + placeholder: '请选择维修人', + valueField: 'id', + }, + // 维修人为待验收(≥APPROVING)态自动产生的只读回显字段 + dependencies: { + triggerFields: ['status'], + if: (values) => + values.status != null && + values.status >= MesDvRepairStatusEnum.APPROVING, + }, + }, + { + fieldName: 'finishDate', + label: '维修完成日期', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择完成日期', + showTime: true, + valueFormat: 'x', + }, + // 维修中(≥CONFIRMED)态展示;仅"完成维修"弹窗可编辑并必填,其余态只读回显 + dependencies: { + triggerFields: ['status'], + if: (values) => + values.status != null && + values.status >= MesDvRepairStatusEnum.CONFIRMED, + disabled: formType !== 'confirm', + rules: () => (formType === 'confirm' ? 'required' : null), + }, + }, + { + fieldName: 'confirmUserId', + label: '验收人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + disabled: true, + labelField: 'nickname', + placeholder: '请选择验收人', + valueField: 'id', + }, + // 验收信息为已确认(≥FINISHED)态自动产生的只读回显字段 + dependencies: { + triggerFields: ['status'], + if: (values) => + values.status != null && + values.status >= MesDvRepairStatusEnum.FINISHED, + }, + }, + { + fieldName: 'confirmDate', + label: '验收日期', + component: 'DatePicker', + componentProps: { + disabled: true, + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择验收日期', + showTime: true, + valueFormat: 'x', + }, + // 验收信息为已确认(≥FINISHED)态自动产生的只读回显字段 + dependencies: { + triggerFields: ['status'], + if: (values) => + values.status != null && + values.status >= MesDvRepairStatusEnum.FINISHED, + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + disabled: true, + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + }, + // 验收信息为已确认(≥FINISHED)态自动产生的只读回显字段 + dependencies: { + triggerFields: ['status'], + if: (values) => + values.status != null && + values.status >= MesDvRepairStatusEnum.FINISHED, + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '维修单编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入维修单编码', + }, + }, + { + fieldName: 'name', + label: '维修单名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入维修单名称', + }, + }, + { + fieldName: 'machineryName', + label: '设备名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入设备名称', + }, + }, + { + fieldName: 'requireDate', + label: '报修日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + }, + }, + { + fieldName: 'result', + label: '维修结果', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_RESULT, 'number'), + placeholder: '请选择维修结果', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_REPAIR_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '维修单编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '维修单名称', minWidth: 150 }, + { field: 'machineryName', title: '设备名称', minWidth: 150 }, + { field: 'requireDate', title: '报修日期', width: 180, formatter: 'formatDateTime' }, + { field: 'finishDate', title: '完成日期', width: 180, formatter: 'formatDateTime' }, + { + field: 'result', + title: '维修结果', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_RESULT }, + }, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_REPAIR_STATUS }, + }, + }, + { field: 'createTime', title: '创建时间', width: 180, formatter: 'formatDateTime' }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/repair/index.vue b/apps/web-antdv-next/src/views/mes/dv/repair/index.vue new file mode 100644 index 000000000..62a6633d0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/repair/index.vue @@ -0,0 +1,181 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/repair/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/repair/modules/form.vue new file mode 100644 index 000000000..989b06f1b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/repair/modules/form.vue @@ -0,0 +1,230 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/repair/modules/line-list.vue b/apps/web-antdv-next/src/views/mes/dv/repair/modules/line-list.vue new file mode 100644 index 000000000..882cc3107 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/repair/modules/line-list.vue @@ -0,0 +1,233 @@ + + diff --git a/apps/web-antdv-next/src/views/mes/dv/subject/components/index.ts b/apps/web-antdv-next/src/views/mes/dv/subject/components/index.ts new file mode 100644 index 000000000..ef696470f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/subject/components/index.ts @@ -0,0 +1 @@ +export { default as DvSubjectSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/dv/subject/components/select.vue b/apps/web-antdv-next/src/views/mes/dv/subject/components/select.vue new file mode 100644 index 000000000..02914be3c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/subject/components/select.vue @@ -0,0 +1,86 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/subject/data.ts b/apps/web-antdv-next/src/views/mes/dv/subject/data.ts new file mode 100644 index 000000000..493c9d47e --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/subject/data.ts @@ -0,0 +1,208 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesDvSubjectApi } from '#/api/mes/dv/subject'; + +import { h } from 'vue'; + +import { + CommonStatusEnum, + DICT_TYPE, + MesAutoCodeRuleCode, + MesDvSubjectTypeEnum, +} from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改点检保养项目的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + placeholder: '请输入项目编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode(MesAutoCodeRuleCode.DV_SUBJECT_CODE); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + placeholder: '请输入项目名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '项目类型', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + }, + rules: z.number().default(MesDvSubjectTypeEnum.CHECK), + }, + { + fieldName: 'content', + label: '项目内容', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入项目内容', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'standard', + label: '标准', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入标准', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '项目编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入项目编码', + }, + }, + { + fieldName: 'name', + label: '项目名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入项目名称', + }, + }, + { + fieldName: 'type', + label: '项目类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DV_SUBJECT_TYPE, 'number'), + placeholder: '请选择项目类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '项目编码', + minWidth: 140, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '项目名称', minWidth: 140 }, + { + field: 'type', + title: '项目类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DV_SUBJECT_TYPE }, + }, + }, + { field: 'content', title: '项目内容', minWidth: 180 }, + { field: 'standard', title: '标准', minWidth: 180 }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 180, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/dv/subject/index.vue b/apps/web-antdv-next/src/views/mes/dv/subject/index.vue new file mode 100644 index 000000000..5e5ea4faf --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/subject/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/dv/subject/modules/form.vue b/apps/web-antdv-next/src/views/mes/dv/subject/modules/form.vue new file mode 100644 index 000000000..eec7d8f75 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/dv/subject/modules/form.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/chart-options.ts b/apps/web-antdv-next/src/views/mes/home/chart-options.ts new file mode 100644 index 000000000..e83f2a8db --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/chart-options.ts @@ -0,0 +1,62 @@ +import type { EChartsOption } from '@vben/plugins/echarts'; + +/** 生产趋势折线图配置 */ +export function getProductionTrendChartOptions( + dates: string[], + quantities: number[], + qualified: number[], + unqualified: number[], +): EChartsOption { + return { + grid: { bottom: 40, left: 50, right: 20, top: 20 }, + legend: { bottom: 0, data: ['产量', '合格品', '不良品'] }, + series: [ + { + areaStyle: { color: 'rgba(64,158,255,0.15)' }, + data: quantities, + itemStyle: { color: '#409EFF' }, + name: '产量', + smooth: true, + type: 'line', + }, + { + data: qualified, + itemStyle: { color: '#67C23A' }, + name: '合格品', + smooth: true, + type: 'line', + }, + { + data: unqualified, + itemStyle: { color: '#F56C6C' }, + name: '不良品', + smooth: true, + type: 'line', + }, + ], + tooltip: { axisPointer: { type: 'cross' }, trigger: 'axis' }, + xAxis: { boundaryGap: false, data: dates, type: 'category' }, + yAxis: { minInterval: 1, type: 'value' }, + }; +} + +/** 工单状态分布饼图配置 */ +export function getWorkOrderStatusChartOptions( + data: Array<{ itemStyle: { color: string }; name: string; value: number }>, +): EChartsOption { + return { + legend: { bottom: 0, type: 'scroll' }, + series: [ + { + avoidLabelOverlap: true, + data, + emphasis: { label: { fontSize: 14, fontWeight: 'bold', show: true } }, + itemStyle: { borderColor: '#fff', borderRadius: 6, borderWidth: 2 }, + label: { formatter: '{b}\n{c}', show: true }, + radius: ['40%', '70%'], + type: 'pie', + }, + ], + tooltip: { formatter: '{b}: {c} ({d}%)', trigger: 'item' }, + }; +} diff --git a/apps/web-antdv-next/src/views/mes/home/data.ts b/apps/web-antdv-next/src/views/mes/home/data.ts new file mode 100644 index 000000000..3ad2de089 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/data.ts @@ -0,0 +1,28 @@ +import type { MesHomeApi } from '#/api/mes/home'; + +import { MesProWorkOrderStatusEnum } from '@vben/constants'; + +/** 首页汇总统计默认值 */ +export const defaultSummary: MesHomeApi.Summary = { + andonActiveCount: 0, + machineryMaintenance: 0, + machineryProducing: 0, + machineryStop: 0, + machineryTotal: 0, + repairActiveCount: 0, + todayOutput: 0, + todayQualifiedQuantity: 0, + todayUnqualifiedQuantity: 0, + workOrderActiveCount: 0, + workOrderFinishedCount: 0, + workOrderPrepareCount: 0, + yesterdayOutput: 0, +}; + +/** 工单状态对应的颜色映射 */ +export const WORK_ORDER_STATUS_COLOR_MAP: Record = { + [MesProWorkOrderStatusEnum.PREPARE]: '#909399', // 草稿 + [MesProWorkOrderStatusEnum.CONFIRMED]: '#409EFF', // 已确认 + [MesProWorkOrderStatusEnum.FINISHED]: '#67C23A', // 已完成 + [MesProWorkOrderStatusEnum.CANCELED]: '#F56C6C', // 已取消 +}; diff --git a/apps/web-antdv-next/src/views/mes/home/index.vue b/apps/web-antdv-next/src/views/mes/home/index.vue new file mode 100644 index 000000000..5419634ea --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/index.vue @@ -0,0 +1,70 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/modules/alert-panel.vue b/apps/web-antdv-next/src/views/mes/home/modules/alert-panel.vue new file mode 100644 index 000000000..b05bbadf7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/modules/alert-panel.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/modules/kpi-cards.vue b/apps/web-antdv-next/src/views/mes/home/modules/kpi-cards.vue new file mode 100644 index 000000000..4e1a41fc2 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/modules/kpi-cards.vue @@ -0,0 +1,174 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/modules/production-trend.vue b/apps/web-antdv-next/src/views/mes/home/modules/production-trend.vue new file mode 100644 index 000000000..f2b888adc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/modules/production-trend.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/modules/shortcuts.vue b/apps/web-antdv-next/src/views/mes/home/modules/shortcuts.vue new file mode 100644 index 000000000..035fc8195 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/modules/shortcuts.vue @@ -0,0 +1,90 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/home/modules/work-order-chart.vue b/apps/web-antdv-next/src/views/mes/home/modules/work-order-chart.vue new file mode 100644 index 000000000..fd9484d09 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/home/modules/work-order-chart.vue @@ -0,0 +1,40 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/autocode/data.ts b/apps/web-antdv-next/src/views/mes/md/autocode/data.ts new file mode 100644 index 000000000..30163e038 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/autocode/data.ts @@ -0,0 +1,465 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdAutoCodePartApi } from '#/api/mes/md/autocode/part'; +import type { MesMdAutoCodeRuleApi } from '#/api/mes/md/autocode/rule'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodePartTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; + +/** 新增/修改编码规则的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '规则编码', + component: 'Input', + componentProps: { + placeholder: '请输入规则编码', + }, + rules: 'required', + }, + { + fieldName: 'name', + label: '规则名称', + component: 'Input', + componentProps: { + placeholder: '请输入规则名称', + }, + rules: 'required', + }, + { + fieldName: 'description', + label: '规则描述', + component: 'Input', + componentProps: { + placeholder: '请输入规则描述', + }, + }, + { + fieldName: 'maxLength', + label: '最大长度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + max: 100, + min: 1, + precision: 0, + }, + rules: 'required', + }, + { + fieldName: 'padded', + label: '是否补齐', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'), + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'paddedChar', + label: '补齐字符', + component: 'Input', + componentProps: { + maxLength: 1, + placeholder: '请输入补齐字符', + }, + dependencies: { + triggerFields: ['padded'], + show: (values) => values.padded === true, + }, + rules: 'required', + }, + { + fieldName: 'paddedMethod', + label: '补齐方式', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions( + DICT_TYPE.MES_MD_AUTO_CODE_PADDED_METHOD, + 'number', + ), + }, + dependencies: { + triggerFields: ['padded'], + show: (values) => values.padded === true, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '规则编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入规则编码', + }, + }, + { + fieldName: 'name', + label: '规则名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入规则名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '规则编码', + width: 150, + }, + { + field: 'name', + title: '规则名称', + width: 200, + }, + { + field: 'description', + title: '规则描述', + minWidth: 180, + }, + { + field: 'maxLength', + title: '最大长度', + width: 100, + align: 'center', + }, + { + field: 'padded', + title: '是否补齐', + width: 100, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'status', + title: '状态', + width: 100, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 150, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 新增/修改编码规则分段的表单 */ +export function usePartFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'ruleId', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'sort', + label: '分段排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'length', + label: '分段长度', + component: 'InputNumber', + componentProps: { + class: '!w-full', + max: 50, + min: 1, + precision: 0, + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '分段类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_MD_AUTO_CODE_PART_TYPE, 'number'), + placeholder: '请选择分段类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'dateFormat', + label: '日期格式', + component: 'Select', + componentProps: { + allowClear: true, + options: [ + { label: 'yyyy', value: 'yyyy' }, + { label: 'yyyyMM', value: 'yyyyMM' }, + { label: 'yyyyMMdd', value: 'yyyyMMdd' }, + { label: 'yyyyMMddHH', value: 'yyyyMMddHH' }, + { label: 'yyyyMMddHHmm', value: 'yyyyMMddHHmm' }, + ], + placeholder: '请选择日期格式', + }, + dependencies: { + triggerFields: ['type'], + show: (values) => values.type === MesAutoCodePartTypeEnum.DATE, + }, + rules: 'selectRequired', + }, + { + fieldName: 'fixCharacter', + label: '固定字符', + component: 'Input', + componentProps: { + placeholder: '请输入固定字符', + }, + dependencies: { + triggerFields: ['type'], + show: (values) => values.type === MesAutoCodePartTypeEnum.FIX, + }, + rules: 'required', + }, + { + fieldName: 'serialStartNo', + label: '流水号起始值', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + dependencies: { + triggerFields: ['type'], + show: (values) => values.type === MesAutoCodePartTypeEnum.SERIAL, + }, + rules: 'required', + }, + { + fieldName: 'serialStep', + label: '流水号步长', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + dependencies: { + triggerFields: ['type'], + show: (values) => values.type === MesAutoCodePartTypeEnum.SERIAL, + }, + rules: 'required', + }, + { + fieldName: 'cycleFlag', + label: '是否循环', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + dependencies: { + triggerFields: ['type'], + show: (values) => values.type === MesAutoCodePartTypeEnum.SERIAL, + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'cycleMethod', + label: '循环方式', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions( + DICT_TYPE.MES_MD_AUTO_CODE_CYCLE_METHOD, + 'number', + ), + placeholder: '请选择循环方式', + }, + dependencies: { + triggerFields: ['type', 'cycleFlag'], + show: (values) => + values.type === MesAutoCodePartTypeEnum.SERIAL && + values.cycleFlag === true, + }, + rules: 'selectRequired', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 编码规则分段的字段 */ +export function usePartGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'sort', + title: '分段排序', + width: 90, + align: 'center', + }, + { + field: 'type', + title: '分段类型', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_AUTO_CODE_PART_TYPE }, + }, + }, + { + field: 'length', + title: '分段长度', + width: 90, + align: 'center', + }, + { + field: 'dateFormat', + title: '日期格式', + width: 150, + align: 'center', + }, + { + field: 'fixCharacter', + title: '固定字符', + width: 120, + align: 'center', + }, + { + field: 'serialStartNo', + title: '流水号起始', + width: 110, + align: 'center', + }, + { + field: 'serialStep', + title: '流水号步长', + width: 110, + align: 'center', + }, + { + field: 'cycleFlag', + title: '是否循环', + width: 100, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'cycleMethod', + title: '循环方式', + width: 120, + align: 'center', + slots: { default: 'cycleMethod' }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/autocode/index.vue b/apps/web-antdv-next/src/views/mes/md/autocode/index.vue new file mode 100644 index 000000000..25d273d5b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/autocode/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/autocode/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/autocode/modules/form.vue new file mode 100644 index 000000000..a89c8332e --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/autocode/modules/form.vue @@ -0,0 +1,105 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-form.vue b/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-form.vue new file mode 100644 index 000000000..add9c4554 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-form.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-list.vue b/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-list.vue new file mode 100644 index 000000000..ecddc469d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/autocode/modules/part-list.vue @@ -0,0 +1,140 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/components/index.ts b/apps/web-antdv-next/src/views/mes/md/client/components/index.ts new file mode 100644 index 000000000..1339c9bca --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/components/index.ts @@ -0,0 +1,2 @@ +export { default as MdClientSelectDialog } from './select-dialog.vue'; +export { default as MdClientSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/client/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/md/client/components/select-dialog.vue new file mode 100644 index 000000000..5a0c58092 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/components/select-dialog.vue @@ -0,0 +1,212 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/components/select.vue b/apps/web-antdv-next/src/views/mes/md/client/components/select.vue new file mode 100644 index 000000000..643abf7a5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/components/select.vue @@ -0,0 +1,136 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/data.ts b/apps/web-antdv-next/src/views/mes/md/client/data.ts new file mode 100644 index 000000000..b4d3ca5f0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/data.ts @@ -0,0 +1,479 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdClientApi } from '#/api/mes/md/client'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改客户的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '客户编码', + component: 'Input', + componentProps: { + placeholder: '请输入客户编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_CLIENT_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '客户名称', + component: 'Input', + componentProps: { + placeholder: '请输入客户名称', + }, + rules: z.string().min(1, '客户名称不能为空').max(100), + }, + { + fieldName: 'nickname', + label: '客户简称', + component: 'Input', + componentProps: { + placeholder: '请输入客户简称', + }, + }, + { + fieldName: 'englishName', + label: '客户英文名称', + component: 'Input', + componentProps: { + placeholder: '请输入客户英文名称', + }, + }, + { + fieldName: 'type', + label: '客户类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CLIENT_TYPE, 'number'), + placeholder: '请选择客户类型', + }, + rules: 'selectRequired', + }, + { + fieldName: 'description', + label: '客户简介', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入客户简介', + rows: 2, + }, + }, + { + fieldName: 'address', + label: '客户地址', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入客户地址', + rows: 2, + }, + }, + { + fieldName: 'website', + label: '客户官网地址', + component: 'Input', + componentProps: { + placeholder: '请输入客户官网地址', + }, + }, + { + fieldName: 'email', + label: '客户邮箱地址', + component: 'Input', + componentProps: { + placeholder: '请输入客户邮箱地址', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'telephone', + label: '客户电话', + component: 'Input', + componentProps: { + placeholder: '请输入客户电话', + }, + }, + { + fieldName: 'logo', + label: '客户 LOGO', + component: 'Input', + componentProps: { + placeholder: '请输入客户 LOGO 地址', + }, + }, + { + fieldName: 'contact1Name', + label: '联系人1', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1', + }, + }, + { + fieldName: 'contact1Telephone', + label: '联系人1电话', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1电话', + }, + }, + { + fieldName: 'contact1Email', + label: '联系人1邮箱', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1邮箱', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'contact2Name', + label: '联系人2', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2', + }, + }, + { + fieldName: 'contact2Telephone', + label: '联系人2电话', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2电话', + }, + }, + { + fieldName: 'contact2Email', + label: '联系人2邮箱', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2邮箱', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'creditCode', + label: '社会信用代码', + component: 'Input', + componentProps: { + placeholder: '请输入统一社会信用代码', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 导入客户的表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '客户数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的客户数据', + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '客户编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户编码', + }, + }, + { + fieldName: 'name', + label: '客户名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户名称', + }, + }, + { + fieldName: 'nickname', + label: '客户简称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户简称', + }, + }, + { + fieldName: 'englishName', + label: '英文名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户英文名称', + }, + }, + { + fieldName: 'type', + label: '客户类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_CLIENT_TYPE, 'number'), + placeholder: '请选择客户类型', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '客户编码', + minWidth: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '客户名称', + minWidth: 160, + }, + { + field: 'nickname', + title: '客户简称', + minWidth: 130, + }, + { + field: 'type', + title: '客户类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CLIENT_TYPE }, + }, + }, + { + field: 'telephone', + title: '客户电话', + minWidth: 140, + }, + { + field: 'contact1Name', + title: '联系人1', + width: 120, + }, + { + field: 'contact1Telephone', + title: '联系人1电话', + minWidth: 140, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 客户选择弹窗的搜索表单 */ +export function useClientSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '客户编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户编码', + }, + }, + { + fieldName: 'name', + label: '客户名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户名称', + }, + }, + { + fieldName: 'nickname', + label: '客户简称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户简称', + }, + }, + { + fieldName: 'englishName', + label: '英文名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入客户英文名称', + }, + }, + ]; +} + +/** 客户选择弹窗的字段 */ +export function useClientSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { + field: 'code', + title: '客户编码', + minWidth: 160, + }, + { + field: 'name', + title: '客户名称', + minWidth: 160, + }, + { + field: 'nickname', + title: '客户简称', + width: 120, + }, + { + field: 'type', + title: '客户类型', + width: 110, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_CLIENT_TYPE }, + }, + }, + { + field: 'contact1Name', + title: '联系人', + width: 120, + }, + { + field: 'telephone', + title: '联系电话', + width: 140, + }, + { + field: 'contact1Telephone', + title: '联系人电话', + width: 140, + }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/client/index.vue b/apps/web-antdv-next/src/views/mes/md/client/index.vue new file mode 100644 index 000000000..7b18225cc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/index.vue @@ -0,0 +1,176 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/client/modules/form.vue new file mode 100644 index 000000000..c511c8dc8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/modules/form.vue @@ -0,0 +1,113 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/modules/import-form.vue b/apps/web-antdv-next/src/views/mes/md/client/modules/import-form.vue new file mode 100644 index 000000000..a1611cc2b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/modules/import-form.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-line-list.vue b/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-line-list.vue new file mode 100644 index 000000000..2be718054 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-line-list.vue @@ -0,0 +1,95 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-list.vue b/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-list.vue new file mode 100644 index 000000000..bcd647fa3 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/client/modules/product-sales-list.vue @@ -0,0 +1,98 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/components/index.ts b/apps/web-antdv-next/src/views/mes/md/item/components/index.ts new file mode 100644 index 000000000..64d15593a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/components/index.ts @@ -0,0 +1,4 @@ +export { default as MdProductBomSelectDialog } from './product-bom-select-dialog.vue'; +export { default as MdProductBomSelect } from './product-bom-select.vue'; +export { default as MdItemSelectDialog } from './select-dialog.vue'; +export { default as MdItemSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select-dialog.vue b/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select-dialog.vue new file mode 100644 index 000000000..707bd4b46 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select-dialog.vue @@ -0,0 +1,116 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select.vue b/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select.vue new file mode 100644 index 000000000..92f515950 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/components/product-bom-select.vue @@ -0,0 +1,144 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/md/item/components/select-dialog.vue new file mode 100644 index 000000000..9d1311f0d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/components/select-dialog.vue @@ -0,0 +1,228 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/components/select.vue b/apps/web-antdv-next/src/views/mes/md/item/components/select.vue new file mode 100644 index 000000000..d708acc49 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/components/select.vue @@ -0,0 +1,136 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/data.ts b/apps/web-antdv-next/src/views/mes/md/item/data.ts new file mode 100644 index 000000000..853e4ea72 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/data.ts @@ -0,0 +1,484 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdItemApi } from '#/api/mes/md/item'; +import type { MesMdProductBomApi } from '#/api/mes/md/item/productBom'; + +import { h, markRaw } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MdItemTypeSelect } from '#/views/mes/md/item/type/components'; +import { MdUnitMeasureSelect } from '#/views/mes/md/unitmeasure/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改物料产品的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '物料编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入物料编码', + }, + rules: z.string().min(1, '物料编码不能为空').max(64), + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_ITEM_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '物料名称', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入物料名称', + }, + rules: z.string().min(1, '物料名称不能为空').max(255), + }, + { + fieldName: 'specification', + label: '规格型号', + component: 'Input', + componentProps: { + maxLength: 255, + placeholder: '请输入规格型号', + }, + }, + { + fieldName: 'unitMeasureId', + label: '单位', + component: markRaw(MdUnitMeasureSelect), + componentProps: { + placeholder: '请选择计量单位', + }, + rules: 'selectRequired', + }, + { + fieldName: 'itemTypeId', + label: '物料分类', + component: markRaw(MdItemTypeSelect), + componentProps: { + onChange: async (itemType: any) => { + await formApi?.setFieldValue( + 'itemOrProduct', + itemType?.itemOrProduct, + ); + }, + }, + rules: 'selectRequired', + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + disabled: true, + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.DISABLE), + }, + { + fieldName: 'highValue', + label: '高值物料', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'batchFlag', + label: '批次管理', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'safeStockFlag', + label: '安全库存', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'minStock', + label: '最低库存量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + }, + dependencies: { + triggerFields: ['safeStockFlag'], + show: (values) => Boolean(values.safeStockFlag), + }, + rules: z.number().default(0), + }, + { + fieldName: 'maxStock', + label: '最高库存量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + }, + dependencies: { + triggerFields: ['safeStockFlag'], + show: (values) => Boolean(values.safeStockFlag), + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + formItemClass: 'col-span-3', + }, + { + fieldName: 'itemOrProduct', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '物料编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入物料编码', + }, + }, + { + fieldName: 'name', + label: '物料名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入物料名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 物料导入表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '物料数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的物料数据', + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns( + onStatusChange?: ( + newStatus: number, + row: MesMdItemApi.Item, + ) => PromiseLike, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '物料编码', + minWidth: 160, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '物料名称', + minWidth: 160, + }, + { + field: 'specification', + title: '规格型号', + minWidth: 160, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 100, + align: 'center', + }, + { + field: 'itemTypeName', + title: '物料分类', + minWidth: 140, + align: 'center', + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'safeStockFlag', + title: '安全库存', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + attrs: { beforeChange: onStatusChange }, + name: 'CellSwitch', + props: { + checkedValue: CommonStatusEnum.ENABLE, + unCheckedValue: CommonStatusEnum.DISABLE, + }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 220, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 物料选择弹窗搜索表单 */ +export function useItemSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '物料编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入物料编码', + }, + }, + { + fieldName: 'name', + label: '物料名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入物料名称', + }, + }, + ]; +} + +/** 物料选择弹窗列表字段 */ +export function useItemSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { + field: 'code', + title: '物料编码', + width: 180, + }, + { + field: 'name', + title: '物料名称', + minWidth: 160, + align: 'left', + }, + { + field: 'specification', + title: '规格型号', + minWidth: 140, + align: 'left', + }, + { + field: 'unitMeasureName', + title: '单位', + width: 90, + align: 'center', + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 110, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'itemTypeName', + title: '所属分类', + width: 140, + align: 'center', + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + ]; +} + +/** 产品 BOM 子表字段 */ +export function useProductBomGridColumns( + isReadOnly = false, +): VxeTableGridOptions['columns'] { + const columns: VxeTableGridOptions['columns'] = + [ + { + field: 'bomItemCode', + title: '物料编码', + minWidth: 160, + align: 'center', + }, + { + field: 'bomItemName', + title: '物料名称', + minWidth: 160, + align: 'center', + }, + { + field: 'bomItemSpecification', + title: '规格型号', + minWidth: 140, + align: 'center', + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + align: 'center', + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 110, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'quantity', + title: '用量比例', + width: 100, + align: 'center', + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + align: 'center', + }, + ]; + + if (!isReadOnly) { + columns.push({ + field: 'actions', + title: '操作', + width: 120, + align: 'center', + fixed: 'right', + slots: { default: 'actions' }, + }); + } + + return columns; +} diff --git a/apps/web-antdv-next/src/views/mes/md/item/index.vue b/apps/web-antdv-next/src/views/mes/md/item/index.vue new file mode 100644 index 000000000..bd30d4fd5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/index.vue @@ -0,0 +1,228 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/form.vue new file mode 100644 index 000000000..538fd8d03 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/form.vue @@ -0,0 +1,166 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/import-form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/import-form.vue new file mode 100644 index 000000000..b45079623 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/import-form.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/item-batch-config-form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/item-batch-config-form.vue new file mode 100644 index 000000000..09011b7e3 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/item-batch-config-form.vue @@ -0,0 +1,181 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/product-bom-form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/product-bom-form.vue new file mode 100644 index 000000000..dc2cd5914 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/product-bom-form.vue @@ -0,0 +1,274 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/product-media-list.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/product-media-list.vue new file mode 100644 index 000000000..40b604651 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/product-media-list.vue @@ -0,0 +1,273 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/product-sip-form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/product-sip-form.vue new file mode 100644 index 000000000..b971f4631 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/product-sip-form.vue @@ -0,0 +1,14 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/modules/product-sop-form.vue b/apps/web-antdv-next/src/views/mes/md/item/modules/product-sop-form.vue new file mode 100644 index 000000000..a9bb4f5b3 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/modules/product-sop-form.vue @@ -0,0 +1,14 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/components/index.ts b/apps/web-antdv-next/src/views/mes/md/item/type/components/index.ts new file mode 100644 index 000000000..d6d2b808a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/components/index.ts @@ -0,0 +1,2 @@ +export { default as MdItemTypeSelect } from './select.vue'; +export { default as MdItemTypeTree } from './tree.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/components/select.vue b/apps/web-antdv-next/src/views/mes/md/item/type/components/select.vue new file mode 100644 index 000000000..eb1a46a1f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/components/select.vue @@ -0,0 +1,125 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/components/tree.vue b/apps/web-antdv-next/src/views/mes/md/item/type/components/tree.vue new file mode 100644 index 000000000..347e87b6a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/components/tree.vue @@ -0,0 +1,128 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/data.ts b/apps/web-antdv-next/src/views/mes/md/item/type/data.ts new file mode 100644 index 000000000..1b55c11fd --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/data.ts @@ -0,0 +1,225 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdItemTypeApi } from '#/api/mes/md/item/type'; + +import { h } from 'vue'; + +import { + CommonStatusEnum, + DICT_TYPE, + MesAutoCodeRuleCode, + MesItemOrProductEnum, +} from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; +import { handleTree } from '@vben/utils'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getItemTypeList } from '#/api/mes/md/item/type'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改物料分类的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + label: '上级分类', + component: 'ApiTreeSelect', + componentProps: { + allowClear: true, + api: async () => { + const data = await getItemTypeList(); + return [ + { + id: 0, + name: '顶级分类', + children: handleTree(data), + }, + ]; + }, + childrenField: 'children', + labelField: 'name', + placeholder: '请选择上级分类', + treeDefaultExpandAll: true, + treeNodeFilterProp: 'name', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'code', + label: '分类编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入分类编码', + }, + rules: z.string().min(1, '分类编码不能为空').max(64), + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_ITEM_TYPE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + placeholder: '请输入分类名称', + }, + rules: 'required', + }, + { + fieldName: 'itemOrProduct', + label: '物料/产品标识', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.MES_MD_ITEM_OR_PRODUCT), + }, + rules: z.string().default(MesItemOrProductEnum.ITEM.value), + }, + { + fieldName: 'sort', + label: '显示排序', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '分类名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入分类名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '分类名称', + minWidth: 200, + align: 'left', + treeNode: true, + }, + { + field: 'code', + title: '分类编码', + width: 160, + align: 'center', + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 130, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'sort', + title: '排序', + width: 100, + align: 'center', + }, + { + field: 'status', + title: '状态', + width: 120, + align: 'center', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 260, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/index.vue b/apps/web-antdv-next/src/views/mes/md/item/type/index.vue new file mode 100644 index 000000000..86e754500 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/index.vue @@ -0,0 +1,165 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/item/type/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/item/type/modules/form.vue new file mode 100644 index 000000000..55c9d7885 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/item/type/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/index.ts b/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/index.ts new file mode 100644 index 000000000..e2257ff65 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/index.ts @@ -0,0 +1 @@ +export { default as MdUnitMeasureSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/select.vue b/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/select.vue new file mode 100644 index 000000000..28244999e --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/unitmeasure/components/select.vue @@ -0,0 +1,122 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/unitmeasure/data.ts b/apps/web-antdv-next/src/views/mes/md/unitmeasure/data.ts new file mode 100644 index 000000000..8352d9c10 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/unitmeasure/data.ts @@ -0,0 +1,196 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdUnitMeasureApi } from '#/api/mes/md/unitmeasure'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; +import { getUnitMeasureSimpleList } from '#/api/mes/md/unitmeasure'; + +/** 新增/修改计量单位的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '单位编码', + component: 'Input', + componentProps: { + placeholder: '请输入单位编码', + }, + rules: 'required', + }, + { + fieldName: 'name', + label: '单位名称', + component: 'Input', + componentProps: { + placeholder: '请输入单位名称', + }, + rules: 'required', + }, + { + fieldName: 'primaryFlag', + label: '是否主单位', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'), + }, + rules: z.boolean().default(true), + }, + { + fieldName: 'primaryId', + label: '主单位', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: async () => { + const list = await getUnitMeasureSimpleList(); + return list.filter((item) => item.primaryFlag === true); + }, + labelField: 'name', + placeholder: '请选择主单位', + valueField: 'id', + }, + dependencies: { + triggerFields: ['primaryFlag'], + show: (values) => values.primaryFlag === false, + }, + }, + { + fieldName: 'changeRate', + label: '与主单位换算比例', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 4, + step: 1, + }, + dependencies: { + triggerFields: ['primaryFlag'], + show: (values) => values.primaryFlag === false, + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '单位编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入单位编码', + }, + }, + { + fieldName: 'name', + label: '单位名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入单位名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '单位编码', + minWidth: 160, + }, + { + field: 'name', + title: '单位名称', + minWidth: 160, + }, + { + field: 'primaryFlag', + title: '是否主单位', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'changeRate', + title: '与主单位换算比例', + minWidth: 150, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/unitmeasure/index.vue b/apps/web-antdv-next/src/views/mes/md/unitmeasure/index.vue new file mode 100644 index 000000000..7225ce380 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/unitmeasure/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/unitmeasure/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/unitmeasure/modules/form.vue new file mode 100644 index 000000000..588d915ff --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/unitmeasure/modules/form.vue @@ -0,0 +1,92 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/components/index.ts b/apps/web-antdv-next/src/views/mes/md/vendor/components/index.ts new file mode 100644 index 000000000..0f16061ab --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/components/index.ts @@ -0,0 +1,2 @@ +export { default as MdVendorSelectDialog } from './select-dialog.vue'; +export { default as MdVendorSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/md/vendor/components/select-dialog.vue new file mode 100644 index 000000000..b218fafe9 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/components/select-dialog.vue @@ -0,0 +1,208 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/components/select.vue b/apps/web-antdv-next/src/views/mes/md/vendor/components/select.vue new file mode 100644 index 000000000..2fd03f83d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/components/select.vue @@ -0,0 +1,136 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/data.ts b/apps/web-antdv-next/src/views/mes/md/vendor/data.ts new file mode 100644 index 000000000..531277f09 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/data.ts @@ -0,0 +1,473 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdVendorApi } from '#/api/mes/md/vendor'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改供应商的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '供应商编码', + component: 'Input', + componentProps: { + placeholder: '请输入供应商编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_VENDOR_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '供应商名称', + component: 'Input', + componentProps: { + placeholder: '请输入供应商名称', + }, + rules: z.string().min(1, '供应商名称不能为空').max(100), + }, + { + fieldName: 'nickname', + label: '供应商简称', + component: 'Input', + componentProps: { + placeholder: '请输入供应商简称', + }, + }, + { + fieldName: 'englishName', + label: '英文名称', + component: 'Input', + componentProps: { + placeholder: '请输入供应商英文名称', + }, + }, + { + fieldName: 'level', + label: '供应商等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_VENDOR_LEVEL), + placeholder: '请选择供应商等级', + }, + }, + { + fieldName: 'description', + label: '供应商简介', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入供应商简介', + rows: 2, + }, + }, + { + fieldName: 'address', + label: '供应商地址', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入供应商地址', + rows: 2, + }, + }, + { + fieldName: 'website', + label: '官网地址', + component: 'Input', + componentProps: { + placeholder: '请输入供应商官网地址', + }, + }, + { + fieldName: 'email', + label: '邮箱地址', + component: 'Input', + componentProps: { + placeholder: '请输入供应商邮箱地址', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'telephone', + label: '供应商电话', + component: 'Input', + componentProps: { + placeholder: '请输入供应商电话', + }, + }, + { + fieldName: 'score', + label: '供应商评分', + component: 'InputNumber', + componentProps: { + class: '!w-full', + max: 100, + min: 0, + precision: 0, + }, + }, + { + fieldName: 'contact1Name', + label: '联系人1', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1', + }, + }, + { + fieldName: 'contact1Telephone', + label: '联系人1电话', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1电话', + }, + }, + { + fieldName: 'contact1Email', + label: '联系人1邮箱', + component: 'Input', + componentProps: { + placeholder: '请输入联系人1邮箱', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'contact2Name', + label: '联系人2', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2', + }, + }, + { + fieldName: 'contact2Telephone', + label: '联系人2电话', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2电话', + }, + }, + { + fieldName: 'contact2Email', + label: '联系人2邮箱', + component: 'Input', + componentProps: { + placeholder: '请输入联系人2邮箱', + }, + rules: z.string().email('邮箱格式不正确').or(z.literal('')).optional(), + }, + { + fieldName: 'creditCode', + label: '社会信用代码', + component: 'Input', + componentProps: { + placeholder: '请输入统一社会信用代码', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'logo', + label: '供应商 LOGO', + component: 'Input', + componentProps: { + placeholder: '请输入供应商 LOGO 地址', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 导入供应商的表单 */ +export function useImportFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'file', + label: '供应商数据', + component: 'Upload', + rules: 'required', + help: '仅允许导入 xls、xlsx 格式文件', + }, + { + fieldName: 'updateSupport', + label: '是否覆盖', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + help: '是否更新已经存在的供应商数据', + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '供应商编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商编码', + }, + }, + { + fieldName: 'name', + label: '供应商名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商名称', + }, + }, + { + fieldName: 'nickname', + label: '供应商简称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商简称', + }, + }, + { + fieldName: 'englishName', + label: '英文名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入英文名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '供应商编码', + minWidth: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '供应商名称', + minWidth: 180, + }, + { + field: 'nickname', + title: '供应商简称', + width: 120, + }, + { + field: 'level', + title: '供应商等级', + width: 130, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_VENDOR_LEVEL }, + }, + }, + { + field: 'score', + title: '供应商评分', + width: 120, + }, + { + field: 'telephone', + title: '供应商电话', + minWidth: 140, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 供应商选择弹窗的搜索表单 */ +export function useVendorSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '供应商编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商编码', + }, + }, + { + fieldName: 'name', + label: '供应商名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商名称', + }, + }, + { + fieldName: 'nickname', + label: '供应商简称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入供应商简称', + }, + }, + { + fieldName: 'englishName', + label: '英文名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入英文名称', + }, + }, + ]; +} + +/** 供应商选择弹窗的字段 */ +export function useVendorSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { + field: 'code', + title: '供应商编码', + minWidth: 160, + }, + { + field: 'name', + title: '供应商名称', + minWidth: 170, + }, + { + field: 'nickname', + title: '供应商简称', + width: 120, + }, + { + field: 'level', + title: '供应商等级', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_VENDOR_LEVEL }, + }, + }, + { + field: 'score', + title: '供应商评分', + width: 110, + }, + { + field: 'telephone', + title: '联系电话', + width: 140, + }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/index.vue b/apps/web-antdv-next/src/views/mes/md/vendor/index.vue new file mode 100644 index 000000000..0411d550c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/index.vue @@ -0,0 +1,176 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/vendor/modules/form.vue new file mode 100644 index 000000000..813372ec5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/modules/form.vue @@ -0,0 +1,115 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/modules/import-form.vue b/apps/web-antdv-next/src/views/mes/md/vendor/modules/import-form.vue new file mode 100644 index 000000000..2c5d0a7f0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/modules/import-form.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-detail.vue b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-detail.vue new file mode 100644 index 000000000..6bd5c2b40 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-detail.vue @@ -0,0 +1,162 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-line-list.vue b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-line-list.vue new file mode 100644 index 000000000..b8abbc71d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-line-list.vue @@ -0,0 +1,95 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-list.vue b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-list.vue new file mode 100644 index 000000000..910839ad4 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/vendor/modules/item-receipt-list.vue @@ -0,0 +1,103 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/components/index.ts b/apps/web-antdv-next/src/views/mes/md/workstation/components/index.ts new file mode 100644 index 000000000..a22a0ce28 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/components/index.ts @@ -0,0 +1,3 @@ +export { default as MdWorkstationSelectDialog } from './select-dialog.vue'; +export { default as MdWorkstationSelect } from './select.vue'; +export { default as MdWorkshopSelect } from './workshop-select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/md/workstation/components/select-dialog.vue new file mode 100644 index 000000000..cdde8ec95 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/components/select-dialog.vue @@ -0,0 +1,197 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/components/select.vue b/apps/web-antdv-next/src/views/mes/md/workstation/components/select.vue new file mode 100644 index 000000000..d20fd0fdd --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/components/select.vue @@ -0,0 +1,143 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/components/workshop-select.vue b/apps/web-antdv-next/src/views/mes/md/workstation/components/workshop-select.vue new file mode 100644 index 000000000..e31786014 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/components/workshop-select.vue @@ -0,0 +1,117 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/data.ts b/apps/web-antdv-next/src/views/mes/md/workstation/data.ts new file mode 100644 index 000000000..72d282381 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/data.ts @@ -0,0 +1,353 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdWorkstationApi } from '#/api/mes/md/workstation'; + +import { h, markRaw } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse'; +import { getWarehouseAreaSimpleList } from '#/api/mes/wm/warehouse/area'; +import { getWarehouseLocationSimpleList } from '#/api/mes/wm/warehouse/location'; +import { ProProcessSelect } from '#/views/mes/pro/process/components'; + +import { MdWorkshopSelect } from './components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改工作站的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '工作站编码', + component: 'Input', + componentProps: { + placeholder: '请输入工作站编码', + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_WORKSTATION_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '工作站名称', + component: 'Input', + componentProps: { + placeholder: '请输入工作站名称', + }, + rules: 'required', + }, + { + fieldName: 'workshopId', + label: '所在车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + placeholder: '请选择车间', + }, + rules: 'selectRequired', + }, + { + fieldName: 'address', + label: '工作站地点', + component: 'Input', + componentProps: { + placeholder: '请输入工作站地点', + }, + }, + { + fieldName: 'processId', + label: '所属工序', + component: markRaw(ProProcessSelect), + componentProps: { + placeholder: '请选择所属工序', + }, + rules: 'selectRequired', + }, + { + fieldName: 'warehouseId', + label: '仓库', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getWarehouseSimpleList, + labelField: 'name', + onChange: async () => { + await formApi?.setFieldValue('locationId', undefined); + await formApi?.setFieldValue('areaId', undefined); + }, + placeholder: '请选择仓库', + valueField: 'id', + }, + }, + { + fieldName: 'locationId', + label: '库区', + component: 'Select', + dependencies: { + triggerFields: ['warehouseId'], + disabled: (values) => !values.warehouseId, + async componentProps(values) { + const list = values.warehouseId + ? await getWarehouseLocationSimpleList(values.warehouseId) + : []; + return { + allowClear: true, + onChange: async () => { + await formApi?.setFieldValue('areaId', undefined); + }, + fieldNames: { label: 'name', value: 'id' }, + options: list, + placeholder: '请选择库区', + }; + }, + }, + }, + { + fieldName: 'areaId', + label: '库位', + component: 'Select', + dependencies: { + triggerFields: ['locationId'], + disabled: (values) => !values.locationId, + async componentProps(values) { + const list = values.locationId + ? await getWarehouseAreaSimpleList(values.locationId) + : []; + return { + allowClear: true, + fieldNames: { label: 'name', value: 'id' }, + options: list, + placeholder: '请选择库位', + }; + }, + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工作站编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工作站编码', + }, + }, + { + fieldName: 'name', + label: '工作站名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工作站名称', + }, + }, + { + fieldName: 'workshopId', + label: '所在车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + allowClear: true, + placeholder: '请选择车间', + }, + }, + { + fieldName: 'processId', + label: '所属工序', + component: markRaw(ProProcessSelect), + componentProps: { + allowClear: true, + placeholder: '请选择工序', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '工作站编码', + minWidth: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '工作站名称', + minWidth: 150, + }, + { + field: 'address', + title: '工作站地点', + minWidth: 150, + }, + { + field: 'workshopName', + title: '所在车间', + width: 140, + }, + { + field: 'processName', + title: '所属工序', + width: 140, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 210, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工作站选择弹窗的搜索表单 */ +export function useWorkstationSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工作站编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工作站编码', + }, + }, + { + fieldName: 'processId', + label: '所属工序', + component: markRaw(ProProcessSelect), + componentProps: { + placeholder: '请选择工序', + }, + }, + { + fieldName: 'workshopId', + label: '所在车间', + component: markRaw(MdWorkshopSelect), + componentProps: { + placeholder: '请选择车间', + }, + }, + ]; +} + +/** 工作站选择弹窗的字段 */ +export function useWorkstationSelectGridColumns(): VxeTableGridOptions['columns'] { + return [ + { type: 'checkbox', width: 50 }, + { + field: 'code', + title: '工作站编码', + width: 150, + }, + { + field: 'name', + title: '工作站名称', + minWidth: 160, + }, + { + field: 'address', + title: '工作站地点', + minWidth: 140, + }, + { + field: 'workshopName', + title: '所在车间', + width: 130, + }, + { + field: 'processName', + title: '所属工序', + width: 130, + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/index.vue b/apps/web-antdv-next/src/views/mes/md/workstation/index.vue new file mode 100644 index 000000000..43ef70aa2 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/workstation/modules/form.vue new file mode 100644 index 000000000..7180a677d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/modules/form.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/modules/machine-list.vue b/apps/web-antdv-next/src/views/mes/md/workstation/modules/machine-list.vue new file mode 100644 index 000000000..6bbc17f86 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/modules/machine-list.vue @@ -0,0 +1,238 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/modules/tool-list.vue b/apps/web-antdv-next/src/views/mes/md/workstation/modules/tool-list.vue new file mode 100644 index 000000000..7de9fb922 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/modules/tool-list.vue @@ -0,0 +1,258 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/modules/worker-list.vue b/apps/web-antdv-next/src/views/mes/md/workstation/modules/worker-list.vue new file mode 100644 index 000000000..ecf138d0d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/modules/worker-list.vue @@ -0,0 +1,254 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/workshop/data.ts b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/data.ts new file mode 100644 index 000000000..7a86488ca --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/data.ts @@ -0,0 +1,199 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdWorkshopApi } from '#/api/mes/md/workstation/workshop'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getSimpleUserList } from '#/api/system/user'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改车间的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '车间编码', + component: 'Input', + componentProps: { + placeholder: '请输入车间编码', + }, + dependencies: { + triggerFields: ['id'], + componentProps: (values) => ({ + disabled: !!values.id, + }), + }, + rules: 'required', + suffix: + formType === 'detail' + ? undefined + : () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.MD_WORKSHOP_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '车间名称', + component: 'Input', + componentProps: { + placeholder: '请输入车间名称', + }, + rules: 'required', + }, + { + fieldName: 'area', + label: '面积', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + }, + }, + { + fieldName: 'chargeUserId', + label: '负责人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择负责人', + valueField: 'id', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '车间编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入车间编码', + }, + }, + { + fieldName: 'name', + label: '车间名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入车间名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '车间编码', + minWidth: 150, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '车间名称', + minWidth: 150, + }, + { + field: 'area', + title: '面积', + width: 120, + }, + { + field: 'chargeUserName', + title: '负责人', + width: 140, + }, + { + field: 'status', + title: '状态', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 180, + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/workshop/index.vue b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/index.vue new file mode 100644 index 000000000..8d268386a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/index.vue @@ -0,0 +1,145 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/md/workstation/workshop/modules/form.vue b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/modules/form.vue new file mode 100644 index 000000000..0879e9a39 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/md/workstation/workshop/modules/form.vue @@ -0,0 +1,123 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/config/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/andon/config/components/index.ts new file mode 100644 index 000000000..ac0d63a26 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/config/components/index.ts @@ -0,0 +1 @@ +export { default as AndonConfigSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/config/components/select.vue b/apps/web-antdv-next/src/views/mes/pro/andon/config/components/select.vue new file mode 100644 index 000000000..f397c6a75 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/config/components/select.vue @@ -0,0 +1,88 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/config/data.ts b/apps/web-antdv-next/src/views/mes/pro/andon/config/data.ts new file mode 100644 index 000000000..42b7c1860 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/config/data.ts @@ -0,0 +1,100 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProAndonConfigApi } from '#/api/mes/pro/andon/config'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; +import { getSimpleRoleList } from '#/api/system/role'; +import { getSimpleUserList } from '#/api/system/user'; + +/** 安灯配置列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'reason', title: '呼叫原因', minWidth: 200 }, + { + field: 'level', + title: '级别', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_ANDON_LEVEL }, + }, + }, + { field: 'handlerRoleName', title: '处置角色', width: 140 }, + { field: 'handlerUserNickname', title: '处置人', width: 140 }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 新增/修改安灯配置的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'reason', + label: '呼叫原因', + component: 'Textarea', + componentProps: { + autoSize: { maxRows: 3, minRows: 1 }, + maxLength: 200, + placeholder: '请输入呼叫原因', + }, + rules: z.string().min(1, '呼叫原因不能为空').max(200), + }, + { + fieldName: 'level', + label: '级别', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.MES_PRO_ANDON_LEVEL, 'number'), + placeholder: '请选择级别', + }, + rules: 'selectRequired', + }, + { + fieldName: 'handlerRoleId', + label: '处置角色', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleRoleList, + labelField: 'name', + placeholder: '请选择角色(与处置人至少填一个)', + valueField: 'id', + }, + }, + { + fieldName: 'handlerUserId', + label: '处置人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择处置人(与角色至少填一个)', + valueField: 'id', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入备注', + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/form.vue new file mode 100644 index 000000000..5ec39c1f9 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/list.vue b/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/list.vue new file mode 100644 index 000000000..e64e4bd81 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/config/modules/list.vue @@ -0,0 +1,129 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/record/data.ts b/apps/web-antdv-next/src/views/mes/pro/andon/record/data.ts new file mode 100644 index 000000000..f88aad631 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/record/data.ts @@ -0,0 +1,318 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProAndonConfigApi } from '#/api/mes/pro/andon/config'; +import type { MesProAndonRecordApi } from '#/api/mes/pro/andon/record'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE, MesProWorkOrderStatusEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; +import { ProProcessSelect } from '#/views/mes/pro/process/components'; +import { ProWorkOrderSelect } from '#/views/mes/pro/workorder/components'; + +import { AndonConfigSelect } from '../config/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + allowClear: true, + placeholder: '请选择工作站', + }, + }, + { + fieldName: 'userId', + label: '发起人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择发起人', + valueField: 'id', + }, + }, + { + fieldName: 'handlerUserId', + label: '处置人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择处置人', + valueField: 'id', + }, + }, + { + fieldName: 'status', + label: '处理状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_ANDON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + { + fieldName: 'createTime', + label: '发起时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'workstationCode', title: '工作站编码', width: 140 }, + { field: 'workstationName', title: '工作站名称', minWidth: 140 }, + { field: 'workOrderCode', title: '工单编码', width: 140 }, + { field: 'processName', title: '工序名称', width: 140 }, + { field: 'userNickname', title: '发起人', width: 110 }, + { + field: 'createTime', + title: '发起时间', + width: 180, + formatter: 'formatDateTime', + }, + { field: 'reason', title: '呼叫原因', minWidth: 160 }, + { + field: 'level', + title: '级别', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_ANDON_LEVEL }, + }, + }, + { + field: 'handleTime', + title: '处理时间', + width: 180, + formatter: 'formatDateTime', + }, + { field: 'handlerUserNickname', title: '处理人', width: 110 }, + { + field: 'status', + title: '处置状态', + width: 110, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_ANDON_STATUS }, + }, + }, + { + title: '操作', + width: 200, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** + * 新增/处置/详情安灯呼叫记录的表单 + * + * - create:录入呼叫主体信息(工作站/发起人/工单/工序/呼叫原因/备注) + * - update:呼叫主体只读展示创建时的快照字段(workstationName/workOrderCode/processName/reason),编辑处置时间/处置人/备注 + * - detail:所有字段只读 + */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + const isCreate = formType === 'create'; + const isUpdate = formType === 'update'; + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + isCreate + ? { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工作站', + }, + rules: 'selectRequired', + } + : { + fieldName: 'workstationName', + label: '工作站', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + isCreate + ? { + fieldName: 'userId', + label: '发起人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择发起人', + valueField: 'id', + }, + } + : { + fieldName: 'userNickname', + label: '发起人', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + isCreate + ? { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + placeholder: '请选择工单(可选)', + status: MesProWorkOrderStatusEnum.CONFIRMED, + }, + } + : { + fieldName: 'workOrderCode', + label: '生产工单', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + isCreate + ? { + fieldName: 'processId', + label: '工序', + component: markRaw(ProProcessSelect), + componentProps: { + placeholder: '请选择工序(可选)', + }, + } + : { + fieldName: 'processName', + label: '工序', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + isCreate + ? { + fieldName: 'configId', + label: '呼叫原因', + component: markRaw(AndonConfigSelect), + componentProps: { + // 选择呼叫原因后,自动填充对应的级别 + onChange: async (config?: MesProAndonConfigApi.AndonConfig) => { + await formApi?.setValues({ + level: config?.level, + reason: config?.reason, + }); + }, + }, + rules: 'selectRequired', + } + : { + fieldName: 'reason', + label: '呼叫原因', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'level', + label: '级别', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions(DICT_TYPE.MES_PRO_ANDON_LEVEL, 'number'), + placeholder: '由呼叫原因自动带出', + }, + }, + // 处置信息:update / detail 模式才展示 + ...(isCreate + ? [] + : ([ + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions( + DICT_TYPE.MES_PRO_ANDON_STATUS, + 'number', + ), + }, + }, + { + fieldName: 'handleTime', + label: '处置时间', + component: 'DatePicker', + componentProps: { + disabled: !isUpdate, + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择处置时间', + showTime: true, + valueFormat: 'x', + }, + }, + isUpdate + ? { + fieldName: 'handlerUserId', + label: '处置人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择处置人', + valueField: 'id', + }, + } + : { + fieldName: 'handlerUserNickname', + label: '处置人', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + ] as VbenFormSchema[])), + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + disabled: formType === 'detail', + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/record/index.vue b/apps/web-antdv-next/src/views/mes/pro/andon/record/index.vue new file mode 100644 index 000000000..f8ddd05cc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/record/index.vue @@ -0,0 +1,174 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/andon/record/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/andon/record/modules/form.vue new file mode 100644 index 000000000..7ff41d059 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/andon/record/modules/form.vue @@ -0,0 +1,180 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/card/components/index.ts new file mode 100644 index 000000000..ab7ff1d17 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/components/index.ts @@ -0,0 +1,2 @@ +export { default as ProCardSelectDialog } from './select-dialog.vue'; +export { default as ProCardSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/card/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/pro/card/components/select-dialog.vue new file mode 100644 index 000000000..a0f067f7f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/components/select-dialog.vue @@ -0,0 +1,198 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/components/select.vue b/apps/web-antdv-next/src/views/mes/pro/card/components/select.vue new file mode 100644 index 000000000..105241bef --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/components/select.vue @@ -0,0 +1,133 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/data.ts b/apps/web-antdv-next/src/views/mes/pro/card/data.ts new file mode 100644 index 000000000..286cb0b57 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/data.ts @@ -0,0 +1,512 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProCardApi } from '#/api/mes/pro/card'; +import type { MesProCardProcessApi } from '#/api/mes/pro/card/process'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesProWorkOrderStatusEnum } from '@vben/constants'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; +import { ProProcessSelect } from '#/views/mes/pro/process/components'; +import { ProWorkOrderSelect } from '#/views/mes/pro/workorder/components'; +import { UserSelect } from '#/views/system/user/components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'finish' | 'update'; + +/** 表头是否只读(完成、详情态) */ +function isHeaderReadonly(formType: FormType): boolean { + return formType === 'detail' || formType === 'finish'; +} + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + const headerReadonly = isHeaderReadonly(formType); + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '流转卡编码', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入流转卡编码', + }, + rules: 'required', + suffix: + formType === 'create' || formType === 'update' + ? () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.PRO_CARD_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ) + : undefined, + }, + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择生产工单', + status: MesProWorkOrderStatusEnum.CONFIRMED, + }, + rules: 'selectRequired', + }, + { + fieldName: 'itemId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择产品', + }, + rules: 'selectRequired', + }, + { + fieldName: 'transferedQuantity', + label: '流转数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + disabled: headerReadonly, + min: 0, + placeholder: '请输入流转数量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '流转卡编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入流转卡编码', + }, + }, + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + placeholder: '请选择生产工单', + }, + }, + { + fieldName: 'itemId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品', + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入批次号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '流转卡编码', + width: 160, + slots: { default: 'code' }, + }, + { + field: 'workOrderCode', + title: '生产工单编号', + width: 160, + }, + { + field: 'workOrderName', + title: '工单名称', + minWidth: 150, + }, + { + field: 'batchCode', + title: '批次号', + width: 120, + }, + { + field: 'itemCode', + title: '产品物料编码', + width: 140, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 120, + }, + { + field: 'specification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'transferedQuantity', + title: '流转数量', + width: 100, + }, + { + field: 'status', + title: '单据状态', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工序记录子表的字段 */ +export function useProcessGridColumns( + editable: boolean, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'sort', + title: '序号', + width: 60, + }, + { + field: 'processName', + title: '工序名称', + minWidth: 120, + }, + { + field: 'processCode', + title: '工序编码', + width: 120, + }, + { + field: 'inputTime', + title: '进入工序时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'outputTime', + title: '出工序时间', + width: 180, + formatter: 'formatDateTime', + }, + { + field: 'inputQuantity', + title: '投入数量', + width: 100, + }, + { + field: 'outputQuantity', + title: '产出数量', + width: 100, + }, + { + field: 'unqualifiedQuantity', + title: '不良品数量', + width: 100, + }, + { + field: 'workstationCode', + title: '工位编码', + width: 120, + }, + { + field: 'workstationName', + title: '工位名称', + minWidth: 120, + }, + { + field: 'nickname', + title: '操作人', + width: 100, + }, + ...(editable + ? [ + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 工序记录新增/修改的表单 */ +export function useProcessFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'sort', + label: '序号', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入序号', + precision: 0, + }, + }, + { + fieldName: 'processId', + label: '工序', + component: markRaw(ProProcessSelect), + componentProps: { + placeholder: '请选择工序', + }, + }, + { + fieldName: 'inputTime', + label: '进入工序时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + placeholder: '请选择进入工序时间', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'outputTime', + label: '出工序时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + placeholder: '请选择出工序时间', + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'inputQuantity', + label: '投入数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入投入数量', + precision: 2, + }, + }, + { + fieldName: 'outputQuantity', + label: '产出数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入产出数量', + precision: 2, + }, + }, + { + fieldName: 'unqualifiedQuantity', + label: '不合格数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入不合格数量', + precision: 2, + }, + }, + { + fieldName: 'workstationId', + label: '工位', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工位', + }, + }, + { + fieldName: 'userId', + label: '操作人', + component: markRaw(UserSelect), + componentProps: { + placeholder: '请选择操作人', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 流转卡选择弹窗的搜索表单 */ +export function useCardSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '流转卡编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入流转卡编号', + }, + }, + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + placeholder: '请选择生产工单', + }, + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入批次号', + }, + }, + ]; +} + +/** 流转卡选择弹窗的字段 */ +export function useCardSelectGridColumns( + multiple = false, +): VxeTableGridOptions['columns'] { + return [ + { + type: multiple ? 'checkbox' : 'radio', + width: 50, + }, + { + field: 'code', + title: '流转卡编号', + width: 160, + }, + { + field: 'workOrderCode', + title: '生产工单编号', + width: 160, + }, + { + field: 'itemCode', + title: '产品物料编码', + width: 140, + }, + { + field: 'batchCode', + title: '批次号', + width: 120, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 150, + }, + { + field: 'specification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'transferedQuantity', + title: '流转数量', + width: 100, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/card/index.vue b/apps/web-antdv-next/src/views/mes/pro/card/index.vue new file mode 100644 index 000000000..2bae0fd07 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/index.vue @@ -0,0 +1,197 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/card/modules/form.vue new file mode 100644 index 000000000..0a048755c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/modules/form.vue @@ -0,0 +1,214 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/modules/process-form.vue b/apps/web-antdv-next/src/views/mes/pro/card/modules/process-form.vue new file mode 100644 index 000000000..e09d56d1a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/modules/process-form.vue @@ -0,0 +1,94 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/card/modules/process-list.vue b/apps/web-antdv-next/src/views/mes/pro/card/modules/process-list.vue new file mode 100644 index 000000000..c6e965287 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/card/modules/process-list.vue @@ -0,0 +1,133 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/feedback/data.ts b/apps/web-antdv-next/src/views/mes/pro/feedback/data.ts new file mode 100644 index 000000000..43ae331a0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/feedback/data.ts @@ -0,0 +1,585 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProFeedbackApi } from '#/api/mes/pro/feedback'; +import type { MesProTaskApi } from '#/api/mes/pro/task'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesProTaskStatusEnum, MesProWorkOrderStatusEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRouteProcessByRouteAndProcess } from '#/api/mes/pro/route/process'; +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; +import { ProTaskSelect } from '#/views/mes/pro/task/components'; +import { ProWorkOrderSelect } from '#/views/mes/pro/workorder/components'; + +/** 生产报工表单类型 */ +export type FormType = 'approve' | 'create' | 'detail' | 'submit' | 'update'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '报工单号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入报工单号', + }, + }, + { + fieldName: 'type', + label: '报工类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_FEEDBACK_TYPE, 'number'), + placeholder: '请选择报工类型', + }, + }, + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + allowClear: true, + placeholder: '请选择工单', + }, + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + allowClear: true, + placeholder: '请选择产品物料', + }, + }, + { + fieldName: 'feedbackUserId', + label: '报工人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择报工人', + valueField: 'id', + }, + }, + { + fieldName: 'creator', + label: '记录人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择记录人', + valueField: 'id', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_FEEDBACK_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + { + fieldName: 'feedbackTime', + label: '报工时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '报工单号', + width: 160, + slots: { default: 'code' }, + }, + { + field: 'type', + title: '报工类型', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_FEEDBACK_TYPE }, + }, + }, + { field: 'workstationName', title: '工作站', width: 120 }, + { field: 'processName', title: '工序', width: 100 }, + { field: 'workOrderCode', title: '生产工单编码', width: 160 }, + { field: 'itemCode', title: '产品物料编码', width: 120 }, + { field: 'itemName', title: '产品物料名称', minWidth: 140 }, + { field: 'itemSpecification', title: '规格型号', width: 120 }, + { field: 'unitMeasureName', title: '单位', width: 80 }, + { field: 'feedbackQuantity', title: '报工数量', width: 100 }, + { field: 'feedbackUserNickname', title: '报工人', width: 100 }, + { + field: 'feedbackTime', + title: '报工时间', + width: 180, + formatter: 'formatDateTime', + }, + { field: 'approveUserNickname', title: '审核人', width: 100 }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_FEEDBACK_STATUS }, + }, + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** + * 新增/编辑/提交/审批/详情生产报工的表单 + * + * - create / update:录入报工主体信息和数量 + * - submit / approve / detail:主体字段只读 + * + * 数量区域根据 `checkFlag` 和 `unqualifiedQuantity` 动态显示: + * - 非质检工序:报工数量 = 合格 + 不良;不良 > 0 时再展开工废/料废/其他废品 + * - 质检工序:只填报工数量(视为待检数量) + */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + const isHeaderReadonly = ['approve', 'detail', 'submit'].includes(formType); + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'checkFlag', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + defaultValue: true, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'processId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'itemId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'code', + label: '报工单号', + component: 'Input', + componentProps: { + disabled: isHeaderReadonly, + placeholder: '请输入报工单号', + }, + rules: 'required', + suffix: () => + h( + Button, + { + disabled: isHeaderReadonly, + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.PRO_FEEDBACK_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'type', + label: '报工类型', + component: 'Select', + componentProps: { + disabled: isHeaderReadonly, + options: getDictOptions(DICT_TYPE.MES_PRO_FEEDBACK_TYPE, 'number'), + placeholder: '请选择报工类型', + }, + rules: 'required', + }, + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + disabled: isHeaderReadonly, + placeholder: '请选择工单', + status: MesProWorkOrderStatusEnum.CONFIRMED, + // 工单变更:清空任务及任务带出的产品信息、数量区域控制位 + onChange: async () => { + await formApi?.setValues({ + checkFlag: true, + itemCode: undefined, + itemId: undefined, + itemName: undefined, + itemSpecification: undefined, + processId: undefined, + routeId: undefined, + taskId: undefined, + unitMeasureName: undefined, + workstationId: undefined, + }); + }, + }, + rules: 'selectRequired', + }, + { + fieldName: 'taskId', + label: '生产任务', + component: markRaw(ProTaskSelect), + dependencies: { + triggerFields: ['workOrderId', 'workstationId'], + componentProps: (values) => ({ + disabled: isHeaderReadonly || !values.workOrderId, + placeholder: values.workOrderId ? '请选择任务' : '请先选择工单', + statuses: [MesProTaskStatusEnum.PREPARE], + workOrderId: values.workOrderId, + workstationId: values.workstationId, + }), + }, + // 任务变更:自动填充关联字段、产品信息、checkFlag + componentProps: { + onChange: async (task?: MesProTaskApi.Task) => { + if (!task) { + return; + } + await formApi?.setValues({ + itemCode: task.itemCode, + itemId: task.itemId, + itemName: task.itemName, + itemSpecification: task.itemSpecification, + processId: task.processId, + routeId: task.routeId, + unitMeasureName: task.unitMeasureName, + workstationId: task.workstationId, + }); + // 工艺路线工序的 checkFlag 决定数量区域展示 + if (task.routeId && task.processId) { + try { + const routeProcess = await getRouteProcessByRouteAndProcess( + task.routeId, + task.processId, + ); + await formApi?.setFieldValue( + 'checkFlag', + routeProcess?.checkFlag ?? false, + ); + } catch { + await formApi?.setFieldValue('checkFlag', true); + } + } + }, + }, + rules: 'selectRequired', + }, + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + disabled: isHeaderReadonly, + placeholder: '请选择工作站', + }, + rules: 'selectRequired', + }, + { + fieldName: 'itemCode', + label: '产品编码', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['itemCode'], + show: (values) => !!values.itemCode, + }, + }, + { + fieldName: 'itemName', + label: '产品名称', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['itemCode'], + show: (values) => !!values.itemCode, + }, + }, + { + fieldName: 'unitMeasureName', + label: '单位', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['itemCode'], + show: (values) => !!values.itemCode, + }, + }, + { + fieldName: 'itemSpecification', + label: '规格', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: ['itemCode'], + show: (values) => !!values.itemCode, + }, + }, + { + fieldName: 'feedbackQuantity', + label: '报工数量', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + }, + dependencies: { + triggerFields: ['checkFlag'], + // 非质检工序时,报工数量 = 合格 + 不良,禁用直接编辑 + componentProps: (values) => ({ + class: 'w-full', + disabled: !values.checkFlag, + min: 0, + placeholder: '请输入报工数量', + precision: 2, + }), + }, + rules: 'required', + }, + { + fieldName: 'qualifiedQuantity', + label: '合格品数量', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + // 合格/不良变更,自动累计为报工数量 + onChange: async () => { + const values = await formApi?.getValues(); + await formApi?.setFieldValue( + 'feedbackQuantity', + (values?.qualifiedQuantity || 0) + + (values?.unqualifiedQuantity || 0), + ); + }, + }, + defaultValue: 0, + dependencies: { + triggerFields: ['checkFlag'], + show: (values) => !values.checkFlag, + }, + }, + { + fieldName: 'unqualifiedQuantity', + label: '不良品数量', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + // 合格/不良变更,自动累计为报工数量 + onChange: async () => { + const values = await formApi?.getValues(); + await formApi?.setFieldValue( + 'feedbackQuantity', + (values?.qualifiedQuantity || 0) + + (values?.unqualifiedQuantity || 0), + ); + }, + }, + defaultValue: 0, + dependencies: { + triggerFields: ['checkFlag'], + show: (values) => !values.checkFlag, + }, + }, + { + fieldName: 'laborScrapQuantity', + label: '工废数量', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + // 废品分类变更,自动累计为不良品数量及报工数量 + onChange: async () => { + const values = await formApi?.getValues(); + const unqualified = + (values?.laborScrapQuantity || 0) + + (values?.materialScrapQuantity || 0) + + (values?.otherScrapQuantity || 0); + await formApi?.setValues({ + feedbackQuantity: + (values?.qualifiedQuantity || 0) + unqualified, + unqualifiedQuantity: unqualified, + }); + }, + }, + defaultValue: 0, + dependencies: { + triggerFields: ['checkFlag', 'unqualifiedQuantity'], + show: (values) => + !values.checkFlag && (values.unqualifiedQuantity || 0) > 0, + }, + }, + { + fieldName: 'materialScrapQuantity', + label: '料废数量', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + // 废品分类变更,自动累计为不良品数量及报工数量 + onChange: async () => { + const values = await formApi?.getValues(); + const unqualified = + (values?.laborScrapQuantity || 0) + + (values?.materialScrapQuantity || 0) + + (values?.otherScrapQuantity || 0); + await formApi?.setValues({ + feedbackQuantity: + (values?.qualifiedQuantity || 0) + unqualified, + unqualifiedQuantity: unqualified, + }); + }, + }, + defaultValue: 0, + dependencies: { + triggerFields: ['checkFlag', 'unqualifiedQuantity'], + show: (values) => + !values.checkFlag && (values.unqualifiedQuantity || 0) > 0, + }, + }, + { + fieldName: 'otherScrapQuantity', + label: '其他废品', + component: 'InputNumber', + componentProps: { + class: 'w-full', + min: 0, + precision: 2, + // 废品分类变更,自动累计为不良品数量及报工数量 + onChange: async () => { + const values = await formApi?.getValues(); + const unqualified = + (values?.laborScrapQuantity || 0) + + (values?.materialScrapQuantity || 0) + + (values?.otherScrapQuantity || 0); + await formApi?.setValues({ + feedbackQuantity: + (values?.qualifiedQuantity || 0) + unqualified, + unqualifiedQuantity: unqualified, + }); + }, + }, + defaultValue: 0, + dependencies: { + triggerFields: ['checkFlag', 'unqualifiedQuantity'], + show: (values) => + !values.checkFlag && (values.unqualifiedQuantity || 0) > 0, + }, + }, + { + fieldName: 'feedbackUserId', + label: '报工人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + disabled: isHeaderReadonly, + labelField: 'nickname', + placeholder: '请选择报工人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'feedbackTime', + label: '报工时间', + component: 'DatePicker', + componentProps: { + class: 'w-full', + disabled: isHeaderReadonly, + format: 'YYYY-MM-DD HH:mm:ss', + placeholder: '请选择报工时间', + showTime: true, + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'approveUserId', + label: '审核人', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + disabled: isHeaderReadonly, + labelField: 'nickname', + placeholder: '请选择审核人', + valueField: 'id', + }, + rules: 'selectRequired', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + disabled: formType === 'detail', + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/feedback/index.vue b/apps/web-antdv-next/src/views/mes/pro/feedback/index.vue new file mode 100644 index 000000000..3109558d9 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/feedback/index.vue @@ -0,0 +1,182 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/feedback/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/form.vue new file mode 100644 index 000000000..6cb17e30b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/form.vue @@ -0,0 +1,313 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/feedback/modules/item-consume-list.vue b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/item-consume-list.vue new file mode 100644 index 000000000..0af4f897d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/item-consume-list.vue @@ -0,0 +1,61 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/feedback/modules/product-produce-list.vue b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/product-produce-list.vue new file mode 100644 index 000000000..c526f6fbb --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/feedback/modules/product-produce-list.vue @@ -0,0 +1,72 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/process/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/process/components/index.ts new file mode 100644 index 000000000..4204017de --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/components/index.ts @@ -0,0 +1 @@ +export { default as ProProcessSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/process/components/select.vue b/apps/web-antdv-next/src/views/mes/pro/process/components/select.vue new file mode 100644 index 000000000..44b7f36ec --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/components/select.vue @@ -0,0 +1,114 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/process/data.ts b/apps/web-antdv-next/src/views/mes/pro/process/data.ts new file mode 100644 index 000000000..60829d2a5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/data.ts @@ -0,0 +1,270 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProProcessApi } from '#/api/mes/pro/process'; +import type { MesProProcessContentApi } from '#/api/mes/pro/process/content'; + +import { h } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 新增/修改生产工序的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '工序编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入工序编码', + }, + rules: z.string().min(1, '工序编码不能为空').max(64), + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.PRO_PROCESS_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '工序名称', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入工序名称', + }, + rules: z.string().min(1, '工序名称不能为空').max(100), + }, + { + fieldName: 'status', + label: '状态', + component: 'RadioGroup', + componentProps: { + buttonStyle: 'solid', + optionType: 'button', + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + { + fieldName: 'attention', + label: '工序说明', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + maxLength: 500, + placeholder: '请输入工序说明', + rows: 3, + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工序编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工序编码', + }, + }, + { + fieldName: 'name', + label: '工序名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工序名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '工序编码', + minWidth: 150, + slots: { + default: 'code', + }, + }, + { field: 'name', title: '工序名称', minWidth: 180 }, + { + field: 'status', + title: '状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { field: 'remark', title: '备注', minWidth: 180 }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 150, + fixed: 'right', + slots: { + default: 'actions', + }, + }, + ]; +} + +/** 工序内容(操作步骤)表单 */ +export function useContentFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'processId', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'sort', + label: '序号', + component: 'InputNumber', + componentProps: { + class: '!w-full', + max: 999, + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'content', + label: '步骤说明', + component: 'Textarea', + componentProps: { + maxLength: 500, + placeholder: '请输入步骤说明', + rows: 3, + }, + }, + { + fieldName: 'device', + label: '辅助设备', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入辅助设备', + }, + }, + { + fieldName: 'material', + label: '辅助材料', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入辅助材料', + }, + }, + { + fieldName: 'docUrl', + label: '材料文档 URL', + component: 'Input', + componentProps: { + maxLength: 250, + placeholder: '请输入材料文档 URL', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 工序内容列表的字段 */ +export function useContentGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'sort', title: '序号', width: 80, align: 'center' }, + { field: 'content', title: '步骤说明', minWidth: 220 }, + { field: 'device', title: '辅助设备', width: 150 }, + { field: 'material', title: '辅助材料', width: 150 }, + { field: 'docUrl', title: '材料文档', minWidth: 180 }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/process/index.vue b/apps/web-antdv-next/src/views/mes/pro/process/index.vue new file mode 100644 index 000000000..efdb1f7ac --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/index.vue @@ -0,0 +1,158 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/process/modules/content-form.vue b/apps/web-antdv-next/src/views/mes/pro/process/modules/content-form.vue new file mode 100644 index 000000000..b60b54c84 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/modules/content-form.vue @@ -0,0 +1,98 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/process/modules/content-list.vue b/apps/web-antdv-next/src/views/mes/pro/process/modules/content-list.vue new file mode 100644 index 000000000..5c5dc71fa --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/modules/content-list.vue @@ -0,0 +1,132 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/process/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/process/modules/form.vue new file mode 100644 index 000000000..0a0d4d231 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/process/modules/form.vue @@ -0,0 +1,114 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/components/color-picker.vue b/apps/web-antdv-next/src/views/mes/pro/route/components/color-picker.vue new file mode 100644 index 000000000..c963fee83 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/components/color-picker.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/route/components/index.ts new file mode 100644 index 000000000..4a78a4ce4 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/components/index.ts @@ -0,0 +1 @@ +export { default as RouteColorPicker } from './color-picker.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/route/data.ts b/apps/web-antdv-next/src/views/mes/pro/route/data.ts new file mode 100644 index 000000000..ee1377f6a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/data.ts @@ -0,0 +1,514 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProRouteApi } from '#/api/mes/pro/route'; +import type { MesProRouteProcessApi } from '#/api/mes/pro/route/process'; +import type { MesProRouteProductApi } from '#/api/mes/pro/route/product'; +import type { MesProRouteProductBomApi } from '#/api/mes/pro/route/productbom'; + +import { h, markRaw } from 'vue'; + +import { CommonStatusEnum, DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { z } from '#/adapter/form'; +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { + MdItemSelect, + MdProductBomSelect, +} from '#/views/mes/md/item/components'; + +import { RouteColorPicker } from './components'; + +/** 表单类型 */ +export type FormType = 'create' | 'detail' | 'update'; + +/** 工艺路线表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'code', + label: '路线编码', + component: 'Input', + componentProps: { + maxLength: 64, + placeholder: '请输入工艺路线编码', + }, + rules: z.string().min(1, '路线编码不能为空').max(64), + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.PRO_ROUTE_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'name', + label: '路线名称', + component: 'Input', + componentProps: { + maxLength: 100, + placeholder: '请输入工艺路线名称', + }, + rules: z.string().min(1, '路线名称不能为空').max(100), + }, + { + fieldName: 'description', + label: '路线说明', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + maxLength: 500, + placeholder: '请输入工艺路线说明', + rows: 3, + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 列表搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '路线编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入路线编码', + }, + }, + { + fieldName: 'name', + label: '路线名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入路线名称', + }, + }, + { + fieldName: 'status', + label: '状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择状态', + }, + }, + ]; +} + +/** 列表字段 */ +export function useGridColumns( + onStatusChange?: ( + newStatus: number, + row: MesProRouteApi.Route, + ) => PromiseLike, + statusEditable = true, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '路线编码', + minWidth: 160, + slots: { default: 'code' }, + }, + { field: 'name', title: '路线名称', minWidth: 180 }, + { field: 'description', title: '路线说明', minWidth: 200 }, + { + field: 'status', + title: '状态', + width: 110, + align: 'center', + cellRender: { + attrs: { beforeChange: onStatusChange }, + name: 'CellSwitch', + props: { + checkedValue: CommonStatusEnum.ENABLE, + disabled: !statusEditable, + unCheckedValue: CommonStatusEnum.DISABLE, + }, + }, + }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工艺路线工序明细表单 */ +export function useRouteProcessFormSchema( + processOptions: Array<{ label: string; value: number }>, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'sort', + label: '序号', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'processId', + label: '工序', + component: 'Select', + componentProps: { + allowClear: true, + options: processOptions, + placeholder: '请选择工序', + showSearch: true, + }, + rules: 'selectRequired', + }, + { + fieldName: 'linkType', + label: '与下道工序关系', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_LINK_TYPE, 'number'), + placeholder: '请选择', + }, + rules: z.number().default(3), + }, + { + fieldName: 'colorCode', + label: '甘特图颜色', + component: RouteColorPicker, + }, + { + fieldName: 'keyFlag', + label: '是否关键工序', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'checkFlag', + label: '是否质检确认', + component: 'Switch', + componentProps: { + checkedChildren: '是', + unCheckedChildren: '否', + }, + rules: z.boolean().default(false), + }, + { + fieldName: 'prepareTime', + label: '准备时间(分)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'waitTime', + label: '等待时间(分)', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 0, + }, + rules: z.number().default(0), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 工艺路线工序列表字段 */ +export function useRouteProcessGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'sort', title: '序号', width: 70, align: 'center', fixed: 'left' }, + { field: 'processCode', title: '工序编码', width: 140, fixed: 'left' }, + { field: 'processName', title: '工序名称', width: 140, fixed: 'left' }, + { field: 'nextProcessName', title: '下一道工序', width: 140 }, + { + field: 'linkType', + title: '与下一道工序关系', + width: 160, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_LINK_TYPE }, + }, + }, + { + field: 'keyFlag', + title: '关键工序', + width: 90, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { + field: 'checkFlag', + title: '质检确认', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { field: 'prepareTime', title: '准备时间(分)', width: 110 }, + { field: 'waitTime', title: '等待时间(分)', width: 110 }, + { + field: 'colorCode', + title: '甘特图颜色', + width: 130, + slots: { default: 'colorCode' }, + }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工艺路线产品列表字段 */ +export function useRouteProductGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'itemCode', title: '产品物料编码', width: 150 }, + { field: 'itemName', title: '产品物料名称', width: 150 }, + { field: 'specification', title: '规格型号', width: 150 }, + { field: 'unitName', title: '单位', width: 80 }, + { field: 'quantity', title: '生产数量', width: 100 }, + { + field: 'productionTime', + title: '生产用时', + width: 130, + slots: { default: 'productionTime' }, + }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工艺路线产品 BOM 列表字段 */ +export function useRouteProductBomGridColumns(): VxeTableGridOptions['columns'] { + return [ + { field: 'itemCode', title: 'BOM 物料编码', width: 150 }, + { field: 'itemName', title: 'BOM 物料名称', width: 150 }, + { field: 'specification', title: '规格型号', width: 150 }, + { field: 'unitName', title: '单位', width: 80 }, + { field: 'quantity', title: '用料比例', width: 100 }, + { field: 'remark', title: '备注', minWidth: 160 }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + + +/** 工艺路线产品表单 */ +export function useRouteProductFormSchema( + onItemChange?: (item: any) => void, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + // 产品物料:使用业务自定义选择器,change 回填编码/名称/规格/单位 + { + fieldName: 'itemId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + onChange: onItemChange, + }, + formItemClass: 'col-span-2', + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '生产数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + precision: 0, + }, + rules: z.number().default(1), + }, + { + fieldName: 'productionTime', + label: '生产用时', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + }, + rules: z.number().default(1), + }, + { + fieldName: 'timeUnitType', + label: '时间单位', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_TIME_UNIT_TYPE), + placeholder: '请选择', + }, + rules: z.string().default('MINUTE'), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 工艺路线产品 BOM 表单 */ +export function useRouteProductBomFormSchema( + itemId: () => number, + onBomChange?: (bom: any) => void, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'routeId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'processId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + { + fieldName: 'productId', + component: 'Input', + dependencies: { triggerFields: [''], show: () => false }, + }, + // BOM 物料:依赖产品物料,使用业务自定义选择器 + { + fieldName: 'itemId', + label: 'BOM 物料', + component: markRaw(MdProductBomSelect), + componentProps: () => ({ + itemId: itemId(), + onChange: onBomChange, + placeholder: '请选择 BOM 物料', + }), + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '用料比例', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + precision: 2, + }, + rules: z.number().default(1), + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxLength: 250, + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/route/index.vue b/apps/web-antdv-next/src/views/mes/pro/route/index.vue new file mode 100644 index 000000000..0d813dc21 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/index.vue @@ -0,0 +1,188 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/bom-form.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/bom-form.vue new file mode 100644 index 000000000..e4f02249f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/bom-form.vue @@ -0,0 +1,118 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/form.vue new file mode 100644 index 000000000..d4b1085bf --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/form.vue @@ -0,0 +1,121 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/process-form.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/process-form.vue new file mode 100644 index 000000000..73e6f0e5a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/process-form.vue @@ -0,0 +1,121 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/process-list.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/process-list.vue new file mode 100644 index 000000000..84f5e7445 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/process-list.vue @@ -0,0 +1,136 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/product-bom-list.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-bom-list.vue new file mode 100644 index 000000000..d2490ea07 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-bom-list.vue @@ -0,0 +1,171 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/product-form.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-form.vue new file mode 100644 index 000000000..01b6a4c37 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-form.vue @@ -0,0 +1,125 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/route/modules/product-list.vue b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-list.vue new file mode 100644 index 000000000..be2bec3d8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/route/modules/product-list.vue @@ -0,0 +1,134 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/components/gantt-chart.vue b/apps/web-antdv-next/src/views/mes/pro/task/components/gantt-chart.vue new file mode 100644 index 000000000..dca1347c9 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/components/gantt-chart.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/task/components/index.ts new file mode 100644 index 000000000..4c3982323 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/components/index.ts @@ -0,0 +1,3 @@ +export { default as GanttChart } from './gantt-chart.vue'; +export { default as ProTaskSelectDialog } from './select-dialog.vue'; +export { default as ProTaskSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/task/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/pro/task/components/select-dialog.vue new file mode 100644 index 000000000..4d86caecc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/components/select-dialog.vue @@ -0,0 +1,245 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/components/select.vue b/apps/web-antdv-next/src/views/mes/pro/task/components/select.vue new file mode 100644 index 000000000..b24bb99d1 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/components/select.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/data.ts b/apps/web-antdv-next/src/views/mes/pro/task/data.ts new file mode 100644 index 000000000..7a6dcb324 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/data.ts @@ -0,0 +1,570 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProTaskApi } from '#/api/mes/pro/task'; +import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getRangePickerDefaultProps } from '#/utils'; +import { MdClientSelect } from '#/views/mes/md/client/components'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; +import { ProProcessSelect } from '#/views/mes/pro/process/components'; +import { RouteColorPicker } from '#/views/mes/pro/route/components'; +import { ProWorkOrderSelect } from '#/views/mes/pro/workorder/components'; + +/** 待排产工单列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工单编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单编码', + }, + }, + { + fieldName: 'name', + label: '工单名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单名称', + }, + }, + { + fieldName: 'orderSourceCode', + label: '来源单据', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'productId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'requestDate', + label: '需求日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 待排产工单列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '工单编码', + fixed: 'left', + width: 200, + treeNode: true, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '工单名称', + minWidth: 150, + }, + { + field: 'orderSourceType', + title: '工单来源', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_SOURCE_TYPE }, + }, + }, + { + field: 'orderSourceCode', + title: '来源单据编号', + width: 140, + }, + { + field: 'productCode', + title: '产品编码', + width: 120, + }, + { + field: 'productName', + title: '产品名称', + minWidth: 120, + }, + { + field: 'productSpecification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'quantity', + title: '工单数量', + width: 100, + }, + { + field: 'quantityChanged', + title: '调整数量', + width: 100, + }, + { + field: 'quantityProduced', + title: '已生产数量', + width: 100, + }, + { + field: 'clientCode', + title: '客户编码', + width: 120, + }, + { + field: 'clientName', + title: '客户名称', + width: 120, + }, + { + field: 'requestDate', + title: '需求日期', + width: 120, + formatter: 'formatDate', + }, + { + field: 'status', + title: '排产状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_STATUS }, + }, + }, + { + title: '操作', + width: 100, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 排产对话框只读工单信息的表单 */ +export function useScheduleFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工单编码', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'name', + label: '工单名称', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'orderSourceType', + label: '工单来源', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_SOURCE_TYPE, 'number'), + }, + }, + { + fieldName: 'orderSourceCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'type', + label: '工单类型', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_TYPE, 'number'), + }, + }, + { + fieldName: 'productId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'productSpecification', + label: '规格型号', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'unitMeasureName', + label: '单位', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'quantity', + label: '工单数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + disabled: true, + precision: 2, + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + disabled: true, + }, + }, + { + fieldName: 'requestDate', + label: '需求日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + format: 'YYYY-MM-DD', + valueFormat: 'x', + }, + }, + { + fieldName: 'status', + label: '工单状态', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_STATUS, 'number'), + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + disabled: true, + rows: 2, + }, + }, + ]; +} + +/** 生产任务子表的字段 */ +export function useTaskGridColumns( + editable: boolean, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '任务编码', + width: 140, + }, + { + field: 'name', + title: '任务名称', + minWidth: 150, + }, + { + field: 'workstationCode', + title: '工作站编号', + width: 120, + }, + { + field: 'workstationName', + title: '工作站名称', + width: 120, + }, + { + field: 'quantity', + title: '排产数量', + width: 100, + }, + { + field: 'producedQuantity', + title: '已生产数量', + width: 100, + }, + { + field: 'startTime', + title: '开始生产时间', + width: 170, + formatter: 'formatDateTime', + }, + { + field: 'duration', + title: '生产时长', + width: 80, + }, + { + field: 'endTime', + title: '预计完成时间', + width: 170, + formatter: 'formatDateTime', + }, + { + field: 'colorCode', + title: '显示颜色', + width: 100, + slots: { default: 'colorCode' }, + }, + ...(editable + ? [ + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 生产任务新增/修改的表单 */ +export function useTaskFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工作站', + }, + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '排产数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0.01, + placeholder: '请输入排产数量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'colorCode', + label: '甘特颜色', + component: markRaw(RouteColorPicker), + }, + { + fieldName: 'startTime', + label: '开始时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + placeholder: '请选择开始时间', + showTime: true, + valueFormat: 'x', + // 开始时间变更:重新计算结束时间 + onChange: () => recalcEndTime(formApi), + }, + rules: 'required', + }, + { + fieldName: 'duration', + label: '生产时长', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + placeholder: '请输入生产时长', + precision: 0, + // 生产时长变更:重新计算结束时间 + onChange: () => recalcEndTime(formApi), + }, + rules: 'required', + }, + { + fieldName: 'endTime', + label: '结束时间', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: true, + showTime: true, + valueFormat: 'x', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 计算结束时间:开始时间 + 生产时长 × 8 小时 */ +async function recalcEndTime(formApi?: VbenFormApi) { + if (!formApi) { + return; + } + const values = await formApi.getValues(); + if (values.startTime && values.duration) { + const start = Number(values.startTime); + await formApi.setFieldValue( + 'endTime', + start + values.duration * 8 * 3600 * 1000, + ); + } +} + +/** 任务选择弹窗的搜索表单 */ +export function useTaskSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'workOrderId', + label: '生产工单', + component: markRaw(ProWorkOrderSelect), + componentProps: { + allowClear: true, + placeholder: '请选择生产工单', + }, + }, + { + fieldName: 'processId', + label: '所属工序', + component: markRaw(ProProcessSelect), + componentProps: { + allowClear: true, + placeholder: '请选择工序', + }, + }, + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + allowClear: true, + placeholder: '请选择工作站', + }, + }, + { + fieldName: 'code', + label: '任务编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入任务编号', + }, + }, + { + fieldName: 'name', + label: '任务名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入任务名称', + }, + }, + ]; +} + +/** 任务选择弹窗的字段 */ +export function useTaskSelectGridColumns( + multiple = false, +): VxeTableGridOptions['columns'] { + return [ + { type: multiple ? 'checkbox' : 'radio', width: 50 }, + { field: 'code', title: '任务编号', width: 180 }, + { field: 'name', title: '任务名称', minWidth: 140 }, + { field: 'workstationCode', title: '工作站编码', width: 140 }, + { field: 'workstationName', title: '工作站名称', width: 140 }, + { field: 'processName', title: '工序', width: 120 }, + { + field: 'checkFlag', + title: '是否质检', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, + }, + }, + { field: 'itemCode', title: '物料编码', width: 140 }, + { field: 'itemName', title: '物料名称', width: 140 }, + { field: 'itemSpecification', title: '规格型号', width: 120 }, + { field: 'quantity', title: '排产数量', width: 100 }, + { field: 'producedQuantity', title: '已生产数量', width: 110 }, + { + field: 'startTime', + title: '开始生产时间', + width: 170, + formatter: 'formatDateTime', + }, + { field: 'duration', title: '生产时长', width: 100 }, + { + field: 'endTime', + title: '预计完成时间', + width: 170, + formatter: 'formatDateTime', + }, + { + field: 'status', + title: '任务状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_TASK_STATUS }, + }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/task/edit/index.vue b/apps/web-antdv-next/src/views/mes/pro/task/edit/index.vue new file mode 100644 index 000000000..78be96fe0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/edit/index.vue @@ -0,0 +1,98 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/index.vue b/apps/web-antdv-next/src/views/mes/pro/task/index.vue new file mode 100644 index 000000000..49a14a016 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/modules/schedule-form.vue b/apps/web-antdv-next/src/views/mes/pro/task/modules/schedule-form.vue new file mode 100644 index 000000000..7755fd100 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/modules/schedule-form.vue @@ -0,0 +1,148 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/modules/task-form.vue b/apps/web-antdv-next/src/views/mes/pro/task/modules/task-form.vue new file mode 100644 index 000000000..f72ca081c --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/modules/task-form.vue @@ -0,0 +1,113 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/task/modules/task-list.vue b/apps/web-antdv-next/src/views/mes/pro/task/modules/task-list.vue new file mode 100644 index 000000000..9a6256eac --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/task/modules/task-list.vue @@ -0,0 +1,162 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/components/index.ts b/apps/web-antdv-next/src/views/mes/pro/workorder/components/index.ts new file mode 100644 index 000000000..7c84b3bf7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/components/index.ts @@ -0,0 +1,2 @@ +export { default as ProWorkOrderSelectDialog } from './select-dialog.vue'; +export { default as ProWorkOrderSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/components/select-dialog.vue new file mode 100644 index 000000000..1ae6e2dc4 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/components/select-dialog.vue @@ -0,0 +1,232 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/components/select.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/components/select.vue new file mode 100644 index 000000000..ce06863e2 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/components/select.vue @@ -0,0 +1,140 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/data.ts b/apps/web-antdv-next/src/views/mes/pro/workorder/data.ts new file mode 100644 index 000000000..ba77621d8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/data.ts @@ -0,0 +1,728 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesMdProductBomApi } from '#/api/mes/md/item/productBom'; +import type { MesProWorkOrderApi } from '#/api/mes/pro/workorder'; +import type { MesProWorkOrderBomApi } from '#/api/mes/pro/workorder/bom'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesProWorkOrderSourceTypeEnum, MesProWorkOrderTypeEnum } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; +import { getRangePickerDefaultProps } from '#/utils'; +import { MdClientSelect } from '#/views/mes/md/client/components'; +import { MdItemSelect, MdProductBomSelect } from '#/views/mes/md/item/components'; +import { MdVendorSelect } from '#/views/mes/md/vendor/components'; + +/** 表单类型 */ +export type FormType = 'confirm' | 'create' | 'detail' | 'finish' | 'update'; + +/** 表头是否只读(确认、完成、详情态) */ +function isHeaderReadonly(formType: FormType): boolean { + return ['confirm', 'detail', 'finish'].includes(formType); +} + +/** 新增/修改的表单 */ +export function useFormSchema( + formType: FormType, + formApi?: VbenFormApi, +): VbenFormSchema[] { + const headerReadonly = isHeaderReadonly(formType); + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'parentId', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'status', + label: '工单状态', + component: 'Select', + componentProps: { + disabled: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_STATUS, 'number'), + }, + dependencies: { + triggerFields: [''], + show: () => formType !== 'create', + }, + }, + { + fieldName: 'code', + label: '工单编码', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入工单编码', + }, + rules: 'required', + suffix: + formType === 'create' || formType === 'update' + ? () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.PRO_WORK_ORDER_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ) + : undefined, + }, + { + fieldName: 'name', + label: '工单名称', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入工单名称', + }, + rules: 'required', + }, + { + fieldName: 'orderSourceType', + label: '工单来源', + component: 'Select', + componentProps: { + disabled: headerReadonly, + options: getDictOptions( + DICT_TYPE.MES_PRO_WORK_ORDER_SOURCE_TYPE, + 'number', + ), + placeholder: '请选择工单来源', + // 工单来源变更:非客户订单时清空来源单据编号和客户 + onChange: async (value: number) => { + if (value !== MesProWorkOrderSourceTypeEnum.ORDER) { + await formApi?.setValues({ + clientId: undefined, + orderSourceCode: undefined, + }); + } + }, + }, + rules: 'selectRequired', + }, + { + fieldName: 'orderSourceCode', + label: '来源单据编号', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入来源单据编号', + }, + dependencies: { + triggerFields: ['orderSourceType'], + show: (values) => + values.orderSourceType === MesProWorkOrderSourceTypeEnum.ORDER, + }, + }, + { + fieldName: 'type', + label: '工单类型', + component: 'Select', + componentProps: { + disabled: headerReadonly, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_TYPE, 'number'), + placeholder: '请选择工单类型', + // 工单类型变更:非代工/采购时清空供应商 + onChange: async (value: number) => { + if ( + value !== MesProWorkOrderTypeEnum.OUTSOURCE && + value !== MesProWorkOrderTypeEnum.PURCHASE + ) { + await formApi?.setFieldValue('vendorId', undefined); + } + }, + }, + rules: 'selectRequired', + }, + { + fieldName: 'productId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择产品', + }, + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '工单数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + disabled: headerReadonly, + min: 1, + placeholder: '请输入工单数量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择客户', + }, + dependencies: { + triggerFields: ['orderSourceType'], + show: (values) => + values.orderSourceType === MesProWorkOrderSourceTypeEnum.ORDER, + }, + }, + { + fieldName: 'vendorId', + label: '供应商', + component: markRaw(MdVendorSelect), + componentProps: { + disabled: headerReadonly, + placeholder: '请选择供应商', + }, + dependencies: { + triggerFields: ['type'], + show: (values) => + values.type === MesProWorkOrderTypeEnum.OUTSOURCE || + values.type === MesProWorkOrderTypeEnum.PURCHASE, + }, + }, + { + fieldName: 'batchCode', + label: '批次号', + component: 'Input', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'requestDate', + label: '需求日期', + component: 'DatePicker', + componentProps: { + class: '!w-full', + disabled: headerReadonly, + format: 'YYYY-MM-DD', + placeholder: '请选择需求日期', + valueFormat: 'x', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-3', + componentProps: { + disabled: headerReadonly, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工单编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单编码', + }, + }, + { + fieldName: 'name', + label: '工单名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单名称', + }, + }, + { + fieldName: 'orderSourceCode', + label: '来源单据', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入来源单据编号', + }, + }, + { + fieldName: 'productId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'type', + label: '工单类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_TYPE, 'number'), + placeholder: '请选择工单类型', + }, + }, + { + fieldName: 'requestDate', + label: '需求日期', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '工单编码', + fixed: 'left', + width: 200, + treeNode: true, + slots: { default: 'code' }, + }, + { + field: 'name', + title: '工单名称', + minWidth: 150, + }, + { + field: 'type', + title: '工单类型', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_TYPE }, + }, + }, + { + field: 'orderSourceType', + title: '工单来源', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_SOURCE_TYPE }, + }, + }, + { + field: 'orderSourceCode', + title: '来源单据编号', + width: 140, + }, + { + field: 'productCode', + title: '产品编码', + width: 120, + }, + { + field: 'productName', + title: '产品名称', + minWidth: 120, + }, + { + field: 'productSpecification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'quantity', + title: '工单数量', + width: 100, + }, + { + field: 'quantityProduced', + title: '已生产数量', + width: 100, + }, + { + field: 'clientCode', + title: '客户编码', + width: 120, + }, + { + field: 'clientName', + title: '客户名称', + width: 120, + }, + { + field: 'requestDate', + title: '需求日期', + width: 180, + formatter: 'formatDate', + }, + { + field: 'status', + title: '工单状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 240, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 工单 BOM 子表的字段 */ +export function useBomGridColumns( + editable: boolean, + generatable: boolean, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: 'BOM 物料编码', + width: 120, + }, + { + field: 'itemName', + title: 'BOM 物料名称', + minWidth: 150, + }, + { + field: 'itemSpecification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'quantity', + title: '预计使用量', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 120, + }, + ...(editable || generatable + ? [ + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + } as const, + ] + : []), + ]; +} + +/** 工单 BOM 新增/修改的表单 */ +export function useBomFormSchema( + isCreate: boolean, + productId?: number, + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'itemId', + label: '物料', + component: markRaw(MdProductBomSelect), + componentProps: { + itemId: productId, + placeholder: '请选择物料', + // BOM 物料选中后自动回填预计使用量 + onChange: async (bom?: MesMdProductBomApi.ProductBom) => { + await formApi?.setFieldValue('quantity', bom?.quantity ?? undefined); + }, + }, + rules: 'selectRequired', + dependencies: { + triggerFields: [''], + show: () => isCreate, + }, + }, + { + fieldName: 'itemName', + label: '物料', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: [''], + show: () => !isCreate, + }, + }, + { + fieldName: 'unitMeasureName', + label: '单位', + component: 'Input', + componentProps: { + disabled: true, + }, + dependencies: { + triggerFields: [''], + show: () => !isCreate, + }, + }, + { + fieldName: 'quantity', + label: '预计使用量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 0, + placeholder: '请输入预计使用量', + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 工单选择弹窗的搜索表单 */ +export function useWorkOrderSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '工单编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单编码', + }, + }, + { + fieldName: 'name', + label: '工单名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入工单名称', + }, + }, + { + fieldName: 'productId', + label: '产品', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'status', + label: '工单状态', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_ORDER_STATUS, 'number'), + placeholder: '请选择工单状态', + }, + }, + ]; +} + +/** 工单选择弹窗的字段 */ +export function useWorkOrderSelectGridColumns( + multiple = false, +): VxeTableGridOptions['columns'] { + return [ + { + type: multiple ? 'checkbox' : 'radio', + width: 50, + }, + { + field: 'code', + title: '工单编码', + width: 180, + }, + { + field: 'name', + title: '工单名称', + minWidth: 180, + }, + { + field: 'orderSourceType', + title: '工单来源', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_SOURCE_TYPE }, + }, + }, + { + field: 'orderSourceCode', + title: '订单编号', + width: 140, + }, + { + field: 'productCode', + title: '产品编号', + width: 120, + }, + { + field: 'productName', + title: '产品名称', + minWidth: 150, + }, + { + field: 'productSpecification', + title: '规格型号', + minWidth: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'quantity', + title: '工单数量', + width: 100, + }, + { + field: 'clientCode', + title: '客户编码', + width: 120, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 120, + }, + { + field: 'status', + title: '工单状态', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_ORDER_STATUS }, + }, + }, + { + field: 'requestDate', + title: '需求日期', + width: 120, + formatter: 'formatDate', + }, + ]; +} + +/** 工单物料需求子表的字段(只读) */ +export function useItemGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'itemCode', + title: '物料编码', + width: 120, + }, + { + field: 'itemName', + title: '物料名称', + minWidth: 150, + }, + { + field: 'itemSpecification', + title: '规格型号', + width: 120, + }, + { + field: 'unitMeasureName', + title: '单位', + width: 80, + }, + { + field: 'itemOrProduct', + title: '物料/产品', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_MD_ITEM_OR_PRODUCT }, + }, + }, + { + field: 'quantity', + title: '需求数量', + width: 120, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/index.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/index.vue new file mode 100644 index 000000000..0de9f778d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/index.vue @@ -0,0 +1,242 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-form.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-form.vue new file mode 100644 index 000000000..da06cffaf --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-form.vue @@ -0,0 +1,101 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-list.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-list.vue new file mode 100644 index 000000000..72c2ed02b --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/bom-list.vue @@ -0,0 +1,181 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/modules/form.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/form.vue new file mode 100644 index 000000000..dca7f971a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/form.vue @@ -0,0 +1,295 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workorder/modules/item-list.vue b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/item-list.vue new file mode 100644 index 000000000..7832dd209 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workorder/modules/item-list.vue @@ -0,0 +1,45 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workrecord/data.ts b/apps/web-antdv-next/src/views/mes/pro/workrecord/data.ts new file mode 100644 index 000000000..685fb6ad8 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workrecord/data.ts @@ -0,0 +1,107 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesProWorkRecordApi } from '#/api/mes/pro/workrecord'; +import type { SystemUserApi } from '#/api/system/user'; + +import { markRaw } from 'vue'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { getSimpleUserList } from '#/api/system/user'; +import { getRangePickerDefaultProps } from '#/utils'; +import { MdWorkstationSelect } from '#/views/mes/md/workstation/components'; + +/** 关联数据 */ +let userList: SystemUserApi.User[] = []; +getSimpleUserList().then((data) => (userList = data)); + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'userId', + label: '用户', + component: 'ApiSelect', + componentProps: { + allowClear: true, + api: getSimpleUserList, + labelField: 'nickname', + placeholder: '请选择用户', + valueField: 'id', + }, + }, + { + fieldName: 'workstationId', + label: '工作站', + component: markRaw(MdWorkstationSelect), + componentProps: { + placeholder: '请选择工作站', + }, + }, + { + fieldName: 'type', + label: '操作类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_PRO_WORK_RECORD_TYPE, 'number'), + placeholder: '请选择操作类型', + }, + }, + { + fieldName: 'createTime', + label: '操作时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + width: 80, + }, + { + field: 'userId', + title: '用户', + width: 140, + formatter: ({ row }) => + row.userNickname || + userList.find((user) => user.id === row.userId)?.nickname || + '', + }, + { + field: 'workstationCode', + title: '工作站编码', + width: 140, + }, + { + field: 'workstationName', + title: '工作站名称', + minWidth: 160, + }, + { + field: 'type', + title: '操作类型', + width: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_PRO_WORK_RECORD_TYPE }, + }, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/pro/workrecord/index.vue b/apps/web-antdv-next/src/views/mes/pro/workrecord/index.vue new file mode 100644 index 000000000..65cfb1547 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workrecord/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/pro/workrecord/modules/status-bar.vue b/apps/web-antdv-next/src/views/mes/pro/workrecord/modules/status-bar.vue new file mode 100644 index 000000000..665e5357f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/pro/workrecord/modules/status-bar.vue @@ -0,0 +1,115 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/batchtrace/data.ts b/apps/web-antdv-next/src/views/mes/qc/batchtrace/data.ts new file mode 100644 index 000000000..35f141214 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/batchtrace/data.ts @@ -0,0 +1,229 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesWmBatchApi } from '#/api/mes/wm/batch'; +import type { DescriptionItemSchema } from '#/components/description'; + +import { markRaw } from 'vue'; + +import { MdClientSelect } from '#/views/mes/md/client/components'; +import { MdItemSelect } from '#/views/mes/md/item/components'; +import { MdVendorSelect } from '#/views/mes/md/vendor/components'; + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '批次号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入批次号', + }, + }, + { + fieldName: 'itemId', + label: '产品物料', + component: markRaw(MdItemSelect), + componentProps: { + placeholder: '请选择产品物料', + }, + }, + { + fieldName: 'vendorId', + label: '供应商', + component: markRaw(MdVendorSelect), + componentProps: { + placeholder: '请选择供应商', + }, + }, + { + fieldName: 'clientId', + label: '客户', + component: markRaw(MdClientSelect), + componentProps: { + placeholder: '请选择客户', + }, + }, + { + fieldName: 'salesOrderCode', + label: '销售订单编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入销售订单编号', + }, + }, + { + fieldName: 'purchaseOrderCode', + label: '采购订单编号', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入采购订单编号', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '批次编号', + minWidth: 160, + }, + { + field: 'itemCode', + title: '产品物料编码', + minWidth: 140, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 160, + }, + { + field: 'itemSpecification', + title: '规格型号', + minWidth: 140, + }, + { + field: 'unitName', + title: '单位', + width: 80, + }, + { + field: 'vendorCode', + title: '供应商编码', + minWidth: 140, + }, + { + field: 'vendorName', + title: '供应商名称', + minWidth: 160, + }, + { + field: 'clientCode', + title: '客户编码', + minWidth: 140, + }, + { + field: 'clientName', + title: '客户名称', + minWidth: 160, + }, + { + field: 'salesOrderCode', + title: '销售订单编号', + minWidth: 160, + }, + { + field: 'purchaseOrderCode', + title: '采购订单编号', + minWidth: 160, + }, + { + title: '操作', + width: 110, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 追溯明细列表的字段 */ +export function useTraceGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'workOrderCode', + title: '生产工单号', + width: 160, + }, + { + field: 'code', + title: '批次编号', + minWidth: 160, + }, + { + field: 'itemCode', + title: '产品物料编码', + minWidth: 140, + }, + { + field: 'itemName', + title: '产品物料名称', + minWidth: 160, + }, + { + field: 'itemSpecification', + title: '规格型号', + minWidth: 140, + }, + { + field: 'unitName', + title: '单位', + width: 80, + }, + ]; +} + +/** 批次追溯详情的描述字段 */ +export function useDetailSchema(): DescriptionItemSchema[] { + return [ + { + field: 'code', + label: '批次编号', + }, + { + field: 'itemCode', + label: '物资编码', + }, + { + field: 'itemName', + label: '物资名称', + }, + { + field: 'itemSpecification', + label: '规格型号', + span: 3, + }, + { + field: 'purchaseOrderCode', + label: '采购订单编号', + }, + { + field: 'vendorCode', + label: '供应商编码', + }, + { + field: 'vendorName', + label: '供应商名称', + }, + { + field: 'salesOrderCode', + label: '销售订单编号', + }, + { + field: 'clientCode', + label: '客户编码', + }, + { + field: 'clientName', + label: '客户名称', + }, + { + field: 'lotNumber', + label: '生产批号', + }, + { + field: 'workOrderCode', + label: '生产工单', + }, + { + field: 'workstationCode', + label: '工作站编码', + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/qc/batchtrace/index.vue b/apps/web-antdv-next/src/views/mes/qc/batchtrace/index.vue new file mode 100644 index 000000000..2a88c3b6d --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/batchtrace/index.vue @@ -0,0 +1,81 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-detail.vue b/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-detail.vue new file mode 100644 index 000000000..8d82676dc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-detail.vue @@ -0,0 +1,58 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-list.vue b/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-list.vue new file mode 100644 index 000000000..ea23377d1 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/batchtrace/modules/trace-list.vue @@ -0,0 +1,67 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/defect/data.ts b/apps/web-antdv-next/src/views/mes/qc/defect/data.ts new file mode 100644 index 000000000..72aa613b0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defect/data.ts @@ -0,0 +1,185 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcDefectApi } from '#/api/mes/qc/defect'; + +import { h } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + placeholder: '请输入缺陷编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_DEFECT_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Textarea', + componentProps: { + placeholder: '请输入缺陷描述', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '缺陷编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入缺陷编码', + }, + }, + { + fieldName: 'name', + label: '缺陷描述', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入缺陷描述', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '缺陷编码', + width: 140, + }, + { + field: 'name', + title: '缺陷描述', + minWidth: 200, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'level', + title: '缺陷等级', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DEFECT_LEVEL }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/qc/defect/index.vue b/apps/web-antdv-next/src/views/mes/qc/defect/index.vue new file mode 100644 index 000000000..b8198b94a --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defect/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/defect/modules/form.vue b/apps/web-antdv-next/src/views/mes/qc/defect/modules/form.vue new file mode 100644 index 000000000..db3521a67 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defect/modules/form.vue @@ -0,0 +1,83 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/data.ts b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/data.ts new file mode 100644 index 000000000..4047517e0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/data.ts @@ -0,0 +1,93 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcDefectRecordApi } from '#/api/mes/qc/defectrecord'; + +import { DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +/** 表单类型 */ +export type FormType = 'create' | 'update'; + +/** 新增/修改缺陷记录的表单 */ +export function useDefectRecordInlineFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '缺陷描述', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入缺陷描述', + rows: 2, + }, + rules: 'required', + }, + { + fieldName: 'level', + label: '缺陷等级', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_DEFECT_LEVEL, 'number'), + placeholder: '请选择缺陷等级', + }, + rules: 'selectRequired', + }, + { + fieldName: 'quantity', + label: '缺陷数量', + component: 'InputNumber', + componentProps: { + class: '!w-full', + min: 1, + placeholder: '请输入缺陷数量', + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Input', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + }, + }, + ]; +} + +/** 缺陷记录列表的字段 */ +export function useDefectRecordInlineGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'name', + title: '缺陷描述', + minWidth: 200, + }, + { + field: 'level', + title: '缺陷等级', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_DEFECT_LEVEL }, + }, + }, + { + field: 'quantity', + title: '缺陷数量', + width: 100, + }, + { + field: 'remark', + title: '备注', + minWidth: 150, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/index.ts b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/index.ts new file mode 100644 index 000000000..b616a60e5 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/index.ts @@ -0,0 +1,2 @@ +export { default as DefectRecordInlineForm } from './inline-form.vue'; +export { default as DefectRecordInlineList } from './inline-list.vue'; diff --git a/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-form.vue b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-form.vue new file mode 100644 index 000000000..897e030f0 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-form.vue @@ -0,0 +1,124 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-list.vue b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-list.vue new file mode 100644 index 000000000..ad90b1988 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/defectrecord/components/inline-list.vue @@ -0,0 +1,184 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/components/index.ts b/apps/web-antdv-next/src/views/mes/qc/indicator/components/index.ts new file mode 100644 index 000000000..0a8f2d6a7 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/components/index.ts @@ -0,0 +1,3 @@ +export { default as QcIndicatorResultSpecificationInput } from './result-specification-input.vue'; +export { default as QcIndicatorSelectDialog } from './select-dialog.vue'; +export { default as QcIndicatorSelect } from './select.vue'; diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/components/result-specification-input.vue b/apps/web-antdv-next/src/views/mes/qc/indicator/components/result-specification-input.vue new file mode 100644 index 000000000..734b35c0f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/components/result-specification-input.vue @@ -0,0 +1,76 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/components/select-dialog.vue b/apps/web-antdv-next/src/views/mes/qc/indicator/components/select-dialog.vue new file mode 100644 index 000000000..a04e86d21 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/components/select-dialog.vue @@ -0,0 +1,201 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/components/select.vue b/apps/web-antdv-next/src/views/mes/qc/indicator/components/select.vue new file mode 100644 index 000000000..ea0bf26dc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/components/select.vue @@ -0,0 +1,130 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/data.ts b/apps/web-antdv-next/src/views/mes/qc/indicator/data.ts new file mode 100644 index 000000000..074014601 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/data.ts @@ -0,0 +1,288 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcIndicatorApi } from '#/api/mes/qc/indicator'; + +import { h, markRaw } from 'vue'; + +import { DICT_TYPE, MesAutoCodeRuleCode, MesQcResultValueType } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +import { QcIndicatorResultSpecificationInput } from './components'; + +/** 新增/修改的表单 */ +export function useFormSchema(formApi?: VbenFormApi): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + maxlength: 64, + placeholder: '请输入检测项编码', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_INDICATOR_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '自动生成' }, + ), + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测项名称', + }, + rules: 'required', + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + rules: 'required', + }, + { + fieldName: 'tool', + label: '检测工具', + component: 'Input', + componentProps: { + maxlength: 100, + placeholder: '请输入检测工具', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + allowClear: true, + // 结果值类型变化时清空结果值属性 + onChange: () => + formApi?.setFieldValue('resultSpecification', undefined), + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + rules: 'required', + }, + { + fieldName: 'resultSpecification', + label: '结果值属性', + component: markRaw(QcIndicatorResultSpecificationInput), + // 按结果值类型在组件内部切换文件类型 RadioGroup / 字典类型 ApiSelect + dependencies: { + triggerFields: ['resultType'], + if: (values) => + values.resultType === MesQcResultValueType.FILE || + values.resultType === MesQcResultValueType.DICT, + componentProps: (values) => ({ + resultType: values.resultType, + }), + }, + rules: 'required', + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + componentProps: { + maxlength: 250, + placeholder: '请输入备注', + rows: 3, + }, + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'code', + label: '检测项编码', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项编码', + }, + }, + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + { + fieldName: 'resultType', + label: '结果值类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_QC_RESULT_TYPE, 'number'), + placeholder: '请选择结果值类型', + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 140, + }, + { + field: 'resultType', + title: '结果值类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_QC_RESULT_TYPE }, + }, + }, + { + field: 'remark', + title: '备注', + minWidth: 160, + }, + { + field: 'createTime', + title: '创建时间', + width: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 160, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + +/** 选择弹窗的搜索表单 */ +export function useSelectGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '检测项名称', + component: 'Input', + componentProps: { + allowClear: true, + placeholder: '请输入检测项名称', + }, + }, + { + fieldName: 'type', + label: '检测项类型', + component: 'Select', + componentProps: { + allowClear: true, + options: getDictOptions(DICT_TYPE.MES_INDICATOR_TYPE, 'number'), + placeholder: '请选择检测项类型', + }, + }, + ]; +} + +/** 选择弹窗的字段 */ +export function useSelectGridColumns( + multiple = true, +): VxeTableGridOptions['columns'] { + return [ + { + type: multiple ? 'checkbox' : 'radio', + width: 50, + }, + { + field: 'code', + title: '检测项编码', + width: 140, + }, + { + field: 'name', + title: '检测项名称', + minWidth: 160, + }, + { + field: 'type', + title: '检测项类型', + width: 120, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.MES_INDICATOR_TYPE }, + }, + }, + { + field: 'tool', + title: '检测工具', + width: 120, + }, + { + field: 'remark', + title: '备注', + minWidth: 140, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/index.vue b/apps/web-antdv-next/src/views/mes/qc/indicator/index.vue new file mode 100644 index 000000000..1595cba63 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/index.vue @@ -0,0 +1,151 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicator/modules/form.vue b/apps/web-antdv-next/src/views/mes/qc/indicator/modules/form.vue new file mode 100644 index 000000000..a4de33638 --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicator/modules/form.vue @@ -0,0 +1,89 @@ + + + diff --git a/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/data.ts b/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/data.ts new file mode 100644 index 000000000..8ee978b0f --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/data.ts @@ -0,0 +1,98 @@ +import type { VbenFormApi, VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { MesQcIndicatorResultApi } from '#/api/mes/qc/indicatorresult'; + +import { h } from 'vue'; + +import { MesAutoCodeRuleCode } from '@vben/constants'; + +import { Button } from 'antdv-next'; + +import { generateAutoCode } from '#/api/mes/md/autocode/record'; + +/** 表单类型 */ +export type FormType = 'create' | 'update'; + +/** 新增/修改检测结果的表单 */ +export function useQcIndicatorResultFormSchema( + formApi?: VbenFormApi, +): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'code', + label: '样品编号', + component: 'Input', + componentProps: { + placeholder: '请输入样品编号', + }, + rules: 'required', + suffix: () => + h( + Button, + { + type: 'default', + onClick: async () => { + const code = await generateAutoCode( + MesAutoCodeRuleCode.QC_INDICATOR_RESULT_CODE, + ); + await formApi?.setFieldValue('code', code); + }, + }, + { default: () => '生成' }, + ), + }, + { + fieldName: 'sn', + label: '物资 SN', + component: 'Input', + componentProps: { + placeholder: '请输入物资 SN', + }, + }, + { + fieldName: 'remark', + label: '备注', + component: 'Textarea', + formItemClass: 'col-span-2', + componentProps: { + placeholder: '请输入备注', + rows: 2, + }, + }, + ]; +} + +/** 检测结果列表的字段 */ +export function useQcIndicatorResultGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'code', + title: '样品编号', + width: 200, + }, + { + field: 'sn', + title: '物资SN', + minWidth: 200, + }, + { + field: 'remark', + title: '备注', + minWidth: 200, + }, + { + title: '操作', + width: 150, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/form.vue b/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/form.vue new file mode 100644 index 000000000..4556606dc --- /dev/null +++ b/apps/web-antdv-next/src/views/mes/qc/indicatorresult/components/form.vue @@ -0,0 +1,218 @@ + + +