@ -67,17 +67,19 @@
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="editProductVisible = false" > 取消 < / button > < button class = "btn-primary" :disabled = "editSaving" @tap ="doEditProduct" > {{ editSaving ? ' 保存中... ' : ' 保存 ' }} < / button > < / view >
< / view >
< / view >
< ! - - 发起首道工序 - - >
< ! - - 发起首道工序 ( 只选人 + 填备注 ) -- >
< view v-if = "createFirstVisible" class="overlay" @tap="createFirstVisible = false" >
< view class = "popup" @tap.stop >
< text class = "popup-title" > { { isWarehouseTransfer ? '📤 仓库转出派发' : '🚀 发起首道工序' } } < / text >
< view class = "field-label" > 工序名称 < text class = "required" > * < / text > < / view >
< picker :range = "TASK_NAME_OPTIONS" :value = "firstForm.taskNameIdx" @change ="onTaskNameChange" > < view class = "picker-box" > { { firstForm . task _name || '请选择工序名称' } } < / view > < / picker >
< view class = "field-label" > 接收人 < text class = "required" > * < / text > < / view >
< picker :range = "userLabels" :value = "firstForm.assigneeIdx" @change ="onAssigneeChange" > < view class = "picker-box" > { { firstForm . assigneeLabel || '请选择接收人' } } < / view > < / picker >
< view class = "field-label" > 备注 < text class = "required" > * < / text > < / view >
< view class = "user-grid" >
< view v-for = "u in userGridOptions" :key="u.id"
: class = "['user-grid-item', firstForm.assignee_id === u.id ? 'user-grid-active' : '']"
@tap ="firstForm.assignee_id = u.id; firstForm.assigneeLabel = u.name" > {{ formatName ( u.name ) }} < / view >
< / view >
< view class = "field-label" style = "margin-top:12px;" > 备注 < text class = "required" > * < / text > < / view >
< textarea v-model = "firstForm.note" class="popup-textarea" placeholder="请填写备注说明(必填)" :maxlength="500" / >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="createFirstVisible = false" > 取消 < / button > < button class = "btn-primary" : disabled = "firstSaving || !firstForm.task_name || !firstForm.assignee_id || !firstForm.note.trim()" @tap ="doCreateFirstTask" > {{ firstSaving ? ' 创建中... ' : ' 确认创建 ' }} < / button > < / view >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="createFirstVisible = false" > 取消 < / button > < button class = "btn-primary" : disabled = "firstSaving || !firstForm.assignee_id || !firstForm.note.trim()" @tap ="doCreateFirstTask" > {{ firstSaving ? ' 创建中... ' : ' 确认创建 ' }} < / button > < / view >
< / view >
< / view >
< ! - - 记录 / 拍照 - - >
@ -101,8 +103,14 @@
< text class = "popup-title" > 确认接收任务 < / text >
< view class = "popup-task" > { { actionPopup . task && actionPopup . task . task _name } } < / view >
< text class = "popup-hint" > 状态 : { { statusLabel ( actionPopup . task && actionPopup . task . status ) } } → 进行中 < / text >
< textarea v-model = "receiveRemark" class="popup-textarea" placeholder="接收备注(选填)" :maxlength="500" / >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary" :disabled = "actionLoading" @tap ="doReceive" > 确认接收 < / button > < / view >
< view class = "field-label" > 选择工序 < text class = "required" > * < / text > < / view >
< view class = "user-grid" >
< view v-for = "opt in TASK_NAME_OPTIONS" :key="opt"
: class = "['user-grid-item', receiveTaskName === opt ? 'user-grid-active' : '']"
@tap ="receiveTaskName = opt" > {{ opt }} < / view >
< / view >
< textarea v-model = "receiveRemark" class="popup-textarea" placeholder="接收备注(选填)" :maxlength="500" style="margin-top:12px;" / >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary" : disabled = "actionLoading || !receiveTaskName" @tap ="doReceive" > 确认接收 < / button > < / view >
< / template >
< template v-if = "actionPopup.type === 'reject'" >
< text class = "popup-title" > 品质驳回 < / text >
@ -112,20 +120,29 @@
< / template >
< template v-if = "actionPopup.type === 'transfer'" >
< text class = "popup-title" > 完工转交 < / text >
< view class = "form-item" > < text class = "form -label" > 下一道工序 < text class = "required" > * < / text > < / text > < picker mode = "selector" :range = "processOptions" @change ="onTransferProcessChange" > < view class = "picker-value" > < text : class = "transferForm.next_task_name ? '' : 'picker-placeholder'" > { { transferForm . next _task _name || '请选择工序' } } < / text > < text class = "picker-arrow" > ▾ < / text > < / view > < / picker > < / view>
< view v-if = "!transferForm.isWarehouse" class="form-item"><text class="form-label">接收人 <text class="required">*</text></text><picker mode="selector" :range="userOptions" range-key="name" @change="onTransferUserChange"><view class="picker-value"><text :class="transferUserName ? '' : 'picker-placeholder'">{{ transferUserName || '请选择接收人' }}</text><text class="picker-arrow" > ▾ < / text > < / view > < / picker > < / view >
< view v-i f = "transferForm.isWarehouse" class="warehouse-hint" > 📦 入库 — 直接归档 , 无需指定接收人 < / view >
< view class = "field -label" > 接收人 < text class = "required" > * < / text > < / view >
< view class = "user-grid" >
< view v-for = "u in userGridOptions" :key="u.id"
: class = "['user-grid-item', transferForm.selectedUserId === u.id ? 'user-grid-active' : '']"
@tap ="transferForm.selectedUserId = u.id" > {{ formatName ( u.name ) }} < / view >
< / view >
< view class = "field-label" style = "margin-top:12px;" > 或 < / view >
< view : class = "['user-grid-item', transferForm.isWarehouse ? 'user-grid-active' : '']" style = "width:100%;" @tap ="transferForm.isWarehouse = !transferForm.isWarehouse; transferForm.selectedUserId = '';" > 📦 入库 ( virtual_warehouse ) < / view >
< input v-model = "transferForm.note" class="popup-input" placeholder="交接备注(选填)" style="margin-top:12px;" / >
< view v-if = "transferForm.next_task_name " class="preview-hint" > {{ transferForm.isWarehouse ? ' 产品将入库并从个人待办中移除 ' : ' 将创建 1 个 「 ' + transferForm.next_task_name + ' 」 任务指派给 ' + ( transferUserName | | ' — ' ) }} < / view >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary" : disabled = "actionLoading || !transferForm.next_task_name || (!transferForm.isWarehouse && !transferForm.selectedUserId)" @tap ="doTransfer" > {{ actionLoading ? ' 提交中... ' : ( transferForm.isWarehouse ? ' 📦 确认入库 ' : ' 确认转交 ' ) }} < / button > < / view >
< view v-if = "transferForm.isWarehouse || transferForm.selectedUserId " class="preview-hint" > {{ transferForm.isWarehouse ? ' 产品将入库并从个人待办中移除 ' : ' 将创建新 任务指派给 ' + ( transferUserName | | ' — ' ) }} < / view >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary" : disabled = "actionLoading || (!transferForm.isWarehouse && !transferForm.selectedUserId)" @tap ="doTransfer" > {{ actionLoading ? ' 提交中... ' : ( transferForm.isWarehouse ? ' 📦 确认入库 ' : ' 确认转交 ' ) }} < / button > < / view >
< / template >
< template v-if = "actionPopup.type === 'spawn'" >
< text class = "popup-title" > ➕ 派发协助分支 < / text >
< text class = "popup-hint" > 为当前任务创建一个 并行协助任务 , 当前任务保持进行中 < / text >
< view class = "form-item" > < text class = "form -label" > 工序名称 < text class = "required" > * < / text > < / text > < picker mode = "selector" :range = "spawnProcessOptions" @change ="onSpawnProcessChange" > < view class = "picker-value" > < text : class = "spawnForm.task_name ? '' : 'picker-placeholder'" > { { spawnForm . task _name || '请选择工序' } } < / text > < text class = "picker-arrow" > ▾ < / text > < / view > < / picker > < / view>
< view class = "form-item" > < text class = "form-label" > 接收人 < text class = "required" > * < / text > < / text > < picker mode = "selector" :range = "userOptions" range -key = " name " @change ="onSpawnUserChange" > < view class = "picker-value" > < text : class = "spawnUserName ? '' : 'picker-placeholder'" > { { spawnUserName || '请选择接收人' } } < / text > < text class = "picker-arrow" > ▾ < / text > < / view > < / picker > < / view >
< input v-model = "spawnForm.remark" class="popup-input" placeholder="派发备注(选填)" / >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary btn-spawn" : disabled = "actionLoading || !spawnForm.task_name || !spawnForm.assignee_id" @tap ="doSpawn" > {{ actionLoading ? ' 提交中... ' : ' 确认派发 ' }} < / button > < / view >
< text class = "popup-hint" > 为当前任务创建并行协助 , 当前任务保持进行中 < / text >
< view class = "field -label" > 接收人 < text class = "required" > * < / text > < / view >
< view class = "user-grid" >
< view v-for = "u in userGridOptions" :key="u.id"
: class = "['user-grid-item', spawnForm.assignee_id === u.id ? 'user-grid-active' : '']"
@tap ="spawnForm.assignee_id = u.id" > {{ formatName ( u.name ) }} < / view >
< / view >
< input v-model = "spawnForm.remark" class="popup-input" placeholder="派发备注(选填)" style="margin-top:12px;" / >
< view class = "popup-btns" > < button class = "btn-cancel" @tap ="closeActionPopup" > 取消 < / button > < button class = "btn-primary btn-spawn" : disabled = "actionLoading || !spawnForm.assignee_id" @tap ="doSpawn" > {{ actionLoading ? ' 提交中... ' : ' 确认派发 ' }} < / button > < / view >
< / template >
< / view >
< / view >
@ -152,9 +169,9 @@ export default {
recordPopup : { visible : false , task : null } , recordForm : { recordId : null , remark : "" , images : [ ] , pendingCount : 0 } , recordSaving : false , isUploading : false ,
currentUser : null , currentUserId : "" , currentUsername : "" , currentMode : "tree" ,
processOptions : [ ] , userOptions : [ ] ,
actionPopup : { visible : false , type : "" , task : null } , actionLoading : false , rejectReason : "" , receiveRemark : "" ,
transferForm : { next _task _name : "" , selectedUserId: "" , isWarehouse : false , note : "" } ,
spawnForm : { task _name : "" , assignee_id : "" , remark : "" } ,
actionPopup : { visible : false , type : "" , task : null } , actionLoading : false , rejectReason : "" , receiveRemark : "" , receiveTaskName : "" ,
transferForm : { selectedUserId : "" , isWarehouse : false , note : "" } ,
spawnForm : { assignee _id : "" , remark : "" } ,
} ;
} ,
computed : {
@ -162,7 +179,7 @@ export default {
canDeleteImage ( ) { if ( ! this . recordPopup . task ) return true ; if ( ! this . currentUser ) return true ; return this . currentUser . username === this . recordPopup . task . assignee _id ; } ,
transferUserName ( ) { const u = this . userOptions . find ( u => u . id === this . transferForm . selectedUserId ) ; return u ? u . name : "" ; } ,
spawnUserName ( ) { const u = this . userOptions . find ( u => u . id === this . spawnForm . assignee _id ) ; return u ? u . name : "" ; } ,
spawnProcess Options( ) { return ( this . process Options || [ ] ) . filter ( o => o !== "🏭 入库 (virtual_warehouse)" ) ; } ,
userGrid Options( ) { return ( this . user Options || [ ] ) . map ( u => ( { id : u . id , name : u . name } ) ) ; } ,
hasMyActiveTask ( ) {
const find = ( tasks ) => { if ( ! tasks ) return false ; for ( const t of tasks ) { if ( ( t . status === 'WIP' || t . status === 'PENDING' ) && ( t . assignee _id == this . currentUserId || t . assignee _id == this . currentUsername ) ) return true ; if ( find ( t . child _tasks ) ) return true ; } return false ; } ;
return this . product ? find ( this . product . task _tree ) : false ;
@ -170,6 +187,7 @@ export default {
} ,
onLoad ( options ) { this . loadUsers ( ) ; this . loadCurrentUser ( ) ; const sn = options . serial || "" ; if ( sn ) this . doQuery ( sn ) ; } ,
methods : {
formatName ( name ) { if ( ! name ) return "" ; return name . length === 2 ? name [ 0 ] + " " + name [ 1 ] : name ; } ,
statusLabel ( s ) { return STATUS _MAP [ s ] || s ; } ,
statusColor ( s ) { switch ( s ) { case "PENDING" : return "s-yellow" ; case "WIP" : return "s-blue" ; case "COMPLETED" : return "s-green" ; case "REJECTED" : return "s-red" ; default : return "s-gray" ; } } ,
@ -185,10 +203,10 @@ export default {
onTaskNameChange ( e ) { const idx = e . detail . value ; this . firstForm . taskNameIdx = idx ; this . firstForm . task _name = TASK _NAME _OPTIONS [ idx ] ; } ,
onAssigneeChange ( e ) { const idx = e . detail . value ; const u = this . users [ idx ] ; if ( u ) { this . firstForm . assigneeIdx = idx ; this . firstForm . assignee _id = u . username ; this . firstForm . assigneeLabel = ` ${ u . full _name } ( ${ u . username } ) ` ; } } ,
openCreateFirstTask ( ) { this . isWarehouseTransfer = false ; if ( this . currentMode === 'tree' ) this . currentMode = 'workspace' ; this . firstForm = { task _name : TASK _NAME _OPTIONS [ 0 ] , taskNameIdx : 0 , assignee _id : this . users . length > 0 ? this . users [ 0 ] . username : "" , assigneeLabel : this . users . length > 0 ? ` ${ this . users [ 0 ] . full _name } ( ${ this . users [ 0 ] . username } ) ` : "" , assigneeIdx : 0 , note : "" } ; this . createFirstVisible = true ; } ,
openCreateFirstTask ( ) { this . isWarehouseTransfer = false ; if ( this . currentMode === 'tree' ) this . currentMode = 'workspace' ; this . firstForm = { assignee _id : "" , assigneeLabel : "" , note : "" } ; this . createFirstVisible = true ; } ,
handleOverallBarClick ( ) { if ( ! this . product . task _tree || ! this . product . task _tree . length ) { this . openCreateFirstTask ( ) ; } else { this . showStatusPicker = true ; } } ,
openWarehouseTransfer ( ) { this . isWarehouseTransfer = true ; this . openCreateFirstTask ( ) ; } ,
async doCreateFirstTask ( ) { this . firstSaving = true ; try { await post ( "/tasks/" , { product _id : this . product . id , task _name : this . firstForm . task _name , assignee _id : this . firstForm . assignee _id , notify _parent _on _complete : false , remark : this . firstForm . note . trim ( ) || undefined } ) ; if ( this . product . current _location _id === 'virtual_warehouse' ) { try { await patch ( ` /products/ ${ this . product . id } ` , { current _location _id : this . firstForm . assignee _id } ) ; } catch { } } uni . showToast ( { title : "任务已派发,待接收" , icon : "success" } ) ; this . createFirstVisible = false ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . firstSaving = false ; } } ,
async doCreateFirstTask ( ) { this . firstSaving = true ; try { await post ( "/tasks/" , { product _id : this . product . id , task _name : "待确认" , assignee _id : this . firstForm . assignee _id , notify _parent _on _complete : false , remark : this . firstForm . note . trim ( ) || undefined } ) ; if ( this . product . current _location _id === 'virtual_warehouse' ) { try { await patch ( ` /products/ ${ this . product . id } ` , { current _location _id : this . firstForm . assignee _id } ) ; } catch { } } uni . showToast ( { title : "任务已派发,待接收" , icon : "success" } ) ; this . createFirstVisible = false ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . firstSaving = false ; } } ,
openRecordPopup ( task ) { this . recordPopup = { visible : true , task } ; this . recordForm = { recordId : null , remark : "" , images : [ ] , pendingCount : 0 } ; this . isUploading = false ; } ,
openEditRecord ( { task , record } ) { this . recordPopup = { visible : true , task } ; this . recordForm = { recordId : record . id , remark : record . remark || "" , images : record . images || [ ] , pendingCount : 0 } ; this . isUploading = false ; } ,
@ -204,25 +222,21 @@ export default {
if ( type === "deleteRecord" ) { this . doDeleteRecord ( record ) ; return ; }
if ( type === "end" ) { this . confirmEndBranch ( task ) ; return ; }
if ( type === "transfer" || type === "spawn" ) { uni . showLoading ( { title : "加载数据..." } ) ; try { if ( ! this . userOptions . length ) await this . loadUsers ( ) ; if ( ! this . processOptions . length ) this . processOptions = [ "🏭 入库 (virtual_warehouse)" , ... TASK _NAME _OPTIONS ] ; } finally { uni . hideLoading ( ) ; } }
this . actionPopup = { visible : true , type , task } ; this . rejectReason = "" ; this . receiveRemark = "" ;
this . transferForm = { next _task _name : "" , selectedUserId: "" , isWarehouse : false , note : "" } ;
this . spawnForm = { task _name : "" , assignee_id : "" , remark : "" } ;
this . actionPopup = { visible : true , type , task } ; this . rejectReason = "" ; this . receiveRemark = "" ; this . receiveTaskName = "" ;
this . transferForm = { selectedUserId : "" , isWarehouse : false , note : "" } ;
this . spawnForm = { assignee _id : "" , remark : "" } ;
} ,
handleViewRecords ( task ) { uni . navigateTo ( { url : ` /pages/scan/records?taskId= ${ task . id } ` } ) ; } ,
async doDeleteRecord ( record ) { try { await request ( { url : ` /records/ ${ record . id } ` , method : "DELETE" } ) ; uni . showToast ( { title : "记录已删除" , icon : "success" } ) ; this . doQuery ( this . product . serial _number ) ; } catch { } } ,
confirmEndBranch ( task ) { uni . showModal ( { title : "结束分支" , content : ` 确定结束「 ${ task . task _name } 」吗? ` , success : ( res ) => { if ( res . confirm ) this . doEndBranch ( task ) ; } } ) ; } ,
async doEndBranch ( task ) { try { const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ task . id } /end?operator_id= ${ encodeURIComponent ( opId ) } ` ) ; uni . showToast ( { title : "分支已结束" , icon : "success" } ) ; this . doQuery ( this . product . serial _number ) ; } catch { } } ,
closeActionPopup ( ) { this . actionPopup = { visible : false , type : "" , task : null } ; } ,
async doReceive ( ) { this . actionLoading = true ; try { const remark = this . receiveRemark . trim ( ) || undefined ; const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /receive?operator_id= ${ encodeURIComponent ( opId ) } ` , { remark } ) ; uni . showToast ( { title : "已接收" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
async doReceive ( ) { this . actionLoading = true ; try { const remark = this . receiveRemark . trim ( ) || undefined ; const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /receive?operator_id= ${ encodeURIComponent ( opId ) } ` , { remark , task _name : this . receiveTaskName } ) ; uni . showToast ( { title : "已接收" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
async doReject ( ) { this . actionLoading = true ; try { const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /reject?operator_id= ${ encodeURIComponent ( opId ) } ` , { reason : this . rejectReason . trim ( ) } ) ; uni . showToast ( { title : "已驳回" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
// 转交(单线)
onTransferProcessChange ( e ) { this . transferForm . next _task _name = this . processOptions [ e . detail . value ] ; this . transferForm . isWarehouse = this . transferForm . next _task _name === "🏭 入库 (virtual_warehouse)" ; this . transferForm . selectedUserId = "" ; } ,
onTransferUserChange ( e ) { const user = this . userOptions [ e . detail . value ] ; if ( user ) this . transferForm . selectedUserId = user . id ; } ,
async doTransfer ( ) { this . actionLoading = true ; try { const assignees = this . transferForm . isWarehouse ? [ "virtual_warehouse" ] : [ this . transferForm . selectedUserId ] ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /transfer ` , { next _tasks : [ { task _name : this . transferForm . next _task _name , assignees } ] , note : this . transferForm . note . trim ( ) || undefined } ) ; uni . showToast ( { title : this . transferForm . isWarehouse ? "已入库" : "转交成功" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
async doTransfer ( ) { this . actionLoading = true ; try { const assignees = this . transferForm . isWarehouse ? [ "virtual_warehouse" ] : [ this . transferForm . selectedUserId ] ; const taskName = this . transferForm . isWarehouse ? "🏭 入库 (virtual_warehouse)" : "待确认" ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /transfer ` , { next _tasks : [ { task _name : taskName , assignees } ] , note : this . transferForm . note . trim ( ) || undefined } ) ; uni . showToast ( { title : this . transferForm . isWarehouse ? "已入库" : "转交成功" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
// 派发协助分支
onSpawnProcessChange ( e ) { this . spawnForm . t ask _name = this . spawnProcessOption s[ e . detail . v alu e] ; } ,
onSpawnUserChange ( e ) { const user = this . userOptions [ e . detail . value ] ; if ( user ) this . spawnForm . assignee _id = user . id ; } ,
async doSpawn ( ) { this . actionLoading = true ; try { const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /spawn?operator_id= ${ encodeURIComponent ( opId ) } ` , { task _name : this . spawnForm . task _name , assignee _id : this . spawnForm . assignee _id , remark : this . spawnForm . remark . trim ( ) || undefined } ) ; uni . showToast ( { title : "协助分支已派发" , icon : "success" } ) ; this . closeActionPopup ( ) ; this . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = false ; } } ,
async doSpawn ( ) { this . actionLoading = true ; try { const opId = this . currentUsername || this . currentUserId ; await post ( ` /tasks/ ${ this . actionPopup . task . id } /spawn?operator_id= ${ encodeURIComponent ( opId ) } ` , { task _name : "待确认" , assignee _id : this . spawnForm . assignee _id , remark : this . spawnForm . remark . trim ( ) || undefined } ) ; uni . showToast ( { title : "协助分支已派发" , icon : "success" } ) ; this . closeActionPopup ( ) ; thi s . doQuery ( this . product . serial _number ) ; } catch { } finally { this . actionLoading = f als e; } } ,
} ,
} ;
< / script >
@ -292,8 +306,9 @@ export default {
. form - item { margin : 10 px 0 ; }
. form - label { font - size : 14 px ; font - weight : 600 ; color : # 374151 ; display : block ; margin - bottom : 4 px ; }
. picker - value { display : flex ; align - items : center ; justify - content : space - between ; width : 100 % ; height : 42 px ; padding : 0 12 px ; border : 1 px solid # e5e7eb ; border - radius : 10 px ; background : # f9fafb ; font - size : 14 px ; box - sizing : border - box ; }
. pick er- placeholder { color : # 9 ca3af ; }
. picker - arrow { font - size : 12 px ; color : # 9 ca3af ; margin - left : 8 px ; }
. us er- grid { display : grid ; grid - template - columns : repeat ( 3 , 1 fr ) ; gap : 10 px ; }
. user - grid - item { padding : 12 px 8 px ; border - radius : 10 px ; background : # f3f4f6 ; text - align : center ; font - size : 14 px ; font - weight : 600 ; color : # 374151 ; border : 2 px solid transparent ; }
. user - grid - active { background : # dbeafe ; color : # 2563 eb ; border - color : # 2563 eb ; }
. warehouse - hint { font - size : 13 px ; background : # ede9fe ; color : # 7 c3aed ; padding : 10 px 14 px ; border - radius : 10 px ; margin : 8 px 0 ; text - align : center ; }
. warehouse - transfer - banner { display : flex ; align - items : center ; gap : 12 px ; font - weight : 700 ; background : linear - gradient ( 135 deg , # ede9fe , # dbeafe ) ; color : # 5 b21b6 ; padding : 14 px 16 px ; border - radius : 12 px ; margin - bottom : 12 px ; border : 2 px dashed # a78bfa ; }
. wt - icon { font - size : 24 px ; }