feat(M08-B): 补保洁员选择器
This commit is contained in:
@@ -94,6 +94,7 @@
|
||||
:session="session"
|
||||
:loading="loading.tasks"
|
||||
:items="tasks.items"
|
||||
:cleaners="cleaners.items"
|
||||
:total="tasks.total"
|
||||
:page="tasks.page"
|
||||
:page-size="tasks.pageSize"
|
||||
@@ -112,6 +113,7 @@
|
||||
:session="session"
|
||||
:loading="loading.settlements"
|
||||
:items="settlements.items"
|
||||
:cleaners="cleaners.items"
|
||||
:total="settlements.total"
|
||||
:page="settlements.page"
|
||||
:page-size="settlements.pageSize"
|
||||
|
||||
@@ -110,8 +110,29 @@
|
||||
|
||||
<el-dialog v-model="generateDialog.open" title="生成结算单" width="420px">
|
||||
<el-form label-position="top">
|
||||
<el-form-item label="保洁员用户 ID">
|
||||
<el-input v-model="generateDialog.cleanerUserId" inputmode="numeric" />
|
||||
<el-form-item label="保洁员">
|
||||
<el-select
|
||||
v-model="generateDialog.cleanerUserId"
|
||||
class="cleaner-select"
|
||||
filterable
|
||||
placeholder="选择保洁员"
|
||||
:disabled="!cleaners.length"
|
||||
>
|
||||
<el-option
|
||||
v-for="cleaner in cleaners"
|
||||
:key="cleaner.id"
|
||||
:label="cleanerLabel(cleaner)"
|
||||
:value="cleaner.id"
|
||||
>
|
||||
<div class="option-row">
|
||||
<strong>{{ cleaner.nickname || compactText(cleaner.id) }}</strong>
|
||||
<span>ID {{ cleaner.id }} · {{ cleaner.maskedPhone || '无手机号' }}</span>
|
||||
</div>
|
||||
<el-tag :type="cleaner.wechatMiniappBound ? 'success' : 'warning'" effect="light" size="small">
|
||||
{{ cleaner.wechatMiniappBound ? '已绑微信' : '未绑微信' }}
|
||||
</el-tag>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="门店 ID">
|
||||
<el-input v-model="generateDialog.storeId" inputmode="numeric" />
|
||||
@@ -258,6 +279,7 @@ import { compactText, money, shortDate } from '../format';
|
||||
import type {
|
||||
CleaningSettlement,
|
||||
CleaningSettlementDetail,
|
||||
ManagedUser,
|
||||
PageResult,
|
||||
SettlementStatus,
|
||||
TransferMode,
|
||||
@@ -268,6 +290,7 @@ const props = defineProps<{
|
||||
session: { token: string };
|
||||
loading: boolean;
|
||||
items: PageResult<CleaningSettlement>['items'];
|
||||
cleaners: ManagedUser[];
|
||||
total: number;
|
||||
page: number;
|
||||
pageSize: number;
|
||||
@@ -336,7 +359,18 @@ function preflightTag(status: string) {
|
||||
return 'danger';
|
||||
}
|
||||
|
||||
function cleanerLabel(cleaner: ManagedUser) {
|
||||
const name = cleaner.nickname || `ID ${cleaner.id}`;
|
||||
const phone = cleaner.maskedPhone ? ` · ${cleaner.maskedPhone}` : '';
|
||||
const stores = cleaner.storeIds.length ? ` · 门店 ${cleaner.storeIds.join('/')}` : '';
|
||||
return `${name}${phone}${stores}`;
|
||||
}
|
||||
|
||||
function submitGenerate() {
|
||||
if (!generateDialog.cleanerUserId) {
|
||||
ElMessage.warning('请选择保洁员');
|
||||
return;
|
||||
}
|
||||
emit('generate', {
|
||||
cleanerUserId: generateDialog.cleanerUserId,
|
||||
storeId: generateDialog.storeId || undefined,
|
||||
|
||||
@@ -101,8 +101,29 @@
|
||||
|
||||
<el-dialog v-model="assignDialog.open" title="指派保洁员" width="420px">
|
||||
<el-form label-position="top">
|
||||
<el-form-item label="保洁员用户 ID">
|
||||
<el-input v-model="assignDialog.cleanerUserId" inputmode="numeric" />
|
||||
<el-form-item label="保洁员">
|
||||
<el-select
|
||||
v-model="assignDialog.cleanerUserId"
|
||||
class="cleaner-select"
|
||||
filterable
|
||||
placeholder="选择保洁员"
|
||||
:disabled="!cleaners.length"
|
||||
>
|
||||
<el-option
|
||||
v-for="cleaner in cleaners"
|
||||
:key="cleaner.id"
|
||||
:label="cleanerLabel(cleaner)"
|
||||
:value="cleaner.id"
|
||||
>
|
||||
<div class="option-row">
|
||||
<strong>{{ cleaner.nickname || compactText(cleaner.id) }}</strong>
|
||||
<span>ID {{ cleaner.id }} · {{ cleaner.maskedPhone || '无手机号' }}</span>
|
||||
</div>
|
||||
<el-tag :type="cleaner.wechatMiniappBound ? 'success' : 'warning'" effect="light" size="small">
|
||||
{{ cleaner.wechatMiniappBound ? '已绑微信' : '未绑微信' }}
|
||||
</el-tag>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="assignDialog.note" type="textarea" :rows="3" />
|
||||
@@ -165,8 +186,29 @@
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-form label-position="top" class="member-form">
|
||||
<el-form-item label="协作者用户 ID">
|
||||
<el-input v-model="memberDialog.cleanerUserId" inputmode="numeric" />
|
||||
<el-form-item label="协作者">
|
||||
<el-select
|
||||
v-model="memberDialog.cleanerUserId"
|
||||
class="cleaner-select"
|
||||
filterable
|
||||
placeholder="选择协作者"
|
||||
:disabled="!cleaners.length"
|
||||
>
|
||||
<el-option
|
||||
v-for="cleaner in cleaners"
|
||||
:key="cleaner.id"
|
||||
:label="cleanerLabel(cleaner)"
|
||||
:value="cleaner.id"
|
||||
>
|
||||
<div class="option-row">
|
||||
<strong>{{ cleaner.nickname || compactText(cleaner.id) }}</strong>
|
||||
<span>ID {{ cleaner.id }} · {{ cleaner.maskedPhone || '无手机号' }}</span>
|
||||
</div>
|
||||
<el-tag :type="cleaner.wechatMiniappBound ? 'success' : 'warning'" effect="light" size="small">
|
||||
{{ cleaner.wechatMiniappBound ? '已绑微信' : '未绑微信' }}
|
||||
</el-tag>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分账金额">
|
||||
<el-input-number v-model="memberDialog.rewardCents" :min="0" :max="1000000" />
|
||||
@@ -203,12 +245,13 @@ import {
|
||||
removeCleaningTaskMember
|
||||
} from '../api';
|
||||
import { compactText, money, shortDate } from '../format';
|
||||
import type { CleaningTask, CleaningTaskMember, PageResult, TaskStatus } from '../types';
|
||||
import type { CleaningTask, CleaningTaskMember, ManagedUser, PageResult, TaskStatus } from '../types';
|
||||
|
||||
const props = defineProps<{
|
||||
session: { token: string };
|
||||
loading: boolean;
|
||||
items: PageResult<CleaningTask>['items'];
|
||||
cleaners: ManagedUser[];
|
||||
total: number;
|
||||
page: number;
|
||||
pageSize: number;
|
||||
@@ -256,6 +299,13 @@ function taskTag(status: TaskStatus) {
|
||||
return 'info';
|
||||
}
|
||||
|
||||
function cleanerLabel(cleaner: ManagedUser) {
|
||||
const name = cleaner.nickname || `ID ${cleaner.id}`;
|
||||
const phone = cleaner.maskedPhone ? ` · ${cleaner.maskedPhone}` : '';
|
||||
const stores = cleaner.storeIds.length ? ` · 门店 ${cleaner.storeIds.join('/')}` : '';
|
||||
return `${name}${phone}${stores}`;
|
||||
}
|
||||
|
||||
function openAssign(row: CleaningTask) {
|
||||
assignDialog.open = true;
|
||||
assignDialog.taskId = row.id;
|
||||
@@ -264,6 +314,10 @@ function openAssign(row: CleaningTask) {
|
||||
}
|
||||
|
||||
function submitAssign() {
|
||||
if (!assignDialog.cleanerUserId) {
|
||||
ElMessage.warning('请选择保洁员');
|
||||
return;
|
||||
}
|
||||
emit('assign', {
|
||||
taskId: assignDialog.taskId,
|
||||
cleanerUserId: assignDialog.cleanerUserId,
|
||||
@@ -306,6 +360,10 @@ async function openMembers(row: CleaningTask) {
|
||||
}
|
||||
|
||||
async function submitMember() {
|
||||
if (!memberDialog.cleanerUserId) {
|
||||
ElMessage.warning('请选择协作者');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
memberDialog.members = await addCleaningTaskMember(props.session, memberDialog.taskId, {
|
||||
cleanerUserId: memberDialog.cleanerUserId,
|
||||
|
||||
@@ -212,6 +212,31 @@ textarea {
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.cleaner-select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.option-row {
|
||||
display: inline-grid;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
margin-right: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.option-row strong,
|
||||
.option-row span {
|
||||
max-width: 220px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.option-row span {
|
||||
color: #69788c;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.data-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user