liuhairui 3 недель назад
Родитель
Сommit
318dfd6a1a

+ 180 - 41
src/view/SalaryManage/ProcessProduction.vue

@@ -87,6 +87,31 @@
           show-summary
           show-summary
           show-overflow-tooltip
           show-overflow-tooltip
         >
         >
+          <el-table-column label="小组" prop="小组" width="100" align="center">
+            <template #header>
+              <div class="process-production-col-header">
+                <span>小组</span>
+                <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+                  <template #reference>
+                    <span class="gy-detail-filter-btn" :class="{ 'is-active': isGroupFilterActive }" @click.stop>
+                      <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+                    </span>
+                  </template>
+                  <div class="gy-detail-filter-panel">
+                    <div class="gy-detail-filter-options">
+                      <el-checkbox-group v-model="groupFilter">
+                        <el-checkbox v-for="item in groupFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+                      </el-checkbox-group>
+                    </div>
+                    <div class="gy-detail-filter-actions">
+                      <span class="gy-detail-filter-link" @click.stop="clearGroupFilter">取消全选</span>
+                      <span class="gy-detail-filter-link" @click.stop="selectAllGroupFilter">全选</span>
+                    </div>
+                  </div>
+                </el-popover>
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column label="工序编号" prop="工序号" width="100" align="center"  />
           <el-table-column label="工序编号" prop="工序号" width="100" align="center"  />
           <el-table-column label="工序名称" prop="工序名称" min-width="280" align="left"  show-overflow-tooltip />
           <el-table-column label="工序名称" prop="工序名称" min-width="280" align="left"  show-overflow-tooltip />
           <el-table-column label="员工姓名" prop="员工姓名" width="120" align="left">
           <el-table-column label="员工姓名" prop="员工姓名" width="120" align="left">
@@ -118,8 +143,56 @@
           <el-table-column v-if="!hideAmountColumns" label="工分" prop="工分" width="100" align="center" />
           <el-table-column v-if="!hideAmountColumns" label="工分" prop="工分" width="100" align="center" />
           <el-table-column v-if="!hideAmountColumns" label="工时" prop="工时" width="100" align="center" />
           <el-table-column v-if="!hideAmountColumns" label="工时" prop="工时" width="100" align="center" />
           <el-table-column v-if="!hideAmountColumns" label="工资" prop="工资" width="100" align="center" />
           <el-table-column v-if="!hideAmountColumns" label="工资" prop="工资" width="100" align="center" />
-          <el-table-column label="开工日期" prop="开工日期" width="110" align="center" />
-          <el-table-column label="完工日期" prop="完工日期" width="110" align="center" />
+          <el-table-column label="开工日期" prop="开工日期" width="110" align="center">
+            <template #header>
+              <div class="process-production-col-header">
+                <span>开工日期</span>
+                <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+                  <template #reference>
+                    <span class="gy-detail-filter-btn" :class="{ 'is-active': isStartDateFilterActive }" @click.stop>
+                      <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+                    </span>
+                  </template>
+                  <div class="gy-detail-filter-panel">
+                    <div class="gy-detail-filter-options">
+                      <el-checkbox-group v-model="startDateFilter">
+                        <el-checkbox v-for="item in startDateFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+                      </el-checkbox-group>
+                    </div>
+                    <div class="gy-detail-filter-actions">
+                      <span class="gy-detail-filter-link" @click.stop="clearStartDateFilter">取消全选</span>
+                      <span class="gy-detail-filter-link" @click.stop="selectAllStartDateFilter">全选</span>
+                    </div>
+                  </div>
+                </el-popover>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="完工日期" prop="完工日期" width="110" align="center">
+            <template #header>
+              <div class="process-production-col-header">
+                <span>完工日期</span>
+                <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
+                  <template #reference>
+                    <span class="gy-detail-filter-btn" :class="{ 'is-active': isFinishDateFilterActive }" @click.stop>
+                      <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
+                    </span>
+                  </template>
+                  <div class="gy-detail-filter-panel">
+                    <div class="gy-detail-filter-options">
+                      <el-checkbox-group v-model="finishDateFilter">
+                        <el-checkbox v-for="item in finishDateFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
+                      </el-checkbox-group>
+                    </div>
+                    <div class="gy-detail-filter-actions">
+                      <span class="gy-detail-filter-link" @click.stop="clearFinishDateFilter">取消全选</span>
+                      <span class="gy-detail-filter-link" @click.stop="selectAllFinishDateFilter">全选</span>
+                    </div>
+                  </div>
+                </el-popover>
+              </div>
+            </template>
+          </el-table-column>
           <template #empty>
           <template #empty>
             <el-empty
             <el-empty
               v-if="!loading"
               v-if="!loading"
@@ -222,7 +295,17 @@ const isScalarSummaryValue = (val) =>
   val == null || (typeof val !== 'object' && typeof val !== 'function')
   val == null || (typeof val !== 'object' && typeof val !== 'function')
 
 
 const processListRaw = ref([])
 const processListRaw = ref([])
