Commit 39d606a1 authored by cxr's avatar cxr

feat(system): 华中阜外结算优化需求

小程序端增加批量审批功能
parent d1b81e08
......@@ -10,6 +10,7 @@
flex: 1;
overflow-y: scroll;
width: 100%;
padding-bottom: 120rpx; /* 为批量操作按钮留出空间 */
}
.header {
z-index: 1000;
......@@ -61,9 +62,32 @@
margin-top: 10rpx;
padding-left: 20rpx;background: white;height: 150rpx;width: 100%;
box-sizing: border-box;
display: flex;flex-direction: column;
display: flex;flex-direction: row;
align-items: center;
justify-content: space-between;
}
.item-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
}
.batch-actions {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: white;
padding: 20rpx;
box-sizing: border-box;
display: flex;
flex-direction: row;
justify-content: space-around;
border-top: 1rpx solid #EDEDED;
z-index: 100;
}
.van-tabs__line {
z-index: 1;
left: 0;
......@@ -152,7 +176,13 @@
</div>
<van-empty v-if="orderList.length === 0" description="暂无待审批订单" />
<div @tap="item_click(item)" v-for="(item,index) in orderList" class="item">
<div class="item" v-for="(item,index) in orderList" :key="index">
<van-checkbox
v-if="platform === 'ckzv' || platform === 'ckzvSydw'"
value="{{ item.selected }}"
@change="onCheckboxChange($event, item, index)"
/>
<div class="item-content" @tap="item_click(item)">
{{ item.orderSn }}
<div v-if="platform === 'ckzv' || platform === 'ckzvSydw'">
<van-tag plain type="primary">{{ item.omsOrderApproveItemVoList[0].projectSources || '' }}</van-tag>
......@@ -160,6 +190,43 @@
</div>
</div>
</div>
<!-- 批量操作按钮 -->
<div v-if="platform === 'ckzv' || platform === 'ckzvSydw'" class="batch-actions">
<van-button
type="primary"
@tap="batchPass"
:loading="batchProcessing"
:disabled="!hasSelected || batchProcessing"
>
批量通过{{ hasSelected ? '(' + selectedCount + ')' : '' }}
</van-button>
<van-button
type="warning"
@tap="openBatchRefuseDialog"
:loading="batchProcessing"
:disabled="!hasSelected || batchProcessing"
>
批量拒绝{{ hasSelected ? '(' + selectedCount + ')' : '' }}
</van-button>
</div>
<!-- 批量拒绝原因对话框 -->
<van-dialog
@close="onBatchRefuseClose"
@cancel="cancelBatchRefuse"
use-slot
@confirm="batchRefuse"
theme="round-button"
show-cancel-button
title="填写拒绝原因"
:show="showBatchRefuseDialog"
>
<div style="padding: 100rpx 40rpx;width: 550rpx">
<input style="width: 550rpx" v-model="batchRefuseReason" placeholder="请输入拒绝原因"/>
</div>
</van-dialog>
</div>
</template>
<script>
......@@ -205,9 +272,21 @@ wepy.page({
columns: [
{ name: '阜外华中心血管病医院' },
{ name: '河南心血管病中心(国家心血管病中心华中 分中心)' }
]
],
batchProcessing: false, // 批量处理中
showBatchRefuseDialog: false, // 显示批量拒绝对话框
batchRefuseReason: '', // 批量拒绝原因
},
computed: {
// 获取选中的订单数量
selectedCount() {
return this.orderList.filter(item => item.selected === true).length
},
// 判断是否有选中的订单
hasSelected() {
return this.selectedCount > 0
}
},
computed: {},
methods: {
item_click(item){
let data = JSON.parse(JSON.stringify(item))
......@@ -298,7 +377,11 @@ wepy.page({
},
success: (res) => {
if (res.data.success) {
this.orderList = res.data.data
// 初始化每个订单的 selected 字段为 false
this.orderList = (res.data.data || []).map(item => ({
...item,
selected: false
}))
} else if(res.statusCode === 401) {
wx.showModal({
title: '提示',
......@@ -348,7 +431,11 @@ wepy.page({
},
success: (res) => {
if (res.data.success) {
this.orderList = res.data.data
// 初始化每个订单的 selected 字段为 false
this.orderList = (res.data.data || []).map(item => ({
...item,
selected: false
}))
} else if(res.statusCode === 401) {
wx.showModal({
title: '提示',
......@@ -406,6 +493,270 @@ wepy.page({
} else {
this.getSydwList()
}
},
onCheckboxChange(event, item, index) {
// 获取 checkbox 的选中状态
let checked = false
if (event.$wx && event.$wx.detail !== undefined) {
checked = event.$wx.detail
} else if (event.detail !== undefined) {
checked = event.detail
} else {
// 如果无法获取,则切换当前状态
checked = !item.selected
}
// 确保 checked 是布尔值
const isChecked = checked === true || checked === 'true' || checked === 1 || checked === '1'
// 在 wepy 中,直接修改对象属性可能不会触发响应式更新
// 使用 $set 或者重新赋值整个数组来确保响应式更新
if (this.$set) {
this.$set(this.orderList[index], 'selected', isChecked)
} else {
// 如果 $set 不存在,则通过重新赋值整个数组来触发更新
const newOrderList = [...this.orderList]
newOrderList[index] = {
...newOrderList[index],
selected: isChecked
}
this.orderList = newOrderList
}
},
batchPass() {
const selectedOrders = this.orderList.filter(item => item.selected === true)
if (selectedOrders.length === 0) {
wx.showToast({
title: '请选择要审批的订单',
icon: 'none'
})
return
}
wx.showModal({
title: "提示",
content: `确认批量通过 ${selectedOrders.length} 个订单吗?`,
success: (res) => {
if (res.confirm) {
this.executeBatchPass()
}
}
})
},
executeBatchPass() {
this.batchProcessing = true
wx.showLoading({
title: '处理中...'
})
const requestURL = wx.getStorageSync('requestURL')
// 获取选中的订单
const selectedOrders = this.orderList.filter(item => item.selected === true)
const selectedCount = selectedOrders.length
let successCount = 0
let failCount = 0
let processedCount = 0
const successTaskIds = [] // 记录成功的taskId
// 循环调用通过接口
selectedOrders.forEach((order, index) => {
const taskId = order.taskId
wx.request({
url: `${requestURL}/approveOpera/pass`,
method: 'post',
header: {
'Content-Type': 'application/json',
'token': this.userInfo.token
},
data: {
taskId: taskId,
option: '通过',
type: '审批'
},
success: (res) => {
processedCount++
if (res.data.success) {
successCount++
successTaskIds.push(taskId)
} else {
failCount++
}
// 所有请求完成后处理
if (processedCount === selectedCount) {
this.batchProcessing = false
wx.hideLoading()
// 从列表中移除已成功的订单
this.orderList = this.orderList.filter(item => {
return successTaskIds.indexOf(item.taskId) === -1
})
// 显示结果
let message = `批量通过完成!成功:${successCount},失败:${failCount}`
wx.showModal({
title: "提示",
showCancel: false,
content: message,
success: () => {
// 刷新列表
if (this.activeTitle === '试剂耗材') {
this.getList()
} else {
this.getSydwList()
}
}
})
}
},
fail: (err) => {
processedCount++
failCount++
if (processedCount === selectedCount) {
this.batchProcessing = false
wx.hideLoading()
// 从列表中移除已成功的订单
this.orderList = this.orderList.filter(item => {
return successTaskIds.indexOf(item.taskId) === -1
})
// 清空选择
let message = `批量通过完成!成功:${successCount},失败:${failCount}`
wx.showModal({
title: "提示",
showCancel: false,
content: message,
success: () => {
if (this.activeTitle === '试剂耗材') {
this.getList()
} else {
this.getSydwList()
}
}
})
}
}
})
})
},
openBatchRefuseDialog() {
const selectedOrders = this.orderList.filter(item => item.selected === true)
if (selectedOrders.length === 0) {
wx.showToast({
title: '请选择要审批的订单',
icon: 'none'
})
return
}
this.showBatchRefuseDialog = true
this.batchRefuseReason = ''
},
onBatchRefuseClose() {
this.showBatchRefuseDialog = false
},
cancelBatchRefuse() {
this.showBatchRefuseDialog = false
wx.showToast({
title: '您取消了批量拒绝',
icon: 'none'
})
},
batchRefuse() {
if (!this.batchRefuseReason || this.batchRefuseReason.trim() === '') {
wx.showToast({
title: '请输入拒绝原因',
icon: 'none'
})
return
}
this.showBatchRefuseDialog = false
this.executeBatchRefuse()
},
executeBatchRefuse() {
this.batchProcessing = true
wx.showLoading({
title: '处理中...'
})
const requestURL = wx.getStorageSync('requestURL')
// 获取选中的订单
const selectedOrders = this.orderList.filter(item => item.selected === true)
const selectedCount = selectedOrders.length
let successCount = 0
let failCount = 0
let processedCount = 0
const successTaskIds = [] // 记录成功的taskId
// 循环调用拒绝接口
selectedOrders.forEach((order, index) => {
const taskId = order.taskId
wx.request({
url: `${requestURL}/approveOpera/refuse`,
method: 'post',
header: {
'Content-Type': 'application/json',
'token': this.userInfo.token
},
data: {
taskId: taskId,
option: this.batchRefuseReason,
type: '审批'
},
success: (res) => {
processedCount++
if (res.data.success) {
successCount++
successTaskIds.push(taskId)
} else {
failCount++
}
// 所有请求完成后处理
if (processedCount === selectedCount) {
this.batchProcessing = false
wx.hideLoading()
// 从列表中移除已成功的订单
this.orderList = this.orderList.filter(item => {
return successTaskIds.indexOf(item.taskId) === -1
})
this.batchRefuseReason = ''
// 显示结果
let message = `批量拒绝完成!成功:${successCount},失败:${failCount}`
wx.showModal({
title: "提示",
showCancel: false,
content: message,
success: () => {
// 刷新列表
if (this.activeTitle === '试剂耗材') {
this.getList()
} else {
this.getSydwList()
}
}
})
}
},
fail: (err) => {
processedCount++
failCount++
if (processedCount === selectedCount) {
this.batchProcessing = false
wx.hideLoading()
// 从列表中移除已成功的订单
this.orderList = this.orderList.filter(item => {
return successTaskIds.indexOf(item.taskId) === -1
})
this.batchRefuseReason = ''
let message = `批量拒绝完成!成功:${successCount},失败:${failCount}`
wx.showModal({
title: "提示",
showCancel: false,
content: message,
success: () => {
if (this.activeTitle === '试剂耗材') {
this.getList()
} else {
this.getSydwList()
}
}
})
}
}
})
})
}
},
onShow() {
......@@ -653,7 +1004,9 @@ header: '~@/components/header',
"van-tabs": "module:@vant/weapp/lib/tabs/index",
"van-tab": "module:@vant/weapp/lib/tab/index",
"van-tag": "module:@vant/weapp/lib/tag/index",
"van-field": "module:@vant/weapp/lib/field/index"
"van-field": "module:@vant/weapp/lib/field/index",
"van-checkbox": "module:@vant/weapp/lib/checkbox/index",
"van-checkbox-group": "module:@vant/weapp/lib/checkbox-group/index"
}
}
</config>
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