ezhizao_zx 10 mēneši atpakaļ
vecāks
revīzija
3ec55db5df

+ 51 - 0
src/api/business/auxiliaryProcess.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+const baseUrl = import.meta.env.VITE_APP_BASE_API
+// 查询辅助工序列表
+export function listProcess(query) {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询辅助工序详细
+export function getProcess(id) {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess/' + id,
+    method: 'get'
+  })
+}
+
+// 新增辅助工序
+export function addProcess(data) {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改辅助工序
+export function updateProcess(data) {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除辅助工序
+export function delProcess(id) {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess/' + id,
+    method: 'delete'
+  })
+}
+export function allListProcess() {
+  return request({
+    url: baseUrl + '/business/auxiliaryProcess/all',
+    method: 'get'
+  })
+}

+ 31 - 0
src/api/business/dayworkAuxiliaryItem.js

@@ -0,0 +1,31 @@
+import request from '@/utils/request'
+
+const baseUrl = import.meta.env.VITE_APP_PRODUCTION_API
+
+/**
+ * 获取 生产批次报工 列表
+ * @param {*} data
+ * @returns
+ */
+export function listDayworkItem(query) {
+  return request({
+    url: baseUrl + '/business/auxiliaryDaywork/list',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getDayworkItemInfo(id) {
+  return request({
+    url: baseUrl + '/business/auxiliaryDaywork/getInfo/' + id,
+    method: 'get'
+  })
+}
+
+export function updateDayworkItemInfo(data) {
+  return request({
+    url: baseUrl + '/business/auxiliaryDaywork/update',
+    method: 'post',
+    data: data
+  })
+}

+ 421 - 0
src/views/business/auxiliaryDaywork/form.vue

@@ -0,0 +1,421 @@
+<template>
+  <!-- 添加或修改项目信息对话框 -->
+  <el-drawer v-model="visible" size="80%" direction="rtl" :close-on-press-escape="false">
+    <div class="page-container form-container">
+      <div class="form-btns-container">
+        <span class="title-label"><el-icon>
+            <Document />
+          </el-icon>
+          报工详情</span>
+        <el-button type="primary" icon="Check" style="margin-right: 10px" @click="handleSave">保 存
+        </el-button>
+        <el-button icon="Close" @click="handleCancel">取 消
+        </el-button>
+      </div>
+      <!-- 主表 -->
+      <el-form ref="dayworkItemRef" class="master-container" :model="form" :rules="rules" :show-message="true">
+        <el-row :gutter="20">
+          <el-col :span="7">
+            <el-form-item label="开始时间:" prop="startTime">
+              <el-date-picker v-model="form.startTime" :disabled="!editStatus" type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss " :clearable="false" :editable="false" placeholder="请选择开始时间"
+                @change="handleTotalTime" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="生产工序:" prop="processId" label-width="90px">
+              {{ form.processAlias }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="辅助工序:" prop="processId" label-width="90px">
+              {{ form.auxiliaryProcessAlias }}
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="7">
+            <el-form-item label="生产状态:" prop="status" align="center">
+              <el-select v-model="form.status" placeholder="请选择生产状态" :disabled="true" style="width: 220px"
+                @change="handleChangeStatus">
+                <el-option v-for="dict in dynamicOptions" :key="dict.value" :label="dict.label"
+                  :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="结束时间:" prop="endTime" label-width="90px">
+              <el-date-picker v-model="form.endTime" :disabled="!editStatus" type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss " :editable="false" :clearable="false" placeholder="请选择结束时间"
+                @change="handleTotalTime" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="操作者:" prop="nickName" label-width="82px">
+              <el-input v-model.trim="form.nickName" placeholder="请输入操作者" readonly :clearable="true"
+                style="width: 220px; margin-left: 8px">
+                <template #append>
+                  <el-button icon="Search" @click="handleSelectUserSingle" />
+                </template></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="7">
+            <el-form-item label="总工时:" prop="workingHoursTime" label-width="82px">
+              <el-input v-model.trim="workingHoursTime" :disabled="true" style="width: 220px; margin-left: 0px" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <!-- 搜索区域 -->
+      <el-form class="list-search-container" :inline="true">
+        <el-form-item class="section-title" label="废品信息" />
+      </el-form>
+      <!-- 列表区 -->
+      <div class="el-table-container">
+        <el-table ref="dayworkItemRejectTable" v-loading="loading" row-key="id" :data="form.groupRejectList"
+          height="100%">
+          <el-table-column type="index" label="行号" width="60" align="center">
+            <template #default="scope">
+              {{ scope.$index + 1 }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="dayworkItem.nickName" label="生产工序加工人" align="center"></el-table-column>
+          <el-table-column prop="dayworkItem.startTime" label="开始时间" align="center"></el-table-column>
+          <el-table-column prop="dayworkItem.endTime" label="结束时间" align="center"></el-table-column>
+          <el-table-column prop="prodNum" label="投产数量" align="center"></el-table-column>
+          <el-table-column prop="rejectNum" label="废品数量" align="center">
+            <template #default="scope">
+              <div v-if="!editStatus"> {{ scope.row.rejectNum }}</div>
+              <el-input-number v-else v-model="scope.row.rejectNum" style="width: 100px" :step="1" step-strictly
+                :controls="false" />
+            </template>
+          </el-table-column>
+          <el-table-column prop="qualifiedNum" label="合格数量" align="center"></el-table-column>
+          <!-- <el-table-column fixed="right" label="操作" align="center">
+            <template #default="scope">
+              <el-button link type="danger" icon="Delete" :disabled="!editStatus"
+                @click="handleDeleteReject(scope.row)">删除
+              </el-button>
+            </template>
+          </el-table-column> -->
+        </el-table>
+      </div>
+      <!-- 搜索人员弹窗 -->
+      <dialog-person ref="dialogPersonRef" :single-selected="handleGetUser" />
+    </div>
+  </el-drawer>
+</template>
+<script setup>
+import {
+  getDayworkItemInfo,
+  updateDayworkItemInfo
+} from "@/api/business/dayworkAuxiliaryItem.js";
+import { ref } from "vue";
+import dialogPerson from "./person.vue"
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["handleSaveSuccess"]);
+/** 字典 */
+const { daywork_status_edit } = proxy.useDict("daywork_status_edit");
+const { daywork_status_first } = proxy.useDict("daywork_status_first");
+const { daywork_status_second } = proxy.useDict("daywork_status_second");
+const { waste_causes } = proxy.useDict("waste_causes");
+const detailInfo = ref({});
+const loading = ref(false);
+const processList = ref([]);
+const lotId = ref(null);
+const equipmentList = ref([]);
+const visible = ref(false);
+const isFirst = ref(true); //是否为首序
+const editStatus = ref(false);
+const currentDept = ref(false);
+const rejectAmount = ref(0);
+const dynamicOptions = ref([]);
+const workingHoursTime = ref("");
+const maxQuailifiedNum = ref(0);
+const detailsRow = {
+  id: null,
+  rejectNum: "",
+  reason: "",
+};
+// const validateprodNum = (rule, value, callback) => {
+//   if (value <= 0) {
+//     callback(new Error("投产量应大于0"));
+//   } else {
+//     callback();
+//   }
+// };
+const validateWorkingHours = (rule, value, callback) => {
+  if (form.value.workHoursTimestamp < 0) {
+    callback(new Error("结束时间应晚于开始时间"));
+  } else {
+    callback();
+  }
+};
+const validateQualifiedNum = (rule, value, callback) => {
+  const max = maxQuailifiedNum.value;
+  if (value < 0) {
+    callback(new Error("合格数量应大于/等于0"));
+  } else {
+    callback();
+  }
+
+  // else if (
+  //   value > max &&
+  //   detailInfo.value.firstProcessId != form.value.processId
+  // ) {
+  //   callback(new Error("合格数量不应大于投产量的103%,即" + max));
+  // }
+};
+const validateEndTime = (rule, value, callback) => {
+  if (form.value.status > 1) {
+    if (form.value.endTime == null) {
+      callback(new Error("结束时间不能为空"));
+    } else {
+      callback();
+    }
+  } else {
+    if (form.value.endTime != null) {
+      callback(new Error("该状态结束时间应为空"));
+    } else {
+      callback();
+    }
+  }
+};
+const validateStartTime = (rule, value, callback) => {
+  if (form.value.status > 1) {
+    if (form.value.startTime == null) {
+      callback(new Error("开始时间不能为空"));
+    } else {
+      callback();
+    }
+  } else {
+    callback();
+  }
+};
+const data = reactive({
+  form: {
+    groupRejectList: [],
+    nickName: "",
+    processId: "",
+    processAlias: "",
+    prodNum: 0,
+    qualifiedNum: 0,
+    rejectNum: 0,
+    startTime: "",
+    endTime: "",
+    workingHours: 0,
+    status: "",
+    workHoursTimestamp: 0,
+  },
+  rules: {
+    // prodNum: [
+    //   { required: true, message: "投产量不能为空", trigger: "blur" },
+    //   { validator: validateprodNum, trigger: "blur" },
+    // ],
+    startTime: [{ validator: validateStartTime, trigger: "blur" }],
+    endTime: [{ validator: validateEndTime, trigger: "blur" }],
+    workingHoursTime: [{ validator: validateWorkingHours, trigger: "change" }],
+    qualifiedNum: [
+      { required: true, message: "合格数量不能为空", trigger: "blur" },
+      { validator: validateQualifiedNum, trigger: "blur" },
+    ],
+  },
+});
+
+const { form, rules } = toRefs(data);
+
+/***********************  方法区  ****************************/
+/** 打开抽屉 */
+const open = (row) => {
+  reset();
+  loading.value = true;
+  dynamicOptions.value = daywork_status_first.value;
+  console.log(daywork_status_first)
+  console.log(daywork_status_second)
+  console.log(daywork_status_edit)
+  if (row.id) {
+    getDayworkItemInfo(row.id).then(
+      (response) => {
+        if (response.code == 200) {
+          // for (let i = 0; i < response.data.length; i++) {
+          //   response.data[i].rejectNum = parseInt(response.data[i].rejectNum);
+          // }
+          form.value = response.data
+          form.value.groupRejectList = response.data.rejectList
+          console.log(form.value)
+          if (form.value.status == '3') {
+            editStatus.value = true
+          } else {
+            editStatus.value = false
+          }
+        }
+      }
+    );
+    loading.value = false;
+    visible.value = true;
+  }
+};
+//操作者人员带回
+function handleGetUser(selection) {
+  form.value.nickName = selection.nickName;
+  form.value.userId = selection.userId;
+  form.value.userName = selection.userName;
+}
+function handleSelectUserSingle() {
+  proxy.$refs.dialogPersonRef.open()
+}
+/**
+ * 对话框关闭 事件
+ */
+function close() {
+  reset();
+  visible.value = false;
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    groupRejectList: [],
+    nickName: "",
+    processId: null,
+    processAlias: "",
+    prodNum: 0,
+    qualifiedNum: 0,
+    rejectNum: 0,
+    startTime: "",
+    endTime: "",
+    workingHours: 0,
+  };
+  proxy.resetForm("dayworkItemRef");
+}
+
+/** 提交按钮 */
+const handleSave = () => {
+  proxy.$refs["dayworkItemRef"].validate((valid) => {
+    if (valid) {
+      rejectAmount.value = 0;
+      var reasonList = [];
+      var flag = true;
+
+      form.value.workingHours = form.value.workHoursTimestamp;
+      //设备id和code
+      for (let i = 0; i < equipmentList.value.length; i++) {
+        if (form.value.equipmentDetailId == equipmentList.value[i].value) {
+          form.value.equipmentDetailCode = equipmentList.value[i].label;
+        }
+      }
+      if (flag) {
+        if (form.value.groupRejectList.length > 0) {
+          form.value.groupRejectList.forEach(item => {
+            item.deptId = detailInfo.value.deptId
+            item.processId = detailInfo.value.processId
+          });
+        }
+        form.value.dayworkId = detailInfo.value.dayworkId;
+        //同工序的所有合格数
+        form.value.temporaryProcessQualifiedNum =
+          detailInfo.value.totalQuailifiedNum + form.value.qualifiedNum;
+        //如果状态从工序已完成改成结束报工,传给后端一个标记,如果为true,则删除中间表对应的数据
+        if (detailInfo.value.status == 3 && form.value.status == 2) {
+          form.value.dayworkId = detailInfo.value.dayworkId;
+          form.value.flag = true;
+        }
+        let data = form.value;
+        data.lotId = lotId.value;
+
+        const max = maxQuailifiedNum.value;
+        let sunm =
+          detailInfo.value.totalQuailifiedNum + form.value.qualifiedNum; //计算总合格数
+        let num = sunm - form.value.prodNum; //多出来的数量
+        let percent = (sunm / form.value.prodNum) * 100; //合格率
+        percent = Math.ceil(percent * 100) / 100; //只入不舍
+        updateDayworkItem();
+      }
+    }
+  });
+};
+
+//页面提交方法
+function updateDayworkItem() {
+  updateDayworkItemInfo(form.value).then((res) => {
+    if (res.code == 200) {
+      proxy.$modal.msgSuccess("保存成功!");
+      visible.value = false;
+      emit("handleSaveSuccess");
+    } else {
+      proxy.$modal.msgError("保存失败!");
+    }
+  });
+}
+
+//删除废弃信息
+function handleDeleteReject(row) {
+  form.value.groupRejectList.splice(form.value.groupRejectList.indexOf(row), 1);
+}
+
+//添加废弃信息
+function handleAddReject() {
+  const newDetail = JSON.parse(JSON.stringify(detailsRow));
+  newDetail.rejectNum = 0;
+  newDetail.dayworkId = detailInfo.value.dayworkId;
+  newDetail.dayworkItemId = detailInfo.value.id;
+  newDetail.lotId = detailInfo.value.lotId;
+  form.value.groupRejectList.push(newDetail);
+}
+
+//计算总工时
+function handleTotalTime() {
+  if (form.value.endTime == null) {
+    workingHoursTime.value = "0小时0分钟0秒";
+    form.value.workHoursTimestamp = 0;
+  } else {
+    form.value.workHoursTimestamp =
+      new Date(form.value.endTime) - new Date(form.value.startTime);
+    let seconds = Math.floor((form.value.workHoursTimestamp / 1000) % 60);
+    let minutes = Math.floor(
+      (form.value.workHoursTimestamp / (1000 * 60)) % 60
+    );
+    let hours = Math.floor(form.value.workHoursTimestamp / (1000 * 60 * 60));
+    let time = `${hours}小时${minutes}分钟${seconds}秒`;
+    workingHoursTime.value = time;
+  }
+}
+
+//当生产状态为未开始、生产中时,结束时间为空,合格数为0,废弃信息为空
+function handleChangeStatus() {
+  if (form.value.status == 1) {
+    form.value.endTime = null;
+    workingHoursTime.value = "0小时0分钟0秒";
+    form.value.workingHours = 0;
+    form.value.groupRejectList = [];
+    form.value.qualifiedNum = 0;
+  }
+  if (form.value.status == 0) {
+    form.value.endTime = null;
+    form.value.startTime = null;
+    workingHoursTime.value = "0小时0分钟0秒";
+    form.value.workingHours = 0;
+    form.value.groupRejectList = [];
+    form.value.qualifiedNum = 0;
+    form.value.equipmentDetailId = null;
+    form.value.equipmentDetailCode = null;
+  }
+}
+
+/** 取消按钮 */
+const handleCancel = () => {
+  visible.value = false;
+  reset();
+}
+
+/** 暴露给父组件的方法 */
+defineExpose({
+  open,
+})
+</script>
+<style scoped>
+.el-select-v2__placeholder {
+  display: flex !important;
+}
+</style>

+ 418 - 0
src/views/business/auxiliaryDaywork/index.vue

@@ -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>

+ 134 - 0
src/views/business/auxiliaryDaywork/person.vue

@@ -0,0 +1,134 @@
+<template>
+  <el-dialog title="员工选择" v-model="visible" :width="width" @close="close" append-to-body draggable>
+    <el-form ref="dialogForm" class="list-search-container" :inline="true" :model="queryParams">
+      <el-form-item label="员工编码:" prop="userName">
+        <el-input v-model.trim="queryParams.userName" type="text" placeholder="请输入员工编码" @keydown.enter.prevent
+          @keyup.enter="handleSearch" style="width: 180px" clearable />
+      </el-form-item>
+      <el-form-item label="员工姓名:" prop="nickName">
+        <el-input v-model.trim="queryParams.nickName" type="text" placeholder="请输入员工姓名" @keydown.enter.prevent
+          @keyup.enter="handleSearch" style="width: 180px" clearable />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="info" icon="Search" @click="handleSearch">搜索</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table ref="dialogTable" :data="list" :row-key="getRowKey" v-loading="personLoading" height="440px"
+      align="center">
+      <el-table-column v-if="multiple" type="selection" width="40" align="center" />
+      <el-table-column type="index" label="行号" width="50" align="center" />
+      <el-table-column label="员工编码" prop="userName" width="100" align="center" />
+      <el-table-column label="员工姓名" prop="nickName" width="100" align="center" />
+      <el-table-column label="手机号码" prop="phoneNumber" width="150" align="center" />
+      <el-table-column label="性别" prop="sex" width="60" align="center" />
+      <el-table-column label="使用单位" prop="usageCompanyName" width="220" align="center" />
+      <el-table-column label="备注" prop="remark" align="center" />
+      <el-table-column v-if="!multiple" label="操作" width="50" align="center">
+        <template #default="scope">
+          <el-button type="success" icon="finished" circle @click="handleSingleSelected(scope.row)" />
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize" @pagination="getList" />
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button v-if="multiple" type="primary" :disabled="selections.length === 0" icon="Check"
+          @click="handleMultipleSelected">
+          确定
+        </el-button>
+        <el-button icon="Close" @click="close">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+<script setup>
+import { ref } from '@vue/reactivity'
+import { getUserList } from '@/api/system/user'
+
+
+const { proxy } = getCurrentInstance()
+const total = ref(0)
+const props = defineProps({
+  width: {
+    type: String,
+    default: '1000px'
+  },
+  multiple: {
+    type: Boolean,
+    default: false
+  },
+  singleSelected: {
+    type: Function,
+    default: null
+  }
+})
+const { singleSelected } = toRefs(props)
+const list = ref([])
+const personLoading = ref(false)
+const visible = ref(false)
+const data = reactive({
+  queryParams: {
+    nickName: '',
+    userName: '',
+    pageSize: 10,
+    pageNum: 1
+  }
+})
+const { queryParams } = toRefs(data)
+/**
+ * 对话框打开 事件
+ */
+function open() {
+  visible.value = true
+  getList()
+}
+/** 获取行 id */
+function getRowKey(row) {
+  return row.userId
+}
+
+/**
+ * 对话框关闭 事件
+ */
+function close() {
+  proxy.$refs.dialogForm.resetFields()
+  proxy.$refs.dialogTable.clearSelection()
+  queryParams.value.pageNum = 1
+  visible.value = false
+}
+
+/**
+ * 加载数据
+ */
+function getList() {
+  personLoading.value = true
+  getUserList(queryParams.value).then(res => {
+    if (res.code == 200) {
+      list.value = res.rows
+      total.value = res.total
+    }
+  })
+  personLoading.value = false
+}
+
+
+/**  搜索 事件 */
+function handleSearch() {
+  queryParams.value.pageNum = 1
+  getList()
+
+}
+
+/** 单选事件 */
+function handleSingleSelected(row) {
+  if (singleSelected.value) {
+    singleSelected.value(row)
+  }
+  close()
+}
+
+defineExpose({
+  open
+})
+</script>

+ 53 - 21
src/views/business/auxiliaryProcess/index.vue

@@ -6,36 +6,50 @@
       <el-form class="list-search-container" :model="queryParams" ref="queryRef" :inline="true">
         <el-form-item class="section-title" label="辅助工序管理" />
 
-        <el-form-item label="检查类别编码:" prop="code">
-          <el-input v-model="queryParams.code" placeholder="请输入检查类别编码" clearable @keyup.enter="handleQuery" />
-        </el-form-item>
-        <el-form-item label="检查类别名称:" prop="name">
-          <el-input v-model="queryParams.name" placeholder="请输入检查类别名称" clearable @keyup.enter="handleQuery" />
+        <el-form-item label="辅助工序名称:" prop="code">
+          <el-input v-model="queryParams.name" placeholder="请输入辅助工序名称" clearable @keyup.enter="handleQuery"
+            style="width: 160px;" />
         </el-form-item>
         <el-form-item>
           <el-button type="info" icon="Search" @click="handleQuery">搜索</el-button>
         </el-form-item>
         <el-form-item>
           <el-button type="primary" icon="Plus" @click="handleAdd(null)"
-            v-hasPermi="['business:check:add']">新增</el-button>
+            v-hasPermi="['business:auxiliaryProcess:add']">新增</el-button>
         </el-form-item>
 
       </el-form>
       <!-- 列表区域 -->
       <div class="el-table-container">
         <div class="el-table-inner-container">
-          <el-table v-loading="loading" :data="checkList" size="small" border height="100%"
+          <el-table v-loading="loading" :data="processList" border height="100%"
             @selection-change="handleSelectionChange">
             <!-- <el-table-column type="selection" width="55" align="center" /> -->
             <el-table-column type="index" label="行号" width="50" align="center" />
-            <el-table-column label="检查类别编码" align="center" prop="code" />
-            <el-table-column label="检查类别名称" align="center" prop="name" />
+            <el-table-column label="辅助工序名称" align="center" prop="name">
+              <template #default="scope">
+                <el-input v-if="scope.row.editStatus" placeholder="辅助工序名称" v-model="scope.row.name"
+                  style="width: 100%;" />
+                <div v-else>{{ scope.row.name }}</div>
+              </template>
+            </el-table-column>
+            <el-table-column label="备注" align="center" prop="remark">
+              <template #default="scope">
+                <el-input v-if="scope.row.editStatus" placeholder="备注" v-model="scope.row.remark"
+                  style="width: 100%;" />
+                <div v-else>{{ scope.row.remark }}</div>
+              </template>
+            </el-table-column>
             <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
               <template #default="scope">
-                <el-button link type="warning" size="small" icon="Edit" @click="handleUpdate(scope.row)"
-                  v-hasPermi="['business:check:edit']">修改</el-button>
-                <!-- <el-button link type="danger" size="small" icon="Delete" @click="handleDelete(scope.row)"
-                      v-hasPermi="['business:check:remove']">删除</el-button> -->
+                <el-button v-if="!scope.row.editStatus" link type="warning" size="small" icon="Edit"
+                  @click="handleUpdate(scope.row)" v-hasPermi="['business:auxiliaryProcess:edit']">修改</el-button>
+                <el-button v-else link type="success" size="small" icon="Check"
+                  @click="handleSave(scope.row)">保存</el-button>
+                <el-button v-if="!scope.row.editStatus" link type="danger" size="small" icon="Delete"
+                  @click="handleDelete(scope.row)" v-hasPermi="['business:auxiliaryProcess:remove']">删除</el-button>
+                <el-button v-else link type="info" size="small" icon="Close" @click="handleCancel(scope.row)"
+                  v-hasPermi="['business:auxiliaryProcess:remove']">取消</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -48,9 +62,9 @@
 </template>
 
 <script setup name="Equipment">
-import { listCheck, delCheck } from "@/api/business/check";
+import { listProcess, delProcess, addProcess, updateProcess } from "@/api/business/auxiliaryProcess";
 const { proxy } = getCurrentInstance();
-const checkList = ref([]);
+const processList = ref([]);
 const loading = ref(true);
 const ids = ref([])
 const single = ref(true);
@@ -70,8 +84,8 @@ const queryParams = ref({
 /** 查询检查类别列表 */
 function getList() {
   loading.value = true;
-  listCheck(queryParams.value).then(response => {
-    checkList.value = response.rows;
+  listProcess(queryParams.value).then(response => {
+    processList.value = response.rows;
     total.value = response.total;
     loading.value = false;
   });
@@ -93,13 +107,12 @@ function handleSelectionChange(selection) {
 
 /** 新增按钮操作 */
 function handleAdd() {
-  proxy.$refs.checkRef.open()
+  processList.value.push({ editStatus: true })
 }
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  const id = row.id || ids.value
-  proxy.$refs.checkRef.open(id)
+  row.editStatus = true
 }
 
 
@@ -107,14 +120,33 @@ function handleUpdate(row) {
 function handleDelete(row) {
   const _ids = row.id || ids.value;
   proxy.$modal.confirm('是否确认删除选中的数据项?').then(function () {
-    return delCheck(_ids);
+    return delProcess(_ids);
   }).then(() => {
     getList();
     proxy.$modal.msgSuccess("删除成功!");
   }).catch(() => { });
 }
 
+function handleSave(row) {
+  if (row.id == null) {
+    addProcess(row).then(afterSave)
+  } else {
+    updateProcess(row).then(afterSave)
+  }
+}
 
+function afterSave(res) {
+  if (res.code === 200) {
+    getList()
+    proxy.$modal.msgSuccess("保存成功!")
+  } else {
+    proxy.$modal.msgError("保存失败!")
+  }
+}
+
+function handleCancel(row) {
+  row.editStatus = false
+}
 
 getList();
 </script>