| | |
| | | v-model:show="show" |
| | | :mask-closable="false" |
| | | preset="card" |
| | | :title="t('serviceReview.common.review')" |
| | | :style="{ width: '1000px' }" |
| | | title="人员资质审核" |
| | | :style="{ width: '600px' }" |
| | | :auto-focus="false" |
| | | :segmented="{ |
| | | content: true, |
| | |
| | | > |
| | | <n-spin :show="detailLoading"> |
| | | <div class="review-modal-content"> |
| | | <div v-if="reviewDetail" class="section-card"> |
| | | <div class="section-title">人员资质审核</div> |
| | | <div v-if="reviewDetail" class="section-container"> |
| | | <div class="section-title">人员信息</div> |
| | | |
| | | <div class="base-info-grid"> |
| | | <div class="info-grid"> |
| | | <div class="info-item"> |
| | | <div class="info-label">姓名:</div> |
| | | <div class="info-label">姓名</div> |
| | | <div class="info-value name-value"> |
| | | <img |
| | | <!-- <img |
| | | v-if="parseImageList(reviewDetail.avatar)[0]" |
| | | :src="parseImageList(reviewDetail.avatar)[0]" |
| | | class="avatar" |
| | | alt="avatar" |
| | | /> |
| | | /> --> |
| | | <span>{{ reviewDetail.nickName || "-" }}</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-item"> |
| | | <div class="info-label">编号:</div> |
| | | <div class="info-label">编号</div> |
| | | <div class="info-value"> |
| | | {{ reviewDetail.operationsUserId || "-" }} |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-item"> |
| | | <div class="info-label">手机号:</div> |
| | | <div class="info-label">手机</div> |
| | | <div class="info-value"> |
| | | {{ reviewDetail.phoneNumber || "-" }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-row"> |
| | | <div class="info-label">角色:</div> |
| | | <div class="info-value role-list"> |
| | | <n-tag |
| | | v-for="role in getRoleNames(reviewDetail.roleNames)" |
| | | :key="role" |
| | | type="info" |
| | | :bordered="false" |
| | | size="small" |
| | | > |
| | | {{ role }} |
| | | </n-tag> |
| | | <span v-if="getRoleNames(reviewDetail.roleNames).length === 0">-</span> |
| | | <div class="info-item"> |
| | | <div class="info-label">角色</div> |
| | | <div class="info-value role-list"> |
| | | <n-tag |
| | | v-for="role in getRoleNames(reviewDetail.roleNames)" |
| | | :key="role" |
| | | :bordered="false" |
| | | size="small" |
| | | class="custom-tag" |
| | | > |
| | | {{ role }} |
| | | </n-tag> |
| | | <span v-if="getRoleNames(reviewDetail.roleNames).length === 0">-</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="certificate-grid"> |
| | | <div class="info-row"> |
| | | <div class="info-label">身份证:</div> |
| | | <div class="info-item"> |
| | | <div class="info-label">身份证</div> |
| | | <div class="info-value"> |
| | | <div v-if="getIdCardImages(reviewDetail).length" class="image-list"> |
| | | <n-image |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-row"> |
| | | <div class="info-label">驾驶证:</div> |
| | | <div class="info-item"> |
| | | <div class="info-label">驾驶证</div> |
| | | <div class="info-value"> |
| | | <div |
| | | v-if="parseImageList(reviewDetail.driverLicense).length" |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-row"> |
| | | <div class="info-label">无犯罪记录证明:</div> |
| | | <div class="info-item"> |
| | | <div class="info-label">无犯罪记录证明</div> |
| | | <div class="info-value"> |
| | | <div |
| | | v-if=" |
| | | parseImageList(reviewDetail.certificateOfNoCriminalRecord).length |
| | | " |
| | | v-if="parseImageList(reviewDetail.certificateOfNoCriminalRecord).length" |
| | | class="image-list" |
| | | > |
| | | <n-image |
| | | v-for=" |
| | | (url, index) in parseImageList( |
| | | reviewDetail.certificateOfNoCriminalRecord |
| | | ) |
| | | " |
| | | v-for="(url, index) in parseImageList(reviewDetail.certificateOfNoCriminalRecord)" |
| | | :key="`${url}-${index}`" |
| | | :src="url" |
| | | :width="88" |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="info-row"> |
| | | <div class="info-label">培训结业证:</div> |
| | | <div class="info-item"> |
| | | <div class="info-label">培训结业证</div> |
| | | <div class="info-value"> |
| | | <div |
| | | v-if=" |
| | | parseImageList(reviewDetail.trainingGraduationCertificate).length |
| | | " |
| | | v-if="parseImageList(reviewDetail.trainingGraduationCertificate).length" |
| | | class="image-list" |
| | | > |
| | | <n-image |
| | | v-for=" |
| | | (url, index) in parseImageList( |
| | | reviewDetail.trainingGraduationCertificate |
| | | ) |
| | | " |
| | | v-for="(url, index) in parseImageList(reviewDetail.trainingGraduationCertificate)" |
| | | :key="`${url}-${index}`" |
| | | :src="url" |
| | | :width="88" |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <div v-else-if="!detailLoading" class="section-card batch-tip"> |
| | | <div v-else-if="!detailLoading" class="section-container batch-tip"> |
| | | 已选择 {{ selectedCount }} 条待审核记录 |
| | | </div> |
| | | |
| | | <div class="section-card"> |
| | | <div class="section-title">审核信息</div> |
| | | <div class="section-container"> |
| | | <div class="section-title">资质审核</div> |
| | | |
| | | <n-form |
| | | ref="formRef" |
| | | :model="formModel" |
| | | :rules="rules" |
| | | label-placement="left" |
| | | label-width="72" |
| | | require-mark-placement="left" |
| | | > |
| | | <n-form-item |
| | | :label="t('serviceReview.common.auditResult')" |
| | | label="审核" |
| | | path="result" |
| | | required |
| | | > |
| | | <n-radio-group v-model:value="formModel.result"> |
| | | <n-space> |
| | | <n-radio value="pass"> |
| | | {{ t("serviceReview.common.pass") }} |
| | | </n-radio> |
| | | <n-radio value="reject"> |
| | | {{ t("serviceReview.common.reject") }} |
| | | </n-radio> |
| | | <n-radio value="pass">通过</n-radio> |
| | | <n-radio value="reject">不通过</n-radio> |
| | | </n-space> |
| | | </n-radio-group> |
| | | </n-form-item> |
| | | |
| | | <n-form-item |
| | | :label="t('serviceReview.common.remark')" |
| | | label="备注" |
| | | path="auditRemarks" |
| | | label-placement="top" |
| | | :required="formModel.result === 'reject'" |
| | |
| | | <n-space justify="end"> |
| | | <n-button @click="handleCancel">{{ t("common.cancel") }}</n-button> |
| | | <n-button type="primary" @click="handleConfirm"> |
| | | {{ t("serviceReview.common.submit") }} |
| | | {{ t("common.confirm") }} |
| | | </n-button> |
| | | </n-space> |
| | | </template> |
| | |
| | | .review-modal-content { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .section-card { |
| | | padding: 20px 24px; |
| | | border: 1px solid rgba(23, 31, 38, 0.08); |
| | | border-radius: 8px; |
| | | background: #fff; |
| | | gap: 24px; |
| | | } |
| | | |
| | | .section-title { |
| | | position: relative; |
| | | margin-bottom: 20px; |
| | | padding-left: 11px; |
| | | margin-bottom: 16px; |
| | | padding-left: 10px; |
| | | color: #171f26; |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | font-weight: 500; |
| | | line-height: 24px; |
| | | } |
| | | |
| | |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 0; |
| | | width: 3px; |
| | | height: 14px; |
| | | border-radius: 3px; |
| | | width: 4px; |
| | | height: 16px; |
| | | border-radius: 2px; |
| | | background: #0068ff; |
| | | transform: translateY(-50%); |
| | | } |
| | | |
| | | .base-info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(3, minmax(0, 1fr)); |
| | | gap: 16px 24px; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .certificate-grid { |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, minmax(0, 1fr)); |
| | | gap: 16px 40px; |
| | | gap: 16px 24px; |
| | | } |
| | | |
| | | .info-item, |
| | | .info-row { |
| | | .info-item { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | flex-direction: column; |
| | | gap: 4px; |
| | | min-width: 0; |
| | | } |
| | | |
| | | .info-label { |
| | | flex-shrink: 0; |
| | | color: #171f26; |
| | | font-size: 14px; |
| | | line-height: 22px; |
| | | font-weight: 600; |
| | | color: rgba(23, 31, 38, 0.6); |
| | | font-size: 13px; |
| | | line-height: 18px; |
| | | } |
| | | |
| | | .info-value { |
| | | min-width: 0; |
| | | color: #171f26; |
| | | font-size: 14px; |
| | | line-height: 22px; |
| | | font-size: 13px; |
| | | line-height: 18px; |
| | | word-break: break-all; |
| | | } |
| | | |
| | |
| | | gap: 8px; |
| | | } |
| | | |
| | | .custom-tag { |
| | | color: #0068ff; |
| | | background-color: #e5f0ff; |
| | | padding: 0 8px; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .image-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |