From e823dee9ffeb07fd26413b50cfdd720a286cea55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98937886381=E2=80=99?= <‘937886381@qq.com’> Date: Mon, 17 Mar 2025 14:18:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/equipment/base/maintain/record.js | 2 +- src/mixins/lb/basicPageMixin.js | 2 +- .../components/deliveryLogDetail.vue | 12 +- .../deliveryLog/components/editDetail.vue | 29 +- .../components/deliveryLogDetDetail.vue | 113 +---- .../components/detailButton.vue | 253 ++++++++++ .../deliveryLogDet/components/shippingBtn.vue | 153 ++++++ src/views/delivery/deliveryLogDet/index.vue | 32 +- .../components/energyPlcParamAdd.vue | 9 +- .../equipment/analysis/efficiency/index.vue | 6 +- .../equipment/base/alarm/Record/index.vue | 23 +- .../base/inspection/Confirm/index.vue | 7 +- .../base/maintain/Monitor/showDetail.vue | 9 +- .../items/components/add-or-updata.vue | 4 +- .../equipment/base/maintain/items/index.vue | 2 +- .../base/maintain/items/showDetail.vue | 15 +- .../base/repair/CustomDialogForm.vue | 211 +++++---- .../equipment/base/repair/Repair--add.vue | 126 +---- .../equipment/base/repair/detail-btn.vue | 53 +++ src/views/equipment/base/repair/detail.vue | 421 +++++++++++++++++ src/views/equipment/base/repair/index.vue | 151 +++--- .../base/spareParts/Config/addSparts.vue | 10 +- .../equipment/timing-diagram/status/index.vue | 2 +- .../processEquMaterialBom/add-or-updata.vue | 2 +- .../processEquValueBom/add-or-updata.vue | 5 - src/views/extend/processFlow/index.vue | 6 +- .../components/BomSelector.vue | 8 +- .../components/ProcessBomList.vue | 12 +- .../components/ProcessInfo.vue | 70 +-- .../components/ProcessBomList.vue | 4 +- src/views/material/material/add-or-updata.vue | 11 +- .../material/materialProductBom/attr-add.vue | 6 +- .../material/materialUseLog/add-or-updata.vue | 201 +++----- src/views/packaging/custom/SmallTitle.vue | 65 +++ src/views/packaging/custom/index.vue | 409 ++++++++++++++++ src/views/packaging/custom/preview.vue | 89 ++++ src/views/packaging/custom/print-data.js | 90 ++++ src/views/packaging/custom/providers.js | 245 ++++++++++ src/views/packaging/mixins/basic-add.js | 100 ++++ src/views/packaging/mixins/basic-page.js | 170 +++++++ src/views/packaging/mixins/code-filter.js | 85 ++++ .../packagingPrintLog/SmallTitle.vue | 65 +++ .../packagingPrintLog/add-or-updata.vue | 418 +++++++++++++++++ .../packaging/packagingPrintLog/index.vue | 356 ++++++++++++++ .../packaging/packagingPrintLog/unitDict.vue | 15 + .../packagingPrintModel/SmallTitle.vue | 65 +++ .../packagingPrintModel/add-or-updata.vue | 441 ++++++++++++++++++ .../packaging/packagingPrintModel/index.vue | 215 +++++++++ .../packagingPrintModel/unitDict.vue | 15 + .../packagingPrintType/SmallTitle.vue | 65 +++ .../packagingPrintType/add-or-updata.vue | 347 ++++++++++++++ .../packaging/packagingPrintType/index.vue | 191 ++++++++ .../packaging/packagingPrintType/unitDict.vue | 15 + src/views/quality/currentData/currentTest.vue | 2 +- src/views/quality/currentData/hourData.vue | 47 +- 55 files changed, 4835 insertions(+), 645 deletions(-) create mode 100644 src/views/delivery/deliveryLogDet/components/detailButton.vue create mode 100644 src/views/delivery/deliveryLogDet/components/shippingBtn.vue create mode 100644 src/views/equipment/base/repair/detail-btn.vue create mode 100644 src/views/equipment/base/repair/detail.vue create mode 100644 src/views/packaging/custom/SmallTitle.vue create mode 100644 src/views/packaging/custom/index.vue create mode 100644 src/views/packaging/custom/preview.vue create mode 100644 src/views/packaging/custom/print-data.js create mode 100644 src/views/packaging/custom/providers.js create mode 100644 src/views/packaging/mixins/basic-add.js create mode 100644 src/views/packaging/mixins/basic-page.js create mode 100644 src/views/packaging/mixins/code-filter.js create mode 100644 src/views/packaging/packagingPrintLog/SmallTitle.vue create mode 100644 src/views/packaging/packagingPrintLog/add-or-updata.vue create mode 100644 src/views/packaging/packagingPrintLog/index.vue create mode 100644 src/views/packaging/packagingPrintLog/unitDict.vue create mode 100644 src/views/packaging/packagingPrintModel/SmallTitle.vue create mode 100644 src/views/packaging/packagingPrintModel/add-or-updata.vue create mode 100644 src/views/packaging/packagingPrintModel/index.vue create mode 100644 src/views/packaging/packagingPrintModel/unitDict.vue create mode 100644 src/views/packaging/packagingPrintType/SmallTitle.vue create mode 100644 src/views/packaging/packagingPrintType/add-or-updata.vue create mode 100644 src/views/packaging/packagingPrintType/index.vue create mode 100644 src/views/packaging/packagingPrintType/unitDict.vue diff --git a/src/api/equipment/base/maintain/record.js b/src/api/equipment/base/maintain/record.js index f6cf896e..ddf7c9a3 100644 --- a/src/api/equipment/base/maintain/record.js +++ b/src/api/equipment/base/maintain/record.js @@ -81,7 +81,7 @@ export function deleteLogDet(id) { export function getEqMaintainPlanPageData(query) { return request({ - url: '/base/equipment-maintain-plan-det/page', + url: '/base/equipment-maintain-log-det/page', method: 'get', params: query }) diff --git a/src/mixins/lb/basicPageMixin.js b/src/mixins/lb/basicPageMixin.js index 6c75636b..6d81c2f2 100644 --- a/src/mixins/lb/basicPageMixin.js +++ b/src/mixins/lb/basicPageMixin.js @@ -113,7 +113,7 @@ export default { console.log(btn); // const keys = ['name', 'createTime']; // timeVal // 已被 searchBarKeys 替代 - switch (btn.btnName) { + switch (btn.btnName) { case 'search': this.searchBarKeys.forEach((key) => { if (key == 'timeVal') { diff --git a/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue b/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue index 41ff8883..b71cc4f0 100644 --- a/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue +++ b/src/views/delivery/deliveryLog/components/deliveryLogDetail.vue @@ -93,6 +93,16 @@ const tableProps = [ label: '装箱规格(片/箱)', width: 150 }, + { + prop: 'contactPerson', + label: '车辆联系人', + width: 150 + }, + { + prop: 'contactPersonCall', + label: '联系方式', + width: 150 + }, { prop: 'packagingNum', label: '箱数' @@ -221,4 +231,4 @@ export default { padding:32px 32px 30px 30px; height: calc(100vh - 125px); } -</style> \ No newline at end of file +</style> diff --git a/src/views/delivery/deliveryLog/components/editDetail.vue b/src/views/delivery/deliveryLog/components/editDetail.vue index 97373334..9f21dc47 100644 --- a/src/views/delivery/deliveryLog/components/editDetail.vue +++ b/src/views/delivery/deliveryLog/components/editDetail.vue @@ -8,26 +8,29 @@ </el-col> <el-col :span='12'> <el-form-item label="装车时间" prop="loadTime"> - <el-date-picker - v-model="form.loadTime" - type="datetime" - format='yyyy-MM-dd HH:mm:ss' - value-format="timestamp" - style="width: 100%;" - placeholder="选择日期"> + <el-date-picker v-model="form.loadTime" type="datetime" format='yyyy-MM-dd HH:mm:ss' value-format="timestamp" + style="width: 100%;" placeholder="选择日期"> </el-date-picker> </el-form-item> </el-col> </el-row> + <el-row :gutter="24"> + <el-col :span='12'> + <el-form-item label="车辆联系人" prop="contactPerson"> + <el-input v-model="form.contactPerson"></el-input> + </el-form-item> + </el-col> + <el-col :span='12'> + <el-form-item label="联系方式" prop="contactPersonCall"> + <el-input v-model="form.contactPersonCall"></el-input> + </el-form-item> + </el-col> + </el-row> <el-row> <el-col :span='12'> <el-form-item label="装车产品" prop="productId"> <el-select v-model="form.productId" disabled placeholder="请选择" style="width: 100%;"> - <el-option - v-for="item in productList" - :key="item.id" - :label="item.name" - :value="item.id"> + <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> @@ -121,4 +124,4 @@ export default { } } } -</script> \ No newline at end of file +</script> diff --git a/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue b/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue index fda599ad..00a27c44 100644 --- a/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue +++ b/src/views/delivery/deliveryLogDet/components/deliveryLogDetDetail.vue @@ -44,14 +44,14 @@ :table-data="tableData" :max-height="tableH" > - <method-btn + <!-- <method-btn v-if="tableBtn.length" slot="handleBtn" :width="80" label="操作" :method-list="tableBtn" @clickBtn="viewDetDetail" - /> + /> --> </base-table> <pagination :page.sync="queryParams.pageNo" @@ -63,7 +63,7 @@ </el-tab-pane> <el-tab-pane label="环形图" name="barChart"> <div v-if="activeName === 'barChart'"> - <div + <div id="logDetPieBar" style="width: 60%" :style="{ height: chartHeight + 'px' }" @@ -73,51 +73,14 @@ </el-tabs> </div> <!-- 详情抽屉 --> - <el-drawer - title="发货详情" - size="50%" - :append-to-body="true" - :visible.sync="innerDrawer" - @close='closeB' - :show-close='false'> - <div class="box3"> - <el-row> - <el-col :span='12'> - <span class="title">订单名:</span> - <span class="text">{{orderMsg.orderName ? orderMsg.orderName : '-'}}</span> - </el-col> - <el-col :span='12'> - <span class="title">发货单号:</span> - <span class="text">{{logCode ? logCode : '-'}}</span> - </el-col> - </el-row> - </div> - <div class="box4"> - <div class="boxTitle"> - <span class="blueTitle"></span> - <span>详情</span> - </div> - <base-table - :page="queryParams2.pageNo" - :limit="queryParams2.pageSize" - :table-props="tableProps2" - :table-data="tableData2" - :max-height="tableH2" - /> - <pagination - :page.sync="queryParams2.pageNo" - :limit.sync="queryParams2.pageSize" - :total="total2" - @pagination="getList2" - /> - </div> - </el-drawer> </el-drawer> </template> <script> import { deliveryLogPage, deliveryLogDetPage } from '@/api/base/delivery' import { parseTime } from '@/utils/ruoyi' import * as echarts from 'echarts' +import detailButton from './detailButton'; + import resize from '@/utils/chartMixins/resize' const tableProps = [ { @@ -142,55 +105,21 @@ const tableProps = [ { prop: 'rate', label: '发货比列(%)', - width: 110 + width: 110, + filter: (val) => + val != null ? `${(val).toFixed(2)}%` : '', }, { prop: 'principalCost', label: '运输费用' + }, + { + prop: 'desc', + label: '装车详情', + subcomponent: detailButton, } ] -const tableProps2 = [ - { - prop: 'createTime', - label: '添加时间', - filter: parseTime, - minWidth: 160 - }, - { - prop: 'deliveryCarCode', - label: '装车单号', - showOverflowtooltip: true - }, - { - prop: 'loadTime', - label: '装车时间', - filter: parseTime, - minWidth: 160 - }, - { - prop: 'productName', - label: '装车产品', - showOverflowtooltip: true - }, - { - prop: 'packagingSize', - label: '装箱规格(片/箱)', - minWidth: 140 - }, - { - prop: 'packagingNum', - label: '箱数' - }, - { - prop: 'quantity', - label: '装车总量' - }, - { - prop: 'productDate', - label: '产品批次', - showOverflowtooltip: true - } -] + export default { name: 'DeliveryLogDetDetail', mixins: [resize], @@ -224,7 +153,6 @@ export default { pageSize: 20, logId: '' }, - tableProps2, tableData2: [], tableH2: this.tableHeight(275), total2: 0, @@ -288,7 +216,7 @@ export default { for (let i = 0; i < this.tableData.length; i++) { let obj = {} obj.value = this.tableData[i].num - obj.name = this.tableData[i].name + obj.name = this.tableData[i].code seriesData.push(obj) if (i < 5) { colorList.push(color[i]) @@ -394,14 +322,7 @@ export default { this.total2 = res.data.total || 0 }) }, - closeB() { - this.logCode = '' - this.queryParams2.pageNo = 1 - this.queryParams2.pageSize = 20 - this.queryParams2.logId = '' - this.tableData2 = [] - this.total2 = 0 - } + } } </script> @@ -498,4 +419,4 @@ export default { color: rgba(0, 0, 0, 0.45); } } -</style> \ No newline at end of file +</style> diff --git a/src/views/delivery/deliveryLogDet/components/detailButton.vue b/src/views/delivery/deliveryLogDet/components/detailButton.vue new file mode 100644 index 00000000..fd315300 --- /dev/null +++ b/src/views/delivery/deliveryLogDet/components/detailButton.vue @@ -0,0 +1,253 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-03 14:09:18 + * @LastEditors: DY + * @LastEditTime: 2023-10-13 16:47:25 + * @Description: +--> +<template> + <div class="tableInner"> + <el-button @click="viewDetDetail" type="text" style="margin: 5px 0; padding: 0" > + <span class="iconfont" :class="'icon-detail' + + ' primary-color' + "></span> + </el-button> + <el-drawer title="发货详情" size="50%" :append-to-body="true" :visible.sync="innerDrawer" @close='closeB' + :show-close='false'> + <div class="box3"> + <el-row> + <el-col :span='12'> + <span class="title">订单名:</span> + <span class="text">{{ orderMsg.orderName ? orderMsg.orderName : '-' }}</span> + </el-col> + <el-col :span='12'> + <span class="title">发货单号:</span> + <span class="text">{{ logCode ? logCode : '-' }}</span> + </el-col> + </el-row> + </div> + <div class="box4"> + <div class="boxTitle"> + <span class="blueTitle"></span> + <span>详情</span> + </div> + <base-table :page="queryParams2.pageNo" :limit="queryParams2.pageSize" :table-props="tableProps2" + :table-data="tableData2" :max-height="tableH2" /> + <pagination :page.sync="queryParams2.pageNo" :limit.sync="queryParams2.pageSize" :total="total2" + @pagination="getList2" /> + </div> + </el-drawer> + </div> +</template> +<script> +import { deliveryLogDetPage } from '@/api/base/delivery' +import { parseTime } from '@/utils/ruoyi' + +const tableProps2 = [ + // { + // prop: 'createTime', + // label: '添加时间', + // filter: parseTime, + // minWidth: 160 + // }, + { + prop: 'deliveryCarCode', + label: '装车单号', + showOverflowtooltip: true + }, + { + prop: 'loadTime', + label: '装车时间', + filter: parseTime, + minWidth: 160 + }, + { + prop: 'productName', + label: '装车产品', + showOverflowtooltip: true + }, + { + prop: 'packagingSize', + label: '装箱规格(片/箱)', + minWidth: 140 + }, + { + prop: 'packagingNum', + label: '箱数' + }, + { + prop: 'quantity', + label: '装车总量' + }, + { + prop: 'productDate', + label: '产品批次', + showOverflowtooltip: true + } +] +export default { + props: { + injectData: { + type: Object, + default: () => ({}), + }, + }, + data() { + return { + list: this.injectData, + visible: false, + tableProps2, + logCode:'', + orderMsg: {}, + tableData2: [], + tableH2: this.tableHeight(275), + total2: 0, + innerDrawer:false, + queryParams2: { + pageNo: 1, + pageSize: 20, + logId: '' + }, + }; + }, + mounted() { + window.addEventListener('resize', () => { + this.tableH2 = this.tableHeight(275) + }) + }, + methods: { + viewDetDetail() { + console.log(this.list); + + this.logCode = this.list.code + this.orderMsg.orderName = this.list.orderName + this.innerDrawer = true + this.queryParams2.logId = this.list.id + this.getList2() + }, + closeB() { + this.logCode = '' + this.queryParams2.pageNo = 1 + this.queryParams2.pageSize = 20 + this.queryParams2.logId = '' + this.tableData2 = [] + this.total2 = 0 + }, + getList2() { + deliveryLogDetPage({ ...this.queryParams2 }).then(res => { + this.tableData2 = res.data.list || [] + this.total2 = res.data.total || 0 + }) + }, + }, +}; +</script> +<style scoped lang='scss'> +.box1 { + height: 76px; + border-bottom: 1px solid #E9E9E9; + margin: 0px 8px 20px 30px; + + .box_col { + display: inline-block; + width: 20%; + padding: 8px 8px 8px 8px; + + .blodTip { + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + margin-bottom: 8px; + } + + .lightTip { + height: 16px; + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + } + } +} + +.box2 { + padding: 0px 32px 30px 30px; + height: calc(100vh - 150px); +} + +.boxTitle { + display: inline-block; + font-size: 16px; + font-weight: 400; + color: #000000; + margin: 0 10px 10px 0; +} + +.blueTitle { + content: ''; + display: inline-block; + width: 4px; + height: 18px; + background-color: #0B58FF; + border-radius: 1px; + margin-right: 8px; + vertical-align: bottom; +} + +.box3 { + padding: 8px 8px 8px 40px; + + .title { + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + } + + .text { + height: 16px; + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + } +} + +.box4 { + padding: 32px 32px 30px 30px; + height: calc(100vh - 125px); +} +</style> +<style lang='scss'> +.deliveryLogDetail { + .el-tabs__nav::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + background-color: #e4e7ed; + /* z-index: 1; */ + } + + .el-tabs__nav-wrap::after { + width: 0; + } + + .el-tabs__item { + padding: 0 10px; + } + + .el-tabs__item:hover { + color: rgba(0, 0, 0, 0.85); + } + + .el-tabs__item.is-active { + color: rgba(0, 0, 0, 0.85); + } + + .el-tabs__item { + color: rgba(0, 0, 0, 0.45); + } +} +</style> diff --git a/src/views/delivery/deliveryLogDet/components/shippingBtn.vue b/src/views/delivery/deliveryLogDet/components/shippingBtn.vue new file mode 100644 index 00000000..d270b985 --- /dev/null +++ b/src/views/delivery/deliveryLogDet/components/shippingBtn.vue @@ -0,0 +1,153 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-03 14:09:18 + * @LastEditors: DY + * @LastEditTime: 2023-10-13 16:47:25 + * @Description: +--> +<template> + <div class="tableInner"> + <el-button @click="handleClick" type="text" style="margin: 5px 0; padding: 0"> + <span class="iconfont" :class="'icon-detail' + + ' primary-color' + "></span> + </el-button> + <delivery-log-det-detail ref='deliveryLogDetail' /> + </div> +</template> +<script> +import DeliveryLogDetDetail from './deliveryLogDetDetail.vue' +export default { + props: { + injectData: { + type: Object, + default: () => ({}), + }, + }, + data() { + return { + list: this.injectData, + }; + }, + components: { DeliveryLogDetDetail }, + + mounted() { + }, + methods: { + handleClick() { + this.$nextTick(() => { + this.$refs.deliveryLogDetail.init(this.list) + }) + } + }, +}; +</script> +<style scoped lang='scss'> +.box1 { + height: 76px; + border-bottom: 1px solid #E9E9E9; + margin: 0px 8px 20px 30px; + + .box_col { + display: inline-block; + width: 20%; + padding: 8px 8px 8px 8px; + + .blodTip { + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + margin-bottom: 8px; + } + + .lightTip { + height: 16px; + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + } + } +} + +.box2 { + padding: 0px 32px 30px 30px; + height: calc(100vh - 150px); +} + +.boxTitle { + display: inline-block; + font-size: 16px; + font-weight: 400; + color: #000000; + margin: 0 10px 10px 0; +} + +.blueTitle { + content: ''; + display: inline-block; + width: 4px; + height: 18px; + background-color: #0B58FF; + border-radius: 1px; + margin-right: 8px; + vertical-align: bottom; +} + +.box3 { + padding: 8px 8px 8px 40px; + + .title { + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + } + + .text { + height: 16px; + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + } +} + +.box4 { + padding: 32px 32px 30px 30px; + height: calc(100vh - 125px); +} +</style> +<style lang='scss'> +.deliveryLogDetail { + .el-tabs__nav::after { + content: ""; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 2px; + background-color: #e4e7ed; + /* z-index: 1; */ + } + + .el-tabs__nav-wrap::after { + width: 0; + } + + .el-tabs__item { + padding: 0 10px; + } + + .el-tabs__item:hover { + color: rgba(0, 0, 0, 0.85); + } + + .el-tabs__item.is-active { + color: rgba(0, 0, 0, 0.85); + } + + .el-tabs__item { + color: rgba(0, 0, 0, 0.45); + } +} +</style> diff --git a/src/views/delivery/deliveryLogDet/index.vue b/src/views/delivery/deliveryLogDet/index.vue index dc02ec0c..74c003f9 100644 --- a/src/views/delivery/deliveryLogDet/index.vue +++ b/src/views/delivery/deliveryLogDet/index.vue @@ -14,14 +14,14 @@ :table-data="list" :max-height="tableH" > - <method-btn + <!-- <method-btn v-if="tableBtn.length" slot="handleBtn" :width="80" label="操作" :method-list="tableBtn" @clickBtn="handleClick" - /> + /> --> </base-table> <pagination :page.sync="queryParams.pageNo" @@ -30,12 +30,13 @@ @pagination="getList" /> <!-- 详情抽屉 --> - <delivery-log-det-detail ref='deliveryLogDetail'/> + <!-- <delivery-log-det-detail ref='deliveryLogDetail'/> --> </div> </template> <script> import { deliveryProgressPage } from '@/api/base/delivery' -import DeliveryLogDetDetail from './components/deliveryLogDetDetail.vue' + +import shippingBtn from './components/shippingBtn.vue'; const tableProps = [ { prop: 'orderName', @@ -61,7 +62,12 @@ const tableProps = [ }, { prop: 'rate', - label: '累计发货比例(%)' + label: '发货进度(%)' + }, + { + prop: 'desc', + label: '发货详情', + subcomponent: shippingBtn, } ] export default { @@ -101,7 +107,7 @@ export default { ].filter((v) => v) } }, - components: { DeliveryLogDetDetail }, + // components: { DeliveryLogDetDetail }, created() { window.addEventListener('resize', () => { this.tableH = this.tableHeight(260) @@ -119,12 +125,12 @@ export default { this.queryParams.orderName = val.orderName this.getList() }, - handleClick(val) { - console.log(val) - this.$nextTick(() => { - this.$refs.deliveryLogDetail.init(val.data) - }) - } + // handleClick(val) { + // console.log(val) + // this.$nextTick(() => { + // this.$refs.deliveryLogDetail.init(val.data) + // }) + // } } } -</script> \ No newline at end of file +</script> diff --git a/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue b/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue index 6eed9ca8..42ea0551 100644 --- a/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue +++ b/src/views/devConfig/energy/energyPlcConnect/components/energyPlcParamAdd.vue @@ -3,7 +3,7 @@ <el-row> <el-col :span="12"> <el-form-item label="能源类型" prop="typeId"> - <el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;" filterable> + <el-select v-model="form.typeId" placeholder="请选择" style="width: 100%;" filterable @change="getUnit"> <el-option v-for="item in energyListType" :key="item.id" @@ -79,6 +79,13 @@ export default { } }, methods: { + getUnit(val) { + this.energyListType.forEach((item) => { + if (val === item.id) { + this.form.unit = item.unit + } + }) + }, init(param) { this.form.connectId = param.connectId getEnergyTypeListAll().then((res) => { diff --git a/src/views/equipment/analysis/efficiency/index.vue b/src/views/equipment/analysis/efficiency/index.vue index 94d7571a..a96eadd5 100644 --- a/src/views/equipment/analysis/efficiency/index.vue +++ b/src/views/equipment/analysis/efficiency/index.vue @@ -331,7 +331,7 @@ export default { queryParams: { lineId: null, factoryId: null, - recordTime: [], + recordTime: undefined, }, // 表单参数 form: {}, @@ -410,15 +410,13 @@ export default { this.queryParams.factoryId = payload.factoryId || null; this.queryParams.lineId = payload.lineId || null; if (0 == payload.dateFilterType) { - this.queryParams.recordTime = payload.timerange; + this.queryParams.recordTime = payload.timerange ? payload.timerange :undefined } else if (1 == payload.dateFilterType) { this.queryParams.recordTime = [ `${payload.timeday} 00:00:00`, `${payload.timeday} 23:59:59`, ]; } - } else { - this.queryParams.recordTime = null; } this.getList(); }, diff --git a/src/views/equipment/base/alarm/Record/index.vue b/src/views/equipment/base/alarm/Record/index.vue index 53da57d8..8d9dc49e 100644 --- a/src/views/equipment/base/alarm/Record/index.vue +++ b/src/views/equipment/base/alarm/Record/index.vue @@ -39,13 +39,6 @@ @close="cancel" @cancel="cancel" @confirm="submitForm"> - <!-- <DialogForm - v-if="open" - ref="form" - v-model="form" - :disabled="mode == 'detail'" - :has-files="false" - :rows="rows" /> --> <AddOrUpdate v-if="open" ref="addOrUpdate" @@ -119,22 +112,22 @@ export default { // : undefined, ].filter((v) => v), tableProps: [ - { prop: 'productionLine', label: '产线', width: 120, showOverflowtooltip: true }, - { prop: 'workshopSection', label: '工段', width: 120, showOverflowtooltip: true }, - { prop: 'equipment', label: '设备名称', width: 120, showOverflowtooltip: true }, + { prop: 'productionLine', label: '产线', showOverflowtooltip: true }, + { prop: 'workshopSection', label: '工段',showOverflowtooltip: true }, + { prop: 'equipment', label: '设备名称', showOverflowtooltip: true }, { prop: 'alarmGrade', label: '报警级别', filter: publicFormatter(this.DICT_TYPE.EQU_ALARM_LEVEL), }, - { prop: 'createTime', label: '报警时间', filter: timeFilter, width: 150, showOverflowtooltip: true }, - { prop: 'alarmCode', label: '设备报警码', width: 180, showOverflowtooltip: true }, - { prop: 'alarmContent', label: '报警内容', width: 150, showOverflowtooltip: true }, + { prop: 'createTime', label: '报警时间', filter: timeFilter, showOverflowtooltip: true }, + { prop: 'alarmCode', label: '设备报警码', showOverflowtooltip: true }, + { prop: 'alarmContent', label: '报警内容', showOverflowtooltip: true }, this.$auth.hasPermiAnd([ 'monitoring:equipment-alarm-log:query', 'base:equipment-alarm-hand:query' ]) ? - { prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn } : undefined, + { prop: 'opt1', label: '处理记录', name: '查看', subcomponent: btn } : '', this.$auth.hasPermiAnd([ 'monitoring:equipment-alarm-log:query', 'base:equipment-alarm-hand:query', @@ -143,7 +136,7 @@ export default { 'base:equipment-alarm-hand:update', 'monitoring:equipment-alarm-log:update' ]) ? - { prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn } : undefined, + { prop: 'opt2', label: '处理', name: '报警处理', subcomponent: btn } : '', // { prop: 'remark', label: '备注' }, ], searchBarFormConfig: [ diff --git a/src/views/equipment/base/inspection/Confirm/index.vue b/src/views/equipment/base/inspection/Confirm/index.vue index 5d072a8b..fce79619 100644 --- a/src/views/equipment/base/inspection/Confirm/index.vue +++ b/src/views/equipment/base/inspection/Confirm/index.vue @@ -168,7 +168,8 @@ export default { pageSize: 20, maintainPlanId: null, startTime: null, - special: false, + special: false, + name:undefined, status: 1, }, // 表单参数 @@ -196,7 +197,7 @@ export default { methods: { /** 批量确认 */ async handleSearchBarBtnClick(btn) { - console.log(11111); + console.log(btn); switch (btn.btnName) { case 'batchConfirm': @@ -263,6 +264,8 @@ export default { .catch(() => { }); break; case 'search': + console.log(btn); + this.queryParams.name = btn.name || null; this.getList() break; case 'add': diff --git a/src/views/equipment/base/maintain/Monitor/showDetail.vue b/src/views/equipment/base/maintain/Monitor/showDetail.vue index 76a5a7a0..428db673 100644 --- a/src/views/equipment/base/maintain/Monitor/showDetail.vue +++ b/src/views/equipment/base/maintain/Monitor/showDetail.vue @@ -101,6 +101,7 @@ export default { addOrUpdateVisible: false, addOrEditTitle: '', queryParams: { + logId:null, pageNo:1, pageSize:10, planId:null, @@ -124,8 +125,10 @@ export default { methods: { getDataList(id) { this.dataListLoading = true; - this.queryParams.planId = id - this.urlOptions.getDataListURL(this.listQuery).then(response => { + console.log(id); + + this.queryParams.logId = id + this.urlOptions.getDataListURL(this.queryParams).then(response => { this.tableData = response.data.list; // this.listQuery.total = response.data.total; this.dataListLoading = false @@ -147,6 +150,8 @@ export default { init(obj) { this.drawer = true this.dataForm = obj + console.log(obj.id); + this.getDataList(obj.id) } }, diff --git a/src/views/equipment/base/maintain/items/components/add-or-updata.vue b/src/views/equipment/base/maintain/items/components/add-or-updata.vue index 97d2d38d..dc4e7d76 100644 --- a/src/views/equipment/base/maintain/items/components/add-or-updata.vue +++ b/src/views/equipment/base/maintain/items/components/add-or-updata.vue @@ -44,8 +44,8 @@ <el-input oninput="value=value.replace(/[^\-\d.]/g, '')" v-model="dataForm.minValue" placeholder="请输入最小值" /> </el-form-item> </el-col> - <el-col :span="4"> - ————— + <el-col :span="4" style="text-align: center;"> + —— </el-col> <el-col :span="9"> <el-form-item prop="maxValue" label-width="20"> diff --git a/src/views/equipment/base/maintain/items/index.vue b/src/views/equipment/base/maintain/items/index.vue index d8acead8..e1af2a5a 100644 --- a/src/views/equipment/base/maintain/items/index.vue +++ b/src/views/equipment/base/maintain/items/index.vue @@ -186,7 +186,7 @@ export default { handleDetail(row) { this.showDetailVisible = true this.$nextTick(() => { - this.$refs.showDetail.init(row.id) + this.$refs.showDetail.init(row.equipmentTypeId) }) // alert('跳转到 保养记录') // console.log(row) diff --git a/src/views/equipment/base/maintain/items/showDetail.vue b/src/views/equipment/base/maintain/items/showDetail.vue index 4cdd945b..40363600 100644 --- a/src/views/equipment/base/maintain/items/showDetail.vue +++ b/src/views/equipment/base/maintain/items/showDetail.vue @@ -103,9 +103,17 @@ export default { this.tableData[val._pageIndex - 1][val.prop] = val[val.prop] // console.log(this.tableData) }, - getDataList(id) { + handleCancel() { + this.$refs.addOrUpdate.formClear() + this.addOrUpdateVisible = false + this.addOrEditTitle = '' + }, + successSubmit() { + this.handleCancel() + this.getDataList() + }, + getDataList() { this.dataListLoading = true; - this.queryParams.mainId = id this.urlOptions.getDataListURL(this.queryParams).then(response => { this.tableData = response.data.list; this.queryParams.total = response.data.total; @@ -121,7 +129,8 @@ export default { }, init(id) { this.drawer = true - this.getDataList(id) + this.queryParams.mainId = id || '' + this.getDataList() } }, } diff --git a/src/views/equipment/base/repair/CustomDialogForm.vue b/src/views/equipment/base/repair/CustomDialogForm.vue index a7b23222..a5b82e21 100644 --- a/src/views/equipment/base/repair/CustomDialogForm.vue +++ b/src/views/equipment/base/repair/CustomDialogForm.vue @@ -8,10 +8,7 @@ <template> <!-- <el-drawer :visible.sync="visible" :show-close="false" :wrapper-closable="disabled" class="drawer" custom-class="mes-drawer" size="50%" @closed="$emit('destroy')"> --> - <el-dialog - :visible.sync="visible" - width="50%" - :before-close="closed"> + <el-dialog :visible.sync="visible" width="50%" :before-close="closed"> <small-title slot="title" :no-padding="true"> 详情 <!-- {{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }} --> @@ -20,55 +17,73 @@ <div class="drawer-body__content"> <div> <el-row :gutter="20"> + <el-col :span="6"> + <div class="blodTip">维修单号</div> + <div class="lightTip">{{ dataForm.repairOrderNumber }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">产线名</div> + <div class="lightTip">{{ dataForm.lineName }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">工段名</div> + <div class="lightTip">{{ dataForm.sectionName }}</div> + </el-col> <el-col :span="6"> <div class="blodTip">故障发生时间</div> <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div> </el-col> + </el-row> + <el-row :gutter="20"> + <!-- <el-col :span="6"> + <div class="blodTip">故障发生时间</div> + <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div> + </el-col> --> <el-col :span="6"> + <div class="blodTip">设备名</div> + <div class="lightTip">{{ dataForm.equipmentName }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">维修时长</div> + <div class="lightTip">{{ dataForm.maintenanceDuration }}</div> + </el-col> + + <!-- <el-col :span="6"> <div class="blodTip">故障级别</div> <div class="lightTip">{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</div> </el-col> <el-col :span="6"> <div class="blodTip">故障类型</div> <div class="lightTip">{{ getDictDataLabel('fault-type', dataForm.faultType) }}</div> - </el-col> + </el-col> --> <el-col :span="6"> <div class="blodTip">维修工</div> <div class="lightTip">{{ dataForm.repairman }}</div> </el-col> - </el-row> - <el-row :gutter="20"> <el-col :span="6"> <div class="blodTip">联系方式</div> <div class="lightTip">{{ dataForm.repairmanPhone }}</div> </el-col> - <el-col :span="6"> - <div class="blodTip">维修方式</div> - <div class="lightTip">{{ getDictDataLabel('repair-mode', dataForm.repairMode) }}</div> - </el-col> - <el-col :span="6"> - <div class="blodTip">创建时间</div> - <div class="lightTip">{{ parseTime(dataForm.createTime) }}</div> - </el-col> - <el-col :span="6"> - <div class="blodTip">创建人</div> - <div class="lightTip">{{ dataForm.creator }}</div> - </el-col> </el-row> - <el-row> - <div class="blodTip">备注</div> - <div class="lightTip">{{ dataForm.remark }}</div> + <el-row :gutter="20"> + <el-col :span="6"> + <div class="blodTip">备注</div> + <div class="lightTip">{{ dataForm.remark }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">故障明细</div> + <div class="lightTip">{{ dataForm.faultDetail.replace(/<\/?p>/g, '') }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">维修明细</div> + <div class="lightTip">{{ dataForm.maintenanceDetail.replace(/<\/?p>/g, '') }}</div> + </el-col> </el-row> <el-row> <div class="blodTip">维修附件</div> <div v-if="dataForm.files && dataForm.files.length > 0"> - <uploadedFile - class="file" - v-for="file in dataForm.files" - :file="file" - :key="file.fileUrl" - :disabled="disabled" - @delete="!disabled && handleDeleteFile(file, col.prop)" /> + <uploadedFile class="file" v-for="file in dataForm.files" :file="file" :key="file.fileUrl" + :disabled="disabled" @delete="!disabled && handleDeleteFile(file, col.prop)" /> </div> <p v-else>暂无附件</p> </el-row> @@ -170,65 +185,65 @@ import { getDictDataLabel } from '@/utils/dict'; import tupleImg from '@/assets/images/tuple.png'; const uploadedFile = { - name: 'UploadedFile', - props: ['file', 'disabled'], - data() { - return {}; - }, - methods: { - handleDelete() { - this.$emit('delete', this.file); - }, - async handleDownload() { - const data = await this.$axios({ - url: this.file.fileUrl, - method: 'get', - responseType: 'blob', - }); + name: 'UploadedFile', + props: ['file', 'disabled'], + data() { + return {}; + }, + methods: { + handleDelete() { + this.$emit('delete', this.file); + }, + async handleDownload() { + const data = await this.$axios({ + url: this.file.fileUrl, + method: 'get', + responseType: 'blob', + }); - await this.$message.success('开始下载'); - // create download link - const url = window.URL.createObjectURL(data); - const link = document.createElement('a'); - link.href = url; - link.download = this.file.fileName; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - }, - }, - mounted() { - }, - render: function (h) { - return ( - <div - title={this.file.fileName} - onClick={this.handleDownload} - style={{ - background: `url(${tupleImg}) no-repeat`, - backgroundSize: '14px', - backgroundPosition: '0 55%', - paddingLeft: '20px', - paddingRight: '24px', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - overflow: 'hidden', - cursor: 'pointer', - display: 'inline-block', - }}> - {this.file.fileName} - {!this.disabled && ( - <el-button - type="text" - icon="el-icon-close" - style="float: right; position: relative; top: 2px; left: 8px; z-index: 100" - class="dialog__upload_component__close" - onClick={this.handleDelete} - /> - )} - </div> - ); - }, + await this.$message.success('开始下载'); + // create download link + const url = window.URL.createObjectURL(data); + const link = document.createElement('a'); + link.href = url; + link.download = this.file.fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }, + }, + mounted() { + }, + render: function (h) { + return ( + <div + title={this.file.fileName} + onClick={this.handleDownload} + style={{ + background: `url(${tupleImg}) no-repeat`, + backgroundSize: '14px', + backgroundPosition: '0 55%', + paddingLeft: '20px', + paddingRight: '24px', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + overflow: 'hidden', + cursor: 'pointer', + display: 'inline-block', + }}> + {this.file.fileName} + {!this.disabled && ( + <el-button + type="text" + icon="el-icon-close" + style="float: right; position: relative; top: 2px; left: 8px; z-index: 100" + class="dialog__upload_component__close" + onClick={this.handleDelete} + /> + )} + </div> + ); + }, }; export default { @@ -392,18 +407,20 @@ export default { justify-content: flex-end; padding: 18px; } + .blodTip { - height: 16px; - font-size: 14px; - font-weight: 600; - color: rgba(0,0,0,0.85); - margin-bottom: 8px; + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + margin-bottom: 8px; } + .lightTip { - /* height: 16px; */ - font-size: 14px; - font-weight: 400; - color: rgba(102,102,102,0.75); - margin-bottom: 12px; + /* height: 16px; */ + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + margin-bottom: 12px; } </style> diff --git a/src/views/equipment/base/repair/Repair--add.vue b/src/views/equipment/base/repair/Repair--add.vue index 16f96e9a..650a6efb 100644 --- a/src/views/equipment/base/repair/Repair--add.vue +++ b/src/views/equipment/base/repair/Repair--add.vue @@ -63,106 +63,6 @@ value-format="timestamp" format="yyyy-MM-dd HH:mm:ss" clearable @change="$emit('update', form)" /> </el-form-item> </el-col> - - <!-- 故障级别 --> - <!-- <el-col :span="8"> - <el-form-item - label="故障级别" - prop="faultLevel" - :rules="[ - { - required: true, - message: '故障级别不能为空', - trigger: 'blur', - }, - ]"> - <el-select - v-model="form.faultLevel" - placeholder="故障级别" - :disabled="disabled" - @change="$emit('update', form)"> - <el-option - v-for="opt in getDictDatas(DICT_TYPE.FAULT_LEVEL)" - :key="opt.value" - :label="opt.label" - :value="opt.value" /> - </el-select> - </el-form-item> - </el-col> --> - - <!-- 故障类型 - 数据字典 --> - <!-- <el-col :span="8"> - <el-form-item - label="故障类型" - prop="faultType" - :rules="[ - { - required: true, - message: '故障类型不能为空', - trigger: 'blur', - }, - ]"> - <el-select - v-model="form.faultType" - placeholder="故障类型" - :disabled="disabled" - @change="$emit('update', form)"> - <el-option - v-for="opt in getDictDatas(DICT_TYPE.FAULT_TYPE)" - :key="opt.value" - :label="opt.label" - :value="opt.value" /> - </el-select> - </el-form-item> - </el-col> --> - - <!-- 维修开始时间 --> - <!-- <el-col :span="8"> - <el-form-item - label="维修开始时间" - prop="maintenanceStartTime" - :rules="[ - { - required: true, - message: '维修开始时间不能为空', - trigger: 'blur', - }, - ]"> - <el-date-picker - v-model="form.maintenanceStartTime" - type="datetime" - :disabled="disabled" - :placeholder="`请选择维修开始时间`" - value-format="timestamp" - format="yyyy-MM-dd HH:mm:ss" - clearable - @change="$emit('update', form)" /> - </el-form-item> - </el-col> --> - - <!-- 维修结束时间 --> - <!-- <el-col :span="8"> - <el-form-item - label="维修结束时间" - prop="maintenanceFinishTime" - :rules="[ - { - required: true, - message: '维修结束时间不能为空', - trigger: 'blur', - }, - ]"> - <el-date-picker - v-model="form.maintenanceFinishTime" - type="datetime" - :disabled="disabled" - :placeholder="`请选择维修结束时间`" - value-format="timestamp" - format="yyyy-MM-dd HH:mm:ss" - clearable - @change="$emit('update', form)" /> - </el-form-item> - </el-col> --> <el-col :span="8"> <el-form-item label="维修时长(h)" prop="maintenanceDuration"> <el-input-number v-model="dataForm.maintenanceDuration" :min="0" controls-position="right" style="width: 100%" @@ -433,8 +333,8 @@ export default { sectionOptions: [], lineOptions: [], uploadOpen: false, - uploadUrl: process.env.VUE_APP_BASE_API + '/admin-api/infra/file/upload', // 上传有关的headers,url都是固定的 - uploadHeaders: { Authorization: 'Bearer ' + getAccessToken() }, + uploadHeaders: { Authorization: 'Bearer ' + getAccessToken() }, + uploadUrl: process.env.VUE_APP_BASE_API + '/admin-api/infra/file/upload', // 上传有关的headers,url都是固定的 }; }, watch: { @@ -633,17 +533,17 @@ export default { handleUploadSuccess(response, file, prop) { console.log('response', response); - if (response.code != 0) { - this.$modal.msgError('上传失败: ', response.msg || '-'); - return; - } - this.form.files.push({ - fileName: file.name, - fileUrl: response.data, - fileType: prop == 'files' ? 2 : 1, - }); - this.$modal.msgSuccess('上传成功'); - this.$emit('update', this.form); + // if (response.code != 0) { + // this.$modal.msgError('上传失败: ', response.msg || '-'); + // return; + // } + this.form.files.push({ + fileName: file.name, + fileUrl: response.data, + fileType: prop == 'files' ? 2 : 1, + }); + this.$modal.msgSuccess('上传成功'); + this.$emit('update', this.form); }, handleDeleteFile(file, prop) { diff --git a/src/views/equipment/base/repair/detail-btn.vue b/src/views/equipment/base/repair/detail-btn.vue new file mode 100644 index 00000000..6aec06da --- /dev/null +++ b/src/views/equipment/base/repair/detail-btn.vue @@ -0,0 +1,53 @@ +<!-- + * @Author: zhp + * @Date: 2023-11-08 14:00:52 + * @LastEditTime: 2023-12-01 10:12:27 + * @LastEditors: DY + * @Description: +--> +<template> + <div> + <el-button type="text" @click="handleDetail">查看更多</el-button> + <CustomDialogForm v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList" /> + </div> +</template> + +<script> +import CustomDialogForm from './CustomDialogForm.vue'; + +export default { + name: 'EquipmentRepairDetail', + components: { CustomDialogForm }, + props: { + injectData: { + type: Object, + default: () => ({}) + } + }, + data() { + return { + addOrUpdateVisible:false, + } + }, + mounted() { + this.getContent() + }, + + methods: { + handleDetail() { + // this.reset(); + // const id = row.id; + // this.info({ id }).then((response) => { + // this.form = response.data; + // // this.form.repairman = this.form.repairman.split(',') + // this.open = true; + // this.title = '修改维修记录'; + // }); + this.addOrUpdateVisible = true + this.$nextTick(() => { + this.$refs.addOrUpdate.init({ id: this.injectData.id }); + }); + }, + } +} +</script> diff --git a/src/views/equipment/base/repair/detail.vue b/src/views/equipment/base/repair/detail.vue new file mode 100644 index 00000000..85ed57e3 --- /dev/null +++ b/src/views/equipment/base/repair/detail.vue @@ -0,0 +1,421 @@ +<!-- + filename: dialogForm.vue + author: liubin + date: 2023-10-31 15:55:13 + description: +--> + +<template> + <!-- <el-drawer :visible.sync="visible" :show-close="false" :wrapper-closable="disabled" class="drawer" + custom-class="mes-drawer" size="50%" @closed="$emit('destroy')"> --> + <el-dialog :visible.sync="visible" width="50%" :before-close="closed"> + <small-title slot="title" :no-padding="true"> + 详情 + <!-- {{ disabled ? '查看详情' : !dataForm.maintenanceStatus ? '修改' : '完成' }} --> + </small-title> + <div class="drawer-body flex"> + <div class="drawer-body__content"> + <div> + <el-row :gutter="20"> + <el-col :span="6"> + <div class="blodTip">维修单号</div> + <div class="lightTip">{{ dataForm.repairOrderNumber }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">产线名</div> + <div class="lightTip">{{ dataForm.lineName }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">工段名</div> + <div class="lightTip">{{ dataForm.sectionName }}</div> + </el-col> + <!-- <el-col :span="6"> + <div class="blodTip">维修工</div> + <div class="lightTip">{{ dataForm.repairman }}</div> + </el-col> --> + </el-row> + <el-row :gutter="20"> + <el-col :span="6"> + <div class="blodTip">故障发生时间</div> + <div class="lightTip">{{ parseTime(dataForm.faultTime) }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">故障级别</div> + <div class="lightTip">{{ getDictDataLabel('fault-level', dataForm.faultLevel) }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">故障类型</div> + <div class="lightTip">{{ getDictDataLabel('fault-type', dataForm.faultType) }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">维修工</div> + <div class="lightTip">{{ dataForm.repairman }}</div> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="6"> + <div class="blodTip">联系方式</div> + <div class="lightTip">{{ dataForm.repairmanPhone }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">维修方式</div> + <div class="lightTip">{{ getDictDataLabel('repair-mode', dataForm.repairMode) }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">创建时间</div> + <div class="lightTip">{{ parseTime(dataForm.createTime) }}</div> + </el-col> + <el-col :span="6"> + <div class="blodTip">创建人</div> + <div class="lightTip">{{ dataForm.creator }}</div> + </el-col> + </el-row> + <el-row> + <div class="blodTip">备注</div> + <div class="lightTip">{{ dataForm.remark }}</div> + </el-row> + <el-row> + <div class="blodTip">维修附件</div> + <div v-if="dataForm.files && dataForm.files.length > 0"> + <uploadedFile class="file" v-for="file in dataForm.files" :file="file" :key="file.fileUrl" + :disabled="disabled" @delete="!disabled && handleDeleteFile(file, col.prop)" /> + </div> + <p v-else>暂无附件</p> + </el-row> + </div> + <!-- <el-divider style="margin-top: -10px" /> + <small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true"> + {{ '设备维修信息' }} + </small-title> --> + <!-- <el-form ref="form" :model="dataForm" label-width="100px" label-position="top" v-loading="formLoading"> + <el-row :gutter="20"> + <el-col :span="6"> + <el-form-item label="维修开始时间" prop="maintenanceStartTime" + :rules="[{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }]"> + <el-date-picker v-model="dataForm.maintenanceStartTime" type="datetime" :disabled="disabled" + placeholder="请选择维修开始时间" value-format="timestamp" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="维修结束时间" prop="maintenanceFinishTime" + :rules="[{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }]"> + <el-date-picker v-model="dataForm.maintenanceFinishTime" type="datetime" :disabled="disabled" + placeholder="请选择维修开始时间" value-format="timestamp" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="维修方式" prop="repairMode" + :rules="[{ required: true, message: '维修方式不能为空', trigger: 'blur' }]"> + <el-select :disabled="disabled" v-model="dataForm.repairMode" placeholder="请选择维修方式"> + <el-option v-for="opt in getDictDatas('repair-mode')" :key="opt.value" :label="opt.label" + :value="opt.value" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="故障类型" prop="faultType"> + <el-select :disabled="disabled" v-model="dataForm.faultType" placeholder="请选择故障类型"> + <el-option v-for="opt in getDictDatas('fault-type')" :key="opt.value" :label="opt.label" + :value="opt.value" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + + <el-row :gutter="20"> + <el-col> + <el-form-item label="故障明细" prop="faultDetail" + :rules="[{ required: true, message: '故障明细不能为空', trigger: 'blur' }]"> + <editor v-model="dataForm.faultDetail" :read-only="disabled" :min-height="150" /> + </el-form-item> + </el-col> + </el-row> + + <el-row :gutter="20"> + <el-col> + <el-form-item label="维修记录" prop="maintenanceDetail"> + <editor v-model="dataForm.maintenanceDetail" :read-only="disabled" :min-height="150" /> + </el-form-item> + </el-col> + </el-row> + + <el-row :gutter="20"> + <el-col> + <el-form-item label="维修附件" prop="file"> + <FileUpload v-model="file" :limit="1" :f-name="fileName" :disabled="disabled" @name="setFileName" /> + </el-form-item> + </el-col> + </el-row> + + <el-row :gutter="20"> + <el-col> + <el-form-item label="备注" prop="remark"> + <el-input v-model="dataForm.remark" :placeholder="`请输入备注`" :disabled="disabled" /> + </el-form-item> + </el-col> + </el-row> + </el-form> --> + + <!-- <div v-if="!disabled" class="drawer-body__footer"> + <el-button style="" @click="goback()">取消</el-button> + <el-button type="primary" @click="dataFormSubmit()">确定</el-button> + </div> --> + </div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="visible = false">取 消</el-button> + </span> + </el-dialog> + <!-- </el-drawer> --> +</template> + +<script> +import SmallTitle from '../../base/alarm/Record/SmallTitle.vue'; +import { getEqRepair, updateEqRepair } from '@/api/equipment/base/repair' +import Editor from "@/components/Editor"; +// import FileUpload from "@/components/FileUpload"; +import { getDictDatas } from "@/utils/dict"; +import { parseTime } from '@/utils/ruoyi' +import { getDictDataLabel } from '@/utils/dict'; +import tupleImg from '@/assets/images/tuple.png'; + +const uploadedFile = { + name: 'UploadedFile', + props: ['file', 'disabled'], + data() { + return {}; + }, + methods: { + handleDelete() { + this.$emit('delete', this.file); + }, + async handleDownload() { + const data = await this.$axios({ + url: this.file.fileUrl, + method: 'get', + responseType: 'blob', + }); + + await this.$message.success('开始下载'); + // create download link + const url = window.URL.createObjectURL(data); + const link = document.createElement('a'); + link.href = url; + link.download = this.file.fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }, + }, + mounted() { + }, + render: function (h) { + return ( + <div + title={this.file.fileName} + onClick={this.handleDownload} + style={{ + background: `url(${tupleImg}) no-repeat`, + backgroundSize: '14px', + backgroundPosition: '0 55%', + paddingLeft: '20px', + paddingRight: '24px', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + overflow: 'hidden', + cursor: 'pointer', + display: 'inline-block', + }}> + {this.file.fileName} + {!this.disabled && ( + <el-button + type="text" + icon="el-icon-close" + style="float: right; position: relative; top: 2px; left: 8px; z-index: 100" + class="dialog__upload_component__close" + onClick={this.handleDelete} + /> + )} + </div> + ); + }, +}; + +export default { + name: 'DialogForm', + model: { + prop: 'dataForm', + event: 'update', + }, + emits: ['update'], + components: { SmallTitle, Editor, uploadedFile }, + props: { + // dataForm: { + // type: Object, + // default: () => ({}), + // }, + // disabled: { + // type: Boolean, + // default: false + // }, + }, + data() { + return { + formLoading: true, + visible: false, + disabled: false, + dataForm: {}, + file: '', + fileName: '' + }; + }, + mounted() { }, + methods: { + closed() { + this.$emit('destroy') + }, + setFileName(val) { + this.fileName = val + }, + goback() { + this.$emit('refreshDataList'); + this.visible = false; + }, + goEdit() { + this.disabled = false; + }, + /** 模拟透传 ref */ + validate(cb) { + return this.$refs.form.validate(cb); + }, + resetFields(args) { + return this.$refs.form.resetFields(args); + }, + initData() { + this.file = '' + this.fileName = '' + }, + init(row, isdetail) { + this.initData(); + this.disabled = isdetail || false; + this.dataForm.id = row.id || undefined; + this.visible = true; + + this.$nextTick(() => { + // this.$refs['form'].resetFields(); + + if (this.dataForm.id) { + // 获取设备维修 + getEqRepair(this.dataForm.id).then(response => { + this.formLoading = false + this.dataForm = response.data; + // this.dataForm.maintenanceStatus = row.maintenanceStatus || 0 + // if (this.dataForm.files.length > 0) { + // this.file = this.dataForm.files[0].fileUrl + // this.fileName = this.dataForm.files[0].fileName + // } + }); + } else { + // if (this.urlOptions.isGetCode) { + // this.getCode() + // } + } + }); + }, + // 表单提交 + dataFormSubmit() { + this.$refs["form"].validate((valid) => { + if (!valid) { + return false; + } + // 修改的提交 + if (this.file) { + const temp = this.file.split(',') // 获取文件个数 + let arry = [] + temp.forEach(item => { + arry.push({ + fileName: this.fileName, + fileType: 2, + fileUrl: item + }) + }) + this.dataForm.files = arry + } + if (this.dataForm.id) { + updateEqRepair(this.dataForm).then(response => { + this.$modal.msgSuccess("修改成功"); + this.visible = false; + this.$emit("refreshDataList"); + }); + return; + } + // 添加的提交 + // this.urlOptions.createURL(this.dataForm).then(response => { + // this.$modal.msgSuccess("新增成功"); + // this.visible = false; + // this.$emit("refreshDataList"); + // }); + }); + }, + }, +}; +</script> + +<style scoped> +.drawer>>>.el-drawer { + border-radius: 8px 0 0 8px; +} + +.drawer>>>.el-drawer__header { + margin: 0; + padding: 32px 32px 24px; + border-bottom: 1px solid #dcdfe6; + margin-bottom: 0px; +} + +.small-title::before { + content: ''; + display: inline-block; + vertical-align: top; + width: 4px; + height: 22px; + border-radius: 1px; + margin-right: 8px; + background-color: #0b58ff; +} + +.drawer-body { + display: flex; + flex-direction: column; + height: 100%; +} + +.drawer-body__content { + flex: 1; + /* background: #eee; */ + padding: 5px 10px; + overflow-y: auto; +} + +.drawer-body__footer { + display: flex; + justify-content: flex-end; + padding: 18px; +} + +.blodTip { + height: 16px; + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.85); + margin-bottom: 8px; +} + +.lightTip { + /* height: 16px; */ + font-size: 14px; + font-weight: 400; + color: rgba(102, 102, 102, 0.75); + margin-bottom: 12px; +} +</style> diff --git a/src/views/equipment/base/repair/index.vue b/src/views/equipment/base/repair/index.vue index 9bdb5690..b4aed842 100644 --- a/src/views/equipment/base/repair/index.vue +++ b/src/views/equipment/base/repair/index.vue @@ -1,54 +1,26 @@ <template> - <div class="app-container"> - <!-- 搜索工作栏 --> - <SearchBar - :formConfigs="searchBarFormConfig" - ref="search-bar" - @headBtnClick="handleSearchBarBtnClick" /> + <div class="app-container"> + <!-- 搜索工作栏 --> + <SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" @headBtnClick="handleSearchBarBtnClick" /> - <!-- 列表 --> - <base-table - :table-props="tableProps" - :page="queryParams.pageNo" - :limit="queryParams.pageSize" - :table-data="list" - @emitFun="handleEmitFun" - :max-height="tableH"> - <method-btn - v-if="tableBtn.length" - slot="handleBtn" - label="操作" - :width="90" - :method-list="tableBtn" - @clickBtn="handleTableBtnClick" /> - </base-table> + <!-- 列表 --> + <base-table :table-props="tableProps" :page="queryParams.pageNo" :limit="queryParams.pageSize" :table-data="list" + @emitFun="handleEmitFun" :max-height="tableH"> + <method-btn v-if="tableBtn.length" slot="handleBtn" label="操作" :width="90" :method-list="tableBtn" + @clickBtn="handleTableBtnClick" /> + </base-table> - <!-- 分页组件 --> - <pagination - v-show="total > 0" - :total="total" - :page.sync="queryParams.pageNo" - :limit.sync="queryParams.pageSize" - @pagination="getList" /> + <!-- 分页组件 --> + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" + @pagination="getList" /> - <!-- 对话框(添加 / 修改) --> - <base-dialog - :dialogTitle="title" - :dialogVisible="open" - @close="cancel" - @cancel="cancel" - @confirm="submitForm"> - <DialogForm - v-if="open" - ref="form" - v-model="form" - :disabled="mode == 'detail'" /> - </base-dialog> - <CustomDialogForm - v-if="addOrUpdateVisible" - ref="addOrUpdate" - @refreshDataList="getList" /> - </div> + <!-- 对话框(添加 / 修改) --> + <base-dialog :dialogTitle="title" :dialogVisible="open" @close="cancel" @cancel="cancel" @confirm="submitForm"> + <DialogForm v-if="open" ref="form" v-model="form" :disabled="mode === 'detail'" /> + </base-dialog> + <CustomDialogForm v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getList" /> + <!-- <detail v-if="detailOrUpdateVisible" ref="detailOrUpdate" @refreshDataList="getList" /> --> + </div> </template> <script> @@ -57,26 +29,31 @@ import basicPageMixin from '@/mixins/lb/basicPageMixin'; import CustomDialogForm from './CustomDialogForm.vue'; import { deleteRepair, exportRepairLogExcel } from '@/api/equipment/base/repair' import { parseTime } from '@/utils/ruoyi' +import detailBtn from './detail-btn.vue' import htmls from './htmls.vue' +// import detail from './detail.vue' + + import DialogForm from './Repair--add.vue'; import tableHeightMixin from '@/mixins/tableHeightMixin'; // const timeFilter = (val) => moment(val).format('yyyy-MM-DD HH:mm:ss'); export default { name: 'EquipmentRepair', - components: { CustomDialogForm, DialogForm }, + components: { CustomDialogForm, DialogForm }, mixins: [basicPageMixin, tableHeightMixin], data() { return { - addOrUpdateVisible: false, + addOrUpdateVisible: false, + detailOrUpdateVisible:false, searchBarKeys: ['maintenanceResult', 'createTime', 'equipmentId'], tableBtn: [ - this.$auth.hasPermi('equipment:repair:query') - ? { - type: 'detail', - btnName: '详情', - } - : undefined, + // this.$auth.hasPermi('equipment:repair:query') + // ? { + // type: 'detail', + // btnName: '详情', + // } + // : undefined, // this.$auth.hasPermi('equipment:repair:finish') // ? { // type: 'finish', @@ -108,31 +85,33 @@ export default { { prop: 'lineName', label: '产线名', width: 120, showOverflowtooltip: true }, { prop: 'sectionName', label: '工段名', width: 120, showOverflowtooltip: true }, { prop: 'equipmentName', label: '设备名称', minWidth: 100, showOverflowtooltip: true }, - { prop: 'faultDetail', label: '故障明细', subcomponent: htmls, width: 180, showOverflowtooltip: true }, + { prop: 'faultDetail', label: '故障明细', subcomponent: htmls, width: 180, showOverflowtooltip: true }, // { prop: 'maintenanceDetail', label: '维修明细', subcomponent: htmls, minWidth: 100, showOverflowtooltip: true }, { - prop: 'maintenanceStartTime', - label: '维修开始时间', - width: 150, - filter: parseTime, - }, - { - prop: 'maintenanceFinishTime', - label: '维修结束时间', + prop: 'faultTime', + label: '故障开始时间', width: 150, filter: parseTime, }, + // { + // prop: 'maintenanceFinishTime', + // label: '维修结束时间', + // width: 150, + // filter: parseTime, + // }, // { prop: 'maintenanceStartTime', label: '开始时间', filter: parseTime }, - { - prop: 'maintenanceResult', - label: '维修结果', - filter: (v) => (v != null ? ['成功', '失败'][v] : ''), - }, - // { prop: 'maintenanceDuration', label: '维修时长(h)' }, - { prop: 'maintenanceDetail', label: '维修描述', subcomponent: htmls }, // 没有参数 + // { + // prop: 'maintenanceResult', + // label: '维修结果', + // filter: (v) => (v != null ? ['成功', '失败'][v] : ''), + // }, + { prop: 'maintenanceDuration', label: '维修时长(时)' },// + { prop: 'maintenanceDetail', label: '维修描述', subcomponent: htmls }, // 没有参数 + // { prop: 'repairman', label: '维修工', minWidth: 100, showOverflowtooltip: true }, // { prop: 'repairmanPhone', label: '联系方式', minWidth: 100, showOverflowtooltip: true }, - { prop: 'remark', label: '备注', minWidth: 90, showOverflowtooltip: true } + { prop: 'remark', label: '备注', minWidth: 90, showOverflowtooltip: true }, + { prop: 'detail', label: '查看详情', subcomponent: detailBtn }, // 没有参数 ], searchBarFormConfig: [ { @@ -142,16 +121,16 @@ export default { param: 'equipmentId', filterable: true, }, - { - type: 'select', - label: '维修结果', - placeholder: '请选择状态', - param: 'maintenanceResult', - selectOptions: [ - { name: '成功', id: '0' }, - { name: '失败', id: '1' } - ], - }, + // { + // type: 'select', + // label: '维修结果', + // placeholder: '请选择状态', + // param: 'maintenanceResult', + // selectOptions: [ + // { name: '成功', id: '0' }, + // { name: '失败', id: '1' } + // ], + // }, // 时间段 { type: 'datePicker', @@ -214,7 +193,7 @@ export default { // 表单参数 form: {}, basePath: '/base/equipment-repair-log', - mode: null + mode: 'add' }; }, created() { @@ -249,7 +228,7 @@ export default { /** 取消按钮 */ cancel() { this.open = false; - this.mode = null; + // this.mode = null; this.reset(); }, /** 表单重置 */ @@ -369,9 +348,9 @@ export default { .catch(() => {}); }, handleDetail({ id }) { - this.addOrUpdateVisible = true + this.detailOrUpdateVisible = true this.$nextTick(() => { - this.$refs.addOrUpdate.init({id: id}, true); + this.$refs.detailOrUpdate.init({id: id}, true); }); }, /** 导出按钮操作 */ diff --git a/src/views/equipment/base/spareParts/Config/addSparts.vue b/src/views/equipment/base/spareParts/Config/addSparts.vue index 06edaab2..020c4227 100644 --- a/src/views/equipment/base/spareParts/Config/addSparts.vue +++ b/src/views/equipment/base/spareParts/Config/addSparts.vue @@ -1,8 +1,8 @@ -<!-- +<!-- filename: dialogForm.vue author: liubin date: 2023-10-31 15:55:13 - description: + description: --> <template> @@ -41,11 +41,11 @@ </el-col> </el-row> <el-form-item label="描述" prop="description"> - <div v-html="dataForm.description" style="padding: 5px; margin: 0; border: 1px solid #dfdfdf" /> + <div v-html="dataForm.description" style="padding: 5px; margin: 0; border: 1px solid #dfdfdf;" /> <!-- <editor v-model="dataForm.description" read-only :min-height="200"/> --> </el-form-item> </el-form> - + <div> <small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true"> {{ '备品备件' }} @@ -78,7 +78,7 @@ :limit.sync="listQuery.pageSize" :page-sizes="[5, 10, 15]" @pagination="getList" /> - </div> + </div> <div v-if="!disabled" class="drawer-body__footer"> <el-button type="primary" @click="goback()">关闭</el-button> diff --git a/src/views/equipment/timing-diagram/status/index.vue b/src/views/equipment/timing-diagram/status/index.vue index 245bd701..b93896ff 100644 --- a/src/views/equipment/timing-diagram/status/index.vue +++ b/src/views/equipment/timing-diagram/status/index.vue @@ -297,7 +297,7 @@ export default { }, }).then(({ code, data }) => { if (code == 0) { - this.searchBarFormConfig[2].defaultSelect = null + this.searchBarFormConfig[1].defaultSelect = null this.searchBarFormConfig[1].selectOptions = data.map((item) => { return { name: item.name, diff --git a/src/views/extend/processEquMaterialBom/add-or-updata.vue b/src/views/extend/processEquMaterialBom/add-or-updata.vue index 77800735..8d68b58e 100644 --- a/src/views/extend/processEquMaterialBom/add-or-updata.vue +++ b/src/views/extend/processEquMaterialBom/add-or-updata.vue @@ -177,7 +177,7 @@ export default { name: '', equipmentId: undefined, equipmentCode: undefined, - enabled:undefined, + enabled:1, // area: undefined, // specifications: undefined, // processTime: 0, diff --git a/src/views/extend/processEquValueBom/add-or-updata.vue b/src/views/extend/processEquValueBom/add-or-updata.vue index 3abaf2e4..3b6408eb 100644 --- a/src/views/extend/processEquValueBom/add-or-updata.vue +++ b/src/views/extend/processEquValueBom/add-or-updata.vue @@ -1,13 +1,8 @@ <!-- * @Author: zwq * @Date: 2021-11-18 14:16:25 -<<<<<<< HEAD * @LastEditors: zhp * @LastEditTime: 2023-11-28 10:09:20 -======= - * @LastEditors: DY - * @LastEditTime: 2023-11-27 16:37:17 ->>>>>>> projects/mes-test * @Description: --> <template> diff --git a/src/views/extend/processFlow/index.vue b/src/views/extend/processFlow/index.vue index 494fd5de..3669e8de 100644 --- a/src/views/extend/processFlow/index.vue +++ b/src/views/extend/processFlow/index.vue @@ -274,7 +274,8 @@ export default { async handleCopy(id) { this.$confirm('确认拷贝操作?', '提示', { confirmButtonText: '确 认', - cancelButtonText: '取 消', + cancelButtonText: '取 消', + type: 'info' }) .then(async () => { const { code } = await this.http( @@ -294,7 +295,8 @@ export default { async handleDelete(id) { this.$confirm('确认删除这个工艺吗?', '提示', { confirmButtonText: '确 认', - cancelButtonText: '取 消', + cancelButtonText: '取 消', + type: 'warning' }) .then(async () => { const { code } = await this.http( diff --git a/src/views/extend/processFlowView/components/BomSelector.vue b/src/views/extend/processFlowView/components/BomSelector.vue index 136a06cb..9852b54e 100644 --- a/src/views/extend/processFlowView/components/BomSelector.vue +++ b/src/views/extend/processFlowView/components/BomSelector.vue @@ -1,8 +1,8 @@ -<!-- +<!-- filename: BomSelector.vue author: liubin date: 2023-11-17 16:23:28 - description: + description: --> <template> @@ -20,7 +20,7 @@ </el-row> <el-row v-if="filteredBomList.length" style="border: 1px solid #ccc; display: flex"> - <el-col :span="8"> + <el-col :span="12"> <div class="select-list"> <div class="sl__header" style="background: #f3f4fb; padding: 12px"> <span style="">可分配设备</span> @@ -47,7 +47,7 @@ </div> </div> </el-col> - <el-col :span="8" style="border-left: 1px solid #ccc"> + <el-col :span="6" style="border-left: 1px solid #ccc"> <div class="select-list"> <div class="sl__header" style="background: #f3f4fb; padding: 12px"> <span style="">物料BOM</span> diff --git a/src/views/extend/processFlowView/components/ProcessBomList.vue b/src/views/extend/processFlowView/components/ProcessBomList.vue index a086d547..b22c40d3 100644 --- a/src/views/extend/processFlowView/components/ProcessBomList.vue +++ b/src/views/extend/processFlowView/components/ProcessBomList.vue @@ -1,8 +1,8 @@ -<!-- +<!-- filename: ProcessBomList.vue author: liubin date: 2023-10-20 15:00:58 - description: + description: --> <template> @@ -185,7 +185,13 @@ export default { this.btnLoading = true; // 现将子组件的修改提交更新至本组件 this.$refs.bomSelector.commit(); - // 再提交至后端 + // 再提交至后端 + const equMaterialBomId = this.selectedBoms.every(item => item.equMaterialBomId !== undefined && item.equMaterialBomId !== null && item.equMaterialBomId !== ''); + const equValueBomId = this.selectedBoms.every(item => item.equValueBomId !== undefined && item.equValueBomId !== null && item.equValueBomId !== '') + if (!equMaterialBomId || !equValueBomId) { + this.btnLoading = false + return this.$message.warning('请选择物料bom和参数bom'); + } this.$nextTick(async () => { console.log('selectedBoms', this.selectedBoms); if (this.selectedBoms.length) { diff --git a/src/views/extend/processFlowView/components/ProcessInfo.vue b/src/views/extend/processFlowView/components/ProcessInfo.vue index af64dc8c..2b6bfe4f 100644 --- a/src/views/extend/processFlowView/components/ProcessInfo.vue +++ b/src/views/extend/processFlowView/components/ProcessInfo.vue @@ -1,41 +1,42 @@ -<!-- +<!-- filename: ProcessInfo.vue author: liubin date: 2023-10-20 15:00:58 - description: + description: --> <template> - <section class="process-info"> - <SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" /> + <section class="process-info"> + <el-button style="position: absolute;right: 30px;z-index: 9999;" type="primary" plain @click="goBack">返回</el-button> + <SearchBar :formConfigs="searchBarFormConfig" ref="search-bar" /> - <el-row :gutter="20"> - <el-col :span="6"> - <InfoItem label="工艺名称" :value="form.name" /> - </el-col> - <el-col :span="6"> - <InfoItem label="产线" :value="form.lineName" /> - </el-col> - <el-col :span="12"> - <InfoItem label="工艺描述" :value="form.remark" /> - </el-col> - </el-row> + <el-row :gutter="20"> + <el-col :span="6"> + <InfoItem label="工艺名称" :value="form.name" /> + </el-col> + <el-col :span="6"> + <InfoItem label="产线" :value="form.lineName" /> + </el-col> + <el-col :span="12"> + <InfoItem label="工艺描述" :value="form.remark" /> + </el-col> + </el-row> - <el-row :gutter="20" style="margin-top: 12px"> - <el-col :span="6"> - <!-- <InfoItem label="创建人" value="xxse" /> --> - </el-col> - <el-col :span="6"> - <InfoItem label="创建时间" :value="form.createTime" :time-format="true" /> - </el-col> - <el-col :span="6"> - <!-- <InfoItem label="更新人" value="xxse" /> --> - </el-col> - <el-col :span="6"> - <!-- <InfoItem label="更新时间" value="2023-10-22 10:11:00" /> --> - </el-col> - </el-row> - </section> + <el-row :gutter="20" style="margin-top: 12px"> + <el-col :span="6"> + <!-- <InfoItem label="创建人" value="xxse" /> --> + </el-col> + <el-col :span="6"> + <InfoItem label="创建时间" :value="form.createTime" :time-format="true" /> + </el-col> + <el-col :span="6"> + <!-- <InfoItem label="更新人" value="xxse" /> --> + </el-col> + <el-col :span="6"> + <!-- <InfoItem label="更新时间" value="2023-10-22 10:11:00" /> --> + </el-col> + </el-row> + </section> </template> <script> @@ -49,7 +50,9 @@ const InfoItem = { return {}; }, computed: {}, - methods: {}, + methods: { + + }, render: function (h) { return ( <div style="display: flex; align-items: center; font-size: 14px; line-height: 1.5"> @@ -99,7 +102,10 @@ export default { params: method === 'get' ? payload : null, data: method !== 'get' ? payload : null, }); - }, + }, + goBack() { + this.$router.go(-1); + }, put(payload) { return this.http(this.updateUrl, 'put', payload); }, diff --git a/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue b/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue index 9b4903ff..292c284a 100644 --- a/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue +++ b/src/views/extend/processTraceabilityDetail/components/ProcessBomList.vue @@ -177,7 +177,7 @@ export default { immediate: true, deep: true } - }, + }, methods: { handleSearchBarBtnClick(val) { console.log(val) @@ -281,7 +281,7 @@ export default { }, }; </script> - +` ` <style scoped lang="scss"> .process-bom { position: relative; diff --git a/src/views/material/material/add-or-updata.vue b/src/views/material/material/add-or-updata.vue index fd0f1893..8643a161 100644 --- a/src/views/material/material/add-or-updata.vue +++ b/src/views/material/material/add-or-updata.vue @@ -154,8 +154,15 @@ export default { required: true, message: '物料产品类型不能为空', trigger: 'blur', - }, - ], + }, + ], + specifications: [ + { + required: true, + message: '规格不能为空', + trigger: 'blur', + }, + ], }, }; }, diff --git a/src/views/material/materialProductBom/attr-add.vue b/src/views/material/materialProductBom/attr-add.vue index d79b3582..df32b458 100644 --- a/src/views/material/materialProductBom/attr-add.vue +++ b/src/views/material/materialProductBom/attr-add.vue @@ -123,8 +123,10 @@ export default { typeId:typeId } const materData = await getMaterialList(listQuery); - this.materialList = []; - this.materialList = materData.data; + this.materialList = []; + console.log('materData', materData); + + this.materialList = materData.data.filter(item => item.typeId === 2) }, init(id) { this.dataForm.id = id || ''; diff --git a/src/views/material/materialUseLog/add-or-updata.vue b/src/views/material/materialUseLog/add-or-updata.vue index 6d40925d..c615cd5f 100644 --- a/src/views/material/materialUseLog/add-or-updata.vue +++ b/src/views/material/materialUseLog/add-or-updata.vue @@ -6,138 +6,75 @@ * @Description: --> <template> - <el-form - :model="dataForm" - :rules="dataRule" - ref="dataForm" - @keyup.enter.native="dataFormSubmit()" - label-width="80px" - label-position="top"> - <el-row :gutter="20"> - <el-col :span="8"> - <el-form-item label="物料名称" prop="materialId"> - <el-select - v-model="dataForm.materialId" - placeholder="请选择物料" - clearable - filterable - @change="setCode" - style="width: 100%"> - <el-option - v-for="dict in materialList" - :key="dict.id" - :label="dict.name" - :value="dict.id" /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="物料编码" prop="materialCode"> - <el-input - v-model="dataForm.materialCode" - clearable - disabled - placeholder="请输入物料编码" /> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="物料批次" prop="materialDate"> - <el-select - v-model="dataForm.materialDate" - clearable - filterable - allow-create - placeholder="请选择物料批次" - style="width: 100%"> - <el-option - v-for="dict in materialDateList" - :key="dict.id" - :label="dict.code" - :value="dict.code" /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="20"> - <el-col :span="8"> - <el-form-item label="使用设备" prop="equipmentId"> - <el-select - v-model="dataForm.equipmentId" - clearable - filterable - placeholder="请选择使用设备" - style="width: 100%"> - <el-option - v-for="dict in eqList" - :key="dict.id" - :label="dict.name" - :value="dict.id" /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="使用时间" prop="useTime"> - <el-date-picker - v-model="dataForm.useTime" - type="datetime" - format="yyyy-MM-dd HH:mm:ss" - value-format="timestamp" - placeholder="选择日期时间" /> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="操作员" prop="userNames"> - <el-select - v-model="dataForm.userNames" - clearable - filterable - multiple - placeholder="请选择操作员" - style="width: 100%"> - <el-option - v-for="dict in workersList" - :key="dict.id" - :label="dict.nickname" - :value="dict.nickname" /> - </el-select> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="20"> - <el-col :span="8"> - <el-form-item label="使用数量" prop="num"> - <el-input-number - v-model="dataForm.num" - clearable - controls-position="right" - placeholder="请输入使用数量" - style="width: 100%" /> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="数据来源" prop="source"> - <el-select - v-model="dataForm.source" - clearable - placeholder="请选择数据来源"> - <el-option - v-for="dict in this.dataSourceList" - :key="dict.id" - :label="dict.name" - :value="dict.id" /> - </el-select> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="备注" prop="remark"> - <el-input - v-model="dataForm.remark" - clearable - placeholder="请输入备注" /> - </el-form-item> - </el-col> - </el-row> - </el-form> + <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()" label-width="80px" + label-position="top"> + <el-row :gutter="20"> + <el-col :span="8"> + <el-form-item label="物料名称" prop="materialId"> + <el-select v-model="dataForm.materialId" placeholder="请选择物料" clearable filterable @change="setCode" + style="width: 100%"> + <el-option v-for="dict in materialList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="物料编码" prop="materialCode"> + <el-input v-model="dataForm.materialCode" clearable disabled placeholder="请输入物料编码" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="物料批次" prop="materialDate"> + <el-select v-model="dataForm.materialDate" clearable filterable allow-create placeholder="请选择物料批次" + style="width: 100%"> + <el-option v-for="dict in materialDateList" :key="dict.id" :label="dict.code" :value="dict.code" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="8"> + <el-form-item label="使用设备" prop="equipmentId"> + <el-select v-model="dataForm.equipmentId" clearable filterable placeholder="请选择使用设备" style="width: 100%"> + <el-option v-for="dict in eqList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="使用时间" prop="useTime"> + <el-date-picker v-model="dataForm.useTime" type="datetime" style="width: 100%" format="yyyy-MM-dd HH:mm:ss" + value-format="timestamp" placeholder="选择日期时间" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="操作员" prop="userNames"> + <el-select v-model="dataForm.userNames" clearable filterable multiple placeholder="请选择操作员" + style="width: 100%"> + <el-option v-for="dict in workersList" :key="dict.id" :label="dict.nickname" :value="dict.nickname" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="8"> + <el-form-item label="使用数量" prop="num"> + <el-input-number v-model="dataForm.num" clearable controls-position="right" placeholder="请输入使用数量" + style="width: 100%" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="数据来源" prop="source"> + <el-select v-model="dataForm.source" clearable placeholder="请选择数据来源" style="width: 100%"> + <el-option v-for="dict in this.dataSourceList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="备注" prop="remark"> + <el-input v-model="dataForm.remark" clearable placeholder="请输入备注" /> + </el-form-item> + </el-col> + </el-row> + </el-form> </template> <script> diff --git a/src/views/packaging/custom/SmallTitle.vue b/src/views/packaging/custom/SmallTitle.vue new file mode 100644 index 00000000..93b4a18f --- /dev/null +++ b/src/views/packaging/custom/SmallTitle.vue @@ -0,0 +1,65 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 15:27:31 + * @LastEditors: zwq + * @LastEditTime: 2023-08-01 16:25:54 + * @Description: +--> +<template> + <div :class="[className, { 'p-0': noPadding }]"> + <slot /> + </div> +</template> + +<script> +export default { + props: { + size: { + // 取值范围: xl lg md sm + type: String, + default: 'de', + validator: function (val) { + return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1; + }, + }, + noPadding: { + type: Boolean, + default: false, + }, + }, + computed: { + className: function () { + return `${this.size}-title`; + }, + }, +}; +</script> + +<style lang="scss" scoped> +$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px); +$mgr: 8px; +@each $size, $height in $pxls { + .#{$size}-title { + font-size: 18px; + line-height: $height; + color: #000; + font-weight: 500; + font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif; + + &::before { + content: ''; + display: inline-block; + vertical-align: top; + width: 4px; + height: $height + 2px; + border-radius: 1px; + margin-right: $mgr; + background-color: #0b58ff; + } + } +} + +.p-0 { + padding: 0; +} +</style> diff --git a/src/views/packaging/custom/index.vue b/src/views/packaging/custom/index.vue new file mode 100644 index 00000000..97c816dc --- /dev/null +++ b/src/views/packaging/custom/index.vue @@ -0,0 +1,409 @@ +<template> + <el-drawer :visible.sync="drawer" :append-to-body="true" size="80%" > + <small-title slot="title" :no-padding="true"> + <!-- <template v-for="demo in demoList"> --> + <!-- <el-button :key="demo.name" :type="demo.name === curDemo ? 'primary' : ' '" @click="curDemo = demo.name"> --> + <!-- {{ $t('module.packingManage.printModelDesign') }} --> + 模板设计 + <!-- </el-button> --> + <!-- </template> --> + </small-title> + <el-card> + <el-row style="margin-bottom: 10px"> + <el-col :span="4"> + <!-- 模板选择 --> + + <!-- <el-select + v-model="mode" + filterable + :default-value="0" + option-label-prop="label" + style="width: 100%;" + @change="changeMode" + > + <el-option v-for="(opt,idx) in modeList" :key="idx" :label="opt.name" :value="idx"> + {{ opt.name }} + </el-option> + </el-select> --> + </el-col> + <el-col :span="20"> + <!-- 纸张设置 --> + <el-button-group style="margin:0 10px"> + <el-button v-for="(value,type) in paperTypes" :key="type" :type="curPaperType === type ? 'primary' : ' '" + @click="setPaper(type,value)"> + {{ type }} + </el-button> + </el-button-group> + <el-input-number style="margin:0 10px" :value="scaleValue " :precision="2" :step="0.1" :min="scaleMin" + :max="scaleMax" @change="changeScale" /> + <el-popover v-model="paperPopVisible" placement="bottom" width="300" title="设置纸张宽高(mm)"> + <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px"> + <el-input v-model="paperWidth" type="number" style=" width: 100px; text-align: center" place="宽(mm)" />~ + <el-input v-model="paperHeight" type="number" style=" width: 100px; text-align: center" place="高(mm)" /> + </div> + <div> + <el-button type="primary" style="width: 100%" size="mini" @click="otherPaper">确定</el-button> + </div> + <el-button slot="reference" type="primary" style="margin:0 10px">自定义宽高</el-button> + </el-popover> + + <!-- <a-button-group>--> + <!-- <template v-for="(value,type) in paperTypes">--> + <!-- <a-button :type="curPaperType === type ? 'primary' : 'info'" @click="setPaper(type,value)" :key="type">--> + <!-- {{ type }}--> + <!-- </a-button>--> + <!-- </template>--> + <!-- <a-popover v-model="paperPopVisible" title="设置纸张宽高(mm)" trigger="click">--> + <!-- <div slot="content">--> + <!-- <a-input-group compact style="margin: 10px 10px">--> + <!-- <a-input type="number" v-model="paperWidth" style=" width: 100px; text-align: center"--> + <!-- placeholder="宽(mm)"/>--> + <!-- <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff"--> + <!-- placeholder="~" disabled--> + <!-- />--> + <!-- <a-input type="number" v-model="paperHeight" style="width: 100px; text-align: center; border-left: 0"--> + <!-- placeholder="高(mm)"/>--> + <!-- </a-input-group>--> + <!-- <a-button type="primary" style="width: 100%" @click="otherPaper">确定</a-button>--> + <!-- </div>--> + <!-- <a-button :type="'other'==curPaperType?'primary':''">自定义纸张</a-button>--> + <!-- </a-popover>--> + <!-- </a-button-group>--> + + <!-- 预览/打印 --> + <el-button-group> + <el-button type="primary" icon="redo" @click="rotatePaper()">旋转</el-button> + <el-button type="primary" icon="el-icon-view" @click="preView"> + 预览 + </el-button> + <!-- <el-button type="primary" icon="el-icon-printer" @click="print"> + 直接打印 + </el-button> --> + <el-button type="primary" icon="el-icon-s-management" @click="save"> + 保存 + </el-button> + <el-button type="danger" icon="el-icon-delete" @click="clearPaper"> + 清空 + </el-button> + </el-button-group> + <!-- 保存/清空 --> + + </el-col> + </el-row> + <el-row :gutter="24"> + <el-col :span="4"> + <el-card style="height: 100vh"> + <el-row> + <el-col :span="24" class="rect-printElement-types hiprintEpContainer" /> + </el-row> + </el-card> + </el-col> + <el-col :span="16"> + <el-card class="card-design"> + <div id="hiprint-printTemplate" class="hiprint-printTemplate" /> + </el-card> + </el-col> + <el-col :span="4" class="params_setting_container"> + <el-card> + <el-row class="hinnn-layout-sider"> + <div id="PrintElementOptionSetting" /> + </el-row> + </el-card> + </el-col> + </el-row> + <!-- 预览 --> + <print-preview ref="preView" /> + </el-card> + </el-drawer> +</template> + +<script> + +import printPreview from './preview' +import { MessageBox } from 'element-ui' +import { hiprint } from 'vue-plugin-hiprint' +import providers from './providers' +// import printData from './print-data' +import $ from 'jquery' +import SmallTitle from './SmallTitle.vue' +let hiprintTemplate = null +export default { + name: 'PrintCustom', + components: { printPreview, SmallTitle }, + // props: { + // modelData: { + // type: String, + // default: '' + // } + // }, + data() { + return { + // paperPopVisible: false, + // 模板选择 + mode: 0, + template: null, + modeList: [], + // 当前纸张 + curPaper: { + // type: 'other', + // width: 220, + // height: 80 + }, + printData:{}, + drawer: false, + // 纸张类型 + paperTypes: { + 'A3': { + width: 420, + height: 296.6 + }, + 'A4': { + width: 210, + height: 297 + }, + 'A5': { + width: 210, + height: 147.6 + }, + 'B3': { + width: 500, + height: 352.6 + }, + 'B4': { + width: 250, + height: 352.6 + }, + 'B5': { + width: 250, + height: 175.6 + } + }, + scaleValue: 1, + scaleMax: 5, + scaleMin: 0.5, + // 自定义纸张 + paperPopVisible: false, + paperWidth: '210', + paperHeight: '297' + } + }, + computed: { + curPaperType() { + let type = 'other' + const types = this.paperTypes + for (const key in types) { + const item = types[key] + const { width, height } = this.curPaper + if (item.width === width && item.height === height) { + type = key + } + } + return type + } + }, + created() { + // $('.hiprintEpContainer').empty() + }, + destroyed () { + $('.hiprintEpContainer').empty() + console.log(11111) + }, + methods: { + // handleClose() { + // $('.hiprintEpContainer').empty() + // }, + closed() { + $('.hiprintEpContainer').empty() + $('.hiprint-printTemplate').empty() + }, + init(data) { + this.drawer = true + this.modelData = data + this.modeList = providers.map((e) => { + return { type: e.type, name: e.name, value: e.value } + }) + this.changeMode() + }, + changeMode() { + // hiprintTemplate.clear() + // console.log(this.modelData) + this.$nextTick(() => { + const { mode } = this + const provider = providers[mode] + hiprint.init({ + providers: [provider.f] + }) + + // $('#hiprint-printTemplate').empty() + // console.log(JSON.parse(this.modelData)) + hiprint.setConfig() + // 替换配置 + hiprint.setConfig({ + movingDistance: 2.5, + text: { + supportOptions: [ + { + name: 'styler', + hidden: true + }, + { + name: 'formatter', + hidden: true + } + ] + } + }) + + // console.log(this.modelData) + // console.log($('#hiprint-printTemplate').empty()) + // if () { + // console.log(this.modelData); + // $('.hiprintEpContainer').empty() + // hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value) + // $('.hiprint-printTemplate').empty() + // hiprintTemplate = new hiprint.PrintTemplate({ + // template: JSON.parse(this.modelData), + // settingContainer: '#PrintElementOptionSetting', + // paginationContainer: '.hiprint-printPagination' + // }) + // } else { + $('.hiprintEpContainer').empty() + console.log(this.modelData); + hiprint.PrintElementTypeManager.build('.hiprintEpContainer', provider.value) + $('.hiprint-printTemplate').empty() + // const templates = this.$ls.get('KEY_TEMPLATES', {}) + const template = provider.value + // console.log(template) + hiprintTemplate = new hiprint.PrintTemplate({ + template: this.modelData != '' ? JSON.parse(this.modelData) : {}, + settingContainer: '#PrintElementOptionSetting', + paginationContainer: '.hiprint-printPagination' + }) + // } + hiprintTemplate.design('#hiprint-printTemplate') + // console.log(hiprintTemplate) + console.log(hiprintTemplate); + // hiprintTemplate.design('#hiprint-printTemplate', { grid: true }) + // 获取当前放大比例, 当zoom时传true 才会有 + this.scaleValue = hiprintTemplate.editingPanel.scale || 1 + // this.scaleValue = hiprintTemplate.editingPanel.scale || 1 + }) + }, + /** + * 设置纸张大小 + * @param type [A3, A4, A5, B3, B4, B5, other] + * @param value {width,height} mm + */ + setPaper(type, value) { + try { + if (Object.keys(this.paperTypes).includes(type)) { + this.curPaper = { type: type, width: value.width, height: value.height } + hiprintTemplate.setPaper(value.width, value.height) + } else { + this.curPaper = { type: 'other', width: value.width, height: value.height } + hiprintTemplate.setPaper(value.width, value.height) + } + } catch (error) { + this.$message.error(`操作失败: ${error}`) + } + }, + changeScale(currentValue, oldValue) { + let big = false + currentValue <= oldValue ? big = false : big = true + let scaleValue = this.scaleValue + if (big) { + scaleValue += 0.1 + if (scaleValue > this.scaleMax) scaleValue = 5 + } else { + scaleValue -= 0.1 + if (scaleValue < this.scaleMin) scaleValue = 0.5 + } + if (hiprintTemplate) { + // scaleValue: 放大缩小值, false: 不保存(不传也一样), 如果传 true, 打印时也会放大 + hiprintTemplate.zoom(scaleValue) + this.scaleValue = scaleValue + } + }, + clearPaper() { + MessageBox.confirm('是否确认清空模板信息?', '警告', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + try { + hiprintTemplate.clear() + } catch (error) { + this.$message.error(`操作失败: ${error}`) + } + }).catch((err) => { + console.log(err) + }) + }, + otherPaper() { + const value = {} + value.width = this.paperWidth + value.height = this.paperHeight + this.paperPopVisible = false + this.setPaper('other', value) + }, + rotatePaper() { + if (hiprintTemplate) { + hiprintTemplate.rotatePaper() + } + }, + preView() { + const { width } = this.curPaper + this.$refs.preView.show(hiprintTemplate, this.printData, width) + }, + print() { + // if (window.hiwebSocket.opened) { + const printerList = hiprintTemplate.getPrinterList() + console.log(printerList) + hiprintTemplate.print2(this.printData, { printer: '', title: '预览打印' }) + // return + // } + // this.$message.error('客户端未连接,无法直接打印') + }, + save() { + // console.log(hiprintTemplate.getJson()) + const { mode } = this + const provider = providers[mode] + // console.log(hiprintTemplate.getJson()) + this.setTemplate({ + name: provider.value, + json: hiprintTemplate.getJson() + }) + }, + setTemplate(payload) { + // const templates = this.$ls.get('KEY_TEMPLATES', {}) + // console.log(payload.json) + // templates[payload.name] = payload.json + // this.$ls.set('KEY_TEMPLATES', templates) + this.$message.info('保存成功') + // console.log(JSON.stringify(payload.json)) + this.drawer = false + this.$emit('saveData', payload.json) + $('.hiprintEpContainer').empty() + // this.$parent.$parent.getModelData(payload.json) + } + } +} +</script> + +<style lang="scss" scoped> +// build 拖拽 +::v-deep .hiprint-printElement-type >li>ul>li>a { + padding: 4px 4px; + color: #1296db; + line-height: 1; + height: auto; + text-overflow: ellipsis; +} +// 设计容器 +.card-design { + // overflow: hidden; + overflow-x: auto; + overflow-y: auto; +} + +</style> diff --git a/src/views/packaging/custom/preview.vue b/src/views/packaging/custom/preview.vue new file mode 100644 index 00000000..f7d18de2 --- /dev/null +++ b/src/views/packaging/custom/preview.vue @@ -0,0 +1,89 @@ +<!-- + * @Author: zhp + * @Date: 2023-09-27 14:23:54 + * @LastEditTime: 2023-10-19 11:20:36 + * @LastEditors: zhp + * @Description: +--> +<template> + <el-dialog :visible="visible" :mask-closable="false" width="50%" @close="hideModal" :append-to-body="true"> + <div id="preview_content" /> + <template slot="title"> + <div style="margin-right: 20px">打印预览</div> + <el-button :loading="waitShowPrinter" type="primary" icon="printer" @click.stop="print">打印</el-button> + <el-button type="primary" icon="printer" @click.stop="toPdf">pdf</el-button> + </template> + <template slot="footer"> + <el-button key="close" type="info" @click="hideModal"> + 关闭 + </el-button> + </template> + </el-dialog> +</template> + +<script> +export default { + name: 'PrintPreview', + props: {}, + data() { + return { + visible: false, + spinning: true, + waitShowPrinter: false, + // 纸张宽 mm + width: 0, + // 模板 + hiprintTemplate: {}, + // 数据 + printData: {} + } + }, + computed: {}, + watch: {}, + created() { + }, + mounted() { + }, + methods: { + hideModal() { + this.visible = false + }, + show(hiprintTemplate, printData, width = '210') { + this.visible = true + this.spinning = true + this.width = width + this.hiprintTemplate = hiprintTemplate + this.printData = printData + console.log(hiprintTemplate) + console.log(printData) + setTimeout(() => { + // eslint-disable-next-line no-undef + $('#preview_content').html(hiprintTemplate.getHtml(printData)) + this.spinning = false + }, 500) + }, + print() { + this.waitShowPrinter = true + this.hiprintTemplate.print(this.printData, {}, { + callback: () => { + console.log('callback') + this.waitShowPrinter = false + } + }) + }, + toPdf() { + this.hiprintTemplate.toPdf({}, '打印预览') + } + } +} + +</script> +<!-- <style lang="less" scoped> +/deep/ .ant-modal-body { + padding: 0px; +} + +/deep/ .ant-modal-content { + margin-bottom: 24px; +} +</style> --> diff --git a/src/views/packaging/custom/print-data.js b/src/views/packaging/custom/print-data.js new file mode 100644 index 00000000..077f8388 --- /dev/null +++ b/src/views/packaging/custom/print-data.js @@ -0,0 +1,90 @@ +/* + * @Author: zhp + * @Date: 2023-09-27 14:23:54 + * @LastEditTime: 2023-09-27 14:29:59 + * @LastEditors: zhp + * @Description: + */ +export default { + totalCap: '壹佰元整', + test: { + a: '111', + b: '222', + longText: '浙江在线3月29日讯最近,\n一篇小学五年级学生写的作文引起了钱报记者的关注这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文《脏话风波》浙江在线3月29日讯最近,一篇小学五年级学生写的作文引起了钱报记者的关注。这篇作文的题目叫做《脏话风波》,讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文讲述的是小作者班级里发生的一种不文明现象——讲脏话的同学越来越多,有的人说话甚至句句“带把儿”。班主任为了遏制这种现象,煞费苦心想了很多办法,跟学生斗智斗勇……看到这篇作文,记者突然想到,自己读六年级的儿子有天突然冒出一句脏话。此前,他是从不说脏话的。问他怎么学会的,他也说不出个所以然来。于是,记者做了这个小学生脏话现象调查。经过了解才发现,小学生爱说脏话竟然较为普遍,一般三年级会冒出苗头。无论是学习成绩好的,还是平时不太起眼的,都会说脏话。而且,说脏话会“传染”,一旦冒头不制止,到了五六年级甚至可能在班里大爆发。以下为作文' + }, + testaaa: { + a: { + b: { + c: { + d: 'dddddddddddd' + } + } + } + }, + table_test: { + a: [ + { NAME: '测试商品01', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品02', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品03', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品04', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品05', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品06', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品07', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品08', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品09', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品10', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品11', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品12', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品13', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品14', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品15', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品16', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品17', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品18', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品19', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品20', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品21', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品22', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品23', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品24', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品25', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品26', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品27', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品28', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品29', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品30', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' } + ] + }, + table: [ + { NAME: '测试商品01', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品02', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品03', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品04', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品05', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品06', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品07', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品08', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品09', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品10', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品11', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品12', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品13', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品14', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品15', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品16', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品17', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品18', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品19', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品20', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品21', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品22', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品23', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品24', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品25', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品26', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品27', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品28', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品29', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' }, + { NAME: '测试商品30', SL: 2, GG: '1*24g', TM: '2O22010100110', DJ: '6.8', JE: '13.6' } + ] +} diff --git a/src/views/packaging/custom/providers.js b/src/views/packaging/custom/providers.js new file mode 100644 index 00000000..a37fb60f --- /dev/null +++ b/src/views/packaging/custom/providers.js @@ -0,0 +1,245 @@ +/* eslint-disable */ +import {hiprint} from 'vue-plugin-hiprint' + +/* eslint-disable */ +// import {hiprint} from '../../index' + +// 自定义设计元素1 +export const aProvider = function (ops) { + var addElementTypes = function (context) { + context.removePrintElementTypes("aProviderModule"); + context.addPrintElementTypes( + "aProviderModule", + [ + new hiprint.PrintElementTypeGroup("平台", [ + { + tid: 'aProviderModule.header', title: '单据表头', data: '单据表头', type: 'text', + options: { + testData: '单据表头', + height: 17, + fontSize: 16.5, + fontWeight: "700", + textAlign: "center", + hideTitle: true + } + }, + { + tid: 'aProviderModule.type', title: '单据类型', data: '单据类型', type: 'text', + options: { + testData: '单据类型', + height: 16, + fontSize: 15, + fontWeight: "700", + textAlign: "center", + hideTitle: true + } + }, + { + tid: 'aProviderModule.order', title: '订单编号', data: 'XS888888888', type: 'text', + options: { + field: 'orderId', + testData: 'XS888888888', + height: 16, + fontSize: 6.75, + fontWeight: "700", + textAlign: "left", + textContentVerticalAlign: "middle" + } + }, + { + tid: 'aProviderModule.date', title: '业务日期', data: '2020-01-01', type: 'text', + options: { + field: 'date', + testData: '2020-01-01', + height: 16, + fontSize: 6.75, + fontWeight: "700", + textAlign: "left", + textContentVerticalAlign: "middle" + } + }, + { + tid: 'aProviderModule.barcode', title: '条形码', data: 'XS888888888', type: 'text', + options: { + field: 'barcode', + testData: 'XS888888888', + height: 32, + fontSize: 12, + lineHeight: 18, + textType: "barcode" + } + }, + { + tid: 'aProviderModule.qrcode', title: '二维码', data: 'XS888888888', type: 'text', + options: { + field: 'qrcode', + testData: 'XS888888888', + height: 32, + fontSize: 12, + lineHeight: 18, + textType: "qrcode" + } + }, + { + tid: 'aProviderModule.platform', title: '平台名称', data: '平台名称', type: 'text', + options: { + testData: '平台名称', + height: 17, + fontSize: 16.5, + fontWeight: "700", + textAlign: "center", + hideTitle: true + } + }, + {tid: 'aProviderModule.logo', title: 'Logo', data: '', type: 'image'}, + ]), + new hiprint.PrintElementTypeGroup("库管", [ + { + tid: 'aProviderModule.creater', title: '制单人', data: '李四', type: 'text', + options: { + field: 'creater', + testData: '李四', + height: 16, + fontSize: 6.75, + fontWeight: "700", + textAlign: "left", + textContentVerticalAlign: "middle" + } + }, + { + tid: 'aProviderModule.printDate', title: '打印时间', data: '2022-01-01 09:00', type: 'text', + options: { + field: 'printDate', + testData: '2022-01-01 09:00', + height: 16, + fontSize: 6.75, + fontWeight: "700", + textAlign: "left", + textContentVerticalAlign: "middle" + } + }, + { + tid: 'aProviderModule.signer', title: '库管签字', data: '', type: 'text', + options: { + title: '库管签字:', + height: 16, + fontSize: 6.75, + fontWeight: "700", + textAlign: "left", + textContentVerticalAlign: "middle" + } + }, + ]), + new hiprint.PrintElementTypeGroup("表格/其他", [ + { + tid: 'aProviderModule.table', title: '订单数据', + type: 'table', + options: { + field: 'table', + tableHeaderRepeat: 'first', + tableFooterRepeat: 'last', + fields: [ + {text: '名称', field: 'NAME'}, + {text: '数量', field: 'SL'}, + {text: '规格', field: 'GG'}, + {text: '条码', field: 'TM'}, + {text: '单价', field: 'DJ'}, + {text: '金额', field: 'JE'}, + ], + }, + editable: true, + columnDisplayEditable: true,//列显示是否能编辑 + columnDisplayIndexEditable: true,//列顺序显示是否能编辑 + columnTitleEditable: true,//列标题是否能编辑 + columnResizable: true, //列宽是否能调整 + columnAlignEditable: true,//列对齐是否调整 + isEnableEditField: true, //编辑字段 + isEnableContextMenu: true, //开启右键菜单 默认true + isEnableInsertRow: true, //插入行 + isEnableDeleteRow: true, //删除行 + isEnableInsertColumn: true, //插入列 + isEnableDeleteColumn: true, //删除列 + isEnableMergeCell: true, //合并单元格 + columns: [ + [ + {title: '名称', align: 'center', field: 'NAME', width: 150}, + {title: '数量', align: 'center', field: 'SL', width: 80}, + {title: '规格', align: 'center', field: 'GG', width: 80, checked: false}, + {title: '条码', align: 'center', field: 'TM', width: 100, checked: false}, + {title: '单价', align: 'center', field: 'DJ', width: 100}, + {title: '金额', align: 'center', field: 'JE', width: 100, checked: false}, + ], + ], + rowsColumnsMerge: function (data, col, index) { + // 返回一个数组,参数一为行(rowspan)合并数,参数二为列(colspan)合并数, 被合并的行或者列值设为0 + if (index == 0) { + return [1, data.INDEX % 2 == 1 ? 2 : 1] + } else if (index > 0 && index < 2) { + return [data.INDEX % 2 == 1 ? 0 : 1, 1] + } else { + return [data.INDEX % 2 == 1 ? 2 : 0, 1] + } + }, + footerFormatter: function (options, rows, data, currentPageGridRowsData) { + if (data && data['totalCap']) { + return `<td style="padding:0 10px" colspan="100">${'应收金额大写: ' + data['totalCap']}</td>` + } + return '<td style="padding:0 10px" colspan="100">应收金额大写: </td>' + }, + }, + {tid: 'aProviderModule.customText', title: '文本', customText: '自定义文本', custom: true, type: 'text'}, + { + tid: 'aProviderModule.longText', title: '长文本', type: 'longText', options: { + field: 'test.longText', + width: 200, + testData: '长文本分页/不分页测试' + }, + } + ]), + new hiprint.PrintElementTypeGroup("辅助", [ + { + tid: 'aProviderModule.hline', + title: '横线', + type: 'hline' + }, + { + tid: 'aProviderModule.vline', + title: '竖线', + type: 'vline' + }, + { + tid: 'aProviderModule.rect', + title: '矩形', + type: 'rect' + }, + { + tid: 'aProviderModule.oval', + title: '椭圆', + type: 'oval' + }, + { + tid: 'aProviderModule.barcode', + title: '条形码', + type: 'barcode', + }, + { + tid: 'aProviderModule.qrcode', + title: '二维码', + type: 'qrcode', + } + ]) + ] + ); + }; + return { + addElementTypes: addElementTypes + }; +}; + +// type: 1供货商 2经销商 +export default [{ + name: 'A设计', + value: 'aProviderModule', + type: 1, + f: aProvider() +}] diff --git a/src/views/packaging/mixins/basic-add.js b/src/views/packaging/mixins/basic-add.js new file mode 100644 index 00000000..0b9acd23 --- /dev/null +++ b/src/views/packaging/mixins/basic-add.js @@ -0,0 +1,100 @@ +/* + * @Author: zwq + * @Date: 2022-08-24 11:19:43 + * @LastEditors: zwq + * @LastEditTime: 2023-08-03 14:21:04 + * @Description: + */ +export default { + data() { + /* eslint-disable */ + return { + urlOptions: { + createURL: '', + updateURL: '', + infoURL: '', + codeURL: '', + getOption: false, + isGetCode: false, + optionArrUrl: [], + optionArr: {} + }, + visible: false, + setData: false + } + }, + created() { + }, + activated() { + }, + methods: { + init(id) { + this.dataForm.id = id || ""; + this.visible = true; + if (this.urlOptions.getOption) { + this.getArr() + } + this.$nextTick(() => { + this.$refs["dataForm"].resetFields(); + if (this.dataForm.id) { + this.urlOptions.infoURL(id).then(response => { + this.dataForm = response.data; + if (this.setData) { + this.setDataForm() + } + }); + } else { + if (this.urlOptions.isGetCode) { + this.getCode() + } + } + }); + }, + getCode() { + this.urlOptions.codeURL() + .then(({ data: res }) => { + this.dataForm.code = res; + }) + .catch(() => {}); + }, + getArr() { + const params = { + pageSize: 100, + pageNo: 1, + } + this.urlOptions.optionArrUrl.forEach((item, index) => { + item(params).then(({ data: res }) => { + this.$set(this.urlOptions.optionArr, `arr${index}`, res.list) + }) + .catch(() => { + }); + }); + }, + // 表单提交 + dataFormSubmit() { + this.$refs["dataForm"].validate((valid) => { + if (!valid) { + return false; + } + // 修改的提交 + if (this.dataForm.id) { + this.urlOptions.updateURL(this.dataForm).then(response => { + this.$modal.msgSuccess("修改成功"); + this.visible = false; + this.$emit("refreshDataList"); + }); + return; + } + // 添加的提交 + this.urlOptions.createURL(this.dataForm).then(response => { + this.$modal.msgSuccess("新增成功"); + this.visible = false; + this.$emit("refreshDataList"); + }); + }); + }, + formClear() { + this.$refs.dataForm.resetFields() + } + } +} diff --git a/src/views/packaging/mixins/basic-page.js b/src/views/packaging/mixins/basic-page.js new file mode 100644 index 00000000..28fa3b54 --- /dev/null +++ b/src/views/packaging/mixins/basic-page.js @@ -0,0 +1,170 @@ +/* + * @Author: zwq + * @Date: 2022-08-24 11:19:43 + * @LastEditors: zwq + * @LastEditTime: 2024-07-05 10:10:12 + * @Description: + */ +export default { + data() { + /* eslint-disable */ + return { + urlOptions: { + getDataListURL: '', + deleteURL: '', + statusUrl: '', + exportURL: '' + }, + tableData: [], + listQuery: { + pageSize: 10, + pageNo: 1, + total: 1, + }, + exportLoading: false, + dataListLoading: false, + addOrEditTitle: '', + addOrUpdateVisible: false, + } + }, + created() { + }, + mounted() { + this.getDataList() + }, + methods: { + // 获取数据列表 + getDataList() { + this.dataListLoading = true; + this.urlOptions.getDataListURL(this.listQuery).then(response => { + this.tableData = response.data.list; + this.listQuery.total = response.data.total; + this.dataListLoading = false; + }); + }, + // 每页数 + sizeChangeHandle(val) { + this.listQuery.pageSize = val; + this.listQuery.pageNo = 1; + this.getDataList(); + }, + // 当前页 + currentChangeHandle(val) { + this.listQuery.pageNo = val; + this.getDataList(); + }, + // 新增 + addOrUpdateHandle() { + this.addOrEditTitle = '新增'; + this.addOrUpdateVisible = true; + this.$nextTick(() => { + this.$refs.addOrUpdate.init(); + }); + }, + cancel(id) { + this.$refs["popover-" + id].showPopper = false; + }, + //改变状态 + changeStatus(id) { + this.$http + .post(this.urlOptions.statusUrl, { id }) + .then(({ data: res }) => { + if (res.code !== 0) { + return this.$message.error(res.msg); + } + this.$refs["popover-" + id].showPopper = false; + this.$message({ + message: this.$t("prompt.success"), + type: "success", + duration: 500, + onClose: () => { + this.getDataList(); + }, + }); + }) + .catch(() => { }); + }, + //tableBtn点击 + handleClick(val) { + console.log(val.data.packagingCode); + if (val.type === "edit") { + this.addOrUpdateVisible = true; + this.addOrEditTitle = "编辑"; + this.$nextTick(() => { + this.$refs.addOrUpdate.init(val.data.id); + }); + } else if (val.type === "delete") { + this.deleteHandle(val.data.id, val.data.name, val.data._pageIndex,val.data.packagingCode ) + } else if (val.type === "change") { + this.changeStatus(val.data.id) + } else { + this.otherMethods(val) + } + }, + // 删除 + deleteHandle(id, name, index) { + this.$confirm(`是否确认删除${name ? ' 名称为'+ name : '[' + index + ']'}数据项?`, "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }) + .then(() => { + this.urlOptions.deleteURL(id).then(({ data }) => { + this.$message({ + message: "操作成功", + type: "success", + duration: 1500, + onClose: () => { + this.getDataList(); + }, + }); + }); + }) + .catch(() => { }); + }, + //search-bar点击 + buttonClick(val) { + switch (val.btnName) { + case "search": + this.listQuery.xm1 = val.xm1; + this.listQuery.xm2 = val.xm2; + this.listQuery.pageNo = 1; + this.getDataList(); + break; + case "add": + this.addOrEditTitle = '新增' + this.addOrUpdateVisible = true; + this.addOrUpdateHandle() + break; + default: + console.log(val) + } + }, + handleCancel() { + this.$refs.addOrUpdate.formClear() + this.addOrUpdateVisible = false + this.addOrEditTitle = '' + }, + handleConfirm() { + this.$refs.addOrUpdate.dataFormSubmit() + }, + successSubmit() { + this.handleCancel() + this.getDataList() + }, + /** 导出按钮操作 */ + handleExport() { + // 处理查询参数 + let params = { ...this.queryParams }; + params.pageNo = undefined; + params.pageSize = undefined; + this.$modal.confirm('是否确认导出所有数据项?').then(() => { + this.exportLoading = true; + return this.urlOptions.exportURL(params); + }).then(response => { + this.$download.excel(response, '工厂.xls'); + this.exportLoading = false; + }).catch(() => { }); + } + } +} diff --git a/src/views/packaging/mixins/code-filter.js b/src/views/packaging/mixins/code-filter.js new file mode 100644 index 00000000..96061ff5 --- /dev/null +++ b/src/views/packaging/mixins/code-filter.js @@ -0,0 +1,85 @@ + +/* + * @Date: 2020-12-29 16:49:28 + * @LastEditors: zwq + * @LastEditTime: 2024-07-08 16:27:39 + * @FilePath: \basic-admin\src\filters\basicData\index.js + * @Description: + */ + +const table = { + lineStatus: { + 1: '生产中', + 2: '停止', + 3: '未知', + }, + reportType: { + 1: '日', + 2: '周', + 3: '月' + } +} + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.\d{3}/gm), ''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { + return ['日', '一', '二', '三', '四', '五', '六'][value] + } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} +// 遍历树结构返回数组 +export function getTreeArr(arr) { + let result =[] + arr.forEach(item => { + if(item.children && item.children.length>0){ + let {children,...obj} = item + result.push(obj) + result = result.concat(getTreeArr(children)) + }else{ + let {children,...obj} = item + result.push(obj) + } + }); + return result +} + +export default function (dictTable) { + return function (val) { + return table?.[dictTable]?.[val] + } +} diff --git a/src/views/packaging/packagingPrintLog/SmallTitle.vue b/src/views/packaging/packagingPrintLog/SmallTitle.vue new file mode 100644 index 00000000..93b4a18f --- /dev/null +++ b/src/views/packaging/packagingPrintLog/SmallTitle.vue @@ -0,0 +1,65 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 15:27:31 + * @LastEditors: zwq + * @LastEditTime: 2023-08-01 16:25:54 + * @Description: +--> +<template> + <div :class="[className, { 'p-0': noPadding }]"> + <slot /> + </div> +</template> + +<script> +export default { + props: { + size: { + // 取值范围: xl lg md sm + type: String, + default: 'de', + validator: function (val) { + return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1; + }, + }, + noPadding: { + type: Boolean, + default: false, + }, + }, + computed: { + className: function () { + return `${this.size}-title`; + }, + }, +}; +</script> + +<style lang="scss" scoped> +$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px); +$mgr: 8px; +@each $size, $height in $pxls { + .#{$size}-title { + font-size: 18px; + line-height: $height; + color: #000; + font-weight: 500; + font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif; + + &::before { + content: ''; + display: inline-block; + vertical-align: top; + width: 4px; + height: $height + 2px; + border-radius: 1px; + margin-right: $mgr; + background-color: #0b58ff; + } + } +} + +.p-0 { + padding: 0; +} +</style> diff --git a/src/views/packaging/packagingPrintLog/add-or-updata.vue b/src/views/packaging/packagingPrintLog/add-or-updata.vue new file mode 100644 index 00000000..6b1d63b4 --- /dev/null +++ b/src/views/packaging/packagingPrintLog/add-or-updata.vue @@ -0,0 +1,418 @@ +<!-- + * @Author: zhp + * @Date: 2023-10-17 16:50:19 + * @LastEditTime: 2023-10-30 10:47:13 + * @LastEditors: zhp + * @Description: +--> +<template> + <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="40%"> + <small-title slot="title" :no-padding="true"> + {{ !dataForm.id ? '新增' : '编辑' }} + </small-title> + + <div class="content"> + <div class="visual-part"> + <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px" + @keyup.enter.native="dataFormSubmit"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="包装流水号" prop="packagingCode"> + <el-input v-model="dataForm.packagingCode" clearable placeholder="请输入包装流水号" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="内容" prop="content"> + <el-input v-model="dataForm.content" clearable placeholder="请输入内容" /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="所属工单" prop="workOrderId"> + <el-select v-model="dataForm.workOrderId" style="width: 100%;" placeholder="请选择所属工单" clearable> + <el-option v-for="dict in workOrderList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="客户" prop="customerId"> + <el-select v-model="dataForm.customerId" style="width: 100%;" placeholder="请选择客户" clearable> + <el-option v-for="dict in customerList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="标签模板" prop="modelId"> + <el-select v-model="dataForm.modelId" style="width: 100%;" placeholder="请选择标签模板" clearable> + <el-option v-for="dict in modelList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <!-- <el-col :span="12"> + <el-form-item label="单位平方数" prop="area"> + <el-input v-model="dataForm.area" placeholder="请输入单位平方数" /> + </el-form-item> + </el-col> --> + </el-row> + <!-- <el-row :gutter="20"> + <el-col :span="24"> + <el-form-item label="完成单位产品用时" prop="processTime"> + <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" /> + </el-form-item> + </el-col> + </el-row> --> + </el-form> + + <!-- <small-title + style="margin: 16px 0; padding-left: 8px" + :no-padding="true"> + 产品属性列表 + </small-title> + + <div class="attr-list"> + <base-table + :table-props="tableProps" + :page="listQuery.pageNo" + :limit="listQuery.pageSize" + :add-button-show="isdetail ? null : '添加属性'" + @emitButtonClick="addNew()" + :table-data="productAttributeList"> + <method-btn + v-if="!isdetail" + slot="handleBtn" + :width="120" + label="操作" + :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination + v-show="listQuery.total > 0" + :total="listQuery.total" + :page.sync="listQuery.pageNo" + :limit.sync="listQuery.pageSize" + :page-sizes="[5, 10, 15]" + @pagination="getList" /> + </div> --> + </div> + </div> + + <!-- <div style="position: absolute; bottom: 24px; right: 24px"> + <el-button style="margin-right: 10px" @click="goback()">返回</el-button> + <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> + <span v-if="!isdetail"> + <el-button type="primary" @click="dataFormSubmit()">保存</el-button> + <el-button + v-if="dataForm.id && !isdetail" + type="primary" + @click="addNew()"> + 添加属性 + </el-button> + </span> + </div> --> + <template slot="footer"> + <el-button style="" @click="goback()">取消</el-button> + <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> --> + <el-button type="primary" @click="dataFormSubmit()">确定</el-button> + </template> + </el-dialog> +</template> + +<script> + +import { + createPacking, + updatePacking, + getPacking, + getWorkOrderList, + getCode, + getCustomerList, + getModelList +} from '@/api/base/packingInfo.js'; +// import productAttrAdd from './attr-add'; +import { parseTime } from '../mixins/code-filter'; +import SmallTitle from './SmallTitle'; + +const tableBtn = [ + { + type: 'edit', + btnName: '编辑', + }, + { + type: 'delete', + btnName: '删除', + }, +]; +const tableProps = [ + { + prop: 'createTime', + label: '添加时间', + filter: parseTime, + }, + { + prop: 'name', + label: '属性名', + }, + { + prop: 'value', + label: '属性值', + }, +]; + +export default { + components: { SmallTitle }, + data() { + return { + visible: false, + addOrUpdateVisible: false, + tableBtn, + tableProps, + customerList: [], + modelList:[], + workOrderList:[], + productAttributeList: [], + dataForm: { + id: null, + // name: '', // 产品名称 + packagingCode: '', // 产品编码 + // area: 0, // 单位平方数(float only) + modelId: null, // 产品类型id + workOrderId: null, // 单位产品用时 (s) + customerId: '', // 规格 + content: '', // 单位id + }, + listQuery: { + pageSize: 10, + pageNo: 1, + total: 0, + }, + dataRule: { + content: [ + { + required: true, + message: '内容不能为空', + trigger: 'blur', + }, + // { + // type: 'number', + // message: '产品编码为数字类型', + // trigger: 'blur', + // transfom: 'val => Number(val)', + // }, + ], + workOrderId: [ + { + required: true, + message: '所属工单不能为空', + trigger: 'change', + }, + ], + typeDictValue: [ + { + required: true, + message: '产品类型不能为空', + trigger: 'blur', + }, + ], + area: [ + { + type: 'number', + message: '请输入正确的数值', + trigger: 'change', + transform: (val) => Number(val), + }, + ], + processTime: [ + { + required: true, + message: '完成单位产品用时不能为空', + trigger: 'blur', + }, + { + type: 'number', + message: '请输入正确的数值', + trigger: 'blur', + transform: (val) => Number(val), + }, + ], + }, + // isdetail: false, + }; + }, + methods: { + // initData() { + // this.productAttributeList.splice(0); + // this.listQuery.total = 0; + // }, + init(id) { + this.getDict() + // this.initData(); + // this.isdetail = isdetail || false; + this.dataForm.id = id || null; + this.visible = true; + + this.$nextTick(() => { + this.$refs['dataForm'].resetFields(); + + if (this.dataForm.id) { + // 获取产品详情 + getPacking(id).then((response) => { + this.dataForm = response.data; + }); + // 获取产品的属性列表 + // this.getList(); + } else { + getCode().then((res) => { + this.dataForm.packagingCode = res.data; + }); + } + }); + }, + + getDict() { + // 获取产品的属性列表 + getCustomerList().then((response) => { + console.log(response); + this.customerList = response.data + // this.listQuery.total = response.data.total; + }) + getModelList().then((response) => { + console.log(response); + this.modelList = response.data + // this.listQuery.total = response.data.total; + }) + getWorkOrderList().then((response) => { + // console.log(response); + this.workOrderList = response.data + // this.listQuery.total = response.data.total; + }) + }, + // handleClick(raw) { + // if (raw.type === 'delete') { + // this.$confirm( + // `确定对${ + // raw.data.name + // ? '[名称=' + raw.data.name + ']' + // : '[序号=' + raw.data._pageIndex + ']' + // }进行删除操作?`, + // '提示', + // { + // confirmButtonText: '确定', + // cancelButtonText: '取消', + // type: 'warning', + // } + // ) + // .then(() => { + // deleteProductAttr(raw.data.id).then(({ data }) => { + // this.$message({ + // message: '操作成功', + // type: 'success', + // duration: 1500, + // onClose: () => { + // this.getList(); + // }, + // }); + // }); + // }) + // .catch(() => {}); + // } else { + // this.addNew(raw.data.id); + // } + // }, + // 表单提交 + dataFormSubmit() { + this.$refs['dataForm'].validate((valid) => { + if (valid) { + // 修改的提交 + if (this.dataForm.id) { + updatePacking(this.dataForm).then((response) => { + this.$modal.msgSuccess('修改成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + return; + } + // 添加的提交 + createPacking(this.dataForm).then((response) => { + this.$modal.msgSuccess('新增成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + } + }); + }, + // goEdit() { + // this.isdetail = false; + // }, + // // 新增 / 修改 + // addNew(id) { + // this.addOrUpdateVisible = true; + // this.$nextTick(() => { + // this.$refs.addOrUpdate.init(id); + // }); + // }, + goback() { + this.$emit('refreshDataList'); + this.visible = false; + // this.initData(); + }, + }, +}; +</script> + +<!-- <style scoped> +.drawer >>> .el-drawer { + border-radius: 8px 0 0 8px; + display: flex; + flex-direction: column; +} + +.drawer >>> .el-form-item__label { + padding: 0; +} + +.drawer >>> .el-drawer__header { + margin: 0; + padding: 32px 32px 24px; + border-bottom: 1px solid #dcdfe6; +} +.drawer >>> .el-drawer__body { + flex: 1; + height: 1px; + display: flex; + flex-direction: column; +} + +.drawer >>> .content { + padding: 30px 24px; + flex: 1; + display: flex; + flex-direction: column; + /* height: 100%; */ +} + +.drawer >>> .visual-part { + flex: 1 auto; + max-height: 76vh; + overflow: hidden; + overflow-y: scroll; + padding-right: 10px; /* 调整滚动条样式 */ +} + +.drawer >>> .el-form, +.drawer >>> .attr-list { + padding: 0 16px; +} + +.drawer-body__footer { + display: flex; + justify-content: flex-end; + padding: 18px; +} +</style> --> diff --git a/src/views/packaging/packagingPrintLog/index.vue b/src/views/packaging/packagingPrintLog/index.vue new file mode 100644 index 00000000..3e4ec4ea --- /dev/null +++ b/src/views/packaging/packagingPrintLog/index.vue @@ -0,0 +1,356 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 14:55:51 + * @LastEditors: zhp + * @LastEditTime: 2023-11-24 09:13:50 + * @Description: +--> +<template> + <div class="app-container"> + <search-bar + :formConfigs="formConfig" + ref="searchBarForm" + @headBtnClick="buttonClick" /> + <base-table + :table-props="tableProps" + :page="listQuery.pageNo" + :limit="listQuery.pageSize" + :table-data="tableData"> + <method-btn + v-if="tableBtn.length" + slot="handleBtn" + :width="120" + label="操作" + :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination + :limit.sync="listQuery.pageSize" + :page.sync="listQuery.pageNo" + :total="listQuery.total" + @pagination="getDataList" /> + <add-or-update + v-if="addOrUpdateVisible" + ref="addOrUpdate" + @refreshDataList="getDataList" /> + </div> +</template> + +<script> +import AddOrUpdate from './add-or-updata'; +// import unitDict from './unitDict'; +import basicPage from '../mixins/basic-page'; +import { parseTime } from '../mixins/code-filter'; +import { + getPackingModel, +} from '@/api/base/printModel.js' +import { + deletePacking, + getPackingPage, + getWorkOrderList, + exportPackingExcel, +} from '@/api/base/packingInfo'; + +const tableProps = [ + { + prop: 'packagingCode', + label: '包装流水号' + }, + { + prop: 'workOrderName', + label: '所属工单' + }, + { + prop: 'customerName', + label: '客户' + }, + { + prop: 'content', + label: '内容', + // subcomponent: unitDict, + }, + { + prop: 'modelName', + label: '标签模板', + // subcomponent: unitDict, + }, + { + prop: 'printStatus', + label: '打印状态', + filter: (val) => val == 1 ? '未打印' : '已打印', + }, + { + prop: 'createTime', + label: '生成日期', + filter: parseTime + }, +]; + +export default { + mixins: [basicPage], + data() { + return { + urlOptions: { + getDataListURL: getPackingPage, + deleteURL: deletePacking, + exportURL: exportPackingExcel, + }, + tableProps, + tableBtn: [ + { + type: 'print', + btnName: '打印', + }, + this.$auth.hasPermi(`base:packaging-print-log:update`) + ? { + type: 'edit', + btnName: '编辑', + } + : undefined, + this.$auth.hasPermi(`base:packaging-print-log:delete`) + ? { + type: 'delete', + btnName: '删除', + } + : undefined, + ].filter((v) => v), + tableData: [], + formConfig: [ + { + type: 'select', + label: '工单', + selectOptions: [], + labelField: 'name', + valueField: 'id', + param: 'workOrderId', + filterable: true, + }, + { + // parent: 'dateFilterType', + // 时间段选择 + type: 'datePicker', + // label: '时间段', + dateType: 'daterange', + format: 'yyyy-MM-dd HH:mm:ss', + valueFormat: 'yyyy-MM-dd HH:mm:ss', + defaultTime: ['00:00:00', '00:00:00'], + rangeSeparator: '-', + startPlaceholder: '开始时间', + endPlaceholder: '结束时间', + param: 'createTime', + }, + { + type: 'button', + btnName: '搜索', + name: 'search', + color: 'primary', + }, + // { + // type: 'separate', + // }, + // { + // type: 'button', + // btnName: '重置', + // name: 'reset', + // }, + { + type: 'separate', + }, + { + type: this.$auth.hasPermi('base:packaging-print-log:create') ? 'button' : '', + btnName: '新增', + name: 'add', + color: 'success', + plain: true, + }, + // { + // type: 'separate', + // type: this.$auth.hasPermi('base:product:create') ? 'separate' : '', + // }, + // { + // type: this.$auth.hasPermi('base:product:export') ? 'button' : '', + // btnName: '导出', + // name: 'export', + // color: 'warning', + // }, + ], + }; + }, + components: { + AddOrUpdate, + }, + created() { + this.getDict() + }, + methods: { + getDataList() { + this.dataListLoading = true; + this.urlOptions.getDataListURL(this.listQuery).then(response => { + this.tableData = response.data.records; + this.listQuery.total = response.data.total; + this.dataListLoading = false; + }); + }, + getDict() { + // 获取产品的属性列表 + // getCustomerList().then((response) => { + // console.log(response); + // this.customerList = response.data + // // this.listQuery.total = response.data.total; + // }) + // getModelList().then((response) => { + // console.log(response); + // this.modelList = response.data + // // this.listQuery.total = response.data.total; + // }) + getWorkOrderList().then((response) => { + // console.log(response); + this.formConfig[0].selectOptions = response.data.map((item) => { + return { + name: item.name, + id: item.id + } + }) + console.log(this.formConfig[0].selectOptions); + // this.listQuery.total = response.data.total; + }) + }, + deleteHandle(id, name, index, packagingCode) { + this.$confirm(`是否确认删除${'[' + packagingCode + ']'}数据项?`, "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }) + .then(() => { + this.urlOptions.deleteURL(id).then(({ data }) => { + this.$message({ + message: "操作成功", + type: "success", + duration: 1500, + onClose: () => { + this.getDataList(); + }, + }); + }); + }) + .catch(() => { }); + }, + handlePrint(id) { + if (id) { + getPackingModel(id).then(res => { + var obj = { + code: '11111222', + test: '11111', + test2: '3333333', + test1: '222222', + } + console.log(res); + // getPackingListInfo({ + // size: 20, + // current: 1, + // boxNo: printModel.boxNo + // }).then(result => { + // this.substrateList = result.data.records + // var obj = { + // // time: this.getNewDate(), + // boxNo: this.currentData.boxNo, + // orderNum: this.currentData.orderNum, + // powerLevel: this.currentData.powerLevel, + // sapMaterial: this.currentData.sapMaterial, + // img: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAHVklEQVR4nO2dT2wUVRzHv2/2T5eSAlvFilwgQUH+eLACaUxEiJLAxdh44MDZi2ChUIrSFtoCgbbSP4GDdwgeEA8kRTAI0iIGBL1ITLxgLAlCsCKBYndnx7zd35pl2+7On/de387OJ9l00515/z7z/szMmzfs7869mD0yCjw2gZAB4VhAiln4/dUaRGdU18aOnzw9dn24ioGJj0soFsJr1z2yNm+qN2/fvRFL8XyMYqTmFfxZ+TwMc1xKDsL/f2Ms8xGeLwuIRpCKx99MHf/i4uPrw5GQ9jIAfsCMXfw2HkuOX03Wb1qLh4+uIGFJjzecPoS5iEhUTg1hDMaM2GuRk6cGMTQUCYmPQQq86CMAkkPDkQirGAzXf7Du34ejN9IHmETCRjQGPL6D+4NnYDEJDQmXbaY6on/dm2Vm/jHdZe0Almm6Ll+YNQbzasX7765BNHI1o0sOYRghwExg7MG9dDQSiqsdwHuZmlFKMjLwQ3QcFtjlSxHTenLO3Lp7vfU09AOS41Ka+HC6CjIDIaqmguvIPgBtIgOcDhjVlMTQtarKOScumR/teCdpxoeNZGJCapjFt7Rcywrb2MYtnQBatCpZTzCkYCF+5suKRXf+6EvOmv0GSzwrhB/QpmGkBYZSpqvIZAlp8ZeMLFwKUH3z2gqWyd/+3F/5b1yRQQMCN8gQspeaKt+SAItSCxCiPjIjhDEkjRAMxmCZSbgZkYke537qdxl57KM8C0OkkD0ADohMXIlwgPIuBFFC9uS3p2XGflFSRAgpdxlZeBl84jUQr0ImjDTKGWZZBwE0eCkCL0J20UgjgGCwEDHNPjB86PbiilshfGRxOBCRD0tLCSWTnzMLO9yE4EbIzjIdTdmGpc8/rB4qK0c4FcKbqe7pyWZJ0k1lZhsnQnZq3EzV00dHDjupKXaFNGtcM7YA+Io+WzRIz2R0UxkWxY6QJgCHlCbfPlzAsZytj2ks5RCVZUGKCdkOoEt+Wl3RkCcjyzGv5wIS6aIynZJCQni7d0TTjPFaMFDg9wGNa8qRQn3KVEI+1rjPmKpm5KNzTemmMp7AZEK2AehXmz7bbC1SM/IZoH10pJ/K+hnyhXBrvZpmoBHAURf7HaV9daQ3v6Zk7hhWVr4AYDOAzzRNeKPHAyW7r459Yj/deUynMcyqqpY9/fXW+RTwkiF/ms5pADcd7nMbwAkBcfMM3wOwwOF+rys46TxCt+T72d2NG0YSg2fnC58ANDkbAZyVH41QNgAYVBTXNiMxeLYG6qawvagmGqGoTHOfwcAe6T8TvWwYlTC7OsALgRDNCIRoRiBEMwIhmhEI0YxAiGYEQjRDtZCY9iUyEaVpVi3kvuL4RKA0zSqF8Ad5TimMTxSnKO1KUCWEZ6hDVaYk0KFKigohbSUuI0uHiieKZQtp89kM+U7ZUmQKafHp4wpSH/eWJaTT5zPkD8g62GQI8cXqDTZok/HEsWgh+3Of2y4D2kU/0idKyEOaJdgqKLxSotXlfLFJESXkicKZGTrys6g0iRIyD8AvAFYLCq+UWC1yACOyD+Hrf1wAUCcwTN2pozzXiEqn6E59JoBvANQKDldHaimvM0WmTcawlydw2Oc1pY7yKFQGJJ4YxqiTXyEp/OlkBeVNyn0SmZdO5gC47rOOfjXlaY6sCGRfXKwA8LVP+pRaykuFzEhUXH7nR9P3AFYqiEsWKykP0mpGFlU3qKI0IlmlKD6RrKK0R1VEpvIW7uwSHXnVUdqVoHqSwz+K4xOB0jQH87I0IxCiGYEQzQiEaEYgRDMCIZoRCNGMQIhmBEI0gwuJK0xScKZemHiY1mzqUxThYgBLHO7zQOAzGnMBPOdwn8WC4rbDNjaSWVajQaEUp9wBsB7ALY/hLAVwHsB89VmwRXrhuGwf0q/xIl/z6f6105qVyxIKQ1cZjdlV/HI79V6N1yjk/dxlAMtc7LuM9lXZVzqhIXdxtvxR1kCxZUynkbl0o2ihgyQspH3mapqn7flrSE427O3TuKbwGZI/AlhuY9vltO08Belyw6T99lTnIQN2VmGeJqppskGhpfoW0DbVmuahaarVVQudGPZo3tH/RCOnfJbSbzp34D1T/VjsTL3X6esWFMJngJwDsCgnykX0P+mzQ1yyq9jqqtnzkGI0a7wgPz9pfJm+/6ZxB77bzus+7L7pkwdkarr8OBdwJee7jjQVaqZysVtDsuwK3j3lmGYnb5hwerW3S+PRl440OX3dh5vL7z0iXzXqY/bYbaZycXs/5KDdV/iUKc1URo7xcoOqq0yfui1Gq5e3EoUava1qzS/aJQGs8xKIj2jx+gCoVyGcoUBKGs8yIEgIAiliZEDwJAehL3ovIYS+2F9UDckyRH/fFhmoxuwTvdaJaCGc7+gyi9+br1YZSzTJEAIaffHrZG/JCFwDpK16JEsI5yK9uMdvzVe7zAUxZQrhXKKBwxqZkSikQ8aiZbnIFgKS4oea0i5bBhQJgQ+kKJEBhUJAUkqxo+cduJqVrQH8B6xBgBhvJFNDAAAAAElFTkSuQmCC', + // // lineBody: this.currentData.lineBody == 1 ? 'F ' : 'S', + // createTime: moment(this.currentData.createTime).format('YYYY-MM-DD HH:mm:ss') + // // modul1: '20210320000012', + // // modul2: '20210320000012', + // // modul3: '20210320000012' + // } + // for (var i = 0; i < this.substrateList.length; i++) { + // var model = 'model' + Number(i + 1) + // var pmpp = 'PMPP' + Number(i + 1) + // var m = 'm' + Number(i + 1) + + // console.log(model) + // // console.log(this.list[i].woSubstrateId) + // // console.log(this.list[i].woSubstrateId) + // obj['' + model + ''] = this.substrateList[i].woSubstrateId + // obj['' + pmpp + ''] = this.substrateList[i].pmpp + // obj['' + m + ''] = i + 1 + // } + // console.log(obj) + // this.printPreview('预览', res.data) + const hiprintTemplate = this.$print(undefined, JSON.parse(res.data.content), obj, {}, { + // styleHandler: () => { + // const css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">' + // return css + // } + }) + + hiprintTemplate.on('printSuccess', function () { + console.log(1111); + // that.$notification.success({ + // // key: key, + // placement: 'topRight', + // message: key + ' 打印成功', + // description: 'Api单独直接打印回调', + // }); + }); + console.log(hiprintTemplate) + }) + } else { + this.$message({ + message: '请选择打印标签模板', + type: 'warning' + }); + } + }, + closeCallback(vue) { + console.log('关闭了打印工具') + }, + buttonClick(val) { + switch (val.btnName) { + case 'search': + this.listQuery.pageNo = 1; + this.listQuery.pageSize = 10; + this.listQuery.workOrderId = val.workOrderId; + if (val.createTime && val.createTime.length != 0) { + this.listQuery.createTime = val.createTime + // this.listQuery.createTime[1] = val.timeVal[1] + } else { + this.listQuery.createTime = undefined + // this.listQuery.endTime = undefined + } + this.getDataList(); + console.log(this.tableData) + break; + case 'reset': + this.$refs.searchBarForm.resetForm(); + this.listQuery = { + pageSize: 10, + pageNo: 1, + total: 1, + }; + this.getDataList(); + break; + case 'add': + this.addOrEditTitle = '新增'; + this.addOrUpdateVisible = true; + this.addOrUpdateHandle(); + break; + case 'export': + this.handleExport(); + break; + default: + console.log(val); + } + }, + otherMethods(val) { + this.handlePrint(val.data.modelId) + // this.addOrUpdateVisible = true; + // this.addOrEditTitle = '详情'; + // this.$nextTick(() => { + // this.$refs.addOrUpdate.init(val.data.id, true); + // }); + }, + }, +}; +</script> diff --git a/src/views/packaging/packagingPrintLog/unitDict.vue b/src/views/packaging/packagingPrintLog/unitDict.vue new file mode 100644 index 00000000..94702ab4 --- /dev/null +++ b/src/views/packaging/packagingPrintLog/unitDict.vue @@ -0,0 +1,15 @@ +<template> + <dict-tag + :type="DICT_TYPE.UNIT_DICT" + :value="injectData.unitDictValue" /> +</template> +<script> +export default { + props: { + injectData: { + type: Object, + default: () => ({}), + }, + }, +}; +</script> diff --git a/src/views/packaging/packagingPrintModel/SmallTitle.vue b/src/views/packaging/packagingPrintModel/SmallTitle.vue new file mode 100644 index 00000000..93b4a18f --- /dev/null +++ b/src/views/packaging/packagingPrintModel/SmallTitle.vue @@ -0,0 +1,65 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 15:27:31 + * @LastEditors: zwq + * @LastEditTime: 2023-08-01 16:25:54 + * @Description: +--> +<template> + <div :class="[className, { 'p-0': noPadding }]"> + <slot /> + </div> +</template> + +<script> +export default { + props: { + size: { + // 取值范围: xl lg md sm + type: String, + default: 'de', + validator: function (val) { + return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1; + }, + }, + noPadding: { + type: Boolean, + default: false, + }, + }, + computed: { + className: function () { + return `${this.size}-title`; + }, + }, +}; +</script> + +<style lang="scss" scoped> +$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px); +$mgr: 8px; +@each $size, $height in $pxls { + .#{$size}-title { + font-size: 18px; + line-height: $height; + color: #000; + font-weight: 500; + font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif; + + &::before { + content: ''; + display: inline-block; + vertical-align: top; + width: 4px; + height: $height + 2px; + border-radius: 1px; + margin-right: $mgr; + background-color: #0b58ff; + } + } +} + +.p-0 { + padding: 0; +} +</style> diff --git a/src/views/packaging/packagingPrintModel/add-or-updata.vue b/src/views/packaging/packagingPrintModel/add-or-updata.vue new file mode 100644 index 00000000..9e66ebe9 --- /dev/null +++ b/src/views/packaging/packagingPrintModel/add-or-updata.vue @@ -0,0 +1,441 @@ +<!-- + * @Author: zhp + * @Date: 2023-10-17 16:50:19 + * @LastEditTime: 2023-10-30 10:41:07 + * @LastEditors: zhp + * @Description: +--> +<template> + <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="30%"> + <small-title slot="title" :no-padding="true"> + {{ !dataForm.id ? '新增' : '编辑' }} + </small-title> + + <div class="content"> + <div class="visual-part"> + <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px" + @keyup.enter.native="dataFormSubmit"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="模板名称" prop="name"> + <el-input v-model="dataForm.name" clearable placeholder="请输入模板名称" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="标签类型" prop="typeId"> + <el-select v-model="dataForm.typeId" style="width: 100%;" placeholder="请选择打印方式" clearable> + <el-option v-for="dict in typeList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="打印方式" prop="printModel"> + <el-select v-model="dataForm.printModel" style="width: 100%;" placeholder="请选择打印方式" clearable> + <el-option v-for="dict in printModelList" :key="dict.id" :label="dict.name" :value="dict.id" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="标签备注" prop="remark"> + <el-input v-model="dataForm.remark" clearable placeholder="请输入标签备注" /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="模板设计" prop="content"> + <el-button type="primary" @click="btnClickDesign()">模板设计</el-button> + </el-form-item> + </el-col> + <!-- <el-col :span="12"> + <el-form-item label="单位平方数" prop="area"> + <el-input v-model="dataForm.area" placeholder="请输入单位平方数" /> + </el-form-item> + </el-col> --> + </el-row> + <!-- <el-row :gutter="20"> + <el-col :span="24"> + <el-form-item label="完成单位产品用时" prop="processTime"> + <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" /> + </el-form-item> + </el-col> + </el-row> --> + </el-form> + + <!-- <small-title + style="margin: 16px 0; padding-left: 8px" + :no-padding="true"> + 产品属性列表 + </small-title> + + <div class="attr-list"> + <base-table + :table-props="tableProps" + :page="listQuery.pageNo" + :limit="listQuery.pageSize" + :add-button-show="isdetail ? null : '添加属性'" + @emitButtonClick="addNew()" + :table-data="productAttributeList"> + <method-btn + v-if="!isdetail" + slot="handleBtn" + :width="120" + label="操作" + :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination + v-show="listQuery.total > 0" + :total="listQuery.total" + :page.sync="listQuery.pageNo" + :limit.sync="listQuery.pageSize" + :page-sizes="[5, 10, 15]" + @pagination="getList" /> + </div> --> + </div> + </div> + + <!-- <div style="position: absolute; bottom: 24px; right: 24px"> + <el-button style="margin-right: 10px" @click="goback()">返回</el-button> + <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> + <span v-if="!isdetail"> + <el-button type="primary" @click="dataFormSubmit()">保存</el-button> + <el-button + v-if="dataForm.id && !isdetail" + type="primary" + @click="addNew()"> + 添加属性 + </el-button> + </span> + </div> --> + <template slot="footer"> + <el-button style="" @click="goback()">取消</el-button> + <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> --> + <el-button type="primary" @click="dataFormSubmit()">确定</el-button> + </template> + <print-model-design v-if="modelShow" ref="printModelDesign" @saveData="getModelData" /> + </el-dialog> +</template> + +<script> + +import { + createPackingModel, + updatePackingModel, + getPackingModel, + // getWorkOrderList, + // getCode, + // getCustomerList, + getTypeList +} from '@/api/base/printModel.js'; +// import productAttrAdd from './attr-add'; +import { parseTime } from '../mixins/code-filter'; +import SmallTitle from './SmallTitle'; +import printModelDesign from '../custom/index' + +const tableBtn = [ + { + type: 'edit', + btnName: '编辑', + }, + { + type: 'delete', + btnName: '删除', + }, +]; +const tableProps = [ + { + prop: 'createTime', + label: '添加时间', + filter: parseTime, + }, + { + prop: 'name', + label: '属性名', + }, + { + prop: 'value', + label: '属性值', + }, +]; + +export default { + components: { SmallTitle, printModelDesign }, + data() { + return { + visible: false, + addOrUpdateVisible: false, + tableBtn, + tableProps, + modelShow:false, + typeList:[], + dataForm: { + id: null, + // name: '', // 产品名称 + name: '', // 产品编码 + // area: 0, // 单位平方数(float only) + typeId: null, // 产品类型id + printModel: null, // 单位产品用时 (s) + content: '', // 规格 + remark: '', // 单位id + }, + printModelList: [ + { + id: 1, + name:'自动' + }, + { + id: 2, + name: '手动' + }, + ], + listQuery: { + pageSize: 10, + pageNo: 1, + total: 0, + }, + dataRule: { + typeId: [ + { + required: true, + message: '打印类型不能为空', + trigger: 'blur', + }, + // { + // type: 'number', + // message: '产品编码为数字类型', + // trigger: 'blur', + // transfom: 'val => Number(val)', + // }, + ], + name: [ + { + required: true, + message: '模板名称不能为空', + trigger: 'blur', + }, + ], + printModel: [ + { + required: true, + message: '模板类型不能为空', + trigger: 'blur', + }, + ], + content: [ + { + required: true, + message: '模板不能为空', + trigger: 'blur', + }, + ], + processTime: [ + { + required: true, + message: '完成单位产品用时不能为空', + trigger: 'blur', + }, + { + type: 'number', + message: '请输入正确的数值', + trigger: 'blur', + transform: (val) => Number(val), + }, + ], + }, + // isdetail: false, + }; + }, + methods: { + getModelData(data) { + console.log(data) + this.content = JSON.stringify(data) + this.dataForm.content = JSON.stringify(data) + }, + btnClickDesign() { + console.log(11111) + this.modelShow = true + this.$nextTick(() => { + this.$refs.printModelDesign.init(this.dataForm.content) + console.log(this.dataForm.content) + }) + // this.$router.push({ + // path: '/printModelDesign' + // }) + }, + // initData() { + // this.productAttributeList.splice(0); + // this.listQuery.total = 0; + // }, + init(id) { + this.getDict() + // this.initData(); + // this.isdetail = isdetail || false; + this.dataForm.id = id || null; + this.visible = true; + + this.$nextTick(() => { + this.$refs['dataForm'].resetFields(); + + if (this.dataForm.id) { + // 获取产品详情 + getPackingModel(id).then((response) => { + this.dataForm = response.data; + }); + // 获取产品的属性列表 + // this.getList(); + } else { + // getCode().then((res) => { + // this.dataForm.packagingCode = res.data; + // }); + } + }); + }, + + getDict() { + // 获取产品的属性列表 + // getCustomerList().then((response) => { + // console.log(response); + // this.customerList = response.data + // // this.listQuery.total = response.data.total; + // }) + getTypeList().then((response) => { + console.log(response); + this.typeList = response.data + // this.listQuery.total = response.data.total; + }) + // getWorkOrderList().then((response) => { + // // console.log(response); + // this.workOrderList = response.data + // // this.listQuery.total = response.data.total; + // }) + }, + // handleClick(raw) { + // if (raw.type === 'delete') { + // this.$confirm( + // `确定对${ + // raw.data.name + // ? '[名称=' + raw.data.name + ']' + // : '[序号=' + raw.data._pageIndex + ']' + // }进行删除操作?`, + // '提示', + // { + // confirmButtonText: '确定', + // cancelButtonText: '取消', + // type: 'warning', + // } + // ) + // .then(() => { + // deleteProductAttr(raw.data.id).then(({ data }) => { + // this.$message({ + // message: '操作成功', + // type: 'success', + // duration: 1500, + // onClose: () => { + // this.getList(); + // }, + // }); + // }); + // }) + // .catch(() => {}); + // } else { + // this.addNew(raw.data.id); + // } + // }, + // 表单提交 + dataFormSubmit() { + this.$refs['dataForm'].validate((valid) => { + if (valid) { + // 修改的提交 + if (this.dataForm.id) { + updatePackingModel(this.dataForm).then((response) => { + this.$modal.msgSuccess('修改成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + return; + } + // 添加的提交 + createPackingModel(this.dataForm).then((response) => { + this.$modal.msgSuccess('新增成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + } + }); + }, + // goEdit() { + // this.isdetail = false; + // }, + // // 新增 / 修改 + // addNew(id) { + // this.addOrUpdateVisible = true; + // this.$nextTick(() => { + // this.$refs.addOrUpdate.init(id); + // }); + // }, + goback() { + this.$emit('refreshDataList'); + this.visible = false; + // this.initData(); + }, + }, +}; +</script> + +<!-- <style scoped> +.drawer >>> .el-drawer { + border-radius: 8px 0 0 8px; + display: flex; + flex-direction: column; +} + +.drawer >>> .el-form-item__label { + padding: 0; +} + +.drawer >>> .el-drawer__header { + margin: 0; + padding: 32px 32px 24px; + border-bottom: 1px solid #dcdfe6; +} +.drawer >>> .el-drawer__body { + flex: 1; + height: 1px; + display: flex; + flex-direction: column; +} + +.drawer >>> .content { + padding: 30px 24px; + flex: 1; + display: flex; + flex-direction: column; + /* height: 100%; */ +} + +.drawer >>> .visual-part { + flex: 1 auto; + max-height: 76vh; + overflow: hidden; + overflow-y: scroll; + padding-right: 10px; /* 调整滚动条样式 */ +} + +.drawer >>> .el-form, +.drawer >>> .attr-list { + padding: 0 16px; +} + +.drawer-body__footer { + display: flex; + justify-content: flex-end; + padding: 18px; +} +</style> --> diff --git a/src/views/packaging/packagingPrintModel/index.vue b/src/views/packaging/packagingPrintModel/index.vue new file mode 100644 index 00000000..bc4a71e6 --- /dev/null +++ b/src/views/packaging/packagingPrintModel/index.vue @@ -0,0 +1,215 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 14:55:51 + * @LastEditors: zhp + * @LastEditTime: 2023-11-22 14:40:07 + * @Description: +--> +<template> + <div class="app-container"> + <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" /> + <base-table :table-props="tableProps" :page="listQuery.pageNo" :limit="listQuery.pageSize" :table-data="tableData"> + <method-btn v-if="tableBtn.length" slot="handleBtn" :width="120" label="操作" :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination :limit.sync="listQuery.pageSize" :page.sync="listQuery.pageNo" :total="listQuery.total" + @pagination="getDataList" /> + <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList" /> + <print-model-design v-if="modelShow" ref="printModelDesign" @saveData="getModelData" /> + </div> +</template> + +<script> +import AddOrUpdate from './add-or-updata'; +// import unitDict from './unitDict'; +import basicPage from '../mixins/basic-page'; + +import { parseTime } from '../mixins/code-filter'; +import printModelDesign from '../custom/index' +import { updatePackingModel,} from '@/api/base/printModel.js'; +import { + deletePackingModel, + getPackingModelPage, + // exportPackingExcel, +} from '@/api/base/printModel'; + +const tableProps = [ + { + prop: 'createTime', + label: '创建时间', + filter: parseTime + }, + { + prop: 'name', + label: '模板名称' + }, + { + prop: 'typeName', + label: '标签类型' + }, + { + prop: 'printModel', + label: '打印方式', + filter: (val) => val ==1 ? '自动打印' : '手动打印', + }, + { + prop: 'remark', + label: '备注', + // subcomponent: unitDict, + }, +]; + +export default { + mixins: [basicPage], + data() { + return { + urlOptions: { + getDataListURL: getPackingModelPage, + deleteURL: deletePackingModel, + // exportURL: exportPackingExcel, + }, + tableProps, + modelShow:false, + tableBtn: [ + { + type: 'print', + btnName: '查看', + }, + this.$auth.hasPermi(`base:packaging-print-model:update`) + ? { + type: 'edit', + btnName: '编辑', + } + : undefined, + this.$auth.hasPermi(`base:packaging-print-model:delete`) + ? { + type: 'delete', + btnName: '删除', + } + : undefined, + ].filter((v) => v), + tableData: [], + formConfig: [ + // { + // type: 'input', + // label: '工单', + // placeholder: '工单', + // param: 'workOrderId', + // }, + // { + // // parent: 'dateFilterType', + // // 日期选择 + // type: 'datePicker', + // label: '时间', + // dateType: 'date', + // placeholder: '选择日期', + // format: 'yyyy-MM-dd', + // valueFormat: 'yyyy-MM-dd', + // param: 'createTime', + // }, + // { + // type: 'button', + // btnName: '搜索', + // name: 'search', + // color: 'primary', + // }, + // { + // type: 'separate', + // }, + // { + // type: 'button', + // btnName: '重置', + // name: 'reset', + // }, + { + type: 'separate', + }, + { + type: this.$auth.hasPermi('base:packaging-print-model:create') ? 'button' : '', + btnName: '新增模板', + name: 'add', + color: 'success', + plain: true, + }, + // { + // type: 'separate', + // type: this.$auth.hasPermi('base:product:create') ? 'separate' : '', + // }, + // { + // type: this.$auth.hasPermi('base:product:export') ? 'button' : '', + // btnName: '导出', + // name: 'export', + // color: 'warning', + // }, + ], + }; + }, + components: { + AddOrUpdate, + printModelDesign + }, + created() {}, + methods: { + getDataList() { + this.dataListLoading = true; + this.urlOptions.getDataListURL(this.listQuery).then(response => { + this.tableData = response.data.records; + this.listQuery.total = response.data.total; + this.dataListLoading = false; + }); + }, + buttonClick(val) { + switch (val.btnName) { + case 'search': + this.listQuery.pageNo = 1; + this.listQuery.pageSize = 10; + this.listQuery.packagingCode = val.packagingCode; + this.listQuery.createTime = val.createTime; + this.getDataList(); + break; + case 'reset': + this.$refs.searchBarForm.resetForm(); + this.listQuery = { + pageSize: 10, + pageNo: 1, + total: 1, + }; + this.getDataList(); + break; + case 'add': + this.addOrEditTitle = '新增'; + this.addOrUpdateVisible = true; + this.addOrUpdateHandle(); + break; + case 'export': + this.handleExport(); + break; + default: + console.log(val); + } + }, + getModelData(data) { + // console.log(data) + // this.content = JSON.stringify(data) + // this.dataForm.content = JSON.stringify(data) + console.log(data) + // this.content = JSON.stringify(data) + this.obj.content = JSON.stringify(data) + updatePackingModel(this.obj).then((response) => { + // this.$modal.msgSuccess('修改成功'); + // this.visible = false; + // this.$emit('refreshDataList'); + }); + + }, + otherMethods(val) { + console.log(val) + this.modelShow = true + this.$nextTick(() => { + this.obj = val.data + this.$refs.printModelDesign.init(val.data.content) + }) + }, + }, +}; +</script> diff --git a/src/views/packaging/packagingPrintModel/unitDict.vue b/src/views/packaging/packagingPrintModel/unitDict.vue new file mode 100644 index 00000000..94702ab4 --- /dev/null +++ b/src/views/packaging/packagingPrintModel/unitDict.vue @@ -0,0 +1,15 @@ +<template> + <dict-tag + :type="DICT_TYPE.UNIT_DICT" + :value="injectData.unitDictValue" /> +</template> +<script> +export default { + props: { + injectData: { + type: Object, + default: () => ({}), + }, + }, +}; +</script> diff --git a/src/views/packaging/packagingPrintType/SmallTitle.vue b/src/views/packaging/packagingPrintType/SmallTitle.vue new file mode 100644 index 00000000..93b4a18f --- /dev/null +++ b/src/views/packaging/packagingPrintType/SmallTitle.vue @@ -0,0 +1,65 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 15:27:31 + * @LastEditors: zwq + * @LastEditTime: 2023-08-01 16:25:54 + * @Description: +--> +<template> + <div :class="[className, { 'p-0': noPadding }]"> + <slot /> + </div> +</template> + +<script> +export default { + props: { + size: { + // 取值范围: xl lg md sm + type: String, + default: 'de', + validator: function (val) { + return ['xl', 'lg', 'de', 'md', 'sm'].indexOf(val) !== -1; + }, + }, + noPadding: { + type: Boolean, + default: false, + }, + }, + computed: { + className: function () { + return `${this.size}-title`; + }, + }, +}; +</script> + +<style lang="scss" scoped> +$pxls: (xl, 28px) (lg, 24px) (de, 20px) (md, 18px) (sm, 16px); +$mgr: 8px; +@each $size, $height in $pxls { + .#{$size}-title { + font-size: 18px; + line-height: $height; + color: #000; + font-weight: 500; + font-family: '微软雅黑', 'Microsoft YaHei', Arial, Helvetica, sans-serif; + + &::before { + content: ''; + display: inline-block; + vertical-align: top; + width: 4px; + height: $height + 2px; + border-radius: 1px; + margin-right: $mgr; + background-color: #0b58ff; + } + } +} + +.p-0 { + padding: 0; +} +</style> diff --git a/src/views/packaging/packagingPrintType/add-or-updata.vue b/src/views/packaging/packagingPrintType/add-or-updata.vue new file mode 100644 index 00000000..469b5622 --- /dev/null +++ b/src/views/packaging/packagingPrintType/add-or-updata.vue @@ -0,0 +1,347 @@ +<!-- + * @Author: zhp + * @Date: 2023-10-17 16:50:19 + * @LastEditTime: 2023-10-18 16:07:39 + * @LastEditors: zhp + * @Description: +--> +<template> + <el-dialog :visible.sync="visible" :show-close="false" :wrapper-closable="false" width="40%"> + <small-title slot="title" :no-padding="true"> + {{ !dataForm.id ? '新增' : '编辑' }} + </small-title> + + <div class="content"> + <div class="visual-part"> + <el-form ref="dataForm" :model="dataForm" :rules="dataRule" label-width="100px" + @keyup.enter.native="dataFormSubmit"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="名称" prop="name"> + <el-input v-model="dataForm.name" clearable placeholder="名称" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="类型描述" prop="description"> + <el-input v-model="dataForm.description" clearable placeholder="类型描述" /> + </el-form-item> + </el-col> + </el-row> + <!-- <el-row :gutter="20"> + <el-col :span="24"> + <el-form-item label="完成单位产品用时" prop="processTime"> + <el-input v-model="dataForm.processTime" placeholder="请输入完成单位产品用时" /> + </el-form-item> + </el-col> + </el-row> --> + </el-form> + + <!-- <small-title + style="margin: 16px 0; padding-left: 8px" + :no-padding="true"> + 产品属性列表 + </small-title> + + <div class="attr-list"> + <base-table + :table-props="tableProps" + :page="listQuery.pageNo" + :limit="listQuery.pageSize" + :add-button-show="isdetail ? null : '添加属性'" + @emitButtonClick="addNew()" + :table-data="productAttributeList"> + <method-btn + v-if="!isdetail" + slot="handleBtn" + :width="120" + label="操作" + :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination + v-show="listQuery.total > 0" + :total="listQuery.total" + :page.sync="listQuery.pageNo" + :limit.sync="listQuery.pageSize" + :page-sizes="[5, 10, 15]" + @pagination="getList" /> + </div> --> + </div> + </div> + + <!-- <div style="position: absolute; bottom: 24px; right: 24px"> + <el-button style="margin-right: 10px" @click="goback()">返回</el-button> + <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> + <span v-if="!isdetail"> + <el-button type="primary" @click="dataFormSubmit()">保存</el-button> + <el-button + v-if="dataForm.id && !isdetail" + type="primary" + @click="addNew()"> + 添加属性 + </el-button> + </span> + </div> --> + <template slot="footer"> + <el-button style="" @click="goback()">取消</el-button> + <!-- <el-button v-if="isdetail" type="primary" @click="goEdit()"> + 编辑 + </el-button> --> + <el-button type="primary" @click="dataFormSubmit()">确定</el-button> + </template> + </el-dialog> +</template> + +<script> + +import { + createPackingType, + updatePackingType, + getPackingType, + // getWorkOrderList, + // getCode, + // getCustomerList, + // getModelList +} from '@/api/base/modelType.js'; +// import productAttrAdd from './attr-add'; +import { parseTime } from '../mixins/code-filter'; +import SmallTitle from './SmallTitle'; + +const tableBtn = [ + { + type: 'edit', + btnName: '编辑', + }, + { + type: 'delete', + btnName: '删除', + }, +]; +const tableProps = [ + { + prop: 'createTime', + label: '添加时间', + filter: parseTime, + }, + { + prop: 'name', + label: '属性名', + }, + { + prop: 'value', + label: '属性值', + }, +]; + +export default { + components: { SmallTitle }, + data() { + return { + visible: false, + addOrUpdateVisible: false, + tableBtn, + tableProps, + customerList: [], + modelList:[], + workOrderList:[], + productAttributeList: [], + dataForm: { + id: null, + // name: '', // 产品名称 + name: '', // 产品编码 + // area: 0, // 单位平方数(float only) + description: null, // 产品类型id + // workOrderId: null, // 单位产品用时 (s) + // customerId: '', // 规格 + // content: '', // 单位id + }, + listQuery: { + pageSize: 10, + pageNo: 1, + total: 0, + }, + dataRule: { + name: [ + { + required: true, + message: '名称不能为空', + trigger: 'blur', + }, + ], + }, + // isdetail: false, + }; + }, + methods: { + // initData() { + // this.productAttributeList.splice(0); + // this.listQuery.total = 0; + // }, + init(id) { + // this.getDict() + // this.initData(); + // this.isdetail = isdetail || false; + this.dataForm.id = id || null; + this.visible = true; + + this.$nextTick(() => { + this.$refs['dataForm'].resetFields(); + + if (this.dataForm.id) { + // 获取产品详情 + getPackingType(id).then((response) => { + this.dataForm = response.data; + }); + // 获取产品的属性列表 + // this.getList(); + } else { + // getCode().then((res) => { + // this.dataForm.packagingCode = res.data; + // }); + } + }); + }, + + // getDict() { + // // 获取产品的属性列表 + // getCustomerList().then((response) => { + // console.log(response); + // this.customerList = response.data + // // this.listQuery.total = response.data.total; + // }) + // getModelList().then((response) => { + // console.log(response); + // this.modelList = response.data + // // this.listQuery.total = response.data.total; + // }) + // getWorkOrderList().then((response) => { + // // console.log(response); + // this.workOrderList = response.data + // // this.listQuery.total = response.data.total; + // }) + // }, + // handleClick(raw) { + // if (raw.type === 'delete') { + // this.$confirm( + // `确定对${ + // raw.data.name + // ? '[名称=' + raw.data.name + ']' + // : '[序号=' + raw.data._pageIndex + ']' + // }进行删除操作?`, + // '提示', + // { + // confirmButtonText: '确定', + // cancelButtonText: '取消', + // type: 'warning', + // } + // ) + // .then(() => { + // deleteProductAttr(raw.data.id).then(({ data }) => { + // this.$message({ + // message: '操作成功', + // type: 'success', + // duration: 1500, + // onClose: () => { + // this.getList(); + // }, + // }); + // }); + // }) + // .catch(() => {}); + // } else { + // this.addNew(raw.data.id); + // } + // }, + // 表单提交 + dataFormSubmit() { + this.$refs['dataForm'].validate((valid) => { + if (valid) { + // 修改的提交 + if (this.dataForm.id) { + updatePackingType(this.dataForm).then((response) => { + this.$modal.msgSuccess('修改成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + return; + } + // 添加的提交 + createPackingType(this.dataForm).then((response) => { + this.$modal.msgSuccess('新增成功'); + this.visible = false; + this.$emit('refreshDataList'); + }); + } + }); + }, + // goEdit() { + // this.isdetail = false; + // }, + // // 新增 / 修改 + // addNew(id) { + // this.addOrUpdateVisible = true; + // this.$nextTick(() => { + // this.$refs.addOrUpdate.init(id); + // }); + // }, + goback() { + this.$emit('refreshDataList'); + this.visible = false; + // this.initData(); + }, + }, +}; +</script> + +<!-- <style scoped> +.drawer >>> .el-drawer { + border-radius: 8px 0 0 8px; + display: flex; + flex-direction: column; +} + +.drawer >>> .el-form-item__label { + padding: 0; +} + +.drawer >>> .el-drawer__header { + margin: 0; + padding: 32px 32px 24px; + border-bottom: 1px solid #dcdfe6; +} +.drawer >>> .el-drawer__body { + flex: 1; + height: 1px; + display: flex; + flex-direction: column; +} + +.drawer >>> .content { + padding: 30px 24px; + flex: 1; + display: flex; + flex-direction: column; + /* height: 100%; */ +} + +.drawer >>> .visual-part { + flex: 1 auto; + max-height: 76vh; + overflow: hidden; + overflow-y: scroll; + padding-right: 10px; /* 调整滚动条样式 */ +} + +.drawer >>> .el-form, +.drawer >>> .attr-list { + padding: 0 16px; +} + +.drawer-body__footer { + display: flex; + justify-content: flex-end; + padding: 18px; +} +</style> --> diff --git a/src/views/packaging/packagingPrintType/index.vue b/src/views/packaging/packagingPrintType/index.vue new file mode 100644 index 00000000..740d250a --- /dev/null +++ b/src/views/packaging/packagingPrintType/index.vue @@ -0,0 +1,191 @@ +<!-- + * @Author: zwq + * @Date: 2023-08-01 14:55:51 + * @LastEditors: zhp + * @LastEditTime: 2023-11-22 14:36:33 + * @Description: +--> +<template> + <div class="app-container"> + <search-bar + :formConfigs="formConfig" + ref="searchBarForm" + @headBtnClick="buttonClick" /> + <base-table + :table-props="tableProps" + :page="listQuery.pageNo" + :limit="listQuery.pageSize" + :table-data="tableData"> + <method-btn + v-if="tableBtn.length" + slot="handleBtn" + :width="120" + label="操作" + :method-list="tableBtn" + @clickBtn="handleClick" /> + </base-table> + <pagination + :limit.sync="listQuery.pageSize" + :page.sync="listQuery.pageNo" + :total="listQuery.total" + @pagination="getDataList" /> + <add-or-update + v-if="addOrUpdateVisible" + ref="addOrUpdate" + @refreshDataList="getDataList" /> + </div> +</template> + +<script> +import AddOrUpdate from './add-or-updata'; +// import unitDict from './unitDict'; +import basicPage from '../mixins/basic-page'; +import { parseTime } from '../mixins/code-filter'; +import { + deletePackingType, + getPackingTypePage, + // exportPackingExcel, +} from '@/api/base/modelType'; + +const tableProps = [ + { + prop: 'name', + label: '名称' + }, + { + prop: 'description', + label: '描述' + }, + { + prop: 'createTime', + label: '生成日期', + filter: parseTime + }, +]; + +export default { + mixins: [basicPage], + data() { + return { + urlOptions: { + getDataListURL: getPackingTypePage, + deleteURL: deletePackingType, + // exportURL: exportPackingExcel, + }, + tableProps, + tableBtn: [ + this.$auth.hasPermi(`base:packaging-print-log:update`) + ? { + type: 'edit', + btnName: '编辑', + } + : undefined, + this.$auth.hasPermi(`base:packaging-print-log:delete`) + ? { + type: 'delete', + btnName: '删除', + } + : undefined, + + ].filter((v) => v), + tableData: [], + formConfig: [ + // { + // type: 'input', + // label: '工单', + // placeholder: '工单', + // param: 'workOrderId', + // }, + // { + // // parent: 'dateFilterType', + // // 日期选择 + // type: 'datePicker', + // label: '时间', + // dateType: 'date', + // placeholder: '选择日期', + // format: 'yyyy-MM-dd', + // valueFormat: 'yyyy-MM-dd', + // param: 'createTime', + // }, + // { + // type: 'button', + // btnName: '搜索', + // name: 'search', + // color: 'primary', + // }, + // { + // type: 'separate', + // }, + // { + // type: 'button', + // btnName: '重置', + // name: 'reset', + // }, + { + type: 'separate', + }, + { + type: this.$auth.hasPermi('base:packaging-print-type:create') ? 'button' : '', + btnName: '新增', + name: 'add', + color: 'success', + plain: true, + }, + // { + // type: 'separate', + // type: this.$auth.hasPermi('base:product:create') ? 'separate' : '', + // }, + // { + // type: this.$auth.hasPermi('base:product:export') ? 'button' : '', + // btnName: '导出', + // name: 'export', + // color: 'warning', + // }, + ], + }; + }, + components: { + AddOrUpdate, + }, + created() {}, + methods: { + buttonClick(val) { + switch (val.btnName) { + case 'search': + this.listQuery.pageNo = 1; + this.listQuery.pageSize = 10; + this.listQuery.packagingCode = val.packagingCode; + this.listQuery.createTime = val.createTime; + this.getDataList(); + break; + case 'reset': + this.$refs.searchBarForm.resetForm(); + this.listQuery = { + pageSize: 10, + pageNo: 1, + total: 1, + }; + this.getDataList(); + break; + case 'add': + this.addOrEditTitle = '新增'; + this.addOrUpdateVisible = true; + this.addOrUpdateHandle(); + break; + case 'export': + this.handleExport(); + break; + default: + console.log(val); + } + }, + otherMethods(val) { + this.addOrUpdateVisible = true; + this.addOrEditTitle = '详情'; + this.$nextTick(() => { + this.$refs.addOrUpdate.init(val.data.id, true); + }); + }, + }, +}; +</script> diff --git a/src/views/packaging/packagingPrintType/unitDict.vue b/src/views/packaging/packagingPrintType/unitDict.vue new file mode 100644 index 00000000..94702ab4 --- /dev/null +++ b/src/views/packaging/packagingPrintType/unitDict.vue @@ -0,0 +1,15 @@ +<template> + <dict-tag + :type="DICT_TYPE.UNIT_DICT" + :value="injectData.unitDictValue" /> +</template> +<script> +export default { + props: { + injectData: { + type: Object, + default: () => ({}), + }, + }, +}; +</script> diff --git a/src/views/quality/currentData/currentTest.vue b/src/views/quality/currentData/currentTest.vue index 96b753bb..f00ada1b 100644 --- a/src/views/quality/currentData/currentTest.vue +++ b/src/views/quality/currentData/currentTest.vue @@ -70,7 +70,7 @@ export default { }; }, mounted() { - // this.getList(); + this.getList(); }, methods: { /** 查询列表 */ diff --git a/src/views/quality/currentData/hourData.vue b/src/views/quality/currentData/hourData.vue index ac876041..a7acb694 100644 --- a/src/views/quality/currentData/hourData.vue +++ b/src/views/quality/currentData/hourData.vue @@ -43,8 +43,51 @@ export default { async getList() { const res = await getRecordInOneDay(); if (res.data) { - this.nameData = this.filterNameData(res.data.nameData); - this.list = this.filterData(res.data.data); + // this.nameData = this.filterNameData(res.data.nameData); + // this.list = this.filterData(res.data.data); + const seen = new Set(); // 用于去重 + const columns = []; + + res.data.nameData.forEach(item => { + if (item.tree === 1) { + const primaryHeader = item.name; + const children = res.data.nameData + .filter(child => child.tree === 2 && child.parentId === item.id) + .map(child => { + const key = `${primaryHeader}-${child.name}`; + if (!seen.has(key)) { + seen.add(key); + return { + label: child.name, + prop: child.id + }; + } + return null; + }) + .filter(Boolean); // 过滤掉 null + + if (children.length > 0) { + this.nameData.push({ + label: moment(primaryHeader).format('yyyy-MM-DD HH:mm:ss'), + children + }); + } + } + }); + this.list = res.data.data.map(item => { + const row = {}; + row.inspectionDetContent = item.inspectionDetContent; + item.data.forEach((inner) => { + inner.children.forEach((child) => { + row[child.id] = child.dynamicValue; + }); + }); + return row; + }); + // this.nameData = columns.filter((column, index, self) => + // index === self.findIndex(c => c.label === column.label) + // ); + console.log(this.list, this.nameData) } else { this.nameData = []; this.list = []; -- 2.45.2