|
|
|
|
@ -107,6 +107,62 @@
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 操作人与备注 -->
|
|
|
|
|
<view class="section-card">
|
|
|
|
|
<view class="section-title-bar">
|
|
|
|
|
<view class="section-bar-line"></view>
|
|
|
|
|
<text class="section-title">{{ t('moldOperate.operator') + ' & ' + t('moldOperate.remark') }}</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="card-body-grid">
|
|
|
|
|
<view class="form-row">
|
|
|
|
|
<view class="form-cell">
|
|
|
|
|
<text class="form-label"><text class="required">*</text>{{ t('moldOperate.operator') }}</text>
|
|
|
|
|
<!-- 下拉选择器 -->
|
|
|
|
|
<view class="select-dropdown" @click="toggleOperatorDropdown">
|
|
|
|
|
<view class="dropdown-input">
|
|
|
|
|
<text :class="['dropdown-value', { placeholder: !selectedOperator }]">
|
|
|
|
|
{{ selectedOperator ? selectedOperator.label : t('moldOperate.placeholderOperator') }}
|
|
|
|
|
</text>
|
|
|
|
|
<uni-icons type="bottom" size="14" color="#999" class="dropdown-arrow"></uni-icons>
|
|
|
|
|
</view>
|
|
|
|
|
<!-- 下拉列表(在输入框下方展开) -->
|
|
|
|
|
<view v-if="showOperatorDropdown" class="dropdown-panel">
|
|
|
|
|
<scroll-view scroll-y class="dropdown-scroll">
|
|
|
|
|
<view
|
|
|
|
|
v-for="(item, idx) in operatorOptions"
|
|
|
|
|
:key="item.value"
|
|
|
|
|
class="dropdown-item"
|
|
|
|
|
:class="{ active: selectedOperator?.value === item.value }"
|
|
|
|
|
@click.stop="handleSelectOperator(item, idx)"
|
|
|
|
|
>
|
|
|
|
|
<text class="dropdown-item-text">{{ item.label }}</text>
|
|
|
|
|
<uni-icons
|
|
|
|
|
v-if="selectedOperator?.value === item.value"
|
|
|
|
|
type="checkmarkempty"
|
|
|
|
|
size="16"
|
|
|
|
|
color="#1f7cff"
|
|
|
|
|
></uni-icons>
|
|
|
|
|
</view>
|
|
|
|
|
<view v-if="!operatorOptions.length" class="dropdown-empty">暂无数据</view>
|
|
|
|
|
</scroll-view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="form-row">
|
|
|
|
|
<view class="form-cell">
|
|
|
|
|
<text class="form-label">{{ t('moldOperate.remark') }}</text>
|
|
|
|
|
<input
|
|
|
|
|
class="form-input"
|
|
|
|
|
v-model="remarkText"
|
|
|
|
|
:placeholder="t('moldOperate.placeholderRemark')"
|
|
|
|
|
:maxlength="200"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 底部操作栏 - 上模 -->
|
|
|
|
|
<view class="bottom-actions">
|
|
|
|
|
<view class="bottom-btn cancel-btn" @click="handleCancel">{{ t('functionCommon.cancel') }}</view>
|
|
|
|
|
@ -121,6 +177,7 @@ import { computed, ref } from 'vue'
|
|
|
|
|
import { onShow } from '@dcloudio/uni-app'
|
|
|
|
|
import { useI18n } from 'vue-i18n'
|
|
|
|
|
import { getDeviceLedgerList, createMoldOperate } from '@/api/mes/moldoperate'
|
|
|
|
|
import { getSimpleUserList } from '@/api/system/user'
|
|
|
|
|
|
|
|
|
|
const { t } = useI18n()
|
|
|
|
|
|
|
|
|
|
@ -160,6 +217,10 @@ const selectedDevice = ref({})
|
|
|
|
|
|
|
|
|
|
const selectedMountMolds = ref([])
|
|
|
|
|
const tempSelectedDeviceId = ref(null)
|
|
|
|
|
const remarkText = ref('')
|
|
|
|
|
const operatorOptions = ref([])
|
|
|
|
|
const selectedOperator = ref(null)
|
|
|
|
|
const operatorIndex = ref(-1)
|
|
|
|
|
|
|
|
|
|
// 设备状态 - 上模
|
|
|
|
|
const deviceStatusClass = computed(() => {
|
|
|
|
|
@ -241,6 +302,36 @@ const currentMoldDisplay = computed(() => {
|
|
|
|
|
return textValue(selectedDevice.value.currentMold)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// ---- 操作人列表加载 ----
|
|
|
|
|
async function loadOperators() {
|
|
|
|
|
try {
|
|
|
|
|
const res = await getSimpleUserList()
|
|
|
|
|
const data = Array.isArray(res) ? res : (Array.isArray(res?.data) ? res.data : [])
|
|
|
|
|
operatorOptions.value = data.map((u) => ({
|
|
|
|
|
value: u.id || u.userId,
|
|
|
|
|
label: u.nickname || u.userName || u.name || String(u.id || '')
|
|
|
|
|
}))
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error('loadOperators error', e)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const showOperatorDropdown = ref(false)
|
|
|
|
|
|
|
|
|
|
function toggleOperatorDropdown() {
|
|
|
|
|
showOperatorDropdown.value = !showOperatorDropdown.value
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function closeOperatorDropdown() {
|
|
|
|
|
showOperatorDropdown.value = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSelectOperator(item, idx) {
|
|
|
|
|
selectedOperator.value = item
|
|
|
|
|
operatorIndex.value = idx
|
|
|
|
|
closeOperatorDropdown()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function selectDevice(device) {
|
|
|
|
|
selectedDevice.value = device || {}
|
|
|
|
|
tempSelectedDeviceId.value = device ? device.id : null
|
|
|
|
|
@ -272,6 +363,10 @@ function validFormMount() {
|
|
|
|
|
uni.showToast({ title: t('moldOperate.validatorMoldRequired'), icon: 'none' })
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if (!selectedOperator.value) {
|
|
|
|
|
uni.showToast({ title: t('moldOperate.validatorOperatorRequired'), icon: 'none' })
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -286,6 +381,13 @@ async function handleConfirmMount() {
|
|
|
|
|
lineName: selectedDevice.value.workshopName || '',
|
|
|
|
|
lineId: selectedDevice.value.deviceLine || ''
|
|
|
|
|
}
|
|
|
|
|
// 添加操作人和备注
|
|
|
|
|
if (selectedOperator.value) {
|
|
|
|
|
payload.operatorId = selectedOperator.value.value
|
|
|
|
|
}
|
|
|
|
|
if (remarkText.value.trim()) {
|
|
|
|
|
payload.remark = remarkText.value.trim()
|
|
|
|
|
}
|
|
|
|
|
console.log('=== 上模提交参数 ===', JSON.stringify(payload))
|
|
|
|
|
console.log('=== deviceId type:', typeof payload.deviceId, 'value:', payload.deviceId)
|
|
|
|
|
console.log('=== moldId type:', typeof payload.moldId, 'value:', payload.moldId)
|
|
|
|
|
@ -347,6 +449,9 @@ function handleScan() {
|
|
|
|
|
function handleCancel() {
|
|
|
|
|
selectedDevice.value = {}
|
|
|
|
|
selectedMountMolds.value = []
|
|
|
|
|
remarkText.value = ''
|
|
|
|
|
selectedOperator.value = null
|
|
|
|
|
operatorIndex.value = -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function goBack() {
|
|
|
|
|
@ -358,7 +463,7 @@ function goToHistory() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onShow(async () => {
|
|
|
|
|
await Promise.allSettled([loadDevices()])
|
|
|
|
|
await Promise.allSettled([loadDevices(), loadOperators()])
|
|
|
|
|
// 从 globalData 读取设备选择页回传的设备
|
|
|
|
|
const device = getApp().globalData._deviceSelectResult
|
|
|
|
|
if (device) {
|
|
|
|
|
@ -473,7 +578,6 @@ onShow(async () => {
|
|
|
|
|
margin: 16rpx 24rpx;
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
border-radius: 14rpx;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.section-title-bar {
|
|
|
|
|
@ -592,6 +696,132 @@ onShow(async () => {
|
|
|
|
|
.change-text { font-size: 26rpx; color: #666; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ====== 表单行(操作人/备注) ====== */
|
|
|
|
|
.form-row {
|
|
|
|
|
margin-top: 18rpx;
|
|
|
|
|
|
|
|
|
|
&:first-child {
|
|
|
|
|
margin-top: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.form-cell {
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
|
|
|
|
.form-label {
|
|
|
|
|
display: block;
|
|
|
|
|
font-size: 24rpx;
|
|
|
|
|
color: #999;
|
|
|
|
|
margin-bottom: 8rpx;
|
|
|
|
|
|
|
|
|
|
.required {
|
|
|
|
|
color: #dc2626;
|
|
|
|
|
margin-right: 4rpx;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ====== 下拉选择器(操作人) ====== */
|
|
|
|
|
.select-dropdown {
|
|
|
|
|
position: relative;
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-input {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
height: 72rpx;
|
|
|
|
|
padding: 0 20rpx;
|
|
|
|
|
border: 1rpx solid #e0e0e0;
|
|
|
|
|
border-radius: 10rpx;
|
|
|
|
|
font-size: 27rpx;
|
|
|
|
|
color: #333;
|
|
|
|
|
background: #f9fafb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-value {
|
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
|
|
&.placeholder {
|
|
|
|
|
color: #bbb;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-arrow {
|
|
|
|
|
position: absolute;
|
|
|
|
|
right: 16rpx;
|
|
|
|
|
top: 50%;
|
|
|
|
|
transform: translateY(-50%);
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ====== 下拉面板(在输入框下方展开) ====== */
|
|
|
|
|
.dropdown-panel {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 76rpx;
|
|
|
|
|
left: 0;
|
|
|
|
|
right: 0;
|
|
|
|
|
z-index: 99;
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
border: 1rpx solid #e0e0e0;
|
|
|
|
|
border-radius: 12rpx;
|
|
|
|
|
box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.1);
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-scroll {
|
|
|
|
|
max-height: 400rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-item {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
padding: 22rpx 28rpx;
|
|
|
|
|
font-size: 27rpx;
|
|
|
|
|
color: #333;
|
|
|
|
|
border-bottom: 1rpx solid #f5f5f5;
|
|
|
|
|
|
|
|
|
|
&:last-child {
|
|
|
|
|
border-bottom: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&:active {
|
|
|
|
|
background: #f5f7fa;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
|
color: #1f7cff;
|
|
|
|
|
background: #f0f7ff;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-item-text {
|
|
|
|
|
flex: 1;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.dropdown-empty {
|
|
|
|
|
padding: 32rpx;
|
|
|
|
|
text-align: center;
|
|
|
|
|
font-size: 26rpx;
|
|
|
|
|
color: #999;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.form-input {
|
|
|
|
|
height: 72rpx;
|
|
|
|
|
padding: 0 20rpx;
|
|
|
|
|
border: 1rpx solid #e0e0e0;
|
|
|
|
|
border-radius: 10rpx;
|
|
|
|
|
font-size: 27rpx;
|
|
|
|
|
color: #333;
|
|
|
|
|
background: #f9fafb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ====== 空提示 ====== */
|
|
|
|
|
.empty-mold-hint {
|
|
|
|
|
padding: 40rpx 24rpx;
|
|
|
|
|
|