直转审核

This commit is contained in:
hongchao 2025-09-02 22:52:43 +08:00
parent 99d17a57ac
commit 78493a06a2
3 changed files with 211 additions and 106 deletions

View File

@ -33,8 +33,9 @@
v-if="index < auditingList.length - 1"
class="step-line"
:class="{
'approved': item.isAccept === 1,
'rejected': item.isAccept !== 0 && item.isAccept !== 1
'approved': item.isAccept == 1,
'rejected': item.isAccept != 0 && item.isAccept != 1 ,
'pending': item.isAccept == 0
}"
></view>
<!-- 步骤标题和描述 -->
@ -61,7 +62,7 @@
}">{{ item.isAccept == 0 ? '待审批' : item.isAccept == 1 ? '已通过' : '已驳回' }}</text><br/>
审批人<text class="black-text">{{ item.auditBy ? item.auditBy : '' }}</text><br/>
审批时间<text class="black-text">{{ item.createTime ? item.createTime : '' }}</text><br/>
审批意见<text class="black-text">{{ '' }}</text>
审批意见<text class="black-text">{{ item.remark ? item.remark : '' }}</text>
</text>
</div>
</view>
@ -86,7 +87,7 @@
</uni-row>
</view>
<!-- 表单信息区域 -->
<scroll-view scroll-y style="height: 100vh;margin-top: 5px">
<scroll-view scroll-y style="height: 85vh;margin-top: 5px">
<view class="form-section">
<view class="section-header" @tap="toggleForm">
<text class="title">基本信息</text>
@ -94,26 +95,40 @@
</view>
<view class="form-content" :class="{ 'is-expanded': isExpanded }">
<uni-forms :model="formData" label-width="100" :border="true">
<uni-forms-item label="领料单位:" name="leaseUnit">
<span class="form-view">{{ formData.leaseUnit }}</span>
<uni-forms-item label="转出单位:" name="backUnitName">
<span class="form-view">{{ formData.backUnitName }}</span>
</uni-forms-item>
<uni-forms-item label="领料工程:" name="leaseProject">
<span class="form-view">{{ formData.leaseProject }}</span>
<uni-forms-item label="转出工程:" name="backProName">
<span class="form-view">{{ formData.backProName }}</span>
</uni-forms-item>
<uni-forms-item label="领料人:" name="leasePerson">
<span class="form-view">{{ formData.leasePerson }}</span>
<uni-forms-item label="转出人:" name="backMan">
<span class="form-view">{{ formData.backMan }}</span>
</uni-forms-item>
<!-- <uni-forms-item label="采购申请编号:" name="applyCode">
<span class="form-view">{{ formData.applyCode }}</span>
</uni-forms-item> -->
<uni-forms-item label="标准配置:" name="leaseUnit">
<span class="form-view">{{ formData.leaseUnit }}</span>
<uni-forms-item label="联系电话:" name="backPhone">
<span class="form-view">{{ formData.backPhone }}</span>
</uni-forms-item>
<uni-forms-item label="联系电话:" name="phone">
<span class="form-view">{{ formData.phone }}</span>
<uni-forms-item label="转入单位:" name="leaseUnitName">
<span class="form-view">{{ formData.leaseUnitName }}</span>
</uni-forms-item>
<uni-forms-item label="类型规格:" name="maTypeNames">
<span class="form-view">{{ formData.maTypeNames }}</span>
<uni-forms-item label="转入工程:" name="leaseProName">
<span class="form-view">{{ formData.leaseProName }}</span>
</uni-forms-item>
<uni-forms-item label="转入人:" name="leaseMan">
<span class="form-view">{{ formData.leaseMan }}</span>
</uni-forms-item>
<uni-forms-item label="联系电话:" name="leasePhone">
<span class="form-view">{{ formData.leasePhone }}</span>
</uni-forms-item>
<uni-forms-item label="附件:">
<div class="upload-container">
<div class="image-preview" v-for="(img, index) in imgList" :key="index">
<image :src="img.url" mode="aspectFill"></image>
<PreviewImg :imgUrl="img.url" />
</div>
</div>
</uni-forms-item>
</uni-forms>
</view>
@ -126,20 +141,24 @@
<!-- 表头行 -->
<uni-tr>
<uni-th width="60px" style="font-size: 24rpx;" align="center">序号</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">直转数量</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">类型名称</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">规格型号</uni-th>
<uni-th width="70px" style="font-size: 24rpx;" align="center">计量单位</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">预领数量</uni-th>
<uni-th width="60px" style="font-size: 24rpx;" align="center">备注</uni-th>
<uni-th width="80px" style="font-size: 24rpx;" align="center">计量单位</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">领料数量</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">领料人</uni-th>
<uni-th width="100px" style="font-size: 24rpx;" align="center">领料日期</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr v-for="(item,index) in codeDeviceList" :key="item.id">
<uni-td style="font-size: 24rpx;text-align: center;">{{ index + 1 }}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.maTypeName}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.typeName}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.directNum}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.typeName}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.typeModelName}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.unitName}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.preNum}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.remark}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.useNum}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.leasePerson}}</uni-td>
<uni-td style="font-size: 24rpx;text-align: center;">{{item.startTime}}</uni-td>
</uni-tr>
</uni-table>
</div>
@ -157,10 +176,12 @@
import { ref, computed, onUnmounted } from 'vue'
import { onLoad, onShow, } from '@dcloudio/uni-app'
import { getCodeDeviceListAPI, setOutboundNumAPI, } from '@/services/picking/outbound.js'
import { getAuditInfoAPI,receiveDetailAPI,submitAuditingApi,getNodeAuditStatusAPI } from '@/services/picking/review.js'
import { getNodeAuditStatusAPI } from '@/services/picking/review.js'
import { getAuditInfoAPI,receiveDetailAPI,submitAuditingApi} from '@/services/directApply/review.js'
import { appLoginAPI, getUserInfoAPI, iwsLoginAPI,getConfigApi } from '@/services/index.js'
import { debounce } from 'lodash-es'
import { useMemberStore } from '@/stores'
import PreviewImg from '@/components/PreviewImg/index.vue'
const memberStore = useMemberStore()
// const query = defineProps() //
// const queryParams = JSON.parse(query.queryParams)
@ -171,7 +192,7 @@ const queryParams = ref({
const queryParamsInfo = ref({})
const formData = ref({})
const codeDeviceList = ref([])
const imgList = ref([]) //
const total = ref(0)
const auditStatus = ref('')
//
@ -195,6 +216,7 @@ const auditingParams = ref({
taskCode: '', //
unitName: '', //
projectName: '', //
taskTypeId: 16, // id
})
const auditingList = ref([]) //
@ -216,6 +238,7 @@ onLoad(async(options) => {
if (origin.indexOf('params') != -1) {
queryParams.value = JSON.parse(options.params)
auditingParams.value.taskId = queryParams.value.taskId
auditingParams.value.nodeId = queryParams.value.nodeId
type.value = queryParams.value.type
//
initPageData();
@ -224,6 +247,7 @@ onLoad(async(options) => {
queryParams.value.taskId = urlParams.get('taskId');
queryParams.value.id = urlParams.get('id');
auditingParams.value.taskId = urlParams.get('taskId')
auditingParams.value.nodeId = urlParams.get('nodeId')
const ticketMatch = origin.match(/ticket=([^&]*)/);
const ticket = ticketMatch ? ticketMatch[1] : '';
@ -281,22 +305,21 @@ onShow(() => {
//
const getReviewInfo = async (id) => {
console.log("yyyyyyyyyy",id)
const res = await receiveDetailAPI(id)
const res = await receiveDetailAPI({id:id})
console.log("zzzzzzzzz",res)
formData.value=res.data.leaseApplyInfo;
formData.value = res.data;
imgList.value = res.data.dirUrls
// queryCodeParams.value.typeId = queryParams.value.typeId;
// queryCodeParams.value.pageNum = 1;
codeDeviceList.value = res.data.leaseApplyDetailsList;
codeDeviceList.value = res.data.directApplyDetails;
// getCodeDeviceListData()//
}
const fetchAuditInfo = async () => {
try {
console.log('xxxxxxxxxxxxxx',queryParams.value.id)
console.log('xxxxxxxxxxxxxx',queryParams.value)
// API
const res = await getAuditInfoAPI({taskId:queryParams.value.taskId})
const res = await getAuditInfoAPI({taskId:queryParams.value.taskId,taskType:16})
console.log('🚀 ~ fetchAuditInfo ~ res:', res)
auditingList.value = res.rows
@ -356,9 +379,9 @@ const handleReview = (action) => {
if (res.confirm) {
const comment = res.content;
//
const currentAuditing = auditingList.value.filter(e => e.configValues.includes(userId.value)) //
const currentIndex = auditingList.value.findIndex(e => e.configValues.includes(userId.value)) //
auditingParams.value.remark = comment
const currentAuditing = auditingList.value.filter(e => e.nodeId.toString().includes(auditingParams.value.nodeId?.toString() || '')) //
const currentIndex = auditingList.value.findIndex(e => e.nodeId.toString().includes(auditingParams.value.nodeId?.toString() || '')) //
console.log("hhhhhhh",currentAuditing,currentIndex)
const { recordId, id, typeId, } = currentAuditing[0]
Object.assign(auditingParams.value, {
typeId,
@ -373,6 +396,8 @@ const handleReview = (action) => {
auditingParams.value.unitName = formData.value.leaseUnit
auditingParams.value.projectName = formData.value.leaseProject
auditingParams.value.taskTypeId = 16
auditingParams.value.remark = res.content
if (currentIndex !== auditingList.value.length - 1) {
auditingParams.value.nextNodeId =auditingList.value[currentIndex + 1].id
}
@ -451,6 +476,39 @@ const onHandleOutbound = async () => {
</script>
<style lang="scss" scoped>
/* 在style部分添加 */
.upload-container {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.upload {
width: 160rpx;
height: 160rpx;
background-color: #f7f8fa;
border: 2rpx dashed #d9d9d9;
border-radius: 12rpx;
display: flex;
justify-content: center;
align-items: center;
font-size: 48rpx;
color: #bfbfbf;
transition: all 0.3s ease;
}
.image-preview {
width: 160rpx;
height: 160rpx;
position: relative;
border-radius: 12rpx;
overflow: hidden;
}
.image-preview image {
width: 100%;
height: 100%;
}
.black-text {
color: #000;
@ -462,15 +520,16 @@ const onHandleOutbound = async () => {
.custom-steps.vertical {
display: flex;
flex-direction: column;
padding-left: 100rpx; /* 增加左侧留白 */
margin: 0 auto;
// padding-left: 100rpx; /* */
padding-right: 20rpx;
padding-top: 5rpx;
padding-top: 15rpx;
}
.custom-steps.vertical .step-item {
display: flex;
flex-direction: row;
margin-bottom: 5rpx; /* 增加步骤项间距 */
margin-bottom: 0rpx; /* 增加步骤项间距 */
position: relative;
}
@ -485,7 +544,7 @@ const onHandleOutbound = async () => {
.custom-steps.vertical .step-line {
position: absolute;
width: 2px;
top: 26px;
top: 24px;
bottom: -30px;
left: 13px;
// transform: translateX(-50%);
@ -494,9 +553,9 @@ const onHandleOutbound = async () => {
.custom-steps.vertical .step-content {
flex: 1;
text-align: left;
padding-top: 6rpx;
padding-top: 3rpx;
padding-right: 20rpx;
padding-right: 3rpx;
}
// .step-item {
@ -548,6 +607,10 @@ const onHandleOutbound = async () => {
background-color: #19a4a0;
}
.step-line.pending {
background-color: #19a4a0;
}
// .step-content {
// display: flex;
// flex-direction: column;
@ -872,7 +935,7 @@ const onHandleOutbound = async () => {
transition: max-height 0.3s ease-out;
&.is-expanded {
max-height: 800rpx; /* 高度可进一步减小 */
max-height: 1100rpx; /* 高度可进一步减小 */
}
:deep(.uni-forms) {
@ -897,4 +960,4 @@ const onHandleOutbound = async () => {
}
}
}
</style>
</style>

View File

@ -69,18 +69,18 @@
<div class="cont">
<uni-tag
:text="
item.taskStatus === 2 ? '已完成' :
item.taskStatus === 3 ? '已驳回' :
item.taskStatus === 1 ? '审核中' :
item.flowStatus == 2 ? '已完成' :
item.flowStatus == 3 ? '已驳回' :
item.flowStatus == 1 ? '审核中' :
'待审核'
"
:type="
item.taskStatus === 2 ? 'success' :
item.taskStatus === 3 ? 'error' :
item.taskStatus === 1 ? 'primary' :
item.flowStatus == 2 ? 'success' :
item.flowStatus == 3 ? 'error' :
item.flowStatus == 1 ? 'primary' :
'warning'
"
:custom-style="item.taskStatus === 4 ? successStyle : ''"
:custom-style="item.flowStatus == 4 ? successStyle : ''"
/>
</div>
</div>
@ -94,47 +94,34 @@
<uni-row :gutter="24">
<uni-col :span="6">申请人</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.createBy }}</div>
<div class="cont">{{ item.leaseMan }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="6">领料单号</uni-col>
<uni-col :span="6">转出单位</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.code }}</div>
<div class="cont">{{ item.backUnitName }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="6">领料物资</uni-col>
<uni-col :span="6">转出工程</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.maTypeNames }}</div>
<div class="cont">{{ item.backProName }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="6">领料单位</uni-col>
<uni-col :span="6">转入单位</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.leaseUnit }}</div>
<div class="cont">{{ item.leaseUnitName }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="6">领料工程</uni-col>
<uni-col :span="6">转入工程</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.leaseProject }}</div>
<div class="cont">{{ item.leaseProName }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="6">领料人</uni-col>
<uni-col :span="18">
<div class="cont">{{ item.leasePerson }}</div>
</uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="8">领料人电话</uni-col>
<uni-col :span="16">
<div class="cont">{{ item.phone }}</div>
</uni-col>
</uni-row>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
@ -147,7 +134,7 @@
<script setup>
import { ref, reactive, computed } from 'vue'
import { getPickingReviewListAPI } from '@/services/picking/review.js'
import { getDirectApplyListAPI } from '@/services/directApply/review.js'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { debounce } from 'lodash-es'
import { onBackPress } from '@dcloudio/uni-app'
@ -194,22 +181,22 @@ const viewOptions = reactive([
// /
const onReview = (item) => {
if(item.taskStatus === 3 || item.taskStatus === 2){
if(item.flowStatus == 3 || item.flowStatus == 2){
uni.navigateTo({
url: `/pages/businessAudit/directAudit/details?params=${JSON.stringify({
id: item.id,
taskId: item.taskId,
taskId: item.flowId,
flowId: item.flowId,
nodeId: item.nodeId,
type: 2,
})}`,
})
}else if((item.taskStatus === 1 || item.taskStatus === 0) && typeof item.configValue === 'string' && item.configValue.includes(userId.value)){
console.log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",userId)
}else if((item.flowStatus == 1 || item.flowStatus == 0) && typeof item.configValue === 'string' && item.configValue.includes(userId.value)){
console.log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",item)
uni.navigateTo({
url: `/pages/businessAudit/directAudit/details?params=${JSON.stringify({
id: item.id,
taskId: item.taskId,
taskId: item.flowId,
flowId: item.flowId,
nodeId: item.nodeId,
type: 1,
@ -254,31 +241,32 @@ const getTableList = async (isTap = false,isSearch = false) => {
tableList.value = [];
}
console.log('queryParams.value查询参数', queryParams.value)
const res = await getPickingReviewListAPI(queryParams.value)
const res = await getDirectApplyListAPI(queryParams.value)
console.log('res列表数据', res)
total.value = res.data.total
if (isTap) {
tableList.value = res.data.rows
} else {
if (res.data.rows.length == 0) {
tableList.value = []
} else {
// tableList.value = res.data.rows
// tableList.value = [...tableList.value, ...res.data.rows]
const merged = [...tableList.value, ...res.data.rows]
// id
const unique = []
const seen = new Set()
for (const item of merged) {
if (!seen.has(item.taskId)) {
seen.add(item.taskId)
unique.push(item)
}
}
console.log('🚀 ~ getTableList ~ unique:', unique)
tableList.value = unique
}
}
total.value = res.total
tableList.value = res.rows
// if (isTap) {
// tableList.value = res.rows
// } else {
// if (res.rows.length == 0) {
// tableList.value = []
// } else {
// // tableList.value = res.rows
// // tableList.value = [...tableList.value, ...res.rows]
// const merged = [...tableList.value, ...res.rows]
// // id
// const unique = []
// const seen = new Set()
// for (const item of merged) {
// if (!seen.has(item.taskId)) {
// seen.add(item.taskId)
// unique.push(item)
// }
// }
// console.log('🚀 ~ getTableList ~ unique:', unique)
// tableList.value = unique
// }
// }
} catch (error) {
console.log('🚀 ~ getTableList ~ error:', error)
} finally {

View File

@ -0,0 +1,54 @@
import { http } from '@/utils/http'
/**
* 领料审核 ---- 列表查询
*/
export const getDirectApplyListAPI = (data) => {
return http({
method: 'GET',
url: '/material/directAudit/list',
data,
})
}
/**
* 领料审核 ---- 流程查询
*/
export const getAuditInfoAPI = (data) => {
return http({
method: 'GET',
url: '/material/sysWorkflowNode/listByTaskId',
data,
})
}
/**
* 领料审核 ---- 基本信息查询id
*/
export const receiveDetailAPI = (data) => {
return http({
method: 'GET',
url: '/material/directRotation/getInfo',
data,
})
}
/**
* 领料出库 ---- 出库
*/
export const submitAuditingApi = (data) => {
return http({
method: 'POST',
url: '/material/sysWorkflowRecordHistory/directUpdate',
data,
})
}
export const getNodeAuditStatusAPI = (data) => {
return http({
method: 'GET',
url: '/material/sysWorkflowRecordHistory/getAuditStatus',
data,
})
}