|
|
@@ -0,0 +1,539 @@
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <layout>
|
|
|
+ <layout-header>
|
|
|
+ <div class="">
|
|
|
+ <!-- 按钮部分-->
|
|
|
+ <el-form ref="elSearchFormRef" class="demo-form-inline" :rules="searchRule" >
|
|
|
+ <el-form-item>
|
|
|
+ <!-- <el-input v-model="searchInfo" placeholder="搜索工单编号" clearable style="width: 200px;margin: 5px"></el-input> -->
|
|
|
+ <el-button type="primary" class="bt" icon="download" @click="list_create" >清单建立</el-button>
|
|
|
+ <el-button type="primary" class="bt" icon="download" @click="onupdata" >修改</el-button>
|
|
|
+ <el-button type="primary" class="bt" icon="download" @click="hzToExcel" >导出到Excel(汇总)</el-button>
|
|
|
+ <el-button type="primary" class="bt" icon="download" @click="mxToExcel" >导出到Excel(明细)</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </layout-header>
|
|
|
+
|
|
|
+ <layout>
|
|
|
+ <!-- 左侧树侧形结构-->
|
|
|
+ <layout-sider :resize-directions="['right']" :width="190" style="margin-right: 10px;">
|
|
|
+ <div class="JKWTree-tree" style="height: 200px">
|
|
|
+ <h3>设备部件寿命跟踪</h3>
|
|
|
+ <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick" @node-expand="handleNodeExpand">
|
|
|
+ </el-tree>
|
|
|
+ </div>
|
|
|
+ </layout-sider>
|
|
|
+
|
|
|
+ <!-- 右侧区域 -->
|
|
|
+ <layout-content >
|
|
|
+ <el-main>
|
|
|
+ <div class="gva-table-box">
|
|
|
+ <!-- 表格数据 -->
|
|
|
+ <el-table ref="multipleTable" style="width: 100%;height: 33vh" tooltip-effect="dark"
|
|
|
+ :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :data="hztableData" border row-key="ID"
|
|
|
+ size="small" id="hztab"
|
|
|
+ :cell-class-name="gxbgCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-click="hztableRowClick" :show-overflow-tooltip="true"
|
|
|
+ @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column sortable align="center" label="部件编号" prop="部件编号" width="120" />
|
|
|
+ <el-table-column sortable align="center" label="部件名称" prop="部件名称" width="120" />
|
|
|
+ <el-table-column align="center" label="组件编号" prop="组件编号" width="200" />
|
|
|
+ <el-table-column align="center" label="更换日期" prop="更换日期" width="200" />
|
|
|
+ <el-table-column align="center" label="小时寿命" prop="小时寿命" width="110" />
|
|
|
+ <el-table-column align="center" label="阈值" prop="阈值" width="200" />
|
|
|
+ <el-table-column align="center" label="首次更换日期" prop="首次更换日期" width="200" />
|
|
|
+ <el-table-column align="center" label="运行工时" prop="运行工时" width="110" />
|
|
|
+ <el-table-column align="center" label="序号" prop="序号" width="110" />
|
|
|
+ <el-table-column align="center" label="设备编号" prop="设备编号" width="110" />
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="gva-pagination">
|
|
|
+ <el-pagination layout="total" :current-page="page" :page-size="pageSize"
|
|
|
+ :total="total" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+
|
|
|
+ <div class="gva-table-box">
|
|
|
+ <!-- 表格数据 -->
|
|
|
+ <el-table ref="multipleTable" style="width: 100%;height: 45vh" tooltip-effect="dark"
|
|
|
+ :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :data="mxtableData" border row-key="ID"
|
|
|
+ size="small" id="mxtab"
|
|
|
+ :cell-class-name="gxbgCellClass"
|
|
|
+ highlight-current-row="true" @row-dblclick="updateCompanyFunc"
|
|
|
+ @row-click="tableRowClick" :show-overflow-tooltip="true"
|
|
|
+ @selection-change="handleSelectionChange">
|
|
|
+ <el-table-column sortable align="center" label="工单编号" prop="工单编号" width="120" />
|
|
|
+ <el-table-column sortable align="center" label="印件号" prop="印件号" width="120" />
|
|
|
+ <el-table-column sortable align="center" label="印件名称" prop="印件名称" width="200" />
|
|
|
+ <el-table-column sortable align="center" label="日期" prop="日期" width="100" />
|
|
|
+ <el-table-column sortable align="center" label="工时" prop="工时" width="100" />
|
|
|
+ <el-table-column sortable align="center" label="机台编号" prop="机台编号" width="100" />
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="gva-pagination">
|
|
|
+ <el-pagination layout="total" :current-page="page" :page-size="pageSize"
|
|
|
+ :total="total" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+
|
|
|
+ <el-dialog
|
|
|
+ v-model="dialogVisible"
|
|
|
+ title='部件寿命跟踪清单'
|
|
|
+ width="500px"
|
|
|
+ >
|
|
|
+ <!-- 树状图 -->
|
|
|
+ <div class="tree-wrapper">
|
|
|
+ <el-tree
|
|
|
+ ref="treeRef"
|
|
|
+ :data="bjtreeData"
|
|
|
+ show-checkbox
|
|
|
+ node-key="id"
|
|
|
+ :props="defaultProps"
|
|
|
+ v-loading="loading"
|
|
|
+ @check="handleCheck"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 底部按钮 -->
|
|
|
+ <template #footer>
|
|
|
+ <span class="dialog-footer">
|
|
|
+ <el-button @click="dialogVisible = false">放弃</el-button>
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ @click="handleConfirm"
|
|
|
+ :disabled="checkedKeys.length === 0"
|
|
|
+ >
|
|
|
+ 执行
|
|
|
+ </el-button>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ <el-dialog
|
|
|
+ v-model="recordDialogVisible"
|
|
|
+ title="设备部件更换记录"
|
|
|
+ width="600px"
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ >
|
|
|
+ <div class="record-dialog-content">
|
|
|
+ <!-- 设备信息 -->
|
|
|
+ <div class="info-section">
|
|
|
+ <div class="info-row">
|
|
|
+ <span class="info-label">设备编号:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.设备编号"
|
|
|
+ placeholder="请输入设备编号"
|
|
|
+ size="small"
|
|
|
+ style="width: 150px"
|
|
|
+ />
|
|
|
+ <span class="info-label" style="margin-left: 40px;">设备名称:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.设备名称"
|
|
|
+ placeholder="请输入设备名称"
|
|
|
+ size="small"
|
|
|
+ style="width: 180px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="info-row">
|
|
|
+ <span class="info-label">部件编号:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.部件编号"
|
|
|
+ placeholder="请输入部件编号"
|
|
|
+ size="small"
|
|
|
+ style="width: 150px"
|
|
|
+ />
|
|
|
+ <span class="info-label" style="margin-left: 40px;">部件名称:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.部件名称"
|
|
|
+ placeholder="请输入部件名称"
|
|
|
+ size="small"
|
|
|
+ style="width: 180px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-divider />
|
|
|
+
|
|
|
+ <!-- 组件信息 -->
|
|
|
+ <div class="info-section">
|
|
|
+ <div class="info-row">
|
|
|
+ <span class="info-label">组件编号:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.组件编号"
|
|
|
+ placeholder="请输入组件编号"
|
|
|
+ size="small"
|
|
|
+ style="width: 150px"
|
|
|
+ />
|
|
|
+ <span class="info-label" style="margin-left: 40px;">更换日期:</span>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="currentRow.更换日期"
|
|
|
+ type="date"
|
|
|
+ placeholder="选择更换日期"
|
|
|
+ size="small"
|
|
|
+ style="width: 150px"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div class="info-row">
|
|
|
+ <span class="info-label">小时寿命:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.小时寿命"
|
|
|
+ size="small"
|
|
|
+ style="width: 120px"
|
|
|
+ />
|
|
|
+ <span class="info-label" style="margin-left: 40px;">阈值:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="currentRow.阈值"
|
|
|
+ size="small"
|
|
|
+ style="width: 120px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-divider />
|
|
|
+
|
|
|
+ <!-- 说明文字 -->
|
|
|
+ <div class="description-section">
|
|
|
+ <p><strong>A、</strong>对需要做寿命统计的部件,要先创建部件清单</p>
|
|
|
+ <p><strong>B、</strong>以创建一条新记录的方式,实现组件的更换</p>
|
|
|
+ <p><strong>C、</strong>由于工作疏忽导致的记录信息错误,方可采用修改方式实现信息修正</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="recordDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" @click="handleSave">保存修改</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ </el-main>
|
|
|
+ </layout-content>
|
|
|
+ </layout>
|
|
|
+ </layout>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <script setup>
|
|
|
+ // 全量引入格式化工具 请按需保留
|
|
|
+ import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
|
|
|
+ import { getECTab,getEquipmentList,CreateEquipmentInfo,getMachineEquipmentList,getEquipmentDetailList,getEquipmentUpdate } from '@/api/mes/job'
|
|
|
+ import {ref, reactive} from 'vue'
|
|
|
+ import { useUserStore } from '@/pinia/modules/user'
|
|
|
+ import { exportExcelFile } from '@/utils/excel'
|
|
|
+ import {ElMessage} from "element-plus";
|
|
|
+ defineOptions({name: 'Company'})
|
|
|
+
|
|
|
+const userStore = useUserStore()
|
|
|
+const _username = ref('')
|
|
|
+_username.value = userStore.userInfo.userName + '/' + userStore.userInfo.nickName
|
|
|
+
|
|
|
+ // =========== 获取左侧树侧形结构 ===========
|
|
|
+ const treeData = ref([])
|
|
|
+const defaultProps = {
|
|
|
+ children: 'children',
|
|
|
+ label: 'label'
|
|
|
+}
|
|
|
+
|
|
|
+const Chejian = ref('')
|
|
|
+const Machine = ref('')
|
|
|
+const _sbmc = ref('')
|
|
|
+const GetTab = async () => {
|
|
|
+ try {
|
|
|
+ const res = await getECTab()
|
|
|
+ if (res.code == 0) {
|
|
|
+ // 转换数据结构 - 核心优化:给二级节点添加workshop属性存储车间名称
|
|
|
+ treeData.value = Object.entries(res.data).map(([workshop, groups]) => ({
|
|
|
+ label: workshop,
|
|
|
+ children: Object.entries(groups).map(([groupName, equipments]) => ({
|
|
|
+ label: groupName,
|
|
|
+ workshop: workshop, // 新增:存储当前二级节点所属的车间名称
|
|
|
+ children: equipments.map(equipment => ({
|
|
|
+ label: equipment,
|
|
|
+ // label: equipment.split('-->')[1]?.trim() || equipment,
|
|
|
+ equipmentCode: equipment.split('-->')[0]?.trim() || ''
|
|
|
+ }))
|
|
|
+ }))
|
|
|
+ }))
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取设备部件数据失败:', error)
|
|
|
+ // ElMessage.error('获取数据失败')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 优化点击事件处理逻辑
|
|
|
+const handleNodeClick = (node) => {
|
|
|
+ if (!node.children) {
|
|
|
+ console.log('点击了:', node)
|
|
|
+ _sbmc.value = node.label
|
|
|
+ Machine.value = node.equipmentCode
|
|
|
+ Chejian.value = node.parent?.workshop || Chejian.value
|
|
|
+ hztable(node.equipmentCode)
|
|
|
+ } else {
|
|
|
+ // 点击一级节点(车间)或二级节点(机组)
|
|
|
+ console.log('点击了节点:', node)
|
|
|
+ // 一级节点直接用label,二级节点用预存的workshop属性
|
|
|
+ Chejian.value = node.workshop || node.label
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+GetTab()
|
|
|
+
|
|
|
+
|
|
|
+//上方列表
|
|
|
+const hztableData = ref([])
|
|
|
+const hztable = async (machine) => {
|
|
|
+ try {
|
|
|
+ const res = await getMachineEquipmentList({
|
|
|
+ machine: machine
|
|
|
+ })
|
|
|
+ if (res.code == 0) {
|
|
|
+ hztableData.value = res.data
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取设备部件数据失败:', error)
|
|
|
+ // 可以添加用户提示
|
|
|
+ // ElMessage.error('获取数据失败')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const mxtableData = ref([])
|
|
|
+const selectedRow = ref({})
|
|
|
+const hztableRowClick = async (row) => {
|
|
|
+ selectedRow.value = row
|
|
|
+ console.log('点击了:', row.更换日期.split(' ')[0] )
|
|
|
+ const response = await getEquipmentDetailList({
|
|
|
+ machine: row.设备编号,
|
|
|
+ date: row.更换日期.split(' ')[0]
|
|
|
+ })
|
|
|
+ if (response.code == 0) {
|
|
|
+ mxtableData.value = response.data
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 响应式数据
|
|
|
+const dialogVisible = ref(false)
|
|
|
+const loading = ref(false)
|
|
|
+const bjtreeData = ref([])
|
|
|
+const treeRef = ref()
|
|
|
+const checkedKeys = ref('')
|
|
|
+
|
|
|
+
|
|
|
+// 点击按钮
|
|
|
+const list_create = async () => {
|
|
|
+ if (!Machine.value) {
|
|
|
+ ElMessage.error('请先选择设备')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ dialogVisible.value = true
|
|
|
+ await fetchEquipmentList()
|
|
|
+}
|
|
|
+
|
|
|
+// 获取数据
|
|
|
+const fetchEquipmentList = async () => {
|
|
|
+ try {
|
|
|
+ loading.value = true
|
|
|
+ checkedKeys.value = '' // 清空选择
|
|
|
+
|
|
|
+ const res = await getEquipmentList()
|
|
|
+
|
|
|
+ if (res.code === 200 || res.code === 0) {
|
|
|
+ // 转换为树状结构
|
|
|
+ bjtreeData.value = [
|
|
|
+ {
|
|
|
+ id: 'root',
|
|
|
+ label: Chejian.value,
|
|
|
+ children: (res.data || []).map(item => ({
|
|
|
+ id: item.Uniqid.toString(),
|
|
|
+ label: item.名称 || '未知设备'
|
|
|
+ }))
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error('加载失败')
|
|
|
+ treeData.value = []
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 选择事件
|
|
|
+const handleCheck = (data, checkedInfo) => {
|
|
|
+ checkedKeys.value = checkedInfo.checkedKeys
|
|
|
+ console.log('选中的Uniqid:', checkedKeys.value.join(','))
|
|
|
+}
|
|
|
+
|
|
|
+const handleConfirm = async() => {
|
|
|
+ if (checkedKeys.value.length === 0) {
|
|
|
+ ElMessage.warning('请选择部件')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const res = await CreateEquipmentInfo({
|
|
|
+ jtbh: Machine.value,
|
|
|
+ ids: checkedKeys.value.join(','),
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ })
|
|
|
+ if (res.code == 0) {
|
|
|
+ ElMessage.success('操作成功')
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res.msg || '操作失败')
|
|
|
+ }
|
|
|
+ dialogVisible.value = false
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 弹窗状态
|
|
|
+const recordDialogVisible= ref(false)
|
|
|
+const currentRow = ref({})
|
|
|
+const onupdata = async () => {
|
|
|
+ if (!selectedRow.value) {
|
|
|
+ ElMessage.warning('请先选择一条记录')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ currentRow.value = { ...selectedRow.value }
|
|
|
+ currentRow.value.设备名称 = _sbmc.value
|
|
|
+ recordDialogVisible.value = true
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const handleSave = async () => {
|
|
|
+ console.log(currentRow.value)
|
|
|
+ const params = {
|
|
|
+ code: currentRow.value.组件编号,
|
|
|
+ hour: currentRow.value.小时寿命,
|
|
|
+ date: currentRow.value.更换日期.split(' ')[0],
|
|
|
+ number: currentRow.value.阈值,
|
|
|
+ id: currentRow.value.Uniqid,
|
|
|
+ }
|
|
|
+ const res = await getEquipmentUpdate(params)
|
|
|
+ if (res.code == 0) {
|
|
|
+ hztable(Machine.value)
|
|
|
+ ElMessage.success('操作成功')
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res.msg || '操作失败')
|
|
|
+ }
|
|
|
+ recordDialogVisible.value = false
|
|
|
+}
|
|
|
+ </script>
|
|
|
+
|
|
|
+ <style scoped>
|
|
|
+ .form-container {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ .form-column {
|
|
|
+ /*flex: 1;*/
|
|
|
+ margin-right: 15px; /* 调整列之间的间距 */
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 左侧输入框宽度调整 */
|
|
|
+ .form-column .el-form-item .el-input {
|
|
|
+ width: 150px; /* 调整左侧输入框的宽度 */
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.hui-plan-usage-lows div) {
|
|
|
+ color: #8c939d !important;
|
|
|
+ }
|
|
|
+ :deep(.lan-plan-usage-lows div) {
|
|
|
+ color: blue !important;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /* 媒体查询,根据需要调整断点 */
|
|
|
+ @media screen and (max-width: 768px) {
|
|
|
+ .form-column {
|
|
|
+ flex: 1 0 100%; /* 在小屏幕下变成单列布局 */
|
|
|
+ margin-right: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*:deep(.el-table td .cell) {*/
|
|
|
+ /* line-height: 30px !important;*/
|
|
|
+ /*}*/
|
|
|
+ .JKWTree-container {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .JKWTree-tree {
|
|
|
+ /*width: 300px;*/
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 10px;
|
|
|
+ margin-right: 20px;
|
|
|
+ }
|
|
|
+ .JKWTree-tree h3 {
|
|
|
+ font-size: 15px;
|
|
|
+ font-weight: 700;
|
|
|
+ margin: 10px 0;
|
|
|
+ }
|
|
|
+ .JKWTree-content {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /* 选中某行时的背景色 */
|
|
|
+ :deep(.el-table__body tr.current-row) > td {
|
|
|
+ background: #ff80ff !important;
|
|
|
+ }
|
|
|
+ </style>
|
|
|
+ <style scoped>
|
|
|
+ :deep(.el-table td .cell) {
|
|
|
+ line-height: 20px !important;
|
|
|
+ }
|
|
|
+ :deep(.el-tabs__header){
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ .search{
|
|
|
+ margin-left: 0px !important;
|
|
|
+ margin-right: 10px !important;
|
|
|
+ }
|
|
|
+ .bt{
|
|
|
+ margin-left: 2px !important;
|
|
|
+ padding: 3px !important;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+ .el-tabs__header{
|
|
|
+ margin: 0px !important;
|
|
|
+ }
|
|
|
+ .gva-table-box{
|
|
|
+ padding: 0px !important;
|
|
|
+ }
|
|
|
+ .mab{
|
|
|
+ margin-bottom: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .tree-wrapper {
|
|
|
+ min-height: 300px;
|
|
|
+ max-height: 400px;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog-footer {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+ </style>
|
|
|
+
|