Commit 62c0316b authored by daniel's avatar daniel

feat(gps押金): bug修复

parent be86be3f
......@@ -241,6 +241,35 @@
</div>
</template>
</n-modal>
<n-modal :mask-closable="false" :loading="loading" style="width: 300px" title="批量退款"
preset="card"
draggable v-model:show="showRefundModal" >
<n-form
ref="refundOrderFormRef"
:model="refundOrderValue"
:rules="refundOrderRules"
size="small"
label-placement="left"
label-width="auto"
>
<n-form-item label="退款金额" path="markNo">
<n-input-number clearable type="number" v-model:value="refundOrderValue.refundAmount" placeholder="请输入退款金额"
digits="2"
:min="0" :max="depositForm.amount" />
</n-form-item>
</n-form>
<template #footer>
<div class="flex gap-x-2 flex-row items-center" >
<n-button class="flex-1" :loading="loading" @click="onRefundCancel">
取消
</n-button>
<n-button class="flex-1"
:loading="loading" type='error' @click="onRefundSubmit">
提交退款
</n-button>
</div>
</template>
</n-modal>
</n-space>
</script>
<script>
......@@ -530,7 +559,7 @@
{
type: 'selection',
disabled(row) {
return ![TradeStatusEnum.PAY_SUCCESS.value].includes(row.tradeStatus)
return TradeStatusEnum.PAY_SUCCESS.value !== row.tradeStatus && row.refundStatus != RefundStatusEnum.REFUND_SUCCESS.value
}
},
{
......@@ -584,7 +613,7 @@
type: PayTypeEnum[row.payType].color,
}, PayTypeEnum[row.payType].name),
]),
row.refundStatus && h(NSpace, {}, [
row.refundStatus != null && h(NSpace, {}, [
h('span', {}, "退款状态"),
h(NTag, {
size: "small",
......@@ -593,7 +622,6 @@
type: RefundStatusEnum[row.refundStatus].color,
}, RefundStatusEnum[row.refundStatus].name),
]),
])
}
},
......@@ -744,6 +772,8 @@
})
// 删除自助选号
const showEditModal = ref(false)
// 退款订单的modal
const showRefundModal = ref(false)
// 订单列表
const orders = ref([])
// 反馈表单
......@@ -752,16 +782,31 @@
markNo: '',
cmptId: getCId(),
})
// 当前操作的订单
// 金额
const refundOrderValue = reactive({
refundAmount: 0,
})
// 反馈的校验规则
editOrderRules = {
const editOrderRules = {
markNo: {
required: true,
message: '请输入参赛号',
trigger: 'blur'
}
}
// 退款订单的校验规则
const refundOrderRules = reactive({
refundAmount: {
required: true,
message: '请输入退款金额',
trigger: 'blur'
}
})
// 反馈的formRef
const editOrderFormRef = ref(null)
// 退款订单的formRef
const refundOrderFormRef = ref(null)
/***----------------订单列表 end -----------------*/
/***----------------押金配置 start -----------------*/
......@@ -850,6 +895,7 @@
page: 1,
size: 1,
cmptId: getCId(),
markNo: query.markNo,
}
let paramsList = tradeStatusOptions.value.map(v => ({
...params,
......@@ -880,7 +926,7 @@
let params = {
applyId: row.applyId,
refundAmount: row.refundAmount,
refundReason: row.markNo() + "gps押金退款",
refundReason: row.markNo + "gps押金退款",
operatorCode: getUId(),
}
const [err, res] = await to(fetch(ORDER_REFUND_URL, {
......@@ -896,7 +942,7 @@
return
}
if (res.code === 200) {
message.success('退款成功')
message.success('退款操作成功')
fetchOrders()
} else {
message.error(res.message)
......@@ -967,6 +1013,44 @@
const onEditCancel = () => {
showEditModal.value = false
}
// 退款订单相关
const onRefundCancel = () => {
showRefundModal.value = false
}
// 提交退款订单
const onRefundSubmit = async () => {
refundOrderFormRef.value?.validate(async (errors) => {
if (errors) return message.error('请检查表单是否填写完整')
loading.value = true
const [err, result] = await to(
fetch(ORDER_BATCH_REFUND_URL, {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
applyIds: checkedRowKeys.value,
refundAmount: refundOrderValue.refundAmount,
operatorCode: getUId(),
cmptId: getCId()
})
}).then(res => res.json())
)
loading.value = false
if (err) {
message.error(err)
return
}
if (result.code === 200) {
// 将所有的状态改为退款中
result.data.length && confirm(result.data.map(v => v.markNo + ":" + v.result).join('\n'))
await fetchOrders()
checkedRowKeys.value = []
} else {
message.error(result.message)
}
})
}
// 富文本编辑器 .setContent() .getContent()
let editor;
/***---------------- 自助选号相关 end -----------------*/
......@@ -1045,6 +1129,7 @@
depositForm.value.notice = res.data.notice
depositForm.value.content = res.data.content
depositForm.value.roadIds = res.data.roadIds.split(',').map(v => Number(v))
refundOrderValue.refundAmount = res.data.amount
editor.setContent(res.data.content)
}
} else {
......@@ -1053,55 +1138,8 @@
}
// 批量退款
const batchRefund = async () => {
let refundAmount = 0;
let confirmFlag = confirm('是否对选中的订单进行退款?')
if (!confirmFlag) {
message.error('已取消批量退款')
checkedRowKeys.value = []
return
}
confirmFlag = confirm('是否确定全额退款吗?')
if (!confirmFlag) {
// 请输入退款金额
refundAmount = prompt('请输入退款金额')
if (!refundAmount) {
message.error('请输入退款金额')
return
}
if (Number(refundAmount) > Number(depositForm.value.amount)) {
message.error('退款金额不能大于押金金额')
return
}
}
// 批量退款 调用接口
loading.value = true
const [err, result] = await to(
fetch(ORDER_BATCH_REFUND_URL, {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
applyIds: checkedRowKeys.value,
refundAmount: refundAmount > 0 ? Number(refundAmount) : null,
operatorCode: getUId(),
cmptId: getCId()
})
}).then(res => res.json())
)
loading.value = false
if (err) {
message.error(err)
return
}
if (result.code === 200) {
checkedRowKeys.value = []
result.data.length && confirm(result.data.map(v => v.markNo + ":" + v.result).join('\n'))
message.success('退款操作成功,等待微信反馈结果')
fetchOrders()
} else {
message.error(result.message)
}
showRefundModal.value = true
refundOrderValue.refundAmount = depositForm.value.amount
}
// 一键退款
const refundAll = async () => {
......@@ -1131,7 +1169,6 @@
}
if (result.code === 200) {
result.data.length && confirm(result.data.map(v => v.markNo + ":" + v.result).join('\n'))
message.success('退款操作成功,等待微信反馈结果')
fetchOrders()
} else {
message.error(result.message)
......@@ -1141,6 +1178,7 @@
onMounted(() => {
fetchOrders()
getCmptInfo()
getDeposit()
editor = UE.getEditor('rich-text-container');
})
......@@ -1186,6 +1224,13 @@
editOrderFormRef,
editOrder,
onEditCancel,
// 退款订单相关
refundOrderValue,
refundOrderRules,
refundOrderFormRef,
showRefundModal,
onRefundCancel,
onRefundSubmit,
}
}
})
......
......@@ -230,7 +230,7 @@
<n-form-item label="组别名称" path="roadName">
<div class="flex flex-col">
<n-input v-model:value="gunRuleValue.roadName" placeholder="请输入组别名称" />
<n-gradient-text type="warning">注:组别名仅支持数字和字母,并且不可重复</n-gradient-text>
<n-gradient-text type="warning">注:导入名单里的组别名要跟设置的组别名一致</n-gradient-text>
</div>
</n-form-item>
<n-form-item label="出发日期" path="startTime">
......@@ -498,8 +498,8 @@
const uploadUrl = window.location.origin + '/api-common/v1/upload?folder=gk/gunApply' + '&cmptId=' + getCId()
const downloadWeChatImgUrl = window.location.origin + '/api-common/v1/download-wechat-image'
// 添加全局 loading 指令
// const ECC_BASE_URL = "https://ecc.geexek.com"
const ECC_BASE_URL = "http://localhost:8081"
const ECC_BASE_URL = "https://ecc.geexek.com"
// const ECC_BASE_URL = "http://localhost:8081"
const SAVE_OR_UPDATE = ECC_BASE_URL + "/api-pick/v1/save-or-update-wave"
// 更新名单
const UPDATE_ENROLL_WAVE = ECC_BASE_URL + "/api-pick/v1/update-enroll-wave"
......@@ -760,6 +760,7 @@
// 更新菜单
const updateMenu = (value) => {
activeMenu.value = value
getGunRulesStats()
}
// 更新枪次选项
......@@ -925,6 +926,8 @@
const ruleIndex = ref(0)
// 删除确认弹窗
const showDeleteModal = ref(false)
// 是否是第一次加载
const isFirst = ref(false)
// 号码簿规则校验
const gunRuleRules = {
roadName: {
......@@ -949,7 +952,59 @@
ruleIndex.value = index
gunRuleValue.value = gunRules.value[index]
getPlayers()
if (!isFirst.value) return
getGunRulesStats()
}
// 获取分枪组别统计
const getGunRulesStats = async () => {
const params = {
cmptId: getCId()
}
loading.value = true;
// 发起请求
const [err, res] = await to(fetch(RULE_LIST + new URLSearchParams(params).toString(), {
method: "GET",
headers: {
'Content-Type': 'application/json'
},
}).then(res => res.json()))
loading.value = false
if (err) {
message.error(err.message)
}
if (res.code !== 200) return message.error(res.message)
// 获取所有分组的名单总数
const totalApplies = res.data.map(v => v.details.reduce((detailPre, detailCur) => detailPre + detailCur.totalReservations ?? 0, 0))
// 获取所有分组的名单总数
const request = res.data.map(v => {
const playerParams = {
cmptId: getCId(),
roadName: v.roadName,
current: 1,
size: 1,
}
return fetch(ENROLL_PAGE, {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(playerParams)
}).then(res => res.json())
})
let allPlayersTotals = []
await Promise.all(request).then(list => {
allPlayersTotals = list.map(v => v.data.total)
})
// 统计数据组装
gunRules.value.forEach((v, index) => {
v.totalPlayer = allPlayersTotals[index]
v.totalApply = totalApplies[index]
})
}
// 获取分枪组别列表
const getGunRules = async () => {
const params = {
......@@ -1006,6 +1061,7 @@
} else {
gunRuleValue.value = initialValue
}
isFirst.value = true
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment