| | |
| | | <script setup lang="ts"> |
| | | import { ref, onMounted, watch } from 'vue' |
| | | import { ref, onMounted, watch, nextTick } from 'vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import TaskTabs from '@/views/dashboard/components/TaskTabs.vue' |
| | | import CurrentDateTime from '@/views/dashboard/components/CurrentDateTime.vue' |
| | | import { getQualityProcedureApi, getProjectApi, getProductApi, getWorkerApi, updateQualityProcedureApi } from '@/api' |
| | | import { |
| | | getQualityProcedureApi, |
| | | getProjectApi, |
| | | getProductApi, |
| | | getWorkerApi, |
| | | updateQualityProcedureApi, |
| | | qualityCountApi, |
| | | IQualityCountParams |
| | | } from '@/api' |
| | | import BigButton from '@/views/dashboard/components/BigButton.vue' |
| | | import EditInspection from '@/views/newDashboard/components/EditInspection.vue' |
| | | defineOptions({ |
| | | name: 'NewDashboardView' |
| | | }) |
| | | const taskTabsList = [ |
| | | const taskTabsList: Array<any> = [ |
| | | { label: '待质检', value: 1 }, |
| | | { label: '已质检', value: 3 } |
| | | ] |
| | | const activeTaskTab = ref(1) |
| | | const projectList = ref([]) |
| | | const productList = ref([]) |
| | | const projectIdArray = ref([]) |
| | | const productIdArray = ref([]) |
| | | const projectIdArray = ref('') |
| | | const productIdArray = ref('') |
| | | const workerList = ref([]) |
| | | const pageData = ref({ page: 1, pageSize: 1000 }) |
| | | const modalObj = ref({ modalValue: false }) |
| | | const qualityList = ref([]) |
| | | const lookQuality = ref({}) |
| | | const oldLookQuality = ref({}) |
| | | const DEFAULT_QUALITY_COUNT = { wait: '--', over: '--', scrapped: '--', pass: '--' } |
| | | const qualityCountObj = ref({ ...DEFAULT_QUALITY_COUNT }) |
| | | const tableHeaderColor = ({ rowIndex }: any) => { |
| | | if (rowIndex === 0) { |
| | | return 'header-row-class' // 这个类名需要你自己定义 |
| | | } |
| | | } |
| | | const changeTab = (tabObj: any) => { |
| | | console.log(tabObj) |
| | | } |
| | | const checkProduct = (quality: any) => { |
| | | lookQuality.value = { ...quality } |
| | |
| | | if (code == 200) { |
| | | ElMessage.success(data) |
| | | queryQualityProcedure() |
| | | queryQualityCount() |
| | | modalObj.value.modalValue = false |
| | | } else { |
| | | ElMessage.error(data) |
| | |
| | | getProjectApi(pageData.value).then(({ code, data }: any) => { |
| | | if (code == 200) { |
| | | projectList.value = data |
| | | if (Array.isArray(data) && data.length > 0) { |
| | | projectIdArray.value = data[0].id |
| | | queryProduct() |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | //2.根据项目编号查询产品列表 |
| | | const queryProduct = () => { |
| | | if (projectIdArray.value && projectIdArray.value.length > 0) { |
| | | getProductApi({ projectId: projectIdArray.value[0], ...pageData.value }).then(({ code, data }) => { |
| | | if (projectIdArray.value) { |
| | | getProductApi({ projectId: projectIdArray.value, ...pageData.value }).then(({ code, data }) => { |
| | | if (code == 200) { |
| | | productList.value = data |
| | | if (Array.isArray(data) && data.length > 0) { |
| | | productIdArray.value = data[0].id |
| | | queryQualityProcedure() |
| | | queryQualityCount() |
| | | } |
| | | } |
| | | }) |
| | | } else { |
| | | productList.value = [] |
| | | productIdArray.value = [] |
| | | productIdArray.value = '' |
| | | } |
| | | } |
| | | //3.查询工序质检列表 |
| | | const queryQualityProcedure = () => { |
| | | const params = { status: activeTaskTab.value, projectId: '', productId: '', ...pageData.value, keyword: '' } |
| | | if (Array.isArray(projectIdArray.value) && projectIdArray.value.length > 0) { |
| | | params.projectId = projectIdArray.value[0] + '' |
| | | const params: any = { status: activeTaskTab.value, projectId: '', productId: '', ...pageData.value, keyword: '' } |
| | | if (projectIdArray.value) { |
| | | params.projectId = projectIdArray.value + '' |
| | | } else { |
| | | qualityList.value = [] |
| | | return |
| | | } |
| | | if (Array.isArray(productIdArray.value) && productIdArray.value.length > 0) { |
| | | params.productId = productIdArray.value[0] + '' |
| | | if (productIdArray.value) { |
| | | params.productId = productIdArray.value + '' |
| | | } else { |
| | | qualityList.value = [] |
| | | return |
| | | } |
| | | getQualityProcedureApi(params).then(({ code, data }: any) => { |
| | | if (code == 200) { |
| | |
| | | [() => activeTaskTab.value, () => productIdArray.value, () => projectIdArray.value], |
| | | () => { |
| | | queryQualityProcedure() |
| | | queryQualityCount() |
| | | }, |
| | | { immediate: false } |
| | | ) |
| | |
| | | } |
| | | }) |
| | | } |
| | | //6.查询质检数据统计 |
| | | const queryQualityCount = () => { |
| | | const params: IQualityCountParams = { productId: '', projectId: '' } |
| | | if (projectIdArray.value) { |
| | | params.projectId = projectIdArray.value + '' |
| | | } else { |
| | | qualityCountObj.value = { ...DEFAULT_QUALITY_COUNT } |
| | | return |
| | | } |
| | | if (productIdArray.value) { |
| | | params.productId = productIdArray.value + '' |
| | | } else { |
| | | qualityCountObj.value = { ...DEFAULT_QUALITY_COUNT } |
| | | return |
| | | } |
| | | qualityCountApi(params).then(({ code, data }) => { |
| | | if (code == 200) { |
| | | for (let fieldName in data) { |
| | | if (isNaN(parseInt(data[fieldName]))) { |
| | | data[fieldName] = '--' |
| | | } |
| | | } |
| | | qualityCountObj.value = data |
| | | } |
| | | }) |
| | | } |
| | | //6.初始化页面数据 |
| | | const initPage = () => { |
| | | queryProject() |
| | | queryQualityProcedure() |
| | | queryWorker() |
| | | } |
| | | onMounted(() => { |
| | |
| | | <div class="img bg1"><img src="@/assets/images/u820.png" /></div> |
| | | <div class="text"> |
| | | <div>待检测</div> |
| | | <div>1</div> |
| | | <div>{{ qualityCountObj.wait }}</div> |
| | | </div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="img bg2"><img src="@/assets/images/u820.png" /></div> |
| | | <div class="text"> |
| | | <div>完成数</div> |
| | | <div>1</div> |
| | | <div>{{ qualityCountObj.over }}</div> |
| | | </div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="img bg3"><img src="@/assets/images/u820.png" /></div> |
| | | <div class="text"> |
| | | <div>合格数</div> |
| | | <div class="success-number">1</div> |
| | | <div>合格率</div> |
| | | <div class="success-number"> |
| | | {{ qualityCountObj.pass }} |
| | | <span v-show="!isNaN(parseInt(qualityCountObj.pass))">%</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="img bg4"><img src="@/assets/images/u820.png" /></div> |
| | | <div class="text"> |
| | | <div>报废数</div> |
| | | <div class="fail-number">0</div> |
| | | <div>报废率</div> |
| | | <div class="fail-number"> |
| | | {{ qualityCountObj.scrapped }}<span v-show="!isNaN(parseInt(qualityCountObj.scrapped))">%</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="table-filter"> |
| | | <div class="left"> |
| | | <TaskTabs v-model="activeTaskTab" style="margin-top: 20px" :list="taskTabsList" @change="changeTab"></TaskTabs> |
| | | <TaskTabs v-model="activeTaskTab" style="margin-top: 20px" :list="taskTabsList"></TaskTabs> |
| | | </div> |
| | | <div class="right"> |
| | | <el-select |
| | | v-model="projectIdArray" |
| | | :teleported="false" |
| | | size="large" |
| | | :multiple-limit="1" |
| | | multiple |
| | | placeholder="项目" |
| | | :clearable="true" |
| | | @change="queryProduct" |
| | | > |
| | | <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id" multiple> |
| | | <el-option v-for="item in projectList" :key="item.id" :label="item.projectName" :value="item.id"> |
| | | <div class="item-option"> |
| | | <div>{{ item.id }}</div> |
| | | <div>{{ item.projectName }}</div> |
| | | </div> |
| | | </el-option> |
| | | </el-select> |
| | | <el-select |
| | | v-model="productIdArray" |
| | | :teleported="false" |
| | | size="large" |
| | | :multiple-limit="1" |
| | | multiple |
| | | placeholder="产品" |
| | | > |
| | | <el-option v-for="item in productList" :key="item.id" :label="item.productName" :value="item.id" multiple> |
| | | <el-select v-model="productIdArray" :teleported="false" size="large" placeholder="产品" :clearable="true"> |
| | | <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id"> |
| | | <div class="item-option"> |
| | | <div>{{ item.id }}</div> |
| | | <div>{{ item.productName }}</div> |
| | | <div>{{ item.name }}</div> |
| | | </div> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="table"> |
| | | <el-empty v-if="qualityList.length == 0" description="暂无数据" /> |
| | | <!--<el-empty v-if="qualityList.length == 0" description="暂无数据" />--> |
| | | <el-table |
| | | v-else |
| | | :data="qualityList" |
| | | :header-cell-class-name="tableHeaderColor" |
| | | row-class-name="row-bg" |
| | | style="width: 100%; background: transparent" |
| | | border |
| | | > |
| | | <el-table-column prop="workOrderId" align="center" label="工单号" /> |
| | | <el-table-column prop="projectId" align="center" label="项目号" /> |
| | | <el-table-column prop="productId" align="center" label="产品号" /> |
| | | <el-table-column prop="productName" align="center" label="产品名" /> |
| | | <el-table-column prop="procedureId" align="center" label="工序号" /> |
| | | <el-table-column prop="procedureName" align="center" label="工序名称" /> |
| | | <el-table-column prop="drawingNumber" align="center" label="图号" /> |
| | | <el-table-column prop="amount" align="center" label="图号" /> |
| | | <el-table-column prop="transferAmount" align="center" label="转移数量" /> |
| | | <el-table-column prop="scrappedAmount" align="center" label="报废数量" /> |
| | | <el-table-column prop="passAmount" align="center" label="合格数量" /> |
| | | <el-table-column prop="workerName" align="center" label="加工员" /> |
| | | <el-table-column fixed prop="procedureName" style="background: gray" align="center" label="产品工序" /> |
| | | <el-table-column prop="workOrderId" align="center" label="工单编号" /> |
| | | <el-table-column prop="productName" align="center" label="产品名称" /> |
| | | <el-table-column prop="drawingNumber" align="center" label="产品图号" /> |
| | | <el-table-column prop="amount" align="center" label="计划数" /> |
| | | <el-table-column prop="transferAmount" align="center" label="转入数" /> |
| | | <el-table-column prop="scrappedAmount" align="center" label="报废数" /> |
| | | <el-table-column prop="passAmount" align="center" label="合格数" /> |
| | | <el-table-column prop="workerName" align="center" label="加工人员" /> |
| | | <el-table-column prop="inspectionPeople" align="center" label="质检员" /> |
| | | <el-table-column align="center" label="操作" width="120px"> |
| | | <!--<el-table-column prop="procedureId" align="center" label="工序号" />--> |
| | | <el-table-column fixed="right" align="center" label="操作" width="120px"> |
| | | <template #default="scope"> |
| | | <BigButton bg-color="#00ff00" @click="checkProduct(scope.row)">质检</BigButton> |
| | | </template> |
| | | </el-table-column> |
| | | <template #empty> |
| | | <el-empty description="暂无数据"></el-empty> |
| | | </template> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | |
| | | margin-left: 10px; |
| | | } |
| | | .right { |
| | | width: 34%; |
| | | width: 40%; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | margin-top: 2.5vh; |
| | | margin-right: -10px; |
| | | .el-select { |
| | | width: 256px; |
| | | :deep(.el-select__wrapper) { |
| | | background-color: transparent !important; |
| | | // background-color: transparent !important; |
| | | } |
| | | :deep(.el-select__placeholder) { |
| | | //color: white; |
| | | } |
| | | } |
| | | .el-select-dropdown__item { |
| | | color: white; |
| | | //color: white; |
| | | } |
| | | .el-select-dropdown__item.is-hovering { |
| | | color: #fff; |
| | | background: transparent !important; |
| | | //color: #fff; |
| | | //background: transparent !important; |
| | | /*background: linear-gradient(*/ |
| | | /*to right,*/ |
| | | /*rgba(147, 250, 255, 0),*/ |
| | |
| | | /*);*/ |
| | | } |
| | | :deep(.el-select__popper) { |
| | | border: 1px solid #1ca898; |
| | | background: deepskyblue; |
| | | width: 100%; |
| | | //border: 1px solid #1ca898; |
| | | // background: deepskyblue; |
| | | } |
| | | .item-option { |
| | | width: 100%; |
| | | display: flex; |
| | | flex: 1; |
| | | > div { |
| | | width: 50%; |
| | | min-width: 50%; |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | text-align: center; |
| | | } |
| | | } |
| | |
| | | background: transparent; |
| | | font-size: 16px; |
| | | color: white; |
| | | } |
| | | :deep(.el-icon) { |
| | | display: none; |
| | | } |
| | | } |
| | | } |