Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
db_qms_wx
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘怀志
db_qms_wx
Commits
430057e8
Commit
430057e8
authored
Apr 02, 2025
by
刘怀志
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat(审批详情):追溯审批完
parent
072e77a0
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1042 additions
and
546 deletions
+1042
-546
approve.js
api/system/approve.js
+158
-130
drawerShowEngineTrace.vue
pages/approval_detail/drawerShowEngineTrace.vue
+884
-416
No files found.
api/system/approve.js
View file @
430057e8
import
request
from
'@/utils/request'
const
ProcessGroupEnum
=
{
/**
* 单据类型 AE
*/
AE
:
'1'
,
/**
* 单据类型 AE
*/
AE
:
'1'
,
/**
* 单据类型 MC
*/
MC
:
'2'
,
/**
* 单据类型 MC
*/
MC
:
'2'
,
/**
* 单据类型 DC
*/
DC
:
'3'
/**
* 单据类型 DC
*/
DC
:
'3'
}
/**
* Ae流程实例 - 分页查询
...
...
@@ -21,11 +21,11 @@ const ProcessGroupEnum = {
* @returns {*}
*/
export
function
queryInstanceListAeByPage
(
query
)
{
return
request
({
url
:
'/sysprocessinstance/page/ae'
,
method
:
'get'
,
params
:
query
})
return
request
({
url
:
'/sysprocessinstance/page/ae'
,
method
:
'get'
,
params
:
query
})
}
/**
* 查询流程列表
...
...
@@ -33,11 +33,11 @@ export function queryInstanceListAeByPage(query) {
* @returns {AxiosPromise}
*/
export
function
queryInstanceByPage
(
params
)
{
return
request
({
url
:
`/process/instance/list`
,
method
:
'get'
,
params
})
return
request
({
url
:
`/process/instance/list`
,
method
:
'get'
,
params
})
}
/**
* 流程实例 - 获取详情
...
...
@@ -45,10 +45,10 @@ export function queryInstanceByPage(params) {
* @returns {*}
*/
export
function
getProcessNodeByInstanceId
(
instanceId
)
{
return
request
({
url
:
`/sysprocessbasic/getProcessNode/
${
instanceId
}
`
,
method
:
'get'
})
return
request
({
url
:
`/sysprocessbasic/getProcessNode/
${
instanceId
}
`
,
method
:
'get'
})
}
/**
* 管理员审批
...
...
@@ -56,116 +56,144 @@ export function getProcessNodeByInstanceId(instanceId) {
* @returns {*}
*/
export
function
approveByAdmin
(
query
)
{
// 需要根据传回的url判断是哪个接口
const
{
url
}
=
query
if
(
query
.
processGroup
===
ProcessGroupEnum
.
MC
)
{
return
MCService
({
url
:
url
,
method
:
'post'
,
params
:
query
})
}
else
if
(
query
.
processGroup
===
ProcessGroupEnum
.
DC
)
{
return
DCService
({
url
:
url
,
method
:
'post'
,
params
:
query
})
}
else
{
return
request
({
url
:
url
,
method
:
'post'
,
params
:
query
})
}
}
export
function
getProcessInstanceStatus
(
instanceId
)
{
return
request
({
url
:
`/sysprocessbasic/getProcessInstanceStatus/
${
instanceId
}
`
,
method
:
'get'
// 需要根据传回的url判断是哪个接口
const
{
url
}
=
query
if
(
query
.
processGroup
===
ProcessGroupEnum
.
MC
)
{
return
MCService
({
url
:
url
,
method
:
'post'
,
params
:
query
})
}
// 1. 工具点检_根据流程实例id查找流程实例审批详情
export
function
getToolProcessDetail
(
businessId
)
{
return
request
({
url
:
'/toolInspectMonitor/getDetail/'
+
businessId
,
method
:
'get'
,
}
else
if
(
query
.
processGroup
===
ProcessGroupEnum
.
DC
)
{
return
DCService
({
url
:
url
,
method
:
'post'
,
params
:
query
})
}
// 2. 工具点检_工具点检流程审批
export
function
toolProcessGxApproval
(
approve
)
{
}
else
{
return
request
({
url
:
'/toolInspectMonitor/processToolApproval'
,
url
:
url
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
params
:
query
})
}
// 1. 生产辅材_根据流程实例id查找流程实例审批详情
}
export
function
getProcessInstanceStatus
(
instanceId
)
{
return
request
({
url
:
`/sysprocessbasic/getProcessInstanceStatus/
${
instanceId
}
`
,
method
:
'get'
})
}
// 1. 工具点检_根据流程实例id查找流程实例审批详情
export
function
getToolProcessDetail
(
businessId
)
{
return
request
({
url
:
'/toolInspectMonitor/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
// 2. 工具点检_工具点检流程审批
export
function
toolProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/toolInspectMonitor/processToolApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
// 1. 生产辅材_根据流程实例id查找流程实例审批详情
export
function
getMateriaProcessDetail
(
businessId
)
{
return
request
({
url
:
'/aeauxiliarymaterial/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
// 1. 设备标定_根据流程实例id查找流程实例审批详情
return
request
({
url
:
'/aeauxiliarymaterial/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
// 1. 设备标定_根据流程实例id查找流程实例审批详情
export
function
getSignProcessDetail
(
businessId
)
{
return
request
({
url
:
'/qc/equipment/sign/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
// 1. 设备TPM_根据流程实例id查找流程实例审批详情
return
request
({
url
:
'/qc/equipment/sign/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
// 1. 设备TPM_根据流程实例id查找流程实例审批详情
export
function
getTpmProcessDetail
(
businessId
)
{
return
request
({
url
:
'/qc/equipment/tpm/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
export
function
materiaProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/aeauxiliarymaterial/processMaterialApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
signProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/qc/equipment/sign/processCalibrationApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
tpmProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/qc/equipment/tpm/processTpmApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
getCompletionDetail
(
businessId
)
{
return
request
({
url
:
'/traceability/getCompletion/'
+
businessId
,
method
:
'get'
,
})
}
export
function
processCompletionApproval
(
approve
)
{
return
request
({
url
:
'/traceability/processCompletionApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
\ No newline at end of file
return
request
({
url
:
'/qc/equipment/tpm/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
export
function
materiaProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/aeauxiliarymaterial/processMaterialApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
signProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/qc/equipment/sign/processCalibrationApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
tpmProcessGxApproval
(
approve
)
{
return
request
({
url
:
'/qc/equipment/tpm/processTpmApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
getCompletionDetail
(
businessId
)
{
return
request
({
url
:
'/traceability/getCompletion/'
+
businessId
,
method
:
'get'
,
})
}
export
function
processCompletionApproval
(
approve
)
{
return
request
({
url
:
'/traceability/processCompletionApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
export
function
getTraceabilityDetail
(
businessId
)
{
return
request
({
url
:
'/traceability/getDetail/'
+
businessId
,
method
:
'get'
,
})
}
/**
* 根据产线id查询工序
* @param query
* @returns {AxiosPromise}
*/
export
function
getGxByProLinId
(
query
)
{
return
request
({
url
:
'/aeprolinegx/getGxByProLinId'
,
method
:
'get'
,
params
:
query
})
}
export
function
processCalibrationApproval
(
approve
)
{
return
request
({
url
:
'/traceability/processCalibrationApproval'
,
method
:
'post'
,
data
:
approve
,
headers
:
{
'Content-Type'
:
'application/json;charset=UTF-8'
// 接口修改传参类型
}
})
}
\ No newline at end of file
pages/approval_detail/drawerShowEngineTrace.vue
View file @
430057e8
<!-- 00016(铸造科对发动机装配科发起追溯) 00017(机加工科对发动机装配科发起追溯) 审批详情 -->
<
template
>
<view
class=
"base-detail"
>
<ya-navbar
title=
"审批详情drawerShowEngineTrace"
:left-icon-color=
"'#fff'"
:bg-style=
"'#333399'"
:title-style=
"'color: #fff;font-weight: 500;font-size: 35rpx;'"
/>
<view
class=
"container"
>
<view
class=
"title"
>
基础数据变更(
{{
label
}}
)
</view
>
<!-- 步骤图区 --
>
<view
class=
"step-container
"
>
<vertical-steps
:steps=
"steps"
:current-step=
"1"
>
<!-- 自定义内容
-->
<template
v-for=
"(step, index) in steps"
#[`
content-
$
{index}`]
>
<!-- 发起人 --
>
<template
v-if=
"index === 0"
>
<view
class=
"custom-table"
>
<view
class=
"subTitleClass"
>
<view
class=
"subRow
"
>
<view
class=
"subTit
le"
>
员工姓名
</view
>
<view
class=
"subContent"
>
{{
step
.
content
.
userName
}}
</view>
<view
class=
"base-detail"
>
<ya-navbar
title=
"审批详情"
:left-icon-color=
"'#fff'"
:bg-style=
"'#333399'"
:title-style=
"'color: #fff;font-weight: 500;font-size: 35rpx;'"
/
>
<view
class=
"container"
>
<view
class=
"title
"
>
{{
processName
}}
</view>
<!-- 步骤图区
-->
<view
class=
"step-container"
>
<vertical-steps
:steps=
"steps"
:current-step=
"1"
>
<!-- 自定义内容 --
>
<template
v-for=
"(step, index) in steps"
#[`
content-
$
{index}`]
>
<!-- 发起人 --
>
<template
v-if=
"index === 0
"
>
<view
class=
"custom-tab
le"
>
<view
class=
"subTitleClass"
>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
追溯批次号
</view
>
<view
class=
"subContent"
>
{{
instanceDetail
.
formDto
.
traceableNumber
||
'-'
}}
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
员工职级
</view>
<view
class=
"subContent"
>
{{
getLabelByValue
(
jobLevelList
,
step
.
content
.
rank
)
}}
</view>
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
发起科室
</view>
<view
class=
"subContent"
>
{{
getLabelByValue
(
initiateDepartmentList
,
instanceDetail
.
formDto
.
initiateDepartment
)
||
'-'
}}
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
创建日期
</view>
<view
class=
"subContent"
>
{{
parseTimeA
(
step
.
content
.
createTime
,
'YYYY/MM/DD HH:mm'
)
}}
</view>
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
发起人
</view>
<view
class=
"subContent"
>
{{
instanceDetail
.
formDto
.
initiateUserName
}}
</view>
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
追溯部品类型
</view>
<view
class=
"subContent"
>
{{
getLabelByValue
(
traceablePartsTypeList
,
instanceDetail
.
formDto
.
partType
)
}}
</view>
</view>
</view>
</
template
>
<!-- 审批人 -->
<
template
v-else
>
<view
class=
"custom-table"
>
<view
class=
"subTitleClass"
>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
部门
</view>
</view>
</
template
>
<!-- 审批人 -->
<
template
v-else
>
<u-collapse
v-for=
"(item) in step.content"
:border=
"false"
@
change=
"change"
@
close=
"close"
@
open=
"open"
>
<u-collapse-item
:title=
"item.configApproveUserName"
name=
"configApproveUserName"
>
<view
class=
"custom-table-collapse"
>
<view
class=
"subTitleClass-collapse"
>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
部门
</view>
<view
class=
"subContent"
>
{{
step
.
content
.
a
pproveDeptName
}}
{{
item
.
configA
pproveDeptName
}}
</view>
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
生产角色
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
生产角色
</view>
<view
class=
"subContent"
>
{{
step
.
content
.
a
pproveRoleName
||
'无'
}}
{{
item
.
configA
pproveRoleName
||
'无'
}}
</view>
</view>
<view
class=
"subRow"
>
<view
class=
"subTitle"
>
员工姓名
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
处理结果
</view>
<view
class=
"subContent"
>
{{
step
.
content
.
approveUser
||
'无'
}}
{{
item
.
approveResult
||
'无'
}}
</view>
</view>
</view>
</view>
</
template
>
</view>
</u-collapse-item>
</u-collapse>
</
template
>
</vertical-steps>
</view>
<!-- 步骤图完成 -->
<!-- 备注区 -->
<view
class=
"title"
>
备注信息
</view>
<view
class=
"remark-container"
>
<u-form
:model=
"instanceDetail"
>
<u-form-item
label=
"访问区域"
prop=
"remark"
labelPosition=
"top"
labelWidth=
"80"
>
<u-textarea
disabled
v-model=
"instanceDetail.remarks"
placeholder=
"-"
></u-textarea>
</u-form-item>
</u-form>
</view>
<!-- 备注区完成 -->
<!-- 变更内容区 -->
<view
class=
"title"
>
变更内容
</view>
</template>
</vertical-steps>
</view>
<!-- 步骤图完成 -->
<!-- 排出位置 -->
<u-form
ref=
"paichuForm"
:model=
"paichuForm"
labelWidth=
"120"
:rules=
"rules"
>
<view
class=
"title"
>
排出位置
</view>
<
template
v-for=
"(item, index) in paichuForm.interceptPoints"
>
<view
class=
"change-container"
>
<!-- 计划标定日期 -->
<u-form-item
prop=
"proLineName"
borderBottom
label=
"产线名称"
>
{{
item
.
proLineName
||
'-'
}}
</u-form-item>
<u-form-item
:prop=
"'interceptPoints.' + index + '.point'"
borderBottom
label=
"拦截点位"
@
click=
"showPointMark(item.proLineId,index)"
>
<u--input
:value=
"item.point"
disabled
disabledColor=
"#ffffff"
placeholder=
"请选择拦截点位"
border=
"none"
></u--input>
<u-icon
slot=
"right"
name=
"arrow-right"
></u-icon>
</u-form-item>
</view>
</
template
>
<view
class=
"title"
>
追溯赋牌
</view>
<view
class=
"change-container"
>
<view
class=
"change-item"
>
请登录PC端查看变更详情
</view>
</view>
<!-- 按钮区域 -->
<view
v-if=
"isView === '0' && status === 'true'"
class=
"btns-container"
>
<view
class=
"btn reject-btn"
@
click=
"approveByAdmin('REJECT')"
>
驳回
</view>
<view
class=
"btn approve-btn"
@
click=
"approveByAdmin('CONSENT')"
>
通过
</view>
<u-form-item
prop=
"proLineName"
borderBottom
label=
"追溯状态"
@
click=
"showTraceabilityMark"
>
<u--input
:value=
"devMap[paichuForm.traceabilityMark]"
disabled
disabledColor=
"#ffffff"
placeholder=
"请选择追溯状态"
border=
"none"
></u--input>
<u-icon
slot=
"right"
name=
"arrow-right"
></u-icon>
</u-form-item>
</view>
</u-form>
<u-picker
:show=
"showMarkSelect"
:columns=
"devOptions"
keyName=
"dmpDeviceNumber"
@
cancel=
"showMarkSelect = false"
@
confirm=
"markSelect"
>
</u-picker>
<u-picker
:show=
"showPoint"
:columns=
"currentGxOptions"
keyName=
"gxName"
@
cancel=
"showPoint = false"
@
confirm=
"pointSelect"
>
</u-picker>
<view
class=
"title"
>
追溯清单
</view>
<view
class=
"remark-container"
>
<u-collapse
v-for=
"(item) in traceabilityVos"
:border=
"false"
@
change=
"change"
@
close=
"close"
@
open=
"open"
>
<u-collapse-item
:title=
"item.jobNum?item.jobNum:'-'"
name=
"jobNum"
>
<view
class=
"custom-table-collapse"
>
<view
class=
"subTitleClass-collapse"
>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
部品类型
</view>
<view
class=
"subContent"
>
{{ getLabelByValue(traceablePartsTypeList, instanceDetail.formDto.partType)}}
</view>
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
当前产线
</view>
<view
class=
"subContent"
>
{{ item.proLineName || '-' }}
</view>
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
当前位置
</view>
<view
class=
"subContent"
>
{{ item.currentPosition || '-' }}
</view>
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
品质状态
</view>
<view
class=
"subContent"
>
{{ qualityStatusMap[item.qualityStatus] || '-' }}
</view>
</view>
<view
class=
"subRow-collapse"
>
<view
class=
"subTitle"
>
工件状态
</view>
<view
class=
"subContent"
>
{{ isNormalOfflineMap[item.isNormalOffline] || '-' }}
</view>
</view>
</view>
</view>
</u-collapse-item>
</u-collapse>
</view>
<!-- 按钮区域 -->
<view
class=
"btns-container"
>
<view
class=
"btn reject-btn"
v-if=
"processStatus && isUpdate"
@
click=
"handleClose('REJECT')"
>
返回
</view>
<view
class=
"btn approve-btn"
v-if=
"processStatus && isUpdate"
:loading=
"btnLoading"
@
click=
"handleConfirm('CONSENT')"
>
确定
</view>
</view>
</view>
</template>
<
script
>
import
VerticalSteps
from
'@/components/vertical-steps/vertical-steps'
import
{
getProcessNodeByInstanceId
,
approveByAdmin
,
getProcessInstanceStatus
}
from
'../../api/system/approve'
import
{
parseTime
}
from
'../../api/utils/ruoyi'
import
{
getDicts
}
from
"../../api/system/baseConfig"
;
import
{
toast
}
from
'../../utils/common'
export
default
{
name
:
"baseDetail"
,
onLoad
:
function
(
option
)
{
//option为object类型,会序列化上个页面传递的参数
// processId, processCode, processStatus, allowApprove, processName
this
.
processId
=
option
.
processId
;
this
.
processCode
=
option
.
processCode
;
this
.
processStatus
=
option
.
processStatus
;
this
.
isUpdate
=
option
.
allowApprove
;
this
.
processName
=
option
.
processName
;
this
.
getList
();
this
.
toProcessInstanceInfo
();
},
components
:
{
VerticalSteps
},
data
()
{
return
{
processId
:
''
,
processCode
:
''
,
processStatus
:
''
,
allowApprove
:
''
,
processName
:
''
,
processType
:
''
,
label
:
''
,
instanceDetail
:
{},
formData
:
{
remark
:
''
},
steps
:
[],
jobLevelList
:
[],
isView
:
''
,
status
:
''
,
// url
urlList
:
[
{
value
:
'0001'
,
url
:
'/staff/processApproval'
},
{
value
:
'1001'
,
url
:
'/aeclassesinfo/processApproval'
},
{
value
:
'1002'
,
url
:
'/accreditpostvalidity/processPostApproval'
},
{
value
:
'0002'
,
url
:
'/sysRoleMamager/processApproval'
},
{
value
:
'0004'
,
url
:
'/sysRoleMamager/non_processApproval'
},
{
value
:
'0003'
,
url
:
'/organization/processApproval'
},
{
value
:
'1020'
,
url
:
'/aeequipmenttype/processApproval'
},
</view>
</template>
<
script
>
import
VerticalSteps
from
'@/components/vertical-steps/vertical-steps'
;
import
{
getCompletionDetail
,
processCompletionApproval
,
getTraceabilityDetail
,
processCalibrationApproval
}
from
'../../api/system/approve'
;
import
{
parseTime
}
from
'../../api/utils/ruoyi'
;
import
{
getDicts
}
from
'../../api/system/baseConfig'
;
import
{
baseUrl
}
from
'../../config'
import
{
getToken
}
from
'@/utils/auth'
export
default
{
name
:
'baseDetail'
,
onLoad
:
function
(
option
)
{
//option为object类型,会序列化上个页面传递的参数
// processId, processCode, processStatus, allowApprove, processName
this
.
processId
=
option
.
processId
;
this
.
processCode
=
option
.
processCode
;
this
.
processStatus
=
option
.
processStatus
;
this
.
isUpdate
=
option
.
allowApprove
&&
option
.
processStatus
===
'0'
;
this
.
processName
=
option
.
processName
;
this
.
getList
();
this
.
getInstanceDetail
();
},
components
:
{
VerticalSteps
},
data
()
{
return
{
devOptions
:
[
[
{
value
:
'1030'
,
url
:
'/aeenginemodel/processApproval'
text
:
'正常'
,
businessId
:
'2'
,
dmpDeviceNumber
:
'追溯黄'
},
{
value
:
'1031'
,
url
:
'/aeenginemodelextend/processApproval'
},
{
value
:
'1032'
,
url
:
'/aemodelgx/processApproval'
},
{
value
:
'1043'
,
url
:
'/aeunit/processApproval'
},
{
value
:
'1042'
,
url
:
'/aepartinformation/processApproval'
},
{
value
:
'1040'
,
url
:
'/aetool/processApproval'
},
{
value
:
'1004'
,
url
:
'/aeprolineinfo/processApproval'
},
{
value
:
'1005'
,
url
:
'/aeprolinesegment/processApproval'
},
{
value
:
'1006'
,
url
:
'/aeprolinegx/processGxApproval'
},
{
value
:
'1041'
,
url
:
'/aeauxiliarymaterial/processApproval'
},
{
value
:
'1009'
,
url
:
'/aeprolinetray/processApproval'
},
{
value
:
'1007'
,
url
:
'/aetechequipment/processApproval'
},
{
value
:
'1008'
,
url
:
'/aetechassembly/processApproval'
},
{
value
:
'1010'
,
url
:
'/aetechequipment/all/processApproval'
},
{
value
:
'1011'
,
url
:
'/aetechassembly/all/processApproval'
},
{
value
:
'1021'
,
url
:
'/aeequipmentinfo/processApproval'
},
{
value
:
'1044'
,
url
:
'/aegroupproject/processApproval'
text
:
'不正常'
,
businessId
:
'3'
,
dmpDeviceNumber
:
'追溯红'
}
]
],
devMap
:
{
'2'
:
'追溯黄'
,
'3'
:
'追溯红'
},
showMarkSelect
:
false
,
showPoint
:
false
,
currentGxOptions
:
[],
qualityStatusMap
:
{
'1'
:
'正常'
,
'2'
:
'品质黄'
,
'3'
:
'品质红'
},
isNormalOfflineMap
:
{
'0'
:
'正常下线'
,
'1'
:
'未正常下线'
},
rules
:
{
traceabilityMark
:
[
{
required
:
true
,
message
:
'请选择追溯状态'
,
trigger
:
'change'
}
]
},
gxOptions
:
{},
paichuForm
:
{
interceptPoints
:
[],
traceabilityMark
:
null
},
// 文件上传路径前缀
temp
:
'project'
,
// 水桶
bucket
:
'qms-ae'
,
baseUrl
,
fileIcon
:
require
(
'../../static/images/fileIcon.png'
),
initiateDepartmentList
:
[],
traceablePartsTypeList
:
[],
currnetIndex
:
0
,
fileList
:
[],
traceabilityVos
:
null
,
btnLoading
:
false
,
rules
:
{
formResultOne
:
[
{
required
:
true
,
message
:
'请选择日期'
},
],
},
showApproval
:
false
,
selectOptions
:
[
{
label
:
'本次强制开机'
,
value
:
'本次强制开机'
},
{
label
:
'本次禁止开机'
,
value
:
'本次禁止开机'
},
{
label
:
'改正后开机'
,
value
:
'改正后开机'
},
],
tpmOptions
:
[
{
label
:
'本次强制开机'
,
value
:
'本次强制开机'
},
{
label
:
'本次禁止开机'
,
value
:
'本次禁止开机'
},
{
label
:
'改正后开机'
,
value
:
'改正后开机'
},
],
formResultOne
:
null
,
showFormResultOne
:
false
,
isLoading
:
false
,
processId
:
''
,
processCode
:
''
,
processStatus
:
''
,
allowApprove
:
''
,
processName
:
''
,
processType
:
''
,
label
:
''
,
instanceDetail
:
{
approves
:
[],
toolCheckDto
:
{},
materialDto
:
{},
tmpInfoDTO
:
{},
},
// 发起时间
initiateDate
:
''
,
approve
:
{
processInstanceId
:
null
,
instanceApproveId
:
null
,
hasConfirm
:
true
,
formResult
:
null
,
formResultOne
:
null
,
formResultTwo
:
null
,
approveOpinion
:
1
,
selectOption
:
null
,
},
// 流程实例详情列表
instanceDetailList
:
[],
formData
:
{
remark
:
''
,
},
steps
:
[],
jobLevelList
:
[],
isView
:
''
,
status
:
''
,
};
},
computed
:
{
pointShow
()
{
return
(
data
)
=>
{
return
this
.
gxOptions
[
data
]
}
},
computed
:
{
// 计算属性
parseTimeA
()
{
return
(
time
,
format
)
=>
{
return
parseTime
(
time
,
format
||
'{m}-{d} {h}:{i}:{s}'
)
}
// 根据processCode进行动态页面渲染
// 所有预警告警不显示处理结果
getFlag
()
{
return
!
(
this
.
processCode
===
'00003'
||
this
.
processCode
===
'00006'
||
this
.
processCode
===
'00010'
||
this
.
processCode
===
'00013'
||
this
.
processCode
===
'00002'
||
this
.
processCode
===
'00005'
||
this
.
processCode
===
'00009'
||
this
.
processCode
===
'00012'
);
},
// 计算属性
parseTimeA
()
{
return
(
time
,
format
)
=>
{
return
parseTime
(
time
,
format
||
'{m}-{d} {h}:{i}:{s}'
);
};
},
},
methods
:
{
showPointMark
(
proLineId
,
index
)
{
if
(
this
.
isUpdate
&&
this
.
processStatus
===
'0'
)
{
this
.
showPoint
=
true
;
this
.
currentGxOptions
=
[
this
.
gxOptions
[
proLineId
]]
this
.
currnetIndex
=
index
}
},
markSelect
(
e
)
{
console
.
log
(
'confirm'
,
e
)
this
.
paichuForm
.
traceabilityMark
=
e
.
value
[
0
].
businessId
;
console
.
log
(
'this.paichuForm.traceabilityMark'
,
this
.
paichuForm
.
traceabilityMark
);
this
.
showMarkSelect
=
false
;
},
pointSelect
(
e
)
{
console
.
log
(
'pointSelectconfirm'
,
e
)
const
data
=
e
.
value
[
0
].
businessId
const
temp
=
this
.
paichuForm
.
interceptPoints
[
this
.
currnetIndex
]
temp
.
point
=
data
;
if
(
data
==
'null'
)
{
temp
[
'interceptMehtod'
]
=
'1'
}
else
{
temp
[
'interceptMehtod'
]
=
'2'
}
this
.
showMarkSelect
=
false
;
},
showTraceabilityMark
()
{
if
(
this
.
isUpdate
&&
this
.
processStatus
===
'0'
)
{
this
.
showMarkSelect
=
true
;
}
},
afterRead
(
event
)
{
console
.
log
(
'event'
,
event
);
console
.
log
(
'this.baseUrl'
,
this
.
baseUrl
);
const
uploadFileUrl
=
`
${
this
.
baseUrl
}
/common/fileUpload?temp=
${
this
.
temp
}
&bucket=
${
this
.
bucket
}
`
;
const
file
=
event
.
file
[
0
];
// 获取上传的文件对象
uni
.
uploadFile
({
url
:
uploadFileUrl
,
//仅为示例,非真实的接口地址
filePath
:
file
.
url
,
name
:
'file'
,
// 与后端约定的文件字段名
header
:
{
Authorization
:
'Bearer '
+
getToken
()
},
success
:
(
res
)
=>
{
const
data
=
JSON
.
parse
(
res
.
data
);
if
(
data
.
code
===
200
)
{
const
{
data
:
{
url
,
path
,
originalName
,
businessId
}
}
=
data
this
.
fileList
.
push
({
url
,
path
,
name
:
originalName
,
businessId
})
uni
.
$u
.
toast
(
'上传成功'
)
}
else
{
uni
.
$u
.
toast
(
'上传文件失败,请重试'
)
}
}
});
},
methods
:
{
/**
* 获取审批url
* @returns {string}
*/
getUrl
()
{
const
type
=
this
.
instanceDetail
.
processType
let
url
=
''
this
.
urlList
.
forEach
(
item
=>
{
if
(
item
.
value
===
type
)
{
url
=
item
.
url
}
})
return
url
// 删除图片
deletePic
()
{
this
.
fileList
=
[];
},
async
approveByAdmin
(
type
)
{
this
.
btnLoading
=
true
// 审批
await
approveByAdmin
({
instanceId
:
this
.
processId
,
approveId
:
this
.
instanceDetail
.
currentApprove
.
businessId
,
approveControl
:
type
,
url
:
this
.
getUrl
(),
processGroup
:
'1'
}).
catch
(()
=>
{
this
.
isView
=
''
})
// 回调获取流程实例的状态
const
{
data
}
=
await
getProcessInstanceStatus
(
this
.
processId
)
// 异常结束
if
(
data
===
'6'
)
{
toast
(
'流程异常结束,请检查对应流程'
)
}
else
{
toast
(
'审批成功'
)
this
.
$tab
.
reLaunch
(
'/pages/index'
)
}
blur
()
{
this
.
approve
.
formResult
=
this
.
approve
.
formResultTwo
},
/** 查询字典数据列表 */
getList
()
{
getDicts
(
'sys_job_level'
).
then
(
response
=>
{
// console.log("查询数据字段狗",response)
const
jobLevelForm
=
response
.
data
for
(
const
item
of
jobLevelForm
)
{
const
result
=
{
value
:
item
.
dictValue
,
label
:
item
.
dictLabel
}
this
.
jobLevelList
.
push
(
result
)
}
formResultOneConfirm
(
e
)
{
this
.
showFormResultOne
=
false
;
this
.
approve
.
formResultOne
=
uni
.
$u
.
timeFormat
(
e
.
value
,
'yyyy-mm-dd'
);
this
.
approve
.
formResult
=
this
.
approve
.
formResultOne
;
},
formResultOneClose
()
{
this
.
showFormResultOne
=
false
;
},
hideKeyboard
()
{
uni
.
hideKeyboard
();
},
getProcessType
()
{
if
(
this
.
processCode
===
'00002'
||
this
.
processCode
===
'00003'
||
this
.
processCode
===
'00004'
)
{
return
'标定'
;
}
if
(
this
.
processCode
===
'00005'
||
this
.
processCode
===
'00006'
||
this
.
processCode
===
'00007'
)
{
return
'TPM'
;
}
if
(
this
.
processCode
===
'00009'
||
this
.
processCode
===
'00010'
)
{
return
'工具'
;
}
if
(
this
.
processCode
===
'00012'
||
this
.
processCode
===
'00013'
)
{
return
'辅材'
;
}
},
/**
* 获取流程实例详情
*/
async
getInstanceDetail
()
{
this
.
isLoading
=
true
getTraceabilityDetail
(
this
.
processId
).
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
this
.
instanceDetail
=
res
.
data
this
.
instanceDetailList
.
push
(
res
.
data
.
formDto
)
this
.
processName
=
res
.
data
.
formDto
.
processName
this
.
initiateDate
=
res
.
data
.
formDto
.
initiateDate
this
.
traceabilityVos
=
res
.
data
.
traceabilityVos
this
.
paichuForm
.
interceptPoints
=
res
.
data
.
formDto
.
interceptPoints
?
res
.
data
.
formDto
.
interceptPoints
:
[]
this
.
paichuForm
.
traceabilityMark
=
res
.
data
.
formDto
.
traceabilityMark
this
.
fileList
=
res
.
data
.
formDto
.
attachment
?
[
JSON
.
parse
(
res
.
data
.
formDto
.
attachment
)]
:
[]
this
.
getLineById
(
this
.
paichuForm
.
interceptPoints
)
this
.
updateInterceptPointsRules
()
// 统一处理步骤生成
if
(
res
.
data
)
{
this
.
steps
=
[
{
title
:
'发起'
,
content
:
{}
},
{
title
:
'综合审批'
,
content
:
this
.
instanceDetail
.
approves
},
];
}
}
})
this
.
isLoading
=
false
},
updateInterceptPointsRules
()
{
const
interceptPointsRules
=
{};
if
(
this
.
paichuForm
.
interceptPoints
&&
this
.
paichuForm
.
interceptPoints
.
length
>
0
)
{
this
.
paichuForm
.
interceptPoints
.
forEach
((
item
,
index
)
=>
{
interceptPointsRules
[
`interceptPoints.
${
index
}
.point`
]
=
[
{
required
:
true
,
message
:
'请选择拦截点位'
,
trigger
:
'change'
}
];
});
this
.
rules
=
{
...
this
.
rules
,
...
interceptPointsRules
};
}
},
// 根据工件查询产线
getLineById
(
data
)
{
if
(
data
&&
data
.
length
>
0
)
{
// 根据PROLINEID循环调用查询工序options
data
.
forEach
(
item
=>
{
getGxByProLinId
({
prolineIds
:
item
.
proLineId
,
gxTypes
:
'4'
}).
then
(
gxRes
=>
{
this
.
$set
(
this
.
gxOptions
,
item
.
proLineId
,
[{
businessId
:
'null'
,
gxName
:
'发现即拦截'
},
...
gxRes
.
data
])
console
.
log
(
'gxOptions'
,
this
.
gxOptions
)
})
})
}
},
/**
* 审批
* @returns {Promise<void>}
*/
handleConfirm
()
{
this
.
$refs
.
paichuForm
.
validate
().
then
(
async
res
=>
{
console
.
log
(
'111111111111111111111111'
)
this
.
btnLoading
=
true
this
.
instanceDetail
.
approves
.
forEach
(
item
=>
{
if
(
item
.
currentNode
===
'1'
)
{
this
.
approve
.
instanceApproveId
=
item
.
businessId
this
.
approve
.
processInstanceId
=
item
.
instanceId
}
})
this
.
paichuForm
.
interceptPoints
.
forEach
(
item
=>
{
if
(
item
[
'interceptMehtod'
]
===
'1'
)
{
item
.
point
=
null
}
})
this
.
approve
[
'interceptPoints'
]
=
this
.
paichuForm
.
interceptPoints
this
.
approve
[
'jobNums'
]
=
this
.
instanceDetail
.
formDto
.
jobNums
this
.
approve
[
'traceabilityMark'
]
=
this
.
paichuForm
.
traceabilityMark
this
.
approve
[
'partType'
]
=
this
.
instanceDetail
.
formDto
.
partType
console
.
log
(
'this.approve'
,
this
.
approve
)
await
processCalibrationApproval
(
this
.
approve
)
.
then
(
res
=>
{
if
(
res
.
code
===
200
)
{
uni
.
$u
.
toast
(
'审批成功'
)
}
else
{
uni
.
$u
.
toast
(
res
.
message
)
}
})
.
catch
(()
=>
{
this
.
isUpdate
=
false
this
.
btnLoading
=
false
})
this
.
handleClose
()
// 关闭所有的loading
this
.
btnLoading
=
false
this
.
isUpdate
=
false
this
.
$emit
(
'success'
)
}).
catch
(
errors
=>
{
uni
.
$u
.
toast
(
'校验失败'
)
})
},
/**
* 指定列表,根据值,取label
*/
getLabelByValue
(
list
,
value
,
key
=
'value'
,
label
=
'label'
)
{
const
item
=
list
.
find
(
item
=>
item
[
key
]
===
value
)
return
item
?
item
[
label
]
:
'-'
},
/**
* 获取审批节点详情
*/
toProcessInstanceInfo
()
{
// 非追溯完成度异常
if
(
this
.
processCode
===
'00016'
||
this
.
processCode
===
'00017'
)
{
console
.
log
(
'1'
,
this
.
processCode
)
drawerShowEngineTrace
.
value
=
true
}
else
if
(
this
.
processCode
!==
'00019'
)
{
console
.
log
(
'2'
,
this
.
processCode
)
drawerShow
.
value
=
true
// drawerShowTraceError.value = true
}
else
{
console
.
log
(
'3'
,
this
.
processCode
)
// 追溯完成度异常
drawerShowTraceError
.
value
=
true
handleClose
()
{
this
.
$tab
.
reLaunch
(
'/pages/index'
)
},
/** 查询字典数据列表 */
getList
()
{
getDicts
(
'initiate_department'
).
then
(
response
=>
{
// console.log("查询数据字段狗",response)
const
jobLevelForm
=
response
.
data
;
for
(
const
item
of
jobLevelForm
)
{
const
result
=
{
value
:
item
.
dictValue
,
label
:
item
.
dictLabel
,
};
this
.
initiateDepartmentList
.
push
(
result
);
}
});
getDicts
(
'traceable_parts_type'
).
then
(
response
=>
{
// console.log("查询数据字段狗",response)
const
jobLevelForm
=
response
.
data
;
for
(
const
item
of
jobLevelForm
)
{
const
result
=
{
value
:
item
.
dictValue
,
label
:
item
.
dictLabel
,
};
this
.
traceablePartsTypeList
.
push
(
result
);
}
});
},
/**
* 指定列表,根据值,取label
*/
getLabelByValue
(
list
,
value
,
key
=
'value'
,
label
=
'label'
)
{
const
item
=
list
.
find
(
item
=>
item
[
key
]
===
value
);
return
item
?
item
[
label
]
:
'-'
;
},
/**
* 获取审批节点详情
*/
toProcessInstanceInfo
()
{
// 非追溯完成度异常
if
(
this
.
processCode
===
'00016'
||
this
.
processCode
===
'00017'
)
{
console
.
log
(
'1'
,
this
.
processCode
);
drawerShowEngineTrace
.
value
=
true
;
}
else
if
(
this
.
processCode
!==
'00019'
)
{
console
.
log
(
'2'
,
this
.
processCode
);
drawerShow
.
value
=
true
;
// drawerShowTraceError.value = true
}
else
{
console
.
log
(
'3'
,
this
.
processCode
);
// 追溯完成度异常
drawerShowTraceError
.
value
=
true
;
}
},
},
};
</
script
>
<
style
lang=
"scss"
scoped
>
.base-detail
{
background
:
#ffffff
;
min-height
:
100vh
;
// height: 100vh;
.container
{
.title
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
500
;
font-size
:
40rpx
;
color
:
#0b0b0b
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
padding
:
52rpx
32rpx
20rpx
32rpx
;
border-bottom
:
2rpx
solid
#f2f2f2
;
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.base-detail
{
background
:
#FFFFFF
;
min-height
:
100vh
;
// height: 100vh;
.container
{
.title
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
500
;
font-size
:
40rpx
;
color
:
#0B0B0B
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
padding
:
52rpx
32rpx
20rpx
32rpx
;
border-bottom
:
2rpx
solid
#F2F2F2
;
}
}
.step-container
{
padding-left
:
44rpx
;
padding-right
:
26rpx
;
.step-container
{
padding-left
:
44rpx
;
padding-right
:
26rpx
;
}
.custom-table
{
background
:
#f9f9f9
;
border-radius
:
10rpx
;
padding
:
32rpx
;
}
.subTitleClass
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#9a9a9a
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
}
.subRow
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
12rpx
;
.subTitle
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#9a9a9a
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
min-width
:
120rpx
;
}
.custom-table
{
background
:
#F9F9F9
;
border-radius
:
10rpx
;
padding
:
32rpx
;
.subContent
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#222222
;
text-align
:
right
;
font-style
:
normal
;
text-transform
:
none
;
}
.subTitleClass
{
font-family
:
PingFangSC
,
PingFang
SC
;
}
.custom-table-collapse
{
padding
:
32rpx
;
}
.subTitleClass-collapse
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#9a9a9a
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
}
.subRow-collapse
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
12rpx
;
.subTitle
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#9
A9A9A
;
color
:
#9
a9a9a
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
min-width
:
120rpx
;
}
.subRow
{
.subContent
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#222222
;
text-align
:
right
;
font-style
:
normal
;
text-transform
:
none
;
}
}
::v-deep
.u-collapse-item__content__text
{
padding
:
0
;
}
::v-deep
.u-collapse-item
{
background
:
#f9f9f9
;
border-radius
:
10rpx
;
}
.remark-container
{
padding
:
28rpx
46rpx
0
48rpx
;
border-radius
:
10rpx
;
margin
:
0
auto
;
.upload-finish
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
12rpx
;
.subTitle
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#9A9A9A
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
min-width
:
120rpx
;
}
.subContent
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#222222
;
text-align
:
right
;
font-style
:
normal
;
text-transform
:
none
;
}
justify-content
:
center
;
flex-direction
:
column
;
align-items
:
center
;
.file-title
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
500
;
color
:
#333399
;
font-style
:
normal
;
}
.file-status
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
color
:
#999999
;
font-style
:
normal
;
}
}
.remark-container
{
padding
:
28rpx
46rpx
0
48rpx
;
::v-deep
.u-form-item__body__left__content__label
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
500
;
font-size
:
28rpx
;
color
:
#111111
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
margin-bottom
:
14rpx
;
// 新增卡片间距
&
>
view
{
margin-bottom
:
20rpx
;
&
:last-child
{
margin-bottom
:
0
;
}
}
.change-container
{
padding
:
28rpx
46rpx
0
48rpx
;
.change-item
{
width
:
684rpx
;
height
:
140rpx
;
::v-deep
.u-form-item__body__left__content__label
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
500
;
font-size
:
28rpx
;
color
:
#111111
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
margin-bottom
:
14rpx
;
}
.rmark-card
{
background
:
#f9f9f9
;
border-radius
:
20rpx
;
padding
:
0rpx
40rpx
0
38rpx
;
.subRow
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
12rpx
;
border-bottom
:
2rpx
solid
#e9e9e9
;
padding-bottom
:
12rpx
;
align-items
:
center
;
justify-content
:
center
;
background
:
#FFFBF0
;
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#F4850E
;
line-height
:
36rpx
;
font-style
:
normal
;
&
:last-child
{
border-bottom
:
none
;
padding-bottom
:
0
;
}
height
:
96rpx
;
.subTitle
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#666666
;
text-align
:
left
;
font-style
:
normal
;
text-transform
:
none
;
min-width
:
120rpx
;
}
.subContent
{
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#111111
;
text-align
:
right
;
font-style
:
normal
;
text-transform
:
none
;
}
.expire-color
{
color
:
red
!
important
;
}
}
}
}
.btns-container
{
display
:
flex
;
justify-content
:
center
;
gap
:
16rpx
;
padding
:
40rpx
0
;
.btn
{
width
:
312rpx
;
height
:
96rpx
;
border-radius
:
56rpx
;
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
34rpx
;
line-height
:
48rpx
;
text-align
:
center
;
font-style
:
normal
;
.change-container
{
padding
:
28rpx
46rpx
0
48rpx
;
.change-item
{
width
:
684rpx
;
height
:
140rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
background
:
#fffbf0
;
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
28rpx
;
color
:
#f4850e
;
line-height
:
36rpx
;
font-style
:
normal
;
}
.reject-btn
{
border
:
2rpx
solid
#333399
;
color
:
#333399
;
}
.approve-btn
{
background
:
#333399
;
color
:
#FFFFFF
;
}
::v-deep
.u-upload__wrap
{
justify-content
:
center
;
uni-view
{
align-items
:
center
;
}
}
</
style
>
\ No newline at end of file
.u-collapse
+
.u-collapse
{
margin-top
:
20rpx
;
}
}
.btns-container
{
display
:
flex
;
justify-content
:
center
;
gap
:
16rpx
;
padding
:
40rpx
0
;
.btn
{
width
:
312rpx
;
height
:
96rpx
;
border-radius
:
56rpx
;
font-family
:
PingFangSC
,
PingFang
SC
;
font-weight
:
400
;
font-size
:
34rpx
;
line-height
:
48rpx
;
text-align
:
center
;
font-style
:
normal
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
}
.reject-btn
{
border
:
2rpx
solid
#333399
;
color
:
#333399
;
}
.approve-btn
{
background
:
#333399
;
color
:
#ffffff
;
}
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment