Browse Source

试运行更改

qinhb 1 tuần trước cách đây
mục cha
commit
71277c5d2b

+ 9 - 0
src/api/braze/index.ts

@@ -47,3 +47,12 @@ export function processBrazeUpdate(data: any) {
     data
   });
 }
+
+export function processBrazeCompleteAll(data: any) {
+  return request({
+    url: `/api/v1/processBraze/updateAll`,
+    method: "post",
+    data
+  });
+}
+

+ 9 - 0
src/api/process/index.ts

@@ -18,6 +18,15 @@ export function getOrders(data: any) {
     { loadingKey: "getProcessOrders" }
   );
 }
+export function getOrderDetails(data: any) {
+  return request(
+      {
+        url: "/api/v1/plan/workOrder/taskPageDetails",
+        method: "post",
+        data: data,
+      }
+  );
+}
 
 /**
  * 扫码开工

+ 7 - 1
src/api/process/reportBreak.ts

@@ -34,7 +34,13 @@ export function addBreakReport(data: object) {
     data: data,
   });
 }
-
+export function addProblemReport(data: object) {
+  return request({
+    url: `/api/v1/process/escalationFault/addProblem`,
+    method: "post",
+    data: data,
+  });
+}
 // 报工
 export function reportWork(data: object) {
   return request({

+ 2 - 1
src/styles/variables.scss

@@ -30,7 +30,8 @@ $navbar-height: 80px; // 导航栏高度
 $tags-view-height: 34px; // TagsView 高度
 
 $animation-duration:1.5s;
-$select-hover: #0a59f7; //选中主题色
+$select-hover: #2565ef; //选中主题色
+$select-activehover: #9ee394; //选中主题色
 $font-default-black: #303030; //字体默认黑
 $font-default-60: #00000060; //黑字体透明60%
 $font-default-80: #00000080;

+ 2 - 2
src/views/pro-operation/report-break/index.vue

@@ -329,7 +329,7 @@ defineExpose({
 
 .base-info {
   width: 100%;
-  background: #e3e5e7;
+  background: #f1f3f5;
   border-radius: 16px 16px 16px 16px;
   padding: 0 30px;
 
@@ -337,7 +337,7 @@ defineExpose({
     display: flex;
     justify-content: space-between;
     align-items: center;
-    height: 30px;
+    height: 35px;
 
     .item-label {
       font-size: 18px;

+ 260 - 0
src/views/pro-operation/report-problem/index.vue

@@ -0,0 +1,260 @@
+<template>
+  <el-drawer
+      v-model="drawerVisible"
+      :close-on-click-modal="false"
+      :show-close="false"
+      :with-header="false"
+      destroy-on-close
+      direction="rtl"
+      size="990px"
+  >
+    <template #default>
+      <el-scrollbar>
+        <div id="drawContent">
+          <el-form
+              ref="formRef"
+              :model="formLabelAlign"
+              :rules="rules"
+              label-position="top"
+              label-width="auto"
+          >
+            <el-form-item label="基本信息">
+              <div class="base-info">
+                <div class="info-item">
+                  <div class="item-label">产品名称</div>
+                  <div class="item-value">{{ infoData?.materialName }}</div>
+                </div>
+                <div class="info-item">
+                  <div class="item-label">产品型号</div>
+                  <div class="item-value">{{ infoData?.spec }}</div>
+                </div>
+                <div class="info-item">
+                  <div class="item-label">阶段</div>
+                  <div class="item-value">
+                    {{
+                      dictStroe.getLableByValue(
+                          "stage",
+                          infoData?.stageDictValue
+                      )
+                    }}
+                  </div>
+                </div>
+                <div class="info-item">
+                  <div class="item-label">生产数量</div>
+                  <div class="item-value">{{ infoData?.planNum }}</div>
+                </div>
+              </div>
+            </el-form-item>
+
+            <el-row>
+              <el-col :span="24">
+                <el-form-item
+                    :label="`反馈数量[${formLabelAlign.seqNoList.length}]`"
+                    prop="seqNoList"
+                >
+                  <el-select
+                      v-model="formLabelAlign.seqNoList"
+                      multiple
+                      placeholder="请选择"
+                      value-key="value"
+                      @change="selectProcessWorkSeqChange"
+                  >
+                    <el-option
+                        v-for="item in infoData?.processWorkSeq"
+                        :key="item"
+                        :label="item"
+                        :value="item"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+<!--            <el-row>
+              <el-col :span="24">
+                <el-form-item label="责任/经办者" prop="personResponsible">
+                  <el-select
+                      v-model="formLabelAlign.personResponsible"
+                      filterable
+                      placeholder="请选择"
+                      value-key="id"
+                  >
+                    <el-option
+                        v-for="item in dictStroe.allUsers"
+                        :key="item.id"
+                        :label="item.userName"
+                        :value="item.userName"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>-->
+
+            <el-form-item label="备注" prop="remark">
+              <el-input
+                  v-model="formLabelAlign.remark"
+                  :rows="3"
+                  type="textarea"
+              />
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="bottom-btns">
+          <el-button class="cancelBtn" @click="cancelClick">取消</el-button>
+          <el-button class="sureBtn" type="primary" @click="confirmClick"
+          >反馈
+          </el-button>
+        </div>
+      </el-scrollbar>
+    </template>
+    <template #footer></template>
+  </el-drawer>
+</template>
+
+<script lang="ts" setup>
+import {
+  addProblemReport,
+  breakReportInfoById,
+} from "@/api/process/reportBreak";
+import { useProcessStore } from "@/store/modules/processView";
+import { useDictionaryStore } from "@/store/modules/dictionary";
+import { getProcessInfo } from "@/api/prosteps";
+
+const processStore = useProcessStore();
+const dictStroe = useDictionaryStore();
+
+const drawerVisible = ref(false);
+
+const infoData = ref<any>({});
+
+const formRef = ref<InstanceType<typeof ElForm>>();
+const formLabelAlign = reactive({
+  seqNoList: [],
+  reasonType: "",
+  type: 1,
+  reasonList: [],
+  processesList: [],
+  firstInspection: 0,
+  personResponsible: "",
+  remark: "",
+});
+const rules = reactive({
+  remark: [{ required: true, message: "请输入反馈内容 ", trigger: "blur" }],
+  seqNoList: [{ required: true, message: "请选择 ", trigger: "blur" }],
+  personResponsible: [{ required: true, message: "请选择责任人", trigger: "blur" }],
+});
+
+const openReportProblemDrawer = () => {
+  getProcessInfo(processStore.scanInfo.id).then((res) => {
+    processStore.scanInfo.currentState = res.data.currentState;
+    if (res.data.currentState !== "start") {
+      ElMessage.error("当前工单状态不允许报故");
+      return;
+    } else {
+      drawerVisible.value = true;
+      breakReportInfoById(processStore.scanInfo.id).then((res) => {
+        infoData.value = res.data;
+      });
+    }
+  });
+};
+
+
+const cancelClick = () => {
+  drawerVisible.value = false;
+};
+
+const confirmClick = () => {
+  formRef.value &&
+  formRef.value.validate((valid: boolean) => {
+    if (valid) {
+      let params = {
+        processId: processStore.scanInfo.id,
+        ...formLabelAlign,
+      };
+      addProblemReport(params).then(() => {
+        ElMessage.success("反馈成功");
+        drawerVisible.value = false;
+      });
+    } else {
+      return false;
+    }
+  });
+};
+
+window.addEventListener("message", (event) => {
+  const data = JSON.parse(event.data);
+  if (data.fullUrl && data.messageKey && data.messageKey === "report_bad") {
+    formLabelAlign.fileList.push(data.fullUrl);
+  }
+});
+
+defineExpose({
+  openReportProblemDrawer,
+});
+</script>
+
+<style lang="scss" scoped>
+#drawContent {
+  width: 100%;
+  //:deep(.el-form--large.el-form--label-top .el-form-item .el-form-item__label) {
+  //  font-weight: 500;
+  //  font-size: 22px;
+  //  color: rgba(0, 0, 0, 0.9);
+  //  text-align: left;
+  //}
+}
+
+.base-info {
+  width: 100%;
+  background: #f1f3f5;
+  border-radius: 16px 16px 16px 16px;
+  padding: 0 30px;
+
+  .info-item {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    height: 40px;
+
+    .item-label {
+      font-size: 18px;
+      color: rgba(0, 0, 0, 0.6);
+    }
+
+    .item-value {
+      font-weight: 500;
+      font-size: 18px;
+      color: rgba(0, 0, 0, 0.9);
+    }
+  }
+
+  .info-item:not(:last-child) {
+    border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+  }
+}
+
+.bottom-btns {
+  display: flex;
+  justify-content: center;
+  //margin-top: 20px;
+  //margin-bottom: 20px;
+
+  .button {
+    margin-right: 20px;
+  }
+
+  .cancelBtn {
+    width: 292px;
+    height: 40px;
+    background: rgba(0, 0, 0, 0.06);
+    border-radius: 76px 76px 76px 76px;
+  }
+
+  .sureBtn {
+    width: 292px;
+    height: 40px;
+    background: #0a59f7;
+    border-radius: 76px 76px 76px 76px;
+  }
+}
+</style>

+ 2 - 2
src/views/pro-operation/report-work/index.vue

@@ -105,7 +105,7 @@
         style="display: flex; margin-bottom: 10px"
         v-if="processStore.scanInfo.outTime == true"
       >
-        <div style="width: 120px">超期原因:</div>
+        <div style="margin-top:3px;font-size:18px;">超期原因: &nbsp;</div>
 
         <el-select
           v-model="outTimeReason"
@@ -156,7 +156,7 @@ const router = useRouter();
 
 const drawerVisible = ref(false);
 const formDisabled = ref(true);
-const outTimeReason = ref("");
+const outTimeReason = ref(dictStroe.dicts.out_time_reason[0].dictValue);
 const formRef = ref<InstanceType<typeof ElForm>>();
 
 const persons = ref<

+ 9 - 1
src/views/pro-steps/components/operates.vue

@@ -14,18 +14,22 @@
 
     <ReportBreak ref="reportBreakRef" />
     <ReportWork ref="reportWorkRef" />
+    <ReportProblem ref="reportProblemRef" />
   </div>
 </template>
 
 <script lang="ts" setup>
 import ReportBreak from "@/views/pro-operation/report-break/index.vue"; // ================ 报故
 import ReportWork from "@/views/pro-operation/report-work/index.vue";
+import ReportProblem from "@/views/pro-operation/report-problem/index.vue";
 // ================ 报故
 const reportBreakRef = ref<InstanceType<typeof ReportBreak>>();
 
 // ================ 报工
 const reportWorkRef = ref<InstanceType<typeof ReportWork>>();
 
+
+const reportProblemRef = ref<InstanceType<typeof ReportProblem>>();
 const router = useRouter();
 
 const selectIndex = ref(-1);
@@ -41,7 +45,7 @@ const setIndex = (index: number) => {
       reportBreakRef.value?.openReportBreakDrawer();
       break;
     case "jiaoliao":
-      router.push({ name: "call-materiel" });
+      reportProblemRef.value?.openReportProblemDrawer();
       break;
     case "gongweishangliao":
       router.push({ name: "station-up-material" });
@@ -102,6 +106,10 @@ const stepComponents = ref([
     compentName: "报故",
     compentType: "baogu",
   },
+  {
+    compentName: "问题反馈",
+    compentType: "jiaoliao",
+  },
 ]);
 </script>
 

+ 20 - 2
src/views/pro-steps/components/zhiyin.vue

@@ -2,7 +2,7 @@
   <div class="body1" id="body1">
     <div class="left">
       <div style="margin-bottom: 20px">
-        <el-select v-model="selectBraze" placeholder="请选择钎焊方式" @change="handleSelectChange">
+        <el-select v-model="selectBraze" placeholder="请选择钎焊方式" @change="handleSelectChange" style="width:60%">
           <el-option
             v-for="item in brazeOption"
             :key="item.id"
@@ -11,6 +11,11 @@
           >
           </el-option>
         </el-select>
+        <el-button
+            style="margin-left: 10px;"
+            type="success"
+            @click="finishAll"
+        >一键完成</el-button>
       </div>
 
       <el-table
@@ -68,7 +73,8 @@
 
 <script setup>
 import { useProcessStore } from "@/store";
-import {operationBrazeQuery, processBrazePage1, processBrazeUpdate} from '@/api/braze'
+import {operationBrazeQuery, processBrazePage1, processBrazeUpdate,processBrazeCompleteAll} from '@/api/braze'
+import {ElMessageBox} from "element-plus";
 const proStore = useProcessStore();
 const selectBraze = ref([])
 const brazeOption = ref([])
@@ -100,6 +106,18 @@ const handleSelectChange = (brazeId) => {
     tableData.value = res.data.records
   })
 }
+const finishAll = async() =>{
+  ElMessageBox.confirm("确定要完成当前页所有吗?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning",
+  }).then(async () => {
+    const params = {processId: proStore.scanInfo.id,brazeId: selectBraze.value}
+    await  processBrazeCompleteAll(params)
+    ElMessage.success('操作成功');
+    handleSelectChange(selectBraze.value)
+  })
+}
 const toFinish = async (row) => {
   const data = {
     id: row.id,

+ 11 - 1
src/views/process/components/steps.vue

@@ -12,7 +12,7 @@
             item.exists == true
               ? selectStepIndex == index
                 ? 'stepBox stepBoxHover'
-                : 'stepBox'
+                : item.canDo === 0 ? 'stepBox' : 'stepBox1'
               : 'stepBox stepExistsHover'
           "
         >
@@ -207,6 +207,16 @@ onBeforeUnmount(() => {
   background-color: white;
   box-shadow: 0px 1px 1px 1px #00000025;
 }
+.stepBox1 {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 88px;
+  border-radius: 44px;
+  background-color: $select-activehover;
+  box-shadow: 0px 1px 1px 1px #00000025;
+}
+
 
 .stepBoxHover {
   box-shadow: 0px 0px 0px 0px;

+ 6 - 1
src/views/process/components/transferNum.vue

@@ -33,7 +33,7 @@
                 :class="
                   index == selectSeqIndex
                     ? 'describeText active'
-                    : 'describeText'
+                    : item.canDo == 0 ? 'describeText' : 'describeText active1'
                 "
                 @dblclick="fz(index)"
                 >{{ item.seqNo }}</span
@@ -182,6 +182,11 @@ onMounted(() => {
   animation-name: cardHover;
   animation-duration: 0.5s;
 }
+.active1 {
+  color: $select-activehover;
+  animation-name: cardHover;
+  animation-duration: 0.5s;
+}
 
 .scrollbar {
   height: calc(100vh - 210px);

+ 18 - 10
src/views/process/orders.vue

@@ -24,7 +24,7 @@
       <Order
         v-for="(item, index) in ordersDataArray"
         :key="index"
-        @click="setSlectIndex(index)"
+        @click="setSlectIndex(index,item)"
         :hoverStatus="index == selectIndex ? true : false"
         :item="item"
       />
@@ -43,7 +43,7 @@
 import Order from "@/views/process/components/order.vue";
 import { useProcessStore } from "@/store";
 import { useDictionaryStore } from "@/store";
-import { getOrders } from "@/api/process";
+import { getOrders,getOrderDetails } from "@/api/process";
 import { emitter, EventsNames } from "@/utils/common";
 import { useCommonStoreHook } from "@/store";
 const dictS = useDictionaryStore();
@@ -73,6 +73,13 @@ const getOrdersData = async () => {
     ordersQuery.value.totalPages = data.totalPages;
   }
 };
+
+const getOps = async (item,index) => {
+  const { code, data } = await getOrderDetails({workOrderCode: item.workOrderCode});
+  if (code == "200") {
+    ordersDataArray.value[index].ops = data
+  }
+};
 //重新刷新当前页码数据
 const resetOrdersDataArray = async () => {
   ordersDataArray.value = [];
@@ -97,22 +104,23 @@ const resetOrdersDataArray = async () => {
 const activeName = ref("false");
 //这里是存放控制当前选择工序的index
 const selectIndex = ref(null);
-const setSlectIndex = (index: number) => {
+const setSlectIndex = async (index: number, item) => {
   if (selectIndex.value == index) return;
   if (index == null) {
     selectIndex.value = null;
     selectedOderStatus.value = false;
     return;
   }
+  await getOps(item, index)
   selectIndex.value = index;
   store.odersData.productLineId =
-    ordersDataArray.value[selectIndex.value].productLineId;
+      ordersDataArray.value[selectIndex.value].productLineId;
   store.odersData.workOrderCode =
-    ordersDataArray.value[selectIndex.value].workOrderCode;
+      ordersDataArray.value[selectIndex.value].workOrderCode;
   store.processInfo.materialName =
-    ordersDataArray.value[selectIndex.value].materialName;
+      ordersDataArray.value[selectIndex.value].materialName;
   store.processInfo.materialModel =
-    ordersDataArray.value[selectIndex.value].materialModel;
+      ordersDataArray.value[selectIndex.value].materialModel;
   store.odersData.operationId = "";
   store.processInfo.operationCode = "";
   store.processInfo.operationName = "";
@@ -121,8 +129,8 @@ const setSlectIndex = (index: number) => {
   selectSeqIndex.value = null;
   emit("getindex", selectIndex.value);
 };
-const handleClick = (tab: TabsPaneContext, event: Event) => {
-  setSlectIndex(null);
+const handleClick = async (tab: TabsPaneContext, event: Event) => {
+  await setSlectIndex(null,null);
   store.odersData.productLineId = "";
   store.odersData.workOrderCode = "";
   store.processInfo.materialName = "";
@@ -159,7 +167,7 @@ onMounted(() => {
   getOrdersData();
   emitter.on(EventsNames.PROCESS_REDER, () => {
     resetOrdersDataArray();
-    setSlectIndex(null);
+    setSlectIndex(null,null);
   });
 });
 </script>

+ 6 - 0
src/views/traceability/components/fault.vue

@@ -6,6 +6,11 @@
           {{ dictS.getLableByValue("escalation_fault_state", scope.row.state) }}
         </template>
       </el-table-column>
+      <el-table-column prop="type" label="类型" >
+        <template #default="scope">
+          {{ scope.row.type === 0 ? "报故" : "问题反馈"}}
+        </template>
+      </el-table-column>
       <el-table-column prop="creator" label="报故人" />
       <el-table-column prop="stationName" label="报故工位" />
       <el-table-column prop="created" label="报故时间" />
@@ -57,6 +62,7 @@ const getPagination = async () => {
     pageNo: page.value,
     pageSize: limit.value,
     seqNo: store.useSeqNo,
+    type: 0,
     workOrderCode: store.odersData.workOrderCode,
   });
   total.value = data.totalCount;