-const staffNameFilter = ref([])
+
+const normalizeTableDate = (val) => {
+  const s = String(val ?? '').trim()
+  if (!s) return ''
+  return s.replace(/\s+\d{2}:\d{2}(:\d{2})?$/, '').split('T')[0].split(' ')[0]
+}
+
+const pickGroupFromStaff = (staff) =>
+  String(
+    staff?.小组 ?? staff?.group ?? staff?.['设备编组'] ?? staff?.['设备编号'] ?? staff?.team_name ?? ''
+  ).trim()
 
 
 const flattenProcessList = (processList = []) => {
 const flattenProcessList = (processList = []) => {
   const rows = []
   const rows = []
@@ -231,6 +314,7 @@ const flattenProcessList = (processList = []) => {
     if (!staffs.length) {
     if (!staffs.length) {
       rows.push({
       rows.push({
         rowKey: `${proc.工序号}-empty`,
         rowKey: `${proc.工序号}-empty`,
+        小组: '',
         工序号: proc.工序号 ?? '',
         工序号: proc.工序号 ?? '',
         工序名称: proc.工序名称 ?? '',
         工序名称: proc.工序名称 ?? '',
         员工姓名: '',
         员工姓名: '',
@@ -247,6 +331,7 @@ const flattenProcessList = (processList = []) => {
     staffs.forEach((staff, index) => {
     staffs.forEach((staff, index) => {
       rows.push({
       rows.push({
         rowKey: `${proc.工序号}-${index}-${staff.员工姓名 || ''}`,
         rowKey: `${proc.工序号}-${index}-${staff.员工姓名 || ''}`,
+        小组: pickGroupFromStaff(staff),
         工序号: proc.工序号 ?? '',
         工序号: proc.工序号 ?? '',
         工序名称: proc.工序名称 ?? '',
         工序名称: proc.工序名称 ?? '',
         员工姓名: staff.员工姓名 ?? '',
         员工姓名: staff.员工姓名 ?? '',
@@ -265,58 +350,105 @@ const flattenProcessList = (processList = []) => {
 
 
 const flatTableRows = computed(() => flattenProcessList(processListRaw.value || []))
 const flatTableRows = computed(() => flattenProcessList(processListRaw.value || []))
 
 
-const staffNameFilterOptions = computed(() => {
-  const names = [...new Set(
-    flatTableRows.value
-      .map(row => String(row.员工姓名 || '').trim())
-      .filter(Boolean)
-  )]
-  return names.map(name => ({ text: name, value: name }))
-})
-
-const isStaffNameFilterActive = computed(() => {
-  const allValues = staffNameFilterOptions.value.map(item => item.value)
-  const selected = staffNameFilter.value
-  if (!allValues.length) return false
-  return selected.length < allValues.length
-})
-
-const selectAllStaffNameFilter = () => {
-  staffNameFilter.value = staffNameFilterOptions.value.map(item => item.value)
-}
-
-const clearStaffNameFilter = () => {
-  staffNameFilter.value = []
-}
-
-const syncStaffNameFilterAfterDataChange = () => {
-  const allValues = staffNameFilterOptions.value.map(item => item.value)
-  const selected = staffNameFilter.value
+const syncCheckboxFilterAfterDataChange = (options, selectedRef) => {
+  const allValues = options.map((item) => item.value)
+  const selected = selectedRef.value
   if (!selected.length) {
   if (!selected.length) {
-    staffNameFilter.value = [...allValues]
+    selectedRef.value = [...allValues]
     return
     return
   }
   }
-  const wasAllSelected = allValues.length > 0 && allValues.every(v => selected.includes(v))
+  const wasAllSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v))
   if (wasAllSelected) {
   if (wasAllSelected) {
-    staffNameFilter.value = [...allValues]
+    selectedRef.value = [...allValues]
     return
     return
   }
   }
-  staffNameFilter.value = selected.filter(v => allValues.includes(v))
+  selectedRef.value = selected.filter((v) => allValues.includes(v))
 }
 }
 
 
-const applyStaffNameFilter = (rows) => {
-  const options = staffNameFilterOptions.value
-  const selected = staffNameFilter.value
+const applyCheckboxColumnFilter = (rows, options, selected, getValue) => {
   if (!selected.length) return []
   if (!selected.length) return []
   if (!options.length || selected.length >= options.length) return rows
   if (!options.length || selected.length >= options.length) return rows
   const set = new Set(selected)
   const set = new Set(selected)
   return rows.filter((row) => {
   return rows.filter((row) => {
-    const name = String(row.员工姓名 || '').trim()
-    if (!name) return true
-    return set.has(name)
+    const val = getValue(row)
+    if (!val) return true
+    return set.has(val)
+  })
+}
+
+function createColumnFilter(getValue, { sortDesc = false } = {}) {
+  const selected = ref([])
+  const options = computed(() => {
+    const values = [...new Set(flatTableRows.value.map(getValue).filter(Boolean))]
+    if (sortDesc) values.sort((a, b) => b.localeCompare(a))
+    else values.sort((a, b) => a.localeCompare(b, 'zh-CN'))
+    return values.map((v) => ({ text: v, value: v }))
+  })
+  const isActive = computed(() => {
+    const allValues = options.value.map((item) => item.value)
+    if (!allValues.length) return false
+    return selected.value.length < allValues.length
   })
   })
+  return {
+    selected,
+    options,
+    isActive,
+    selectAll: () => {
+      selected.value = options.value.map((item) => item.value)
+    },
+    clear: () => {
+      selected.value = []
+    },
+    sync: () => syncCheckboxFilterAfterDataChange(options.value, selected),
+    apply: (rows) => applyCheckboxColumnFilter(rows, options.value, selected.value, getValue),
+  }
 }
 }
 
 
+const groupFilterCtrl = createColumnFilter((row) => String(row.小组 || '').trim())
+const staffNameFilterCtrl = createColumnFilter((row) => String(row.员工姓名 || '').trim())
+const startDateFilterCtrl = createColumnFilter((row) => normalizeTableDate(row.开工日期), { sortDesc: true })
+const finishDateFilterCtrl = createColumnFilter((row) => normalizeTableDate(row.完工日期), { sortDesc: true })
+
+const {
+  selected: groupFilter,
+  options: groupFilterOptions,
+  isActive: isGroupFilterActive,
+  selectAll: selectAllGroupFilter,
+  clear: clearGroupFilter,
+  sync: syncGroupFilterAfterDataChange,
+  apply: applyGroupFilter,
+} = groupFilterCtrl
+
+const {
+  selected: staffNameFilter,
+  options: staffNameFilterOptions,
+  isActive: isStaffNameFilterActive,
+  selectAll: selectAllStaffNameFilter,
+  clear: clearStaffNameFilter,
+  sync: syncStaffNameFilterAfterDataChange,
+  apply: applyStaffNameFilter,
+} = staffNameFilterCtrl
+
+const {
+  selected: startDateFilter,
+  options: startDateFilterOptions,
+  isActive: isStartDateFilterActive,
+  selectAll: selectAllStartDateFilter,
+  clear: clearStartDateFilter,
+  sync: syncStartDateFilterAfterDataChange,
+  apply: applyStartDateFilter,
+} = startDateFilterCtrl
+
+const {
+  selected: finishDateFilter,
+  options: finishDateFilterOptions,
+  isActive: isFinishDateFilterActive,
+  selectAll: selectAllFinishDateFilter,
+  clear: clearFinishDateFilter,
+  sync: syncFinishDateFilterAfterDataChange,
+  apply: applyFinishDateFilter,
+} = finishDateFilterCtrl
+
 const recomputeProcessRowSpan = (rows) => {
 const recomputeProcessRowSpan = (rows) => {
   const result = []
   const result = []
   let i = 0
   let i = 0
@@ -337,12 +469,19 @@ const recomputeProcessRowSpan = (rows) => {
 }
 }
 
 
 const displayTableData = computed(() => {
 const displayTableData = computed(() => {
-  const filtered = applyStaffNameFilter(flatTableRows.value)
+  let filtered = flatTableRows.value
+  filtered = applyGroupFilter(filtered)
+  filtered = applyStaffNameFilter(filtered)
+  filtered = applyStartDateFilter(filtered)
+  filtered = applyFinishDateFilter(filtered)
   return recomputeProcessRowSpan(filtered)
   return recomputeProcessRowSpan(filtered)
 })
 })
 
 
 watch(flatTableRows, () => {
 watch(flatTableRows, () => {
+  syncGroupFilterAfterDataChange()
   syncStaffNameFilterAfterDataChange()
   syncStaffNameFilterAfterDataChange()
+  syncStartDateFilterAfterDataChange()
+  syncFinishDateFilterAfterDataChange()
 })
 })
 
 
 const tableSpanMethod = ({ row, column }) => {
 const tableSpanMethod = ({ row, column }) => {

Разница между файлами не показана из-за своего большого размера
+ 632 - 139
src/view/SalaryManage/SalaryList.vue


+ 118 - 0
src/view/SalaryManage/TableColumnFilterHeader.vue

@@ -0,0 +1,118 @@
+<template>
+  <div class="table-col-filter-header">
+    <span>{{ label }}</span>
+    <el-popover
+      trigger="click"
+      placement="bottom-start"
+      :width="180"
+      :teleported="true"
+      :z-index="10050"
+      append-to-body
+      popper-class="table-col-filter-popper"
+    >
+      <template #reference>
+        <span class="table-col-filter-btn" :class="{ 'is-active': active }" @click.stop>
+          <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true">
+            <path
+              fill="currentColor"
+              d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"
+            />
+          </svg>
+        </span>
+      </template>
+      <div class="table-col-filter-panel">
+        <div class="table-col-filter-options">
+          <el-checkbox-group :model-value="modelValue" @update:model-value="$emit('update:modelValue', $event)">
+            <el-checkbox v-for="item in options" :key="item.value" :label="item.value">
+              {{ item.text }}
+            </el-checkbox>
+          </el-checkbox-group>
+        </div>
+        <div class="table-col-filter-actions">
+          <span class="table-col-filter-link" @click.stop="$emit('clear')">取消全选</span>
+          <span class="table-col-filter-link" @click.stop="$emit('select-all')">全选</span>
+        </div>
+      </div>
+    </el-popover>
+  </div>
+</template>
+
+<script setup>
+defineProps({
+  label: { type: String, required: true },
+  modelValue: { type: Array, default: () => [] },
+  options: { type: Array, default: () => [] },
+  active: { type: Boolean, default: false },
+})
+
+defineEmits(['update:modelValue', 'select-all', 'clear'])
+</script>
+
+<style scoped>
+.table-col-filter-header {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  gap: 4px;
+}
+
+.table-col-filter-btn {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  width: 22px;
+  height: 22px;
+  cursor: pointer;
+  color: #909399;
+  border-radius: 2px;
+}
+
+.table-col-filter-btn:hover,
+.table-col-filter-btn.is-active {
+  color: var(--el-color-primary);
+  background: #ecf5ff;
+}
+
+.table-col-filter-options {
+  max-height: 220px;
+  overflow-x: hidden;
+  overflow-y: auto;
+  margin-bottom: 4px;
+}
+
+.table-col-filter-panel :deep(.el-checkbox) {
+  display: flex;
+  margin-right: 0;
+  margin-bottom: 6px;
+}
+
+.table-col-filter-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-top: 4px;
+  padding-top: 8px;
+  border-top: 1px solid #ebeef5;
+}
+
+.table-col-filter-link {
+  color: var(--el-color-primary);
+  font-size: 12px;
+  line-height: 1;
+  cursor: pointer;
+  user-select: none;
+  padding: 4px 2px;
+}
+
+.table-col-filter-link:hover {
+  opacity: 0.85;
+}
+</style>
+
+<style>
+.table-col-filter-popper {
+  z-index: 10050 !important;
+  pointer-events: auto;
+  padding: 8px 10px !important;
+}
+</style>

+ 5 - 3
src/view/performance/MachineElectricity.vue

@@ -10,7 +10,7 @@
       </layout>
       </layout>
 
 
         <layout>
         <layout>
-          <layout-sider :resize-directions="['right']" :width="270" style="margin-right: 10px;">
+          <layout-sider :resize-directions="['right']" :width="290" style="margin-right: 10px;">
             <div class="JKWTree-tree" style="height: 200px">
             <div class="JKWTree-tree" style="height: 200px">
               <h3>设备电量管理</h3>
               <h3>设备电量管理</h3>
               <el-tree :data="treeData"  :props="defaultProps" class="treecolor" @node-click="handleNodeClick" @node-expand="handleNodeExpand">
               <el-tree :data="treeData"  :props="defaultProps" class="treecolor" @node-click="handleNodeClick" @node-expand="handleNodeExpand">
@@ -135,8 +135,10 @@ const getTree = async () => {
         yearGroups[monthItem.year].push(monthItem);
         yearGroups[monthItem.year].push(monthItem);
       });
       });
       
       
-      // 生成树形数据
-      treeData.value = Object.keys(yearGroups).map(year => {
+      // 生成树形数据(年份降序,最新年在最上面)
+      treeData.value = Object.keys(yearGroups)
+        .sort((a, b) => Number(b) - Number(a))
+        .map(year => {
         const yearNode = {
         const yearNode = {
           label: `${year}年`,
           label: `${year}年`,
           children: yearGroups[year].map(monthItem => {
           children: yearGroups[year].map(monthItem => {

+ 112 - 20
src/view/performance/Suborderdetailspage.vue

@@ -2,35 +2,50 @@
 <template>
 <template>
 	<p style="height: 40px;font-size: 18px;margin: 0px 0px 0px 10px;">
 	<p style="height: 40px;font-size: 18px;margin: 0px 0px 0px 10px;">
 		<span style="color: red;">进行模糊搜索 </span>
 		<span style="color: red;">进行模糊搜索 </span>
-		<span>订单编号生产款号</span>
+		<span>订单编号生产款号</span>
 		<span>选择相关</span>
 		<span>选择相关</span>
 		<span style="color: red;"> “子订单编号” </span>
 		<span style="color: red;"> “子订单编号” </span>
-		<span>“查看工序报工信息”</span>
+		<span>“查看生产工序产量报工信息”</span>
 	</p>
 	</p>
 	   <div class="order-info" style="margin: 10px 0px 0px 10px;">
 	   <div class="order-info" style="margin: 10px 0px 0px 10px;">
 		   <el-text style="font-size: 24px;">订单编号:&nbsp;</el-text>
 		   <el-text style="font-size: 24px;">订单编号:&nbsp;</el-text>
-            <el-select style="width: 10%; height: 40px;"
+            <el-select
+                style="width: 11%; height: 40px;"
                 v-model="orderform.订单编号"
                 v-model="orderform.订单编号"
                 placeholder="请输入或选择订单编号"
                 placeholder="请输入或选择订单编号"
                 filterable
                 filterable
 				id="searchInput"
 				id="searchInput"
                 clearable
                 clearable
                 remote
                 remote
+                popper-class="suborder-order-search-dropdown"
                 :remote-method="searchOrder"
                 :remote-method="searchOrder"
                 @change="handleOrderSelect"
                 @change="handleOrderSelect"
                 >
                 >
+                <template #header>
+                  <div class="order-search-suggest-header">
+                    <span>订单编号</span>
+                    <span>生产款号</span>
+                    <span>款式</span>
+                  </div>
+                </template>
                 <el-option
                 <el-option
-                v-for="item in orderOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-                />
+                  v-for="item in orderOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                  <div class="order-search-suggest-row">
+                    <span class="order-search-suggest-no" :title="item.订单编号">{{ item.订单编号 }}</span>
+                    <span class="order-search-suggest-style" :title="item.生产款号">{{ item.生产款号 }}</span>
+                    <span class="order-search-suggest-name" :title="item.款式">{{ item.款式 }}</span>
+                  </div>
+                </el-option>
             </el-select>
             </el-select>
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   &nbsp;&nbsp;&nbsp;&nbsp;
             <el-text style="font-size: 24px;">子订单编号:&nbsp;</el-text>
             <el-text style="font-size: 24px;">子订单编号:&nbsp;</el-text>
                 <el-select
                 <el-select
                 v-model="orderform.子订单编号"
                 v-model="orderform.子订单编号"
-                style="width: 10%; height: 40px;"
+                style="width: 15%; height: 40px;"
                 placeholder="请选择子订单编号"
                 placeholder="请选择子订单编号"
                 :disabled="!orderform.订单编号"
                 :disabled="!orderform.订单编号"
                 @change="handleOrderSelect2"
                 @change="handleOrderSelect2"
@@ -44,10 +59,10 @@
                 </el-select>
                 </el-select>
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   <el-text style="font-size: 24px;">客户编号:&nbsp;</el-text>
 		   <el-text style="font-size: 24px;">客户编号:&nbsp;</el-text>
-		   <el-input v-model="orderform['客户编号']" disabled  style="width: 5%; height: 40px;" />
+		   <el-input v-model="orderform['客户编号']" disabled  style="width: 7%; height: 40px;" />
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   &nbsp;&nbsp;&nbsp;&nbsp;
-		   <el-text style="font-size: 24px;">款号:&nbsp;</el-text>
-		   <el-input v-model="orderform['款号']" disabled  style="width: 10%; height: 40px;" />
+		   <el-text style="font-size: 24px;">po款号:&nbsp;</el-text>
+		   <el-input v-model="orderform['款号']" disabled  style="width: 14%; height: 40px;" />
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   &nbsp;&nbsp;&nbsp;&nbsp;
 		   <el-text style="font-size: 24px;">款式:&nbsp;</el-text>
 		   <el-text style="font-size: 24px;">款式:&nbsp;</el-text>
 		   <el-input v-model="orderform['款式']" disabled  style="width: 10%; height: 40px;" />
 		   <el-input v-model="orderform['款式']" disabled  style="width: 10%; height: 40px;" />
@@ -171,20 +186,41 @@ const orderform = ref({
 
 
   const orderOptions = ref([]);     // 订单编号选项
   const orderOptions = ref([]);     // 订单编号选项
   const subOrderOptions = ref([]); // 子订单编号选项
   const subOrderOptions = ref([]); // 子订单编号选项
+
+/** 子订单号如 DC2605017-0800 转为订单号 DC2605017 */
+const normalizeOrderSearchInput = (val) => {
+  const s = String(val ?? '').trim()
+  if (!s) return ''
+  const idx = s.indexOf('-')
+  return idx >= 0 ? s.slice(0, idx).trim() : s
+}
+
+const extractOrderNoFromSelectValue = (orderNo) => {
+  const main = String(orderNo ?? '').split('---')[0].trim()
+  return normalizeOrderSearchInput(main)
+}
+
 // 搜索订单(订单编号)
 // 搜索订单(订单编号)
 const searchOrder = async (query) => {
 const searchOrder = async (query) => {
-  if (!query.trim()) {
+  const searchKey = normalizeOrderSearchInput(query)
+  if (!searchKey) {
     orderOptions.value = [];
     orderOptions.value = [];
     return;
     return;
   }
   }
   
   
   try {
   try {
-    const res = await Apiorder({ search: query });
+    const res = await Apiorder({ search: searchKey });
     if (res.code === 0 && res.data?.list) {
     if (res.code === 0 && res.data?.list) {
-      orderOptions.value = res.data.list.map(item => ({
-        value: `${item.订单编号}---${item.生产款号}`, 
-        label: `${item.订单编号}---${item.生产款号}`,
-      }));
+      orderOptions.value = res.data.list.map(item => {
+        const orderNo = normalizeOrderSearchInput(item.订单编号)
+        return {
+          value: `${orderNo}---${item.生产款号}`,
+          label: `${orderNo}---${item.生产款号}`,
+          订单编号: orderNo,
+          生产款号: item.生产款号 || '',
+          款式: item.款式 || '',
+        }
+      });
     
     
     }
     }
   } catch (error) {
   } catch (error) {
@@ -201,7 +237,8 @@ const handleOrderSelect = async (orderNo) => {
     orderform.value.子订单编号 = '';
     orderform.value.子订单编号 = '';
     return;
     return;
   }
   }
-  const SubOrder_list = await SubOrderProgress({order:orderNo.split('---')[0]});
+  const pureOrderNo = extractOrderNoFromSelectValue(orderNo)
+  const SubOrder_list = await SubOrderProgress({order: pureOrderNo});
   console.log(SubOrder_list)
   console.log(SubOrder_list)
   //订单编号
   //订单编号
   order_progressList.value = SubOrder_list.data.list.map(item => ({
   order_progressList.value = SubOrder_list.data.list.map(item => ({
@@ -220,7 +257,7 @@ const handleOrderSelect = async (orderNo) => {
  
  
   try {
   try {
     // 调用子订单接口
     // 调用子订单接口
-    const res = await Apiorderids({ order:orderNo.split('---')[0]}); // 假设接口需要传订单编号
+    const res = await Apiorderids({ order: pureOrderNo }); // 假设接口需要传订单编号
     if (res.code === 0 && res.data?.list) {
     if (res.code === 0 && res.data?.list) {
       subOrderOptions.value = res.data.list.map(item => ({
       subOrderOptions.value = res.data.list.map(item => ({
         value: item.子订单编号,
         value: item.子订单编号,
@@ -476,4 +513,59 @@ defineExpose({open})
   font-size: 20px !important;
   font-size: 20px !important;
   font-weight: bold;
   font-weight: bold;
 }
 }
+</style>
+
+<style>
+.suborder-order-search-dropdown {
+  min-width: 520px !important;
+}
+
+.suborder-order-search-dropdown .order-search-suggest-header,
+.suborder-order-search-dropdown .order-search-suggest-row {
+  display: grid;
+  grid-template-columns: 118px minmax(160px, 1fr) minmax(100px, 140px);
+  gap: 10px;
+  align-items: center;
+  line-height: 1.4;
+  font-size: 13px;
+  box-sizing: border-box;
+}
+
+.suborder-order-search-dropdown .order-search-suggest-header {
+  padding: 8px 12px 6px;
+  font-weight: 600;
+  color: #909399;
+  font-size: 12px;
+  border-bottom: 1px solid #ebeef5;
+  background: #fafafa;
+}
+
+.suborder-order-search-dropdown .el-select-dropdown__header {
+  padding: 0;
+  border-bottom: none;
+}
+
+.suborder-order-search-dropdown .el-select-dropdown__item {
+  height: auto;
+  line-height: 1.4;
+  padding: 8px 12px;
+}
+
+.suborder-order-search-dropdown .order-search-suggest-row {
+  width: 100%;
+}
+
+.suborder-order-search-dropdown .order-search-suggest-no {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.suborder-order-search-dropdown .order-search-suggest-style,
+.suborder-order-search-dropdown .order-search-suggest-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  color: #606266;
+}
 </style>
 </style>

+ 36 - 34
src/view/performance/WorkScoreReporting/gongfenbaogong.vue

@@ -35,7 +35,7 @@
                   </el-table>
                   </el-table>
                 </div>
                 </div>
                 <div class="gongfen-order-actions">
                 <div class="gongfen-order-actions">
-                  <el-button type="success" icon="document" class="gongfen-work-score-btn" :disabled="!currentOrderNo" @click="openWorkScoreDialog">工分报工</el-button>
+                  <el-button type="success" icon="document" class="gongfen-work-score-btn" :disabled="!currentOrderNo" :loading="loadingProcess && !workScoreDialogVisible" @click="openWorkScoreDialog">工分报工</el-button>
                 </div>
                 </div>
               </div>
               </div>
             
             
@@ -64,7 +64,9 @@
                           show-overflow-tooltip
                           show-overflow-tooltip
                           @row-click="tableRowClick"
                           @row-click="tableRowClick"
                         >
                         >
-                                  <el-table-column align="center" label="工序编号" prop="process_code" :width="100" />
+                        <el-table-column align="center" label="订单编号" prop="work_order" :width="100" />
+                        <el-table-column align="center" label="生产款号" prop="生产款号" :width="120" />
+                        <el-table-column align="center" label="工序编号" prop="process_code" :width="90" />
                                   <el-table-column align="left" label="工序名称" prop="process_name" min-width="200" show-overflow-tooltip />
                                   <el-table-column align="left" label="工序名称" prop="process_name" min-width="200" show-overflow-tooltip />
                                   <el-table-column align="center" label="员工姓名" prop="staff_name" :width="120">
                                   <el-table-column align="center" label="员工姓名" prop="staff_name" :width="120">
                                     <template #header>
                                     <template #header>
@@ -91,8 +93,8 @@
                                       </div>
                                       </div>
                                     </template>
                                     </template>
                                   </el-table-column>
                                   </el-table-column>
-                                  <el-table-column align="center" label="完工数量" prop="number" :width="100" />
-                                  <el-table-column align="center" label="组别" prop="sys_id" :width="120" show-overflow-tooltip />
+                                  <el-table-column align="center" label="完工数量" prop="number" :width="90" />
+                                  <el-table-column align="center" label="组别" prop="sys_id" :width="90" show-overflow-tooltip />
                                   <el-table-column align="center" label="报工时间" prop="sys_rq" :width="180" show-overflow-tooltip />
                                   <el-table-column align="center" label="报工时间" prop="sys_rq" :width="180" show-overflow-tooltip />
                                   <el-table-column align="center" label="操作" :width="100" fixed="right">
                                   <el-table-column align="center" label="操作" :width="100" fixed="right">
                                     <template #default="scope">
                                     <template #default="scope">
@@ -841,9 +843,11 @@ const openWorkScoreDialog = async () => {
   }
   }
 
 
   resetWorkScoreDialogState()
   resetWorkScoreDialogState()
-  workScoreDialogVisible.value = true;
-  await loadProcessParts();
-  refreshProcessTableLayout();
+  const hasData = await loadProcessParts()
+  if (!hasData) return
+
+  workScoreDialogVisible.value = true
+  refreshProcessTableLayout()
 };
 };
 
 
 const loadOrderAttachments = async (orderNo) => {
 const loadOrderAttachments = async (orderNo) => {
@@ -861,46 +865,34 @@ const loadOrderAttachments = async (orderNo) => {
   }
   }
 };
 };
 
 
-//加载工艺部件数据
+//加载工艺部件数据;有数据返回 true,无数据或失败返回 false(仅提示,不弹窗)
 const loadProcessParts = async () => {
 const loadProcessParts = async () => {
   loadingProcess.value = true;
   loadingProcess.value = true;
   try {
   try {
-    // 调用GetOrderProcess接口
     const response = await GetOrderProcess({
     const response = await GetOrderProcess({
       workorder: getActiveOrderNo(),
       workorder: getActiveOrderNo(),
       majorprocess: add_formData['工序']
       majorprocess: add_formData['工序']
     });
     });
-    
+
     if (response.code === 0) {
     if (response.code === 0) {
       const parts = extractListFromResponse(response.data)
       const parts = extractListFromResponse(response.data)
+      if (!parts.length) {
+        warningres('技术部未上传工序明细资料数据')
+        return false
+      }
       processParts.value = parts
       processParts.value = parts
       partQuantities.value = new Array(parts.length).fill('')
       partQuantities.value = new Array(parts.length).fill('')
       partProcesses.value = Array.from({ length: parts.length }, () => [])
       partProcesses.value = Array.from({ length: parts.length }, () => [])
       reportingData.value = Array.from({ length: parts.length }, () => [])
       reportingData.value = Array.from({ length: parts.length }, () => [])
-
-      if (parts.length > 0) {
-        await selectPart(0)
-        refreshProcessTableLayout()
-      } else {
-        selectedPartIndex.value = -1
-        warningres('暂无部件数据')
-      }
-    } else {
-      processParts.value = [];
-      partQuantities.value = [];
-      partProcesses.value = [];
-      reportingData.value = [];
-      selectedPartIndex.value = -1;
-      warningres('获取工艺部件失败');
+      await selectPart(0)
+      return true
     }
     }
+    warningres('获取工艺部件失败')
+    return false
   } catch (error) {
   } catch (error) {
     console.error('获取工艺部件失败:', error);
     console.error('获取工艺部件失败:', error);
     warningres('网络错误,请稍后重试');
     warningres('网络错误,请稍后重试');
-    processParts.value = [];
-    partQuantities.value = [];
-    partProcesses.value = [];
-    reportingData.value = [];
-    selectedPartIndex.value = -1;
+    return false
   } finally {
   } finally {
     loadingProcess.value = false;
     loadingProcess.value = false;
   }
   }
@@ -1437,15 +1429,25 @@ const refreshProcessProduction = async () => {
 }
 }
 
 
 // 查询
 // 查询
+/** 子订单号如 DC2605017-0800 转为订单号 DC2605017 再查询 */
+const normalizeOrderSearchInput = (val) => {
+  const s = String(val ?? '').trim()
+  if (!s) return ''
+  const idx = s.indexOf('-')
+  return idx >= 0 ? s.slice(0, idx).trim() : s
+}
+
 const add_onSubmit = async ()=>{
 const add_onSubmit = async ()=>{
-  if(add_searchInfo.value === '' || add_searchInfo.value === undefined){
-    warningres('搜索内容不能为空')
+  const searchKey = normalizeOrderSearchInput(add_searchInfo.value)
+  if (!searchKey) {
+    warningres('请扫描订单二维码')
     return;
     return;
   }
   }
+  add_searchInfo.value = searchKey
 
 
   try {
   try {
     const response = await WorkOrderList({
     const response = await WorkOrderList({
-      search: add_searchInfo.value,
+      search: searchKey,
       page: 1,
       page: 1,
       limit: 10,
       limit: 10,
     });
     });
@@ -1461,7 +1463,7 @@ const add_onSubmit = async ()=>{
         orderInfoList.length = 0;
         orderInfoList.length = 0;
         orderInfoList.splice(0, list.length, ...list);
         orderInfoList.splice(0, list.length, ...list);
         // 锁定当前订单编号(红框区域),后续业务不再依赖搜索框
         // 锁定当前订单编号(红框区域),后续业务不再依赖搜索框
-        currentOrderNo.value = String(orderInfoList[0]?.['订单编号'] || add_searchInfo.value.split('-')[0] || '').trim();
+        currentOrderNo.value = String(orderInfoList[0]?.['订单编号'] || searchKey).trim();
 
 
         // 获取工分报工历史记录
         // 获取工分报工历史记录
         await getGongfenHistory();
         await getGongfenHistory();

+ 48 - 14
src/view/yunyin/shengchanguanli/yangyipihe.vue

@@ -10,10 +10,10 @@
 				<el-button type="primary" native-type="button" icon="edit" @click="ztgg_onClick" :disabled="table_Selection === false" class="bt" title="状态更改">状态更改</el-button>
 				<el-button type="primary" native-type="button" icon="edit" @click="ztgg_onClick" :disabled="table_Selection === false" class="bt" title="状态更改">状态更改</el-button>
 				<el-button type="primary" native-type="button" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
 				<el-button type="primary" native-type="button" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
 			  </el-form-item>
 			  </el-form-item>
-				<el-tag type="danger" style="font-size: 14px;">
-					<span>附件状态带有 “ </span>
-					<span style="font-size: 16px;"> * </span>
-					<span>” 的代表新订单未上传附件</span>
+				<el-tag type="danger" class="yangyipihe-attach-tip">
+					注:「技术附件」「订单附件」列显示
+					<span class="yangyipihe-attach-tip-mark">“ * ”</span>
+					表示该订单尚未上传对应附件
 				</el-tag>
 				</el-tag>
 			</el-form>
 			</el-form>
 		</layout-header>
 		</layout-header>
@@ -30,12 +30,12 @@
 							:show-overflow-tooltip="true"
 							:show-overflow-tooltip="true"
 							style="width: 100%;height: 65vh" border  :data="tableData1" :row-key="orderTableRowKey" @row-click="tableRowClick" @selection-change="handleSelectionChange">
 							style="width: 100%;height: 65vh" border  :data="tableData1" :row-key="orderTableRowKey" @row-click="tableRowClick" @selection-change="handleSelectionChange">
 						<el-table-column   align="center" type="selection" width="40"/>
 						<el-table-column   align="center" type="selection" width="40"/>
-						<el-table-column   align="center" label="技术附件状态" prop="status"  width="110" />
-						<el-table-column   align="center" label="订单附件状态" prop="orderstatus"  width="110" />
+						<el-table-column   align="center" label="技术附件" prop="status"  width="85" />
+						<el-table-column   align="center" label="订单附件" prop="orderstatus"  width="85" />
 						<el-table-column   align="left" label="客户" prop="客户编号"  width="70" />
 						<el-table-column   align="left" label="客户" prop="客户编号"  width="70" />
 						<el-table-column   align="left" label="订单编号" prop="订单编号"  width="115" />
 						<el-table-column   align="left" label="订单编号" prop="订单编号"  width="115" />
-						<el-table-column   align="left" label="生产款号" prop="生产款号"  width="150" />
-						<el-table-column   align="left" label="款式" prop="款式"  width="110" />
+						<el-table-column   align="left" label="生产款号" prop="生产款号"  width="220" />
+						<el-table-column   align="left" label="款式" prop="款式"  width="140" />
 						<el-table-column align="center" label="状态" prop="gd_statu" width="130" >
 						<el-table-column align="center" label="状态" prop="gd_statu" width="130" >
 						    <template #default="{ row }">
 						    <template #default="{ row }">
 						      <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' : 
 						      <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' : 
@@ -56,8 +56,21 @@
 						    </template>
 						    </template>
 						</el-table-column>
 						</el-table-column>
 						<el-table-column   align="left" label="订单数量" prop="订单数量"  width="90" />
 						<el-table-column   align="left" label="订单数量" prop="订单数量"  width="90" />
-						<el-table-column   align="left" label="包装完工数量" prop="工单完工数量"  width="110" />
+						<!-- <el-table-column   align="left" label="裁剪完工数量" prop="裁剪完工数量"  width="110" />
+						<el-table-column   align="left" label="车缝完工数量" prop="车缝完工数量"  width="110" />
+						<el-table-column   align="left" label="手工完工数量" prop="手工完工数量"  width="110" />
+						<el-table-column   align="left" label="大烫完工数量" prop="大烫完工数量"  width="110" />
+						<el-table-column   align="left" label="总检完工数量" prop="总检完工数量"  width="110" /> -->
+						<el-table-column   align="left" label="包装完工数量" prop="包装完工数量"  width="110" />
 						<el-table-column   align="left" label="单位" prop="单位"  width="55" />
 						<el-table-column   align="left" label="单位" prop="单位"  width="55" />
+						<el-table-column   align="left" label="落货日期" prop="落货日期"  width="100" />
+						<el-table-column   align="left" label="核批人员" prop="审核"  width="100" />
+						<el-table-column   align="left" label="核批日期" prop="审核日期"  width="110" >
+							<template #default="{ row }">{{ stripDateTime(row['审核日期']) }}</template>
+						</el-table-column>
+            <el-table-column   align="left" label="出库日期" prop="出库日期"  width="110" >
+							<template #default="{ row }">{{ stripDateTime(row['出库日期']) }}</template>
+						</el-table-column>
 						<el-table-column   align="left" label="面料" prop="面料"  width="360" />
 						<el-table-column   align="left" label="面料" prop="面料"  width="360" />
 						<el-table-column   align="left" label="粘衬" prop="粘衬"  width="360" />
 						<el-table-column   align="left" label="粘衬" prop="粘衬"  width="360" />
 						<el-table-column   align="left" label="要求" prop="要求"  width="360" />
 						<el-table-column   align="left" label="要求" prop="要求"  width="360" />
@@ -65,11 +78,9 @@
 						<el-table-column   align="left" label="船样描述" prop="船样描述"  width="200" />
 						<el-table-column   align="left" label="船样描述" prop="船样描述"  width="200" />
 						<el-table-column   align="left" label="箱唛要求" prop="箱唛要求"  width="360" />
 						<el-table-column   align="left" label="箱唛要求" prop="箱唛要求"  width="360" />
 						<el-table-column   align="left" label="制单人" prop="Sys_id"  width="160" />
 						<el-table-column   align="left" label="制单人" prop="Sys_id"  width="160" />
-						<el-table-column   align="left" label="制单日期" prop="Sys_rq"  width="160" />
-						<el-table-column   align="left" label="出库日期" prop="出库日期"  width="160" />
-						<el-table-column   align="left" label="落货日期" prop="落货日期"  width="100" />
-						<el-table-column   align="left" label="核批人员" prop="审核"  width="100" />
-						<el-table-column   align="left" label="核批日期" prop="审核日期"  width="160" />
+						<el-table-column   align="left" label="制单日期" prop="Sys_rq"  width="110" >
+							<template #default="{ row }">{{ stripDateTime(row.Sys_rq) }}</template>
+						</el-table-column>
 					</el-table>
 					</el-table>
 				</el-tab-pane>
 				</el-tab-pane>
 					<div class="gva-pagination">
 					<div class="gva-pagination">
@@ -151,6 +162,15 @@
   import { ensureProcessProductionData } from '@/utils/processProductionDialog'
   import { ensureProcessProductionData } from '@/utils/processProductionDialog'
   
   
   defineOptions({name: 'Company'})
   defineOptions({name: 'Company'})
+
+  const stripDateTime = (val) => {
+    if (val == null || String(val).trim() === '') return ''
+    const s = String(val).trim()
+    const matched = s.match(/^(\d{4}-\d{2}-\d{2})/)
+    if (matched) return matched[1]
+    if (s.includes(' ')) return s.split(' ')[0]
+    return s
+  }
   
   
   //获取登录用户信息
   //获取登录用户信息
   const userStore = useUserStore()
   const userStore = useUserStore()
@@ -320,6 +340,20 @@
   :deep(.el-table__body tr.current-row) > td {
   :deep(.el-table__body tr.current-row) > td {
 	background: #ff80ff !important;
 	background: #ff80ff !important;
   }
   }
+  .yangyipihe-attach-tip {
+    font-size: 14px;
+    height: auto;
+    padding: 6px 10px;
+    line-height: 1.5;
+    white-space: normal;
+  }
+  .yangyipihe-attach-tip-mark {
+    display: inline-block;
+    margin: 0 2px;
+    font-size: 16px;
+    font-weight: 700;
+    vertical-align: baseline;
+  }
   </style>
   </style>
   <style scoped>
   <style scoped>
   :deep(.el-table td .cell) {
   :deep(.el-table td .cell) {

Некоторые файлы не были показаны из-за большого количества измененных файлов