| | |
| | | </view> |
| | | <!-- 新增搜索框和按钮 --> |
| | | <view class="search-container"> |
| | | <input class="search-input" v-model="searchValue" :placeholder="'请输入'+options[optionsIndex]" |
| | | <input class="search-input" v-model="searchValue" :placeholder="optionsIndex === 0 ? '选择项目时显示全部数据' : '请输入'+options[optionsIndex]" |
| | | @confirm="handleSearch" /> |
| | | <button class="search-button" @click="handleSearch">搜索</button> |
| | | </view> |
| | |
| | | <text class="badge normal" v-if="item.first == 1">首次来料</text> |
| | | <text class="card-title">检验单号: {{item.releaseNo}}</text> |
| | | <view v-if="item.userName == null && item.activeTab == 0"> |
| | | <text class="status pending" :class="{ 'emergency-pending': item.lotNo1 === '紧急放行,请勿验退!' }"> |
| | | {{ item.lotNo1 === '紧急放行,请勿验退!' ? '紧急放行/待分配' : '待分配' }} |
| | | <text class="status pending" :class="{ |
| | | 'emergency-pending': item.lotNo1 === '紧急放行,请勿验退!', |
| | | 'unmaintained-not-emergency': isUnmaintainedAndNotEmergency(item) |
| | | }"> |
| | | {{ item.lotNo1 === '紧急放行,请勿验退!' ? '紧急放行/' + getStatusText(item) : getStatusText(item) }} |
| | | </text> |
| | | |
| | | </view> |
| | |
| | | <view class="info-row"> |
| | | <view class="info-item"> |
| | | <text class="info-label">项目</text> |
| | | <text class="info-content">{{item.projectCodes}}</text> |
| | | <text class="info-content">{{item.DEPARTMENTNAME}}</text> |
| | | </view> |
| | | <view class="info-item" v-if="item.extendNo1!=null"> |
| | | <text class="info-label">技改状态</text> |
| | |
| | | <text class="info-label">数量</text> |
| | | <text class="info-content highlight">{{item.fcovertQty}}</text> |
| | | </view> |
| | | |
| | | </view> |
| | | <view class="info-row"> |
| | | <view class="info-item"> |
| | |
| | | </view> |
| | | </view> |
| | | <view class="info-row"> |
| | | <view class="info-item" v-if="item.newFngDesc!=null"> |
| | | <text class="info-label">上次不良描述</text> |
| | | <text class="info-content">{{item.newFngDesc}}</text> |
| | | </view> |
| | | |
| | | <view class="info-item" v-if="item.fngDesc!=null"> |
| | | <text class="info-label">不良描述</text> |
| | | <text class="info-content">{{item.fngDesc}}</text> |
| | |
| | | data() { |
| | | return { |
| | | projectIndex: 0, |
| | | optionsIndex: 0, |
| | | optionsIndex: 1, // 默认选择物料编号 |
| | | projects: ['当前', '全部'], |
| | | activeTab: 0, // 0-未检验, 1-已检验 |
| | | uncheckedCount: 0, |
| | |
| | | pageIndex: 1, |
| | | limit: 20, |
| | | IQCJL: 0, |
| | | options: ['项目', '物料编号', '物料名称', '供应商', '采购员','到货单号','检验单号','物料规格'], |
| | | options: ['项目', '物料编号', '物料名称', '供应商', '到货单号','检验单号','物料规格'], |
| | | searchValue: '' |
| | | |
| | | } |
| | | }, |
| | | onLoad() { |
| | | //页面加载时调用的事件 |
| | | // 初始化selectedField,因为默认选择物料编号 |
| | | const fieldMap = { |
| | | 0: 'DEPARTMENTNAME', // 项目 |
| | | 1: 'itemNo', // 物料编号 |
| | | 2: 'itemName', // 物料名称 |
| | | 3: 'suppName', // 供应商 |
| | | 4: 'lotNo' ,// 到货单号 |
| | | 5: 'releaseNo' ,// 检验单号 |
| | | 6: 'itemModel',//物料规格 |
| | | }; |
| | | this.selectedField = fieldMap[this.optionsIndex]; |
| | | this.init(); |
| | | }, |
| | | methods: { |
| | | //搜索 |
| | | onOptionsChange(e) { |
| | | this.optionsIndex = e.detail.value; |
| | | // 当选择项目时,清空搜索值 |
| | | if (this.optionsIndex === 0) { |
| | | this.searchValue = ''; |
| | | } |
| | | // 根据选择的选项设置搜索字段 |
| | | const fieldMap = { |
| | | 0: 'projectCodes', // 项目 |
| | | 0: 'DEPARTMENTNAME', // 项目 |
| | | 1: 'itemNo', // 物料编号 |
| | | 2: 'itemName', // 物料名称 |
| | | 3: 'suppName', // 供应商 |
| | | 4: 'purchaser' ,// 采购员 |
| | | 5: 'lotNO' ,// 到货单号 |
| | | 6: 'releaseNO' ,// 检验单号 |
| | | 7: 'ItemModel',//物料规格 |
| | | 4: 'lotNo' ,// 到货单号 |
| | | 5: 'releaseNo' ,// 检验单号 |
| | | 6: 'itemModel',//物料规格 |
| | | }; |
| | | this.selectedField = fieldMap[this.optionsIndex]; |
| | | }, |
| | | //搜索按钮点击事件 |
| | | handleSearch() { |
| | | // 当选择项目时,清空搜索值 |
| | | if (this.optionsIndex === 0) { |
| | | this.searchValue = ''; |
| | | } |
| | | this.init(); |
| | | }, |
| | | init() { |
| | |
| | | emergency:this.meergency, |
| | | } |
| | | }).then(res => { |
| | | // 去重处理 - 根据 releaseNo 去重 |
| | | const uniqueList = this.removeDuplicatesByReleaseNo(res.data.tbBillList); |
| | | |
| | | // 对数据进行排序处理 |
| | | const sortedList = this.sortInspectionList(uniqueList); |
| | | |
| | | if (this.pageIndex === 1) { |
| | | // 如果是第一页,直接覆盖原数据 |
| | | this.inspectionList = res.data.tbBillList; |
| | | this.inspectionList = sortedList; |
| | | //添加Tab信息,判断是已检还是未检数据 |
| | | this.inspectionList.forEach((item, index) => { |
| | | this.$set(item, 'activeTab', this.activeTab); |
| | |
| | | }); |
| | | } else { |
| | | |
| | | if (res.data.tbBillList.length > 0) { |
| | | if (sortedList.length > 0) { |
| | | // 如果是下一页,追加新数据 |
| | | this.inspectionList = [...this.inspectionList, ...res.data.tbBillList]; |
| | | this.inspectionList = [...this.inspectionList, ...sortedList]; |
| | | //添加Tab信息,判断是已检还是未检数据 |
| | | this.inspectionList.forEach((item, index) => { |
| | | this.$set(item, 'activeTab', this.activeTab); |
| | |
| | | } |
| | | await this.init(); // 自定义的刷新函数 |
| | | |
| | | }, |
| | | |
| | | // 根据 releaseNo 去重的方法 |
| | | removeDuplicatesByReleaseNo(array) { |
| | | const seen = new Set(); |
| | | return array.filter(item => { |
| | | const releaseNo = item.releaseNo; |
| | | if (seen.has(releaseNo)) { |
| | | return false; |
| | | } |
| | | seen.add(releaseNo); |
| | | return true; |
| | | }); |
| | | }, |
| | | |
| | | // 根据检验项目数量获取状态文本 |
| | | getStatusText(item) { |
| | | // 使用JYXM字段判断是否维护了检验项目 |
| | | if (item.jyxm === 0 || item.jyxm === '0') { |
| | | return '未维护'; |
| | | } |
| | | // 如果维护了检验项目,显示"待检验" |
| | | return '待检验'; |
| | | }, |
| | | |
| | | // 判断是否为未维护且非紧急放行 |
| | | isUnmaintainedAndNotEmergency(item) { |
| | | // 使用JYXM字段检查是否为未维护(0表示未维护) |
| | | const isUnmaintained = item.jyxm === 0 || item.jyxm === '0'; |
| | | // 检查是否为非紧急放行 |
| | | const isNotEmergency = item.lotNo1 !== '紧急放行,请勿验退!'; |
| | | return isUnmaintained && isNotEmergency; |
| | | }, |
| | | |
| | | // 判断是否为待分配状态(物料没有维护检验员或者该物料未在V_LLJ_USER里) |
| | | isUnmaintainedItem(item) { |
| | | // 检查物料是否在V_LLJ_USER视图中(即是否有维护检验员) |
| | | // 如果item.fcode为null或undefined,说明该物料未在V_LLJ_USER视图中 |
| | | // 或者该物料没有维护检验员 |
| | | return !item.fcode || item.fcode === null || item.fcode === ''; |
| | | }, |
| | | |
| | | // 对检验单列表进行排序 |
| | | sortInspectionList(list) { |
| | | return list.sort((a, b) => { |
| | | // 第一优先级:状态分组(未提交 vs 已提交) |
| | | const aIsSubmitted = a.status === '已提交'; |
| | | const bIsSubmitted = b.status === '已提交'; |
| | | |
| | | if (aIsSubmitted && !bIsSubmitted) return 1; // 已提交的排在后面 |
| | | if (!aIsSubmitted && bIsSubmitted) return -1; // 未提交的排在前面 |
| | | |
| | | // 未提交单据的排序逻辑 |
| | | if (!aIsSubmitted && !bIsSubmitted) { |
| | | // 第一优先级:紧急放行 |
| | | const aIsEmergency = a.lotNo1 === '紧急放行,请勿验退!'; |
| | | const bIsEmergency = b.lotNo1 === '紧急放行,请勿验退!'; |
| | | |
| | | if (aIsEmergency && !bIsEmergency) return -1; |
| | | if (!aIsEmergency && bIsEmergency) return 1; |
| | | |
| | | // 第二优先级:未维护检验项目(使用JYXM字段) |
| | | const aIsUnmaintained = a.jyxm === 0 || a.jyxm === '0'; |
| | | const bIsUnmaintained = b.jyxm === 0 || b.jyxm === '0'; |
| | | |
| | | if (aIsUnmaintained && !bIsUnmaintained) return -1; |
| | | if (!aIsUnmaintained && bIsUnmaintained) return 1; |
| | | |
| | | // 第三优先级:创建时间(创建时间越晚越靠后) |
| | | const aCreateTime = new Date(a.createDate || 0); |
| | | const bCreateTime = new Date(b.createDate || 0); |
| | | return aCreateTime - bCreateTime; // 升序:早的在前,晚的在后 |
| | | } |
| | | |
| | | // 已提交单据的排序逻辑 |
| | | if (aIsSubmitted && bIsSubmitted) { |
| | | // 按提交时间排序(提交的越晚越靠前) |
| | | const aIqcTime = new Date(a.iqcDate || 0); |
| | | const bIqcTime = new Date(b.iqcDate || 0); |
| | | return bIqcTime - aIqcTime; // 降序:晚的在前,早的在后 |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | } |
| | | } |
| | | } |
| | |
| | | /* 新增搜索框样式 */ |
| | | .search-container { |
| | | display: flex; |
| | | flex: 1; |
| | | width: 300px; /* 固定宽度 */ |
| | | margin: 0 10px; |
| | | height: 36px; |
| | | /* 与其他控件高度一致 */ |
| | |
| | | border-radius: 4px 0 0 4px; |
| | | font-size: 14px; |
| | | background-color: white; |
| | | min-width: 200px; /* 最小宽度 */ |
| | | max-width: 250px; /* 最大宽度 */ |
| | | } |
| | | |
| | | .search-button { |
| | |
| | | color: white; |
| | | } |
| | | |
| | | .badge.unmaintained { |
| | | background-color: #1e8449; |
| | | color: white; |
| | | } |
| | | |
| | | .badge.emergency { |
| | | background-color: #ff4d4f; |
| | | color: white; |
| | |
| | | font-size: 14px; |
| | | color: #2c3e50; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | .info-content.unmaintained { |
| | | color: #e74c3c; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .highlight { |
| | |
| | | background-color: #ff0000; /* 红色背景 */ |
| | | color: white; |
| | | } |
| | | |
| | | .status.unmaintained-not-emergency { |
| | | background-color: #9c27b0; /* 紫色背景 */ |
| | | color: white; |
| | | box-shadow: 0 0 8px rgba(156, 39, 176, 0.3); |
| | | } |
| | | } |
| | | </style> |