|
@@ -0,0 +1,418 @@
|
|
|
+<template>
|
|
|
+ <div class="page-container row-container">
|
|
|
+ <!-- 左侧区域 -->
|
|
|
+ <section class="list-part-container" style="flex: 3">
|
|
|
+ <!-- 搜索区 -->
|
|
|
+ <el-form class="list-search-container" :model="queryDayworkParams" ref="queryRef" :inline="true"
|
|
|
+ style="margin-right: 0px">
|
|
|
+ <el-form-item class="section-title" label="生产批次" />
|
|
|
+ <el-form-item label="生产计划单号:">
|
|
|
+ <el-input placeholder="请输入生产计划单号/批次号" v-model.trim="queryDayworkParams.productionPlanNo"
|
|
|
+ @keydown.enter.prevent clearable style="width: 200px" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="产品描述:">
|
|
|
+ <el-input placeholder="请输入产品描述" v-model.trim="queryDayworkParams.productDescription" @keydown.enter.prevent
|
|
|
+ clearable style="width: 130px" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item style="margin-left: 0">
|
|
|
+ <el-button type="info" icon="Search" @click="handleQuery">搜索
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div class="el-table-container">
|
|
|
+ <div class="el-table-inner-container">
|
|
|
+ <el-table ref="dayworkTable" :data="dayworkList" v-loading="dayworkLoading" highlight-current-row
|
|
|
+ height="100%" @current-change="handleDayworkCurrentChange">
|
|
|
+ <el-table-column label="客户简称" prop="companyAlias" width="120" align="center" />
|
|
|
+ <el-table-column label="生产计划单号" prop="productionPlanNo" width="100" align="center" />
|
|
|
+ <el-table-column label="批次号" min-width="120" prop="lotCode" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button v-if="permissionFlag || useUserStore().user.userId == 1" link type="primary"
|
|
|
+ @click="handleColumnClick(scope.row)"><span>{{ scope.row.lotCode }}</span></el-button>
|
|
|
+ <span v-else>{{ scope.row.lotCode }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="产品描述" prop="productDescription" align="center" />
|
|
|
+ <el-table-column label="图纸版本" prop="technologyVersion" width="60" align="center" />
|
|
|
+ <el-table-column label="投产量" prop="productionQuantity" width="60" align="center" />
|
|
|
+ <el-table-column label="下达日期" prop="createTime" width="100" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <span>{{
|
|
|
+ proxy.moment(scope.row.createTime).format("YYYY-MM-DD")
|
|
|
+ }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="报工总时长" prop="totalWorkingHours" width="150" align="center" />
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 分页 -->
|
|
|
+ <pagination v-show="total > 0" :total="total" v-model:page="queryDayworkParams.pageNum"
|
|
|
+ v-model:limit="queryDayworkParams.pageSize" @pagination="getDayworks" />
|
|
|
+ </section>
|
|
|
+ <!-- 右侧区域 -->
|
|
|
+ <section class="list-part-container" style="flex: 2">
|
|
|
+ <el-form class="list-search-container" :inline="true">
|
|
|
+ <el-form-item class="section-title" label="辅助报工信息" />
|
|
|
+ <el-form-item class="section-title" label="请选择工序:" prop="processId">
|
|
|
+ <el-select-v2 v-model="queryItemParams.auxiliaryProcessId" clearable :options="processList"
|
|
|
+ placeholder="请选择工序" style="width: 100%" @change="handleProcessChange" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item style="margin-left: 0">
|
|
|
+ <el-button type="info" @click="handleOpenHistory">历史记录
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <div class="el-table-container">
|
|
|
+ <div class="el-table-inner-container">
|
|
|
+ <el-table :data="dayworkItemList" v-loading="dayworkItemLoading" height="100%">
|
|
|
+ <el-table-column label="操作者" prop="nickName" width="60" align="center" />
|
|
|
+ <el-table-column label="生产工序" prop="processAlias" align="center" />
|
|
|
+ <el-table-column label="辅助工序" prop="auxiliaryProcessAlias" align="center" />
|
|
|
+ <el-table-column label="开始时间" prop="startTime" width="160" align="center" />
|
|
|
+ <el-table-column label="结束时间" prop="endTime" width="160" align="center" />
|
|
|
+ <el-table-column label="总工时" prop="workingHours" width="160" align="center" />
|
|
|
+ <el-table-column label="生产状态" prop="status" width="100" align="center">
|
|
|
+ <template #default="scope">
|
|
|
+ <dict-tag :options="daywork_status" :value="scope.row.status" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column fixed="right" label="操作" align="center" width="200px">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button link type="warning" icon="Edit" @click="handleUpdateDayworkItem(scope.row)">编辑
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- 分页 -->
|
|
|
+ <pagination v-show="itemTotal > 0" :total="itemTotal" v-model:page="queryItemParams.pageNum"
|
|
|
+ v-model:limit="queryItemParams.pageSize" @pagination="getDayworkItems" />
|
|
|
+ </section>
|
|
|
+ <!-- 报工信息表单 -->
|
|
|
+ <daywork-item-form ref="dayworkItemRef" @handleSaveSuccess="handleGetDayworkItems" />
|
|
|
+ <!-- 分选报工信息表单 -->
|
|
|
+ <sort-item-form ref="sortItemRef" @handleSaveSuccess="handleGetDayworkItems" />
|
|
|
+ <!-- 报工历史修改表单 -->
|
|
|
+ <dialog-daywork-item-history ref="dialogDayworkItemHistoryRef" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import {
|
|
|
+ listDaywork,
|
|
|
+ getProcessList,
|
|
|
+ delDayworkItem
|
|
|
+} from "@/api/business/daywork.js";
|
|
|
+import { listDeptProcess } from "@/api/business/deptProcess";
|
|
|
+import { listDayworkItem } from '@/api/business/dayworkAuxiliaryItem'
|
|
|
+import { selectUserPermissionList } from "@/api/system/user.js";
|
|
|
+import router from "@/router";
|
|
|
+import useUserStore from '@/store/modules/user'
|
|
|
+import { allListProcess } from '@/api/business/auxiliaryProcess'
|
|
|
+import dayworkItemForm from "./form";
|
|
|
+// import sortItemForm from "./sortForm"
|
|
|
+// import DialogDayworkItemHistory from "./DialogDayworkItemHistory.vue";
|
|
|
+
|
|
|
+const { proxy } = getCurrentInstance();
|
|
|
+
|
|
|
+/** 字典 */
|
|
|
+const { daywork_status } = proxy.useDict("daywork_status");
|
|
|
+
|
|
|
+/** 生产批次 */
|
|
|
+const dayworkList = ref([]);
|
|
|
+const dayworkTable = ref(null);
|
|
|
+const currentDaywork = ref({});
|
|
|
+const dayworkLoading = ref(false);
|
|
|
+const total = ref(0);
|
|
|
+/**工段 */
|
|
|
+const permissionFlag = ref(false);
|
|
|
+const loading = ref(false);
|
|
|
+/** 报工信息 */
|
|
|
+const dayworkItemList = ref([]);
|
|
|
+const dayworkItemLoading = ref(false);
|
|
|
+const itemTotal = ref(0);
|
|
|
+const lastStatus = ref(null)
|
|
|
+const latestProcessId = ref(null);
|
|
|
+const latestDeptId = ref(null)
|
|
|
+const permissionList = ref(null)
|
|
|
+const deptProcessList = ref([]);
|
|
|
+/**工序 */
|
|
|
+const processList = ref([]);
|
|
|
+/** 查询对象 */
|
|
|
+const queryDayworkParams = ref({
|
|
|
+ productDescription: "",
|
|
|
+ deptId: "",
|
|
|
+ lotCode: "",
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+});
|
|
|
+const queryItemParams = ref({
|
|
|
+ dayworkId: "0",
|
|
|
+ isAmend: 0,
|
|
|
+ isWasteRecycling: 0,
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ technologicalProcessDetailId: null,
|
|
|
+});
|
|
|
+
|
|
|
+/*********************** 工段相关事件 ****************************/
|
|
|
+function getList() {
|
|
|
+ loading.value = true;
|
|
|
+ getPremission();
|
|
|
+ getDayworks()
|
|
|
+}
|
|
|
+
|
|
|
+//切换工段
|
|
|
+function handleDeptChange() {
|
|
|
+ getDayworks();
|
|
|
+}
|
|
|
+
|
|
|
+/*********************** 生产批次相关事件 ****************************/
|
|
|
+
|
|
|
+/** 查询计划明细 */
|
|
|
+function getDayworks() {
|
|
|
+ dayworkLoading.value = true;
|
|
|
+ listDaywork(queryDayworkParams.value).then((res) => {
|
|
|
+ dayworkList.value = res.rows;
|
|
|
+ for (var i = 0; i < dayworkList.value.length; i++) {
|
|
|
+ let timeStamp = dayworkList.value[i].totalWorkingHours;
|
|
|
+ let seconds = Math.floor((timeStamp / 1000) % 60);
|
|
|
+ let minutes = Math.floor((timeStamp / (1000 * 60)) % 60);
|
|
|
+ let hours = Math.floor(timeStamp / (1000 * 60 * 60));
|
|
|
+ let time = `${hours}小时${minutes}分钟${seconds}秒`;
|
|
|
+ dayworkList.value[i].totalWorkingHours = time;
|
|
|
+ }
|
|
|
+ total.value = res.total;
|
|
|
+ dayworkLoading.value = false;
|
|
|
+ // 批次
|
|
|
+ if (dayworkList.value.length > 0) {
|
|
|
+ proxy.$refs.dayworkTable.setCurrentRow(dayworkList.value[0]);
|
|
|
+ console.log(dayworkList.value[0])
|
|
|
+ } else {
|
|
|
+ dayworkItemList.value = [];
|
|
|
+ itemTotal.value = 0;
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+function getPremission() {
|
|
|
+ selectUserPermissionList({ userId: useUserStore().user.userId }).then(res => {
|
|
|
+ permissionList.value = res.data
|
|
|
+ console.log(permissionList.value)
|
|
|
+ if (permissionList.value.indexOf("business:productionPlan:query") != -1) {
|
|
|
+ permissionFlag.value = true
|
|
|
+ } else {
|
|
|
+ permissionFlag.value = false
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+/** 打开批次详情页 */
|
|
|
+function handleColumnClick(row) {
|
|
|
+ router.push({ path: "/reviseBath/lotFormParticulars/" + row.lotCode });
|
|
|
+}
|
|
|
+// 打开历史修改弹窗
|
|
|
+function handleOpenHistory() {
|
|
|
+ proxy.$refs.dialogDayworkItemHistoryRef.open(currentDaywork.value.id);
|
|
|
+}
|
|
|
+
|
|
|
+/** 生产计划明细 current-change 事件 */
|
|
|
+function handleDayworkCurrentChange(row) {
|
|
|
+ if (row) {
|
|
|
+ queryItemParams.value.processId = null;
|
|
|
+ currentDaywork.value = row;
|
|
|
+ queryItemParams.value.dayworkId = currentDaywork.value.id;
|
|
|
+ queryItemParams.value.isAmend = row.isAmend;
|
|
|
+ queryItemParams.value.isWasteRecycling = row.isWasteRecycling;
|
|
|
+ queryItemParams.value.technologicalProcessDetailId = null;
|
|
|
+ queryItemParams.value.technologicalProcessId = row.technologicalProcessId;
|
|
|
+ getDayworkItems();
|
|
|
+ } else {
|
|
|
+ dayworkItemList.value = [];
|
|
|
+ itemTotal.value = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*********************** 报工信息相关事件 ****************************/
|
|
|
+//查询报工信息数据
|
|
|
+function handleGetDayworkItems() {
|
|
|
+ dayworkLoading.value = true;
|
|
|
+ listDaywork(queryDayworkParams.value).then((res) => {
|
|
|
+ dayworkList.value = res.rows;
|
|
|
+ for (var i = 0; i < dayworkList.value.length; i++) {
|
|
|
+ let timeStamp = dayworkList.value[i].totalWorkingHours;
|
|
|
+ let seconds = Math.floor((timeStamp / 1000) % 60);
|
|
|
+ let minutes = Math.floor((timeStamp / (1000 * 60)) % 60);
|
|
|
+ let hours = Math.floor(timeStamp / (1000 * 60 * 60));
|
|
|
+ let time = `${hours}小时${minutes}分钟${seconds}秒`;
|
|
|
+ dayworkList.value[i].totalWorkingHours = time;
|
|
|
+ }
|
|
|
+ total.value = res.total;
|
|
|
+ dayworkLoading.value = false;
|
|
|
+ if (dayworkList.value.length > 0) {
|
|
|
+ for (var i = 0; i < dayworkList.value.length; i++) {
|
|
|
+ if (dayworkList.value[i].id == currentDaywork.value.id) {
|
|
|
+ var index = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ proxy.$refs.dayworkTable.setCurrentRow(dayworkList.value[index]);
|
|
|
+ });
|
|
|
+}
|
|
|
+//删除报工信息
|
|
|
+function handleDeletedItem(id) {
|
|
|
+ proxy.$modal
|
|
|
+ .confirm("是否确认删除选中的数据项?")
|
|
|
+ .then(function () {
|
|
|
+ delDayworkItem(id).then(res => {
|
|
|
+ if (res.code == 200) {
|
|
|
+ proxy.$modal.msgSuccess("删除成功")
|
|
|
+ listDaywork(queryDayworkParams.value).then((res) => {
|
|
|
+ dayworkList.value = res.rows;
|
|
|
+ for (var i = 0; i < dayworkList.value.length; i++) {
|
|
|
+ let timeStamp = dayworkList.value[i].totalWorkingHours;
|
|
|
+ let seconds = Math.floor((timeStamp / 1000) % 60);
|
|
|
+ let minutes = Math.floor((timeStamp / (1000 * 60)) % 60);
|
|
|
+ let hours = Math.floor(timeStamp / (1000 * 60 * 60));
|
|
|
+ let time = `${hours}小时${minutes}分钟${seconds}秒`;
|
|
|
+ dayworkList.value[i].totalWorkingHours = time;
|
|
|
+ }
|
|
|
+ total.value = res.total;
|
|
|
+ // 批次
|
|
|
+ proxy.$refs.dayworkTable.setCurrentRow(dayworkList.value[dayworkList.value.findIndex(daywork => daywork.id == currentDaywork.value.id)]);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+//修改报工信息
|
|
|
+function handleUpdateDayworkItem(row) {
|
|
|
+ //同工序下状态是否有工序已完成
|
|
|
+ let processFinish = false;
|
|
|
+ //除了编辑此条以外的同工序合格数
|
|
|
+ let totalQuailifiedNum = 0;
|
|
|
+ for (let i = 0; i < dayworkItemList.value.length; i++) {
|
|
|
+ if (
|
|
|
+ row.processId == dayworkItemList.value[i].processId &&
|
|
|
+ (dayworkItemList.value[i].status == 2 ||
|
|
|
+ dayworkItemList.value[i].status == 3) &&
|
|
|
+ row.id != dayworkItemList.value[i].id
|
|
|
+ ) {
|
|
|
+ totalQuailifiedNum += dayworkItemList.value[i].qualifiedNum;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ row.processId == dayworkItemList.value[i].processId &&
|
|
|
+ dayworkItemList.value[i].status == 3 &&
|
|
|
+ row.id != dayworkItemList.value[i].id
|
|
|
+ ) {
|
|
|
+ processFinish = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let maxQuailifiedNum =
|
|
|
+ Math.floor(row.prodNum * 1.03 - totalQuailifiedNum) > 0
|
|
|
+ ? Math.floor(row.prodNum * 1.03 - totalQuailifiedNum)
|
|
|
+ : 0;
|
|
|
+ //该daywork合格数总数不能超过投产数的103%
|
|
|
+ row.technologicalProcessId = queryItemParams.value.technologicalProcessId;
|
|
|
+ row.deptId = queryDayworkParams.value.deptId;
|
|
|
+ row.productionPlanNo = currentDaywork.value.productionPlanNo;
|
|
|
+ row.productDescription = currentDaywork.value.productDescription;
|
|
|
+ row.productionPlanDetailId = currentDaywork.value.productionPlanDetailId;
|
|
|
+ row.dayworkId = currentDaywork.value.id;
|
|
|
+ row.lotId = currentDaywork.value.lotId;
|
|
|
+ row.isAmend = currentDaywork.value.isAmend;
|
|
|
+ row.isWasteRecycling = currentDaywork.value.isWasteRecycling;
|
|
|
+ row.maxQuailifiedNum = maxQuailifiedNum;
|
|
|
+ row.technologyVersion = currentDaywork.value.technologyVersion
|
|
|
+ row.lotCode = currentDaywork.value.lotCode;
|
|
|
+ row.totalQuailifiedNum = totalQuailifiedNum;
|
|
|
+ // console.log(row, currentDaywork)
|
|
|
+ row.productId = currentDaywork.value.productId
|
|
|
+ //判断是否是当前工段
|
|
|
+ if (row.deptId == currentDaywork.value.deptId) {
|
|
|
+ row.currentDept = true;
|
|
|
+ } else {
|
|
|
+ row.currentDept = false;
|
|
|
+ }
|
|
|
+ //如果为true,则同工序已有工序已完成
|
|
|
+ row.processFinish = processFinish;
|
|
|
+ // if (row.isSort == 0) {
|
|
|
+ // proxy.$refs.dayworkItemRef.open(row);
|
|
|
+ // } else {
|
|
|
+ // proxy.$refs.sortItemRef.open(row);
|
|
|
+ // }
|
|
|
+ proxy.$refs.dayworkItemRef.open(row);
|
|
|
+}
|
|
|
+
|
|
|
+//查看报工信息
|
|
|
+function handleCheckDayworkItem(row) {
|
|
|
+ row.technologicalProcessId = queryItemParams.value.technologicalProcessId;
|
|
|
+ row.deptId = queryDayworkParams.value.deptId;
|
|
|
+ row.productionPlanDetailId = currentDaywork.value.productionPlanDetailId;
|
|
|
+ row.isAmend = currentDaywork.value.isAmend;
|
|
|
+ row.isWasteRecycling = currentDaywork.value.isWasteRecycling;
|
|
|
+ row.dayworkId = currentDaywork.value.id;
|
|
|
+ row.lotId = currentDaywork.value.lotId;
|
|
|
+ //判断是否是当前工段
|
|
|
+ if (row.deptId == currentDaywork.value.deptId) {
|
|
|
+ row.currentDept = true;
|
|
|
+ } else {
|
|
|
+ row.currentDept = false;
|
|
|
+ }
|
|
|
+ //修改向form表单传一个状态值
|
|
|
+ row.editStatus = false;
|
|
|
+ // row.returnFlag = false;
|
|
|
+ // //如果是最新工序的已接收,则传一个状态值,给form表单一个退回按钮
|
|
|
+ // if (row.processId == latestProcessId.value && row.status == 7) {
|
|
|
+ // row.returnFlag = true;
|
|
|
+ // }
|
|
|
+ if (row.isSort == 0) {
|
|
|
+ proxy.$refs.dayworkItemRef.open(row);
|
|
|
+ } else {
|
|
|
+ proxy.$refs.sortItemRef.open(row);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**切换工序 */
|
|
|
+function handleProcessChange() {
|
|
|
+ getDayworkItems();
|
|
|
+}
|
|
|
+
|
|
|
+/** 报工详情列表 */
|
|
|
+function getDayworkItems() {
|
|
|
+ dayworkItemLoading.value = true;
|
|
|
+ listDayworkItem(queryItemParams.value).then((res) => {
|
|
|
+ dayworkItemList.value = res.rows;
|
|
|
+ itemTotal.value = res.total;
|
|
|
+ dayworkItemLoading.value = false;
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+//工序信息
|
|
|
+function getProcess() {
|
|
|
+ //工序下拉框
|
|
|
+ allListProcess({
|
|
|
+ }).then((res) => {
|
|
|
+ processList.value = res.rows.map(v => ({ label: v.name, value: v.id, ...v }))
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+/** 搜索按钮操作 */
|
|
|
+function handleQuery() {
|
|
|
+ getDayworks();
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ getList();
|
|
|
+});
|
|
|
+
|
|
|
+getProcess();
|
|
|
+</script>
|
|
|
+<style scoped>
|
|
|
+.el-form--inline .el-form-item {
|
|
|
+ margin-right: 20px;
|
|
|
+}
|
|
|
+</style>
|