Commit 9fa704793a52c6db0076f5007bb60db4392324b4

Authored by 杨刚
1 parent 47090e96

feat: add feature to set and manage rider hold order limits in RiderList.vue

src/api/index.ts
@@ -105,6 +105,8 @@ export const riderApi = { @@ -105,6 +105,8 @@ export const riderApi = {
105 request.post('/api/admin/rider/setEnableStatus', null, { params: { riderId, status } }), 105 request.post('/api/admin/rider/setEnableStatus', null, { params: { riderId, status } }),
106 setType: (riderId: number, type: number) => 106 setType: (riderId: number, type: number) =>
107 request.post('/api/admin/rider/setType', null, { params: { riderId, type } }), 107 request.post('/api/admin/rider/setType', null, { params: { riderId, type } }),
  108 + setHoldOrderLimit: (riderId: number, holdOrderLimit: number) =>
  109 + request.post('/api/admin/rider/setHoldOrderLimit', null, { params: { riderId, holdOrderLimit } }),
108 designateCandidates: (orderId: number) => 110 designateCandidates: (orderId: number) =>
109 request.get('/api/admin/rider/order/candidates', { params: { orderId } }), 111 request.get('/api/admin/rider/order/candidates', { params: { orderId } }),
110 designate: (orderId: number, riderId: number) => 112 designate: (orderId: number, riderId: number) =>
src/views/dispatch/DispatchRuleList.vue
@@ -111,7 +111,7 @@ @@ -111,7 +111,7 @@
111 <div class="soft-section-header"> 111 <div class="soft-section-header">
112 <div class="soft-section-heading"> 112 <div class="soft-section-heading">
113 <h3 class="soft-section-title">自营抢派模式</h3> 113 <h3 class="soft-section-title">自营抢派模式</h3>
114 - <p class="soft-section-subtitle">配置抢单时长、可见范围、持单上限和自动派单。</p> 114 + <p class="soft-section-subtitle">配置抢单时长、可见范围、抢单上限和自动派单;自动派单仅受骑手个人持单上限控制。</p>
115 </div> 115 </div>
116 </div> 116 </div>
117 </div> 117 </div>
@@ -129,6 +129,7 @@ @@ -129,6 +129,7 @@
129 <a-col :span="8"> 129 <a-col :span="8">
130 <a-form-item label="单人最大抢单量"> 130 <a-form-item label="单人最大抢单量">
131 <a-input-number v-model:value="form.grabMaxPerRider" :min="1" style="width:100%" /> 131 <a-input-number v-model:value="form.grabMaxPerRider" :min="1" style="width:100%" />
  132 + <div class="form-help-text">仅在抢单模式下生效,单个骑手实际抢单上限不会超过其个人持单上限。</div>
132 </a-form-item> 133 </a-form-item>
133 </a-col> 134 </a-col>
134 </a-row> 135 </a-row>
src/views/rider/RiderList.vue
@@ -40,9 +40,13 @@ @@ -40,9 +40,13 @@
40 <template v-if="column.key === 'type'"> 40 <template v-if="column.key === 'type'">
41 <a-tag>{{ record.type === 1 ? '兼职' : '全职' }}</a-tag> 41 <a-tag>{{ record.type === 1 ? '兼职' : '全职' }}</a-tag>
42 </template> 42 </template>
  43 + <template v-if="column.key === 'holdOrderLimit'">
  44 + {{ formatHoldOrderLimit(record.holdOrderLimit) }}
  45 + </template>
43 <template v-if="column.key === 'action'"> 46 <template v-if="column.key === 'action'">
44 <a-space> 47 <a-space>
45 <a @click="openSetLevel(record)">设置等级</a> 48 <a @click="openSetLevel(record)">设置等级</a>
  49 + <a @click="openEditHoldLimit(record)">设置持单上限</a>
46 <template v-if="record.userStatus === 2"> 50 <template v-if="record.userStatus === 2">
47 <a-popconfirm title="确认通过审核?" @confirm="setStatus(record.id, 1)"> 51 <a-popconfirm title="确认通过审核?" @confirm="setStatus(record.id, 1)">
48 <a style="color:green">通过</a> 52 <a style="color:green">通过</a>
@@ -117,6 +121,23 @@ @@ -117,6 +121,23 @@
117 </a-form> 121 </a-form>
118 </div> 122 </div>
119 </a-modal> 123 </a-modal>
  124 +
  125 + <a-modal v-model:open="editVisible" title="编辑骑手" @ok="handleSetHoldLimit" :confirmLoading="editSaving">
  126 + <div class="soft-page-stack">
  127 + <div class="soft-note-card">
  128 + <strong>持单上限说明</strong>
  129 + <p>个人持单上限会统一作用于抢单、自动派单、后台指派和转单后再次接单。填写 0 表示不限制。</p>
  130 + </div>
  131 + <a-form layout="vertical">
  132 + <a-form-item label="骑手">
  133 + <a-input :value="editTargetName" disabled />
  134 + </a-form-item>
  135 + <a-form-item label="个人持单上限">
  136 + <a-input-number v-model:value="editHoldOrderLimit" :min="0" style="width:100%" />
  137 + </a-form-item>
  138 + </a-form>
  139 + </div>
  140 + </a-modal>
120 </div> 141 </div>
121 </template> 142 </template>
122 143
@@ -134,6 +155,7 @@ const filterStatus = ref&lt;number | undefined&gt;() @@ -134,6 +155,7 @@ const filterStatus = ref&lt;number | undefined&gt;()
134 const keyword = ref('') 155 const keyword = ref('')
135 const modalVisible = ref(false) 156 const modalVisible = ref(false)
136 const levelVisible = ref(false) 157 const levelVisible = ref(false)
  158 +const editVisible = ref(false)
137 const form = reactive({ 159 const form = reactive({
138 cityId: undefined as number | undefined, 160 cityId: undefined as number | undefined,
139 userNickname: '', 161 userNickname: '',
@@ -144,6 +166,10 @@ const levelSaving = ref(false) @@ -144,6 +166,10 @@ const levelSaving = ref(false)
144 const levelTargetId = ref<number>(0) 166 const levelTargetId = ref<number>(0)
145 const levelTargetName = ref('') 167 const levelTargetName = ref('')
146 const selectedLevelId = ref<number>(0) 168 const selectedLevelId = ref<number>(0)
  169 +const editSaving = ref(false)
  170 +const editTargetId = ref<number>(0)
  171 +const editTargetName = ref('')
  172 +const editHoldOrderLimit = ref<number>(0)
147 const { isAdmin, cityList, loadCities, getCityName } = useRoleCityList() 173 const { isAdmin, cityList, loadCities, getCityName } = useRoleCityList()
148 174
149 const statusMap: Record<number, string> = { 0: '已拒绝', 1: '已通过', 2: '待审核' } 175 const statusMap: Record<number, string> = { 0: '已拒绝', 1: '已通过', 2: '待审核' }
@@ -155,6 +181,7 @@ const columns = [ @@ -155,6 +181,7 @@ const columns = [
155 { title: '租户', key: 'cityId' }, 181 { title: '租户', key: 'cityId' },
156 { title: '等级', key: 'levelName' }, 182 { title: '等级', key: 'levelName' },
157 { title: '类型', key: 'type' }, 183 { title: '类型', key: 'type' },
  184 + { title: '个人持单上限', key: 'holdOrderLimit' },
158 { title: '审核状态', key: 'userStatus' }, 185 { title: '审核状态', key: 'userStatus' },
159 { title: '账号状态', key: 'accountStatus' }, 186 { title: '账号状态', key: 'accountStatus' },
160 { title: '骑手状态', key: 'workStatus' }, 187 { title: '骑手状态', key: 'workStatus' },
@@ -170,6 +197,10 @@ function getWorkStatus(record: any) { @@ -170,6 +197,10 @@ function getWorkStatus(record: any) {
170 return record.isRest === 1 ? 1 : 0 197 return record.isRest === 1 ? 1 : 0
171 } 198 }
172 199
  200 +function formatHoldOrderLimit(value?: number) {
  201 + return value && value > 0 ? `${value} 单` : '无限制'
  202 +}
  203 +
173 async function loadList() { 204 async function loadList() {
174 loading.value = true 205 loading.value = true
175 try { 206 try {
@@ -233,6 +264,29 @@ async function handleSetLevel() { @@ -233,6 +264,29 @@ async function handleSetLevel() {
233 } 264 }
234 } 265 }
235 266
  267 +function openEditHoldLimit(record: any) {
  268 + editTargetId.value = record.id
  269 + editTargetName.value = record.userNickname || record.mobile
  270 + editHoldOrderLimit.value = Number(record.holdOrderLimit || 0)
  271 + editVisible.value = true
  272 +}
  273 +
  274 +async function handleSetHoldLimit() {
  275 + if (editHoldOrderLimit.value < 0) {
  276 + message.error('个人持单上限不能小于0')
  277 + return
  278 + }
  279 + editSaving.value = true
  280 + try {
  281 + await riderApi.setHoldOrderLimit(editTargetId.value, editHoldOrderLimit.value)
  282 + message.success('设置成功')
  283 + editVisible.value = false
  284 + loadList()
  285 + } finally {
  286 + editSaving.value = false
  287 + }
  288 +}
  289 +
236 async function setStatus(riderId: number, status: number) { 290 async function setStatus(riderId: number, status: number) {
237 await riderApi.setStatus(riderId, status) 291 await riderApi.setStatus(riderId, status)
238 message.success('操作成功') 292 message.success('操作成功')