| | |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">申请时间</text> |
| | | <text class="detail-value">{{ item.applyTime || "-" }}</text> |
| | | <text class="detail-value">{{ formatDateTime(item.applyTime) }}</text> |
| | | </view> |
| | | <view v-if="item.finishTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">完成时间</text> |
| | | <text class="detail-value">{{ item.finishTime }}</text> |
| | | <text class="detail-value">{{ formatDateTime(item.finishTime) }}</text> |
| | | </view> |
| | | </view> |
| | | <view v-if="canEdit(item) || item.isApprove" |
| | | <view v-if="canModify(item) || item.isApprove" |
| | | class="action-buttons"> |
| | | <up-button v-if="canEdit(item)" |
| | | <up-button v-if="canModify(item)" |
| | | class="action-btn" |
| | | size="small" |
| | | @click.stop="goEdit(item)"> |
| | | type="warning" |
| | | plain |
| | | @click.stop="goModify(item)"> |
| | | 编辑 |
| | | </up-button> |
| | | <up-button v-if="item.isApprove" |
| | |
| | | import { listApprovalInstancePage } from "@/api/oa/approvalInstance.js"; |
| | | import { OA_NAV } from "@/config/oaPaths.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { parseTime } from "@/utils/ruoyi"; |
| | | |
| | | const EDIT_STORAGE_KEY = "oa_approve_instance_edit_row"; |
| | | const userStore = useUserStore(); |
| | |
| | | if (level == null || level === "") return "-"; |
| | | return `第 ${level} 级`; |
| | | }; |
| | | |
| | | const formatDateTime = val => { |
| | | if (!val) return "-"; |
| | | return parseTime(val, "{y}-{m}-{d} {h}:{i}:{s}") || String(val); |
| | | }; |
| | | |
| | | /** 是否本人发起的审批(兼容列表未返回 applicantId) */ |
| | | const isOwnApplication = item => { |
| | | const uid = userStore.id; |
| | | if (item?.applicantId != null && uid != null && uid !== "") { |
| | | return String(item.applicantId) === String(uid); |
| | | } |
| | | const loginName = userStore.nickName || userStore.name; |
| | | if (loginName && item?.applicantName) { |
| | | return String(item.applicantName).trim() === String(loginName).trim(); |
| | | } |
| | | return false; |
| | | }; |
| | | |
| | | /** 仅「进行中」且本人发起时可编辑(已通过/已驳回不显示编辑) */ |
| | | const canModify = item => item?.status === "PENDING" && isOwnApplication(item); |
| | | |
| | | const currentApproverName = item => { |
| | | const tasks = item?.tasks; |
| | |
| | | uni.navigateTo({ url: OA_NAV.approveListTemplateSelect }); |
| | | }; |
| | | |
| | | const canEdit = item => |
| | | item?.status === "PENDING" && |
| | | String(item.applicantId) === String(userStore.id); |
| | | |
| | | const goEdit = item => { |
| | | const goModify = item => { |
| | | if (!canModify(item)) { |
| | | uni.showToast({ title: "仅进行中的本人申请可编辑", icon: "none" }); |
| | | return; |
| | | } |
| | | if (!item?.id) return; |
| | | uni.setStorageSync(EDIT_STORAGE_KEY, item); |
| | | uni.navigateTo({ |