diff --git a/src/components/storefabric/SearchSelectPopup.vue b/src/components/storefabric/SearchSelectPopup.vue index 93d6a0e..a182685 100644 --- a/src/components/storefabric/SearchSelectPopup.vue +++ b/src/components/storefabric/SearchSelectPopup.vue @@ -19,9 +19,16 @@ v-for="item in filteredList" :key="String(item.value)" class="search-select__item" - @click="confirm(item)" - >{{ item.label }} + :class="{ 'is-selected': multiple && isPicked(item) }" + @click="onItemClick(item)" + > + {{ item.label }} + 已选 + + + 确定 + @@ -33,12 +40,15 @@ export default { title: { type: String, default: '请选择' }, placeholder: { type: String, default: '请输入名称搜索' }, list: { type: Array, default: () => [] }, + multiple: { type: Boolean, default: false }, + selected: { type: Array, default: () => [] }, }, data() { return { keyword: '', panelMaxHeight: 520, listHeight: 360, + picked: [], }; }, computed: { @@ -56,6 +66,7 @@ export default { show(val) { if (val) { this.keyword = ''; + this.picked = (this.selected || []).map((item) => String(item)); this.calcHeight(); } }, @@ -70,16 +81,37 @@ export default { const winH = sys.windowHeight || 600; // 弹层约占屏高 65%,列表为弹层去掉标题+搜索后的剩余高度 this.panelMaxHeight = Math.floor(winH * 0.65); - this.listHeight = Math.max(220, this.panelMaxHeight - 140); + const chrome = this.multiple ? 230 : 140; + this.listHeight = Math.max(220, this.panelMaxHeight - chrome); } catch (e) { this.panelMaxHeight = 520; - this.listHeight = 360; + this.listHeight = this.multiple ? 280 : 360; } }, + isPicked(item) { + return this.picked.includes(String(item.value)); + }, + onItemClick(item) { + if (!this.multiple) { + this.confirm(item); + return; + } + const key = String(item.value); + if (this.picked.includes(key)) { + this.picked = this.picked.filter((value) => value !== key); + return; + } + this.picked = this.picked.concat(key); + }, confirm(item) { this.visible = false; this.$emit('confirm', item); }, + confirmMultiple() { + const selected = (this.list || []).filter((item) => this.isPicked(item)); + this.visible = false; + this.$emit('confirm', selected); + }, }, }; @@ -126,9 +158,42 @@ export default { font-size: $pda-font-popup-sub; } .search-select__item { - padding: 32rpx 30rpx; + display: flex; + align-items: center; + justify-content: space-between; + min-height: $pda-row-min-height; + padding: 20rpx 30rpx; + box-sizing: border-box; font-size: $pda-font-popup-item; color: #202328; border-bottom: 1px solid #f2f2f2; } +.search-select__item-label { + flex: 1; + min-width: 0; + font-size: $pda-font-popup-item; + color: #202328; +} +.search-select__item.is-selected .search-select__item-label { + color: #2f78e6; +} +.search-select__check { + flex-shrink: 0; + margin-left: 16rpx; + font-size: $pda-font-action; + color: #2f78e6; +} +.search-select__footer { + flex-shrink: 0; + padding: 16rpx 30rpx 8rpx; +} +.search-select__ok { + height: $pda-button-height; + line-height: $pda-button-height; + text-align: center; + font-size: $pda-font-button; + color: #fff; + background: #2979ff; + border-radius: 46rpx; +} diff --git a/src/manifest.json b/src/manifest.json index db0eab7..1d4b848 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -2,8 +2,8 @@ "name" : "浩拓织厂", "appid" : "__UNI__F79F300", "description" : "周尚-浩拓织厂", - "versionName" : "1.1.18", - "versionCode" : 118, + "versionName" : "1.1.19", + "versionCode" : 119, "transformPx" : false, "app-plus" : { "optimization" : { diff --git a/src/pages/storefabric/storeFabricManualIn.vue b/src/pages/storefabric/storeFabricManualIn.vue index f105baf..ac09fe8 100644 --- a/src/pages/storefabric/storeFabricManualIn.vue +++ b/src/pages/storefabric/storeFabricManualIn.vue @@ -109,6 +109,8 @@ title="选择等级" placeholder="请输入等级名称" :list="levelOptions" + multiple + :selected="detail.grey_fabric_level_id" @confirm="onLevelConfirm" /> { + nameMap[String(item.value)] = item.label; + }); + return ids.map((id) => nameMap[String(id)]).filter(Boolean).join('、'); }, }, onLoad() { @@ -272,10 +281,15 @@ export default { } this.levelPickerShow = true; }, - onLevelConfirm(item) { - if (!item) return; - this.detail.grey_fabric_level_id = [Number(item.value)]; - this.detail.grey_fabric_level_name = item.label || ''; + onLevelConfirm(items) { + const list = Array.isArray(items) ? items : (items ? [items] : []); + this.detail.grey_fabric_level_id = list + .map((item) => Number(item.value)) + .filter((item) => Number.isFinite(item)); + this.detail.grey_fabric_level_name = list + .map((item) => item.label) + .filter(Boolean) + .join('、'); }, async loadInspectorOptions() { try { @@ -338,6 +352,8 @@ export default { this.detail = { ...emptyDetail(), fabric_piece_code: code, + inspector_id: this.detail.inspector_id, + inspector_name: this.detail.inspector_name, }; this.weightKg = ''; } finally { @@ -347,6 +363,8 @@ export default { applyScanDetail(res, fallbackCode) { const data = res || {}; const levelIds = normalizeLevelIds(data.grey_fabric_level_id); + const hasIncomingInspector = data.inspector_id != null && data.inspector_id !== '' + || String(data.inspector_name || '').trim(); this.detail = { ...emptyDetail(), fabric_piece_code: data.fabric_piece_code || fallbackCode || '', @@ -356,9 +374,15 @@ export default { grey_fabric_code: data.grey_fabric_code || '', inspection_weight: formatDisplayWeightKg(data.inspection_weight) ? data.inspection_weight : null, grey_fabric_level_id: levelIds, - grey_fabric_level_name: data.grey_fabric_level_name || '', - inspector_id: data.inspector_id != null ? data.inspector_id : null, - inspector_name: data.inspector_name || '', + grey_fabric_level_name: Array.isArray(data.grey_fabric_level_name) + ? data.grey_fabric_level_name.filter(Boolean).join('、') + : (data.grey_fabric_level_name || ''), + inspector_id: hasIncomingInspector && data.inspector_id != null && data.inspector_id !== '' + ? data.inspector_id + : this.detail.inspector_id, + inspector_name: hasIncomingInspector + ? (data.inspector_name || this.detail.inspector_name || '') + : (this.detail.inspector_name || ''), }; this.weightKg = formatDisplayWeightKg(data.inspection_weight); this.scanCode = this.detail.fabric_piece_code; @@ -421,11 +445,15 @@ export default { } }, resetForNextScan() { + const inspectorId = this.detail.inspector_id; + const inspectorName = this.detail.inspector_name; this.scanCode = ''; - this.detail = emptyDetail(); + this.detail = { + ...emptyDetail(), + inspector_id: inspectorId, + inspector_name: inspectorName, + }; this.weightKg = ''; - this.warehouseBinId = null; - this.warehouseBinName = ''; this.$nextTick(() => { this.scanFocus = false; this.$nextTick(() => { @@ -525,6 +553,7 @@ export default { text-align: right; font-size: $pda-font-body; color: #202328; + word-break: break-all; } .manual-in__unit { diff --git a/src/pages/sys/login/index.vue b/src/pages/sys/login/index.vue index 9154b79..cee5365 100644 --- a/src/pages/sys/login/index.vue +++ b/src/pages/sys/login/index.vue @@ -125,6 +125,15 @@ import md5 from '@/common/md5.js'; import manifest from '@/manifest.json'; import { mapState } from 'vuex' import app_upgrade from '@/uni_modules/app-upgrade/js_sdk/index.js' + +function isDefaultPassword(data) { + if (!data || typeof data !== 'object') return false; + const value = data.is_default_password != null + ? data.is_default_password + : (data.user && data.user.is_default_password); + return value === true || value === 1 || value === '1' || value === 'true'; +} + export default { data() { return { @@ -356,9 +365,12 @@ export default { getApp().globalData.StoreNameID = aLoginUserData.default_physical_warehouse_id; getApp().globalData.StoreName = aLoginUserData.default_physical_warehouse_name; getApp().globalData.StoreTypeNo = ''; + const workbenchUrl = isDefaultPassword(aLoginUserData) + ? '/pages/sys/workbench/index?defaultPassword=1' + : '/pages/sys/workbench/index'; setTimeout(() => { uni.reLaunch({ - url: '/pages/sys/workbench/index' + url: workbenchUrl }); }, 500); diff --git a/src/pages/sys/workbench/index.vue b/src/pages/sys/workbench/index.vue index fd0896a..b907e85 100644 --- a/src/pages/sys/workbench/index.vue +++ b/src/pages/sys/workbench/index.vue @@ -76,9 +76,12 @@ export default { }; }, - onLoad() { + onLoad(options) { const sys = uni.getSystemInfoSync(); this.statusBarHeight = sys.statusBarHeight || 20; + if (options && String(options.defaultPassword) === '1') { + this.promptChangePassword(); + } // #ifdef APP-PLUS plus.runtime.getProperty(plus.runtime.appid, (inf) => { if (inf && inf.version) { @@ -90,6 +93,20 @@ export default { }, methods: { + promptChangePassword() { + setTimeout(() => { + uni.showModal({ + title: '提示', + content: '当前使用的是默认密码,请修改密码', + confirmText: '去修改', + cancelText: '稍后', + success: (res) => { + if (!res.confirm) return; + uni.navigateTo({ url: '/pages/sys/user/pwd' }); + }, + }); + }, 400); + }, handleScanCode(scanResult) { const cleanResult = scanResult.trim().replace(/[\r\n]/g, ''); uni.navigateTo({