4 changed files with 761 additions and 4 deletions
-
20src/api/rack/closedLoop.js
-
97src/views/modules/rack/execution-control.vue
-
220src/views/modules/rack/external-device-config.vue
-
428src/views/modules/rack/package-label-management.vue
@ -0,0 +1,220 @@ |
|||||
|
<template> |
||||
|
<div class="mod-config"> |
||||
|
<el-card> |
||||
|
<div slot="header" class="card-title-row"> |
||||
|
<span>外采设备配置</span> |
||||
|
<el-button plain class="add-btn" @click="openDialog()">新增设备</el-button> |
||||
|
</div> |
||||
|
<el-form :inline="true" label-position="top" class="query-form"> |
||||
|
<el-form-item label="设备编码"> |
||||
|
<el-input v-model.trim="searchData.deviceCode" clearable placeholder="例如 PLC-L01-01" style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="设备名称"> |
||||
|
<el-input v-model.trim="searchData.deviceName" clearable placeholder="模糊查询" style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="线体"> |
||||
|
<el-input v-model.trim="searchData.lineId" clearable placeholder="例如 LINE-01" style="width: 140px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="状态"> |
||||
|
<el-select v-model="searchData.status" clearable placeholder="全部" style="width: 120px"> |
||||
|
<el-option label="启用" value="启用" /> |
||||
|
<el-option label="停用" value="停用" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label=" "> |
||||
|
<el-button plain class="search-btn" :loading="loading" @click="loadList">查询</el-button> |
||||
|
<el-button plain class="reset-btn" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
|
||||
|
<el-table class="data-table" :data="dataList" border stripe style="width:100%" v-loading="loading" :height="tableHeight"> |
||||
|
<el-table-column type="index" width="50" /> |
||||
|
<el-table-column prop="deviceCode" label="设备编码" width="160" /> |
||||
|
<el-table-column prop="deviceName" label="设备名称" width="170" /> |
||||
|
<el-table-column prop="deviceType" label="设备类型" width="90" /> |
||||
|
<el-table-column prop="sourceType" label="数据源" width="90" /> |
||||
|
<el-table-column prop="lineId" label="线体" width="100" /> |
||||
|
<el-table-column prop="stationId" label="站点ID" width="140" /> |
||||
|
<el-table-column prop="stepCode" label="工序编码" width="130" /> |
||||
|
<el-table-column label="地址" min-width="160"> |
||||
|
<template slot-scope="scope">{{ `${scope.row.ip || '-'}:${scope.row.port || '-'}` }}</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column prop="unitId" label="UnitId" width="90" /> |
||||
|
<el-table-column prop="status" label="状态" width="90" /> |
||||
|
<el-table-column label="最近心跳" min-width="170"> |
||||
|
<template slot-scope="scope">{{ formatDateTime(scope.row.lastHeartbeatTime) }}</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" width="160" fixed="right"> |
||||
|
<template slot-scope="scope"> |
||||
|
<a @click="openDialog(scope.row)">修改</a> |
||||
|
<a style="color:#F56C6C;margin-left:10px" @click="handleDelete(scope.row)">删除</a> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-card> |
||||
|
|
||||
|
<el-dialog |
||||
|
:title="form.deviceId ? '修改外采设备' : '新增外采设备'" |
||||
|
:visible.sync="dialogVisible" |
||||
|
width="760px" |
||||
|
:close-on-click-modal="false" |
||||
|
v-drag> |
||||
|
<el-form :model="form" label-position="top" class="device-form"> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="8"><el-form-item label="设备编码" required><el-input v-model.trim="form.deviceCode" :disabled="!!form.deviceId" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="设备名称"><el-input v-model.trim="form.deviceName" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="设备类型"><el-input v-model.trim="form.deviceType" /></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="8"><el-form-item label="数据源类型"><el-input v-model.trim="form.sourceType" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="线体"><el-input v-model.trim="form.lineId" placeholder="例如 LINE-01" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="状态"><el-select v-model="form.status" style="width:100%"><el-option label="启用" value="启用" /><el-option label="停用" value="停用" /></el-select></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="8"><el-form-item label="站点ID"><el-input v-model.trim="form.stationId" placeholder="例如 PLC-POOL-001" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="工序编码" required><el-input v-model.trim="form.stepCode" placeholder="例如 POOL-001" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="UnitId"><el-input-number v-model="form.unitId" :min="1" :precision="0" style="width:100%" /></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="12"><el-form-item label="IP"><el-input v-model.trim="form.ip" placeholder="例如 192.168.1.10" /></el-form-item></el-col> |
||||
|
<el-col :span="12"><el-form-item label="端口"><el-input-number v-model="form.port" :min="1" :precision="0" style="width:100%" /></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-form-item label="备注"><el-input v-model.trim="form.remark" type="textarea" :rows="3" /></el-form-item> |
||||
|
</el-form> |
||||
|
<span slot="footer" class="dialog-footer"> |
||||
|
<el-button plain class="reset-btn" @click="dialogVisible = false">取消</el-button> |
||||
|
<el-button plain class="add-btn" :loading="submitLoading" @click="submit">保存</el-button> |
||||
|
</span> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { |
||||
|
listExternalDevice, |
||||
|
saveExternalDevice, |
||||
|
updateExternalDevice, |
||||
|
deleteExternalDevice |
||||
|
} from '@/api/rack/closedLoop' |
||||
|
|
||||
|
const emptyForm = () => ({ |
||||
|
deviceId: null, |
||||
|
deviceCode: '', |
||||
|
deviceName: '', |
||||
|
deviceType: 'PLC', |
||||
|
sourceType: 'PLC', |
||||
|
lineId: '', |
||||
|
stationId: '', |
||||
|
stepCode: '', |
||||
|
ip: '', |
||||
|
port: 502, |
||||
|
unitId: 1, |
||||
|
status: '启用', |
||||
|
remark: '' |
||||
|
}) |
||||
|
|
||||
|
export default { |
||||
|
data () { |
||||
|
return { |
||||
|
tableHeight: window.innerHeight - 290, |
||||
|
loading: false, |
||||
|
submitLoading: false, |
||||
|
dialogVisible: false, |
||||
|
dataList: [], |
||||
|
searchData: { |
||||
|
deviceCode: '', |
||||
|
deviceName: '', |
||||
|
lineId: '', |
||||
|
status: '' |
||||
|
}, |
||||
|
form: emptyForm() |
||||
|
} |
||||
|
}, |
||||
|
mounted () { |
||||
|
this.loadList() |
||||
|
}, |
||||
|
methods: { |
||||
|
async loadList () { |
||||
|
this.loading = true |
||||
|
try { |
||||
|
const { data } = await listExternalDevice(this.searchData) |
||||
|
this.dataList = data.rows || [] |
||||
|
} finally { |
||||
|
this.loading = false |
||||
|
} |
||||
|
}, |
||||
|
resetQuery () { |
||||
|
this.searchData = { |
||||
|
deviceCode: '', |
||||
|
deviceName: '', |
||||
|
lineId: '', |
||||
|
status: '' |
||||
|
} |
||||
|
this.loadList() |
||||
|
}, |
||||
|
openDialog (row) { |
||||
|
this.form = row |
||||
|
? { |
||||
|
...emptyForm(), |
||||
|
...row |
||||
|
} |
||||
|
: emptyForm() |
||||
|
this.dialogVisible = true |
||||
|
}, |
||||
|
async submit () { |
||||
|
if (!this.form.deviceCode || !this.form.stepCode) { |
||||
|
this.$message.warning('请填写设备编码和工序编码') |
||||
|
return |
||||
|
} |
||||
|
this.submitLoading = true |
||||
|
try { |
||||
|
if (this.form.deviceId) { |
||||
|
await updateExternalDevice(this.form) |
||||
|
this.$message.success('修改成功') |
||||
|
} else { |
||||
|
await saveExternalDevice(this.form) |
||||
|
this.$message.success('新增成功') |
||||
|
} |
||||
|
this.dialogVisible = false |
||||
|
await this.loadList() |
||||
|
} finally { |
||||
|
this.submitLoading = false |
||||
|
} |
||||
|
}, |
||||
|
async handleDelete (row) { |
||||
|
try { |
||||
|
await this.$confirm(`确认删除外采设备:${row.deviceCode} 吗?`, '提示', { type: 'warning' }) |
||||
|
await deleteExternalDevice(row.deviceId) |
||||
|
this.$message.success('删除成功') |
||||
|
await this.loadList() |
||||
|
} catch (e) {} |
||||
|
}, |
||||
|
formatDateTime (value) { |
||||
|
if (!value) { |
||||
|
return '-' |
||||
|
} |
||||
|
const date = new Date(value) |
||||
|
if (Number.isNaN(date.getTime())) { |
||||
|
return value |
||||
|
} |
||||
|
const pad = n => String(n).padStart(2, '0') |
||||
|
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}` |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.card-title-row { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.query-form { |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
.dialog-footer { |
||||
|
display: inline-flex; |
||||
|
gap: 8px; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,428 @@ |
|||||
|
<template> |
||||
|
<div class="mod-config"> |
||||
|
<el-card> |
||||
|
<div slot="header" class="card-title-row"> |
||||
|
<span>扫码包装与标签打印</span> |
||||
|
</div> |
||||
|
<el-tabs v-model="activeTab"> |
||||
|
<el-tab-pane label="包装作业" name="package"> |
||||
|
<el-form :inline="true" label-position="top" class="query-form"> |
||||
|
<el-form-item label="包装单号"> |
||||
|
<el-input v-model.trim="packageQuery.packageNo" clearable style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="任务单号"> |
||||
|
<el-input v-model.trim="packageQuery.jobCode" clearable style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="批次编码"> |
||||
|
<el-input v-model.trim="packageQuery.batchCode" clearable style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="状态"> |
||||
|
<el-select v-model="packageQuery.status" clearable style="width: 120px"> |
||||
|
<el-option label="待打印" value="待打印" /> |
||||
|
<el-option label="已打印" value="已打印" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label=" "> |
||||
|
<el-button plain class="search-btn" :loading="packageLoading" @click="loadPackageList">查询</el-button> |
||||
|
<el-button plain class="add-btn" @click="openPackageDialog()">新增包装单</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<el-table class="data-table" :data="packageList" border stripe style="width:100%" :height="tableHeight" v-loading="packageLoading"> |
||||
|
<el-table-column type="index" width="50" /> |
||||
|
<el-table-column prop="packageNo" label="包装单号" width="170" /> |
||||
|
<el-table-column prop="jobCode" label="任务单号" width="160" /> |
||||
|
<el-table-column prop="batchCode" label="批次编码" width="150" /> |
||||
|
<el-table-column prop="rackCode" label="挂具码" width="120" /> |
||||
|
<el-table-column prop="qty" label="数量" width="100" /> |
||||
|
<el-table-column prop="status" label="状态" width="100" /> |
||||
|
<el-table-column prop="labelTemplateCode" label="标签模板" width="140" /> |
||||
|
<el-table-column label="最近打印" min-width="170"> |
||||
|
<template slot-scope="scope">{{ formatDateTime(scope.row.lastPrintTime) }}</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" width="260" fixed="right"> |
||||
|
<template slot-scope="scope"> |
||||
|
<a @click="openPackageDialog(scope.row)">修改</a> |
||||
|
<a style="margin-left: 10px" @click="openPrintDialog(scope.row)">打印标签</a> |
||||
|
<a style="margin-left: 10px" @click="loadPrintLogs(scope.row.packageNo)">打印记录</a> |
||||
|
<a style="color:#F56C6C;margin-left:10px" @click="deletePackage(scope.row)">删除</a> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-tab-pane> |
||||
|
|
||||
|
<el-tab-pane label="标签模板" name="template"> |
||||
|
<el-form :inline="true" label-position="top" class="query-form"> |
||||
|
<el-form-item label="模板编码"> |
||||
|
<el-input v-model.trim="templateQuery.templateCode" clearable style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="模板名称"> |
||||
|
<el-input v-model.trim="templateQuery.templateName" clearable style="width: 180px" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="状态"> |
||||
|
<el-select v-model="templateQuery.status" clearable style="width: 120px"> |
||||
|
<el-option label="启用" value="启用" /> |
||||
|
<el-option label="停用" value="停用" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label=" "> |
||||
|
<el-button plain class="search-btn" :loading="templateLoading" @click="loadTemplateList">查询</el-button> |
||||
|
<el-button plain class="add-btn" @click="openTemplateDialog()">新增模板</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<el-table class="data-table" :data="templateList" border stripe style="width:100%" :height="tableHeight" v-loading="templateLoading"> |
||||
|
<el-table-column type="index" width="50" /> |
||||
|
<el-table-column prop="templateCode" label="模板编码" width="160" /> |
||||
|
<el-table-column prop="templateName" label="模板名称" width="180" /> |
||||
|
<el-table-column prop="status" label="状态" width="90" /> |
||||
|
<el-table-column prop="templateContent" label="模板内容" min-width="320" show-overflow-tooltip /> |
||||
|
<el-table-column label="操作" width="160" fixed="right"> |
||||
|
<template slot-scope="scope"> |
||||
|
<a @click="openTemplateDialog(scope.row)">修改</a> |
||||
|
<a style="color:#F56C6C;margin-left:10px" @click="deleteTemplate(scope.row)">删除</a> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-tab-pane> |
||||
|
</el-tabs> |
||||
|
</el-card> |
||||
|
|
||||
|
<el-card style="margin-top: 12px;"> |
||||
|
<div slot="header" class="card-title-row"> |
||||
|
<span>标签打印日志</span> |
||||
|
<span class="sub-text">{{ printLogKeyword ? `当前筛选:${printLogKeyword}` : '默认显示最近记录' }}</span> |
||||
|
</div> |
||||
|
<el-table class="data-table" :data="printLogList" border stripe style="width:100%" max-height="260" v-loading="printLogLoading"> |
||||
|
<el-table-column type="index" width="50" /> |
||||
|
<el-table-column prop="printNo" label="打印流水号" width="190" /> |
||||
|
<el-table-column prop="packageNo" label="包装单号" width="170" /> |
||||
|
<el-table-column prop="templateCode" label="模板编码" width="130" /> |
||||
|
<el-table-column prop="printSeq" label="序号" width="80" /> |
||||
|
<el-table-column prop="printStatus" label="状态" width="90" /> |
||||
|
<el-table-column prop="operatorName" label="操作人" width="120" /> |
||||
|
<el-table-column label="打印时间" min-width="170"> |
||||
|
<template slot-scope="scope">{{ formatDateTime(scope.row.printTime) }}</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-card> |
||||
|
|
||||
|
<el-dialog |
||||
|
:title="packageForm.packageId ? '修改包装单' : '新增包装单'" |
||||
|
:visible.sync="packageDialogVisible" |
||||
|
width="720px" |
||||
|
:close-on-click-modal="false" |
||||
|
v-drag> |
||||
|
<el-form :model="packageForm" label-position="top"> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="12"> |
||||
|
<el-form-item label="任务单号" required> |
||||
|
<el-select v-model="packageForm.jobCode" filterable clearable placeholder="请选择任务单号" style="width:100%"> |
||||
|
<el-option v-for="item in jobOptions" :key="item.jobCode" :label="`${item.jobCode} / ${item.status || '-'}`" :value="item.jobCode" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
</el-col> |
||||
|
<el-col :span="12"><el-form-item label="批次编码"><el-input v-model.trim="packageForm.batchCode" /></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="12"><el-form-item label="挂具码"><el-input v-model.trim="packageForm.rackCode" /></el-form-item></el-col> |
||||
|
<el-col :span="12"><el-form-item label="数量"><el-input-number v-model="packageForm.qty" :min="0" :precision="0" style="width:100%" /></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-form-item label="备注"><el-input v-model.trim="packageForm.remark" type="textarea" :rows="3" /></el-form-item> |
||||
|
</el-form> |
||||
|
<span slot="footer"> |
||||
|
<el-button plain class="reset-btn" @click="packageDialogVisible = false">取消</el-button> |
||||
|
<el-button plain class="add-btn" :loading="packageSubmitLoading" @click="submitPackage">保存</el-button> |
||||
|
</span> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<el-dialog |
||||
|
:title="templateForm.templateId ? '修改标签模板' : '新增标签模板'" |
||||
|
:visible.sync="templateDialogVisible" |
||||
|
width="720px" |
||||
|
:close-on-click-modal="false" |
||||
|
v-drag> |
||||
|
<el-form :model="templateForm" label-position="top"> |
||||
|
<el-row :gutter="12"> |
||||
|
<el-col :span="8"><el-form-item label="模板编码" required><el-input v-model.trim="templateForm.templateCode" :disabled="!!templateForm.templateId" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="模板名称" required><el-input v-model.trim="templateForm.templateName" /></el-form-item></el-col> |
||||
|
<el-col :span="8"><el-form-item label="状态"><el-select v-model="templateForm.status" style="width:100%"><el-option label="启用" value="启用" /><el-option label="停用" value="停用" /></el-select></el-form-item></el-col> |
||||
|
</el-row> |
||||
|
<el-form-item label="模板内容" required> |
||||
|
<el-input |
||||
|
v-model.trim="templateForm.templateContent" |
||||
|
type="textarea" |
||||
|
:rows="6" |
||||
|
placeholder="支持占位符:{{packageNo}} {{jobCode}} {{batchCode}} {{rackCode}} {{qty}}" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="备注"><el-input v-model.trim="templateForm.remark" /></el-form-item> |
||||
|
</el-form> |
||||
|
<span slot="footer"> |
||||
|
<el-button plain class="reset-btn" @click="templateDialogVisible = false">取消</el-button> |
||||
|
<el-button plain class="add-btn" :loading="templateSubmitLoading" @click="submitTemplate">保存</el-button> |
||||
|
</span> |
||||
|
</el-dialog> |
||||
|
|
||||
|
<el-dialog |
||||
|
title="标签打印" |
||||
|
:visible.sync="printDialogVisible" |
||||
|
width="520px" |
||||
|
:close-on-click-modal="false" |
||||
|
v-drag> |
||||
|
<el-form :model="printForm" label-position="top"> |
||||
|
<el-form-item label="包装单号"><el-input v-model="printForm.packageNo" disabled /></el-form-item> |
||||
|
<el-form-item label="标签模板" required> |
||||
|
<el-select v-model="printForm.templateCode" filterable style="width:100%"> |
||||
|
<el-option v-for="item in enabledTemplateList" :key="item.templateCode" :label="`${item.templateCode} / ${item.templateName}`" :value="item.templateCode" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="打印份数"><el-input-number v-model="printForm.copies" :min="1" :precision="0" style="width:100%" /></el-form-item> |
||||
|
</el-form> |
||||
|
<span slot="footer"> |
||||
|
<el-button plain class="reset-btn" @click="printDialogVisible = false">取消</el-button> |
||||
|
<el-button plain class="add-btn" :loading="printSubmitting" @click="submitPrint">执行打印</el-button> |
||||
|
</span> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { |
||||
|
listPackageOrder, |
||||
|
savePackageOrder, |
||||
|
updatePackageOrder, |
||||
|
deletePackageOrderByNo, |
||||
|
listLabelTemplate, |
||||
|
saveLabelTemplate, |
||||
|
updateLabelTemplate, |
||||
|
deleteLabelTemplateByCode, |
||||
|
printPackageLabel, |
||||
|
listLabelPrintLog, |
||||
|
listJob |
||||
|
} from '@/api/rack/closedLoop' |
||||
|
|
||||
|
const emptyPackageForm = () => ({ |
||||
|
packageId: null, |
||||
|
jobCode: '', |
||||
|
batchCode: '', |
||||
|
rackCode: '', |
||||
|
qty: 0, |
||||
|
remark: '' |
||||
|
}) |
||||
|
|
||||
|
const emptyTemplateForm = () => ({ |
||||
|
templateId: null, |
||||
|
templateCode: '', |
||||
|
templateName: '', |
||||
|
templateContent: '', |
||||
|
status: '启用', |
||||
|
remark: '' |
||||
|
}) |
||||
|
|
||||
|
export default { |
||||
|
data () { |
||||
|
return { |
||||
|
activeTab: 'package', |
||||
|
tableHeight: window.innerHeight - 330, |
||||
|
jobOptions: [], |
||||
|
packageLoading: false, |
||||
|
templateLoading: false, |
||||
|
printLogLoading: false, |
||||
|
packageSubmitLoading: false, |
||||
|
templateSubmitLoading: false, |
||||
|
printSubmitting: false, |
||||
|
packageDialogVisible: false, |
||||
|
templateDialogVisible: false, |
||||
|
printDialogVisible: false, |
||||
|
packageQuery: { packageNo: '', jobCode: '', batchCode: '', status: '' }, |
||||
|
templateQuery: { templateCode: '', templateName: '', status: '' }, |
||||
|
packageList: [], |
||||
|
templateList: [], |
||||
|
printLogList: [], |
||||
|
printLogKeyword: '', |
||||
|
packageForm: emptyPackageForm(), |
||||
|
templateForm: emptyTemplateForm(), |
||||
|
printForm: { |
||||
|
packageNo: '', |
||||
|
templateCode: '', |
||||
|
copies: 1 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
enabledTemplateList () { |
||||
|
return (this.templateList || []).filter(item => item && item.status === '启用') |
||||
|
} |
||||
|
}, |
||||
|
mounted () { |
||||
|
this.bootstrap() |
||||
|
}, |
||||
|
methods: { |
||||
|
async bootstrap () { |
||||
|
await Promise.all([ |
||||
|
this.loadJobOptions(), |
||||
|
this.loadPackageList(), |
||||
|
this.loadTemplateList(), |
||||
|
this.loadPrintLogs('') |
||||
|
]) |
||||
|
}, |
||||
|
async loadJobOptions () { |
||||
|
const { data } = await listJob({}) |
||||
|
this.jobOptions = data.rows || [] |
||||
|
}, |
||||
|
async loadPackageList () { |
||||
|
this.packageLoading = true |
||||
|
try { |
||||
|
const { data } = await listPackageOrder(this.packageQuery) |
||||
|
this.packageList = data.rows || [] |
||||
|
} finally { |
||||
|
this.packageLoading = false |
||||
|
} |
||||
|
}, |
||||
|
async loadTemplateList () { |
||||
|
this.templateLoading = true |
||||
|
try { |
||||
|
const { data } = await listLabelTemplate(this.templateQuery) |
||||
|
this.templateList = data.rows || [] |
||||
|
} finally { |
||||
|
this.templateLoading = false |
||||
|
} |
||||
|
}, |
||||
|
async loadPrintLogs (packageNo) { |
||||
|
this.printLogLoading = true |
||||
|
try { |
||||
|
this.printLogKeyword = packageNo || '' |
||||
|
const { data } = await listLabelPrintLog(packageNo ? { packageNo } : {}) |
||||
|
this.printLogList = data.rows || [] |
||||
|
} finally { |
||||
|
this.printLogLoading = false |
||||
|
} |
||||
|
}, |
||||
|
openPackageDialog (row) { |
||||
|
this.packageForm = row |
||||
|
? { |
||||
|
...emptyPackageForm(), |
||||
|
...row |
||||
|
} |
||||
|
: emptyPackageForm() |
||||
|
this.packageDialogVisible = true |
||||
|
}, |
||||
|
openTemplateDialog (row) { |
||||
|
this.templateForm = row |
||||
|
? { |
||||
|
...emptyTemplateForm(), |
||||
|
...row |
||||
|
} |
||||
|
: emptyTemplateForm() |
||||
|
this.templateDialogVisible = true |
||||
|
}, |
||||
|
openPrintDialog (row) { |
||||
|
this.printForm = { |
||||
|
packageNo: row.packageNo, |
||||
|
templateCode: row.labelTemplateCode || ((this.enabledTemplateList[0] && this.enabledTemplateList[0].templateCode) || ''), |
||||
|
copies: 1 |
||||
|
} |
||||
|
this.printDialogVisible = true |
||||
|
}, |
||||
|
async submitPackage () { |
||||
|
if (!this.packageForm.jobCode) { |
||||
|
this.$message.warning('请先选择任务单号') |
||||
|
return |
||||
|
} |
||||
|
this.packageSubmitLoading = true |
||||
|
try { |
||||
|
if (this.packageForm.packageId) { |
||||
|
await updatePackageOrder(this.packageForm) |
||||
|
this.$message.success('修改成功') |
||||
|
} else { |
||||
|
await savePackageOrder(this.packageForm) |
||||
|
this.$message.success('新增成功') |
||||
|
} |
||||
|
this.packageDialogVisible = false |
||||
|
await this.loadPackageList() |
||||
|
} finally { |
||||
|
this.packageSubmitLoading = false |
||||
|
} |
||||
|
}, |
||||
|
async submitTemplate () { |
||||
|
if (!this.templateForm.templateCode || !this.templateForm.templateName || !this.templateForm.templateContent) { |
||||
|
this.$message.warning('请完整填写模板信息') |
||||
|
return |
||||
|
} |
||||
|
this.templateSubmitLoading = true |
||||
|
try { |
||||
|
if (this.templateForm.templateId) { |
||||
|
await updateLabelTemplate(this.templateForm) |
||||
|
this.$message.success('修改成功') |
||||
|
} else { |
||||
|
await saveLabelTemplate(this.templateForm) |
||||
|
this.$message.success('新增成功') |
||||
|
} |
||||
|
this.templateDialogVisible = false |
||||
|
await this.loadTemplateList() |
||||
|
} finally { |
||||
|
this.templateSubmitLoading = false |
||||
|
} |
||||
|
}, |
||||
|
async submitPrint () { |
||||
|
if (!this.printForm.packageNo || !this.printForm.templateCode) { |
||||
|
this.$message.warning('请选择打印模板') |
||||
|
return |
||||
|
} |
||||
|
this.printSubmitting = true |
||||
|
try { |
||||
|
const { data } = await printPackageLabel(this.printForm) |
||||
|
const result = data.result || {} |
||||
|
this.$message.success(`打印完成,份数:${result.copies || this.printForm.copies}`) |
||||
|
this.printDialogVisible = false |
||||
|
await Promise.all([ |
||||
|
this.loadPackageList(), |
||||
|
this.loadPrintLogs(this.printForm.packageNo) |
||||
|
]) |
||||
|
} finally { |
||||
|
this.printSubmitting = false |
||||
|
} |
||||
|
}, |
||||
|
async deletePackage (row) { |
||||
|
try { |
||||
|
await this.$confirm(`确认删除包装单:${row.packageNo} 吗?`, '提示', { type: 'warning' }) |
||||
|
await deletePackageOrderByNo(row.packageNo) |
||||
|
this.$message.success('删除成功') |
||||
|
await this.loadPackageList() |
||||
|
} catch (e) {} |
||||
|
}, |
||||
|
async deleteTemplate (row) { |
||||
|
try { |
||||
|
await this.$confirm(`确认删除模板:${row.templateCode} 吗?`, '提示', { type: 'warning' }) |
||||
|
await deleteLabelTemplateByCode(row.templateCode) |
||||
|
this.$message.success('删除成功') |
||||
|
await this.loadTemplateList() |
||||
|
} catch (e) {} |
||||
|
}, |
||||
|
formatDateTime (value) { |
||||
|
if (!value) { |
||||
|
return '-' |
||||
|
} |
||||
|
const date = new Date(value) |
||||
|
if (Number.isNaN(date.getTime())) { |
||||
|
return value |
||||
|
} |
||||
|
const pad = n => String(n).padStart(2, '0') |
||||
|
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}` |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.card-title-row { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.query-form { |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
.sub-text { |
||||
|
color: #909399; |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
</style> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue